第一次是业余程序员。希望得到一些帮助。使用Delphi XE7。
我有一个Mainform,它有一个按钮,可以显示第二个表单。在初始启动时,我想单击显示第二个表单的按钮,以便两个表单都可见。然后我将其保存到配置文件中,以便它不会在每次加载时执行此操作。
在内部跟踪时,我看到Form2
为零,我收到了访问冲突错误。我认为问题是MainForm还没有完全加载Form2
。或者Form2
尚未创建,因此无法提起。
我试图添加等待MainForm加载的延迟。我试过一个计时器。我试过寻找其他答案,但仍然找不到有帮助的答案。我希望有人能带领我朝着正确的方向前进。
答案 0 :(得分:1)
如果Form2
仍处于创建过程中,则表示尚未创建MainForm
。您必须等到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;
答案 1 :(得分:0)
我建议您打开项目后,执行Shift + Ctrl + F11快捷键并选择表单选项,如下所示 [1]。在此之后,在自动创建表单中选择您的Form2,将他移动到可用表单,然后单击按钮确定。 在此之后,将调用Form2的代码行更改为:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
FreeAndNil(Form2)
如果这可以解决您的问题,请告诉我。
干杯,