CXI-Basis-Programmierreferenz / Version 2 / Datenspeicherung / CxiNode / Resource-Referenzen /
CxiError CxiNode :: RegisterResource (const CxiNode& rpb) const
CxiError cxiRegisterResource (CxiHandle self, CxiHandle rpb)
Registriert einen CXI-Knoten (auch CXI-Baum) als Resourceblock.
rpb:
CXI-Knoten, auf den sich cxiTypeRes-Variablen beziehen sollen (Ein Block kann sein eigener Resourceblock sein, d.h. rpb==*this bzw. rpb==self ist erlaubt.)
return:
0 ok, sonst Fehler
Ein Resourceblock ist eine sehr mächtige Einrichtung des CxiNode/CxiTree-Systems. Dadurch ist es auf einfache Art möglich, Sprach- oder Systemabhängigkeiten zu implementieren, ohne einen Großteil der Daten mehrfach halten zu müssen.
Wird auf eine Variable des Typs cxiTypeRes mit einer Get...-Funktion außer GetRes zugegriffen, so wird der Wert der Variablen als Name angesehen und in allen registrierten Resourceblöcken gesucht. Wird der Name gefunden, so wird der im Resourceblock abgespeicherte Wert zurückgeliefert (Die Resource-Referenz wird aufgelöst). Für das aufrufende Programm besteht kein Unterschied zu einer Variablen, die direkt im Originalblock abgespeichert ist.
Bei Schreibzugriffen werden Resource-Referenzen nicht berücksichtigt, cxiTypeRes-Variablen besitzen dann keine Sonderstellung.
Bis zu 16 Resourceblöcke können pro CxiNode registriert werden. Die Suche nach einem Namen beginnt immer beim zuletzt registrierten Resourceblock.
Resource-Referenzen können geschachtelt werden, d.h. der Resourceblock kann selbst cxiTypeRes-Variablen und zugehörige registrierte Resourceblöcke besitzen. Rekursionen und zu tiefe Verschachtelungen (16 Ebenen) sind nicht erlaubt und werden erkannt (cxiErrorResourceNesting).
Ist das Objekt, für das RegisterResource aufgerufen wird (this), ein CXI-Baum, so gilt die Resource-Zuordnung unabhängig von der Bewegung des Sichtfensters.
Ist der Resourceblock ein CXI-Baum, so wird nur das zum Zeitpunkt der Suche nach einem Resource-Namen aktuelle Sichtfenster berücksichtigt.
Der Resourceblock darf nicht gelöscht werden, bevor die Registrierung mit DeRegisterResource aufgehoben worden ist, da nur der Zeiger auf den Resourceblock gespeichert wird. Andernfalls kann es zu fehlerhaften Speicherzugriffen bis zum Programmabsturz kommen.
Portabilität:
Diese Funktion ist in allen unterstützten Systemen verfügbar.
Beispiel:
#include "cxib.h"
#include <string.h>
#include <stdio.h>
int main ()
{
// Aufbau eines CxiTreeFile mit drei Knoten:
// Wurzel
// |- HALLO
// +- JETZT
// HALLO wird mit einigen Variablen gefüllt
CxiTreeFile from ("CXITEST.1", cxiOptVirtual | cxiOptAutoCreate);
from.MoveDownAuto ("HALLO");
from.SetNum ("NUMREF1", 15);
from.SetNum ("NUMREF2", 17);
from.SetStr ("STRREF3", "Dies ist ein String");
from.SetRes ("RESREF4", "RESREF5");
// Inhalt von HALLO in einen neuen CXI-Knoten kopieren
CxiNode cxi = from;
// Diesen CXI-Knoten als Resource registrieren
from.RegisterResource (cxi);
// JETZT erstellen und mit Resource-Referenz-Variablen füllen
from.MoveHome ();
from.MoveDownAuto ("JETZT");
from.SetRes ("V1", "NUMREF1");
from.SetRes ("V2", "NUMREF2");
from.SetRes ("V3", "STRREF3");
from.SetRes ("V4", "RESREF4");
// Zugriffe auf die Variablen mit registriertem Resourceblock
printf ("V1 = %ld (%ld)\n", from.GetNum ("V1"),
from.QueryVarSize ("V1"));
printf ("V2 = %ld (%ld)\n", from.GetNum ("V2"),
from.QueryVarSize ("V2"));
printf ("V3 = %s (%ld)\n", from.GetItem ("V3"),
from.QueryVarSize ("V3"));
printf ("V4 = %p (%ld)\n\n", from.QueryVarAddr ("V4"),
from.QueryVarSize ("V4"));
// Registrierung aufheben
from.DeRegisterResource (cxi);
// Dieselben Zugriffe ohne registrierten Resourceblock
printf ("V1 = %ld (%ld)\n", from.GetNum ("V1"),
from.QueryVarSize ("V1"));
printf ("V2 = %ld (%ld)\n", from.GetNum ("V2"),
from.QueryVarSize ("V2"));
printf ("V3 = %s (%ld)\n", from.GetItem ("V3"),
from.QueryVarSize ("V3"));
printf ("V4 = %p (%ld)\n", from.QueryVarAddr ("V4"),
from.QueryVarSize ("V4"));
// Testausgabe
from.DumpVars ();
cxi.DumpVars ();
return 0;
}
Ausgabe:
V1 = 15 (4)
V2 = 17 (4)
V3 = Dies ist ein String (20)
V4 = 240A:0042 (0)
V1 = 0 (0)
V2 = 0 (0)
V3 = (null) (0)
V4 = 240A:0042 (0)
***[1] 1995-10-28 19:46:53.340 ***
<Root> \
HALLO Sub
JETZT Sub
<Node> \HALLO
NUMREF1 Num 15
NUMREF2 Num 17
STRREF3 Str "Dies ist ein String"
RESREF4 Res "RESREF5"
<*Window*> <Node> \JETZT
V1 Res "NUMREF1"
V2 Res "NUMREF2"
V3 Res "STRREF3"
V4 Res "RESREF4"
***[2] 1995-10-28 19:46:53.370 ***
<Data>
NUMREF1 Num 15
NUMREF2 Num 17
STRREF3 Str "Dies ist ein String"
RESREF4 Res "RESREF5"
Das genaue Format der Dump-Ausgabe ist versionsabhängig und kann daher von diesem Beispiel abweichen.