有关窗体的不解问题 ( 积分: 20 )

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

publicnews

Unregistered / Unconfirmed
GUEST, unregistred user!
下面用TFormClass的方法为什么不行,如何才能使其工作正常
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.OpenForm(aFormClass:TFormClass;Obj:TForm);
begin
Obj:=aFormClass.Create(Application);
//Application.CreateForm(aFormClass,Obj);
Obj.Show;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);

begin
OpenForm(TForm2,Form2);
Form2.Caption:='test'
//不行
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.Caption:='test'
//可以
end;

end.
 
下面用TFormClass的方法为什么不行,如何才能使其工作正常
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.OpenForm(aFormClass:TFormClass;Obj:TForm);
begin
Obj:=aFormClass.Create(Application);
//Application.CreateForm(aFormClass,Obj);
Obj.Show;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);

begin
OpenForm(TForm2,Form2);
Form2.Caption:='test'
//不行
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.Caption:='test'
//可以
end;

end.
 
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.OpenForm(aFormClass:TFormClass;Obj:TForm);
begin
Obj:=aFormClass.Create(Application);
//Application.CreateForm(aFormClass,Obj);
Obj.Show;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);

begin
OpenForm(TForm2,Form2);
Form2.Caption:='test'
//不行 //这里的form2 不是用openform 建的form2即show出来的form,你看到的那个form2,其实指针已经释放了,只是对象没有释放,幸好你使用的是Create(Application),不然它就没法管理了,就造成了内存泄漏,要达到你的效果
你必须使用function,把form2作为参数返回
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Form2:=TForm2.Create(Application);
Form2.Show;
Form2.Caption:='test'
//可以
end;

end.
 
procedure TForm1.OpenForm(aFormClass:TFormClass;Obj:TForm);
改成procedure TForm1.OpenForm(aFormClass:TFormClass
var Obj:TForm);
OpenForm(TForm2,Form2);
改成OpenForm(TForm2,TForm(Form2));
试试。
 
同意楼上,参考这个代码
procedure TApplication.CreateForm(InstanceClass: TComponentClass
var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
 
在过程内转换和或传递前转换哪种更好些
procedure TForm1.OpenForm(aFormClass:TFormClass;var Obj);
begin
TForm(Obj):=aFormClass.Create(Application);
TForm(Obj).Show;
end;
 
在unit2 中 注册 窗体类就没有问题了. 如:
initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);

否则就有问题.
 
原来如此,又了学了一招!谢谢。。。
 
注册窗体类? 哪种执行效率要高呢?
 
procedure TForm1.OpenForm(aFormClass:TFormClass;var Obj:TForm)
//加入Var
begin
Obj:=aFormClass.Create(Application);
//Application.CreateForm(aFormClass,Obj);
Obj.Show;
end;
 
多人接受答案了。
 
后退
顶部