J'ai le code comme ci-dessous dans un projet que je travaille.Combien de temps un signet TDataset reste-t-il valide?
procedure TForm.EditBtnClick(Sender:TObject);
begin
// Mark is form variable. It's private
Mark = cdsMain.GetBookmark;
// blabalbal
.
.
.
end;
procedure TForm.OkBtnClick(Sender:TObject);
var
mistakes: Integer;
begin
//Validation stuff and transaction control
//removed to not clutter the code
If cdsMain.ChangeCount <> 0 then
mistakes := cdsMain.AppyUpdates(-1);
cdsMain.Refresh;
try
cdsMain.GotoBookmark(Mark);
// Yes, I know I would have to call FreeBookmark
// but I'm just reproducing
except
cdsMain.First;
end;
end;
Personnellement, je ne pas utiliser des signets bien - sauf pour repositionner un ensemble de données où je ne déplacé la position du curseur (pour créer une liste, remplir une liste de chaînes, etc.). Si je Refresh
, mise à jour (en particulier lorsqu'un filtre peut rendre l'enregistrement invisible), refetch (Close
/Open
) ou toute opération qui modifie les données dans le jeu de données, je n'utilise pas de signets. Je préfère Locate
sur la clé primaire (en utilisant un TClientDataset
, bien sûr) ou en modifiant les paramètres.
Jusqu'à quand un signet est-il valide? Jusqu'à un Refresh
? Jusqu'à ce qu'un Close
/Open
soit fait pour reconstituer des données? Où s'arrête la zone de sécurité? Dans la réponse, j'utilise TClientDataset
avec un TSQLQuery
(DbExpress). TDataSet implémente des méthodes de signet virtuel.
Après quelques expérimentations, même BookmarkValid se montre peu fiable. Cela arrive quand un filtre est activé sur l'ensemble de données - il retourne vrai même si l'enregistrement ne correspond pas à la condition de filtre. Le résultat final est le lancement d'une exception. –