Firemonkey TListBox меняет цвет фона строк элементов во время выполнения

Есть ли способ во время выполнения, кроме использования стилей, изменить цвет фона строк элементов TListBox? Могу ли я использовать событие OnPaint?

Я голосую за закрытие этого вопроса, вы уже публикуете то же самое stackoverflow.com/questions/75196388/…

Bosshoss 26.01.2023 22:47

@Bosshoss На самом деле, это два разных вопроса. Вопрос, на который вы ссылались, задавал общий фон для всего TListBox. Этот вопрос требует отдельного фона для каждого элемента. Хотя это и не упоминается, нужно будет прокручивать элементы и т. д.

Tom Brunberg 27.01.2023 08:57

есть ли причина, по которой вы не хотите использовать Style ?

Bosshoss 27.01.2023 09:50

@Боссхос. ИМО, стили Firemonkey немного сложны. Кроме того, документация очень плохая. Усердно пытаясь настроить свои собственные стили на стандартных компонентах, я не смог добиться желаемого результата, поэтому я сдался. Я предполагаю свою неспособность к этому предмету.

user2383818 27.01.2023 16:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«Могу ли я использовать событие OnPaint

Да, ты можешь. Но, возможно, это не считается ортодоксальным способом, поскольку он недоступен и может развалиться в будущих выпусках Delphi. В любом случае, если вы хотите попробовать, вот:

Вы хотите использовать событие OnPaint класса TListBoxItem. Однако событие OnPaint элемента недоступно в дизайнере, поэтому вам нужно будет добавить его вручную в класс формы.

type
  TForm1 = class(TForm)
    Label1: TLabel;
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    // add following manually (copy & paste)
    procedure ListBoxItemPaint(Sender: TObject; Canvas: TCanvas; 
      const ARect: TRectF);
  private
    { Private declarations }
    procedure PopulateListBox;
  public
    { Public declarations }
  end;

Затем, когда вы добавляете элементы в ListBox1, важно назначить ListBoxItemPaint каждому событию элементов OnPaint (см. конец процедуры):

procedure TForm1.PopulateListBox;
var
  i: integer;
  item: TListBoxItem;
begin
  // Set default item height
  // Individual heights are not possible
  ListBox1.ItemHeight := 48;
  // Set nr of columns, items arranged horizontally first, then vertically
  ListBox1.Columns := 1; // 3;
  // Add items
  for i := 0 to 7 do
  begin
    item := TListBoxItem.Create(nil);
    item.Parent := ListBox1;
    item.Width := Listbox1.Width;
    item.StyledSettings := [];    // You are now responsible for corresponding
                                  // item.TextSettings, e.g. font, style, color etc.
    item.tag := i;
    item.Text := 'Item ' + IntToStr(i);
    item.OnPaint := ListBoxItemPaint;   // This links the OnPaint event to your code
  end;
end;

А это ListBoxItemPaint() процедура:

procedure TForm1.ListBoxItemPaint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var
  Brush: TBrush;
  Color: TAlphaColor;
  Txt: string;
  LocRect: TRectF;
begin
  begin
    Txt := (Sender as TListBoxItem).Text;
    case (Sender as TListBoxItem).Tag of
      0: Color := TAlphaColors.Aliceblue;
      1: Color := TAlphaColors.Antiquewhite;
      2: Color := TAlphaColors.Aqua;
      3: Color := TAlphaColors.Aquamarine;
      4: Color := TAlphaColors.Azure;
      5: Color := TAlphaColors.Beige;
      6: Color := TAlphaColors.Bisque;
    else
         Color := TAlphaColorRec.Chocolate;
    end;

    // Item background, color and shape
    Brush := TBrush.Create(TBrushKind.Solid, Color);
    try
      Canvas.FillRect(ARect, 1, Brush); // rectangular item band
//    alternatively use rounded corners
//      Canvas.FillRect(ARect,11, 11, AllCorners, 1, Brush); // rounded corners
    finally
      Brush.Free;
    end;

    // Text color, font, style and size
    Canvas.Fill.Color := TAlphaColors.Red;
    Canvas.Font.Family := 'Segoe UI';
    Canvas.Font.Style := [TFontStyle.fsBold, TFontStyle.fsItalic];
    Canvas.Font.Size := 16;

    // Item text location and drawing
    LocRect := ARect;
    LocRect.Left := LocRect.Left + 10;
    Canvas.FillText(LocRect, Txt, False, 1, [], TTextAlign.Leading, TTextAlign.Leading);
  end;
end;

Код написан и протестирован с помощью Delphi 10.4 и демонстрирует, как вы можете использовать разные цвета bg для каждого элемента в TListBox.

Чтобы изменить цвет элементов во время выполнения, вам нужно переместить выбор цвета из OnPaint в функцию поиска с логикой выбора, которую вы хотите использовать.

Спасибо. Я учту ваше предупреждение о будущих версиях Delphi.

user2383818 30.01.2023 13:52

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

user2383818 30.01.2023 14:37

Некоторое время назад кто-то еще спросил вас, почему бы не использовать стили, и тогда вы ответили, что не знаете, как использовать стили. В любом случае, это помогает. Я не могу прямо сейчас проверить себя, но, может быть, завтра или послезавтра. Если вы начали, но столкнулись с проблемой, опубликуйте новый вопрос и включите код, который у вас уже есть.

Tom Brunberg 30.01.2023 15:57

Да, по этому поводу я говорил об использовании стилей во время разработки, теперь я говорю об использовании во время выполнения.

user2383818 30.01.2023 18:18

Через пару дней я проверю, не публиковали ли вы какие-либо комментарии относительно использования стилей во время выполнения. Спасибо.

user2383818 30.01.2023 18:26

Хммм, я повторяю то, что сказал в своем предыдущем комментарии: опубликуйте новый вопрос и включите код, который у вас есть. Я не вижу ни одного нового вопроса, отправленного вами.

Tom Brunberg 04.02.2023 11:08

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