AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls VST Icons im AfterItemPaint in Zelle malen zusammen mit DragDrop des Headers

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

Ein Thema von Bünni · begonnen am 14. Mär 2019 · letzter Beitrag vom 14. Mär 2019
Antwort Antwort
Bünni

Registriert seit: 4. Mär 2019
24 Beiträge
 
#1

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

  Alt 14. Mär 2019, 21:46
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?
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.367 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

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

  Alt 14. Mär 2019, 22:40
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.
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
24 Beiträge
 
#3

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

  Alt 14. Mär 2019, 22:42
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.367 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

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

  Alt 14. Mär 2019, 22:46
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.

procedure vstGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer);
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
24 Beiträge
 
#5

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

  Alt 14. Mär 2019, 22:48
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.367 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

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

  Alt 14. Mär 2019, 22:53
OnAfterItemPaint benutzt man eigentlich recht selten.

Anbei mal die Reihenfolge der Events (Auszug aus der Hilfe des VST):
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)
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
24 Beiträge
 
#7

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

  Alt 14. Mär 2019, 22:58
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.367 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

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

  Alt 14. Mär 2019, 23:03
Die richtigen Events für den richtigen Zweck zu nutzen bringt eben diverse Vorteile
  Mit Zitat antworten Zitat
Bünni

Registriert seit: 4. Mär 2019
24 Beiträge
 
#9

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

  Alt 14. Mär 2019, 23:10
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf