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 2 von 3     12 3      
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 09:10
Wenn Du mit MAX die Maximalbreite ermitteln kannst, kannst Du auch mit AVG die Durchschnittsbreite ermitteln . Multiplizierst Du das dann mit einem "breiten" Buchstaben wie dem angegebenen 'W' ist das zwar nicht der Weisheit letzter Schluss, aber IMO ein akzeptabler Kompromiss, wenn es nicht auf einzelne Pixel ankommt.
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
 
#12

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 09:35
Praktische Breite bei variabler Schrift ist
Code:
maximale Buchstabenanzahl
in W
* 75%
Damit bin ich in der Regel gut zurechtgekommen.

Bei Datum und Zahlen kann man ebenfalls die maximale Länge bestimmen und als Zeichen die 0 statt das W nehmen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 10:35
Hab ich mal von irgendwo aus dem Netz kopiert und noch etwas überarbeitet
Delphi-Quellcode:
unit uGridColumnWidth;

interface

uses
  DBGrids;

procedure SetGridColumnWidths( AGrid : TDBGrid );

implementation

uses
  DB, SysUtils;

procedure SetGridColumnWidths( AGrid : TDBGrid );
  const
    DEFBORDER = 10;
  var
    temp, idx, bcidx : integer;
    lmax : array of integer;
    bm : TBookmark;
  begin
    with AGrid do
      begin
        SetLength( lmax, Columns.Count );

        if dgTitles in AGrid.Options then
          begin

            // Measure Title

            Canvas.Font := AGrid.TitleFont;
            for idx := 0 to Columns.Count - 1 do
              if Columns[ idx ].Visible then
                lmax[ idx ] := Canvas.TextWidth( Columns[ idx ].Title.Caption )
                  + DEFBORDER;

          end;

        // Measure Data

        Canvas.Font := AGrid.Font;

        // Anzeige abschalten
        DataSource.DataSet.DisableControls;
        try
          // Aktuellen Datensatz merken
          bm := DataSource.DataSet.GetBookmark;
          // Zum ersten Datensatz springen
          DataSource.DataSet.First;
          // Alle Datensätze durchwandern
          while not DataSource.DataSet.EOF and ( DataSource.DataSet.RecNo < DataSource.DataSet.RecordCount ) do
            begin
              // Alle Spalten durchwandern
              for idx := 0 to Columns.Count - 1 do

                // Ist die Spalte sichtbar?
                if Columns[ idx ].Visible then
                  begin

                    // Breite des Inhalts ermitteln
                    temp := Canvas.TextWidth
                      ( trim( Columns[ idx ].Field.DisplayText ) ) + DEFBORDER;

                    // nur die maximale Breite merken
                    if temp > lmax[ idx ] then
                      lmax[ idx ] := temp;

                  end;

              // Nächster Datensatz
              DataSource.DataSet.Next;
            end;

          // Zum Datensatz zurückspringen, der eingangs gewählt war

          if DataSource.DataSet.BookmarkValid( bm ) then
            DataSource.DataSet.GotoBookmark( bm )
          else
            DataSource.DataSet.First;

        finally
          // Anzeige einschalten
          DataSource.DataSet.EnableControls;
        end;

        // Spaltenbreiten ändern

        for idx := 0 to Columns.Count - 1 do
          if Columns[ idx ].Visible then
            if lmax[ idx ] > 0 then
              Columns[ idx ].Width := lmax[ idx ];
      end;
  end; { SetGridColumnWidths }
end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jumpy

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 11:24
Danke. Das ist zwar die "Ich acker mal die ganze Datenmenge ab"-Variante, aber dafür cool gelöst (soweit ich das als Newbie beurteilen kann). Wenn ich mal Zeit hab (als Azubi hab ich die vllt.) mach ich mir den Spass und teste mal ab welcher Datenmenge es performanter wird, die Arbeit von der Datenbank erledigen zu lassen. Wobei die angezeigte Datenmenge im Grid in der Regel so klein ist, dass obiges bestimmt schneller ist.
Wer sich dagegen 12 Millionen Datensätz im Grid anzeigen läßt ist selber Schuld.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#15

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 14. Feb 2011, 11:31
als gäbe noch die Q&D Option zu Laufzeit im OnPaint über Canvas.TextWidth die Spalten zu vergrößern, sofern sie zu schmal sind.
Delphi-Quellcode:
   if DBGrid1.Canvas.TextWidth(Column.Field.AsString) > (Rect.Right - Rect.Left) then
    begin
    Column.Width := DBGrid1.Canvas.TextWidth(Column.Field.AsString);
    end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (14. Feb 2011 um 11:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 15. Feb 2011, 07:46
Das könnte aber unschöne Effekte beim Scrollen zur Folge haben.
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 Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#17

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 15. Feb 2011, 08:58
Zitat:
Das könnte aber unschöne Effekte beim Scrollen zur Folge haben.
Die Spalten werden breiter wenn nötig, eine gewisse Dynamik ist gegeben, das ist richtig.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#18

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 15. Feb 2011, 14:01
Also wir haben das so gelöst:
Delphi-Quellcode:
function TextGroesse(const Text : string; Font : TFont = nil) : TSize;
var
  DC : hDC;
  F : hFont;
  R : TRect;
begin
  F := 0;
  DC := GetDC(0);
  try
    if Font <> nil then
      F := SelectObject(DC, Font.Handle);
    if not GetTextExtentPoint32(DC, Text, Length(Text), Result) then
    begin
      Result.cx := 0;
      Result.cy := 0;
    end;
  finally
    if F <> 0 then
      SelectObject(DC, F);
    ReleaseDC(0, DC);
  end;
end;

procedure SetColumnWidth(DBGrid : TDBGrid);
var
  i, j : integer;
  iMaxRow : integer;
begin
  with DBGrid do
  begin
    // maximal || Zeilen durchsuchen
    iMaxRow := Min(40, DataSource.DataSet.RecordCount);
    try
      DataSource.DataSet.DisableControls;
      Visible := false; // notwendig, da controls disabled!
      DataSource.DataSet.First;

      // mit Breite der Überschriften inizialisieren
      for i := 0 to Columns.Count - 1 do
      begin
        Columns.Items[i].Width := TextGroesse(Columns[i].Title.Caption, Canvas.Font).cx + 10;
      end;

      // auf die größte Breite der ersten iMaxRow Zeilen stellen
      for j := 0 to iMaxRow - 1 do
      begin
        for i := 0 to Columns.Count - 1 do
        begin
          Columns.Items[i].Width := Max(TextGroesse(Fields[i].Text, Canvas.Font).cx + 10, Columns.Items[i].Width);
        end;

        DataSource.DataSet.Next;
      end;
      DataSource.DataSet.First;
    finally
      DataSource.DataSet.EnableControls;
      Visible := true;
    end;
  end;
end;
Leider mussten wir GetTextExtentPoint32 für die Textbreite verwenden, da Canvas.TextWidth manchmal einen fehlerhaften (zu kleinen) Wert liefert.

Bemerkungen:
1. Da wir z.T. sehr viele Datensätze haben können > 10 Mio. haben wir die Breitenberechnung auf 40 DS beschränkt.
2. An die Textbreite wird + 10 angehängt um einen kleinen Abstand zur Begrenzung zu haben.
3. Wir haben auf Bookmarks verzichtet, da die Berechnung der Breite nur beim inizialen Laden der Daten notwenig ist.
4. Besonders wichtig sind DisableControls und Visible := false, damit wird die Funktion um ein vielfaches schneller.

Gruß David
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 15. Feb 2011, 16:26
Man könnte auch den Canvas fragen, wie viele Pixel der Text gerendert hat.
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#20

AW: Spaltenbreite DBGrid automatisch anpassen

  Alt 16. Feb 2011, 07:08
Hallo,

oder mal das TJVDBGrid von den Jedis anschauen, es hat ein Attribut für maximale Spaltebreite, für minimale Spaltenbereite, kann, wenn ich das richtig sehe, auch die Spaltenbreite automatisch auf das richtige Maß bringen.

Könnte von daher eine Alternative zum "Selbermachen" sein.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 15:08 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