Memory management Lazarus Pascal-如何在运行时删除按钮
我在表单上动态创建命令按钮,如下所示:Memory management Lazarus Pascal-如何在运行时删除按钮,memory-management,lazarus,freepascal,destroy,Memory Management,Lazarus,Freepascal,Destroy,我在表单上动态创建命令按钮,如下所示: procedure TForm1.cmdAddClick(Sender: TObject); var MenuButton : TButton; begin MenuButton := TButton.Create(self); ButtonCount:=ButtonCount + 1; 有菜单按钮吗 begin Top:= 10 + Height * ButtonCount; Left := 10; Parent
procedure TForm1.cmdAddClick(Sender: TObject);
var MenuButton : TButton;
begin MenuButton := TButton.Create(self);
ButtonCount:=ButtonCount + 1;
有菜单按钮吗
begin
Top:= 10 + Height * ButtonCount;
Left := 10;
Parent := Panel1; //Parent container for the buttons.
OnClick := @YouClicked;
Caption := 'Menu item ' + IntToStr(ButtonCount);
end;
end;
在运行了上述几行之后,我有了一些按钮
但是如何移除特定的按钮呢
我试过了
FreeAndNil (TButton(Sender));
但它似乎不起作用…该按钮也必须从层次结构中删除。由TForm.RemoveComponent完成的IIRC?从YouClicked事件内部销毁按钮(使用Sender)似乎有问题 如果我将对象指针保留在按钮上,这在您单击的按钮之外工作:
TheMenuButton.Free;
按钮(控件)的析构函数处理父级中的清理。感谢您的回答。您能告诉我如何从层次结构中删除特定按钮吗?谢谢我试过:Panel1.RemoveControl(TButton(Sender));它似乎把表单上的按钮去掉了。但我不确定它是否会释放内存。。。顺便说一句,RemoveComponent什么都不做。谢谢你的指点。我不太明白你在说什么。我知道有点不对劲,但我不知道。。。看看Marco van de Voort的回答和我对它的评论,你认为它能起作用吗?据我所知,按钮不见了。但不确定他们是否占用了资源。我不认为RemoveControl会破坏button对象。在上面的所有示例中,“Sender”被用作按钮的引用,因此我假设我们在YouClicked事件中。这是唯一不能销毁按钮的地方(不能销毁具有活动事件的按钮?)。如果您从其他任何地方(尝试另一个按钮的单击事件)运行。在一个按钮上释放它将被销毁,并且它的父控件列表将被更新。感谢您的解释。我是拉撒路的新手。你能解释一下挫折的目的吗?谢谢SetBounds只是一种同时设置控件的属性Left、Top、Width和Height的有效方法。
procedure TForm1.FormCreate(Sender: TObject);
begin
TestButton:=TButton.Create(Panel1);
TestButton.SetBounds(10, 10, 80, 25);
TestButton.OnClick:=@TestButtonClick;
TestButton.Parent:=Panel1;
end;
procedure TForm1.TestButtonClick(Sender: TObject);
begin
FreeAndNil(TestButton); // Crash!
end;
procedure TForm1.AnotherButtonClick(Sender: TObject);
begin
FreeAndNil(TestButton); // Works...
end;