Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   cxGrid RecordChanged (https://www.delphipraxis.net/173070-cxgrid-recordchanged.html)

peberhardt 5. Feb 2013 20:34

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

Furtbichler 6. Feb 2013 07:21

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.

peberhardt 6. Feb 2013 07:36

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

Furtbichler 6. Feb 2013 07:42

AW: cxGrid RecordChanged
 
'Kettenreaktion' trifft den Nagel auf den Kopf.

Delphi-Quellcode:
Procedure TMyForm.InitializeData;
Begin
  MyProductGridView.OnRecordChanged := Nil;
  Try
    LoadDataFromDatabase();
    ..
  Finally
    MyProductGridView.OnRecordChanged := MyProductGridViewRecordChangedEvent;
  End
End;
So in etwa. Natürlich alle relevanten Events vorher per ':= Nil' aushängen und hinterher wieder einhängen.

Eine Alternative ist die Verwendung eines privaten boolschen Feldes 'fInitializing'.
Delphi-Quellcode:
Procedure TMyForm.InitializeData;
Begin
  fInitializing := True;
  Try
    LoadDataFromDatabase();
    ..
  Finally
    fInitializing := False;
  End
End;
und in jedem Eventhandler
Delphi-Quellcode:
Procedure TMyForm.MyProductGridViewRecordChanged(...);
Begin
  if fInitializing then exit; // <-- diese Zeile am Anfang jedes Eventhandlers
...
End;
Beides hat Vor- und Nachteile. Ich tendiere zur 2.Möglichkeit, weil ich dadurch generell steuern kann, wann meine Events feuern sollen.

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;

peberhardt 6. Feb 2013 08:06

AW: cxGrid RecordChanged
 
besten dank

werde das heute abend mal testen

ich melde mich dann wieder

mfg peberhardt

peberhardt 6. Feb 2013 21:18

AW: cxGrid RecordChanged
 
Hallo,

habs jetzt doch anders hinbekommen.

Delphi-Quellcode:
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;
und im FocusedRecordChanged frage ich die globale variable ab...

Delphi-Quellcode:
  if var_counter = 'a' then
  begin
    du was... und zwar nur einmal....
    var_counter := 'x';
  end;
Danke für deine Mühe.

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