如何使 ListBox 项目具有给定的颜色?

How to make a ListBox item a given color?

我在一个目录中有许多文件,其中每个文件有两行,第 1 行是我要放入我的 ListBox 的字符串,第 2 行是我希望该 ListBox 项目的背景颜色有(表示为 8 位十六进制值)。

每个文件的内容如下所示:

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 循环中设置颜色,因为每个条目都有一个唯一的颜色.

如何在此循环中唯一地设置每个项目的颜色?

VCL 的 TListBox 本身 不支持任何类型的逐项着色。 TListBox.FontTListBox.Color 属性同样适用于所有项目。

要执行您要求的操作,您必须设置 TListBox.Style property to lbOwnerDrawFixed and then use the 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;