![]() |
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? |
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 |
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:
Viele Grüße
...
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; ... 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