2

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

我想显示 Form1,当我们单击 Button1 时,显示 Form2 和 free(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.
4

3 回答 3

7

完全按照您在问题标题中提出的要求进行操作:创建并显示配置表单,然后创建并显示主表单。诀窍在于如何创建它们。Application.CreateForm用于您想成为主要形式的一种形式。对所有其他形式使用普通的对象创建技术。

像这样修改您的 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.
于 2011-01-07T21:17:52.163 回答
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.

原因是应用程序在您的主窗体关闭时终止。您的主表单通常是您创建的第一个表单。

于 2011-01-07T20:49:54.010 回答
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 永远不会显示,则必须添加一些代码来关闭应用程序。暂停可以在这里服务。
于 2011-01-08T00:29:11.713 回答