Перейти к содержанию

Вопросы

На форму кладём 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.

 

imagejcj.png

 

Проекты для XE7 и XE8 прикрепил.

 

https://yadi.sk/d/4FGvgF-ti5dWz

Отредактировал Brovin Yaroslav

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


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

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

  • 0

Решается если предварительно перед очисткой списка выполнить

Цитата

ComboBox1.ItemIndex:= -1;

 Но, ИМХО, это не верно.

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


Ссылка на сообщение
  • 0
В 7/25/2015в17:10, Alex Bozhko сказал:

Решается если предварительно перед очисткой списка выполнить

Цитата

ComboBox1.ItemIndex:= -1;

 Но, ИМХО, это не верно.

Да. Логично было бы если бы сама очистка устанавливала ItemIndex := -1; т.к. Combobox1.Items[0]  в этот момент перестает существовать. А так приходится это делать самому.

Combobox1 перезаполняется если происходит смена индекса, а в приведенном примере он не меняется (был 0 до очистки, присвоили 0 после очистки).

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


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

Добрый день,

 

Да, ошибку исправлю. Используйте 

ComboBox.Clear;

Вместо:

ComboBox.Items.Clear;

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


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

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

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

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

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

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

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

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

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


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

    • От 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:

       
      Теперь вопрос: Так и должно отрабатывать? Или что-то делаю не так?! Если что-то делаю не так, то как надо делать?
    • От Morfi
      Ребята, как правильно настроить или реализовать поиск в TCombobox (данные которого связаны через livebinding c БД) при помощи TSearchBox?
    • От 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 пользователей онлайн

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

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