Michl hat geschrieben: Mo 14. Mär 2022, 11:05
Ist es definitiv immer gewährleistet, daß bei einem Query.Delete der Zeiger auf den nächsten Datensatz gesetzt wird? Bei Zeos und SQLDB funktioniert das hier, aber ist dies dauerhaft gewährleistet bzw. definiert?
Zunächst hätte ich gesagt, dass das so ist, also dass nach einem Dataset.Delete der nächste Record aktiv wird. Und Michael Van Canneyt schreibt im "Lazarus Handbook" auch: "
The current record will then be deleted, and the cursor will be positioned on the next record in the Dataset (if there is one)"
Aber wenn man sich den Quellcode von TDataset ansieht, ist das keinesfalls garantiert. Zunächst mal soll ein Abkömmling von TDataset die Methode InternalDelete überschreiben, und dort den Datensatz löschen. Das wird von Delete mit allem Drum-Herum aufgerufen. Das wäre OK.
Aber Delete ist als virtual deklariert - das heißt, ich könnte in meinem eigenen TDataset-Abkömmling ein komplett anderes Verhalten implementieren und den Cursor nach dem Löschen an den Anfang setzen (das wäre gemein...), oder den Dataset auf Active=false setzen, damit z.B. zur Sicherheit keine weiteren Datensätze gelöscht werden können, oder warum und was auch immer. Logisches Verhalten bei Fremdkomponenten darf man nicht immer voraussetzen.