0

プロジェクトでformcreateしか見ることができないので、delphi2010のformshowはどこにあるのか知りたいです。

私が尋ねている理由は、以下に示すように、FormShowイベントハンドラーにRandomizeを追加する必要があるためです。

procedure TfrmWinnaSpree.FormShow(Sender: TObject);
begin
  Randomize;
end;
4

2 に答える 2

11

Delphiのほぼすべてのイベントハンドラーを作成するのと同じ方法で、のEventsタブにあるメソッドをダブルクリックして、イベントハンドラーを作成しますObject Inspector

フォーム自体(フォームのコントロールではない)をクリックしてから、に切り替えObject Inspectorます。タブをクリックしてから、イベントEventsまで下にスクロールします。OnShowイベント名の横の右半分をダブルクリックすると、IDEは新しい空のイベントハンドラーを作成し、正しい場所にカーソルを置いてコードの記述を開始します。

ObjectInspectorOnShow画像

procedure TForm3.FormShow(Sender: TObject);
begin
  |
end;

ただし、フォームが表示されるたびに実行されるため、FormShowを呼び出すのは間違った場所であり、それは複数回発生する可能性があります。次に例を示します(Form1Form2の2つのフォームが、デフォルトの変数名で.dprファイルに通常どおり自動作成されることを前提としています。これはもちろん悪い考えです。これは、質問の目的に問題があることを示すためです)。RandomizeFormShow

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を呼び出すための適切な場所は次のとおりです。

  • メインフォームのFormCreateで
  • メインフォームのユニットの初期化セクション

    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.
    
于 2012-09-18T01:30:17.773 に答える
1

または、保護されたメソッド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;

イベントベースのアプローチに対する利点は、継承された呼び出しの前または後にカスタムコードを配置できることです。

于 2012-09-18T06:25:56.433 に答える