DBGrid sortieren lassen, nach dessen Erzeugung
-
Hi,
So, nach Stundenlangem rumgesuche und rumprobieren, versuch ich's mal hier...
Also, ich will ein DBGrid nach dem Klick auf eine Spalte, diese Spalte sortieren lassen. Klappt wunderbar...
Das ganze hab ich in eine Komponente gepackt. Klappt ebenfalls...
Jetzt will ich, das daß Grid beim Erzeugen automatisch die erste Spalte sortiert, sprich,
wenn ein Formular mit dem Grid angezeigt wird, ist die 1. Spalte autom. sortiert.
Und genau das funktioniert nicht...Genauere Beschreibung des Probs:
Zum Sortieren wird das SQL Statement der Datenquelle neu geschrieben, so das daß Query mit Active = false/true aktualisiert werden muß. (Ändert sich das Query wird das Grid natürlich neu aufgebaut.)
Der Code zum Sortieren wird (über Dispatch(msg*) im DBGrid) bei WM_CREATE ausgeführt. Und genau bei "Active = false" bleibt das Programm hängen. Keine Fehlermeldung, kein gar nix.Könnte es sein, das das Erstellen der Columns ebenfalls über WM_CREATE an das Grid geschickt wird und somit eine schöne Endlosschleife vorhanden ist?
ist WM_CREATE überhaupt der richtige Einsprungspunkt (glaub ich ja eher nicht, hab aber nix anderes gefunden)?
Wär ja Klasse, wenn sich jemand n bissle mit den DBGrid's auskennt...

-
Vorschlag meinerseits:
Einfach merken, nach welcher Spalte du sortierst. Wenn du nun noch einmal deine Sortierfunktion aufrufst und stellst dabei fest, das du bereits nach dieser Spalte sortiert hattest, dann tu das einfach nicht mehr. Damit dürfte sich das Problem deiner Endlosschleife ganz nebenbei in Wohlgefallen auflösen
-
Danke für die Antwort, aber leider ist dem nicht so
.Ich habs jetzt "gelöst", indem ich das Grid (und einige andere Kompos in einem Panel) als Komponentenvorlage gespeichert habe.
Ist allerdings blöd, da der Code dabei ja 20.000 mal doppelt im Programm vorkommt...Kennt jemand vielleicht ne -gute- DBGrid Komponente, mit der ich einfach sortieren und filtern lassen kann?
(zumindest Sortierung ist wichtig)Benjie
-
cPanther schrieb:
Der Code zum Sortieren wird (über Dispatch(msg*) im DBGrid) bei WM_CREATE ausgeführt.
Wozu das denn? Setz doch einfach im ORDER BY des ursprünglichen SQL-Statements die gewünschte Spalte, d.h. das entsprechende Feld!?
-
Wozu das denn?
Weil das Query sich ständig ändert, klar kann ich immer die entspr. Spalte
vorher sortieren, das Grid soll diese Sortierung dann allerdings auch anzeigen(Farblich usw.).
Das kann dann zwar auch geparst werden, aber das ist dann doch etwas zu viel Aufwand, bzw. zu unsicher, wer weiß was für SQL States da ankommen...
Aber, so gang nebenbei beschränkt sich meine Frage jetzt darauf,
welche Message gesendet wird, wenn, z. B. ein DBGrid -komplett- fertig erzeugt wurde.Dazu ein weiteres kleines Beispiel:
Ich will das PopupMenu des Grids beim -Start- ändern. Wenn ein PopupMenu hinterlegt wurde, soll dieses erweitert werden, wurde keines zugeordnet, soll eins erzeugt werden.
Dazu muß ich also prüfen, ob PopupMenu NULL ist, was natürlich nur geht, -nachdem- die dfm komplett geladen und erzeugt wurde, im ctor kann mans ja net abfragen.Halt das gleiche Problem wie die Neuzuordnung der DataSource.
Irgendwer ne Idee, -wo- ich reinspringen muß, so das alles erzeugt wurde?
(Klar, TForm::OnOpen(), aber ich hab ne Kompo, ein DBGrid...)Benjie
-
Für solche Zwecke gibt es Methoden von TComponent, eine heißt "LoadComponent". Soviel ich weiß, wird die aufgerufen, wenn die Komponente ihre Daten (eigenschaftswerte und Ereignisse) laden soll. Da sie virtuell ist, kannst Du sie ja einfach überschreiben.