Programmierung

RecView – Grundlagen (Teil 3)

In RecView – Grundlagen Teil 2 bin ich auf die eigenen Datensatzpuffer des RecView eingegangen und auf die Initialisierung des View im Ereignis EvtLstViewInit. Im heutigen Artikel soll es um das Ereignis EvtLstGroupInit gehen.

Im letzten Teil habe ich nur erklärt, dass jede Zeile eines View aus Gruppen aufgebaut ist. Doch was sind überhaupt Gruppen und wann werden diese erstellt?
Das RecView (wie auch die RecList) wurde von Anfang an so ausgelegt, dass die Anzahl der Datensätze in einer Tabelle keinen Einfluss auf die Performance bei der Anzeige der Datensätze haben darf. Man stelle sich ein Telefonbuch vor. Jeder Eintrag wäre dann einem Datensatz gleichbedeutend. Eine solche Datenmenge würde natürlich selbst heute noch den Arbeitsspeicher der modernsten Rechner an die Grenze der Leistungsfähigkeit bringen.
Deshalb liest jedes View immer nur maximal so viele Sätze, wie im View dargestellt werden können. Scrollt der Benutzer, dann werden entsprechend weitere Sätze geladen.
Immer dann, wenn ein Datensatz gelesen wird, wird auch ein zugehöriges Group-Objekt generiert, welches die Visualisierung für diesen Datensatz übernimmt. Das Group-Objekt hat eine Lebensdauer, die auf die Sichtbarkeit im View beschränkt ist. Scrollt der Benutzer oder verkleinert er das View, dann werden nicht mehr sichtbare Gruppen entsprechend gelöscht.
Die Generierung einer Gruppe kann jedoch ein zeitaufwändiger Vorgang sein. Für jedes angezeigte View verwaltet das RecView deshalb einen Cachespeicher, der die bereits generierten Gruppen enthält. Wird nun ein Datensatz gelesen, wird zunächst überprüft, ob die dazugehörige Gruppe im Cache enthalten ist. Erst wenn dies nicht der Fall ist, muss eine neue Gruppe erstellt werden. Group-Objekte werden aber nicht für unbegrenzte Zeit im Cache abgelegt. Die Eigenschaft wpExpireTime der Gruppe definiert, wie lange sie gültig ist.
Hier kommt das Ereignis EvtLstGroupInit ins Spiel. Es wird aufgerufen, wenn ein Group-Objekt generiert wurde und für die Anzeige im View-Objekt initialisiert werden muss.
Grundlage für Aussehen und Inhalt der Gruppe ist die Spaltendefinition, die im RecView-Editor festgelegt wurde. Das Group-Objekt ist bei Auftreten des Ereignisses EvtLstGroupInit also nicht leer, sondern hat schon ein vorgegebenes Layout, welches im Ereignis jedoch noch angepasst werden kann.
Dem Event werden alle relevanten Informationen übergeben:

sub EvtLstGroupInit
(
  aEvt                 : event;    // Ereignis
  aRecBuf              : handle;   // Datensatzpuffer
  aGroup               : handle;   // Gruppe
  aViewId              : int;      // Nummer des View
)
: logic;
{
  aGroup->wpExpireTime # 0;
  DbgTrace('Group : ' + CnvAI(aGroup) + ' Artikelnummer: ' +
           CnvAI(aRecBuf->ART.iNummer));
  return(true);
}

Im Argument aRecBuf wird der Datensatzpuffer des zugehörigen Datensatzes übergeben. In aGroup wird der Deskriptor des Group-Objektes übergeben. aViewId gibt an, in welchem View die Gruppe dargestellt werden soll.
Im Beispiel wird die Eigenschaft wpExpireTime der Gruppe auf den Wert 0 gesetzt. Das führt dazu, dass die Gruppe nicht im Cache gehalten wird. Abb. 1 zeigt das Beispiel während der Ausführung.

RecView - EvtLstGroupInitAbb. 1: RecView-Beispiel

Abb.2 zeigt das zugehörige Trace-Protokoll im Debugger.

RecView - DebugAbb. 2: EvtLstGroupInit – Trace

Wenn Sie nun die Größe des Dialoges ändern oder scrollen, können Sie sehr schön beobachten, wie das Objekt die Sätze nachlädt. Das Ereignis wird für alle sichtbaren Sätze wiederholt aufgerufen. Wenn Sie die Eigenschaft wpExpireTime auf einen Wert ungleich null setzen, dann sehen Sie, dass jeweils nur neue Sätze nachgeladen werden.
Der Wert der Eigenschaft wpExpireTime steht standardmäßig auf 60 Sekunden. Je nach Anwendung kann es jedoch sinnvoll sein, andere Werte zu wählen. Stellt eine Gruppe nur statische Informationen dar, dann kann der Wert hoch gewählt werden. Stellt sie dagegen dynamische Informationen dar, die sich häufig ändern, dann ist eher ein geringer Wert zu wählen.
Das RecView-Objekt leert in bestimmten Situationen den Gruppen-Cache auch automatisch. Dies ist dann der Fall, wenn sich die Spaltenbreite ändert. Des Weiteren kann mit der Option _WinRvwUpdateOptClearCache beim Befehl WinRvwUpdate der Cache auch programmseitig geleert werden.

Ausblick

Im nächsten und voraussichtlich letzten Teil der Reihe werde ich das Group-Objekt und seinen Aufbau näher erläutern.

Download

Beispieldatenbank RecView_Part3.zip (32.84 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.

Keine Kommentare

Kommentar abgeben