gpt4 book ai didi

delphi - 在运行时删除动态创建的按钮

转载 作者:行者123 更新时间:2023-12-03 15:30:17 28 4
gpt4 key购买 nike

我需要用户能够右键单击该按钮,它会自行删除,但以下代码不起作用

        procedure TForm1.Button1Click(Sender: TObject);         ////////Creates a new object
var
ExampleButton : TButton;
Begin
ExampleButton := TButton.Create(self); //Creates an object the same as its self
ExampleButton.Parent := self;
//Button properties go here

//Procedures called here
ExampleButton.OnMouseDown := DragOrDelete;

end;

上面创建了按钮,下面我尝试删除它

procedure TForm1.DragOrDelete(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin

CursorPosition := Mouse.CursorPos; ////Location of mouse
ExampleButtonStartingLocation := TPoint.Create((Sender as Tbutton).Left, (Sender as Tbutton).Top);
if Button = mbRight then
FreeAndNil(TButton);
end;

我得到的错误是常量对象不能作为 var 参数传递。是不是因为我创建了很多TButton,但是程序不知道该引用哪一个。

最佳答案

嗯,

FreeAndNil(TButton);

应该是

(Sender as TButton).Free;  // thanks to DH

但这并不好。调用事件处理程序的 RTL 例程仍然会引用该按钮,并且需要在事件处理程序退出后继续访问它,因此释放它可能会导致进一步的问题(而且,Sender 不是一个var 参数,因此将其设置为 nil 将不会对调用者产生任何影响)。

更好的选择可能是创建一条使用 Sender 作为 wParam 的自定义消息并将其发布到主表单。

编辑

为此,您需要创建一条用户消息,例如

const
WM_DELETE_CONTROL = WM_USER +1;

并将有问题的行替换为

PostMessage( FormMain.WindowHandle, WM_DELETE_CONTROL, WPARAM( Sender ), 0 );

然后在主窗体中创建一个过程来处理消息,例如

procedure DestroyButton( var Msg : TMessage); message WM_DELETE_CONTROL;

定义如下

procedure TForm1.DestroyButton( var Msg : TMessage);
begin
// RemoveControl( TButton( Msg.LParam ));
// correction - thanks to Remy Lebeau
TButton( Msg.WParam ).Free;
end;

关于delphi - 在运行时删除动态创建的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41982762/

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