Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Prinzipielle Frage zu OnDataChange von Datasource (https://www.delphipraxis.net/144859-prinzipielle-frage-zu-ondatachange-von-datasource.html)

ranger 18. Dez 2009 09:17

Datenbank: Oracle • Zugriff über: ODAC

Prinzipielle Frage zu OnDataChange von Datasource
 
Hoffe jemand kann mir weiterhelfen, ich "verstehe" die Aufrufe des OnDataChange-Ereignisses nach aktivieren und nach refreshen einer Datenbankverbindung nicht ganz;

habe folgendes Problem: möchte bei einem Datensatzwechsel über das OnDataChange-Ereignis irgend eine externe Delphi-Funktion starten, die bestimmte Berechnung macht und Ergebnis zu dem gerade gewechselten Datensatz anzeigt;

nun habe ich das Problem dass

1.) beim aktivieren der zum Dataset gebundenen Query das OnDataChange bereits 3x ausgeführt wird, und immer mit dem selben Datasource.State

2.) beim Refresh das ereignis sogar 5x aufgerufen wird!!! ich möchte aber aus zeittechnischen Gründen die Berechnung, die ich im DataChange-Ereignis ausführe, nicht x-mal ausführen, sondern nur 1x!!!


Beim Datensatzwechsel klappts dann perfekt, Ereignis wird nur 1x aufgeführt! Aber ansonsten vergeude ich unnötige Rechenzeit durch unnötige Aufrufe.

Kann mir jemand erklären, warum das Ereignis so oft ausgeführt wird?


Wenn ich ein Grid von DevExpress zu dem DataSource hänge, dann erfolgt der OnDataChange-Aufruf sogar noch öfters.

Wie löst ihr prinzipiell solche Probleme? Ist das Koppeln an das OnDataChange der Datasource der richtige Ansatzpunkt?

hoika 18. Dez 2009 15:02

Re: Prinzipielle Frage zu OnDataChange von Datasource
 
Hallo,

gleiches Problem beim TreeView.

Ich merke mir immer den letzten Datensatz (DB-Id),
in FormCreate auf -1 setzen
und wenn sich im OnChange die DB-Id ändert,
wird diese neue ID als "gemerkte" gesetzt
und eine eigene DataChange-Methode aufgerufen.


Heiko

Alter Mann 18. Dez 2009 16:42

Re: Prinzipielle Frage zu OnDataChange von Datasource
 
Hallo

am besten vermerkt ihr in einer Variablen IsRunning : Boolean ob ihr in eurer protected Routine seid und
in der Variablen CurrentID : Integer welcher der 'aktuelle' Datensatz ist.
zB.
Delphi-Quellcode:
...
type
  Txx = class(Txxx)
  private
   IsRunning : Boolean;
   CurrentID : Integer;
  protected
   procedure InternalDataChange;
  public
  end;
...
procedure Txx.DataChange(Sender: TObject);
begin
  if( (FDataLink.Field <> nil) and not FDataLink.DataSourceFixed) and
  ((FDataLink.KeyField.AsInteger <> CurrentID) and not IsRunning)) and
  ((FDataLink.KeyFieldName <> '') or (FDataLink.ImageNameFieldName <> '')) then
  begin
    ...
    InternalDataChange;
    ...
  end;
end;
...
Viele Grüße

Alter Mann


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