[Erledigt} StringGrid Felder formatieren

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
juelin
Lazarusforum e. V.
Beiträge: 343
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

[Erledigt} StringGrid Felder formatieren

Beitrag von juelin »

Hallo,
ich habe ein StringGrid mit mehreren Feldern.
Alle Felder sind linksbündig ausgerichtet.
Jetzt möchte ich ein Feld aber rechtsbündig ausrichten.
Wie bei z. B TEdite Alignment=taRightJustify.
Leider gibt es im StringGrid kein Alignment.
Ist das irgendwie möglich und wenn ja wie?
Danke und Gruß
Jürgen
Zuletzt geändert von juelin am Di 3. Mär 2026, 15:01, insgesamt 2-mal geändert.

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

Re: StringGrid Felder formatieren

Beitrag von wp_xyz »

Nimm das OnPrepareCanvas-Event und setze dort das Alignment im TextStyle des Canvas auf taRightJustify (ist leider etwas umständlich, weil TTextStyle ein Record ist ohne Setter/Getter in den Properties):

(nicht getestet):

Code: Alles auswählen

procedure TForm1.StringGrid1PrepareCanvas(Sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  ts: TTextStyle;
begin
  if ((aCol = 4) and (aRow = 10)) or (aCol = 1) then begin
    ts := StringGrid1.Canvas.TextStyle;
    ts.Alignment := taRightJustify;
    StringGrid1.Canvas.TextStyle := ts;
  end;
end;

Benutzeravatar
Zvoni
Beiträge: 586
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: StringGrid Felder formatieren

Beitrag von Zvoni »

Hääää???

Hab ich jetzt irgendwas falsch verstanden, oder denke ich zu sehr um die Ecke????
Unbenannt.PNG
Unbenannt.PNG (32.96 KiB) 468 mal betrachtet
Leider gibt es im StringGrid kein Alignment.
Natürlich hat das StringGrid kein Alignment.

Spalten andererseits......
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
juelin
Lazarusforum e. V.
Beiträge: 343
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: StringGrid Felder formatieren

Beitrag von juelin »

Hallo wp_xyz,
danke für den Hinweis.
Hat wunderbar funktioniert.
Alles Gute
Jürgen

Benutzeravatar
juelin
Lazarusforum e. V.
Beiträge: 343
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Erledigt StringGrid Felder formatieren

Beitrag von juelin »

hallo zvoni,
ja Du hst recht. Das geht natürlich auch.
Aber dann macht er auch die Überschrift rechtsbündig, die sollte aber linksbündig bleiben.
Gruß
Jürgen

Benutzeravatar
Zvoni
Beiträge: 586
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Erledigt StringGrid Felder formatieren

Beitrag von Zvoni »

juelin hat geschrieben: Di 3. Mär 2026, 14:53 hallo zvoni,
ja Du hst recht. Das geht natürlich auch.
Aber dann macht er auch die Überschrift rechtsbündig, die sollte aber linksbündig bleiben.
Gruß
Jürgen
Wie kommst du denn da drauf??
Unbenannt.PNG
Unbenannt.PNG (35.7 KiB) 453 mal betrachtet
Du musst zwischen Alignment der Spalte, und dem Alignment der Überschrift unterscheiden
Unbenannt2.PNG
Unbenannt2.PNG (31.22 KiB) 452 mal betrachtet
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: StringGrid Felder formatieren

Beitrag von wp_xyz »

Zvoni hat geschrieben: Di 3. Mär 2026, 14:38 Hääää???

Hab ich jetzt irgendwas falsch verstanden, oder denke ich zu sehr um die Ecke????
Nicht jeder will Columns, z.B. wenn man ein Grid aus einer Delphi-Anwendung portiert. Columns sind beim TStringGrid meiner Meinung nach ein etwas verunglücktes Feature, weil sie ein zweites Index-System einführen: Die erste Daten-Zelle links oben (außerhalb der FixedRows/FixedCols) hat den Spaltenindex 1, die zugehörige Spalte aber den Index 0.

Benutzeravatar
Zvoni
Beiträge: 586
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: StringGrid Felder formatieren

Beitrag von Zvoni »

wp_xyz hat geschrieben: Di 3. Mär 2026, 15:58
Zvoni hat geschrieben: Di 3. Mär 2026, 14:38 Hääää???

Hab ich jetzt irgendwas falsch verstanden, oder denke ich zu sehr um die Ecke????
Nicht jeder will Columns, z.B. wenn man ein Grid aus einer Delphi-Anwendung portiert. Columns sind beim TStringGrid meiner Meinung nach ein etwas verunglücktes Feature, weil sie ein zweites Index-System einführen: Die erste Daten-Zelle links oben (außerhalb der FixedRows/FixedCols) hat den Spaltenindex 1, die zugehörige Spalte aber den Index 0.
Biste sicher?

in meinem Screenshot oben habe ich stumpf bei "StringGrid1.Cells[1,1]:='Links 1'; usw. angefangen.
Heisst: Im Screenshot belegen FixedRow/Col schon [0,0]
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: [Erledigt} StringGrid Felder formatieren

Beitrag von wp_xyz »

Ja. Die Zelle mit dem Text "Links 1" ist in Cells[1, 1], der erste Index ist dabei der Spaltenindex der Zelle und hat den Wert 1. Das ist aber nicht der Index der Column, in der sich diese Zelle befindet - das ist die mit der Caption "Links". Im Objektbaum des Objektinspektor siehst du unter "Columns": "0 - Links" - also: diese Column hat den Index 0! Das Problem ist, dass es für die FixedCols keine Column gibt, und dadurch gerät läuft die Indizierung auseinander. Ich finde, das ist total verwirrend. Beim DBGrid hat man das besser gelöst, da hat man die FixedCols komplett abgeschafft, so dass Spaltenindex und Column-Index zusammenfallen.

Benutzeravatar
Zvoni
Beiträge: 586
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Erledigt} StringGrid Felder formatieren

Beitrag von Zvoni »

wp_xyz hat geschrieben: Di 3. Mär 2026, 16:31 Ja. Die Zelle mit dem Text "Links 1" ist in Cells[1, 1], der erste Index ist dabei der Spaltenindex der Zelle und hat den Wert 1. Das ist aber nicht der Index der Column, in der sich diese Zelle befindet - das ist die mit der Caption "Links". Im Objektbaum des Objektinspektor siehst du unter "Columns": "0 - Links" - also: diese Column hat den Index 0! Das Problem ist, dass es für die FixedCols keine Column gibt, und dadurch gerät läuft die Indizierung auseinander. Ich finde, das ist total verwirrend. Beim DBGrid hat man das besser gelöst, da hat man die FixedCols komplett abgeschafft, so dass Spaltenindex und Column-Index zusammenfallen.
Jetzt hab ich dich verstanden.
DBGrid hat doch aber noch FixedCols?!?!??!
Unbenannt.PNG
Unbenannt.PNG (20.6 KiB) 364 mal betrachtet
Was ich skurril finde: DBGrid stammt von TCustomGrid ab,
und TCustomGrid hat ein protected (!!) Event "OnSelection" / "OnAfterSelection", was die geclickte Zelle (Spalte, Zeile) liefert.

Ja, TCustomGrid ist der Vorfahre für TStringGrid, und da kann ich die Events zuweisen (Published).

Frage mich gerade, wieso man das für DBGrid nicht gemacht hat, um einfach an die Zellen-Daten zu kommen, unabhängig vom drunter hängenden DataSet
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

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

Re: [Erledigt} StringGrid Felder formatieren

Beitrag von wp_xyz »

Zvoni hat geschrieben: Mi 4. Mär 2026, 08:29 DBGrid hat doch aber noch FixedCols?!?!??!
Hast recht. Ich habe mich schlecht ausgedrückt... Wenn du FixedCols auf z.B. 2 setzt, hast du beim DBGrid die erste Datenspalte in einer FixedCol. FixedCols = 0 geht gar nicht, weil die linke Fixed-Randspalte für die Indikator-Icons benötigt wird. Beim StringGrid ist das völlig anders. Wenn die Zahl der FixedCols erhöht wird, werden die Columns in der Darstellung einfach entsprechend nach rechts geschoben. Warum eigentlich? Warum kann man keine FixedCol zu einer Column machen? Dann wäre die Index-Welt wieder in Ordnung.

Die Diskrepanz zwischen SpaltenIndex in Cells[col,row] und dem Index einer Column stellt sich beim DBGrid nicht, weil man die Zellen gar nicht per Cells[col, row] ansprechen kann. Das ist wahrscheinlich so beabsichtigt, dass man gezwungen ist, das Grid als Abbild eines Dataset zu sehen, wo es ja auch kein "col,row" gibt, sondern nur Records und Felder. Das ist zwar irgendwie dieselbe Information, jedoch wird's schwierig wenn das Grid nur einen Ausschnitt des Dataset geladen hat und die Recordnummer nicht gut definiert ist.
Zvoni hat geschrieben: Mi 4. Mär 2026, 08:29 um einfach an die Zellen-Daten zu kommen, unabhängig vom drunter hängenden DataSet
Ich meine, genau diesen Denkansatz wollten die Autoren des DBGrid vermeiden.

Das DBGrid hat ein Event OnCellClick, das nahelegt, es würde die col/row Koordinaten der geklickten Zelle zurückliefern. Aber es hat nur einen Parameter Column, keine Row. Aber wenn man in eine Zelle geklickt hat, wird der Record, der zur geklickten Zelle gehört, zum aktiven Record, und man braucht den Zeilenindex gar nicht mehr. Man kann nach dem Klick z.B. mit Column.Field.AsString den Text in der geklickten Zellen abfragen.

Benutzeravatar
Zvoni
Beiträge: 586
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: [Erledigt} StringGrid Felder formatieren

Beitrag von Zvoni »

wp_xyz hat geschrieben: Mi 4. Mär 2026, 12:25
Zvoni hat geschrieben: Mi 4. Mär 2026, 08:29 DBGrid hat doch aber noch FixedCols?!?!??!
Hast recht. Ich habe mich schlecht ausgedrückt... Wenn du FixedCols auf z.B. 2 setzt, hast du beim DBGrid die erste Datenspalte in einer FixedCol. FixedCols = 0 geht gar nicht, weil die linke Fixed-Randspalte für die Indikator-Icons benötigt wird. Beim StringGrid ist das völlig anders. Wenn die Zahl der FixedCols erhöht wird, werden die Columns in der Darstellung einfach entsprechend nach rechts geschoben. Warum eigentlich? Warum kann man keine FixedCol zu einer Column machen? Dann wäre die Index-Welt wieder in Ordnung.

Die Diskrepanz zwischen SpaltenIndex in Cells[col,row] und dem Index einer Column stellt sich beim DBGrid nicht, weil man die Zellen gar nicht per Cells[col, row] ansprechen kann. Das ist wahrscheinlich so beabsichtigt, dass man gezwungen ist, das Grid als Abbild eines Dataset zu sehen, wo es ja auch kein "col,row" gibt, sondern nur Records und Felder. Das ist zwar irgendwie dieselbe Information, jedoch wird's schwierig wenn das Grid nur einen Ausschnitt des Dataset geladen hat und die Recordnummer nicht gut definiert ist.
Zvoni hat geschrieben: Mi 4. Mär 2026, 08:29 um einfach an die Zellen-Daten zu kommen, unabhängig vom drunter hängenden DataSet
Ich meine, genau diesen Denkansatz wollten die Autoren des DBGrid vermeiden.

Das DBGrid hat ein Event OnCellClick, das nahelegt, es würde die col/row Koordinaten der geklickten Zelle zurückliefern. Aber es hat nur einen Parameter Column, keine Row. Aber wenn man in eine Zelle geklickt hat, wird der Record, der zur geklickten Zelle gehört, zum aktiven Record, und man braucht den Zeilenindex gar nicht mehr. Man kann nach dem Klick z.B. mit Column.Field.AsString den Text in der geklickten Zellen abfragen.
Das weiss ich alles.
Ich finde aber den Denkansatz dennoch etwas skurril, weil ein StringGrid vom Prinzip dasselbe wie ein DBGrid ist: Eine tabellarische Darstellung von Daten.
Nur halt mit dem Unterschied, dass man bei einem StringGrid alles von Hand machen muss (Tabelle füllen usw.), und beim DBGrid das eben "automatisch" aus dem aktiven Dataset erfolgt.

Naja....lassen wir es.
Wir haben den Thread eh viel zu weit "entführt" :lol:
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten