Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Ich habe einige fragen zu VirtualStringTree

  Alt 19. Okt 2014, 13:18
Hi Wishmaster,

1# wie kann ich die Edit Box selbst zeichnen / verschieben?
die EditBox (TEdit) sollte bei dir per CreateEditor Event erstellt werden. Die Positionierung des Editfeldes wird dann in deiner EditorsClass (oder wie auch immer du sie genannt hast), welche das Interface IVTEditLink implementiert, vorgenommen. Und zwar in der Procedure SetBounds(). Dort kannst du dann die Position Rect.Left verändern.

Falls du hiermit Probleme haben solltest, kann ich dir auch mal ein einfaches Beispiel schicken.

Ich male die icons und den text selbst.
Aus welchem Grund? Der Tree malt doch schon alles für dich und achtet auch auf Icons und sonstigen Kram. Wenn du unterschiedliche Fonts in einer Zelle haben willst, musst den Text natürlich selbst zeichnen, die Icons können weiterhin vom Tree gemalt werden. Am Besten machst du das dann per DrawText Event. Wenn es nur eine Zelle betrifft, dann reicht das PaintText Event.

2# gibt es eine möglichkeit die selection selbst zu zeichnen?
wenn ich nicht "toUseBlendedSelection" benutze ist das icon nicht sichtbar.
Die Frage ist zwar warum du es nicht benutzt, aber das ist ja dir überlassen. Zeichnen kannst du die Selektion natürlich auch selbst. Schalte hierfür am Besten die Option toAlwaysHideSelection in den TreeOptions --> PaintOptions ein, damit die eigene Selektion vom Tree schonmal nicht gemalt wird. Ab dann kannst du diese selbst zeichnen. Am Besten im OnBeforeCellPaint Event, da dieses das Event ist, dass vor allen anderen "wichtigen" Zeichnungs Events ausgelöst wird.
So sollte es z.B. funktionieren:
Delphi-Quellcode:
procedure TfrmMain.vst1BeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
begin
  TargetCanvas.Brush.Color := vst1.Colors.FocusedSelectionColor;
  TargetCanvas.FillRect(CellRect);
end;
Dann musst du natürlich noch abfragen, ob diese Node die gerade gezeichnet wird auch die FocusedNode ist bzw. ob diese "selected" ist. Oder du merkst dir die zu malende Node in einer Variablen.

Wenn du weitere Fragen hast, dann nur her damit.

PS.: Schau dir mal in der Hilfe zum Tree (die PDF Datei nicht die CHM Datei) Seite 36ff an. Dort findest du eine Übersicht über den Ablauf aller PaintEvents.

Hier mal die Kurzübersicht:
Zitat von VST Hilfe:
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