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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение shraibikus » 08.02.2012 15:15:00

Здравствуйте.

Есть 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
(Просто впервые озадачился таким мероприятием).
Последний раз редактировалось shraibikus 08.02.2012 15:51:48, всего редактировалось 1 раз.
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

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

Сообщение Brainenjii » 08.02.2012 15:27:23

Странно, что нет ошибок. Убедитесь - с того ли тулбара Вы удаляете кнопки и не перехватываются ли у Вас 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.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение shraibikus » 08.02.2012 15:51:25

Brainenjii
спасибо. Код переписал. Заработало.
Странно, что с destroy тоже работает.

Ну да ладно. Тему считаю можно закрыть.
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

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

Сообщение Brainenjii » 08.02.2012 16:22:56

Ничего странного... Free - тот же Destroy, только с полубезумной проверкой (не является ли освобождаемый объект nil'ом, хотя как по мне - это явная ошибка).
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru