![]() |
cxGrid RecordChanged
Hallo liebe Gemeinde,
ich benutze das cxGrid (DB) von TMS. angebunden ist das ganze an mysql. vorhanden sind 3 tabellen. lieferant produktgruppe produkt. benutze dafür Uniconnection, und 3 uniquery verbunden sind diese über die jeweilige id der mastertabelle. das ganze funkt. auch so wie es soll. jetzt zum Problem. ich brauche ein event für den datensatz wechsel im letzten Grid. heißt: wenn ich das Produkt wechsle sei es durch scroll ( maus ) oder tasten rauf runter muss ein bild aus dem internet geladen werden. das laden dauert 2-3 sek. Wenns nur einmal käme, wäre das in Ordnung. dummerweise ereignend sich dieses Ereignis besonders bei start der Anwendung bereits 17 mal. ( wohlgemerkt bei nur 2 testprodukten in der db ) Eingebaut habe ich den download in das Ereignis: cxGridDBTableView2FocusedRecordChanged offensichtlich kann man das direkt mit den sagen wir mal RowDraw vergleichen, das Ereignis würde ja bei jeden Datensatz kommen.... PS. rowdraw gibt’s vielleicht nicht, ( nur als Beispiel ) habe schon alle Ereignisse die passen könnten getestet, aber nix dabei, das gerade beim ersten öffnen nur einmal ( sich ereignet... ) auch bei den Ereignissen des Querys und des Datasets fand ich nichts was funktionierte. Eine Hoffnung hätte ich noch bei DataModul_haupt.DS_MySQl_produkte.DataSet.DisableC ontrols; Habe aber keine passende Stelle gefunden, wo ich das einbauen könnte. Das Ereignis record gewechselt, soll ja mindestens einmal ( und nicht öfters ) kommen Ich hoffe ihr könnt mir folgen und helfen. mfg peberhardt |
AW: cxGrid RecordChanged
Die Komponente ist von Developer Express und ich meine, es wäre das GridView.OnFocusedRecordChanged-Event, das Du verwenden kannst.
Und natürlich wird beim Initialen Starten das Event ausgelöst. Wenn der Lieferant geladen wird, werden für jeden Datensatz die Details geladen und damit auch der o.g. Event ausgelöst. Abhilfe: Lösche alle Events vor der Initialisierung und hänge sie hinterher wieder ein. Dann rufst Du einmalig das Event für das gerade fokussierte Produkt auf und fertig. |
AW: cxGrid RecordChanged
besten dank für deine antwort.
wo könnte ich das wieder einhängen.. sollte schon in einen ereigniss sein. das ist wie eine kettenreaktion das lieferantengrid lädt z.b. 2x dadurch lädt das produktgruppen grid je lieferand dessen pgruppen und das produktgrid praktisch anzahl lieferanten x anzahl pgruppen x anzahl produkte mfg peberhardt |
AW: cxGrid RecordChanged
'Kettenreaktion' trifft den Nagel auf den Kopf.
Delphi-Quellcode:
So in etwa. Natürlich alle relevanten Events vorher per ':= Nil' aushängen und hinterher wieder einhängen.
Procedure TMyForm.InitializeData;
Begin MyProductGridView.OnRecordChanged := Nil; Try LoadDataFromDatabase(); .. Finally MyProductGridView.OnRecordChanged := MyProductGridViewRecordChangedEvent; End End; Eine Alternative ist die Verwendung eines privaten boolschen Feldes 'fInitializing'.
Delphi-Quellcode:
und in jedem Eventhandler
Procedure TMyForm.InitializeData;
Begin fInitializing := True; Try LoadDataFromDatabase(); .. Finally fInitializing := False; End End;
Delphi-Quellcode:
Beides hat Vor- und Nachteile. Ich tendiere zur 2.Möglichkeit, weil ich dadurch generell steuern kann, wann meine Events feuern sollen.
Procedure TMyForm.MyProductGridViewRecordChanged(...);
Begin if fInitializing then exit; // <-- diese Zeile am Anfang jedes Eventhandlers ... End; Falls die Daten schon geladen sind und dein Problem beim instantiieren der Form auftritt, dann würde ich so vorgehen
Delphi-Quellcode:
Procedure TMyForm.FormCreate(...)
Begin MyGridView.DataBinding.DataSource := Nil; End; Procedure TMyForm.FormActivate(...) Begin MyProductGridView.OnRecordChanged := Nil; Try MyGridView.DataBinding.DataSource := MyDataSource; Finally MyProductGridView.OnRecordChanged := MyProductGridViewRecordChangedEvent; End End; |
AW: cxGrid RecordChanged
besten dank
werde das heute abend mal testen ich melde mich dann wieder mfg peberhardt |
AW: cxGrid RecordChanged
Hallo,
habs jetzt doch anders hinbekommen.
Delphi-Quellcode:
und im FocusedRecordChanged frage ich die globale variable ab...
procedure TDataModul_haupt.Query_MySQl_lieferantenBeforeScroll(DataSet: TDataSet);
begin form_haupt.var_counter:='a'; end; procedure TDataModul_haupt.Query_MySQl_produkt_gruppenBeforeScroll(DataSet: TDataSet); begin form_haupt.var_counter:='a'; end;
Delphi-Quellcode:
Danke für deine Mühe.
if var_counter = 'a' then
begin du was... und zwar nur einmal.... var_counter := 'x'; end; mfg peberhardt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz