如何在主窗体之前显示设置配置的表单?

时间:2011-01-07 20:22:32

标签: delphi delphi-xe

在我的项目中我有两个表单(form1,form2),form1是配置表单。

我想显示Form1,当我们单击Button1然后显示Form2并释放(Release)Form1。我怎么能这样做?

我使用此代码。但是这个项目会自动启动然后自动退出。朋友说,因为应用程序消息循环永远不会启动,应用程序终止,因为主窗体不存在。我怎么能解决这个问题?

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Release;
end;

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Form1:= TForm1.Create(Application);
  Application.Run;
end.

3 个答案:

答案 0 :(得分:7)

完全按照您在问题标题中提出的要求:创建并显示配置表单,然后创建并显示主表单。诀窍是如何创建它们。 Only use Application.CreateForm for the one form that you want to be your main form.对所有其他表单使用普通对象创建技术。

修改您的DPR文件,如下所示:

var
  ConfigForm: TConfigForm;
begin
  Application.Initialize;

  ConfigForm := TConfigForm.Create(nil);
  try
    if ConfigForm.ShowModal <> mrOK then
      exit;
  finally
    ConfigForm.Free;
  end;

  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

答案 1 :(得分:0)

您需要先创建Form2,这将是您的主要表单。您希望它在Form1完成其工作后开始隐藏并显示。像这样:

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Release;
end;

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Form2.Hide;
  Form1 := TForm1.Create(Application);
  Form1.Show;
  Application.Run;
end.

原因是当主表单关闭时应用终止。而您的主要表单通常是您创建的第一个表单。

答案 2 :(得分:0)

您可以通过将 ShowMainForm 设置为 false 来禁止显示Form1。将代码保留在DPR中,就像IDE创建它一样:

uses
  Forms,
  Unit2 in 'Unit2.pas' {Form2},
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

在Form2的 FormCreate 事件中,只需将 ShowMainForm 设置为 false 并调用 Show 以使Form2可见:

procedure TForm2.FormCreate(Sender: TObject);
begin
  Application.ShowMainForm := False;
  Show;
end;

并在Form2的 ButtonClick 事件中显示Form1并关闭Form2:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Show;
  Close;
end;

这将在unit2中保留所有必要的更改。

修改 在沉睡一夜后想到的一些评论:

  1. Form2应该是自动创建的最后一个,即直接在Application.Run语句之前的那个。
  2. ButtonClick事件中的Form1.Show语句应该移动到FormClose事件。因此,用户可以使用Windows关闭按钮或他喜欢的任何内容关闭表单。
  3. 如果由于某种原因,永远不应该显示Form1,则必须添加一些代码才能关闭应用程序。 暂停可以在此处使用。