Marquage d'enregistrements

De RAD Studio
Aller à : navigation, rechercher

Remonter à Navigation dans les ensembles de données

Outre la possibilité de se déplacer d'un enregistrement à un autre dans un ensemble de données (ou de se déplacer selon un nombre déterminé d'enregistrements), il est possible de marquer un emplacement particulier dans un ensemble de données de façon à y revenir rapidement le moment voulu. Data.DB.TDataSet présente cette fonction sous la forme de la propriété Bookmark et de cinq méthodes de définition de signets.

TDataSet implémente des méthodes virtuelles de gestion des signets. Bien que ces méthodes garantissent que chaque objet ensemble de données dérivé de TDataSet renvoie une valeur si une méthode de signet est appelée, les valeurs renvoyées sont simplement des valeurs par défaut qui n'indiquent pas la position en cours. Les descendants de TDataSet ont des niveaux de support de signets différents. Les ensembles de données dbExpress ne supportent pas les signets. Les ensembles de données ADO peuvent prendre en charge les signets, en fonction des tables de la base de données sous-jacente. Les ensembles de données BDE, InterBase express et client prennent toujours en charge les signets.

La propriété Bookmark

La propriété Bookmark indique quel est le signet en cours dans votre application. Bookmark est une chaîne qui identifie le signet en cours. Tout nouveau signet ajouté devient le signet en cours.

La méthode GetBookmark

Pour créer un signet, vous devez déclarer une variable de type TBookmark dans votre application, puis appeler GetBookmark pour allouer un espace de stockage à la variable et définir sa valeur par un emplacement particulier dans l'ensemble de données. Le type TBookmark est un pointeur.

Les méthodes GotoBookmark et BookmarkValid

Lorsqu'un signet lui est transmis, GotoBookmark déplace le curseur de l'ensemble de données à l'emplacement du signet. Avant d'appeler GotoBookmark, vous pouvez appeler BookmarkValid pour déterminer si le signet pointe sur un enregistrement. BookmarkValid renvoie True si le signet pointe sur un enregistrement.

La méthode CompareBookmarks

CompareBookmarks peut être appelée pour voir si un signet sur lequel vous voulez vous déplacer est différent d'un autre signet ou du signet en cours. Si les deux signets font référence au même enregistrement (ou si tous les deux sont nil), CompareBookmarks renvoie 0.

Un exemple d'utilisation de signets

Le code suivant illustre l'utilisation des signets :

procedure DoSomething (const Tbl: TTable)
var
  Bookmark: TBookmark;
begin
  Bookmark := Tbl.GetBookmark; { alloue la mémoire et affecte une valeur }
  Tbl.DisableControls; { désactive l'affichage des enregistrements dans les contrôles orientés données }
  try
    Tbl.First; { se déplace sur le premier enregistrement de la table }
    while not Tbl.Eof do {parcourt tous les enregistrements de la table }
    begin
      { insérez ici votre traitement }
      .
      .
      .
      Tbl.Next;
    end;
  finally
    Tbl.GotoBookmark(Bookmark);
    Tbl.EnableControls; { réactive l'affichage des enregistrements dans les contrôles orientés données, si nécessaire }
  end;
end;
void DoSomething (const TTable *Tbl)
{
  TBookmark Bookmark = Tbl->GetBookmark(); // alloue la mémoire et affecte une valeur
  Tbl->DisableControls(); // désactive l'affichage des enregistrements dans les contrôles orientés données
  try
  {
    for (Tbl->First(); !Tbl->Eof; Tbl->Next()) // parcourt tous les enregistrements de la table
    {
      // insérez ici votre traitement
      .
      .
      .
    }
  }
  __finally
  {
    Tbl->GotoBookmark(Bookmark);
    Tbl->EnableControls(); // réactive l'affichage des enregistrements dans les contrôles orientés données
  }
}

Avant d'entrer dans le processus de parcours des enregistrements, les contrôles sont désactivés. Même si une erreur se produit durant le balayage des enregistrements, la clause finally permet d'être sûr que les contrôles seront toujours réactivés et que le signet sera toujours restitué, même si la boucle se termine prématurément.

Voir aussi