- ManualFlat
-
procedure TForm1.Button1Click(Sender: TObject);
begin
if not(Panel1.Floating) then begin
Panel1.ManualFloat(Rect(0, 0, Panel1.Width, Panel1.Height));
end;
Panel1.Visible := True;
end;
これで擬似Ownedウィンドウなフォームができてしまうのですが、このときベースのPanel1のDragKindプロパティの値をdkDockにしないとフォームの移動ができません。
- Random
- Random関数はヘルプによると
Random 関数は,0 <= X < Range の範囲にある乱数を返します。
とあります。
ということはRandom(n) は 0<=x<n なので、戻り値はn未満ということになります。
ということでTStringsのリストをランダムに取り出したい場合
Result := Random(List.Count -1);
は間違いで
Result := Random(List.Count);
が正解となります。
- StrToIntとStrToInt64
-
function StrToInt(const S: string): Integer;
var
E: Integer;
begin
Val(S, Result, E);
if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;
function StrToInt64(const S: string): Int64;
var
E: Integer;
begin
Val(S, Result, E);
if E <> 0 then ConvertErrorFmt(@SInvalidInteger, [S]);
end;
StrToIntとStrToInt64は返す型が違うだけで実装は同じなんですね。
じゃぁ挙動も同じなのかというと違う点があります。
数値の頭につけて16進値として認識させる文字がStrToInt64の場合は '$'
だけになります。
StrToIntは '$' の他に 'x' もOKです。
li_Num := StrToInt('$ff'); //OK
li_Num := StrToInt('xff'); //OK
li_Num := StrToInt64('$ff'); //OK
li_Num := StrToInt64('xff'); //NG
2009-02-12:StrToIntがOKなのは'h'ではなく'x'であった間違いを修正
- Val手続き
- procedure Val(S; var V; var Code: Integer);
Val手続きは文字列中に数値変換に無効な文字がある場合その文字の位置をCodeに格納します。
この時Sがマイナス符号のある数値文字列であった場合Vはマイナス符号がつかなくなってしまいます。
procedure TForm1.Button1Click(Sender: TObject);
var
li_Num1, li_Num2, li_Pos : Integer;
begin
Val('-123', li_Num1, li_Pos); //li_Num1は -123
Val('-123,45', li_Num2, li_Pos); //li_Num2は 123
end;
マイナス符号のついた数値文字列を正しく変換するには、li_Posに0以上が返る場合li_Posまでの文字列をCopyでとり出し、改めてVal手続きに渡すということをしなければなりません。
procedure MyVal(S : String; var V : Integer; var Code: Integer);
var
ls_Num : String;
li_Pos : Integer;
begin
Val(S, V, Code);
if (Code > 0) then begin
ls_Num := Copy(S, 1, Code -1);
Val(ls_Num, V, li_Pos);
end;
end;