ホーム >プログラム >Delphi 6 ローテクTips >関数・手続きメモ

Delphiの関数・手続きのメモ。


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;