Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management Lazarus Pascal-如何在运行时删除按钮_Memory Management_Lazarus_Freepascal_Destroy - Fatal编程技术网

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;