Как сделать элемент ListBox заданного цвета? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть несколько файлов в каталоге, где каждый файл имеет две строки, строка 1 - это строка, которую я хочу поместить в свой ListBox, а строка 2 - это цвет фона, который я хочу, чтобы этот элемент ListBox имел ( представлен в виде 8-ди git шестнадцатеричного значения).

Содержимое каждого файла выглядит следующим образом:

string
14603481

Это мой код:

for i := 0 to PathList.Count - 1 do
begin
  FileLines := TStringList.Create;
  try   
    FileLines.LoadFromFile(PathList.Strings[i]);
    s := FileLines[0]; { Loads string to add to ListBox1 }
    RGBColor := FileLines[1];
  finally
    FileLines.Free;
  end;
ListBox1.Items.AddObject(s, TObject(RGBColor)); { This code doesn't work, but hopefully you get what I'm }
end;                                            { trying to do                                           }

Все другие примеры, которые делают что-то похожее на это, объявляют цвет в процедуре DrawItem, но мне нужно установить цвет из этого for l oop, поскольку каждая запись будет иметь уникальный цвет.

Как настроить цвет каждого элемента уникально из этого l oop?

1 Ответ

2 голосов
/ 26 февраля 2020

VCL's TListBox не изначально поддерживает какие-либо раскраски для каждого элемента. Свойства TListBox.Font и TListBox.Color применяются ко всем элементам одинаково.

Чтобы сделать то, что вы просите, вам нужно установить для свойства TListBox.Style значение lbOwnerDrawFixed и затем используйте событие TListBox.OnDrawItem, чтобы вручную нарисовать элементы так, как вы хотите, например:

var
  ...
  s: string;
  RGBColor: Integer;
begin
  ...
  for i := 0 to PathList.Count - 1 do
  begin
    FileLines := TStringList.Create;
    try   
      FileLines.LoadFromFile(PathList[i]);
      s := FileLines[0];
      RGBColor := StrToInt(FileLines[1]);
    finally
      FileLines.Free;
    end;
    ListBox1.Items.AddObject(s, TObject(RGBColor));
  end;
  ...
end;

...

procedure TMyForm.ListBox1DrawItem(Control: TWinControl;
  Index: Integer; const Rect: TRect; State: TOwnerDrawState);
var
  LB: TListBox;
begin
  LB := TListBox(Control);

  if odSelected in State then
  begin
    LB.Canvas.Brush.Color := clHighlight;
    LB.Canvas.Font.Color := clHighlightText;
  end else
  begin
    LB.Canvas.Brush.Color := TColor(Integer(LB.Items.Objects[Index]));
    LB.Canvas.Font.Color := LB.Font.Color;
  end;

  LB.Canvas.FillRect(Rect);
  LB.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, LB.Items[Index]);

  if (odFocused in State) and not (odNoFocusRect in State) then
    LB.Canvas.DrawFocusRect(Rect);
end;
...