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 mehrzeiligen text in Celle zentrieren? (https://www.delphipraxis.net/122477-vst-mehrzeiligen-text-celle-zentrieren.html)

richard_boderich 16. Okt 2008 21:49


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;

richard_boderich 20. Okt 2008 18:07

Re: VST mehrzeiligen text in Celle zentrieren?
 
push

richard_boderich 22. Okt 2008 08:51

Re: VST mehrzeiligen text in Celle zentrieren?
 
Weis den wirklich keiner wie das funktioniert?

sh17 22. Okt 2008 09:13

Re: VST mehrzeiligen text in Celle zentrieren?
 
Du meinst vertikal zentrieren? Wo steht denn der Text bei +20?
Sven

richard_boderich 22. Okt 2008 09:26

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;

sh17 22. Okt 2008 09:54

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

OG Karotte 22. Okt 2008 09:57

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.

richard_boderich 22. Okt 2008 10:34

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:
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;
//Edit
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)

OG Karotte 22. Okt 2008 11:18

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 06:54 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