Search code examples
memory-managementlazarusfreepascaldestroy

Lazarus Pascal - How to REMOVE buttons at run-time


I'm dynamically creating command buttons on the form like this:

procedure TForm1.cmdAddClick(Sender: TObject);

var   MenuButton : TButton;

begin   MenuButton := TButton.Create(self);

ButtonCount:=ButtonCount + 1;

With MenuButton do

 begin
   Top:= 10 + Height * ButtonCount;

   Left := 10; 
   Parent := Panel1; //Parent container for the buttons.
   OnClick := @YouClicked;
   Caption := 'Menu item ' + IntToStr(ButtonCount);

 end;

end;

After a few times of running the above lines, I have a number of buttons.

But How do I REMOVE a specific button?

I've tried

FreeAndNil (TButton(Sender));

But it doesn't seem to work...


Solution

  • 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;