VBで作成されたプログラムをDelphiで書き換えています。
VBの記述で
TEXT = 'FF5B'
A = Val("&H" + TEXT)
という記述がありまして、16進文字列を数値に変換しています。
上の記述で、A = -165 が返されます。
TEXT = 'FFFF' では A = -1 が返されます。
このような関数がDelphiでもあるのでしょうか?
環境は、WinXP, Delphi5です。
Delphi にも Val() がありますよ。16進文字列の先頭に '$' をつけると
同じようにできます。Delphi では integer 型になるので 'FFFFFFFF' が
-1 になりますけど。普通は StrToInt() を使います。
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
begin
s := 'FFFFFFFF';
i := StrToInt('$'+s);
Label1.Caption := IntToStr(i);
end;
少し変えて、同等になるようにしました。
function VBVal(HexStr:string):integer;
begin
result := StrToInt('$'+HexStr)-65536;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntTostr(VBVal('FF5B'));
end;
重箱ですが、上記では負の値しか返りません。
32768以上かどうかで切り替え、になるでしょうか。
こんなかんじですか?
function VBVal(HexStr:string):integer;
begin
result := StrToInt('$'+HexStr);
if (result and $8000) <> 0 then result := result-65536;
end;
すみません、VBって、いまでも整数は16ビットなんですか?
たんにSmallIntにするだけでした。
function VBVal(HexStr:string):SmallInt;
begin
result := StrToInt('$'+HexStr);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := IntTostr(VBVal('FF5B'));
end;
VBとDelphi整数の名前が違うので注意してください。
Vb Delphi
long integer
になっています。
Delphiでは、integerは、汎用型ですので
Vbからの移植は Vb-Delphi変数対応表を一度目を通す方がいいです。
りおりおさん、mekeさんありがとうございます。
Delphiで16進を扱った事がなかったもので大変勉強になりました。
ツイート | ![]() |