用語が正しいのかどうか分かりませんが、文字列で表現されたメッセージコードやエラーコードを識別子と表現しています。
例 WM_PAINT、ERROR_NO_MORE_FILES
実体である整数値とは、WM_PAINTの場合は15、ERROR_NO_MORE_FILESの場合は18を指しています。
これらは下記コードでも確認できます。
var
v:Integer;
s:String;
begin
v:=WM_PAINT;
ShowMessage(IntToStr(v)); //結果は'15'表示
v:=ERROR_NO_MORE_FILES;
ShowMessage(IntToStr(v)); //結果は'18'表示
上記ではコード自体に識別子を指定していますが、これを入力により指定したいのです。その場合は、識別子を文字列として受け取ることになると思います。
var
v:Integer;
s:String;
begin
s:='';
if not InputQuery('識別子入力','メッセージ識別子、エラー識別子を入力してください',s) then Exit;
//ここで、例えば、s='WM_PAINT'、s='ERROR_NO_MORE_FILES'
v:=XXXFunc(s); //XXXFunc : 知りたいなんらかの処理
ShowMessage(IntToStr(v)); //結果として、'15'や'18'表示
知りたいなんらかの処理とは、文字列である'WM_PAINT'を定数値であるWM_PAINTに変換する処理となります。
調べたところでは、ここの掲示板の以下のものが近いです。ただ、解決の方向としては、あくまで、文字列である'WM_PAINT'を定数値であるWM_PAINTに変換する処理であり、例えば、予め作成した対応表を利用するというような方法は希望してません。よろしくお願いします。
文字列から変数を取り出せる?
https://www.petitmonte.com/bbs/answers?question_id=2990
環境
Delphi6Personal+Win2000
出来ません。なぜならば
Const で定義されている物は実行時にその値が直接設定されてしまって
いる為です
(*) コンパイル時に置き換えられている
var
I : Integer;
begin
I := WM_PAINT;
Caption := IntToStr(I);
end;
とし、 I := WM_PAINT の場所にブレークポイントを設定し、CPUを見ると
わかりますが、
Unit2.pas.30: I := WM_PAINT;
004536E7 BE0F000000 mov esi,$0000000f
Unit2.pas.31: Caption := IntToStr(I);
004536EC 8D55FC lea edx,[ebp-$04]
004536EF 8BC6 mov eax,esi
004536F1 E8624DFBFF call IntToStr
004536F6 8B55FC mov edx,[ebp-$04]
004536F9 8BC3 mov eax,ebx
004536FB E8A41EFEFF call TControl.SetText
$0F という値が直接設定されているからです。
KHE00221さん、早速のご回答ありがとうございます。
メッセージコードやエラーコードは違うと勘違いしていましたが、誰が定義しようが、確かにConstで定義されていることには変わりないですね。
これまで、取っ掛かりがなくCPUは利用できていませんでしたが、今回、少し取っ掛かりを得た感じです。
どうもありがとうございました。
ツイート | ![]() |