gpt4 book ai didi

Delphi - 销毁组件

转载 作者:行者123 更新时间:2023-12-02 08:13:41 24 4
gpt4 key购买 nike

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

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;

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

谢谢:)

最佳答案

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

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

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

关于Delphi - 销毁组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31678266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com