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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2015, 12:40   #1
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию Удаление динамически созданных объектов [Ловлю ошибки]

Всем привет!
Есть у меня на форме TStrigGrid, у него описано onDrawCell, в котором, среди прочего, реализована динамическая отрисовка TLabel при совпадении условий.
Все корректно отрабатывает при первой отрисовке.

Потом я меня входные условия и весь грид должен быть очищен и перерисован. В том числе должны быть убиты все нанесенные на него TLabel и нарисованы новые в нужных местах.

Так вот, как я это делаю...
Создание Tlabel:
Код:
procedure TBookingWindow.RightGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Lbl: Tlabel;
  itm, preitm: BronData;
begin
  //... some actions
  lbl:= Tlabel.Create(RightGrid);
  lbl.Parent:= RightGrid;
  lbl.Left:= Rect.Left+18;
  lbl.Top:= Rect.Top;
  lbl.Caption:= '№'+ itm^.bnumber;
  //... some other actions
Вот так я его хочу убивать:
Код:
procedure TBookingWindow.KillAllLAbels;
var
  h:integer;
begin
  for h := 1 to RightGrid.ComponentCount-1 do
    begin
      if RightGrid.Components[h]<> nil then
        if RightGrid.Components[h] is TLabel then
           RightGrid.Components[h].Destroy;
    end;
end;
Собственно в чем у меня веселье заключается- RightGrid.ComponentCount-1 каждый раз разное число возвращает.
И самое странное, что RightGrid.Components[h] частенько обращается к элементу с несуществующим индексом. т.е. к 75, к примеру, и получаю ошибку выхода за границы. При этом ComponentCount=223.

Мне стало интересно и я заметил, что все ошибки генерируются ровно на отметке (ComponentCount div 2) и выше.
я прописал в условии
Код:
for h := 1 to (RightGrid.ComponentCount div 2)-1 do
и ошибка выхода за границы не возникает.... НО Лэйблы не удаляются(
Если раза 4-5 нажать на кнопку, то года они начнут по одному удаляться и к 8 разу в итоге у меня все старые пропадают.

Прошу мне подсказать где я допустил ошибку и как правильно эту задумку сделать- удалять старые лэйблы.
Dee63 вне форума Ответить с цитированием
Старый 13.04.2015, 13:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тебе посоветую использовать класс TComponentList.
Код:
procedure TBookingWindow.RightGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Lbl: Tlabel;
  itm, preitm: BronData;
begin
  //... some actions
  lbl:= Tlabel.Create(RightGrid);
  lbl.Parent:= RightGrid;
  lbl.Left:= Rect.Left+18;
  lbl.Top:= Rect.Top;
  lbl.Caption:= '№'+ itm^.bnumber;
  
 MyList.Add(lbl);
И уже MyList.Clear сам по идее освободит все добавленные в него компоненты. Даже цикла не надо. Почитай подробнее про него в хелпе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2015, 15:37   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Код:
for h := RightGrid.ComponentCount - 1 downto 0 do
phomm вне форума Ответить с цитированием
Старый 14.04.2015, 08:27   #4
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я тебе посоветую использовать класс TComponentList.
Код:
procedure TBookingWindow.RightGridDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Lbl: Tlabel;
  itm, preitm: BronData;
begin
  //... some actions
  lbl:= Tlabel.Create(RightGrid);
  lbl.Parent:= RightGrid;
  lbl.Left:= Rect.Left+18;
  lbl.Top:= Rect.Top;
  lbl.Caption:= '№'+ itm^.bnumber;
  
 MyList.Add(lbl);
И уже MyList.Clear сам по идее освободит все добавленные в него компоненты. Даже цикла не надо. Почитай подробнее про него в хелпе.
Да, это прекрасно работает.
Спасибо!
Dee63 вне форума Ответить с цитированием
Старый 14.04.2015, 08:45   #5
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

И зачем тут лейбл?
lomastr_ вне форума Ответить с цитированием
Старый 14.04.2015, 09:33   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от lomastr_ Посмотреть сообщение
И зачем тут лейбл?
первый пост не читали? Автор темы создаёт лейблы динамически.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.04.2015, 10:01   #7
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

читали, потому и вопрос
lomastr_ вне форума Ответить с цитированием
Старый 14.04.2015, 11:17   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Серж, он имел ввиду что в Гриде можно текст отрисовывать, вместо лепнины из лейбочек. Но ввиду ограниченного лексикона, подвластного полной мере только госпоже Щукиной, как всегда у нашего недалекого друга посты превратились в кашу. Просто не обращай внимание.
И на следующий его "бэк" по поводу моего поста тоже
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.04.2015, 15:19   #9
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
что в Гриде можно текст отрисовывать
автор и так уже "рисует" см. RightGridDrawCell, так что ваш выпад про лексикон мимо кассы, надо просто читать а не давать сходу ненужные советы, как в #1.
lomastr_ вне форума Ответить с цитированием
Старый 14.04.2015, 15:48   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
надо просто читать
Это говорит человек, который свои же советы не соблюдает... Ржу. И удивляюсь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик динамически созданных объектов Cruzel C++ Builder 1 09.06.2014 05:39
перетаскивание динамически созданных объектов kaizer131 Общие вопросы Delphi 13 15.06.2011 07:59
Сохранение динамически созданных объектов Marsel737 Общие вопросы Delphi 25 15.12.2009 14:24
Свойства динамически созданных объектов. Dorithur Общие вопросы Delphi 4 12.12.2009 15:35