请教各位大侠,这样动态创建窗体为何不行?(50分)

  • 主题发起人 主题发起人 kmif
  • 开始时间 开始时间
K

kmif

Unregistered / Unconfirmed
GUEST, unregistred user!
我是这样做的:
先定义了form3,把里面的控件、button 、adoquery等什么的都定义好,过程等都定义好了,即unit3是一个完整的窗体,
然后在form1中的button1这样调用form3:
type
form3 = class(tform);
.
.
var
form3:tform3;
.
.
begin
if form3=nil then
begin
Form3 := TForm3.Create(self);
form3.Show;
end;
程序运行时这样提示"Invalid property Value".
请教我这样动态创建窗体为何不行?
 
你在什么函数里面创建的?你不会是在TForm3.OnCreate里面创建的吧?
你可以在其它Form里面动态的创建这个窗体
 
1.在DELPHI主菜单的OPTION选项之FORMS页中,
把要动态创建的FORM由auto-create-forms中移到Available中
2.在程序中这样写.
With TForm3.creat(nil) do
begin
Try
showmodle;
finally
free
end;
end;
-------------------------------------
这样可以不用程序一运行就把N个窗体全都进入内存.而是在你需要时动态调入.
 
我是在form1.button1click 中调用,即:
procedure TForm1.N9Click(Sender: TObject);
begin
if form3=nil then
begin
Form3 := TForm3.Create(self);
form3.Show;
end;
end;
调用时没任何反应。
 
应该用application.createform(TForm3,form3)
 
已按nzfsoft做了,但还是出现"Invalid property value"这样的信息,并指向
with tform3.create(nil) do 这一行。

并请教,在调用处如何说明tform3 及form3

 
show换成showmodal
 
我另外定义了一个空的窗体form4,在form1中也同样地调用,却正常得很:
type
tform4=clase(tform);
..

var
form4:tfrom4;
..
procedure TForm1.N9Click(Sender: TObject);
begin
With TForm4.creat(nil) do
begin
Try
showmodle;
finally
free
end;
end;

点解,点解。。。。。。。。
 
问题还没解决,江湖救急。
 
也就是说单纯调用一个空的窗体是正常的,但调用一个带有按钮等控件的窗体则不能显示,报错"Invalid property Value"
 
这问题好说,你的意图是不是想判断该窗体为空的话,
就生成?
用form3=nil 是不安全的,应该是
if not Assign(form3) then create
 
不必太麻烦, 这样可以:
form3:=tform3.create(self);
form3.show; (或者form3.showmodal;)
在form3的onclose 事件中:
action:=cafree;
以上我使用的,
效果很好!
 
libaoliang,我都试过了,还是不行,就是调用一个带控件的窗体不行,调用一个空的窗体却正常,
请问在调用时应如何对这个已定义的UNIT进行调用前的准备工作,如type 或 var里.
 
form3:=tform3.create(nil);
form3.show;
在form3的onclose 事件中:
action:=cafree;
我用的,没问题啊。
你的project->option设置好没有?
把frm3从Auto-Create Forms移到Avialable Forms
MainForm设为form1试试
 
我估计你的问题出在工程文件里,下例是在FORM1里创建FORM2的文件

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

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
// Application.CreateForm(TForm2, Form2); //把这句关掉
Application.Run;
end.
 
给你一个简单的例子吧
if Frm_FixInOut=nil then
Frm_FixInOut:=TFrm_FixInOut.Create(nil);
Frm_FixInOut.ShowModal;
Frm_FixInOut.Free;
Frm_FixInOut:=nil;
 
我早就按lldhz的方法去做了,就是不行啊,是不是对动态创建的窗体有什么要求(因为我动态创建一个空的窗体是正常的),
或者是因为我要创建的这个窗体里已定义了许多控件有关?能否详细说一下要动态创建一个窗体,前后应说明点什么.谢谢
 
我这里试了一下,即使窗体上加上几个控件,也不会出现你所说的错误信息,又没法知道你
这个单元倒底写了些什么,只能给你一点建议了:
1、检查form3的oncreate事件过程,或者暂时屏蔽试试;
2、升级你的DELPHI或打上补丁;
3、换个思路,用别的方式实现你的要求。
 
你有没有《delphi5从入门到精通》这本书?里面有多窗体使用这一章。
研究研究。
我同意jobsxy。留意一下两行。
Unit2 in 'Unit2.pas' {Form2};
// Application.CreateForm(TForm2, Form2); //把这句关掉
还有就是:
在form2的onclose 事件中:
action:=cafree;
form2:=nil;
这样应该可以解决你的问题。
 
没见过有你这种创建法的,这样的话窗体上控件的位置你如何确定
以下是我的建议
象创建普通窗一样创建好form3,然将它从“自运创建窗体”移到“可用窗体"中
在"工程"->"选项"中设置
在form3的onclose中加入 form3:=nil;

然后再
freeaddnil(form3)
if form3=nil then
begin
Form3 := TForm3.Create(self);
form3.Show;
end;
 
后退
顶部