プロジェクトでformcreateしか見ることができないので、delphi2010のformshowはどこにあるのか知りたいです。
私が尋ねている理由は、以下に示すように、FormShowイベントハンドラーにRandomizeを追加する必要があるためです。
procedure TfrmWinnaSpree.FormShow(Sender: TObject);
begin
Randomize;
end;
プロジェクトでformcreateしか見ることができないので、delphi2010のformshowはどこにあるのか知りたいです。
私が尋ねている理由は、以下に示すように、FormShowイベントハンドラーにRandomizeを追加する必要があるためです。
procedure TfrmWinnaSpree.FormShow(Sender: TObject);
begin
Randomize;
end;
Delphiのほぼすべてのイベントハンドラーを作成するのと同じ方法で、のEvents
タブにあるメソッドをダブルクリックして、イベントハンドラーを作成しますObject Inspector
。
フォーム自体(フォームのコントロールではない)をクリックしてから、に切り替えObject Inspector
ます。タブをクリックしてから、イベントEvents
まで下にスクロールします。OnShow
イベント名の横の右半分をダブルクリックすると、IDEは新しい空のイベントハンドラーを作成し、正しい場所にカーソルを置いてコードの記述を開始します。
procedure TForm3.FormShow(Sender: TObject);
begin
|
end;
ただし、フォームが表示されるたびに実行されるため、FormShow
を呼び出すのは間違った場所であり、それは複数回発生する可能性があります。次に例を示します(Form1とForm2の2つのフォームが、デフォルトの変数名で.dprファイルに通常どおり自動作成されることを前提としています。これはもちろん悪い考えです。これは、質問の目的に問題があることを示すためです)。Randomize
FormShow
procedure TForm2.FormShow(Sender: TObject);
begin
ShowMessage('In FormShow');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Visible := not Form2.Visible;
end;
プログラムを実行し、TForm1.Button1
複数回クリックします。そうするたびに、InFormShowメッセージが表示されます。
Randomizeを呼び出すための適切な場所は次のとおりです。
メインフォームのユニットの初期化セクション
unit uMainForm;
interface
...
implementation
...
initialization
Randomize;
end.
プロジェクトソース(.dpr)ファイル内
program MyGreatApp;
uses
Math,
Vcl.Forms,
uMainForm in 'uMainForm.pas' {Form1};
{$R *.RES}
begin
Randomize;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Title := 'My Super App';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
または、保護されたメソッドTForm.DoShowをオーバーライドすることもできます。
type
TForm = class(Forms.TForm)
protected
procedure DoShow; override;
end;
implementation
procedure TForm.DoShow;
begin.
// custom show code
inherited;
// custom show code
end;
イベントベースのアプローチに対する利点は、継承された呼び出しの前または後にカスタムコードを配置できることです。