假定祖先窗口为frmAncestor,后代窗口为frmChild1.在祖先窗口的某个事件中要关闭窗口自身,应该怎么写?
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;
endfrmChild中
procedure TfrmChild.abc();
begin
inhetrited;
ShowMessage('Run here');
end即使a=b,仍然会显示“Run here”对话框,请问这种情况应该怎么做才是正确的?
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;
endfrmChild中
procedure TfrmChild.abc();
begin
inhetrited;
ShowMessage('Run here');
end即使a=b,仍然会显示“Run here”对话框,请问这种情况应该怎么做才是正确的?
frmAncestor.Close; // 改为: close;procedure TfrmChild.abc();
begin
inhetrited; // 在这儿知识调用frmAncestor.abc函数
// 那个exit仅仅是退出frmAncestor.abc函数;
ShowMessage('Run here');
end
2,要退出还是要调用EXIT
begin
if a = b then
abort; //可以改为abort
end
begin
if a = b then
abort;
end另外在主先窗口中
直接写
Close即可
其实这也就是self.Close;
begin
Action := caFree;
frmAncestor := nil;
end;但是frmAncestor := nil这一句在子窗口中出错,问题同问题1,现在我是在祖先窗口中做Action := caFree;然后在后代窗口中在FromClose中先inherited;然后再写frmChild := nil;也比较麻烦。我觉得这个也应该有比较简单的办法吧?先谢过了!!!
begin
Action := caFree;
end;就可以了啊。
if frmChild = nil then
frmChild := TfrmChild.Create(frmChild);
frmChild.Show;不写frmChild := nil一句的话,第二次打开frmChild的时候frmChild及不为nil,又不能正常显示,所以我在关闭frmChild的时候必须要作frmChild := nil操作。
直接 Close 了 可以吗 ?
unit AncestorFrm;interfaceuses
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.
procedure TExpBkFram.UnInit;
begin
if TheDataModule <> nil then //释放包容打印数据集的数据模块
begin
FreeAndNIl(TheDataModule);
end;
end;
destructor TExpBkFram.Destroy;
begin
try
UnInit ;//释放初始化时实例化的对象
inherited;
except
end;end;
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.
你的这个代码简直就是胡闹!
呵呵
我觉的胡不胡闹
管用就行
请指出为什么这是胡闹
那不胡闹的方法是什么
您试过了码
谢谢xzgyb(老达摩) 的回复 ,谢谢您