▼ nyさん
> LCardinal := Cardinal(StrToInt64(LText));
> これでうまく変換できました。
> LCardinal := StrToInt64(LText);
> これでもエラーになりませんが「0」がかえってくることがありました。
型の数値の範囲を外れると0になったり想定外の数値になります。
例:Cardinal(StrToInt64('-1')); 結果: 4294967295
例:Cardinal(StrToInt64('4294967296')); 結果: 0
Cardinalは、符号なし整数なので (Cardinal 0..4294967295)
文字列から「0または正数」に変換するので以下の処理が必要です
・負の数値の文字列の処理
エラーとするか、0にするか,Cardinalの最大値とするか
・オーバーフローの処理
エラーとするか、0にするか,Cardinalの最大値とするか
直接 Cardinal変数に代入するのではなく
一度Int64型の変数に代入してから処理してください。
procedure TForm1.Button1Click(Sender: TObject);
var
v : Cardinal;
i64 : int64;
begin
i64 := StrToInt64('4294967296');
if (i64 < 0) then
begin
// raise EIntError.Create('正数を入力してください');
i64 := 0;
end;
if (i64 > $FFFFFFFF) then
begin
// raise EIntOverflow.Create('Cardinalのサイズを超えました');
i64 := $FFFFFFFF;
end;
v := Cardinal(i64);
ShowMessage(IntToStr(v));
end;
|