Ниже ни в коем случае не полное решение, но простой пример ответа Дэвида:
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
procedure TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FHighTime: Boolean;
FHighNode: TTreeNode;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
R: TRect;
begin
if Assigned(FHighNode) then begin
FHighTime := not FHighTime;
FHighNode.MakeVisible;
R := FHighNode.DisplayRect(True);
InvalidateRect(TreeView1.Handle, @R, True);
end else begin
if FHighTime then
TreeView1.Invalidate;
FHighTime := False;
Timer1.Enabled := False;
end;
end;
procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
const
Colors: array [Boolean] of TColor = (clWindowText, clWindow);
HiColors: array [Boolean] of TColor = (clHighlightText, clHighlight);
begin
if Node = FHighNode then begin
if cdsSelected in State then
TreeView1.Canvas.Font.Color := HiColors[FHighTime]
else
TreeView1.Canvas.Font.Color := Colors[FHighTime];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// test
FHighNode := TreeView1.Items[2];
Timer1.Enabled := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FHighNode := nil;
end;
Возможно, вы захотите изменить дизайн так, чтобы установка узла подсветки походила на вызов сеттера и т. Д... Но в любом случае, вы поняли идею ..