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/)
-   -   StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren (https://www.delphipraxis.net/163564-stringgrid-zelle-mit-mehreren-zeilen-vertikal-zentrieren.html)

Pussyranger 4. Okt 2011 18:20

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:
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);
Wenn die Zelle nun aber mehrere Zeilen Text enthält, werden diese durch den Flag "DT_SINGLELINE" jedoch wieder zu einer Zeile vereint.
Wie kann man das Problem beheben?
LG,

Pussyranger

DeddyH 4. Okt 2011 18:32

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.

Keldorn 4. Okt 2011 18:34

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

Pussyranger 6. Okt 2011 19:46

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:
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);
Jetzt gibt es aber noch ein weiteres Problem:
FillRect() überzeichnet nicht die Linien zwischen den Zellen. Die Linien daher noch vom alten Text "befleckt" (siehe Anhang).
Was kann man dagegen tun?

Keldorn 6. Okt 2011 20:33

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

Pussyranger 6. Okt 2011 21:25

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 01:43 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