假定祖先窗口为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”对话框,请问这种情况应该怎么做才是正确的?

解决方案 »

  1.   

    if a = b then
      frmAncestor.Close;      // 改为: close;procedure TfrmChild.abc();
    begin
      inhetrited;         // 在这儿知识调用frmAncestor.abc函数
                          // 那个exit仅仅是退出frmAncestor.abc函数; 
                          
      ShowMessage('Run here');
    end
      

  2.   

    同意楼上;
    2,要退出还是要调用EXIT
      

  3.   

    那么是不是我在frmChild中还是需要把这个判断条件再写一遍啊?没有简单一点的方法吗?
      

  4.   

    rocedure TfrmAncestor.abc();
    begin
      if a = b then
        abort;  //可以改为abort
    end
      

  5.   

    procedure TfrmAncestor.abc();  //少写个p
    begin
      if a = b then
        abort;  
    end另外在主先窗口中
    直接写
    Close即可
    其实这也就是self.Close;
      

  6.   

    谢谢各位了,以上的问题都已经解决,非常感谢,还有最后一个问题(不好意思,有点拖三拉四的*^_^*):在关闭窗口的时候想做如下操作:procedure TfrmAncestor.FormClose();
    begin
      Action := caFree;
      frmAncestor := nil;
    end;但是frmAncestor := nil这一句在子窗口中出错,问题同问题1,现在我是在祖先窗口中做Action := caFree;然后在后代窗口中在FromClose中先inherited;然后再写frmChild := nil;也比较麻烦。我觉得这个也应该有比较简单的办法吧?先谢过了!!!
      

  7.   

    直接用close,close是Form的类方法可在子类中直接调用
      

  8.   

    procedure TfrmAncestor.FormClose();
    begin
      Action := caFree;
      
    end;就可以了啊。
      

  9.   

    To flyingkiller(大飞虫):是否写了Action := caFree;后就不需要写frmChild := nil了?我记得Free并不会把对象置为nil啊?
      

  10.   

    如果我不写frmChild := nil,则第二次打开frmChild的时候就会出错。打开frmChild的脚本是这样写的:
      if frmChild = nil then
        frmChild := TfrmChild.Create(frmChild);
      frmChild.Show;不写frmChild := nil一句的话,第二次打开frmChild的时候frmChild及不为nil,又不能正常显示,所以我在关闭frmChild的时候必须要作frmChild := nil操作。
      

  11.   

    CaFree 释放 fsMDIChild 可以,释放继承的窗体没有试过
    直接 Close 了 可以吗 ?
      

  12.   

    To wjlsmail(计算机质子):只做Close也不行,这些窗口是MDI子窗口,如果直接Close,则关闭的时候只会最小化,不会关闭。
      

  13.   

    我以前用过的一招
    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.
      

  14.   

    正在做的一段代码!!
    procedure TExpBkFram.UnInit;
    begin
      if TheDataModule <> nil then //释放包容打印数据集的数据模块
      begin
        FreeAndNIl(TheDataModule);
      end;
    end;
    destructor TExpBkFram.Destroy;
    begin
      try
        UnInit ;//释放初始化时实例化的对象
        inherited;
      except
      end;end;
      

  15.   

    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.
    你的这个代码简直就是胡闹!
      

  16.   

    To zhang21cnboy(沧桑男人):>>你的这个代码简直就是胡闹!是说我吗?我是刚刚从PB转过来的Delphi菜鸟,写一些胡闹的代码也可以原谅吧?我知道你的这个方法肯定是可行的(以前有人给我说过,但是我不太懂,所以没有采用这中方法),不过我看不懂,能给一点解释吗?
      

  17.   

    zhang21cnboy(沧桑男人)是在说我
    呵呵
    我觉的胡不胡闹
    管用就行
    请指出为什么这是胡闹
    那不胡闹的方法是什么
    您试过了码
      

  18.   

    hehe,我知道zhang21cnboy(沧桑男人)给出的方法是最好的方法,但是我觉得比较复杂(应该说是我太菜了才对:-)),所以我才想找一种比较简单的办法的。谢谢各位。
      

  19.   

    zhang21cnboy(沧桑男人) 给出的代码能不能贴出来 ? 
    谢谢xzgyb(老达摩) 的回复 ,谢谢您