Delphi中的FormShow

use*_*092 0 delphi

我想知道delphi 2010中的formhow在哪里,因为我只能在项目中看到formcreate.

我问的原因是因为我需要在FormShow事件处理程序中添加Randomize,如下所示:

procedure TfrmWinnaSpree.FormShow(Sender: TObject);
begin
  Randomize;
end;
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 11

您可以像在Delphi中创建几乎每个事件处理程序一样创建事件处理程序,方法是双击该Events选项卡中的方法Object Inspector.

单击表单本身(不是表单上的任何控件),然后切换到Object Inspector.单击Events选项卡,然后向下滚动到该OnShow事件.双击事件名称旁边的右半部分,IDE将创建一个新的空事件处理程序,并将光标放在正确的位置以开始编写代码.

对象检查器OnShow图像

procedure TForm3.FormShow(Sender: TObject);
begin
  |
end;
Run Code Online (Sandbox Code Playgroud)

但是,FormShow调用的地方是错误的Randomize,因为FormShow每次显示表单时都会执行,这可能会发生多次.这是一个例子(假设有两种形式,Form1Form2,像往常一样在.dpr文件中使用默认变量名自动处理,这当然是个坏主意 - 这是为了证明你的问题的目的有问题):

procedure TForm2.FormShow(Sender: TObject);
begin
  ShowMessage('In FormShow');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Visible := not Form2.Visible;
end;
Run Code Online (Sandbox Code Playgroud)

运行程序并TForm1.Button1多次单击; 每隔一段时间你就会看到In FormShow消息.

调用Randomize的适当位置是:

  • 在你的主要表单的FormCreate中
  • 在主窗体单元的初始化部分

    unit uMainForm;
    
    interface
    
      ...
    
    implementation
    
      ...
    
    initialization 
    
    Randomize;
    
    end.
    
    Run Code Online (Sandbox Code Playgroud)
  • 在您的项目源(.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.
    
    Run Code Online (Sandbox Code Playgroud)