怎样建立一个子窗体的通用过程? ( 积分: 10 )

  • 主题发起人 主题发起人 lovewjm
  • 开始时间 开始时间
L

lovewjm

Unregistered / Unconfirmed
GUEST, unregistred user!
在主窗体中,因为打开子窗体比较多,一个一个写代码觉得有点麻烦,有没有一个通用的过程?
我试着写了一下.是这样:
procedure TForm1.createchildform1(aform: tform; formclass: tformclass);
begin
if not assigned(aform) then
aform:=formclass.Create(self)
else
begin
aform.BringToFront;
aform.WindowState:=wsnormal;
end;
end;
但运行这个过程后,会建立多个子窗体,应该是建立了这个子窗体后,就不再另建一个相同的子窗体.有哪位高手能指点指点?多谢
 
procedure TMainFrm.CreatForm(__FormClass: Tformclass; var reference);
var
TB : TTabSheet;
Instance:Tform;
mCount :integer;
begin

// 2007.04.17 chenyu 同一界面只允许运行一次;
for mCount:=0 to MDIChildCount-1 do
begin
if GetClass(MDIChildren[mCount].ClassName) = __FormClass then
begin
MDIChildren[mcount].WindowState:=wsNormal;
//MDIChildren[mCount].BringToFront ;
exit;
end;
end;

Instance := Tform(__FormClass.NewInstance);
TForm(reference) := Instance;
try
Instance.Create(self);
Tform(reference).Tag:=Tform(reference).Handle;
Tform(reference).WindowState:=wsMaximized ;
TForm(reference).OnClose:=OnMDIChildClose;
Tb:=TTabSheet.Create(PgcModule);
Tb.PageControl:=PgcModule;
tb.ImageIndex:=0;
Tb.Caption:=Tform(reference).Caption;
tb.Tag := Tform(reference).handle;
PgcModule.OnChange:= addchange;
tb.Show;
except
Application.MessageBox('调用窗体出错','提示',MB_OK+MB_ICONQUESTION);
end;
end;
 
另一种比较好用的方式是在每个子窗体定义一个入口函数,任何地方调用这个子窗体,就写那一句代码,比如可以定义一个函数
TfrmVirtualOMR = class(TForm)
public
class procedure StartUp();
end;
class procedure TfrmSub.StartUp();
begin
这里写的窗体实例化,显示,释放等代码
这个函数也定义成class procedure,可按类名调用,就更方便了
end;
主窗体里只写 TfrmSub.StartUp();
优点:绝对的低藕盒,模块相对独立性强,集成更容易(特别是多点调用时),移植也更容易,并且,这个函数可定义参数,实现带参数启动很方便,还可定义多个入口函数,扩展能力极好
 
有机会试试第二种方法,每个子窗体都要写,会不会麻烦点?
 
我假设这样一种情况
每个软件都有一个文档模块:文档列表采用树形分层显示,以文件目录为基础显示到TreeView
启动到此模块时,需要传递文档的根目录,以便模块自动加载文档清单
代码看起这样:
Main窗体调用文档模块的代码,注意,只有一句就够了
TfrmDocs.StartUp(ExePath + 'Docs/');
TfrmDocs是文档模块的窗体名,如果你在很多软件中使用这个模块
很快你就知道这样做灵活性很高,复用性高

有些模块需要带参启动,这些参数来自应用程序执行时的情况(如路径),这是一种十分符合OOP的模式,还有一种适用的情况是多入口,一个软件中有多个地方调用此模块,但提供的参数性质不同,这种方法可游刃有余而完全不会在模块间引入强藕合

对于不带参数模块启动,写通用例程较省力,为工厂模式,通用性可很强
 
后退
顶部