[Gelöst] TDBGrid: Columnbreite automatisch anpassen

Rund um die LCL und andere Komponenten
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

[Gelöst] TDBGrid: Columnbreite automatisch anpassen

Beitrag von Ich934 »

Hallo,

wenn man Daten in ein TDBGrid einfügt/lädt, so sind die Daten ja u.U. länger/breiter als die entsprechenden Spalten.

Ich war eigentlich der Meinung, die Option "dgAutoSizeColumns" behebt dieses Problem bzw. der Aufruf der Prozedure AutoAdjustColumns. Hier wurde ich jedoch eines besseren belehrt. Es gibt keine Änderung in der Ausgabe und längere Texte werden weiterhin in der Ausgabe "abgeschnitten" oder aber manche Spalten sind einfach zu breit.

Gibt es hier noch einen Trick oder muss man das wirklich per Hand programmieren?

cu tb
Zuletzt geändert von Ich934 am Sa 19. Sep 2020, 17:12, insgesamt 1-mal geändert.
Tipp für PostgreSQL: www.pg-forum.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von wp_xyz »

Dasselbe habe ich eben auch gesehen, und war kurz vor dem Schreiben eines Bug-Report. Aber dann sah ich, dass mein Testprogramm die Spaltenbreite in eine INI-Datei geschrieben hat... Nachdem ich das entfernt habe, funktioniert die Anpassung der Spaltenbreite korrekt.

Im beigefügten Beispiel-Programm (das ein lauffähiges SQLite3 voraussetzt) wird - wenn FILL_SPACE true ist - außerdem die jenige Spalte, deren SizePriority <> 0 ist, so gedehnt, dass der freie Platz in Grid ausgefüllt ist.
Ich934 hat geschrieben:
Sa 19. Sep 2020, 10:24
Ich war eigentlich der Meinung, die Option "dgAutoSizeColumns" behebt dieses Problem bzw. der Aufruf der Prozedure AutoAdjustColumns...
Du musst in dem Satz das "bzw" durch ein "und" ersetzen, dann funktioniert es - siehe wiki.
Dateianhänge
dbgrid colwidths2 - autocolwidth.zip
(3.52 KiB) 100-mal heruntergeladen

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von Ich934 »

Hm, und wo hast du diese .ini-Datei gefunden? Mein Programm hat dafür keine Funktion.

Ich habe das jetzt mal extra so eingefügt wie es in deinem Programm ist. Der Erfolg ist aber trotzdem nicht eingetreten:

Code: Alles auswählen

procedure TfrmQuellenverwaltung.LadeQuellenListe();
var
  LiteQuery: TLiteQuery;
begin
  LiteQuery := TLiteQuery.Create(nil);
  LiteQuery.Connection := conn.conn;
  FQuellen.DataSet := LiteQuery;
  try
    LiteQuery.SQL.Clear;
    LiteQuery.SQL.Add('SELECT q.Abk, q.Zusatz, q.Sammlung, s.Bezeichnung');
    LiteQuery.SQL.Add('FROM Quellen q');
    LiteQuery.SQL.Add('LEFT JOIN QuellenSammlung s ON q.Sammlung = s.SammlungID');
    LiteQuery.SQL.Add('ORDER BY SUBSTR(q.Abk, 1, 1), q.Abk, q.Zusatz;');
    LiteQuery.Open;
  finally
    dbgQuellenListe.DataSource := FQuellen;
    dbgQuellenListe.Columns[2].Visible := False;
    dbgQuellenListe.Columns[3].Visible := False;
    // Column Auto Size
    dbgQuellenListe.Options := dbgQuellenListe.Options + [dgAutoSizeColumns];
    dbgQuellenListe.AutoAdjustColumns;
  end;
end; 
Eigentlich erwarte ich hier, dass die Spalten breit genug sind, damit der Inhalt sauber und vollständig angezeigt wird. Das Ergebnis ist jedoch nicht der Fall:

Bild
Tipp für PostgreSQL: www.pg-forum.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von wp_xyz »

Ich934 hat geschrieben:
Sa 19. Sep 2020, 12:52
Hm, und wo hast du diese .ini-Datei gefunden? Mein Programm hat dafür keine Funktion.
Das war in einer früheren Version des Programms so programmiert, ich hatte es einfach vergessen und beim Test nicht genau genug den Quelltext angeschaut. Hast du eine der PropStorage-Komponenten auf dem Formular? Damit können Properties in einer ini-, xml- oder json-Datei gespeichert werden, ohne dass eine Zeile in deinem Programm auftaucht?

Falls du das ausschließen kannst, solltest du den betreffenden Teil deines Programms in ein kleines Demo-Programm kopieren und dann hier hochladen. Aber bitte ersetze die TLiteQuery durch etwas, was zum Standardumfang von Lazarus dazugehört (auch keine großen SQL-Server wie postgresql oder mysql), am besten SQLite3 - ich möchte mir nicht unnötige Fremdkomponenten und Datenbanksysteme installieren, bloß um jemand einen Gefallen zu tun.

Läuft mein Programm zufriedenstellend bei dir? Wenn ja, könntest du hier die TSQLQuery durch TLiteQuery ersetzen. Falls es dann nicht mehr funktioniert, könnte man daraus schließen, dass deine LiteQuery etwas mit den Spaltenbreiten anstellt (ich wüsste aber nicht, wie).
Zuletzt geändert von wp_xyz am Sa 19. Sep 2020, 14:18, insgesamt 1-mal geändert.

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von Ich934 »

Nein, das hab ich nicht drinnen. Also daran liegt es nicht.

Dein Programm geht aber ich habe es herausgefunden. Es liegt nicht an den LiteDAC-Komponenten...

Ich habe mir einmal angeschaut, was deine Datenbank macht. Du nutzt dort STRING und VARCHAR. Das funktioniert natürlich ohne Probleme.

Änderst du den Datentyp in der Datenbank auf TEXT, so erscheint jetzt natürlich erst einmal (MEMO) in der Ausgabe. Dann brauchst du den Parameter dgDisplayMemoText um den Inhalt wieder zu erhalten. Ist das aktiviert, sishest du wieder den Inhalt. Jetzt funktioniert aber die automatische Zellenbereite nicht mehr.

Ich verwende bei mir in der Datenbank den Datentyp TEXT. Deswegen funktioniert das auch nicht... Jetzt ist die Frage ob Bug oder Feature...

Hab mir den Code einmal angeschaut. Schaut mir nach einen Bug aus. Die Breite in kleinen Feldern entspricht auch dem (Memo). Ich habe einen Burreport erstellt.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von Winni »

Hi!

Das ist ein Feature.

DB-Type TEXT sollst Du mit einem TDBMemo verbinden.

Im Feld-Type TEXT kann im Zweifelsfall ein komplettes Buch stecken.
Wie soll da eine Zellen-Breite kalkuliert werden?

Soooo breit sind die derzeitigen Bildschirme nun auch nicht.

Winni

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von Ich934 »

Naja, das kann bei dem Datentyp STRING bei SQLite eigentlich auch. Diesen gibt es gar nicht und da macht die Datenbank TEXT raus. Auch ein VARCHAR(10) wird ja intern auf ein TEXT umgewandelt (also jetzt hier bei SQLite).

Mit anderen Worten muss ich das also selbst machen oder gibt es eine andere Lösung?
Tipp für PostgreSQL: www.pg-forum.de

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: TDBGrid: Columnbreite automatisch anpassen

Beitrag von Ich934 »

Gelöst habe ich das jetzt wie folgt:

Code: Alles auswählen

procedure AutoSizeColDBGrid(DBGrid: TDBGrid; aAutoFille: boolean = False);
const
  DEFBORDER = 10;
var
  temp, n: integer;
  lmax: array [0..30] of integer;
begin
  if aAutoFille then
  begin
    DBGrid.AutoFillColumns := True;
  end
  else
  begin
    DBGrid.Options := DBGrid.Options - [dgAutoSizeColumns];
    DBGrid.AutoAdjustColumns;
    with DBGrid do
    begin
      Canvas.Font := Font;
      for n := 0 to Columns.Count - 1 do
        if columns[n].Visible then
          lmax[n] := Canvas.TextWidth(Columns[n].Field.DisplayName) + DEFBORDER;

      DataSource.DataSet.First;
      while not DataSource.DataSet.EOF do
      begin
        for n := 0 to Columns.Count - 1 do
        begin
          if columns[n].Visible then
          begin
            temp := Canvas.TextWidth(trim(ansistring(Columns[n].Field.Value))) +
              DEFBORDER;
            if temp > lmax[n] then
              lmax[n] := temp;
          end; { if }
        end; {for}
        DataSource.DataSet.Next;
      end; { while }
      DataSource.DataSet.First;
      for n := 0 to Columns.Count - 1 do
        if lmax[n] > 0 then
          Columns[n].Width := lmax[n];
    end; { With }
  end
Das ist eine Änderung der Lösung von hier. Meine Lösung funktioniert mit Lazarus und kommt auf mit den langen Texten (Memos) zurecht.

Die DEFBORDER mit 10 sind übrigens mit qt5 richtig. Ggf. muss man das für GTK2 oder Windows anpassen.

Problem ist damit für mich gelöst.
Tipp für PostgreSQL: www.pg-forum.de

Antworten