Hi.
Hatte ein mich irre machendes Problem mit dem VirtualStringTree für welches ich auch hier im Forum sowie direkt im softGem-Forum keine Hilfe fand.
Da ich aber denke Sinn eines Forums ist auch Lösungen anderen bereit zu stellen (zum anderen wenn ich es vergessen sollte finde ich es nun hier im Forum selber wieder
) hier nun meine Problembeschreibung und Lösung.
Ich wollte einfach "nur" im VirtualStringTree (btw: absolut genial!) in einer Zelle mehrer Grafiken per Draw aus einer Imageliste zeichnen.
Nun war es egal wo ich das plazierte (onBeforeCellPaint, onAfterCellPaint und andere Events versuchte) es kam immer zu einen nicht endenden Loop.
Das Problem war, das ich im Event den DrawingStyle der auch im VST eingetragenen ImageList von dsNormal auf dsTransparent änderte und dann per ImageList.draw zeichnete und nachher wieder zurückstellt.
Dies veranlasst scheinbar VST immer wieder dazur den komplette Tree neu zu zeichnen und somit Loop.
Delphi-Quellcode:
procedure TaForm.tvFilterAfterCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellRect: TRect);
var R : TRect;
s,
value : String;
i : Integer;
begin
if (tvFilter.GetNodeLevel(Node) = 0) then begin
with TargetCanvas do begin
if (Column = 2) then begin
R := CellRect;
FillRect(R);
s := tvFilter.Text[Node, Column];
// ilFilter16.DrawingStyle := dsTransparent; // nie ändern, sonst Loop im Treeview!
for i := 7 downto 1 do begin
value := copy(s,1,pred(pos('/',s))); delete(s,1,pos('/',s));
ilFilter16.Draw(TargetCanvas, R.Left, R.Top, i, True);
inc(R.Left, ilFilter16.Width + 2);
textout(R.Left, R.Top, value);
inc(R.Left, TextWidth(value) + 2);
end;
// ilFilter16.DrawingStyle := dsNormal; // nie ändern, sonst Loop im Treeview!
end;
end;
end;
end;
Grüße aus Kassel.
Konfuzius sprach: Etwas lernen und sich immer wieder darin üben - schafft das nicht auch Befriedigung?