0

我想知道delphi 2010中的formshow在哪里,因为我只能在我的项目中看到一个formcreate。

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

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

2 回答 2

11

Events创建事件处理程序的方式与在 Delphi 中创建几乎每个事件处理程序的方式相同,方法是双击Object Inspector.

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

对象检查器 OnShow 图像

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

但是,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;

运行程序,点击TForm1.Button1多次;每隔一段时间,您都会看到In FormShow消息。

调用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 回答