在我的项目中我有两个表单(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.
答案 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中保留所有必要的更改。
修改强> 在沉睡一夜后想到的一些评论: