Sprung zum Seitenende Struktur Themen A...Z Titel << >>

CXI-Basis-Programmierreferenz / Version 2 / Datenspeicherung / CxiNode / Resource-Referenzen /

RegisterResource - Automatische Resource zuordnen

[C++] CxiError CxiNode :: RegisterResource (const CxiNode& rpb) const
[C] CxiError cxiRegisterResource (CxiHandle self, CxiHandle rpb)

[S3:SPEZIAL] 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.


[i] CXI-Basis-Programmierreferenz
Version 2.10 72 (1014-001), erstellt am 15. April 2000
Textseite 203 von 855, Thema 8433 (RegisterResource)
[c] Copyright (c) 1996-2000 by TeraConnect GmbH

Sprung zum Seitenanfang Struktur Themen A...Z Titel << >>