关于窗体调用 ( 积分: 100 )

  • 主题发起人 主题发起人 publicnews
  • 开始时间 开始时间
P

publicnews

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是我的OPENForm的定义:
function OpenForm(Instance:TFormClass;var Obj):Boolean;
begin
if TForm(Obj)<>nil then
begin
if TForm(Obj).Showing then
begin
TForm(Obj).Show;
exit;
end;
end;
//Application.CreateForm(Instance,Obj);
TForm(Obj):=Instance.Create(application);
TForm(Obj).Show;
end;

我在其它地方调用
OpenForm(TfrmMyForm,frmMyForm)
生成并显示了frmMyForm
但我的frmMyForm是从其它窗体继承所以有一些从其它窗体继承的对象,这些对象并没有继承,访问这些对象就会出现访问错误,但如果我象平时一样调用
frmMyForm:=TfrmMyForm.Create(Application);
frmMyForm.Show
然后就可以正常访问那些继承来的对象.
 
下面是我的OPENForm的定义:
function OpenForm(Instance:TFormClass;var Obj):Boolean;
begin
if TForm(Obj)<>nil then
begin
if TForm(Obj).Showing then
begin
TForm(Obj).Show;
exit;
end;
end;
//Application.CreateForm(Instance,Obj);
TForm(Obj):=Instance.Create(application);
TForm(Obj).Show;
end;

我在其它地方调用
OpenForm(TfrmMyForm,frmMyForm)
生成并显示了frmMyForm
但我的frmMyForm是从其它窗体继承所以有一些从其它窗体继承的对象,这些对象并没有继承,访问这些对象就会出现访问错误,但如果我象平时一样调用
frmMyForm:=TfrmMyForm.Create(Application);
frmMyForm.Show
然后就可以正常访问那些继承来的对象.
 
要类型转换后才能访问,
如TParent(frmMyForm).父类属性/方法等......
 
我是说打开frmMyForm后访问那些继随来的对象
而不是在OpenForm中访问,所以是不用转换了,可为什么TfrmMyForm的实例frmMyForm是创建了,但该实例却没有继承父窗体的对象(用
frmMyForm:=TfrmMyForm.Create(Application);
frmMyForm.Show
就会正常继承)
 
问题的详细阐述
有几个窗体,继承结构如下:
TfrmBase=Class(TForm)
TfrmCommonBase=Class(TfrmBase)
TfrmEditBase=Class(TfrmCommonBase)
TfrmProdInfo=Class(TfrmEditBase)
其中TfrmBase没有定义构造函数Create(定义构造后其子窗体运行就出frmCommonBase窗体的访问错误,注:并没有直接的TfrmCommonBase实例)
其它三个窗体的构造定义都是如下这样:
constructor Create(AOwner:TComponent);reintroduce;
在其它窗体调用进直接执行:
frmProdInfo:=TfrmProdInfo.Create(application);
frmProdInfo.Show;
一切正常
但发果定义一个OpenForm后:
function OpenForm(aFormClass:TFormClass;Obj:TForm):Boolean;
begin
Obj:=aFormClass.Create(Application);
Obj.Show;
End;
调用:
OpenForm(TfrmProdInfo,frmProdInfo)
结果发现只创建了一个TfrmProdInfo的实例,但调试发现
TfrmProdInfo
TfrmEditBase
TfrmCommonBase
的构造函数Create竟然都没有执行
这究竟是为什么
 
function OpenForm(aFormClass:TFormClass;Obj:TForm):Boolean;
begin
Obj:=aFormClass.Create(Application);
Obj.Show;
End;
你自己再仔细看看,呵呵
 
看看Application.CreateForm的源码是怎么实现的
 
楼主,我手生,告诉我好了,我已经查了好几天了都没结果
 
procedure OpenForm(InstanceClass: TComponentClass
var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Application);
except
TComponent(Reference) := nil;
raise;
end;
end;
 
结果依然:
结果发现只创建了一个TfrmProdInfo的实例,
TfrmProdInfo
TfrmEditBase
TfrmCommonBase
的构造函数Create竟然都没有执行
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部