[Gelöst] TDBGrid: Columnbreite automatisch anpassen
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
[Gelöst] TDBGrid: Columnbreite automatisch anpassen
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
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
Re: TDBGrid: Columnbreite automatisch anpassen
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.
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.
Du musst in dem Satz das "bzw" durch ein "und" ersetzen, dann funktioniert es - siehe wiki.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...
- Dateianhänge
-
dbgrid colwidths2 - autocolwidth.zip
- (3.52 KiB) 125-mal heruntergeladen
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: TDBGrid: Columnbreite automatisch anpassen
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:
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:

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;

Tipp für PostgreSQL: www.pg-forum.de
Re: TDBGrid: Columnbreite automatisch anpassen
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?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.
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.
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: TDBGrid: Columnbreite automatisch anpassen
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.
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
- 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
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
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
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: TDBGrid: Columnbreite automatisch anpassen
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?
Mit anderen Worten muss ich das also selbst machen oder gibt es eine andere Lösung?
Tipp für PostgreSQL: www.pg-forum.de
-
- Lazarusforum e. V.
- Beiträge: 367
- Registriert: So 5. Mai 2019, 16:52
- OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 3.6, FPC 3.2.2)
- CPU-Target: x86_64, i386
- Wohnort: Bayreuth
Re: TDBGrid: Columnbreite automatisch anpassen
Gelöst habe ich das jetzt wie folgt:
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.
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
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