AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Spaltenbreite automatisch bestimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Spaltenbreite automatisch bestimmen

Ein Thema von superstar025 · begonnen am 14. Jan 2005 · letzter Beitrag vom 16. Jan 2005
Antwort Antwort
superstar025

Registriert seit: 5. Jul 2004
Ort: Beelen
140 Beiträge
 
Delphi 7 Professional
 
#1

Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:16
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
Matthias
  Mit Zitat antworten Zitat
Urmel

Registriert seit: 23. Mai 2004
Ort: Titiwu
28 Beiträge
 
#2

Re: Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:23
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.
Urmel aus dem Eis
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:27
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.
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
Urmel

Registriert seit: 23. Mai 2004
Ort: Titiwu
28 Beiträge
 
#4

Re: Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:28
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
Urmel aus dem Eis
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#5

Re: Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:31
hallo mathias!

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

mfg, stefan
  Mit Zitat antworten Zitat
superstar025

Registriert seit: 5. Jul 2004
Ort: Beelen
140 Beiträge
 
Delphi 7 Professional
 
#6

Re: Spaltenbreite automatisch bestimmen

  Alt 14. Jan 2005, 14:39
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
Matthias
  Mit Zitat antworten Zitat
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
Antwort Antwort


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:48 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