ざつだ ん。 (09/04/01~)
09/04/01
・4月1日
今日はなぁ...何言ってもウソ扱いされる可能性があるからなぁ...。
・DFMコンバータエキスパート
ちょっとだけ修正。機能的には ver1.10 と変わりはありません。
・DelphiのTips
今日の Tips は DFMコンバータエキスパート にちなんでフォームファイルについてです。
09/04/04
・AVG 8.5
なんかイロイロおかしな事があったら以下の Tips を参照。
・古いバージョンがアンインストールできない
<!> 管理者権限を持つアカウントで作業する事 <!>
<!> 名前が漢字ではないアカウントで作業する事 <!>
- AVG Remover をDLして実行。
- コントロールパネルの "アプリケーション(プログラム)の追加と削除" に AVG が残っていれば、もう一度削除。
- PCを再起動。
- "%ProgramFiles%\AVG\" フォルダを削除。
- "%ProgramFiles%\Grisoft\" フォルダを削除。
- "%AllUsersProfile%\Application Data\avg7\" フォルダを削除。
- "%AllUsersProfile%\Application Data\avg8\" フォルダを削除。
- "%UserProfile%\Application Data\Grisoft\" フォルダを削除。
(Vista なら "%UserProfile%\AppData\Roaming\")
- レジストリエディタで [HKCU\Software\AVG] を削除。
- レジストリエディタで [HKCU\Software\Grisoft] を削除。
- レジストリエディタで [HKLM\Software\AVG] を削除。
- レジストリエディタで [HKLM\Software\Grisoft] を削除。
- レジストリエディタで [HKU\.Default\Software\AVG] を削除。
- レジストリエディタで [HKU\.Default\Software\Grisoft] を削除。
- "%temp%\" 内を削除。
- "%WinDir%\temp\" 内を削除。
レジストリ操作が面倒なら、以下のレジストリファイルを使うといい。
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Avg]
[-HKEY_CURRENT_USER\Software\Grisoft]
[-HKEY_LOCAL_MACHINE\Software\Avg]
[-HKEY_LOCAL_MACHINE\Software\Grisoft]
[-HKEY_USERS\.DEFAULT\Software\Avg]
[-HKEY_USERS\.DEFAULT\Software\Grisoft]
|
・インストールできない
<!> 管理者権限を持つアカウントで作業する事 <!>
<!> 名前が漢字ではないアカウントで作業する事 <!>
- 上の、"古いバージョンがアンインストールできない" を実行。
- AVG を "C:\AVG" にDL。
- インストーラを起動。
- インストールが終わったら "C:\AVG" フォルダを削除。
インストール時にリンクスキャナを外したいのであれば、
- 上の、"古いバージョンがアンインストールできない" を実行。
- AVG を "C:\AVG" にDL。
- AVG Installer を "C:\AVG" にDL。
- AVG_Install.exeを起動。
- インストールが終わったら "C:\AVG" フォルダを削除。
で、OK。AVG Installer の詳細についてはこちらを参照。
・名前が漢字の場合には?
こんな事になったりする。
言語ファイルが読み込まれていないのでメッセージがちゃんと読めないが、"@FinalDlg_InstFailText" という識別子でなんとか意味は解ると思う。要は "インストールに失敗しました" という事だ。"@Details" で詳細を見れるが、あまり大した事は書いてない。
海外製のソフトはアカウント名(プロファイル名)が漢字の場合、誤動作を起こす事がある。
- テンポラリフォルダ (%temp%) に漢字が含まれる事になるのでエラーになる。
- 設定ファイルを保存フォルダ (%AppData%) に漢字が含まれる事になるのでエラーになる。
- デスクトップ(%UserProfile%\Desktop) で作業しようとすると漢字が含まれる事になるのでエラーになる。
- マイドキュメント(%UserProfile%\My Documents) で作業しようとすると漢字が含まれる事になるのでエラーになる。
AVG に限らず、海外製のアプリケーションをデスクトップで解凍してインストールするのは避けた方がいい。つーか、アカウント名(プロファイル名)に漢字を使わない方がいい。どうしても使いたければ、最初に "OWNER" とかにしといてアカウント名(プロファイル名)の変更をするといい。こうすれば、アカウント名(プロファイル名)そのものは漢字でも、ユーザープロファイルは "OWNER" のままになるからだ。
・広告消し(Free Edition)
- avgmwdef_jp.mht
- avgfree_jp.mht
- avgresf.dll
適当にリネーム。
・最新版のDL先(Free Edition)
お好きな方で。
・Delphiの製品情報
CodeGear -> Embarcadero へサイトURLを変更しておいた。一部は未だに CodeGear.com にしかないものもあるようだけど...。
09/04/06
・Open Tools API
TEADマクロ や PPSH みたいなのを IDE に組み込んだら面白そうな気がしてきた。QC#44304 のせいで、外部ツールと連携させる事もままならないし。
・QC#44304
内容的にはこんなの。
test.cmd
----------------
echo %1 %2
pause
----------------
1.上のダミーファイルを[ツール]-[ツールの設定...]で登録。
2.実行時引数に$EDNAMEをセット。
/a $EDNAME
は期待通り展開されるが、
/a:$ROW
/a=$EDNAME
/a $ROW:$COL
等はトランスファマクロが正しく展開されないか、エラーになる。
但し、$PATH()のようにパラメータを必要とするマクロは
/a $PATH($EDNAME)\TEST2.EXE
のように後ろに空白がなくても正しく展開される。
しかし
/a=$PATH($EDNAME)
はやはり駄目。
余談だが、上の例では何故か"="も消えてしまう。
試しに実行時引数に
(100)
を入れると楽しい事になったので、実行時引数は単純に置換しているのでは
なく、何らかのパーサ(インタプリタ?)を通しているのだろうと思われる。
よって、
C:\Delphi(2007)\TEST.EXE
を実行時引数に渡してもアプリケーションには
C:\Delphi\TEST.EXE
と渡されてしまう。
|
マトモに動作しない位なら単純置換でいいのになぁ...コレのせいで、引数を渡して外部ツールと連携させる事がほぼ不可能となっている(現在では。昔は普通にできていた)。
・Open Tools API
爆速コンパイラを活かして Delfusa氏の案 もいいかなと思ってる。
- スクリプトを登録
- スクリプトをコンパイル
- EXEをキャッシュ置き場に生成
- EXEを実行
次回からは、
- スクリプトの日付/時刻が違えば再コンパイルしてキャッシュにプール
- キャッシュからEXEを実行
てな塩梅で。
09/04/07
・Skype?
山本隆さんのブログ(Delphi/BCB使いには山本性が多いのでフルネームか、「○○の山本さん」と記述するが吉^^;) を読んでいたら、"Windows 2000にSkype 4.0をインストールすると文字化けする" なんてエントリが。早速インストールしてみた...Vistaに。
Skype と言えば Delphi製。さて、件の現象が起きる理由は "Unicodeのせい" というのは解っている。ちょっとイタズラして、Skype をバイナリエディタにかけてみるとしよう...「何故」って?そりゃ、同じ Delphi 使いとしちゃ興味がない訳がないっしょ。
"生成物の EXE から、それをビルドした Delphi のバージョンを知る事ができる"ってのは、Tips に書いた通り。
で、調べてみると...ふーん、Skype って、"Delphi 2007 + TNT" でビルドしてるんだ。そうなると、次のメジャーバージョンでは 4.0 よりもスリムな EXE になるかもね。パフォーマンスも多少は向上するかもしれない...日本語GUIとかは特に。
でもテキスト処理がメインじゃない(チャットだって、一度に大量の文章を送受信する訳でもなし)から向上するって言っても誤差程度だとは思う。コンパイラに "Delphi 2009" を使える余地が残されてるのだけれど、Unicode周りが TNT で問題がないのなら、享受できるメリットがあまりないような気もしてきた。
...オチはないよ。
・QWERTY QUEST 2nd
前回に引き続きクリア。前回のに比べると難易度は低め。それにしても "ヒット&ブロー (Hit & Blow)" とは古典的なゲームを。クリア後の応募フォームにメールアドレスを入力する欄がなかったけど、当選したヒトには電話か郵送で通知が来るんかいな?
09/04/26
・"C#" on ".NET Compact Framework 2.0 + Firebird 2.0.1 Data Provider for .NET Compact Framework 2.0" on "何か"
確かに ".NET Compact Framework" は ".NET Framework" のサブセットでしょうけど、ピンポイントで必要な機能が端折られてるのは何かの嫌がらせだろうか?
- MessageBox.Show の引数の省略方法が変(引数1/2/5個はOKで3/4個は駄目とか)
- 二重起動防止が大変
- TextBox上でのKeyDown処理が面倒(やってみると解る)
- TextBox にはIME制御のプロパティがない(IME/SIP/入力モードとそれぞれに制御しなくてはならない)
- 実行時のパスを得るのでさえ一苦労
- Iniファイルは使えない(アンマネージドでも使えない)
- ネットワークに接続しているかを調べるのも一苦労
本当はもっとあるけど、この辺でやめとく。しかし...かなりシャレにならない。
C# はそんなに難しくはないけれど、Delphi に慣れてると細かな部分の差異で逆に躓く気がする。
"Firebird 2.0.1 Data Provider for .NET Compact Framework 2.0" は普通に使える。IBX とは使い方が全然違うけれど、覚えてしまえばなんて事はない。
なんだかんだで、3日もあれば "Windows Mobile 上で動作する Firebird クライアントアプリケーション" てのはそれなりに作れるもんである。なお、"Windows 上で動作する Firebird クライアントアプリケーション" は Delphi 製なのであしからず。
・何か とか アドエス で入力モードの制御を行うには?
最初に IME を OFF にしてから、入力モードを設定すればいい。
using Microsoft.WindowsCE.Forms;
...
// DLLインポート
[DllImport("CoreDll.DLL", SetLastError = true)]
private extern static int ImmSetOpenStatus(IntPtr hMMC, int fOpen);
...
// IMEモード変更
ImmSetOpenStatus(IntPtr.Zero, 0);
// 入力モード(IME/SIPではない)設定
// http://msdn.microsoft.com/ja-jp/library/ms172542(VS.80).aspx
InputModeEditor.SetInputMode(textBox1, InputMode.Numeric);
|
...のだが、何か とか アドエス では正しく動作しない。何故か?何か とか アドエスに採用されている "ATOK では、どの入力モードでも IME が完全に OFF にならないから" だ。
これを回避するには、"ATOK Changer" の導入を行うのが一番簡単だろう。
・"C# (VS2008)" & ".NET Compact Framework 2.0" & "Firebird 2.0.1"
C# は 4~5年ぶりでリハビリの途中だし、.NET CF 以外で .NET を使う気もないので、今の所別途に FAQ & Tips のページを作る予定はない。後で躓きそうな箇所は随時、雑談に載せておこう...この組み合わせの情報って限りなくゼロに近いからなぁ。
09/04/29
・"C#" on ".NET Compact Framework 2.0 + Firebird 2.0.1 Data Provider for .NET Compact Framework 2.0" on "何か"
先日の入力モードの制御はうまく動作しない。動作したような気がしたのは気のせいだったようだ。
...とはいえ、このまま放置するのもどうかと思うのでちゃんと動作するコードを。
// DLLインポート
[DllImport("CoreDll.DLL", SetLastError = true)]
private extern static int ImmSetOpenStatus(IntPtr hIMC, int fOpen);
[DllImport("CoreDll.DLL", SetLastError = true)]
private extern static IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("CoreDll.DLL", SetLastError = true)]
private extern static int ImmSetConversionStatus(IntPtr hIMC, UInt32 fdwConversion, UInt32 fdwSentence);
[DllImport("CoreDll.DLL", SetLastError = true)]
public static extern int ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
|
DLLインポート部は大して変わらない。
IntPtr context = ImmGetContext(Handle);
try
{
// IMEモード変更
ImmSetConversionStatus(context, IME_CMODE_ALPHANUMERIC, IME_SMODE_NONE);
// IMEモードOFF
ImmSetOpenStatus(context, 0);
// 入力モードを変更&[文字]キーによる入力モード変更禁止
Microsoft.Win32.RegistryKey reg = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Sharp\PhoneStatus");
ime_org = (int)reg.GetValue("Status22"); // 現在の入力モードを保存
reg.SetValue("Status22", 7); // 入力モードを"数値のみ(_1)"に変更
reg.SetValue("Status30", 1); // [文字]キーによる入力モード変更を禁止
reg.Close();
}
finally
{
ImmReleaseContext(Handle, context);
}
|
int型の変数を用意してオリジナルの入力モードを退避し、レジストリを書き換える。今回のアプリはバーコードで読み込ませるのが殆どで、あとは数値入力しかないので、入力モードを"数値のみ"に変更し、[文字]キーによる入力モード変更を禁止する。
[HKEY_CURRENT_USER\Software\Sharp\PhoneStatus] に関する資料はググれば出てくるが、別の機会に備忘録としてまとめておこう。
IntPtr context = ImmGetContext(Handle);
try
{
Microsoft.Win32.RegistryKey reg = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Sharp\PhoneStatus");
reg.SetValue("Status30", 0); // [文字]キーによる入力モード変更を許可
reg.SetValue("Status22", ime_org); // 入力モードを元に戻す
reg.Close();
// IMEモードON
ImmSetOpenStatus(context, 1);
}
finally
{
ImmReleaseContext(Handle, context);
}
|
アプリ終了時には、レジストリを元に戻して、[文字]キーによる入力モード変更を可能にする...こうすれば、ユーザが不用意に[文字]キーを触ってパニックになる事を防止できそうだ。
レジストリとは別に、IMEも制御しないと "確かに数値入力しかできないが全角数値になる" 等の問題が発生するようだ。