AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spaltenbreite DBGrid automatisch anpassen

Ein Thema von Jumpy · begonnen am 14. Feb 2011 · letzter Beitrag vom 12. Okt 2012
Antwort Antwort
Seite 1 von 3  1 23      
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#1

Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 07:40
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?
Ralph
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:04
Dazu muss aber auch die gesamte Datenmenge durchlaufen werden, was ggf. schon ein wenig dauern kann.
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
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#4

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:11
Und wenn man trotzdem den Weg von naphets gehen will, dann könnte man sich das Label sparen und stattdessen mit TCanvas.TextWidth arbeiten.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:14
Jepp, aber dabei nicht vergessen, dass man auch den richtigen Font zuweisen muss, sonst rechnet man mit falschen Werten.
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:34
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;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:37
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.
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
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:38
Hallo,
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 08:43
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.
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
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 09:00
  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.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:31 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