动态添加Frame请教,有代码。
小弟现在要做一个很复杂的系统,想来想去,只能用Frame去作,现在为了学习Frame,做了一个非常简单的测试,左边是导航栏,上面有两个按钮,右边放了一个Pannel2,然后建了两个Frame,分别是FrameFirst和FrameSecond,
代码如下
procedure Tfrmmain.Button1Click(Sender: TObject);
var
Fra1:tframefirst;
begin
fra1:=tframefirst.Create(nil);
fra1.Parent:=self.Panel2;
end;
procedure Tfrmmain.Button2Click(Sender: TObject);
var
fra2:tframesecond;
begin
fra2:=tframesecond.Create(nil);
fra2.Parent:=self.Panel2;
end;
非常简单,功能也实现了,点击Button1出现第一个,点击Button2出现第二个,我现在想问的是,生成的那些我应当如何去释放,有没有更好的方法.因为真正到了程序,可能会有上百个Frame,有没有更好的方法.再分别点击不同的按钮时,显示不同的Frame,命名没有规则的.
问题点数:40、回复次数:6Top
1 楼ddqqyy(ddqqyy)回复于 2004-12-03 12:36:18 得分 0
不用多操心,在动态生成frame的时候,指定该frame的Owner就可以了,即:
fra2:=tframesecond.Create(Self);
TfrmMain撤消的时候,自然会先释放这些子frame,这也就是VCL构架的优点之一。
如果你想动态生成,再动态撤消,那你当然要组织好你动态生成的对象,想撤消的时候,free一下该对象就完事了。Top
2 楼lizhennehzil(悠闲的白云)回复于 2004-12-03 12:40:03 得分 0
我担心的是
如果几百个Frame都添加进去,会不会造成内存之类的不够用阿
因为每个Frame上面都挺复杂的Top
3 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 13:24:50 得分 0
try...finally...
procedure Tfrmmain.Button1Click(Sender: TObject);
begin
with tframefirst.Create(nil) do
try
Parent:=self.Panel2;
{Other Code here}
finally
Free;
end;
end;
procedure Tfrmmain.Button2Click(Sender: TObject);
begin
with tframesecond.Create(nil) do
try
Parent:=self.Panel2;
{Other Code here}
finally
Free;
end;
end;
Top
4 楼ddqqyy(ddqqyy)回复于 2004-12-03 13:51:58 得分 10
建议定义一个基类,其他Frame都从该基类派生。在基类中定义公共的虚拟方法,如CloseFrame,所有子类可以根据情况重载该CloseFrame。
虽然有几百个frame,但同一时间只会有一个frame对用户是可见的吧?这样在动态生成新Frame时,先调用先前活动frame的CloseFrame方法。引用该Frame的对象,应该是一个声明为对基类对象的引用,这样在撤消时,会正确调用子类的CloseFrame方法,而不用关心子类对象具体的对象名。
看一看类的多态性概念,会给你带来启发的。Top
5 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 14:11:47 得分 30
不好意思,刚才代码丢脸了。
没有注意Frame的问题。
下面的代码是实际做的,道歉了:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TMyFrame = class of TFrame;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FCurrentfrmClass: String;
Ffrm: TFrame;
procedure LoadFrameByClassName(FrameClassName: TMyFrame);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FCurrentfrmClass := '';
end;
procedure TForm1.LoadFrameByClassName(FrameClassName: TMyFrame);
begin
if Assigned(Ffrm) and (not SameText(FrameClassName.ClassName, FCurrentfrmClass)) then
FreeAndNil(Ffrm);
Ffrm := FrameClassName.Create(nil);
Ffrm.Parent := Panel1;
FCurrentfrmClass := FrameClassName.ClassName;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFrameByClassName(TFrame2);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadFrameByClassName(TFrame3);
end;
end.
Top
6 楼KAPOK_CSDN(上善若水,厚德载福)回复于 2004-12-03 14:12:32 得分 0
Unit2,Unit3是两个Frame的单元;Top




