旧Delphi FAQ - VCL(1)

Abstract: このQ&Aは、旧www.borland.co.jp に掲載されていた記事を転載したものです。記事は掲載時点の情報をあるがままに掲載しており、新バージョンでのご利用においては、コンポーネントやAPIの仕様変更等によりご利用いただけない場合がありますのでご留意ください。

    マウスイベントでカーソル形状を変更する場合の注意

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
マウスイベントでカーソル形状を変更する場合に注意することは ?

A:
単純に、OnMouseDown, OnMouseUp イベントで、Cursor := crxxxx としても左マウスの場合は、カーソルが変更されません。正しく動作させるためには、次のようにコードを書く必要があります。

 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
 begin
   if ssLeft in Shift then ReleaseCapture;
   Cursor := crHourglass;
   SetCapture( Handle );
 end;

 procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
 begin
   ReleaseCapture;
   Cursor := crDefault;
 end;

    Form の Canvas と Paintbox の Canvas への描画

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Form の Canvas と Paintbox の Canvas への描画について。

A:
Form に PaintBox を貼り、Brush の Color プロパティを設定せずに Form とPaintBox のキャンバスに対して描画するとそれぞれ別の色で描画されます。
Ctl3D プロパティが True の場合には Canvas の Brush の Color プロパティを明示的に指定する必要があります。Canvas に対して描画する場合はその前にBrush の Color プロパティを設定してください。

   procedure TForm1.FormPaint(Sender: TObject);
   begin
     Form1.Canvas.Brush.Color := ClBtnFace;
     Form1.Canvas.Ellipse(200,200,40,40);
   end;

    アクセラレータキーで特定のコントロールにフォーカスを移動する

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
アクセラレータキーで特定のコントロールにフォーカスを移動するには ?

A:

  1. Label コンポーネントを配置して、Capitoin プロパティでアクセラレータキーを指定します。

例 Caption プロパティに "&File" と指定すると Alt + F キーがアクセラレータキーとなります。

  1. Label コンポーネントの FocusControl プロパティにアクセラレータキーを押したときにアクティブにするコントロールの名称を指定します。

例 FocusControl プロパティに "Edit1" を指定します。

上記の2つの設定により、フォームがアクティブな時に Alt + F キーを押すと、フォーカスは Name プロパティが Edit1 のコントロールに移動します。

参照 Help の FocusControl プロパティ

    プログラムの実行時にメインフォームを決定する方法

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
プログラムの実行時にメインフォームを決定するにはどうしますか ?

A:
どのフォームがメインフォームとなるかは CreateForm で作成される順番により決まります。プロジェクトのメインのルーチンで最初に CreateForm で作成されたフォームがメインフォームとなります。
プロジェクトファイル(.DPR) での CreateForm の順を制御することで、メインフォーム実行時に切り替えることができます。

   if Condition_val = ‘A’ then
                         {Condidion_val の値によりメインフォームを決める}
   begin                 {Condition_val が A の場合はAForm がメインになる}
     Application.CreateForm(TAFm, AForm);
     Application.CreateForm(TBFm, BForm);
   end
   else
   begin                 {Condition_val が A以外の場合はBForm がメインになる}
     Application.CreateForm(TBFm, BForm);
     Application.CreateForm(TAFm, AForm);
   end;

    MDI の親フォームで F1 キーを押しても指定したヘルプが開けない

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
MDI で親フォームがアクティブになっているとき F1 キーを押しても、オプション(O)|プロジェクト(P)|Application|ヘルプファイル(F): で指定したヘルプファイルを開くことができません。

A:
MDI の親フォームでは、その Message がクライアントウインドウに渡されてしまうためです。これを回避するには、クライアントに渡される前に Tapplication のOnMessage で処理を行うようにします。

   procedure TMainForm.FormCreate(Sender: TObject);
   begin
     Application.OnMessage := HandleAppMessage;
   end;
   
   procedure TMainForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
   begin
     if (Msg.hwnd = clientHandle) and (Msg.message = WM_KEYDOWN)
        and (Msg.wParam = VK_F1) then
     begin
       Application.HelpContext(1);
       Handled := False;
     end;
   end;

    MDI の親フォームで OnKeyDown イベントが使えない

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
MDI の親フォームの OnKeyDown イベントに定義した内容が実行されません。
何かキーを押しても OnKeyDown イベントが呼ばれていないようです。

A:
MDI の親フォームでは、キーが押されたなどのイベントはクライアントウインドウに渡されてしまうので、フォーム の OnKeyDown などでは処理できません。
このような場合には、 Tapplication の OnMessage で処理を行います。

   procedure TMainForm.FormCreate(Sender: TObject);
   begin
     Application.OnMessage := HandleAppMessage;
   end;
   
   procedure TMainForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
   begin
     if (Msg.hwnd = clientHandle) and (Msg.message = WM_KEYDOWN)
        and (Msg.wParam = VK_RETURN) then
     begin
       ShowMessage('Return key');
       Handled := False;
     end;
   end;

    テキストファイルから一文字づつ、メモに読み込みたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
テキストファイルから 1文字づつ、memo の Lines に読み込むにはどうしますか ?

A:
以下のコードをお試しください。

   var
     f: TextFile;
     temp: Char;
   begin
     Memo1.Lines.Clear;
     AssignFile(f, 'c:\test.txt');
     Reset(f);
     while not Eof(f) do
     begin
       Read(f, Temp);
       Memo1.Lines.Add(temp);
     end;
     CloseFile(f);
   end;

    Edit ボックスに入力した文字を右寄せにして表示したい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Edit ボックスに入力した文字を右寄せにして表示したい場合、Edit、MaskEdit コンポーネントには Alignment プロパティがないので、Memo コンポーネントで擬似的に行います。

手順:

  1. Memo コンポーネントを張り付け適当なサイズにする。
  2. 必要に応じて MaxLength を設定する。
  3. Alignment を taRightJustify にする。
  4. OnKeyPress イベントに以下のコードを書く。
    if Key = #13 then Key := #0;

    マウスの右ボタン関係のイベント処理

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
マウスの右ボタン関係のイベント処理は、どのようにするのですか ?
(OnClickイベントに相当するもの)

A:
OnMouseDown イベントで、引数の TMouseButton を使用できます。
if button = mbRight then .....;

例えば、フォームの OnMouseDownに

  procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
                                 Shift: TShiftState; X, Y: Integer);
  begin
    if button = mbRight then

       PopupMenu1.Popup(Form1.ClientOrigin.x + x,
                        Form1.ClientOrigin.y + y);
  end;

上記のコードで右ボタンが押された時のみポップアップメニューを表示します。

    Form をアイコン化するとファイル名が表示される

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
起動時にアイコン化すると Form の Caption を表示してますが、Form を表示し、またアイコン化するとファイル名になってしまいます。どうのようにしたらファイル名以外を常に表示できるのですか ?

A:
Application.Title をセットしてください。 ver 1.0 では、Options メニューのProject を選んで、Application ページを開くと Title をセットできます。
ver 2.0 では、プロジェクト|オプション|アプリケーション|タイトルにセットできます。

    タイマを使用してアイコン化している Form を表示したりアイコン化する方法

該当するバージョン:Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
設定されている一定時間を経過したら (タイマを使用)、アイコン化しているアプリケーションの Form を表示したり、その逆にアイコン化する方法は ?

A:
次のようにすれば実現できます。TTimer コンポーネントを配置して、Interval プロパティに経過時間を設定してください。

   procedure TForm1.Timer1Timer(Sender: TObject);
   begin
   If Form1.WindowState =  wsMinimized Then
      Form1.WindowState := wsNormal
   else
      Form1.WindowState := wsMinimized;
   end;

    Savedialog (「ファイル名をつけて保存」)で表示されるディレクトリの変更

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
SaveDialog (「ファイル名をつけて保存」)で表示されるデフォルトでのディレクトリを変更したいのですが、どうすれば良いのでしょうか。

A:
SaveDialog コンポーネントの InitialDir プロパティを設定して下さい。このプロパティで指定したディレクトリをデフォルトとすることができます。
InitialDir プロパティが設定されていない場合は、カレントディレクトリがデフォルトになります。

    スクロールバーのあるフォームでの座標値

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
スクロールバー付きのフォームに描画する場合、単に座標値を数字で表すと、実行時にスクロールした場合も、スクロールした画面での座標値に描画されてしまいます。
どのようにするとよいのでしょうか ?

A:
スクロールに関係なくフォームとしての座標値を取得する場合はスクロールバーオブジェクトから、座標情報を取得します。フォーム上にある、水平または垂直スクロールバーの現在位置は ScrollPos プロパティにより取得できます。

HorzScrollBar.ScrollPos + X {水平スクロールバーの場合}
VertScrollBar.ScrollPos + Y {垂直スクロールバーの場合}

    FormStyle := fsStayOnTop について

該当するバージョン:Delphi 1.0

Q:
フォームにボタンオブジェクトを一つ配置して、それをダブルクリックし、「Form1.FormStyle := fsStayOnTop;」を書きました。
実行時にボタンをクリックすると確かに常に前面に表示されるようになりますが、アイコン化した時そのアイコンの上に他のアプリのウィンドウを重ねた場合アイコンが下に隠れてしまいます。 重ねたウィンドウはノーマルで、前面に表示するようにはなっていません。

A:
StayOnTop は「フォームをフォーム表示のときに常に前面表示するオプション」です (アイコンの状態の時の動作については影響しません)のでご指摘の動作が仕様になります。

このアイコンを手前に表示するには、Application.Handle のウィンドウハンドルに対して SetWindowPos 関数を発行して下さい。

  Form1.FormStyle := fsStayOnTop;
  SetWindowPos(Form1.Handle,HWND_TOPMOST,1,1,1,1,SWP_NOMOVE+SWP_NOSIZE);

    ColorToRGB 関数の逆の働きをする関数は

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
ColorToRGB 関数の逆の働きをする関数は何でしょうか ?

A:
TColor(Num) のようにすればよいでしょう。
ColorToRGB は、clBlue や clRed のように具体的な値が指定される場合、そのまま 4 バイトの Longint に型変換するだけです。
逆に、clActiveCaption のように抽象的な指定があるとシステムの設定によってRGB の値が変わり、システムの設定値をもとにした RGB 値を返します。
なお、clActiveCaption はそのままでは -3 と等価です。 RGB 値は TColor の範囲に収まる値になりますから、そのまま TColor(Num) とキャストすれば正しく型変換できます。 たとえば、clActiveCaption(-3) の RGB 値が $800000 である場合に、$800000 から clActiveCaption を得る関数はありません。

    TCanvas 型で描画される範囲の一部無効化

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TCanvas 型で描画される範囲の一部を無効化したい場合どうするのでしょう。

A:
一部を無効化するというメソッドはないのと、TCanvas 自身はウィンドウハンドルを持っていないので、フォームのハンドルを使って InvalidateRect を呼び出すようにしてください。

    パネルを配置したフォームでカーソルキー移動キーを(VK_LEFT 他)を取得

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
パネルを配置したフォームでカーソルキー移動キーを(VK_LEFT 他)を取得したいのですができません。フォームにはパネルが有るだけです。パネルを置くと取得できないようですが。フォームの KeyPreview プロパティを True (フォームのどのコントロールが選択されているかに関係なくほとんどのキーイベントを最初にフォームに渡す設定)にしています。

A:
フォームの上に Windowed Control(Panel 等) があると、フォームはカーソル移動キーを OnKeyDown に渡さずに、コントロールの移動のためのキーと解釈してしまいます。これを横取りするには OnKeyDown ではなくて以下の手続きを使用します。

  1. フォームの protected メンバに宣言します。
   procedure CMDialogKey(var msg : TCMDialogKey);  message CM_DIALOGKEY;
  1. サンプル例
   procedure TForm1.CMDialogKey(var msg : TCMDialogKey);
   begin
     if msg.CharCode = VK_LEFT then begin
       { 実行したいコード };
       msg.Result := 1;   { 処理した事を示すコード }
     end else inherited;
   end;

CM_*, CN_* は一から独自のコンポーネントを作成する以外はほとんど必要ありませんが、CM_DIALOGKEY だけは有効です。
ほかにも、TabSet のページを Ctrl-Tab でめくりたい、という場合などもCM_DIALOGKEY を利用するとフォーカスの位置を気にせず簡単に書けます。
オンラインヘルプ(CWG.HLP)では、TCMDialogKey で検索して下さい。

    Form の OnCreate の処理中に中断

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Form の OnCreate の処理中に中断したい場合、Close メソッドを呼んでも無視されてしまうみたいです。 どのようにしたら良いのでしょうか。

A:
Close はフォームの作成が正常に終了し、メッセージループに入ったあとで使用します。 OnCreate の中断のためには例外を raise するのがよいでしょう。

    円や楕円、線などの図形をフォームに描画するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
円や楕円、線などの図形をフォームに描画するには、どうすれば良いのでしょうか ? また、描画する図形のプロパティの指定はどうしますか ?

A:
フォームには、Canvas という実行時プロパティがあり、このプロパティの描画用メソッド(LineTo や Ellipse など)を使って、フォーム上に描画できます。 もし、特定の描画領域(四角形)の中だけに描画したい場合は PaintBox というコンポーネントを貼り付けて、PaintBox の Canvas プロパティを使ってください。
たとえば、ボタンを押したときに何か描画したいのであれば、フォーム上にボタンを配置し、ダブルクリックして、次のようなイベントハンドラを用意すればよいでしょう。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     with Canvas do
     begin
       Pen.Width := 3;   { ペンの幅 }
       MoveTo(100, 0);   { 座標を移動する }
       LineTo(300, 200); { 線を描画する }
       Ellipse(100, 0, 300, 200); { 楕円を描画する }
     end;
   end;

描画用のメソッドは、オンラインヘルプで TCanvas を参照してください。なお、サイズが変更されたり、隠れていたフォームが表示されたときにも、描画した内容を保持しておく(再描画する)ためには、描画した内容を変数等に保存してフォームの OnPaint イベントハンドラを定義して描画し直す必要があります。

    ストリングリストへのオブジェクトの追加

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
with Fruits do Objects[IndexOf('apple')] := AppleBitmap;

Fruits というストリングリストが存在するとき、上記の代入によって、先にIndexOf('apple') の位置にアサインされていたオブジェクトはどうなってしまうのでしょう ?

A:
オブジェクトは関連付けられているだけで、生成・削除については別個に処理しなければなりません。 事前に解放して下さい。

Q:
上記に関連して質問ですが、下記のコードを実行した場合に、事前に関連づけられていた Object へは正常にアクセスできるのでしょうか ?

   for Index := 0 to ListBox1.Items.Count -1 do
     ListBox1.Items[Index] := UpperCase(ListBox1.Items[Index]);

A:
単にオブジェクトを指し示す文字列の名前が大文字になるだけです。
文字列を変更したら関連性がなくなるというわけではありません。

UpperCase は単に文字列(string 型)を値渡しで受け取り、文字に変換した文字列を返すものです。上記はより厳密に記述すると

   for Index := 0 to ListBox1.Items.Count - 1 do
     ListBox1.Items.Strings[Index] :=
     UpperCase(ListBox1.Items.Strings[Index]);

となります。
Object Pascal では string は単純型ですから、単に
UpperCase(ListBox1.Items.Strings[Index]);
としただけでは、大文字に変換された文字列を受け取るものがありません。

    Delphi で Form を動的に作成するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Form を動的に複数作成する事ができるでしょうか ?

A:
プログラムを記述する必要はありますが、できます。 たとえば、フォーム上にボタンを2つ配置して、それぞれ次のようなイベントハンドラを定義すれば、新しいウィンドウのオープンとクローズが実現できます。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     NewForm: TForm1;
   begin
     NewForm := TForm1.Create(Self);
     NewForm.Top := Top + 20;
     NewForm.Left := Left + 20;
     NewForm.Show;
   end;

   procedure TForm1.Button2Click(Sender: TObject);
   begin
     Close;
   end;

ただし、この方法では最初にオープンされたフォームがクローズされると、他のフォームがクローズされていなくても、アプリケーションが終了します。
オープンしたフォームをクローズするにはそのデータを保存する必要があります。

    StringGrid に入力するセルの指定

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
StringGrid のセルに入力したいのですが、入力するセルの指定を行うには、どうしますか ?

A:
StringGrid で入力セルの指定を行うには、以下のようにできますのでお試しください。

  procedure TForm1.Button1Click(Sender: TObject);
   begin
     StringGrid1.Row := StrToInt(Edit1.text);  { ここに Row となる値を入力 }
     StringGrid1.Col := StrToInt(Edit2.text);  { ここに Col となる値を入力 }
     StringGrid1.SetFocus;   { Row、Col で指定したセルをアクティブにします }
   end;

    PaintBox に X, Y を引数として渡して描画したい

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
PaintBox に X, Y を引数として渡して描画したいのですが。

A:
以下のコード参照してください。

   implementation

   {$R *.DFM}
   var
     Flag : Boolean;

   procedure TForm1.Button1Click(Sender: TObject);
   const
     range = 200;
   var
     sft : TShiftState;
     btn : TMouseButton;
     X, Y, X1, Y1 : Integer;
   begin
     Randomize;
     X  := Random(range);
     Y  := Random(range);
     X1 := Random(range);
     Y1 := Random(range);
     PaintBox1.OnMouseDown(Sender, btn, sft, X, Y);
     PaintBox1.OnMouseDown(Sender, btn, sft, X1, Y1);
   end;

   procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   begin
     if not Flag then
       begin
         Flag := True;
         PaintBox1.Canvas.MoveTo(X, Y)
       end
     else
       begin
         PaintBox1.Canvas.LineTo(X, Y);
         Flag := False
       end
   end;

   procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   begin
     Flag := False;
   end;

   end.

    自作のカーソルを表示するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
自作のカーソルを表示したいのですが。

A:
以下のコード参照してください。

   implementation

   {$R *.DFM}
   {$R mycur.res}       { 自作のカーソルを読み込みます }

   procedure TForm1.Button1Click(Sender: TObject);
   var
     HC : HCursor;
   begin
     HC := LoadCursor(HInstance, 'CURSOR_1');  { WinAPI }
     Screen.Cursors[1] := HC;
     Cursor := 1;
     Edit1.Text := IntToStr(HC);
   end;

   end.

    Char の値を Integer に変換するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Char の値を Integer に変換したいのですが。

A:
以下のコード参照してください。

   procedure TForm1.Button1Click(Sender: TObject);
   var
      i : Integer;
      c : Char;
   begin
      c := #$FF;
      i := Integer(c);
      Edit1.Text := IntToStr(i);
   end;

    動的に作成した Button をクリックした時にある処理を行わせたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
動的に作成した Button をクリックした時にある処理を行わせたいのですが。

A:
以下のコードのように自作のハンドラを、作成した Button1 に割り当ててください。

   type
     TForm1 = class(TForm)
       Button1: TButton;
       procedure Button1Click(Sender: TObject);
       procedure Button0Click(Sender: TObject);     { 追加  }
     private
       { Private 宣言 }
     public
       { Public 宣言 }
     end;

   var
     Form1: TForm1;
     Button0 : TButton;    { 追加 }
   implementation

   {$R *.DFM}

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Button0 := TButton.Create(Form1);
     Button0.parent := Form1;
     Button0.name := 'MyButton';
     Button0.Caption := 'PUSH';
     Button0.OnClick := Button0Click;  {  自作のハンドラ (Button0Click) }
   end;                                {  に割り当てる }

   procedure TForm1.Button0Click(Sender: TObject);  { 自作のハンドラ }
   begin
     ShowMessage('ハンドラの中...');
   end;

    フォームを最大表示しても最大化表示されない。

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
WindowState を wsMaximized にして Posision を poScreenCenter にすると、実行時の表示位置が正しくなりません。 ウインドウのサイズは最大化されていますが、左上の位置がデザイン時のウインドウサイズでセンタリングされています。

A:
WindowState は Maximized で、Position が ScreenCenter の場合、BorderStyle の指定により動作が異なります。

   BorderStyle          動き
     Dialog             最大化されない。
     Single             最大化され、表示位置がデザイン時の大きさのセンター位置
     None               上に同じ
     Sizeable           左と上の枠が見える状態

Position を Default にしておくと期待どうりに表示されます。

    クライアント領域がペイントボックスの領域より大きくならないようにしたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
フォームに大きさを固定したペイントボックスを置いている場合で、フォームの最大化やマウスでフォームを大きくしたときにクライアント領域の大きさがペイントボックスの大きさより大きくならないようにするにはどうしたら良いのでしょうか ?

A:
OnResize で WidthやHeight が希望より大きければ Width, Height に希望の値を入れてください。

    Form の Scaled プロパティ

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
Form の Scaled プロパティは、スクリーンのサイズが変わっても各コントロールが正しく表示されるようですが、表示位置は調整しているみたいでコントロールの大きさが変わりません。 例えば 1280×1024 で作って置いて、640×480 で表示するとラベルの後ろの部分がきれてしまったり、エディットの高さが文字の大きさに比べて低くなったりします。

A:
各コントロールのフォームとの比率を持っておき、OnCreate でそのサイズに調整するなどして対応してください。

    ClientToScreen メソッドが正しく画面座標を返すには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TLabel などのコンポーネントで、マウス・ボタンが押された時の座標に、ポップアップ・メニューを表示しようとしています。 ポップアップ・メニューの表示だけであれば、TLabel の PopupMenu プロパティにメニューを設定すればいいのですが、マウス・ボタンが押された時の座標を使った処理が必要なため、TLabel の OnMouseDown イベントハンドラを使っています。

   procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
   var
     Point: TPoint;
   begin
     Point.X := X;
     Point.Y := Y;
     ClientToScreen(Point);
     PopupMenu1.Popup(Point.X, Point.Y);
   end;

マウス座標 (X, Y) はラベルのクライアント座標で渡されるのですが、ポップアップ・メニューを表示させる Popup メソッドは、画面座標を要求します。
そこで、ClientToScreen メソッドで、座標変換をしようとしているのですが、上記Point の値は ClientToScreen メソッド実行後も変化しません。 この結果、ポップアップ・メニューは画面左上付近に表示されます。

TLabel の親になっているコンポーネントの left、top プロパティの値を全て座標に加えてやるとかなり近い座標になりますが、それでも、トップ・ウィンドウのキャプションの分だけずれています。
ClientToScreen メソッドが正しく画面座標を返すためには、何か条件があるのでしょうか ?

A:
Labelのクライアント座標をスクリーン座標にするには以下のようにします。

Label1.ClientToScreen(Point); 

次に、ClientToScreen は TPoint を受け取って、TPoint を返すファンクションなので以下のようにします。

Point2 := Label1.ClientToScreen(Point); 

    TImage の Width と Hight を変更してもサイズが変わらない

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
TImage コンポーネントを TPaintBox のように使用して描画を行っているのですが Width と Height の値を大きくしても、TPaintBox のようにサイズが変わらないのですがどうすればよいでしょうか?

A:
基本的には TPaintBox を使用してください。TImage で行うには作成時に最大のサイズにしておき、必要なサイズに再指定して使用するような方法がありますが、最大のサイズが予想できない場合には適しません。

   Image1 := TImage.Create(Form1) ;
   with Image1 do begin
     Parent := Form1 ;
     Width := Form1.Width  ;
     Height := Form1.Height ;
     Canvas.MoveTo(0,0) ;
     Width := 200 ;
     Height := 200 ;
   end:

    StrScan による文字列処理

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
StrScan で文字列の中に任意の文字があるか検索し、あればその文字を削除したい。
StrScan を行った後、StrPCopy で '' を代入し削除しようとしましたができませんでした。 どのような方法で行えばよいのでしょうか。

A:
文字列処理ルーチン(Pascalスタイル)の Pos と Delete を使用してください。

    日付の和暦表示

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
データベースの日付型の項目(西暦)を和暦で表示するにはどうすればよいですか。

A:
FormatDateTime 関数を使用してください。

   Edit1.Text := FormatDateTime('gg,ee,m,d', Order_Date.Value);

    指定した時間の間だけプログラムを停止するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
指定した時間だけ実行中のプログラムを停止させるには

A:
下記コードを参照してください。
このコードは Form の Color を一定時間変更します。

   procedure delay(T: longint);
   var
     finish: longint;
   begin
     finish := GetTickCount + T;
     repeat
       Application.ProcessMessages
     until GetTickCount > Finish
   end;

   procedure TForm1.Button1Click(Sender: TObject);
   var
     c: TColor;
   begin
     c := Color;
     Color := claqua;
     delay(3000);
     Color := c;
   end;

    メモコンポーネントのスクロールをボタンで行なうには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
メモコンポーネントのスクロールをスクロールバーではなく、ボタンで行いたいのですが ?

A:
下記コードを参照してください。
ボタンをクリックすることによって上下左右にスクロールを行います。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     SendMessage(Memo1.Handle, WM_HSCROLL, SB_LINELEFT, 0);
   end;

   procedure TForm1.Button2Click(Sender: TObject);
   begin
     SendMessage(Memo1.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
   end;

   procedure TForm1.Button3Click(Sender: TObject);
   begin
     SendMessage(Memo1.Handle, WM_VSCROLL, SB_LINEUP, 0);
   end;

   procedure TForm1.Button4Click(Sender: TObject);
   begin
     SendMessage(Memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);
   end;

    コード上でスピードボタンに Bitmap を指定したい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
スピードボタンにコード上で Bitmap を指定するようなプログラミングをしたいのですが、どのようにすればよいのでしょうか ?

A:
下記のコードを参考にして下さい。

単純に PATH を指定して Glyph に割り当てる

SpeedButton1.Glyph.LoadFromFile('XXX'); 

ボタンの状態によって Bitmap を指定するには NumGlyph を指定する

SpeedButton1.NumGlyphis := 1; 

    Image コンポーネントの表示内容をコピーするには、どうしたら良いですか ?

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
TImage に Bitmap を動的に読込み、その Bitmap を別の TImage に表示させたいのですが、どうしたら良いですか ?

A:
まず、Image コンポーネントに動的に BitmapFile を読み込むには、LoadFromFile メソッドを使用します。そして、別の Image コンポーネントに表示させるには CopyRect メソッドを使用します。下記コードを参考にして下さい。

Image1 に BitmapFile を読み込み、Image2 に Image1 に表示されているものと同じものを表示させます。

   procedure TForm1.FormCreate(Sender: TObject);
   var
     Bitmap1: TBitmap;
   begin
     Bitmap1 := TBitmap.Create;
     Bitmap1.LoadFromFile('c:\Delphi\Images\Splash\16Color\athena.bmp');
     Image1.Canvas.Draw(Image1.Top, Image1.Left, Bitmap1);
   end;

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Image2.Canvas.CopyRect(ClientRect,Image1.Canvas ,ClientRect);
   end;
<<CODE>>

    別のフォームを表示させたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Form 上のボタンをクリックすることによって別の Form を呼び出したいのですが ?

A:
下記のコードを参考にしてください。

フォーム上のボタンを押すことによって AboutBox を表示させるプログラムです。あらかじめ、複数のボタンの OnClick イベントを同一にして下さい。選択したボタンはすべてこのプロシージャで一括処理されます。

   procedure TMainForm.Button1Click(Sender: TObject);
   begin
     if Sender = Button1 then
        AboutBox.Caption := 'About '+Application.Title
     else
        AboutBox.Caption := '';
     AboutBox.ProgramIcon.Picture.
                          LoadFromFile('c:\delphi\images\icons\handshak.ico');
     AboutBox.showModal;
   end;

    TBitmap を使用して Bitmap をフォーム上に描画するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TBitmap オブジェクトを使用して Bitmap を読み込み、表示させたいのですが、どうしたら良いですか ?

A:
下記コードを参考にして下さい。

フォーム上のボタンをクリックすることによって TImage に Bitmap を表示します。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     Bitmap: TBitmap;           { Bitmap を保存するための一時変数 }
   begin
     Bitmap := TBitmap.Create;  { Bitmap Object を作成します }
     Bitmap.Width := 500;       { 幅の初期値を指定します }
     Bitmap.Height := 500;      { 高さの初期値を指定します }
     Image1.Picture.Graphic := Bitmap;  { Bitmap を TImage に割り当てます }
   end;

また、TImage を使用せずに、フォームに直接描画するには、次のコードを参考にして下さい。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     Bitmap: TBitmap;
   begin
     Bitmap := TBitmap.Create;
     Bitmap.LoadFromFile('C:\Delphi\Images\Splash\16Color\Athena.bmp');
     Form1.Canvas.Draw(10, 10, Bitmap);
   end;

    指定された形式で日付時刻を表示させたいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
日付及び時刻を表示する際に、指定した形式で表示させたいのですが、どのようにすればよいのでしょうか ?

A:
下記のコードを参考にして下さい。

TEdit に指定された形式で日付及び時刻が表示されます。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     S: string;
   begin
     S := FormatDateTime('gggee/mm/d aaa ' + '"at" hh:mm AM/PM', 
                                          StrToDateTime('95/02/15 10:30am'));
     Edit1.Text:= S;   {  平成08/01/01 水 at 10:30 AM  } 
   end;

    リターンキーでフォーカスを移動させたいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TEdit でリターンキーを押したと同時に、次のコンポーネントにフォーカスを移したいのですが、どのようにすればよいのでしょうか ?

A:
下記のコードを参考にして下さい。

Edit1 にフォーカスがあった場合、Edit2 へフォーカスが移動します。

逆に Edit2 にフォーカスがあった場合、Edit1 へフォーカスが移動します。

   procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
   begin
     if key = chr($d) then
       Edit2.Setfocus;
   end;

   procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
   begin
     if key = chr($d) then
       Edit1.Setfocus;
   end;

    リストボックスにコードで文字列を追加したいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TListBox に文字列をコード上で追加したいのですが、どのようにすればよいのでしょうか ?

A:
下記コードを参考にして下さい。

ボタンをクリックすることによってリストボックスに文字列を追加します。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     ListBox1.Items.Add('New item');
     ListBox1.Items.Add('2 item');
     ListBox1.Items.Add('this');
     ListBox1.Items.Add('2 item');
     ListBox1.Items.Add('3 item');
   end;

    メモコンポーネントにテキストファイルを表示させたいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
メモコンポーネントにテキストファイルを表示させたいのですが、どのようにすればよいのでしょうか ?

A:
下記コードを参考にして下さい。

メモコンポーネントにテキストファイル(AUTOEXEC.BAT)を表示させます。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Memo1.Lines.LoadFromFile('C:\AUTOEXEC.BAT');
     Label1.Caption := 'The 6th line of AUTOEXEC.BAT is: ' + Memo1.Lines[5];
   end;

    ペイントボックスを使用してランダムに線を描画したいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
ペイントボックス内にランダムに線を描画したいのですが、どのようにすればよいのでしょうか ?

A:
下記のコードを参考にして下さい。

var
  Flag : Boolean;

procedure TForm1.Button1Click(Sender: TObject);
const
  range = 200;
var
  sft : TShiftState;
  btn : TMouseButton;
  X, Y, X1, Y1 : Integer;
begin
  Randomize;
  X  := Random(range);
  Y  := Random(range);
  X1 := Random(range);
  Y1 := Random(range);
  PaintBox1.OnMouseDown(Sender, btn, sft, X, Y);
  PaintBox1.OnMouseDown(Sender, btn, sft, X1, Y1);
end;

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if not Flag then
     begin
       Flag := True;
       PaintBox1.Canvas.MoveTo(X, Y)
     end
  else
     begin
       PaintBox1.Canvas.Pen.color := clRed;  { 色変更 }
       PaintBox1.Canvas.LineTo(X, Y);
       Flag := False
     end
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Flag := False;
end;

end.

    単純な文字列の印刷を行いたいのですが ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Edit コンポーネントに表示された文字列を印刷したいのですが、どのようにすれば良いのでしょうか ?

A:
下記コードを参考にして下さい。その際、uses 節に Printers を追加します。Edit 内の文字列が印刷されます。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Edit1.Text := 'プリンタへ出力';
     Printer.BeginDoc;
     Printer.Canvas.TextOut(0, 0, Edit1.Text);
     Printer.EndDoc;
   end;

    メモコンポーネントの例外処理を行いたいのですが ?

該当するバージョン:Delphi 1.0

Q:
メモコンポーネントを使用して、テキスト処理を行っているのですが、32KB を超えた時に、警告のメッセージを表示して、例外処理を行いたいのですが、どのようにすればよいのでしょうか ?

A:
下記コードを参考にして下さい。

32KB を超えた場合に警告メッセージが表示されます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Memo1.Lines.LoadFromFile('XXX');
  except
    on EOutOFResources do
       begin
         Application.MessageBox('TEXT が 32KB 以上です','警告', mb_OK );
         Memo1.Lines.LoadFromFile('XXX');
       end;
  end;
end;

    コンポーネントをマウスで移動させるには、どうしますか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
コンポーネントをマウスで移動させるには、どうしますか ?

A:
以下のコードは、EDIT コンポーネントをマウスで移動します。

unit Unit1;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Grids, Outline, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Edit1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Edit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  Flag, sx, sy: Integer;


implementation

{$R *.DFM}

procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
     if flag = 1 then
     begin
          Edit1.top := y + sy;
          Edit1.left := x + sx;
          sy := Edit1.top;
          sx := Edit1.left;
    end;
end;

procedure TForm1.Edit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     Flag :=0;
     Screen.Cursor := crDefault;
end;

procedure TForm1.Edit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     sx := Edit1.left;
     sy := Edit1.Top;
     Flag := 1;
     Screen.Cursor := crDrag;
end;
end.

    GRAPHEX の Print メニューが実装されていない

該当するバージョン:Delphi 1.0

Q:
GRAPHEX サンプルプログラムでビットマップの印刷を行う手続き PrintBitmap の対応コードをお知らせします。
A:
GRAPHEX の Print メニューの実装のサンプルです。以下のコードを参考にしてください。

{$DEFINE STRETCHPRINT}

procedure TForm1.Print1Click(Sender: TObject);
var
   BWImage : TBitmap;

  procedure PrintBitmap(Bitmap: TBitmap; X, Y: Integer);
  var
    Info: PBitmapInfo;
    InfoSize: Integer;
    Image: Pointer;
    ImageSize: DWORD;   { Ver 1.0 では、LongInt }
  begin
    with Bitmap do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      Info := MemAlloc(InfoSize);
      try
        Image := MemAlloc(ImageSize);
        try
          GetDIB(Handle, Palette, Info^, Image^);
          with Info^.bmiHeader do
            StretchDIBits(Printer.Canvas.Handle, 0, 0, X, Y,
              0, 0, biWidth, biHeight, Image, Info^,
              DIB_RGB_COLORS, SRCCOPY);
        finally
          FreeMem(Image, ImageSize);
        end;
      finally
        FreeMem(Info, InfoSize);
      end;
    end;
  end;

begin
  with Printer do
  begin
    BeginDoc;
{$IFDEF STRETCHPRINT}
    PrintBitmap( Image.Picture.Bitmap, 800, 600 );
{$ELSE}
    BWImage := TBitmap.Create;
    try
       BWImage.Assign(Image.Picture.Graphic);
       BWImage.Monochrome := True;
       Canvas.Draw(0, 0, BWImage);
    finally
       BWImage.Free;
    end;
{$ENDIF}
    EndDoc;
  end;
end;

    Format 関数を使用して文字列(数値)の先頭にゼロを埋め込みたいのですが ?

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
Format 関数を使用して文字列(数値)の先頭にゼロを埋め込みたいのですが、具体的にどのようにすればよいのでしょうか ?

A:
形式文字列の精度指定子を指定することにより、ゼロを埋めることができます。
精度指定子の構文は ["." prec] です。下記コードを参考にして下さい。

  Format('%.6d', [123]);   { 123 -> 000123 }

    フォームの右下にボタンを配置するには

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
フォームの右下にボタンを配置したいのですが、どうすればよいのでしょうか。
パネルの Align プロパティに alRight や alBottom という指定はありますが、alRightBottom という指定は見あたりません。

A:
この場合は、2つのパネルを組み合わせて使います。 まず、フォーム上にパネルを配置し、Align プロパティを alBottom に設定します。 次に、このパネルの上に別のパネルを配置し、Align プロパティを alRight に設定します。 すると、上のパネルは常にフォームの右下に表示されます。 この上に Button コンポーネントを配置すれば、常に右下にボタンが表示されます。 デフォルトでは、パネルの輪郭が表示されているため、BevelInner、BevelOuter プロパティを bvNone に、ParentColor を True に設定してください。

    メインメニューの右端に「ヘルプ」メニューを表示するには

該当するバージョン:Delphi 1.0

Q:
メニューエディタで、メインメニューの右端に「ヘルプ」メニューを表示したいのですが、設定するプロパティがないようです。

A:
メニューエディタでは、メニュー項目を右端に表示する設定(HELP分割)は設定できません。 Help メニュー項目のコンポーネント名を Help1 とすると、フォームの OnCreate イベントハンドラで次のように記述すれば、Help メニューだけを右端に表示できます。

Help1.Caption := #8 + Help1.Caption;

    ウィンドウを常に画面の中央に表示させるには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Delphi で作成したアプリケーションのウィンドウを常に画面の中央に表示させたい場合は、どうすればよいでしょうか ?

A:
フォームの Position プロパティを poScreenCenter に設定してください。

    フォーム上に貼り付けたコントロールを Enter キーで移動させたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
フォーム上に貼り付けたコントロールを [TAB] キーではなく、[Enter](リターン)キーで移動させたいのですが、どうすればよいでしょうか ?

A:
まず、フォームの KeyPreview プロパティを True にして、コントロールよりも前にフォームがキーを受け取れるようにしてください。 次に、フォームの OnKeyPress イベントハンドラを処理し、Key が #13 ([Enter] の文字コード) のときに、以下のプログラムのように記述して次のコントロールを選択するようにします。

   procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
   begin
     if Key = #13 then
     begin
       PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
       Key := #0;
     end;
   end;

※Delphi 1.0J(CD-ROM版) では \EXTRAS\EXAMPLES\NEXTDEMO ディレクトリに、コントロールをリターンキーで移動するプログラム例が含まれています。

Delphi 2.0J(DeveloperまたはC/S版 のCD-ROM版) では DELPHI16\EXTRAS\EXAMPLES\NEXTDEMO

ディレクトリです。

    コマンドライン引数を調べるには、どうすればよいでしょうか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
コマンドライン引数を調べるには、どうすればよいでしょうか ?

A:
ParamCount 関数が引数の数を、ParamStr 関数が引数の文字列を返します。

procedure TForm1.Button1Click(Sender: TObject);
var
  Count: Integer;
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add('引数の数 ' + IntToStr(ParamCount));
  for Count := 0 to ParamCount do
    Memo1.Lines.Add(Format('引数(%d) %s', [Count, ParamStr(Count)]));
end;

    アプリケーションが実行されているディレクトリのパス名を取得するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
アプリケーションが実行されているディレクトリのパス名を取得するには、どうすればよいでしょうか ?

A:
Application 変数の ExeName プロパティには、アプリケーションの実行ファイル名がパス付きで含まれています。 パス名だけを取り出す場合は、ExtractFilePath(Application.ExeName) としてください。

    フォームを別のマシンで表示させると、コントロールの位置などがずれる

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
設計したフォームを別のマシンで表示させると、コントロールの位置などがずれてしまいます。
A:
AutoScroll プロパティを False にするか、BorderStyle プロパティを bsSizeable 以外に指定してください。

    Form 上に Bitmap を表示させるには、どうしたら良いですか ?

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
Form 上に Bitmap を表示させたいのですが、どうしたら良いですか ?

A:
下記コードを参考にして下さい。
Bitmap の表示にはいくつか方法がありますが、コードで記述する場合には以下のコードを参考にして下さい。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     Bitmap1: TBitmap;
   begin
     Bitmap1 := TBitmap.Create;
     Bitmap1.LoadFromFile('c:\windows\tartan.bmp');
     Form1.Canvas.Draw((Form1.Width div 2)-(Bitmap1.Width div 2),
       (Form1.Height div 2) - (Bitmap1.Height div 2), Bitmap1);
     Bitmap1.free;
   end;

    CopyRect メソッドを使用して、Image に表示するには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TImage に Bitmap を動的に読込み、その Bitmap を別の TImage に表示させたいのですが、どのようにしたらよいのでしょうか ?

A:
まず、Image コンポーネントに動的に BitmapFile を読み込むには、LoadFromFile メソッドを使用します。そして、別の Image コンポーネントに表示させるには CopyRect メソッドを使用します。下記コードを参考にして下さい。

Image1 に BitmapFile を読み込み、Image2 に Image1 に表示されているものと同じものを表示させます。

   procedure TForm1.FormCreate(Sender: TObject);
   var
     Bitmap1: TBitmap;
   begin
     Bitmap1 := TBitmap.Create;
     Bitmap1.LoadFromFile('c:\Delphi\Images\Splash\16Color\athena.bmp');
     Image1.Canvas.Draw(Image1.Top, Image1.Left, Bitmap1);
   end;
   
   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Image2.Canvas.CopyRect(ClientRect,Image1.Canvas ,ClientRect);
   end;

    Form の色を変更するには、どうしたら良いですか ?

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
Form の色を変更したいのですが、どのようにすればよいのでしょうか ?

A:
下記コードを参考にしてください。

    if ColorDialog1.Execute then
       Form1.Color := ColorDialog1.Color
    else
      Form1.Color := clRed; {色の指定をしなかった場合}

    フォーム上にあるコンポーネントの数を数えて編集ボックスに結果を表示させるには

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
フォーム上にあるコンポーネントの数を数えて編集ボックスに結果を表示させたい のですがどのようにするとよいのでしょうか ?

A:
下記コードを参考にして下さい。

TEdit にフォーム上のコンポーネントの数を表示します。また、パネル上のボタンのキャプションを変更します。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     i: Integer;
   begin
     for i := 0 to Panel1.ControlCount -1 do
     begin
       if Panel1.Controls[i] is TButton then
          TButton(Panel1.Controls[i]).caption := '変更';
     end;
     Edit1.Text := IntToStr(Panel1.ControlCount) + ' components';
   end;
   
   procedure TForm1.Button2Click(Sender: TObject);
   var
     I: Integer;
   begin
     for I := 0 to Form1.ComponentCount -1 do begin
       if Form1.Components[i] is TLabel then
         TLabel(Form1.Components[i]).caption := '変更o';
     end;
     Edit1.Text := IntToStr(Form1.ComponentCount) + ' components';
   end;

    TOutline を使用して TEdit 等にディレクトリやファイル名等を表示させるには

該当するバージョン:Delphi 1.0

Q:
TOutline を使用して TEdit 等にディレクトリやファイル名等を表示させたるには、どうしたら良いですか ?

A:
下記コードを参考にしてください。
TOutline を使用して TEdit にディレクトリやファイル名等を表示させます。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Edit1.Text := Outline1.Items[Outline1.SelectedItem].Text;
     Edit2.Text := Outline1.Items[Outline1.SelectedItem].FullPath;
     Edit3.Text:=IntToStr(Outline1.SelectedItem);
   end;

    リストボックスで選択された文字列を別のコンポーネントに表示させたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
リストボックスで選択された文字列を別のコンポーネントに表示させたいのですがどのようにするとよいのでしょうか ?

A:
下記コードを参考にして下さい。

リストボックスで選択された文字列を編集ボックスに表示します。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     i: Integer;
   begin
     for i := 0 to 4 do begin
       if ListBox1.Items[i] = 'this' then begin
         ListBox1.ItemIndex := i;
         Edit1.Text := IntToStr(ListBox1.ItemIndex);
       end;
     end;
   end;

    TIniFile の使用例

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
IniFile を使用したアプリケーションを開発したいのですが、どのようなプログラムにすればよいのでしょうか ?

A:
下記コードを参考にして下さい。

TIniFile オブジェクトはアプリケーションが .INI ファイルを読み書きできるようにします。

   procedure TForm1.FormActivate(Sender: TObject);
   var
     WinIni: TIniFile;
   begin
     Canvas.TextOut(20, 10, 'WINDOWS の設定');
     WinIni := TIniFile.Create('Win.Ini');
     with WinIni do begin
       Canvas.TextOut(10, 45, 'Border Width = ' +
          IntToStr(ReadInteger('Windows', 'BorderWidth', -1)));
       Canvas.TextOut(10, 65, 'Icon Spacing = ' +
          IntToStr(ReadInteger('Desktop', 'IconSpacing', -1)));
       Canvas.TextOut(10, 85, 'Grid Granularity = ' +
          IntToStr(ReadInteger('Desktop', 'GridGranularity', -1)));
       Canvas.TextOut(10, 105, 'Cursor Blink Rate = ' +
          IntToStr(ReadInteger('Windows', 'CursorBlinkRate', -1)));
       Canvas.TextOut(10, 125, 'Double Click Speed = ' +
          IntToStr(ReadInteger('Windows', 'DoubleClickSpeed', -1)));
     end;
     WinIni.Free;
   end;

    日付及び時刻をラベルに表示させるには、どうしたら良いですか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
日付及び時刻をラベルに表示させたいのですが ?

A:
下記コードを参考にして下さい。

現在の日付及び時刻をラベルに表示します。

   procedure TForm1.Timer1Timer(Sender: TObject);
   begin
     Label1.Caption := DateToStr(Date);
     Label2.Caption := TimeTostr(time);
   end;

    プリンタへ出力するときに印刷方向を指定したい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
印刷処理を行いたいのですが、プリンタへ出力するときに印刷方向を指定したいのですが、どのようにすればよいのでしょうか ?

A:
下記コードを参考にして下さい。

ラジオグループを使用して、印刷方向を指定する方法です。

   procedure TForm1.RadioGroup1Click(Sender: TObject);
   begin
     if RadioGroup1.ItemIndex = 0 then
        Printer.Orientation := poPortrait    {縦方向}
     else

        Printer.Orientation := poLandscape;  {横方向}
   end;

    Edit に表示された文字列を印刷したい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Edit コンポーネントに表示された文字列を印刷したいのですが、どのようにするとよいのでしょうか ?

A:
下記コードを参考にして下さい。

Edit1 内の文字列が印刷されます。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Edit1.Text := 'プリンタへ出力';
     Printer.BeginDoc;
     Printer.Canvas.TextOut(0, 0, Edit1.Text);
     Printer.EndDoc;
   end;

    アイドル状態の時に何か別の処理を行いたい

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
アプリケーションがアイドル状態の時に何か別の処理を行いたいのですが、どのようにするとよいのでしょうか ?

A:
下記コードを参考にして下さい。

アイドル時にカウントをはじめ、ボタンをクリックすることによって、そのクリックされた時点での数値が表示されます。

   procedure TForm1.FormCreate(Sender: TObject);
   begin
     Application.OnIdle := FormIdle;
   end;
   
   procedure TForm1.FormIdle(Sender: TObject; var Done: Boolean);
   begin
     Inc(RiCnt);
     Label1.Caption := IntToStr(RiCnt);
     Done := True;
   end;
   
   procedure TForm1.Button1Click(Sender: TObject);
   begin
     Button1.Caption := IntToStr(RiCnt);
   end;
   
   Initialization
     RiCnt := 0;

    TOutline コンポーネントの AddChild の例

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TOutline コンポーネントの AddChild のサンプルはありますか ?

A:
下記のコードを参照してください。

   procedure TForm1.FormCreate(Sender: TObject);
   begin
        Outline1.Add(0, '東京');
        Outline1.Add(0, '神奈川');
   end;
   
   procedure TForm1.Button1Click(Sender: TObject);
   var
        PerryIndex: Longint;
   begin
        PerryIndex := Outline1.GetTextItem('東京');
        Outline1.AddChild(PerryIndex, '品川');
   end;
   
   procedure TForm1.Button2Click(Sender: TObject);
   var
        PerryIndex: Longint;
   begin
        PerryIndex := Outline1.GetTextItem('神奈川');
        Outline1.AddChild(PerryIndex, '横浜');
   end;
   end.

    ListBox 間の文字列をドラッグ&ドラップするには

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
ListBox 間の文字列をドラッグ&ドラップするには、どうしますか ?

A:
以下のコードを参照してください。

   procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y:
     Integer; State: TDragState; var Accept: Boolean);
   begin
     { 領域に入ったときにドロップを許可する }
     Accept := true;
   end;

   procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: 
     Integer; State: TDragState; var Accept: Boolean);
   begin
     { 領域に入ったときにドロップを許可する }
     Accept := True;
   end;

   procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y:
     Integer);
   begin
     { ListBox1 には ListBox2のItemsの内容が全部入ります。}
     if (Sender is TListBox) and (Source is TListBox) then begin
        (Sender as TListBox).Items := (Source as TListBox).Items;
     end;
   end;

   procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: 
     Integer);
   var
     Index :Integer;
     str : string;
   begin
     { ListBox2 には ListBox1の選択された行の内容が入ります。 }
     if (Sender is TListBox) and (Source is TListBox) then begin
       Index := (Source as TListBox).ItemIndex;
       str := (Source as TListBox).Items.Strings[Index];
       (Sender as TListBox).Items.add(str);
     end;
   end;

    全角文字で部分文字列の検索ができますか ?

該当するバージョン:Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
全角文字を使用した部分文字列の検索はできますか。

A:
はい、MbPos() を使用すると部分文字列に全角文字を使用できます。

MbPos 関数は MBUtils ユニットに含まれています。ソースコードをお持ちの場合には RTL\SYS ディレクトリの MBUTILS.PAS を参照してください。

    TabbedNotebook の Page 移動について

該当するバージョン:Delphi 2.0

Q:
TabbedNotebook コンポーネントに Pages を3つ以上設定して実行した際に、左右の矢印キーでページを移動したときの動作がおかしいようです。

A:
以下のコードで対処できますので参照してください。

    procedure TForm1.ChangePage( up: Boolean );
    begin
      with TabbedNotebook1 do begin
        if up then begin
          if ControlCount-1=PageIndex then PageIndex := 0
          else PageIndex := PageIndex + 1;
        end else begin
           if PageIndex=0 then PageIndex := ControlCount-1
          else PageIndex := PageIndex - 1;
        end;
     end;
   end;

   procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   begin
     if (ActiveControl=TabbedNotebook1) and ((Key=vk_Right) or (Key=vk_Left))
     then begin
       ChangePage( Key=vk_Right );
       Key := 0;
     end;
   end;

    コンポーネントのプロパティの設定を一度に行えますか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
Label1・・Label20 という名前を持つ Label コンポーネントがフォーム上にあります。このコンポーネントのプロパティを for ループ等で一度に設定する事はできますか ?

A:
FindComponent というメソッドを利用できます。以下のコードを参考にしてください。

ボタンを押したときに Components[] の値を調べて、TLabalであれば、FindComponent を使用して得た値を as 演算子で型キャストした上で、Captionを変更します。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     i:integer;
   begin
     for i := 0 to ComponentCount-1 do
     begin
       if Components[i].ClassName = 'TLabel' then
       begin
         (FindComponent('Label'+IntToStr(i+1)) as TLabel).Caption := IntToStr(i+1);
       end;
     end;
   end;

    Lookup メソッドはどのように使用しますか ?

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
Lookup メソッドはどのように使用しますか ?

A:
以下のコードをお試しください。

LAST_NAME が Davis で、FIRST_NAME が Jennifer の ADDRESS_1 と CITY を V に返します。

   procedure TForm1.Button1Click(Sender: TObject);
   var
     V: Variant;
   begin
     V := VarArrayCreate([0, 1], VarVariant);
     V[0] := 'Davis';
     V[1] := 'Jennifer';
     V := Table1.Lookup('LAST_NAME;FIRST_NAME', V, 'ADDRESS_1;CITY');
     Edit1.text := V[0] + ' ' + V[1];
   end;

    TTreeView にビットマップを重ねて表示するには。

該当するバージョン:Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TTreeView にビットマップとテキストを表示しています。このビットマップに他のビットマップを重ねて表示するにはどうしますか ?

A:
以下のコードをお試しください。 TImageList にビットマップをロード後、ボタンを押して、TImageList の他のビットマップを重ねて表示します。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private 宣言 }
  Overlay: TOverlay;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;


implementation

{$R *.DFM}
{$R IMAGES.RES}

procedure TForm1.FormCreate(Sender: TObject);
var
  Node: TTreeNode;
begin
  // ビットマップ取り込み
  ImageList1.ResourceLoad(rtBitmap, 'SmallImages', clWhite);

  // アイテム作成
  TreeView1.Items.Clear;
  Node := TreeView1.Items.Add(nil, 'テキスト1');
  Node.ImageIndex := 2;
  Node.SelectedIndex := 2;

  Node := TreeView1.Items.Add(nil, 'テキスト2');
  Node.ImageIndex := 3;
  Node.SelectedIndex := 3;

  Node := TreeView1.Items.Add(nil, 'テキスト3');
  Node.ImageIndex := 4;
  Node.SelectedIndex := 4;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Overlay := 0;
  ImageList1.Overlay(0, Overlay);
  // 全項目のOverlayIndex=0
  for i:=0 to (TreeView1.Items.Count-1) do
    TreeView1.Items[i].OverlayIndex := 0;
  TreeView1.Invalidate;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  Overlay := 1;
  ImageList1.Overlay(1, Overlay);
  // 全項目のOverlayIndex=1
  for i:=0 to (TreeView1.Items.Count-1) do
    TreeView1.Items[i].OverlayIndex := 1;
  TreeView1.Invalidate;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  i: Integer;
begin
  // 全項目のOverlayIndex=-1(クリアする)
  for i:=0 to (TreeView1.Items.Count-1) do
    TreeView1.Items[i].OverlayIndex := -1;
end;

end.

    MessageDlgのメッセージを複数行表示するには

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
MessageDlgで表示するメッセージを複数行で表示する事はできますか。
A:
以下のコードを参考にしてください。ボタンをクリックするとメッセージダイアログが表示されます。

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     MessageDlg('このメッセージは'+ #10 + '2行にわたって表示されます', 
                     mtInformation,[mbOk], 0);
   end;

    列をグリッド内の新しい位置へ移動と行全体の選択

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
以下の設定を行い列をグリッド内の新しい位置へ移動した場合、行全体の選択が無効になってしまいます。 どのようにすれば良いですか ?

goColMoving := True;    // 列をグリッド内の新しい位置へ移動できる
goRowSelect := True;    // 行全体だけを一度に選択できる

A:
OnColumnMoved イベントで、goRowSelect を再設定します。

   procedure TForm1.StringGrid1ColumnMoved(Sender: TObject; FromIndex,
     ToIndex: Longint);
   begin
     StringGrid1.options := StringGrid1.options - [goRowSelect];
     StringGrid1.options := StringGrid1.options + [goRowSelect];
   end;

    TStringGrid に、オブジェクトを追加するにはどうしますか ?

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
TStringGrid に、オブジェクトを追加するにはどうしますか ?

A:
オブジェクトをグリッドに保存するのであれば、Objects プロパティを利用するのが良いでしょう。Objects プロパティは各セル毎にオブジェクトを格納することができます。次の例は TForm1 に定義された TBitmap オブジェクト(bmp) にビットマップをロードし、StringGrid1 の Objects プロパティに保存しています。(保存されているかの確認として Image コンポーネントに表示し直しています。)

   procedure TForm1.FormCreate(Sender: TObject);
   begin
     bmp := TBitmap.Create;
   end;

   procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
   begin
     bmp.Free;
   end;

   procedure TForm1.Button1Click(Sender: TObject);
   begin
     bmp.LoadFromfile(
       'c:\program Files\Borland\delphi 2.0\images\splash\16color\athena.bmp');
     StringGrid1.Cells[1,1] := 'athena';
     StringGrid1.Objects[1,1] := bmp;
   end;

   procedure TForm1.Button2Click(Sender: TObject);
   begin
     Image1.picture.assign(StringGrid1.Objects[1, 1] as TBitmap);
   end;

    TTabControl の Tabs の値を実行時に取得するには、どうしますか ?

該当するバージョン:Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
TTabControl の Tabs の値を実行時に取得するには、どのようにしますか ?

A:
TTabControl コンポーネントには、タブ上に表示される文字列のリストを保持するプロパティとして Tabs があります。以下のコードは現在アクティブになっているタブに表示されている文字を Edit コンポーネントに表示します。

      Edit1.Text := TabControl1.Tabs[ TabControl1.TabIndex ];

    MDI アプリケーションから新規作成した子フォーム上にあるコンポーネントにアクセス

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
MDI アプリケーションから新規作成した子フォーム上にあるコンポーネントにアクセスするにはどうしますか ?

A:
以下のコードをお試しください。
MDI は 1 つのアプリケーションで同時に 2 つ以上のファイルを開き表示するためのものです。

MDI 子フォームを作成するには

  1. [ファイル(F)|新規作成(F)|Forms] を選択します。
  2. 新しいフォームの FormStyle プロパティを fsMDIChild に設定します。
  3. [プロジェクト(P)|オプション(O) ] を選択し、[プロジェクトオプション] ダイアログボックスを表示します。
  4. [フォーム] ページの [自動作成の対象(A)] フォームリストで MDI 子フォームを選択します。
  5. MDI 子フォームを [選択可能なフォーム(F)] リストに移動し、[OK] をクリックします。

以下では、親フォームのメニューから [新規作成(N)] を選択すると、前もって作成していた子フォームが開きます。ここで、親フォームの ChangeLabelCaptionClick をクリックすると、子フォーム上に配置してあるラベルのキャプションに'hello.' を表示します。

ActiveMDIChild により、アクティブな子フォームを指定し、TMDIChild により、子フォームと指定します。

procedure TMainForm.ChangeLabelCaptionClick(Sender: TObject);
begin
  try
    TMDIChild(ActiveMDIChild).Label1.caption := 'hello.';
  except
    MessageDlg('子ウィンドウがありません', mtInformation, [mbOk], 0);
  end;
end;

    FormatDateTime の ddd および dddd を指定すると日本語で曜日が表示されます。

該当するバージョン:Delphi 2.0 Delphi 3.0/Delphi 3.1 Delphi 4

Q:
FormatDateTime の ddd および dddd を指定すると日本語で曜日が表示されてしまいます。英語で表示するにはどうするのでしょうか ?

A:
FormatDateTime などの文字列変換関数は、グローバル変数 ShortDayNames, LongDayNames などを参照しています。この変数は SysUtils ユニットの初期化部で、ロケールを考慮してロードしています。つまり、日本語 Windows では日本語で曜日等が表示されるようになります。次に示すコードは初期化部でShortDayNames 変数などをリソースから再ロードすることで英語表示できるようにしています。

       implementation
       const
         SShortDayNames = 65504;
         SLongDayNames = 65511;
       var
         i: Integer;
       begin
         for i:=0 to 6 do begin
           ShortDayNames[i+1] := LoadStr( SShortDayNames + i );
           LongDayNames[i+1] := LoadStr( SLongDayNames + i );
         end;
       end.

SShortDayNames, SLongDayNames はリソースの ID として定義されている値です。

Developer または C/S 版をお持ちの方は SysUtils.Inc 等もあわせてご覧ください。

    メモ項目で「元に戻す(U)」を実現するには、どうしますか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
メモ項目で「元に戻す(U)」を実現するには、どうしますか ?

A:
TMemo 上で右ボタンを押すとポップアップメニューが表示されます。「元に戻す(U)」を選択すると、最後に行なった Memo1 コントロールへの操作を取り消します。

   procedure TForm1.FormActivate(Sender: TObject);
     begin
     Memo1.PopupMenu := PopupMenu1;
   end;

   { Perform メソッドを使用して、自分自身(Memo1)へ EM_UNDO   
     メッセージを送り、最後に行なった編集( Memo1)コントロールへの操作を
     取り消します。 }

   procedure TForm1.Undo1Click(Sender: TObject);
   begin
    Memo1.Perform(EM_UNDO, 0, 0);
   end;

   {  EM_CANUNDO  メッセージをは、最後に行なった編集( Memo1)
  コントロールへの操作を元に戻すことができるか判断します。 }

   procedure TForm1.Button1Click(Sender: TObject);
   begin
    Undo1.Enabled := Memo1.Perform(EM_CANUNDO, 0, 0) <> 0;
   end;

    フォームのバックグランドにビットマップをタイル表示

該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4

Q:
フォームのバックグランドにビットマップをタイル表示にするには、どうしますか ?

A:
フォームの OnPaint イベントに Draw メソッドを使用してフォームのキャンパスに描画します。

   procedure TForm1.FormCreate(Sender: TObject);
   begin
     Bitmap := TBitmap.Create;
     Bitmap.LoadFromFile('C:\WINDOWS\トライアングル.BMP');
   end;

   procedure TForm1.FormPaint(Sender: TObject);
   var
     X, Y, W, H: LongInt;
   begin
     with Bitmap do begin
       W := Width;
       H := Height;
     end;
     Y := 0;
     while Y < Height do begin      {  Y の描画位置がフォームの幅 より小さい場合 }
       X := 0;
       while X < Width do begin      { X の描画位置がフォームの幅 より小さい場合 }
         Form1.Canvas.Draw(X, Y, Bitmap);  { ビットマップの描画 }
         Inc(X, W);                    { X の描画位置を 増加 }
       end;
       Inc(Y, H);                      { Y の描画位置を 増加 }
     end;
   end;

    コンポーネントを文字列に関連付けることができますか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
コンポーネントを文字列に関連付けることができますか ?

A:
Tag プロパティは LongInt なので、Pointer または PChar に型キャストできます。以下の例は、コンポーネントが TEdit であれば、文字列へのポインタを Tag プロパティに代入します。ポインタは、基本的には LongIntと同じであり同等のバイトをメモリに確保します。これにより、NewStr の返り値を LongInt に型キャストして TEdir の Tag プロパティに代入することができます。

   procedure TForm1.Button1Click(Sender: TObject);
    var
     i: integer;
    begin
      for i := 0 to ComponentCount - 1 do
        if Components[i] is TEdit then
          Components[i].Tag := LongInt(NewStr('Hello '+IntToStr(i)));
    end;

コンポーネントの Tag プロパティの値を PString(文字列へのポインタに型キャストして取り出します。このときは、キャレット(^)を使用して逆参照します。最後には、Edit コンポーネントに格納した文字列を破棄します。TEdit の Tag プロパティに何かをポインタをして格納した場合は破棄する必要があります。

   procedure TForm1.Button2Click(Sender: TObject);
    var
     i: integer;
    begin
      for i := 0 to ComponentCount - 1 do
        if Components[i] is TEdit then begin
          TEdit(Components[i]).Text := PString(Components[i].Tag)^;
          DisposeStr(PString(Components[i].Tag));
        end;
    end;

    自分自身のホットキーをトラップするには、どうしますか ?

該当するバージョン:Delphi 1.0,Delphi 2.0,Delphi 3.0/Delphi3.1,Delphi4

Q:
自分自身のホットキーをトラップするには、どのようにしますか ?

A:
フォームの OnKeyDown で Shift と Key の値を処理します。

キーイベントを最初にフォームで処理するために、オブジェクトインスペクタで以下の設定を行ってください。

   KeyPreview := True;

   procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
     Shift: TShiftState);
   begin
     if (ssCtrl in Shift) and (chr(Key) in ['A', 'a']) then  { Ctrl と A(a) が押されたら }
       ShowMessage('Ctrl-A');
   end;