• 0
PFC

Почему при очистке элементов у TComboBox, не удаляются пользовательские объекты, прикрепленные к итемам?

Вопросы

Есть класс:

class TMyObjectInt : public TObject
{
private:
     int Value;
public:
     __fastcall TMyObjectInt (int _Value);
     __fastcall ~TMyObjectInt();
};

Есть ComboBox:

for (int i = 1; i <= 10; i++)
	cbxItems->Items->AddObject(IntToStr(i), new TMyObjectInt(i));

Почему при вызове ->Clear() не вызываются деструкторы для TObject'ов? Казалось бы базовый TObject замечательно для этого подходит, даже деструктор у него виртуальным объявлен.

Я могу написать свою функцию очистки, но это потенциально приводит к ошибкам, особенно если я отдаю указатель на ComboBox за пределы своей формы.

 

Кстати, так же ведут себя и многие другие контролы, да и в VCL было так же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 ответ на этот вопрос

  • 0
  1. Потому что лучше очищать пользовательские объекты, так как это потенциально снижает варианты использования списков. Так как в качестве такого объекта может выступать все что угодно. Начиная от простых объектов, как у вас, и заканчивая "тяжелыми" объектами коннектами, источниками данных и тд. В этом случае вам придется делать дубликаты ваших данных или использовать более умные варианты прокси объектов для доступа к единому источнику данных.
  2. Используемый для хранения итемов TStringList не подразумевает очистку хранимых в нем объектов. Для этого есть другой список TObjectList, но он не используется по причине первого пункта.
  3. Если вы хотите отследить момент удаления объекта, для исключения его из списка. Вы можете воспользоваться интерфейсом IFreeNotification

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От Mars M
      Второй день голову ломаю, без помощи не обойтись 
      Делаю компонент, что то типа таблицы, нужно добавлять колонки и что бы они отображались в редакторе как вложенные в основной компонент.
      Вот как например у стринггрида

      Нужно разумеется не для красоты а что бы редактировать их свойства.
      Если можно пример в виде кода или хоть в какую сторону смотреть.
    • От Alex7wrt
      Добрый день
      Столкнулся с такой задачей:
      Существует несколько TObjectList<TRectangle>. При создании каждого из них  AOwnsObjects задано как True. 
      RectList[i]:=TObjectList<TRectangle>.Create(True); ............ Nrect:=TRectangle.Create(nil); Nrect.Parent:=Form1; RectList[i].Add(Nrect); Существует ли способ определить, к какому из  TObjectList принадлежит элемент? 
    • От Morfi
      Столкнулся с такой проблемой:
      Есть форма с TComboBox. Стиль форме (один из тех, который поставляется из коробки) задаю в run-time:
      procedure TFormEditorRoomAttribute.FormCreate(Sender: TObject); begin inherited; self.StyleBook := uAccommodationInventory.ReferenceAccommodationInventoryForm.StyleBook; end; Необходимо, чтобы TComboBox отображал items c bitmap. Заполняю TComboBox.ListBox так же в run-time (TListBoxItem.StyleLookup := 'listboxitemleftdetail'):
      var I: integer; FListBoxItem: TListBoxItem; begin //cbPicture: TCombobox; Self.cbPicture.BeginUpdate; Self.FRoomAttributePictures := ConnectionModule.DSServerModuleAccommodationClient.GetRoomAttributePictures; for I := 0 to Self.FRoomAttributePictures.Count - 1 do begin FListBoxItem := TListBoxItem.Create(Self.cbPicture); FListBoxItem.TagObject:= Self.FRoomAttributePictures[i]; FListBoxItem.ItemData.Text := Self.FRoomAttributePictures[i].ID.ToString; FListBoxItem.ItemData.Bitmap := Self.FRoomAttributePictures[i].GetBitmap; FListBoxItem.StyleLookup := 'listboxitemleftdetail'; Self.cbPicture.AddObject(FListBoxItem); end; Self.cbPicture.EndUpdate; end; TComboBox.DropDownKind выставляю в "Custom".
      Вроде как всё готово. Но получается вот такая картина.
      Создаю и отображаю форму, bitmap в TCombobox отображен:

      Раскрываю список, bitmaps так же отображаются:

      Но, как только выбираю один из items, происходит следующее:

      выбранный item не отображается, вообще!
      Долго ли, мало ли копался в исходниках TCombobox...
      В общем нашел некоторое решение данной проблемы. На событие TComboBox.OnClosePopup повесил код:
      begin //cbPicture: TCombobox; self.cbPicture.Selected.NeedStyleLookup; self.cbPicture.NeedStyleLookup; self.ApplyStyleLookup; end; Результат, выбранный item отображается в TCombobox:

       
      Теперь вопрос: Так и должно отрабатывать? Или что-то делаю не так?! Если что-то делаю не так, то как надо делать?
    • От Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • От Pulsarius
      Здравствуйте, Ярослав! Скажите, пожалуйста, есть ли какая либо информация о планах поддержки Linux в C++ Builder? Нашей компании очень подходит RAD Studio для наших целей и быстрой разработки. Планируем приобрести лицензию. В ближайшее время планируем разрабатывать наше решение для Windows, macOS и Android, пока этого достаточно. Но есть некоторые сомнения о выборе RAD Studio и всё из-за того, что примерно через год потребуется наше решение реализовать и для Linux. Какова вероятность, что C++ Builder обзаведётся поддержкой Linux'а в течении 1 - 1,5 года? Delphi не рассматриваем. Заранее спасибо за ответ.
    • От Pulsarius
      Здравствуйте! Очень нужна помощь с TIdTCPServer или возможно моя задача решается каким-то другим компонентом или библиотекой. В общем, мне нужно получить с сокета не только данные, но и весь пакет целиком, т.е. со всеми TCP и IP заголовками. Возможно ли сделать это через TIdTCPServer? Конечно можно на C++ самостоятельно реализовать TCP/IP стек, но не хотелось бы терять на это время и "изобретать велосипед" в очередной раз. А конкретнее мне нужно получить весь TCP/IP пакет с заголовками и данными, запаковать его ещё в PPP и отправить на COM порт, чтобы добиться некого аналога виндового стандартного телефонного модема (Dial In). Буду благодарен за какую-либо помощь!
    • От Pulsarius
      Всем привет! Кто-нибудь может подсказать как можно удалить ссылку в проекте на неиспользуемую статичную либу, чтобы она не линковалась к исполняемому файлу? Обыскал всё в настройках проекта, так и не смог найти. Дело в том, что я как-то в FMX проекте использовал невизуальный VCL компонент, добавленный через дизайнер форм. Потом я его удалил, но линковщик всё равно линкует в exe-шник библиотеки типа vcl.lib, vclx.lib, что абсолютно напрасно увеличивает размер исполняемого файла.
    • От Morfi
      Ребята, как правильно настроить или реализовать поиск в TCombobox (данные которого связаны через livebinding c БД) при помощи TSearchBox?
    • От Pulsarius
      Здравствуйте!
      Может кто-нибудь уже проходил через подобное и знает как это реализовать и подскажет. Мне нужно программно создать виртуальный модем и входящее подключение через него. Ну или хотя бы через командную строку. Пробовал через RAS API, но получается не то, что мне нужно. Вот визуализация того, что мне нужно проделать:
       
    • От rakhmet
      Есть ли способ в FM узнать количество видимых Items у TListView?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу