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/)
-   -   VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers (https://www.delphipraxis.net/200052-vst-icons-im-afteritempaint-zelle-malen-zusammen-mit-dragdrop-des-headers.html)

Bünni 14. Mär 2019 20:46

VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Das Malen der Icons ist kein Problem.
Code verkürzt. Alles Unwichtige ist raus
Delphi-Quellcode:
procedure TKSTData.VSTAfterItemPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect);
var
 R: TRect;
 IconPosLeft, IconPosTop: Integer;
begin
 R := ItemRect;

 // IconList ist eine PNGImageList dessen Height-Eigenschaft ich auslese um zu wissen, wie hoch mein Icon ist

 IconPosTop := (R.Height div 2) - (IconList.Height div 2); // Icon in der Y-Achse zentriert anordnen
 IconPosLeft := R.Left + IconList.Width - 3; // Icon in der X-Achse etwas weiter links anordnen, nicht zentriert
 IconList.Draw(TargetCanvas, IconPosLeft, IconPosTop, 1);
end;
Wie bewege ich den VirtualStringTree nun dazu, die Bilder in die richtige Zelle zu malen, wenn hoDrag der Header-Optionen aktiviert ist und man die Headeranordnung vertauscht?

Aviator 14. Mär 2019 21:40

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Ich glaube du solltest dir die Events des VSTs besser anschauen. Da gibt es OnGetImageIndex für die erste Column. Dann gibt es OnBeforeCellPaint und OnAfterCellPaint. Die werden jeweils für eine Zelle aufgerufen und geben auch den ColumnIndex mit der sich auch nach dem Verschieben der Columns nicht ändert. OnAfterItemPaint ist hier definitiv das falsche Event.

Bünni 14. Mär 2019 21:42

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Zitat:

der sich auch nach dem Verschieben der Columns nicht ändert
Das war die Information die ich brauchte. Ich frage jetzt VST.Header.Columns[0].Left ab und nicht mehr R.Left.

Lohnt sich ein Umbau auf GetImageIndex? Denn ich male mehrere Bilder in die erste Zelle. Nicht nur eines.

Aviator 14. Mär 2019 21:46

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
OnGetImageIndex ist ein Event dem du nur den ImageIndex aus der zugewiesenen ImageList gibst. Dort kann ein Image pro Column/Zelle gezeichnet/angegeben werden. Um schnell ein Image im VST anzuzeigen ist das definitiv einfacher. Wenn du die Position aber bspw. je nach Länge des Texts anpassen willst, dann solltest du OnBeforeCellPaint oder OnAfterCellPaint nutzen.

EDIT: Ich hatte mich bei meiner erste Antwort vertan.

Delphi-Quellcode:
procedure vstGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);

Bünni 14. Mär 2019 21:48

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
OnAfterCellPaint (mit Abfrage, ob ich in der richtigem Column bin) statt OnAfterItemPaint?
Da ich mehrere Icons pro Zelle zeichne, brauche ich OnGetImageIndex dann ja wohl nicht.

Aviator 14. Mär 2019 21:53

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
OnAfterItemPaint benutzt man eigentlich recht selten.

Anbei mal die Reihenfolge der Events (Auszug aus der Hilfe des VST):
Zitat:

Zitat von Zitat von PaintEvents:
Usually the following paint stages are executed during a paint cycle:
  • before paint (OnBeforePaint)
  • before item paint (OnBeforeItemPaint)
  • before item erase (OnBeforeItemErase)
  • after item erase (OnAfterItemErase)
  • before cell draw (OnBeforeCellPaint)
  • on paint text (string trees only, OnPaintText)
  • after cell draw (OnAfterCellPaint)
  • after item paint (OnAfterItemPaint)
  • after paint (OnAfterPaint)


Bünni 14. Mär 2019 21:58

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Habe gerade eben den Code auf das AfterCellPaint-Event umgebaut.
Hier eine kleine Änderung und dort und alles arbeitet perfekt.

Dort kann ich nun auch abfragen, in welche Zelle ich bin und auch nur dann den Code ausführen. Ich schätze, dass das auch Performancevorteile mit sich bringen könnte.

Aviator 14. Mär 2019 22:03

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Die richtigen Events für den richtigen Zweck zu nutzen bringt eben diverse Vorteile ;)

Bünni 14. Mär 2019 22:10

AW: VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers
 
Im OnAfterItemPaint hatte ich kurzzeitig eine Variante, die sogar das gewünschte Ergebnis brachte.
Dabei habe ich VST.Header.Columns[0].Left abgerufen und so erfahren, wo sich meine erste Zelle befindet.
Hat geklappt. Vorher wurden die Icons vermutlich auch so oft pro Node gezeichnet wie das VST Columns hat. Aber die jetzige Lösung ist um Welten besser, da ich auch die Column abfragen kann und so gezielt zeichnen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 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