gpt4 book ai didi

delphi - 使用 delphi 的 ListView 和每个项目的自定义字体颜色

转载 作者:行者123 更新时间:2023-12-03 15:54:06 24 4
gpt4 key购买 nike

我正在尝试找到一种方法,以便当我将项目添加到 TListView 时,我可以分配它自己的文本颜色(通过将其名称与我在编辑框中输入的名称相匹配)。我已经让它工作了,但问题是当我添加超过 2 个项目时,所有项目的字体颜色都会更改。

这是我的测试代码:

procedure TMainForm.ListCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Edit2.Text = Item.Caption then // match my name with item name
begin
Sender.Canvas.Font.Color := Font.Font.Color; // assign from font dialogue
Sender.Canvas.Font.Style := Font.Font.Style; // assign from font dialogue
end;
end;

有人有什么想法吗?

最佳答案

您不会为与您的文本不匹配的列表项重置 ListView 的 Canvas.Font 参数。

procedure TMainForm.ListCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Edit2.Text = Item.Caption then
begin
Sender.Canvas.Font.Color := Font.Font.Color;
Sender.Canvas.Font.Style := Font.Font.Style;
end else begin
// add this...
Sender.Canvas.Font.Color := Sender.Font.Color;
Sender.Canvas.Font.Style := Sender.Font.Style;
end;
end;

话虽这么说,如果您提前知道要使用的颜色,设置每个项目颜色的另一种方法是从 TListItem 派生一个新类并添加您自己的 Font 属性,然后您可以在绘图过程中使用它。

type
TMyListItem = class(TListItem)
private
fFont: TFont;
procedure FontChanged(Sender: TObject);
procedure SetFont(AValue: TFont);
public
constructor Create(AOwner: TListItems); override;
destructor Destroy; override;
property Font: TFont read fFont write SetFont;
end;

constructor TMyListItem.Create(AOwner: TListItems);
begin
inherited;
fFont := TFont.Create;
fFont.OnChange := FontChanged;
end;

destructor TMyListItem.Destroy;
begin
fFont.Free;
inherited;
end;

procedure TMyListItem.FontChanged(Sender: TObject);
begin
Update;
end;

procedure TMyListItem.SetFont(AValue: TFont);
begin
fFont.Assign(AValue);
end;

// OnCreateItemClass event handler
procedure TMainForm.ListCreateItemClass(Sender: TCustomListView; var ItemClass: TListItemClass);
begin
ItemClass := TMyListItem;
end;

procedure TMainForm.ListCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
Sender.Canvas.Font := TMyListItem(Item).Font;
end;

...

var
Item: TMyListItem;
begin
...
Item := TMyListItem(List.Items.Add);
Item.Caption := ...;
if Edit2.Text = Item.Caption then
Item.Font := Font.Font // assign from font dialogue
else
Item.Font := List.Font; // assign from listview
...
end;

关于delphi - 使用 delphi 的 ListView 和每个项目的自定义字体颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35066512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com