Delphi动态创建窗体

2025-05-14 21:02:40
推荐回答(4个)
回答1:

if Form2 = nil then //为什么Form2不为空
(这个很简单,因为form2是你定义的一个局部变量,并没有给初始值,所以form2不一定为空)

Form2 := TForm2.Create(nil); //nil,self,application都有什么区别
(控件的Create构造函数,之所以有参数,是因为它们都继承自TComponent,而这个参数是表示了控件的归属,父控件会将控件从原来的父控件中删除,加入到自己的子控件列表中,对于窗体来说,这个意义不大)

Application.CreateForm(TForm2, Form2);
(至于这种创建方法,是和进程的管理方面有关系,除了可以创建窗体,当进程没有主窗体时,它会将当前创建的这个窗体设置为主窗体,当然创建的窗体,必须是从TForm继续而来的,否则不会设置的)

你的代码,一般简单的写法:
with TForm2.Create(nil) do begin
ShowModal;
Free;
end;

回答2:

procedure TForm1.Button1Click(Sender: TObject);
//var
// Form2:TForm2; 这里可以不定义,因为在Unit2有定义的;如果定义的话说一定不存在form2这个变量对应的实体的
begin
if not Assigned(Form2) then //如果Form2不存在的话
begin
showMessage('show');
Form2 := TForm2.Create(nil);
//nil,self,application都有什么区别?
//这里指的是Form2被谁所拥有,nil的话就是没有谁拥有form2,如果self的话则是当前窗体Form1拥有form2,App的话同理
Form2.ShowModal;
Form2.Free;
Form2 := nil;
end;
end

代码改进下:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
ShowModal;
Free;
end;
end;
这样也是创建Form2的实体

回答3:

Var
f:TSomeformclass;
F:=
TSomeformclass.
create(nil);
F.show;

回答4:

你这种根本就不是动态创建窗体。