【问题标题】:Delphi - Destroy component [duplicate]Delphi - 销毁组件
【发布时间】:2015-10-19 02:59:24
【问题描述】:

我对以下示例有疑问。我有一个按钮可以创建包含更多组件的运行时面板:

Panel := TPanel.Create(self);
Panel.Parent := FlowPanel;
Panel.Align := alTop;
Panel.Height := 24;
Panel.Width := FlowPanel.Width;

Text := TLabel.Create(self);
Text.Parent := Panel;
Text.Align := alLeft;
Text.Caption := Query.FieldByName('Nazev').AsString;
Text.AlignWithMargins := True;
Text.Tag := Data_Id;
Text.Width := 100;

Button := TButton.Create(self);
Button.Parent := Panel;
Button.Caption := 'Odstranit';
Button.Align := alRight;
Button.Margins.Top := 0;
Button.Margins.Bottom := 0;
Button.AlignWithMargins := True;
Button.OnClick := DeleteFlowPanelItem;

按钮在 DeleteFlowPanelItem 上有 OnClick 事件;

procedure TAdminTypyPlochy.DeleteFlowPanelItem(Sender: TObject);
var
  myPanel: TPanel;
begin
  myPanel := TPanel(TButton(Sender).Parent);
  myPanel.Free;
end;

当你点击那个时,虽然我的组件被删除了,但是当它弹出消息地址访问冲突时...为什么?

谢谢:)

【问题讨论】:

    标签: delphi components destroy


    【解决方案1】:

    发生这种情况是因为您正在从按钮的OnClick 事件处理程序中释放按钮。这根本是不允许的。该按钮归此面板所有,因此,当您释放面板时,它也会释放此按钮 - 在其事件处理程序完成执行之前。

    【讨论】:

    • 感谢您提供的信息。您可以通过其他方式做到这一点吗?
    • 实际上,我刚刚意识到该按钮不是归面板所有,而是归其他东西所有。我不知道self 在您的代码中是什么情况。除此之外,一种解决方案可能是使用 Windows 消息。
    • 这里是完整的单元来源:link
    【解决方案2】:

    调用按钮OnClick 事件处理程序的函数是同一按钮的方法。您的 OnClick 事件删除了按钮,因此当事件处理程序返回时,您现在正在执行已销毁对象的实例方法。

    您需要推迟按钮的销毁,直到按钮点击事件处理完成。使用PostMessage 发布自定义消息,标识要销毁的按钮。通过销毁指定的按钮来处理该消息。例如,按钮可以在lParam 中传递。

    我个人会使用AllocateHWnd 创建一个可以作为这些消息目标的窗口。这样您就可以确保避免重新创建窗口时出现问题。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2015-07-26
      • 2011-06-17
      • 1970-01-01
      • 2011-09-22
      • 2017-11-20
      • 2015-05-08
      • 2016-12-05
      • 2019-07-28
      相关资源
      最近更新 更多