如何在帧上的按钮的单击事件中清除帧?

4

我可以使用普通的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。

1
你可以在你的框架中复制TCustomForm.Release行为,怎么样? - Premature Optimization
假设ChildFrameFirstFrame的一个字段,你应该调用FreeAndNil(ChildFrame)而不是ChildFrame.Free。后者可能会导致它在0%的情况下工作...即使现在它99%的时间都能正常工作,但它未必总是能给出正确的结果。 - Ken Bourassa
对回答者表示歉意 - 由于其他压力,我没有回来 - 但看起来像是CMRelease :) - Despatcher
2个回答

6

试试这个:

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; 

4

看一下 TCustomForm.Release 的实现方式。它非常简单:将一个消息发布到 Windows 消息队列中,当处理该消息时会导致窗体自动释放。在你自己的代码中实现这个功能应该不难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接