Страница 1 из 1

[решено] Динамически удалить кнопку с TToolBar

СообщениеДобавлено: 08.02.2012 15:15:00
shraibikus
Здравствуйте.

Есть TToolBar собранный визуально с кнопками (т.е. в самом редакторе Lazarus, например. А быть может и собранными кнопками runtime).

Хочу создаваемые/удаляемые кнопки runtime.

Начал с того, что бросил в визуальном редакторе на банальную ToolBar1 одну кнопку.

Затем хочу ее удалить runtime так:

Код: Выделить всё
for i:=0 to ToolBar1.ButtonCount-1 do
begin
ToolBar1.Buttons[i].Destroy;
end;


Никаких ошибок не вижу.
Физически кнопка остается на своем месте runtime.

А вот при следующем проходе этого-же цикла я уже узнаю, что ToolBar1.ButtonCount уже равен 0.
Т.е. что-то все-же удалилось. Но визуально оно продолжает существовать (не проверял события, возможно они отвязываются у такого контрола).

Вопрос: что я делаю не правильно? :D
(Просто впервые озадачился таким мероприятием).

Re: Динамически удалить кнопку с TToolBar

СообщениеДобавлено: 08.02.2012 15:27:23
Brainenjii
Странно, что нет ошибок. Убедитесь - с того ли тулбара Вы удаляете кнопки и не перехватываются ли у Вас Exception'ы?
Данный код корректно создал и удалил кнопки (fpc 2.6.0, linux, qt)
Код: Выделить всё
Unit Unit1;

{$mode objfpc}{$H+}

Interface

Uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
  StdCtrls;

Type

  { TForm1 }

  TForm1 = Class(TForm)
    Button1: TButton;
    ToolBar1: TToolBar;
    Procedure Button1Click(Sender: TObject);
    Procedure FormCreate(Sender: TObject);
  Private
    { private declarations }
  Public
    { public declarations }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.lfm}

{ TForm1 }

Procedure TForm1.FormCreate(Sender: TObject);
Var
  i: Integer;
Begin
  For i := 0 To Random(5) + 1 Do
    Begin
      ToolBar1.ButtonList.Add(TToolButton.Create(Self));
      ToolBar1.Buttons[ToolBar1.ButtonCount -1].Parent := ToolBar1;
    End;
end;

Procedure TForm1.Button1Click(Sender: TObject);
Var
  i: Integer;
Begin
  For i := ToolBar1.ButtonCount - 1 DownTo 0 Do //<- нужно идти назад
    ToolBar1.Buttons[i].Free; //<- по слухам, лучше чем Destroy
end;

End.

Re: Динамически удалить кнопку с TToolBar

СообщениеДобавлено: 08.02.2012 15:51:25
shraibikus
Brainenjii
спасибо. Код переписал. Заработало.
Странно, что с destroy тоже работает.

Ну да ладно. Тему считаю можно закрыть.

Re: [решено] Динамически удалить кнопку с TToolBar

СообщениеДобавлено: 08.02.2012 16:22:56
Brainenjii
Ничего странного... Free - тот же Destroy, только с полубезумной проверкой (не является ли освобождаемый объект nil'ом, хотя как по мне - это явная ошибка).