Zincの最近のブログ記事

Zinc 3.0は日本語入力に不具合があるので、某案件では未だに2.5を使ってるんですが、
新たに発覚した不具合。
ファイル選択FileSystem.getFileList()で選択したファイル名に下記の文字が含まれているとファイル名を取得できない。

-ポл榎掛弓芸鋼旨楯酢掃竹倒培怖翻慾處嘶斈忿掟桍毫烟痞窩縹艚蛞諫轎閖驂黥埈蒴僴礰

Shift-JISで2byte目が0x7cのいわゆるダメ文字。
仕方ないのでVBScriptからIEのファイルダイアログ機能を使って回避。
なんだかなぁ・・・

Zinc 3.0

| コメント(0) | トラックバック(0)

MDM Zinc 3.0がリリースされた。
ファイルAPI周りの日本語の文字化けは直ったみたい。
がしかし、テキストフィールドに日本語を入力できない。これじゃ、まだ使えないよ。

mdm.FileSystem.saveFileUnicode()を使って、全角のファイル名で保存するとファイル名が文字化けする。
仕方がないのでVBScriptを使って回避する方法を考えた。
1)saveFileUnicode()を使い、一時的に半角の名前で保存。例えばtemporary.txtとか。
2)本来の全角ファイル名をescape()してからVBScriptに渡す。
3)VBScript側で全角ファイル名をURLDecodeする。
4)VBScriptのMoveFileを使ってtemporary.txtを全角ファイル名に名前変更する。

mdm.FileSystem.getFileList()
mdm.System.execUnicode()
mdm.FileSystem.saveFileUnicode()
上記関数の引数として、全角を含むパス(「デスクトップ」など)を渡すと失敗する。

execUnicode()の代替として考えたのがVBScriptを使う方法。
1)VBScriptに渡す際も全角が文字化けするので、まず全角を含むパスをescape()を使ってURLエンコードする必要がある。
2)下記のような感じでVBScriptを実行。
 mdm.System.VBScript.execute(vbScript, 'myExecFunc', escape(pathStr), '', '', '', '');
3)VBScript側では、URLデコード関数を用意しておきこれを使って、受け取ったパスをデコードする。
4)Wscript.ShellのRunを使って実行する。

VBScriptは下記のような感じで大丈夫だと思う。
//////////////////////////////////////////////////

vbScript ='Function myExecFunc(path,a2,a3,a4,a5)\n';
vbScript+='Set objFSO = CreateObject("Scripting.FileSystemObject")\n';
//対象ファイルの存在確認
vbScript+='If objFSO.FileExists(UrlDecode(path)) Then\n';
//ファイルを開く
vbScript+=' Set WSHShell=CreateObject("Wscript.Shell")\n';
vbScript+=' WSHShell.Run """" & UrlDecode(path) & """" ,1,False\n';
vbScript+=' Set WSHShell = Nothing\n';
vbScript+='End If\n';
vbScript+='End Function\n';
//URLデコード関数
vbScript+='Function UrlDecode(Source)\n';
vbScript+=' On Error Resume Next\n';
vbScript+=' sTmp=""\n';
vbScript+=' iCount = 1\n';
vbScript+=' lSrcLen=Len(Source)\n';
vbScript+=' Do Until iCount > lSrcLen\n';
vbScript+=' sChr = Mid(Source,iCount,1)\n';
vbScript+=' iCount = iCount+1\n';
vbScript+=' If sChr="+" Then\n';
vbScript+=' sChr = " "\n';
vbScript+=' ElseIf sChr="%" Then\n';
vbScript+=' sHex = Mid(Source,iCount,2)\n';
vbScript+=' iCount = iCount + 2\n';
vbScript+=' iAsc = CByte("&H" & sHex)\n';
vbScript+=' If (&H00 <= iAsc And iAsc <= &H80) Or _\n';
vbScript+=' (&HA0 <= iAsc And iAsc <= &HDF) Then\n';
vbScript+=' sChr=Chr(iAsc)\n';
vbScript+=' ElseIf (&H81 <= iAsc And iAsc <= &H9F) Or _\n';
vbScript+=' (&HE0 <= iAsc And iAsc <= &HFF) Then\n';
vbScript+=' sChr = Mid(Source,iCount,1)\n';
vbScript+=' iCount = iCount + 1\n';
vbScript+=' If sChr="%" Then\n';
vbScript+=' sHex2 = Mid(Source,iCount,2)\n';
vbScript+=' iCount = iCount + 2\n';
vbScript+=' Else\n';
vbScript+=' sHex2 = Hex(Asc(sChr))\n';
vbScript+=' If Len(sHex2) = 1 Then\n';
vbScript+=' sHex2 = "0" & sHex2\n';
vbScript+=' End If\n';
vbScript+=' End If\n';
vbScript+=' sChr=Chr(CInt("&H" & sHex & sHex2))\n';
vbScript+=' End If\n';
vbScript+=' End If\n';
vbScript+=' sTmp=sTmp & sChr\n';
vbScript+=' Loop\n';
vbScript+=' UrlDecode = sTmp\n';
vbScript+='End Function\n';

テキストファイルの保存について、下記どちらを使っても日本語が化ける。
mdm.FileSystem.saveFile
mdm.FileSystem.saveFileUnicode
仕方ないので今回はescape()してから保存することにした。

ちゃんとUnicode対応したZinc V3が年明け出るらしいけど、直っているといいなー。
というか早く出ないかな。

MDM Zinc 2.5 メモ

| コメント(0) | トラックバック(0)

Zincアプリにフォーカスがあるかどうか判別。
mdm.Application.onAppChangeFocus = function(event:Object):Void {
if (event.status == "true") {
//Zincアプリがアクティブ
} else {
//他のアプリがアクティブ
}
};

MDM Zinc 2.5 メモ

| コメント(0) | トラックバック(0)

movieClipLoader.loadClipやxml.loadなどでローカルにあるファイルを読み込む際は、絶対パスで指定すること。
そうしないとパスに2バイト文字が含まれている時に読み込み失敗する。

関連:
mdm.Application.path …Zincアプリまでの絶対パス
mdm.FileSystem.loadFile() …Zincの機能を使ってテキストファイルとか読み込む

mProjector

| コメント(0) | トラックバック(0)

DirectorとFlashの相性がいまいち良くないので、
swfをexe化するならmProjectorとやZincのほうが良さそう。
ただ、mProjectorでも日本語入力確定後の表示がおかしい(アンダーラインが消えない等)。