[gelöst] Fragen zum DBGridController

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
ErnstVolker
Beiträge: 359
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[gelöst] Fragen zum DBGridController

Beitrag von ErnstVolker »

Guten Abend,

ich bin gerade auf einem Formular mit zwei DBGrid und zwei DBGridControllern am basteln.

https://wiki.freepascal.org/TdxDBGridController

Was mir auffällt ist, dass entgegen des letzten Bildes auf der Website das DBGrid nicht über den Objektinspektor zugeordnet werden kann. Der Eintrag DBGrid fehlt. Das ist nicht weiter tragisch, man kann das DBGrid im Quelltext zuordnen.

Code: Alles auswählen

dxDBGridController1.DBGrid:= DBGrid1;
Mein eigentliches Problem liegt aber woanders. Die obige Zuweisung mache ich in einem FormShow-Ereignis mit beiden Controllern. Das FormShow wird durch einen Button auf einer anderen Form ausgelöst. Soweit so gut.

Das Studium des Beispiels zum DBGridController lehrte mich, dass man dem DBGridController auch nil zuweisen kann:

Code: Alles auswählen

dxDBGridController.DBGrid:= nil;
Das mache im FormClose-Ereignis bei beiden Controllern. Das mache ich deshalb, weil ich feststellte, dass sich mein Programm nicht richtig beenden ließ, nachdem ich die Form Geschlossen hatte. Es gab eine SIGSEV-Meldung. Die war weg und das Programm schließt auch ohne Verzögerung, wenn ich dem Controller bei FormClose das DBGrid durch nil ersetze.

Läuft das Programm und ich öffne die Form über den Button sind beide DBGrid mit DBGridControllern zu sehen und zu bedienen. Schließe ich die Form und öffne anschließend erneut, dann ist nur noch ein DBGrid zu sehen, nämlich das was im FormShow-Ereignis in zweiter Quelltextzeile die Zuordnung des DBGrid bekommt.

Code: Alles auswählen

dxDBGridController1.DBGrid:= DBGrid1;

Code: Alles auswählen

dxDBGridController2.DBGrid:= DBGrid2;
Vertausche ich die beiden Zeilen in FormShow, dann erscheint nach dem zweiten Mal FormShow nur noch DBGrid1.

Arbeitet jemand mit dem DBGridController und kennt das Problem oder nehmt Ihr andere DBGrids mit Sortier- und Filterfunktionen (rxDBGrid oder ähnliche)?

Wenn ich in der Suche DBGridController eingäbe kommen nicht viele Antworten, das macht mich stutzig...

Viele Grüße
Zuletzt geändert von ErnstVolker am Sa 29. Jul 2023, 08:30, insgesamt 1-mal geändert.

ErnstVolker
Beiträge: 359
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Fragen zum DBGridController

Beitrag von ErnstVolker »

Bin selbst auf die Lösung gekommen. Ich hatte vergessen zu erwähnen, dass beim zweiten Öffnen des Formulars, das verbliebene DBGrid das komplette Formular einnimmt, als hätte es sich über das erste DBGrid gelegt.

Da kam mir die Idee mal die Anker außer Kraft zu setzen. Das brachte aber auch nicht den gewünschten Effekt.

Die Lösung: Zwei GroupBoxen. Die DBGrids in jeweils eine Groupbox packen, dann bleiben sie beide auf dem Formular ersichtlich.

Schönen Tag!

charlytango
Beiträge: 1099
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [gelöst] Fragen zum DBGridController

Beitrag von charlytango »

Ich habe mit TdxDBGridController (noch) keine wirkliche Erfahrung außer der Demo.

Und dort weist er Autor in Zeile 351 auch selbst den DBGrid zu.
// Important we assign the grid to the controler once the grid is ready and loaded

Code: Alles auswählen

   If Assigned(dxDBGridController) Then
   Begin
      dxDBGridController.DBGrid := grdProject; 
.....
Allerdings tut er das wohl mit Absicht im OnCreate Event des Formulars auf dem DBGrid und der Controller sind.

Um hier qualifiziert helfen zu können beschreibst du einfach zu viele Parameter die man mangels Beispielcode (!) nicht beurteilen kann.

Meiner Vermutung nach liegt das seltsame Verhalten in der Art des Aufrufs des Formulars.

Ich vermute du lässt die Formulare von Lazarus automatisch erzeugen ?
Die Projektoptionen (Shift-Ctrl-F11) geben darüber Auskunft beim Punkt Formulare/Forms.
Bei mir und vielen anderen befindet sich da nur das Hauptformular das automatisch erzeugt wird. Alle anderen Formulare werden kontrolliert im Code erzeugt und auch wieder zerstört.

Damit bekommst du die SIGSEV in den Griff. Das geht sicher auch mit automatisch erzeugten Formularen, ist aber ein anderes Konzept. Ich habe da gerne die Kontrolle wann etwas passiert.

ErnstVolker
Beiträge: 359
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Fragen zum DBGridController

Beitrag von ErnstVolker »

Guten Morgen,

muß hier doch nochmal was zum DBGridController fragen. Seit dem letzten Update zeigt er mir in machen DBGrid's mitten drin den Schriftzug "No Data found" an, obwohl Daten angezeigt werden. Kenn jemand das Verhalten? Woran liegt das?

Vielen Dank!

charlytango
Beiträge: 1099
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [gelöst] Fragen zum DBGridController

Beitrag von charlytango »

Ich habe keine valide Ahnung warum das passiert.

Aber wenn ich in dxDBGridcontroller.pas des Paketes schaue ...
Ein grep über den Inhalt des Packages führt mich zu Zeile 99 und dann zu Zeile 3308.

Zuerst wird abgefragt ob der Grid valide ist (dazu gibt es eine eigene Funktion), dann nach dem Recordcount geschaut.
Da würde ich mal ansetzen und das auseinander dröseln und debuggen.

Offensichtlich kann man diese Nachricht in den FControllerOptions mittels coShowNoDataHint abschalten.
Das ist jetzt nicht elegant, aber erstmal ist dann die Nachricht weg.

ErnstVolker
Beiträge: 359
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: [gelöst] Fragen zum DBGridController

Beitrag von ErnstVolker »

Guten Morgen charlytango,

vielen Dank für den Tipp.

In der Unit zum Controller hatte ich zwar nachgesehen. War auch auf die Zeile 99 gestoßen (Ich übersetze mir da die Strings auf Deutsch :wink: ), war auch in 3308 gelandet (weil ich dem "msg_nodata" gefolgt war)
aber den letzten Gedankenschritt hatte ich nicht. Einfach bei "coShowNoDataHint" den Haken rausnehmen. Schon funktioniert's.

Danke nochmal!

Antworten