![]() |
VST mehrzeiligen text in Celle zentrieren?
Hallo zusammen!
Ich brüte jetzt schon ne ganze weile herum, wie ich einen mehrzeiligen Text in einer VST Node mit selbstdefinierter Nodeheight zentrieren kann. Die Nodeheight berechne ich so. Ich bekomme es einfach nicht hin. Wenn ich die +20 weg lasse, dann ist der Text zwar zentriert, aber ich habe oben und unten nicht meinen gewünschten margin zum Noderand. DIe VST Hilfe schweigt sich auch wieder mal aus und verweist nur auf irgendwelche Internetquellen. Ich hatte dort was zur Marginstyle gefunden, was ich eventuell auch als Lösung anbieten würde.
Delphi-Quellcode:
procedure TForm1.vstMeasureItem(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); var Data: TMyData; begin Data:=TMyData(vst.GetNodeData(node)^ ); nodeheight:=vst.ComputeNodeHeight(targetcanvas,node,1,Data.Meldung) + 20; //+20 um die Node größer zu machen end; |
Re: VST mehrzeiligen text in Celle zentrieren?
push
|
Re: VST mehrzeiligen text in Celle zentrieren?
Weis den wirklich keiner wie das funktioniert?
|
Re: VST mehrzeiligen text in Celle zentrieren?
Du meinst vertikal zentrieren? Wo steht denn der Text bei +20?
Sven |
Re: VST mehrzeiligen text in Celle zentrieren?
@sh17
Er steht immer oben direkt am Anfang. Ich will ihn aber vertikal Zenriert. Normalerweise kalkuliert er über das Ereignis onMeasureItem ja automatisch die Nodeheight, sodas die Zellenhöhe dem Text angepasst wird. Ich habe diesen Wert dann einfach noch was hinzuadiert, weil ich über und unter dem Text noch einen Abstand will. Auch habe ich versucht im onbeforecellpaint selber zu Zeichen, jedoch Zeichnet er dann alles in der selben Zeile. Von OG Karotte habe ich diesen Codeschnipsel bekommen, jedoch muss bei VST irgendwas an den Ereignisroutinen geädert worden sein. Bei der aktuelle Version sind verschiedene Parameter in der Ereignisroutine nicht mehr verfügbar
Delphi-Quellcode:
procedure TfrmMain.MyVSTBeforeCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node:
PVirtualNode; ItemRect: TRect; var CustomDraw: Boolean); //var Customdraw existiert bei mir nicht. var S: WideString; MyData: PTMyNodeData; TheRect: TRect; begin MyNodeData := Sender.GetNodeData(Node); // Daten holen S := System.Copy(MyNodeData.Text, 1, Length(MyNodeData.Text)); // Text holen // <-- hier Berechnung für TheRect (Ausmasse der zubefüllenden Zelle; müsste ItemRect entspr.) einfügen Windows.DrawTextW(TargetCanvas.Handle, PWideChar(S), Length(S), TheRect, DT_EXPANDTABS or DT_SINGLELINE or DT_END_ELLIPSIS or DT_CENTER or DrawTextBiDiModeFlagsReadingOnly); // Text ausgeben (DT_CENTER => Zentriert im 'TheRect') CustomDraw := True; // Damit der VST die Zelle nicht nochmal zeichnet ??? end; |
Re: VST mehrzeiligen text in Celle zentrieren?
Also die + 20 kannst Du na drin stehen lassen, wenn die der Abstand an sich reicht.
Den Margin-Top änderst Du dann über procedure TDBAdressViewFrame1.VDBGridBeforeCellPaint( Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); begin ContentRect.Top := ContentRect.Top +5; end; Probiers mal aus Grüße, Sven |
Re: VST mehrzeiligen text in Celle zentrieren?
Hallo Richard,
ich habe mittlerweile auch noch ein wenig recherchiert und festgestellt, das das ganze nicht so einfach ist. Mein Codeschnipsel ist eigentlich für eine Anpassung des Headers gewesen. Leider funktioniert das ganze nicht für die Zelle. Die Textausgabe-Routine der Zelle scheint den Text immer von der Top-Position aus zu zeichnen. Somit sorry für den evtl. falschen Ansatz (Code). Ich selbst benötige mittlerweile aber auch eine entspr. Lösung und vielleicht kommen wir ja gemeinsam auf eine solche. |
Re: VST mehrzeiligen text in Celle zentrieren?
@OG Karotte
Ich glaube ich hab es jetzt gelöst. Folgender Code von mir zentriert mehrzeiligen Text vertikal in der jeweiligen Zelle. Bitte mal gegentesten. Danke an sh17 für seinen Hinweis auf die Lösung. Contentrect war das Stichwort.
Delphi-Quellcode:
//Edit
procedure TForm1.vstBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect); var Data: TMyData; textheight: Integer; differenz: Integer; begin Data:=TMyData(vst.GetNodeData(node)^ ); textheight:=vst.ComputeNodeHeight(targetcanvas,node,1,Data.Meldung); differenz:=((Cellrect.Bottom-cellrect.Top)-textheight) div 2; contentrect.Top:=contentrect.Top+differenz; end; Ergänzungen der Code funktioniert nur mit Full Row select option des VST! Bei normalem Select ergeben sich unschöne Effekte (Es wird nur Contentrect selektiert, und nicht die komplette Zelle) |
Re: VST mehrzeiligen text in Celle zentrieren?
Manche Dinge können so einfach sein... :wall:
Bei nicht gesetztem toFullRowSelect sollte es aber auch (irgendwie) möglich sein. Mal seh'n ob ich wenigstens das hin kriege... :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz