MDI子窗体,关闭时的问题

jwt1982 2006-11-22 03:48:00
我写了一个基本类,其他子窗体都继承于这个窗体
可是我每次关闭子窗体时,都要在每个窗体写如下代码
Action:=caFree;
frmchildname:=nil;

如何写到基本窗体中,避免每个窗体都写这个句代码?
...全文
240 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
newfang 2006-11-26
  • 打赏
  • 举报
回复
frmchildname:=nil;
-------------
self := nil;
阿发伯 2006-11-26
  • 打赏
  • 举报
回复
不太明确要求,譬如,不同类型的子窗体是否只要一个,我现在暂按只要一个的要求,提点思路供参考:

// 基本子窗体
TBaseChild = class(TForm)
...
end;
// 派生A
TAChild = class(TBaseChild)
...
end;
// 派生B
TBChild = class(TBaseChild)
...
end;

// 定义一个基本类类型
TMyChildClass = class of TBaseChild;
// 定义一个枚举,表示不同的子窗体,在主窗体中根据不同的需求设置
TChildType = (ctA, ctB);

// 主窗体中建立子窗体过程,根据选择传入子窗体类型,假设每个子窗体只要一个
procedure MainForm.CreateChild(ChildType: TChildType);
const
ChildClass: array[TChildType] of TMyChildClass = (TAChild, TBChild);
var
Child: TBaseChild;
I: Integer;
begin
I := 0;
// 查找该类型子窗体是否存在
while (I < MDIChildCount) and not (MDIChildren[I] is ChildClass[ChildType]) do
Inc(I);
// 存在,显示之
if I < MDIChildCount then
MDIChildren[I].Show
else // 否则,建立该类型子窗体
begin
Child := ChildClass[ChildType].Create(Application);
Child.Show;
end;
end;
ZyxIp 2006-11-24
  • 打赏
  • 举报
回复
或者将 frm:frmUserList; 定义到主窗体的 private 下。
ZyxIp 2006-11-24
  • 打赏
  • 举报
回复
procedure showUserListForm()
var
frm:frmUserList;
begin
frm:=TfrmUserList.create(self);
frm.show;
end;


在TfrmUserList的关闭时用 Action:=caFree;
jwt1982 2006-11-24
  • 打赏
  • 举报
回复
晕了,我的意思是说,我有许多个子窗体

每个窗体都不同的,我应该如何写到我的基本窗体中?

procedure showUserListForm()
var
frm:frmUserList;
begin
frm:=TfrmUserList.create(self);
frm.show;
end;

这个定义是写不到我的基本窗体里的,否则我所有继承这个窗体的窗体,就都变成基本窗体了呵呵
jwt1982 2006-11-23
  • 打赏
  • 举报
回复
我建立子窗体时是这么写的

if not Assigned(frmUserList) then
begin
Application.CreateForm(TfrmUserList, frmUserList);
frmUserList.Show;
end
else
begin
frmUserList.Show;
frmUserList.BringToFront;
end;

应该怎么写呢?
ZyxIp 2006-11-22
  • 打赏
  • 举报
回复
如果你可能在别的对象中访问子窗体建议你用消息的方式。通过主窗体的MDIChild列表来访问每一个子窗体。
不建议用对象名的方式去访问对象,除去是自己内部创建的。
ZyxIp 2006-11-22
  • 打赏
  • 举报
回复
这要看你的 frmchildname 子窗体变量是如何保存的, 建议不要用全局变量。这样就不用
frmchildname:=nil;了。

foryour 2006-11-22
  • 打赏
  • 举报
回复
Action:=caFree;
seft:=nil;
如果创建子窗体用到Assigned函数就不行了
听楼下解答

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧