关于窗体继承的几个问题,请OO高手帮忙解答,谢谢!

NetCobra 2002-12-09 12:58:39
假定祖先窗口为frmAncestor,后代窗口为frmChild

1.在祖先窗口的某个事件中要关闭窗口自身,应该怎么写?
frmAncestor中写
if a = b then
frmAncestor.Close;
在frmChild中上述语句出错,原因是没有frmAncestor这个实例,frmAncestor.Close并不会关闭后代窗口frmChild。

我现在的处理办法是专门写一个关闭窗体的纯虚过程CloseSelf,每个后代窗口实现各自的关闭窗口语句:
procedure TfrmChild.CloseSelf(Sendor:TObject);Override;
begin
frmChild.Close
end;
在祖先窗口中将上述语句改为:
if a = b then
CloseSelf(Sendor);

请问还有更好的办法吗?

2.在祖先窗口的某个事件中作一个判断,如果条件成立则Exit,不再执行下面的语句;在后代窗口的这个事件inherited后还要添加一些语句,但是我发现好像上面所作的判断成立Exit以后,后代窗口新增加的语句仍然会执行。

frmAncestor中:

rocedure TfrmAncestor.abc();
begin
if a = b then
exit;
end

frmChild中
procedure TfrmChild.abc();
begin
inhetrited;
ShowMessage('Run here');
end

即使a=b,仍然会显示“Run here”对话框,请问这种情况应该怎么做才是正确的?
...全文
33 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzgyb 2002-12-09
  • 打赏
  • 举报
回复
wjlsmail
不谢
xzgyb 2002-12-09
  • 打赏
  • 举报
回复
苦笑
wjlsmail 2002-12-09
  • 打赏
  • 举报
回复
zhang21cnboy(沧桑男人) 给出的代码能不能贴出来 ?
谢谢xzgyb(老达摩) 的回复 ,谢谢您
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
hehe,我知道zhang21cnboy(沧桑男人)给出的方法是最好的方法,但是我觉得比较复杂(应该说是我太菜了才对:-)),所以我才想找一种比较简单的办法的。

谢谢各位。
xzgyb 2002-12-09
  • 打赏
  • 举报
回复
zhang21cnboy(沧桑男人)是在说我
呵呵
我觉的胡不胡闹
管用就行
请指出为什么这是胡闹
那不胡闹的方法是什么
您试过了码
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
To zhang21cnboy(沧桑男人):

>>你的这个代码简直就是胡闹!

是说我吗?我是刚刚从PB转过来的Delphi菜鸟,写一些胡闹的代码也可以原谅吧?

我知道你的这个方法肯定是可行的(以前有人给我说过,但是我不太懂,所以没有采用这中方法),不过我看不懂,能给一点解释吗?
zhang21cnboy 2002-12-09
  • 打赏
  • 举报
回复
unit AncestorFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TAncestorForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FFormRef: PPointer;
public
{ Public declarations }
constructor CreateRef(AOwner: TComponent; var AFormRef);
end;

var
AncestorForm: TAncestorForm;

implementation

{$R *.dfm}

constructor TAncestorForm.CreateRef(AOwner: TComponent;
var AFormRef);
begin
inherited Create(AOwner);
FFormRef := @AFormRef;
end;

procedure TAncestorForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FFormRef^ := nil;
end;

end.

然后后代窗口

ChildForm := TChildForm.CreateRef(Application, ChildForm);
OK.
你的这个代码简直就是胡闹!
mengxianbao1521 2002-12-09
  • 打赏
  • 举报
回复
正在做的一段代码!!
procedure TExpBkFram.UnInit;
begin
if TheDataModule <> nil then //释放包容打印数据集的数据模块
begin
FreeAndNIl(TheDataModule);
end;
end;
destructor TExpBkFram.Destroy;
begin
try
UnInit ;//释放初始化时实例化的对象
inherited;
except
end;

end;
wjlsmail 2002-12-09
  • 打赏
  • 举报
回复
谢谢
xzgyb 2002-12-09
  • 打赏
  • 举报
回复
我以前用过的一招
unit AncestorFrm;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TAncestorForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
FFormRef: PPointer;
public
{ Public declarations }
constructor CreateRef(AOwner: TComponent; var AFormRef);
end;

var
AncestorForm: TAncestorForm;

implementation

{$R *.dfm}

constructor TAncestorForm.CreateRef(AOwner: TComponent;
var AFormRef);
begin
inherited Create(AOwner);
FFormRef := @AFormRef;
end;

procedure TAncestorForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
FFormRef^ := nil;
end;

end.

然后后代窗口

ChildForm := TChildForm.CreateRef(Application, ChildForm);
OK.
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
To wjlsmail(计算机质子):只做Close也不行,这些窗口是MDI子窗口,如果直接Close,则关闭的时候只会最小化,不会关闭。
dicke 2002-12-09
  • 打赏
  • 举报
回复
Up
wjlsmail 2002-12-09
  • 打赏
  • 举报
回复
CaFree 释放 fsMDIChild 可以,释放继承的窗体没有试过
直接 Close 了 可以吗 ?
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
如果我不写frmChild := nil,则第二次打开frmChild的时候就会出错。

打开frmChild的脚本是这样写的:
if frmChild = nil then
frmChild := TfrmChild.Create(frmChild);
frmChild.Show;

不写frmChild := nil一句的话,第二次打开frmChild的时候frmChild及不为nil,又不能正常显示,所以我在关闭frmChild的时候必须要作frmChild := nil操作。
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
To flyingkiller(大飞虫):是否写了Action := caFree;后就不需要写frmChild := nil了?我记得Free并不会把对象置为nil啊?
flyingkiller 2002-12-09
  • 打赏
  • 举报
回复
procedure TfrmAncestor.FormClose();
begin
Action := caFree;

end;

就可以了啊。
d983074 2002-12-09
  • 打赏
  • 举报
回复
直接用close,close是Form的类方法可在子类中直接调用
NetCobra 2002-12-09
  • 打赏
  • 举报
回复
谢谢各位了,以上的问题都已经解决,非常感谢,还有最后一个问题(不好意思,有点拖三拉四的*^_^*):

在关闭窗口的时候想做如下操作:

procedure TfrmAncestor.FormClose();
begin
Action := caFree;
frmAncestor := nil;
end;

但是frmAncestor := nil这一句在子窗口中出错,问题同问题1,现在我是在祖先窗口中做Action := caFree;然后在后代窗口中在FromClose中先inherited;然后再写frmChild := nil;也比较麻烦。

我觉得这个也应该有比较简单的办法吧?先谢过了!!!
xzgyb 2002-12-09
  • 打赏
  • 举报
回复
procedure TfrmAncestor.abc(); //少写个p
begin
if a = b then
abort;
end

另外在主先窗口中
直接写
Close即可
其实这也就是self.Close;

xzgyb 2002-12-09
  • 打赏
  • 举报
回复
rocedure TfrmAncestor.abc();
begin
if a = b then
abort; //可以改为abort
end
加载更多回复(3)

5,392

社区成员

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

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