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

时间:2016-01-28 16:16:24

标签: delphi

我正试图找到一种方法,所以当我向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;

有没有人有任何想法?

2 个答案:

答案 0 :(得分:3)

您没有为与您的文字不匹配的列表项重置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;

答案 1 :(得分:0)

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;

问题是当if条件为False时会发生什么。您没有指定字体颜色和样式,因此画布的状态保持原样。您需要执行以下操作:

  1. 对于列表中的每个项目,您必须记住项目的颜色和样式。
  2. 调用ListCustomDrawItem时,必须将画布颜色和样式指定为您在步骤1中记住的值。