メッセージコードやエラーコードの識別子?から実体である整数値を取得するには?

解決


おも  2008-02-08 07:12:17  No: 29726

用語が正しいのかどうか分かりませんが、文字列で表現されたメッセージコードやエラーコードを識別子と表現しています。
例 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


KHE00221  2008-02-08 07:37:55  No: 29727

出来ません。なぜならば

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 という値が直接設定されているからです。


おも  2008-02-08 08:08:48  No: 29728

KHE00221さん、早速のご回答ありがとうございます。

メッセージコードやエラーコードは違うと勘違いしていましたが、誰が定義しようが、確かにConstで定義されていることには変わりないですね。

これまで、取っ掛かりがなくCPUは利用できていませんでしたが、今回、少し取っ掛かりを得た感じです。

どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加