Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> TComboBox и его элементы. 
V
    Опции темы
omickron
Дата 4.9.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 12.2.2009

Репутация: нет
Всего: 1



Допустим, имеется свой класс
Код

  TMy = class(TObject)
    FList: TStringList;
    constructor Create;
    destructor Destroy; override;
  end;

constructor TMy.Create;
begin
  FList := TStringList.Create;
end;

destructor TMy.Destroy;
begin
  FList.Free;
  inherited;
end;


И компонент TComboBox на форме.

В какой-то момент компонент заполняется набором значений:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 5 do begin
    ComboBox1.AddItem('Item ' + IntToStr(i), TMy.Create);
  end;
end;


А в другой момент компонент очищается от значений.
Код

procedure TForm1.Button2Click(Sender: TObject);
begin
  ComboBox1.Clear;
end;


Фишка в том, что при очищении компонента TComboBox элементам, которые хранятся в его Items:TStrings, не вызывается Free. Таким образом, они остаются висеть в памяти.

Спрашивается: как освободить эту память, не создавая своего наследника TComboBox?
PM MAIL   Вверх
~FoX~
Дата 4.9.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(omickron @  4.9.2011,  12:05 Найти цитируемый пост)
ComboBox1.Clear;

Вызывает только очищение TStringList-а ни более того.
Цитата(omickron @  4.9.2011,  12:05 Найти цитируемый пост)

Спрашивается: как освободить эту память, не создавая своего наследника TComboBox? 

Ты создал N количества объектов, так что будь добр уничтожить их самостоятельно...




--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
omickron
Дата 4.9.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 12.2.2009

Репутация: нет
Всего: 1



Цитата(~FoX~ @  4.9.2011,  11:16 Найти цитируемый пост)
Ты создал N количества объектов, так что будь добр уничтожить их самостоятельно...


Нифига это не правильно. Тот же ObjectList умеет разрушать свои дочерние элементы.

Я покопался в VCL, но, правда, не нашёл ничего, что может мне помочь. Пока прихожу к выводу, что наследник - единственный выход. Например, перекрыть в нём BeforeDestruction.
PM MAIL   Вверх
volvo877
Дата 4.9.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата(omickron @  4.9.2011,  11:51 Найти цитируемый пост)
Нифига это не правильно. Тот же ObjectList умеет разрушать свои дочерние элементы.
Ключевое слово выделено. А теперь см. сюда, и читай: 
Цитата
Note that the list control does not take ownership of this object. That is, if you delete the item, the corresponding object is not freed.


Цитата(omickron @  4.9.2011,  11:51 Найти цитируемый пост)
Я покопался в VCL, но, правда, не нашёл ничего, что может мне помочь.
Плохо копался:
Код
procedure TForm1.Button2Click(Sender: TObject);
var i : Integer;
begin
   for i := 0 to ComboBox1.Items.Count - 1 do
      if ComboBox1.Items.Objects[i] is TMy then
         (ComboBox1.Items.Objects[i] as TMy).Free;

  ComboBox1.Clear;
end;


Это сообщение отредактировал(а) volvo877 - 4.9.2011, 12:15
PM MAIL   Вверх
omickron
  Дата 5.9.2011, 00:07 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 12.2.2009

Репутация: нет
Всего: 1



Да ну, товарищ "эксперт" volvo877 ...
А про свойство TObjectList.OwnsObjects ты слышал? smile Посмотри в реализации в Delphi - если флаг выставлен - для каждого объекта списка вызывается деструктор.
Это я к тому, что не для всех списков актуальна фраза "Ты создал N количества объектов, так что будь добр уничтожить их самостоятельно...".



Цитата(volvo877 @  4.9.2011,  11:59 Найти цитируемый пост)
Плохо копался:
Код

procedure TForm1.Button2Click(Sender: TObject);
var i : Integer;
begin
   for i := 0 to ComboBox1.Items.Count - 1 do
      if ComboBox1.Items.Objects[i] is TMy then
         (ComboBox1.Items.Objects[i] as TMy).Free;
  ComboBox1.Clear;
end


 smile И где же в VCL ты раскопал такой код?  smile 
Неужели "TForm1.Button2Click" - это один из методов предка TComboBox? smile
Спасиб, посмеялся от души  smile 
PM MAIL   Вверх
Keeper89
Дата 5.9.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(omickron @  5.9.2011,  00:07 Найти цитируемый пост)
Это я к тому, что не для всех списков актуальна фраза "Ты создал N количества объектов, так что будь добр уничтожить их самостоятельно...".

Речь шла о ComboBox, а не о каких-то там еще списках.

Цитата(omickron @  5.9.2011,  00:07 Найти цитируемый пост)
И где же в VCL ты раскопал такой код?

Подобное освобождение объектов есть в упомянутым тобой же TObjectList. А что ты видишь из готового для тебя примера только Button2Click действительно смешно smile


--------------------
PM MAIL WWW   Вверх
omickron
Дата 5.9.2011, 15:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 12.2.2009

Репутация: нет
Всего: 1



Цитата(Keeper89 @  5.9.2011,  02:01 Найти цитируемый пост)
Подобное освобождение объектов есть в упомянутым тобой же TObjectList.

Спасибо, я в курсе, как освобождать объекты. Только вот TObjectList как-то не относится к VCL (Visual Component Library) smile Вы, наверно, что-то спутали?
Я спрашивал, может быть, в коде ComboBox или его наследников (тоже в VCL) уже есть возможность освобождать прикреплённые объекты автоматически, но я подобного не нашёл. Думал, может, кто знает.

Цитата(Keeper89 @  5.9.2011,  02:01 Найти цитируемый пост)
Речь шла о ComboBox, а не о каких-то там еще списках.

Дык в самом начале темы я и спрашиваю, может быть, ComboBox сам умеет освобождать прикреплённые объекты, например, как это умеет делать TObjectList? Ведь это гораздо удобнее - взвёл флажок OwnsObjects и не заботишься о памяти. А вместо того, чтобы рисовать какие-то "Button2Click" проще сделать наследника с перекрытым Clear. Собственно, об этом и тема - я полагал, что ComboBox сам должен это уметь, поэтому не хотел дублировать код.

Ну и напоследок, 
Это "Button2Click"-то - "готовый для меня пример"?  smile
Товарищ volvo877 сказал, что я плохо копался в VCL и привёл код, который, очевидно, я в VCL найти не смог. Думаю, подобную чушь никто в VCL не найдёт.
Наверно, по замыслу автора, его должен вызывать сам пользователь? Перед каждым закрытием формы или обновлением списка?  smile 

__________________________________________________________________

Ладно, короче. Пустые дебаты.
Я уже понял, что ComboBox сам не заботится о своих объектах. Похоже, аналогично ListBox. Придётся делать наследников.

Всем спасибо, тема закрыта.  smile 
PM MAIL   Вверх
bems
Дата 6.9.2011, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(omickron @  5.9.2011,  15:45 Найти цитируемый пост)
Всем спасибо, тема закрыта.

Ну закрыта так закрыта. Заодно и ТС отправлен в читальный зал учиться общению.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.