[Erledigt] Alignment in TDrawGrid

Rund um die LCL und andere Komponenten
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[Erledigt] Alignment in TDrawGrid

Beitrag von MacWomble »

Wie funktioniert das Textalignment im DrawGrid?
Ich möchte de Text in Spalten zentriert oder rechtsbündig ausgerichtet haben.
Zuletzt geändert von MacWomble am Fr 18. Jan 2019, 16:31, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Alignment in TDrawGrid

Beitrag von MacWomble »

OK, ich habe es gefunden (Zufallstreffer, deswegen hier die Lösung):

in DrawCell des TDrawGrids:

Code: Alles auswählen

var
  txt: string;
  TextStyle : TTextStyle;
begin
  txt := GetCellText(ACol, ARow);
 
 // TextStyle.Alignment   := taCenter; //  taRightJustify, taLeftJustify
 if aRow = 0 then
    TextStyle.Alignment := taCenter
  else
    case ACol of
      0: TextStyle.Alignment := taCenter;
      1: TextStyle.Alignment := taLeftJustify;
      2: TextStyle.Alignment := taCenter;
      3: TextStyle.Alignment := taRightJustify;
      4: TextStyle.Alignment := taRightJustify;
      5: TextStyle.Alignment := taCenter;
    end;
  TextStyle.Layout := tlCenter;
  TextStyle.SingleLine := True;
  TextStyle.Clipping := False;
  TextStyle.ExpandTabs := True;
  TextStyle.ShowPrefix := True;
  TextStyle.Wordbreak := True;
  TextStyle.Opaque := False;
  TextStyle.SystemFont := False;
  TextStyle.RightToLeft := False;
  TextStyle.EndEllipsis := False;     
 
  dgPreise.Canvas.FillRect(ARect);
  dgPreise.Canvas.TextRect(ARect, ARect.Left + constCellPadding, ARect.Top + constCellPadding, txt, TextStyle);       


Allerdings fehlt das Padding bei taRightJustify (bzw. ich habe es noch nicht gefunden), d.h. der Text steht direkt am rechten Rand ohne Zwischenraum! :(

Ich kann mir zwar behelfen, weil rechtsbündig nur formatierte Zahlen ausgegeben werden. Wenn ich dort im Format 2 Leerzeichen anfüge, sieht es gut aus. :twisted:
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Alignment in TDrawGrid

Beitrag von wp_xyz »

MacWomble hat geschrieben:Allerdings fehlt das Padding bei taRightJustify (bzw. ich habe es noch nicht gefunden), d.h. der Text steht direkt am rechten Rand ohne Zwischenraum! :(

Dann mach das Rechteck halt nach dem Zeichnen des Hintergrunds um das CellPadding auf jeder Seite kleiner. Das übergebene Rechteck bestimmt den Ort der Ausgabe bei den Nicht-Standard-Alignments. Außerdem kannst du dir das Initiieren der einzelen Standard-Felder von TTextStyle sparen, wenn du vorher den TextStyle des Canvas ausliest.

Code: Alles auswählen

var
  txt: string;
  TextStyle : TTextStyle;
begin
  txt := GetCellText(ACol, ARow);
 
  TextStyle := dgPreise.Canvas.TextStyle;
  if aRow = 0 then
    TextStyle.Alignment := taCenter
  else
    case ACol of
      0: TextStyle.Alignment := taCenter;
      1: TextStyle.Alignment := taLeftJustify;
      2: TextStyle.Alignment := taCenter;
      3: TextStyle.Alignment := taRightJustify;
      4: TextStyle.Alignment := taRightJustify;
      5: TextStyle.Alignment := taCenter;
    end;
  TextStyle.Layout := tlCenter;
  TextStyle.Clipping := False;    // warum false? Damit wird zu langer Text in den gerade reservierten Padding-Rand geschrieben
  TextStyle.ExpandTabs := True;
  TextStyle.ShowPrefix := True;
 
  dgPreise.Canvas.FillRect(ARect);
  InflateRect(ARect, -varCellpadding, -varCellpadding);   // Rechteck kleiner machen
  dgPreise.Canvas.TextRect(ARect, ARect.Left + constCellPadding, ARect.Top + constCellPadding, txt, TextStyle);       

varCellPadding hat gegenüber constCellPadding den Vorteil, dass der Wert bei Bilschirmen höherer Auflösung automatisch angepasst wird.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: [Erledigt] Alignment in TDrawGrid

Beitrag von MacWomble »

Das Clipping hatte ich zum testen umgeschalten, Das andere wusste ich noch nicht - Danke dafür ! :)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten