Einzelnen Beitrag anzeigen

Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#7

Re: Spaltenbreite automatisch bestimmen

  Alt 16. Jan 2005, 00:17
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
  Mit Zitat antworten Zitat