AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VST mehrzeiligen text in Celle zentrieren?

Offene Frage von "richard_boderich"
Ein Thema von richard_boderich · begonnen am 16. Okt 2008 · letzter Beitrag vom 22. Okt 2008
Antwort Antwort
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

VST mehrzeiligen text in Celle zentrieren?

  Alt 16. Okt 2008, 22:49
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;
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#2

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 20. Okt 2008, 19:07
push
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#3

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 09:51
Weis den wirklich keiner wie das funktioniert?
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 10:13
Du meinst vertikal zentrieren? Wo steht denn der Text bei +20?
Sven
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#5

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 10:26
@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;
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 10:54
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
Sven Harazim
--
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#7

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 10:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#8

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 11:34
@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)
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#9

Re: VST mehrzeiligen text in Celle zentrieren?

  Alt 22. Okt 2008, 12:18
Manche Dinge können so einfach sein...

Bei nicht gesetztem toFullRowSelect sollte es aber auch (irgendwie) möglich sein. Mal seh'n ob ich wenigstens das hin kriege...
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:09 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