Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST TVirtualStringTree Grafiken in Zelle zeichnen, Loop (https://www.delphipraxis.net/66959-vst-tvirtualstringtree-grafiken-zelle-zeichnen-loop.html)

Pichel 7. Apr 2006 05:57


VST TVirtualStringTree Grafiken in Zelle zeichnen, Loop
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz