Datensätze markieren und dorthin zurückkehren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Durch Datenmengen navigieren


Oft sollen die Datensätze einer Datenmenge nicht einfach sequentiell durchlaufen werden, sondern man möchte eine bestimmte Position in einer Datenmenge markieren und bei Bedarf schnell dorthin zurückkehren. Die Klasse Data.DB.TDataSet führt eine Funktion zur Positionsmarkierung ein, die aus einer Eigenschaft vom Typ Bookmark und fünf zugehörigen Positionsmarken-Methoden besteht.

TDataSet implementiert virtuelle Positionsmarken-Methoden. Obwohl diese Methoden garantieren, dass bei ihrem Aufruf jedes von TDataSet abgeleitete Datenmengenobjekt einen Wert zurückliefert, sind die Rückgabewerte lediglich Standardwerte, die keine Auskunft über die aktuelle Position geben. Die Nachkommen von TDataSet unterstützen Positionsmarken in unterschiedlichem Maße. So bieten die dbExpress-Datenmengen keinerlei Unterstützung für Positionsmarken. Abhängig von der zugrunde liegenden Datenbanktabelle, können ADO-Datenmengen Positionsmarken verarbeiten. BDE-Datenmengen, InterBase-Express-Datenmengen und Client-Datenmengen unterstützen Positionsmarken durchgehend.

Die Eigenschaft Bookmark

Die Eigenschaft Bookmark gibt an, welche der in Ihrer Anwendung vorhandenen Positionsmarken aktuell ist. Die Eigenschaft enthält einen String, der die aktuelle Positionsmarke angibt. Jedes Mal, wenn Sie eine weitere Positionsmarke hinzufügen, wird diese zur aktuellen Marke.

Die Methode GetBookmark

Zum Erstellen einer Positionsmarke müssen Sie in der Anwendung eine Variable des Typs TBookmark deklarieren und dann GetBookmark aufrufen, um der Variablen Speicher zuzuweisen und den Wert auf eine bestimmte Position in einer Datenmenge zu setzen. TBookmark ist ein Zeigertyp.

Die Methoden GotoBookmark und BookmarkValid

Sobald eine Positionsmarke übergeben wird, bewegt die Methode GotoBookmark den Cursor der Datenmenge zu der angegebenen Position. Vor dem Aufrufen von GotoBookmark können Sie die Methode BookmarkValid aufrufen, um festzustellen, ob die Positionsmarke auf einen Datensatz verweist. BookmarkValid gibt True zurück, wenn dies der Fall ist.

Die Methode CompareBookmarks

Mit der Methode CompareBookmarks können Sie feststellen, ob die Positionsmarke, zu der Sie wechseln möchten, sich von einer anderen (oder der aktuellen) Positionsmarke unterscheidet. Wenn beide auf denselben Datensatz verweisen (oder wenn in beiden der Wert nil steht), gibt CompareBookmarks den Wert 0 zurück.


Beispiel für das Arbeiten mit Positionsmarken

Der folgende Quelltext zeigt den Einsatz von Positionsmarken:

procedure DoSomething (const Tbl: TTable)
var
  Bookmark: TBookmark;
begin
  Bookmark := Tbl.GetBookmark; { Speicher reservieren und einen Wert zuweisen }
  Tbl.DisableControls; { Datensatzanzeige in Steuerelementen deaktivieren }
  try
    Tbl.First; { Auf den ersten Datensatz in der Tabelle positionieren }
    while not Tbl.Eof do {durch alle Datensätze der Tabelle iterieren }
    begin
      { Hier folgt die weitere Verarbeitung }
      .
      .
      .
      Tbl.Next;
    end;
  finally
    Tbl.GotoBookmark(Bookmark);
    Tbl.EnableControls; { ggf. Anzeige von Datensätzen in Datensteuerelementen wieder aktivieren }
    Tbl.FreeBookmark(Bookmark); {Von Positionsmarke belegten Speicher freigeben }
  end;
end;
void DoSomething (const TTable *Tbl)
{
  TBookmark Bookmark = Tbl->GetBookmark(); // Speicher zuweisen und einen Wert zuweisen
  Tbl->DisableControls(); // Anzeige der Datensätze in Steuerelementen ausschalten
  try
  {
    for (Tbl->First(); !Tbl->Eof; Tbl->Next()) // alle Datensätze in der Tabelle durchgehen
    {
      // Datensätze verarbeiten
      .
      .
      .
    }
  }
  __finally
  {
    Tbl->GotoBookmark(Bookmark);
    Tbl->EnableControls(); // Anzeige der Datensätze in Steuerelementen einschalten
    Tbl->FreeBookmark(Bookmark); // Speicher für die Positionsmarke freigeben
  }
}

Vor der Iteration durch die Datensätze sind alle Steuerelemente deaktiviert. Sollte während dieses Vorgangs ein Fehler auftreten, stellt die finally-Klausel sicher, dass die Steuerelemente wieder aktiviert werden und dass die Positionsmarke auch dann immer freigegeben wird, wenn die Schleife abgebrochen wird.

Siehe auch