Ein Blick in die Sourcen macht das klar:
Delphi-Quellcode:
procedure TBDEDataSet.SetUpdateRecordSet(RecordTypes: TUpdateRecordTypes);
begin
CheckCachedUpdateMode;
CheckBrowseMode;
UpdateCursorPos;
Check(DbiSetProp(hDbiObj(
Handle), curDELAYUPDDISPLAYOPT, Longint(Byte(RecordTypes))));
Resync([]);
end;
Delphi-Quellcode:
procedure TDataSet.CheckBrowseMode;
begin
CheckActive;
DataEvent(deCheckBrowseMode, 0);
case State of
dsEdit, dsInsert:
begin
UpdateRecord;
if Modified then Post else Cancel;
end;
dsSetKey:
Post;
end;
end;
OK - das erklärt es, wobei das (vermutlich wg. CachedUpdates) ja immer noch nicht tatsächlich in der Datenbank angekommen ist, sondern wohl "nur" in der internen (
Paradox basierten) Speichertablle, oder?
(OffTopic: eine Methode "CheckXXXX" zu nennen und dann in der Methode die Daten zu verändern, halte ich übrigens für seehr schlechten Programmierstil - und hatte ich ebenfalls beim groben durchsehen der Quellen nicht erwartet)
Wenn man überlegt, ist das auch nachvollziehbar, da die Hilfe ja erwähnt, dass es eine Art Filter ist, und beim Ändern eines Filters könnte ja der aktuelle Datensatz aus der Anzeige rausfallen. Insofern ist ein Wechsel in den dsBrowse State schon angebracht
Stimmt, der umgekehrte Weg, dass jemand ein bestehendes Flag (z.B.
rtModified) aus den
UpdateRecordTypes entfernt, könnte ja auch sein - habe ich mir noch gar nicht klar gemacht...
Wäre denn (anhand der o.a. Ergebnisse) für die Status-Abfrage des aktuellen Records folgendes richtiger?
Delphi-Quellcode:
Result := usUnmodified;
if ( (ds_ is TBDEDataSet) and TBDEDataSet(ds_).UpdatesPending and (ds_.UpdateStatus() <> usUnmodified) ) then begin
Result := ds_.UpdateStatus();
else
if ( ds_.Modified ) then begin
Result := usModified;
end;
oder einfach ganz ohne TBDEDataSet-Prüfung (da UpdateStatus() in der Basis-Implementierung und ohne CachedUpdates usUnmodified zurückliefert):
Delphi-Quellcode:
Result := usUnmodified;
if ( ds_.UpdateStatus() <> usUnmodified ) then begin
Result := ds_.UpdateStatus();
else
if ( ds_.Modified ) then begin
Result := usModified;
end;
Aber für die Abfrage des Status des gesamten Queries müsste dann doch tatsächlich über alle Records gelaufen werden - auf das
State-Property kann ich mich da ja nicht verlassen (wenn
CachedUpdates gesetzt ist), oder?