TComboBox с изображением в Firemonkey

Я добавил TImage к стилю TListBoxItem.

Если я добавлю в TListBox, он работает. Если я добавлю в TComboBox, он не работает. Я даже не могу изменить высоту, если элемент в TComboBox.

Вот мой пример кода:

procedure TMainForm.FormCreate(Sender: TObject);
const
  BitmapFile : String = 'F:\testimage.png';
var
  ItemText : TText;
  ItemImage   : TImage;
  ListBoxItem : TListBoxItem;
  button : TButton;
begin

  ListBoxItem := TListBoxItem.Create(nil);
  ListBoxItem.Parent := CBoxHeadMenuLanguage;

  ListBoxItem.StyleLookup := 'ListBoxItemIconStyle';
  ListBoxItem.Height := 50; //just for test

  ItemText := ListBoxItem.FindStyleResource('text') as TText;
  if Assigned(ItemText) then ItemText.Text := 'Hello World!';

  ItemImage := ListBoxItem.FindStyleResource('image') as TImage;
  if Assigned(ItemImage) then If FileExists(BitmapFile) Then ItemImage.Bitmap.LoadFromFile(BitmapFile);
end;

1 ответ

Решение

Вы действительно не должны делать стайлинг в FormCreate, так как стили применяются по мере необходимости и могут быть удалены и применены повторно в любое время.

Вместо этого вам нужно использовать либо событие OnApplyStyleLookup, либо метод ApplyStyle. Я рекомендую создать подкласс TListBox, использовать последний и добавить свойство для хранения растрового изображения.

Объявление класса структуры будет:

type TBitmapLBItem = class(TListBoxItem)
  private
    FBitmap: TBitmap;
  protected
    procedure ApplyStyle;override;
  public
    property Bitmap: TBitmap read FBitmap write SetBitmap;
  end;

Используйте FindStyleResource и т. Д. Как в ApplyStyle, так и в SetBitmap (или создайте общий метод для этого).

А в FormCreate создайте элементы вашего нового класса и установите соответствующие свойства Bitmap.

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

Другие вопросы по тегам