![]() |
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? |
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. |
AW: Spaltenbreite DBGrid automatisch anpassen
Dazu muss aber auch die gesamte Datenmenge durchlaufen werden, was ggf. schon ein wenig dauern kann.
|
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.
|
AW: Spaltenbreite DBGrid automatisch anpassen
Jepp, aber dabei nicht vergessen, dass man auch den richtigen Font zuweisen muss, sonst rechnet man mit falschen Werten.
|
AW: Spaltenbreite DBGrid automatisch anpassen
Zitat:
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; |
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.
|
AW: Spaltenbreite DBGrid automatisch anpassen
Hallo,
Zitat:
Code:
geht doch bestimmt auch und muss einmal beim Programmstart aufgerufen werden. Änderungen zur Programmlaufzeit wollen wir hier mal geflissentlich ignorieren.
Select max(length(Spalte1)) as a, max(length(Spalte2)) as b, ... from Tabelle
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 ;-) |
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.
|
AW: Spaltenbreite DBGrid automatisch anpassen
Zitat:
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 17:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz