Delphi中的FormShow

时间:2012-09-17 22:53:44

标签: delphi

我想知道delphi 2010中的formhow在哪里,就像我在项目中只能看到一个formcreate一样。

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

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

2 个答案:

答案 0 :(得分:11)

通过双击Events的{​​{1}}选项卡中的方法,创建事件处理程序的方式与在Delphi中创建几乎每个事件处理程序的方式相同。

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

Object Inspector OnShow image

OnShow

但是,procedure TForm3.FormShow(Sender: TObject); begin | end; 是调用FormShow的错误位置,因为每次显示表单时都会执行Randomize,这可能会发生多次。这是一个示例(它假定两种形式, Form1 Form2 ,像往常一样在.dpr文件中使用默认变量名称进行自动处理,这当然是个坏主意 - 这个是为了证明你的问题的目的是一个问题):

FormShow

运行程序并多次点击procedure TForm2.FormShow(Sender: TObject); begin ShowMessage('In FormShow'); end; procedure TForm1.Button1Click(Sender: TObject); begin Form2.Visible := not Form2.Visible; end; ;每隔一次,你就会看到 In FormShow 消息。

调用 Randomize 的正确位置是:

  • 在主表单的 FormCreate
  • 在主表单元的初始化部分

    TForm1.Button1
  • 项目源(.dpr)文件中的
  • unit uMainForm;
    
    interface
    
      ...
    
    implementation
    
      ...
    
    initialization 
    
    Randomize;
    
    end.
    

答案 1 :(得分: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;

与基于事件的方法相比,优势在于您可以在继承的调用之前或之后放置自定义代码。