Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 13:07   #1
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию Удаление динамических объектов

Суть проблемы:
У нас есть TStringList, в котором есть N-ное количество строк. На каждую строку создается, предположим, TLabel.
В случае изменения количества строк должно меняться и количество TLabel. Если мы увеличим количество строк, то новые TLabel создаются без проблем, но если количество строк уменьшить, то созданные TLabel на уже не существующие строки никуда не деваются.
Я попытался уничтожать все TLabel, но у меня ничего не вышло, получается удалить только самую последнюю, и все.

Код:
var
  StringList: TStringList;
  i: Integer;
  Label: TLabel;
  begin
   for i := 0 to StringList.Count-1 do
   begin
    Label:= TLabel.Create(Self);
    Label.Caption := StringList[i];
    Label.tag := i;
   end;
  end;
Как удалить динамически созданные Label?
Jetro вне форума Ответить с цитированием
Старый 10.12.2010, 13:10   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ай-яй-яй. Кто же так создает. Ты в цикле создаешь одну и ту же метку. Создай массив компонентов и "приклей" его ко всем изменениям в StringList. Кстати, нафига это все?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 13:39   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Ты в цикле создаешь одну и ту же метку.
Все нормально. Меток будет создано столько сколько надо. Надо будет только правильно размещать их на форме чтобы они не лезли друг на друга. (у всех одинаковые координаты поэтому видим только созданную последней).

label.top:=...;
label.left:=...;

а как их потом найти (для удаления) смотри похожие темы, там это наверняка было.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.12.2010, 13:44   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Меток будет создано столько сколько надо.
а) Label - Насколько я помню это слово зарезервировано
б) Меток будет создано столько, верно, но его идентифкатор будет указывать на последнюю... Именно по этой причине у него и возникают проблемы...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 13:53   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
но его идентифкатор будет указывать на последнюю...
ну и что из этого? Об остальных будет помнить тот компонент для которого они были созданы TLabel.Create(self) . В данном случае это видимо форма (self).

Цитата:
менно по этой причине у него и возникают проблемы...
на мой взгляд его проблемы
Цитата:
у всех одинаковые координаты поэтому видим только созданную последней
Цитата:
получается удалить только самую последнюю, и все.
Хотя судя по приведенному коду надо читать создать только самую последнюю.

Цитата:
а как их потом найти (для удаления) смотри похожие темы, там это наверняка было.
Tcomponent + components[] , componentcount
component as Tlabel
component is Tlabel
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.12.2010 в 14:00.
evg_m вне форума Ответить с цитированием
Старый 10.12.2010, 13:59   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Utkin правильный вопрос задал "нафига это все?"
Может listbox использовать вместо всего этого?
А при удалении label-а из середины нужно у нижестоящих изменить свойство Top?
Или всем установить свойство Align:= alTop;? Несерьезно.
_SERGEYX_ вне форума Ответить с цитированием
Старый 10.12.2010, 14:23   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

evg_m, это все понятно . Я не об этом. А о том, что такой рецепт через задний проход. Есть более логичные, простые, а главное понятные (а следовательно и удобные в отладке) пути...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 14:25   #8
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

В первом посте код для примера, я его написал прям здесь, когда пост создавал. В программе я использую немного другой код, но принцип действия тот-же, да и не лабелы я создаю, а кнопки с определенным действием, несколько листбоксов, и еще по мелочи. Компоненты один на одного не налазят, а на первой странице я не вписал расположение TLabel потому, что хотел сделать код примера покороче, чтобы не напрягать читающих ненужными действиями.
Мне попросту нужно понять как удалить все созданные динамические компоненты, а потом я без проблем интегрирую решение в свой код. Конечно можно было-бы выложить весь свой исходник, а потом просто взять готовое решение без малейшего понятия как оно работает, потому что обычно таком случае довольно сложно разобраться в принципе работы.
Jetro вне форума Ответить с цитированием
Старый 10.12.2010, 14:27   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Мой рецепт - использовать массив компонентов.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 10.12.2010, 15:08   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

почитать что такое
Tcomponent + components[] , componentcount
component as Tlabel
component is Tlabel

как удалить объект (наверное Free). компонент то же объект. Об остальном позаботится VCL. точнее Tcomponent.Destroy;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.12.2010 в 17:08.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление динамических объектов / полная очистка формы 095 Общие вопросы Delphi 3 23.04.2012 16:09
Понятия принципа создания динамических объектов Golovastik Общие вопросы C/C++ 25 05.06.2010 21:18
Проблема с созданием динамических объектов. (Delphi7) Dalagardi Помощь студентам 2 15.03.2010 17:15
Имя динамических объектов PVD Общие вопросы Delphi 26 09.02.2010 15:38
Процедуры для динамических объектов Fruit Общие вопросы Delphi 8 30.12.2008 21:10