Перейти к содержанию
  • 0
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 отображен:
0001.png.bf0853437e25d59afe15edf28d6b2f33.png

Раскрываю список, bitmaps так же отображаются:
0002.png.1009cda5894b9dbbb7fbbfdff83ec01f.png

Но, как только выбираю один из items, происходит следующее:
0003.png.ed5d07f9a77f609986a9b7bd2090c83e.png
выбранный item не отображается, вообще!

Долго ли, мало ли копался в исходниках TCombobox...

В общем нашел некоторое решение данной проблемы. На событие TComboBox.OnClosePopup повесил код:

begin
  //cbPicture: TCombobox;
  self.cbPicture.Selected.NeedStyleLookup;
  self.cbPicture.NeedStyleLookup;
  self.ApplyStyleLookup;
end;

Результат, выбранный item отображается в TCombobox:
0004.png.2b2db7974dd335b63980b0f4cbf11aac.png

 

Теперь вопрос: Так и должно отрабатывать? Или что-то делаю не так?! Если что-то делаю не так, то как надо делать?

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


Ссылка на сообщение

Рекомендуемые сообщения

Ответы на этот вопрос пока отсутствуют

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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

    • От Morfi
      Ребята, как правильно настроить или реализовать поиск в TCombobox (данные которого связаны через livebinding c БД) при помощи TSearchBox?
    • От Alex Bozhko
      На форму кладём TTabControl с двумя табами. На одном из них помещаем ComboBox.
       
      В процедуре формируем item'ы. Примерно так:
      procedure TForm1.FormCombo(aCombo: TComboBox); var Item: TListBoxItem; i: integer; begin aCombo.BeginUpdate; aCombo.Items.Clear; for I := 0 to 2 do begin Item := TListBoxItem.Create(nil); Item.Text := 'Item '+IntToStr(I); Item.StyleLookup:= 'listboxitemstyle'; Item.Parent := aCombo; end; aCombo.EndUpdate; end; Вызываем при создании формы:
      procedure TForm1.FormCreate(Sender: TObject); begin FormCombo(ComboBox1); ComboBox1.ItemIndex:= 0; end;  и пересоздаем список item'ов после переключения табов.
      procedure TForm1.TabControl1Change(Sender: TObject); begin if TabControl1.TabIndex= 0 then begin FormCombo(ComboBox1); ComboBox1.ItemIndex:= 0; end; end; Естественно, устанавливаем активный item, после того как их список сформирован.
       
      В XE7 всё работает как часы.
      В XE8 - артефакт. После переключения табов активный Item - нулевой, но ComboBox не отображает его значение. Визуально это выглядит так, будто ItemIndex = -1.
       

       
      Проекты для XE7 и XE8 прикрепил.
       
      https://yadi.sk/d/4FGvgF-ti5dWz
    • От PFC
      Есть класс:
      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 было так же.
    • От Nix0N
      Не отображаются кастомные item's при разворачивании списка TComboBox. Нет отображения конкретно в выпадающем списке, в самом TComboBox всё ок.  Пробовал перерисовку во время события onPopup, создание на различных родителях и т.д. - не помогло. Подскажите в чем может быть дело ? Спасибо.
       

       
      Чистый проект прилагается: RAD Studio XE6
      CustomComboBox.zip
  • Последние посетители   0 пользователей онлайн

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

×
×
  • Создать...