如何在框架上的按钮上的单击事件中干净地释放框架?

时间:2011-07-12 17:15:20

标签: delphi

我曾经能够使用普通的delphi按钮来做到这一点:

在第一帧我有(简化)

procedure FirstFrame.ButtonClick(Sender: TObject)
Begin
  if TButton(Sender).ModalResult = mrOK then
    ChildFrame.DoOKStuff
  else
    ChildFrame.DoCancelStuff;
  ChildFrame.Free;
end;

procedure FirstFrame.ShowFranme;
begin
  ChildFrame := TFrameWithButtons.Create(Owner);
  ChildFrame.Parent := self;
  ChildFrame.OKButton.OnClick := ButtonClick;
  ChildFrame.CancelButton.OnClick := ButtonClick;
  ChildFrame.Visible := True;
end;

在Childframe中,我无需处理按钮单击...按钮单击已设置为将控制权返回到第一帧。

使用某些第三方按钮时,偶尔会产生AV。 我理解为什么 - 在第三方代码处理中的某些时候返回到现在释放的帧或按钮但是被调用的代码在第一帧...恼人地它只有99.99%的时间工作:)

框架没有发布程序。

所以我的问题是处理这种情况的正确方法是什么?

使用Delphi 6和Delphi 2009。

2 个答案:

答案 0 :(得分:5)

试试这个:

type
  TFrameWithButtons = class(TFrame)
    ...
    procedure CMRelease(var Message: TMessage); message CM_RELEASE;
    ...
  end;

procedure TFrameWithButtons.CMRelease(var Message: TMessage);
begin
  Free;
end;

procedure FirstFrame.ButtonClick(Sender: TObject)
Begin
  if TButton(Sender).ModalResult = mrOK then
    ChildFrame.DoOKStuff
  else
    ChildFrame.DoCancelStuff;
  PostMessage(ChildFrame.Handle, CM_RELEASE, 0, 0);
end; 

答案 1 :(得分:4)

了解TCustomForm.Release的实施方式。它非常简单:它将消息发布到Windows消息队列,在处理时会导致表单自由释放。在您自己的代码中实现这一点应该不会太难。