Delphi-PRAXiS
Seite 1 von 3  1 23      

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/)
-   -   Spaltenbreite DBGrid automatisch anpassen (https://www.delphipraxis.net/158331-spaltenbreite-dbgrid-automatisch-anpassen.html)

Jumpy 14. Feb 2011 07:40

Spaltenbreite DBGrid automatisch anpassen
 
Hallo,

ich suche für das DBGrid (oder vllt. generell für Grids) die Möglichkeit die Spaltenbreite automatisch anzupassen, so wie die bei Excel das Autofit.

Hintergrund ist, dass viele Spalten des Grid einfach viel zu breit sind. Stellt es z.B. ein DB-Feld dar, das ein CHAR(250) Feld ist, so ist die entsprechende Spalte einfach sehr breit, um halt die theor. 250 Zeichen anzuzeigen. Der größte tatsächliche Feldinhalt ist aber z.B. nur 50 Zeichen. Dann könnte die Breite viel kleiner sein.

Hinzukommt, dass wenn die Spaltenbreite sehr groß ist (größer als z.B. die Bildschirmbreite) ist es sehr mühselig, wenn nicht unmöglich, das per Hand klein zu ziehen. Mein Workarround in solchen Fällen ist es, alle SPaltenbreiten erstmal auf 50 zu setzen und dann so groß zu ziehen, wie ich sie brauche. Das ist aber auch nicht elegant.

Drum die Frage, gibt es bei Grids so eine Eigenschaft? Falls nicht wie baut man das ein, bzw. hat jemand schonmal was diesbezüglich gemacht?

nahpets 14. Feb 2011 08:00

AW: Spaltenbreite DBGrid automatisch anpassen
 
Hallo,

eine "dumme" Idee für die Schnelle:

Ermittle die maximale Länge des Spalteninhaltes.

Nimm den längsten Text und weise diesen der Caption eines Labels zu. Das Label muss AutoSize = True haben. Es bekommt damit die entsprechende Breite des zugewiesenen Textes.
Nun nimmst Du den Wert der Eigenschaft Width des Labels rechnest noch 8 (oder so) für ein bisserl Rand dazu und weist diesen Wert als Breite der (DB)Gridspalte zu.

Und damit ist das "AutoFit" vorhanden.

Das Label kannst Du entweder unsichtbar irgendwo auf das Formular legen oder zur Laufzeit erstellen.
Eine entsprechende Routine dem TitleClick der Grids zuweisen und Du hast fast den Effekt von Excel. Ob man bei einem Grid auch eine Ereignisroutine für einen Doppelklick auf die Trennlinie zwischen zwei Spaltenköpfen legen kann, weiß ich nicht.

DeddyH 14. Feb 2011 08:04

AW: Spaltenbreite DBGrid automatisch anpassen
 
Dazu muss aber auch die gesamte Datenmenge durchlaufen werden, was ggf. schon ein wenig dauern kann.

FaTaLGuiLLoTiNe 14. Feb 2011 08:11

AW: Spaltenbreite DBGrid automatisch anpassen
 
Und wenn man trotzdem den Weg von naphets gehen will, dann könnte man sich das Label sparen und stattdessen mit TCanvas.TextWidth arbeiten.

DeddyH 14. Feb 2011 08:14

AW: Spaltenbreite DBGrid automatisch anpassen
 
Jepp, aber dabei nicht vergessen, dass man auch den richtigen Font zuweisen muss, sonst rechnet man mit falschen Werten.

Jumpy 14. Feb 2011 08:34

AW: Spaltenbreite DBGrid automatisch anpassen
 
Zitat:

Zitat von DeddyH (Beitrag 1081488)
Dazu muss aber auch die gesamte Datenmenge durchlaufen werden, was ggf. schon ein wenig dauern kann.

Ich überlege gerade. Im Falle von DBGrid liegt ja eine Datenmenge aus einer DB zugrunde. Anstatt die evtl. große Datenmenge zu durchlaufen, wäre es nicht schneller eine Funktion zum zuweisen der Breite zu schreiben, die die maximalen Feldbreiten aus der DB holt, d.h. die DB die Arbeit machen lassen?
Z.B. TADOQuery q:
Delphi-Quellcode:
q.SQL.Text:= 'SELECT Max(Length(Feld1)) as F1, Max(Length(Feld2))as F2,... from MyTable';
q.Open;
for i:=0 to q.RecordCount-1 do
  Grid.Columns[i].Width:=q.Fields[i].AsSingle * KonstanterFaktor;

DeddyH 14. Feb 2011 08:37

AW: Spaltenbreite DBGrid automatisch anpassen
 
So wie gezeigt wird es wohl nicht gehen, Du brauchst ja keine Maximalwerte, sondern die Metadaten. Wenn Du die ausgelesen hast könnte das schon funktionieren, zumindest für Datentypen, deren "Ausgabelänge" sich konkret ermitteln lässt.

nahpets 14. Feb 2011 08:38

AW: Spaltenbreite DBGrid automatisch anpassen
 
Hallo,
Zitat:

Zitat von DeddyH (Beitrag 1081488)
Dazu muss aber auch die gesamte Datenmenge durchlaufen werden, was ggf. schon ein wenig dauern kann.

wieso?

Code:
Select max(length(Spalte1)) as a, max(length(Spalte2)) as b, ... from Tabelle
geht doch bestimmt auch und muss einmal beim Programmstart aufgerufen werden. Änderungen zur Programmlaufzeit wollen wir hier mal geflissentlich ignorieren.
Natürlich müssen die Fonts übereinstimmen, da ich immer die gleiche Schrift nutze, tritt das Problem nicht auf.

Edit: @Jumpy: Die Idee hatte ich auch, nur leider zu spät ;-)

DeddyH 14. Feb 2011 08:43

AW: Spaltenbreite DBGrid automatisch anpassen
 
Das klappt aber auch nur bei fixed Fonts, die Länge des enthalteten Strings kann also auch kein eindeutiges Kriterium sein. In Arial sind 10 'X' breiter als 20 'i'. Also entweder doch jeden einzelnen Datensatz anfassen oder eben wie gesagt Metadaten auslesen und Breite auf die größtmögliche stellen. Oder halt einen fixed Font verwenden.

Jumpy 14. Feb 2011 09:00

AW: Spaltenbreite DBGrid automatisch anpassen
 
Zitat:

Zitat von Jumpy (Beitrag 1081495)
Delphi-Quellcode:
  Grid.Columns[i].Width:=q.Fields[i].AsSingle * KonstanterFaktor;

Meine Variable KonstanterFaktor sollte die Breite eines Buchstabens repräsentieren, wobei das so gedacht ist, dass es entweder die Durchschittsbreite (die man irgendwie erechnen müsste) oder eine Maximalbreite (Breite von Buchstabe "W"?) um auf der sicheren Seite zu sein. Und natürlich abhängig von der Schriftart/-größe änderbar.

Das mit "Max(Length(Feld1)) as F1" macht natürlich nur bei String-Feldern Sinn, aber die sind es auch, die den meisten Ärger verursachen. Datum und Zahl-Felder sind meist nicht so übertrieben breit.


Ich werd mal versuchen ein Beispiel-Unit zu bauen und hochzuladen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.
Seite 1 von 3  1 23      

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