2016-01-28 114 views
3

我想找到一種方法,所以當我添加一個項目到TListView我可以分配自己的文本顏色(通過匹配其名稱與我輸入到編輯框的名稱)。我得到它的工作,有點,但問題是,當我添加更多,然後2個項目的字體顏色更改爲所有項目。listview和每個項目的自定義字體顏色與delphi

這裏是我的測試代碼:

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; 

有沒有人有什麼想法?

+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; 
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
+1

確定好我得到的總體思路,現在感謝你們倆和雷米感謝阿根糾正的東西對我來說我的拼寫吸誦讀困難是糟糕:( –

+0

太好了,謝謝你的評論 –

相關問題