Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Spaltenbreite automatisch bestimmen (https://www.delphipraxis.net/38078-spaltenbreite-automatisch-bestimmen.html)

superstar025 14. Jan 2005 13:16


Spaltenbreite automatisch bestimmen
 
Hallo

wie kann ich in einem DBGrid sie Spaltenbreite automatisch bestimmen. Die Feldlänge soll so breit angzeigt werden wie lang der längste Feldinhalt in der Spalte ist.
wie stell ich das ein?

mfg
matthias
:roll:

Urmel 14. Jan 2005 13:23

Re: Spaltenbreite automatisch bestimmen
 
Hallo Matthias,
bei einmem DBGrid wird das sicher schwer. Du müsstest jeden Datensatz durchlaufen um die größte Breite eies Eintrages zu bestimmen und dann die Breite der Spalte anpassen.

Wuaegner 14. Jan 2005 13:27

Re: Spaltenbreite automatisch bestimmen
 
Oder einfach die Zeichen jedes Datensatzes überprüfen wenn sie größer sind als die die du schon hast dann verbreiterst du die Spalte wenn nicht dann nicht. Dann ist sie am Schluss so breit wie das Feld mit den meisten Zeichen drin.

Urmel 14. Jan 2005 13:28

Re: Spaltenbreite automatisch bestimmen
 
Zitat:

Zitat von Wuaegner
...Dann ist sie am Schluss so breit wie das Feld mit den meisten Zeichen drin.

Das würde aber nur bei nichtproportionalen Schriftarten gehen ;-)

grayfox 14. Jan 2005 13:31

Re: Spaltenbreite automatisch bestimmen
 
hallo mathias!

schau bei den schweizern vorbei - dort findest du unter 'TDBGrid' jede menge tipps zu deinem problem

mfg, stefan

superstar025 14. Jan 2005 13:39

Re: Spaltenbreite automatisch bestimmen
 
also ist dies nichts so ohne weiteres möglich

das problem liegt darin das ich ein textfeld mit einer länge von 120 zeichen habe und das dann immer notwendig ist auch wenn nur ein eintrag mit 3 zeichen drin steht nach rechts zu scrollen um auch die anderen felder zu sehen.
das wollte ich damit verhindern

mfg
matthias

eddy 15. Jan 2005 23:17

Re: Spaltenbreite automatisch bestimmen
 
Hallo superstar025,

ich habe das so gelöst:
Code:
procedure MinRow(dbg : TJvDBGrid);
const
  chkanz = 300; // CHecK ANZahl von Datensätzen zur Beschränkung des Zeitaufwandes
  maxfldanz = 50; // max. Anz. der Felder, die betrachtet werden
  minwidth = 20; // min. Breite
  korrwidth = 10; //10; // Korr. der Spaltenbreite wg. besserer Optik
var
  i,
  fcnt,  // Field-Count
  aktrec,
  zel,
  len : integer;
  farr : array[0..maxfldanz] of integer;
begin
  // Tab1 - TTable
  // Tab ersetzen durch (TAdsTable((dbg as TJvgDBGrid).DataSource.DataSet)
  // dbg ersetzen durch (dbg as TJvgDBGrid)
  if TAdsTable(dbg.DataSource.DataSet).Active then begin
    TAdsTable(dbg.DataSource.DataSet).DisableControls;

    aktrec := TAdsTable(dbg.DataSource.DataSet).RecNo;
    for i:=0 to maxfldanz do farr[i] := minwidth;

    TAdsTable(dbg.DataSource.DataSet).First;
    fcnt := TAdsTable(dbg.DataSource.DataSet).FieldCount;
    if fcnt > maxfldanz then fcnt := maxfldanz;
    if fcnt > dbg.Columns.Count then fcnt := dbg.Columns.Count;
    zel := 0;
    while (not TAdsTable(dbg.DataSource.DataSet).EOF) and (zel < chkanz) do begin
      for i:=0 to fcnt-1 do begin
        len := TrueFontWidth(dbg.Font, dbg.Columns.Grid.Fields[i].Text);
        if len > farr[i]
          then farr[i] := len;
      end;
      TAdsTable(dbg.DataSource.DataSet).Next;
      inc(zel);
    end;
    for i := 0 to fcnt-1 do begin
      try
        dbg.Columns[i].Width := farr[i] + korrwidth;
      except
        dbg.Columns[i].Width := dbg.Columns[i].Width;
      end;
    end;
    TAdsTable(dbg.DataSource.DataSet).RecNo := aktrec;
    TAdsTable(dbg.DataSource.DataSet).EnableControls;
  end;
end;   // of MinRow


// uses Graphics, Windows
function TrueFontWidth(fnt: TFont; const text:string): Integer;
var
   dc: hdc;   //uses Windows
   tsize : Windows.TSize;
begin
   dc := GetDC(0);
   SelectObject(DC, fnt.Handle);
   GetTextExtentPoint32(dc, PChar(text), Length(text), tsize);
   ReleaseDC(0, DC);
   Result := tsize.cx;
end;
Ist vielleicht nicht ganz perfekt, funktioniert aber trotzdem.
Getestet ist es mit Paradox- und dBase-Datenbanken sowie ADS (Advantage Database Server).
Diese Fassung ist für das Jedi-DBGrid und ADS ausgelegt.
Die vorige Fassung DBGrid Column autosize hatte noch 2 Übergabeparameter (Tab : TTable; dbg : TDBGrid), aber da ich wegen der nicht mehr aktuallisierten BDE von Paradox- auf ADS-Datenbanken umsteige, habe ich beim Umschreiben auf die obige Version für TAdsTable einen Parameter eliminiert.

mfg
eddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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