Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid Spaltenbreite (https://www.delphipraxis.net/114505-dbgrid-spaltenbreite.html)

Medium 26. Mai 2008 15:34

Datenbank: MySQL • Version: 4.1 • Zugriff über: Zeos

DBGrid Spaltenbreite
 
Ahoi!

Ich bekomme es gerade irgendwie nicht hin, die Spaltenbreiten in meinem DBGrid so zu ändern, wie ich es möchte. Ich möchte für einigen Spalten die Breite abhängig vom Titeltext machen, was an und für sich ja kein Problem ist. Allerdings wird das Grid zyklisch aktualisiert, und flackert durch das Ändern der Breiten ausgesprochen unschön.
Das Problem ist, dass ich Disable/EnableControls des Datasets zwar einsetzen kann während ich einen neue Query öffne, aber die zu ändernden Spalten gibt es in dem Grid natürlich zu dem Zeitpunkt nach dem Query.Open noch nicht, da das Grid ja disabled ist.
Sobald EnableControls aufgerufen wird, zeichnet sich das Grid sofort - und erst danach kann ich die Spaltenbreiten der nun vorhandenen Columns ändern. Das löst aber wieder für jede Spalte erneut ein Neuzeichnen aus, wodurch dann letztlich 4x gezeichnet wird, ich aber nur ein Mal ganz zum schluss will.

Im OnDrawColumnCell kann ich das auch nicht unterbringen, da auch dort ein Ändern der Breite ein Neuzeichnen auslöst, wodurch das ganze zu einer hübschen Endlosschleife wird.

Ein Begin/EndUpdate kennt das DBGrid wohl leider nicht :(. Weiss jemand wie ich diese Repaint-Odyssee beenden kann?

Medium 27. Mai 2008 11:49

Re: DBGrid Spaltenbreite
 
Hat sich vorläufig erstmal erledigt, da ich es so umgestellt hab, dass ich zur Designtime erstellte Columns mit den richtigen Breiten nehmen kann. Für ein Grid, dass aber u.U. unterschiedliche Tabellen verarbeiten können soll ist dieses Verhalten dennoch ärgerlich. Also: Akkutes Problem gelöst, die Lösung ist nur nicht universell :)

oki 27. Mai 2008 12:01

Re: DBGrid Spaltenbreite
 
Hi,

eine einfache Lösung ist immer nach der Berechnung zu prüfen, ob die Spalte schon die richtige Breite hat. Also den errechneten wert mit der aktuellen Spaltenbreite vergleichen. Ist die gleich, so wird nichts getan, sonst neu gesetzt. Damit ist das Flackern dann weg.

Ich benutze diese Methode häufig in den Settermethoden der Propertys meiner Componenten. Manchmal kann man Rekursionen nicht vermeiden, wenn die Änderung einer Eigenschaft die Änderung einer anderen nach sich zieht und umgekehrt. Durch den Vergleich wird dies unterbrochen. Ich lasse dann auch das Control nicht neu zeichnen, was Performance bringt und das Flackern vermeidet.

Gruß oki

FediDelPr 20. Dez 2018 14:02

AW: DBGrid Spaltenbreite
 
Wie lässt sich die Spaltenbreie eines DBGrid fixieren, so dass nicht bei jedem
ADOQuery.Open die Zeilenbreite wieder von der Datenbank übernommen werden ?

Mit der DBGrid Option dgColumnResize geht's leider nicht.
Da gibt es doch sicher eine ganz einfache Lösung.

Gruss und Danke für Ideen.

FediDelPr 20. Dez 2018 14:26

AW: DBGrid Spaltenbreite
 
noch vergessen, sollte zwar eigentlich nicht wichtig sein.

Delhi Berlin 10.1, Zugriff über ADOQuery, ACCESS 2016

mkinzler 20. Dez 2018 14:31

AW: DBGrid Spaltenbreite
 
Am Besten die Spalten (Columns) des DBGrids fest deklarieren, dann werden diese nicht dynmaisch aus der Abfrage generiert und behalten die Einstellungen.

Jumpy 20. Dez 2018 14:31

AW: DBGrid Spaltenbreite
 
Da du nach einer einfachen Lösung suchst ist das Wegschreiben der Spaltenbreiten im Query.BeforeClose und das erneute setzten der Spaltenbreiten im Query.AfterOpen wahrscheinlich nicht das, was du suchst?

Delphi.Narium 20. Dez 2018 14:40

AW: DBGrid Spaltenbreite
 
TJvDBGrids von den Jedis nehmen und dort AutoSizeColumns auf false setzen.

Bei dem TJvDBGrid kann man auch die Mindest- bzw. Höchstbreite der Spalten festlegen ...

Ansonsten: Im AfterOpen der Tabellen- / Abfragekomponente die Werte nach Wunsch setzen.

Alte Werte ggfls. im BeforeClose-Ereignis speichern, um sie später wieder laden zu können.

Dazu könnte man zum Speichern
Delphi-Quellcode:
DBGrid1.Columns.SaveToFile(DBGrid1.Name + '.cfg')
und zum Laden
Delphi-Quellcode:
DBGrid1.Columns.LoadFromFile(DBGrid1.Name + '.cfg')
nehmen.

FediDelPr 20. Dez 2018 19:20

AW: DBGrid Spaltenbreite
 
Danke für die Lösungen!

Vorerst genügt die Variante mit ADOQuery.AfterOpen;
Ein paar Stichworte zu "die Spalten fest deklarieren" würden mich schon noch interessieren.

Delphi.Narium 20. Dez 2018 20:05

AW: DBGrid Spaltenbreite
 
Query in der Entwicklungsumgebung öffnen.
Dann mit der rechten Maustase auf das DBGrid klicken.

Nun im Spalteneditor alle benötigten Spalten hinzufügen und die Spaltenbreite ... im DBGrid "zurechtschibbeln".
Danach in der Entwicklungsumgebung die Query schließen.

Die vorgenommene Konfiguration des DBGrids sollte dann erhalten bleiben.

Solange die Query immer für das gleiche Select genutzt wird und sich nur die Wherebedingung (soweit vorhanden) ändert, sollte die Optik des DBGrids unverändert bleiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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