AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

Ein Thema von Pussyranger · begonnen am 4. Okt 2011 · letzter Beitrag vom 6. Okt 2011
Antwort Antwort
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#1

StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 4. Okt 2011, 18:20
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 4. Okt 2011, 18:32
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 4. Okt 2011, 18:34
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#4

AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 6. Okt 2011, 19:46
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?
Miniaturansicht angehängter Grafiken
unbenannt.png  
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 6. Okt 2011, 20:33
normalerweise würdest Du den Text ja so zeichen
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)

Geändert von Keldorn ( 6. Okt 2011 um 20:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#6

AW: StringGrid-Zelle mit mehreren Zeilen vertikal zentrieren

  Alt 6. Okt 2011, 21:25
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);
  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 12:05 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