在delphi中启动时从mainform自动加载第二个表单时出错

时间:2017-06-20 19:56:03

标签: forms delphi access-violation delphi-xe7

第一次是业余程序员。希望得到一些帮助。使用Delphi XE7。

我有一个Mainform,它有一个按钮,可以显示第二个表单。在初始启动时,我想单击显示第二个表单的按钮,以便两个表单都可见。然后我将其保存到配置文件中,以便它不会在每次加载时执行此操作。

在内部跟踪时,我看到Form2为零,我收到了访问冲突错误。我认为问题是MainForm还没有完全加载Form2。或者Form2尚未创建,因此无法提起。

我试图添加等待MainForm加载的延迟。我试过一个计时器。我试过寻找其他答案,但仍然找不到有帮助的答案。我希望有人能带领我朝着正确的方向前进。

2 个答案:

答案 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)

如果这可以解决您的问题,请告诉我。

干杯,