如何使 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.Font
和 TListBox.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;
我在一个目录中有许多文件,其中每个文件有两行,第 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.Font
和 TListBox.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;