AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

Ein Thema von NicoleWagner · begonnen am 25. Nov 2021 · letzter Beitrag vom 29. Nov 2021
Antwort Antwort
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#1

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 11:16
Danke für alle Antworten!

Nur jetzt bekomme ich Kopfschmerzen:
Leider funktionieren in meinem Fall beide Methoden nicht, auch wenn das Ergebnis gleich aussieht.
Siehe Screenshot.

Spannend ist die Spalte PL:
Sie ist überbreit. Sie WAR auch überbreit in der Query.
Denn es handelt sich um eine double Zahl, deren zahlreiche Kommastellen ich im Draw-Event auf 2 reduziere.
d.h. vielleicht ist die Spaltenbreite-Routine in einem Event, das zu früh ausgelöst wird.

nur, meine Kopfschmerzen:
Die Abfrage (siehe andere meiner Fragen)
i:=DataSource_TradesListen.DataSet.Fields.Count - 1;
wird erstmals korrekt bearbeitet. Und zwar im Draw Event!
Die Linie, die die Monate trennt, ist erstmal genau, wo sie sein soll.


Ich glaube, ich brauche eine Pause, weil nur mehr verwirrt.
Angehängte Grafiken
Dateityp: png DBGrid.png (72,0 KB, 34x aufgerufen)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.563 Beiträge
 
Delphi 7 Professional
 
#2

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 11:44
Naja, dann machen wir mal weiter und ergänzen die Routine:
Delphi-Quellcode:
  for i := 0 to DBGrid1.Columns.Count - 1 do
  begin
    case DBGrid1.Columns[i].Field.DataType of
      ftString, ftWideString :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(DBGrid1.Columns[i].Field.AsString);
        DBGrid1.Columns[i].Alignment := taLeftJustify;
      end;
      ftSmallint, ftInteger, ftWord, ftAutoInc, ftLargeint :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(Format('%6.0n',[DBGrid1.Columns[i].Field.AsFloat]));
        DBGrid1.Columns[i].Alignment := taRightJustify;
      end;
      ftFloat, ftCurrency :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(Format('%6.2n',[DBGrid1.Columns[i].Field.AsFloat]));
        DBGrid1.Columns[i].Alignment := taRightJustify;
      end;
      ftDate :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(FormatDateTime('dd.mm:yyyy', DBGrid1.Columns[i].Field.AsDateTime]));
        DBGrid1.Columns[i].Alignment := taLeftJustify;
      end;
      ftTime :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(FormatDateTime('hh:nn:ss', DBGrid1.Columns[i].Field.AsDateTime]));
        DBGrid1.Columns[i].Alignment := taLeftJustify;
      end;
      ftDateTime :
      begin
        DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(FormatDateTime('dd.mm.yyyy hh:nn:ss', DBGrid1.Columns[i].Field.AsDateTime]));
        DBGrid1.Columns[i].Alignment := taLeftJustify;
      end;
    else
      DBGrid1.Columns[i].Width := DBGrid1.Canvas.TextWidth(DBGrid1.Columns[i].Field.AsString);
      DBGrid1.Columns[i].Alignment := taCenter;
    end;
  end;
Achso: Das ist jetzt einfach nur ungetestet hingedaddelt.
Bei den Format- bzw. FormatDateTimeaufrufen kannst Du die Formatstrings ja entsprechend Deinen Wünschen anpassen, ebenso die rechts- oder linksbündige Ausgabe ...

Geändert von Delphi.Narium (26. Nov 2021 um 14:18 Uhr) Grund: Fehler behoben
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#3

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 12:43
ich würde jetzt nicht unbedingt die Breite ermitteln, sondern nur eine maximale Breite setzen...
Code:
// Im AfterOpen der Query, Table, ...
procedure TForm1.DatenbankomponentennameAfterOpen(DataSet: TDataSet);
var
  LColumn: TColumn;
begin
  for LColumn in DBGrid1.Columns do
    LColumn.Width := min(LColumn.Width, 30);
end;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Jumpy

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

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 12:43
Noch eine Version, die ich meine ich irgendwann mal hier im Forum bekommen habe (find es gerade nicht), ich meine von Sir Rufo. Hier in der Version analysiert es die ersten 40 Zeilen, um die optimale Spaltenbreite zu ermitteln:

Delphi-Quellcode:
procedure TProjekt.SetGridCol_Optimal(DBGrid: TDBGrid);
function TextGroesse(const Text : string; Font : TFont = nil) : TSize;
var
  DC : hDC;
  F : hFont;
begin
  F := 0;
  DC := GetDC(0);
  try
    if Font <> nil then F := SelectObject(DC, Font.Handle);
    if not GetTextExtentPoint32(DC, PChar(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;

var
  i, j : integer;
  iMaxRow : integer;
begin
  with DBGrid do
  begin
    // maximal XX 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, 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, Font).cx + 10, Columns.Items[i].Width);
        end;
        DataSource.DataSet.Next;
      end;
      DataSource.DataSet.First;
    finally
      DataSource.DataSet.EnableControls;
      Visible := true;
    end;
  end;
end;
Ralph
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#5

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 13:52
[ case DBGrid_Trades.Columns[i].DataType of
ftString, ftWideString :]

Das will der Compiler nicht:
DBGrid_Trades.Columns[i].DataType

► undeklarierter Bezeichner 'DataType'

Ja, da gab es eine Version hier, die die Spaltenbreite automatisch erzeugen sollte. Vor langem.
Doch sie lief für mich nicht.
Dieses manuelle Setzen ist nämlich extrem mühsam, weil ich mit dem Grid arbeite und die Reihenfolge der Felder immer wieder mal verändere. Daher probierte ich damals die Implementierung sofort. Doch ging nicht.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.563 Beiträge
 
Delphi 7 Professional
 
#6

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 14:19
Müsste wohl DBGrid_Trades.Columns[i].Field.DataType heißen.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.563 Beiträge
 
Delphi 7 Professional
 
#7

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 14:28
Eventuell ließe sich aber im AfterOpen der Query sowas realisieren:
Delphi-Quellcode:
procedure TForm1.AfterOpen(DataSet: TDataSet);
var
  i : Integer;
begin
  for i := 0 to DataSet.Fields.Count - 1 do begin
    case DataSet.Fields[i].DataType of
      ftSmallint, ftInteger, ftWord,
      ftLargeInt, ftAutoInc : TFloatField(DataSet.Fields[i]).DisplayFormat := '###,##0 ';
      ftCurrency, ftFloat : TFloatField(DataSet.Fields[i]).DisplayFormat := '###,##0.00 ';
      ftDate, ftTime, ftDateTime : TDateTimeField(DataSet.Fields[i]).DisplayFormat := 'dd.mm.yyyy hh:nn:ss';
    end;
  end;
end;
Dann könnte man sich beim Zeichnen des Grids die Formatierungen sparen und bliebe bei der Berechnung der Spaltenbreite bei TiGüs Vorschlag.
  Mit Zitat antworten Zitat
NicoleWagner

Registriert seit: 6. Jul 2010
167 Beiträge
 
Delphi XE3 Professional
 
#8

AW: DBGrid1.Columns[0].Width:= .... / geht das auch automatisch?

  Alt 26. Nov 2021, 14:49
Danke für Deine Mühe. Von der Syntax her wird das jetzt genommen.
Allerdings scheint es nichts zu tun bei mir.

Ich schlug jetzt in der Hilfe nach und - ich bin überfordert. Das ist so komplex, was dort steht, ich verstehe es einfach nicht.

Daher drei Kindermundfragen:

1)
Ist die Option des DBGrids "dgColumnResize" relevant?
Ich schaltete sie ein und schaltete sie aus, doch sehe keinen Unterschied.

2)
Diese Abfragen (aus der anderen Idee)
lb.Caption := DBGrid_Trades.Columns[i].Field.AsString;
DBGrid_Trades.Columns[i].Width := lb.Width;
Was fragt die ab?
Ich brauche ja die längste Ausgabe aus dieser Spalte. Es hat ja die Überschrift eine Breite, der Inhalt manchmal eine andere, und manchmal eine wechselnde.
Eine gute Breite wäre z.B. die erste ausgefüllte Zelle oder aber die breiteste.

3)
Wenn ich habe
DBGrid_Trades.Columns[i]
Wie greife ich da auf die Zellen diese Spalte zu? Ich probierte Fields und items, doch irgendie kommt da nichts Sinnvolles.

Wobei es mir nichts nützt, auf die Query zuzugreifen, denn die Werte in den Spalten werden im Draw-Event ins Grid geschrieben und meiner Einschätzung nach nicht in die Datasource etc.

Und mit den Zugriffen auf die Breite wird die Zählung der Spalten noch mehr fuzzy. Es scheinen da in verschiedenen Zeilen verschiedene Spaltenanzahlen gezählt zu werden.
  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 02:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz