2012-02-24 14 views
7

OnDrawイベントを使用してアイテムをリストに追加するときにアイテムにカスタム色を設定できますが、アイテムが既にリストに入っているときにアイテムの色を変更したいと考えています。実行時のリストアイテムのカラー表示

これを行う方法はありますか?

+0

わかりません。 OnDrawで特定の色を描くことができます。もしそうなら、問題は何ですか? –

+0

@DavidHeffernanリストビューを再描画すると、迷惑なフリッカーが発生するので、そのような機能を実現するための別の方法があるかどうか疑問に思っていました。 – opc0de

+0

なぜRepaintを呼びますか?とにかく、あなたはXY質問をしたようです。あなたが本当にやりたいことは、ちらつきを避けることです。 –

答えて

12

特定のアイテムのみを再描画するには、UpdateItemsメソッドを使用します。これには2つの入力パラメータがあり、そこでは再描画するアイテムの範囲を指定できます。 1つのアイテムのみを再描画する場合は、1つのアイテムインデックスを範囲として指定します。

この例では、アイテムの色をTListItem.Dataプロパティに保存し、タイマーのイベントでこの色をフェードインします。値を変更した後、私はUpdateItems関数を呼び出して、描画項目イベントを強制的に起動します。はい、DoubleBufferedが設定されていないと、ちらつきます(たとえタイマーの間隔を500msに設定しても)。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ListView1.AddItem('Item 1', TObject(clWhite)); 
    ListView1.AddItem('Item 2', TObject(clWhite)); 
    ListView1.AddItem('Item 3', TObject(clWhite)); 
    Timer1.Enabled := True; 
end; 

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView; 
    Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 
begin 
    ListView1.Canvas.Brush.Color := TColor(Item.Data); 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
    C: Byte; 
    I: TColor; 

    procedure ChangeItemColor; 
    begin 
    I := TColor(ListView1.Items[0].Data); 
    C := GetRValue(I); 
    if C < 150 then C := 255 else Dec(C); 
    I := RGB(C, C, C); 
    ListView1.Items[0].Data := TObject(I); 
    end; 

begin 
    // color change 
    ChangeItemColor; 
    // repaint of the item with index 1 
    ListView1.UpdateItems(1, 1); 
end; 
関連する問題