当MainForm 仍在创建过程中时,Form2 尚未创建是正确的。您必须等到 Form2 创建完成后才能显示它。
最简单的方法是在设计时简单地将Form2.Visible 属性设置为True(辅助表单默认设置为Visible=False),然后确保Form2 设置为自动创建在项目选项中(默认情况下不会自动创建辅助表单)。让Form2在启动时自动显示出来。
但是,如果您的按钮需要设置Form2,那么您必须延迟按钮点击,直到Form2 创建之后。我喜欢为此目的使用延迟窗口消息,例如:
const
WM_DELAYED_STARTUP = WM_APP + 1;
type
TMainForm = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure ButtonClick(Sender: TObject);
private
procedure WMDelayedStartup(var Message: TMessage); message WM_DELAYED_STARTUP;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
PostMessage(Handle, WM_DELAYED_STARTUP, 0, 0);
end;
procedure TMainForm.ButtonClick(Sender: TObject);
begin
//...
Form2.Show;
//...
end;
procedure TMainForm.WMDelayedStartup(var Message: TMessage);
begin
Button1.Click;
end;
计时器也可以正常工作:
type
TMainForm = class(TForm)
Button1: TButton;
StartupTimer: TTimer;
procedure FormCreate(Sender: TObject);
procedure ButtonClick(Sender: TObject);
procedure StartupTimerTimer(Sender: TObject);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
StartupTimer.Enabled := True;
end;
procedure TMainForm.ButtonClick(Sender: TObject);
begin
//...
Form2.Show;
//...
end;
procedure TMainForm.StartupTimerTimer(Sender: TObject);
begin
StartupTimer.Enabled := False;
Button1.Click;
end;
或者,您可以使用 MainForm 的 OnShow 事件(如果您只显示一次 MainForm 并且在应用程序的生命周期内不隐藏它):
type
TMainForm = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure ButtonClick(Sender: TObject);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
Button1.Click;
end;
procedure TMainForm.ButtonClick(Sender: TObject);
begin
//...
Form2.Show;
//...
end;