![]() |
StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
Hallo,
ich möchte die Zellen eines StringGrids mittig zentrieren. Das habe ich bisher so gelöst:
Delphi-Quellcode:
Wenn die Zelle nun aber mehrere Zeilen Text enthält, werden diese durch den Flag "DT_SINGLELINE" jedoch wieder zu einer Zeile vereint.
DrawText(StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]), Length(StringGrid1.Cells[ACol, ARow]), Rect, DT_CENTER OR DT_WORDBREAK OR DT_SINGLELINE OR DT_VCENTER); Wie kann man das Problem beheben? LG, Pussyranger |
AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
So jedenfalls nicht, DT_VCENTER funktioniert laut MSDN nur in Verbindung mit DT_SINGLELINE. Da wirst Du wohl vorher das umgebende Rechteck ermitteln (DT_CALCRECT) und anschließend clippen müssen.
|
AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
Hallo
DT_Vcenter geht nur in Verbindung mit singleline. Du könntest es über das Rect lösen. Mit DT_Calcrect erstmal ausrechnen wie hoch überhaupt gezeichnet wird. Danach dann richtig zeichnen und einfach das rect.top entsprechend anpassen, daß das rect mittig ist. Gruß Frank |
AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, genau so wie ich's wollte! :)
Der Quellcode sieht jetzt so aus:
Delphi-Quellcode:
Jetzt gibt es aber noch ein weiteres Problem:
VAR R1,R2: TRect; Hoehe: integer;
{[...]} R1:=Rect; R2:=Rect; //Höhe des Texts ermitteln Hoehe:=DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), Length(StringGrid1.Cells[ACol, ARow]), R1, DT_CENTER OR DT_WORDBREAK OR DT_CALCRECT); //neue Position des zu zeichnenden Textes berechnen R2.Top:=R2.Top+Round(R2.Height/2)-Round(Hoehe/2); //Zelle färben bzw. "leeren" StringGrid1.Canvas.FillRect(Rect); //neuen Text schreiben DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), Length(StringGrid1.Cells[ACol, ARow]), R2, DT_CENTER OR DT_WORDBREAK); FillRect() überzeichnet nicht die Linien zwischen den Zellen. Die Linien daher noch vom alten Text "befleckt" (siehe Anhang). Was kann man dagegen tun? |
AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
normalerweise würdest Du den Text ja so zeichen
Delphi-Quellcode:
canvas.textout(rect.left+2,rect.top+2,Zelltext);
ohne es probiert zu haben würde ich sagen, daß das was Du siehst aus der Zelle rechts daneben ist und nicht übermalt wird. Pass mal dein Rect an und verschieb rect.left 2 pixel nach rechts. Gruß Frank |
AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
Hab's hinbekommen.
Ich habe nun einfach auf der Linie ein Rechteck mit der Farbe der Linie gezogen. Ist zwar nicht sehr elegant programmiert, aber Hauptsache, es klappt:
Delphi-Quellcode:
Rect.Left:=Rect.Right;
Inc(Rect.Right); StringGrid1.Canvas.Brush.Color:=$F0F0F0; StringGrid1.Canvas.FillRect(Rect); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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