7
OnDrawイベントを使用してアイテムをリストに追加するときにアイテムにカスタム色を設定できますが、アイテムが既にリストに入っているときにアイテムの色を変更したいと考えています。実行時のリストアイテムのカラー表示
これを行う方法はありますか?
OnDrawイベントを使用してアイテムをリストに追加するときにアイテムにカスタム色を設定できますが、アイテムが既にリストに入っているときにアイテムの色を変更したいと考えています。実行時のリストアイテムのカラー表示
これを行う方法はありますか?
特定のアイテムのみを再描画するには、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;
わかりません。 OnDrawで特定の色を描くことができます。もしそうなら、問題は何ですか? –
@DavidHeffernanリストビューを再描画すると、迷惑なフリッカーが発生するので、そのような機能を実現するための別の方法があるかどうか疑問に思っていました。 – opc0de
なぜRepaintを呼びますか?とにかく、あなたはXY質問をしたようです。あなたが本当にやりたいことは、ちらつきを避けることです。 –