Verwendung/Syntax der DOM-API im Embarcadero RAD Studio C++ Builder

Wenn die FireDAC VCL-Komponente im Embarcadero RAD Studio mit dem C++ Builder verwendet wird - siehe auch VCL FireDAC Komponente in C++ Builder Projekten nutzen - gibt es bei der Arbeit mit dem DOM-API folgende Punkte zu berücksichtigen:

  • Damit die für den DOM-Zugriff notwendige *.hpp-Datei innerhalb der List & Label-Komponente auch erstellt wird, muss diese zuvor über das Embarcadero RAD Studio hinzugefügt werden. Dafür aus dem Components-Verzeichnis ..\Beispiele\Delphi\FireDAC\Components\ das Projekt ListLabel[xx]Components.dproj laden und die Datei L[xx]dom.pas hinzufügen und abspeichern. Im Anschluss gemäß der Anleitung des Artikels VCL FireDAC Komponente in C++ Builder Projekten nutzen fortfahren.

  • Um ein Projekt via DOM zu referenzieren, ist es erforderlich, dass im Konstruktor das List & Label-Objekt übergeben wird. Dabei muss dieses wie folgt übergeben werden:

    TLlDOMProjectList* proj = 
        new TLlDOMProjectList((L[xx]commoninterfaces::ILlDomParent*)*ListLabel);
  • Zugriff auf einzelne Elemente in diversen DOM-Listen wie bspw. TLlDOMLayerList, TLlDOMLayerList etc. können nicht 1:1 dem Delphi-Code entnommen werden, da hier der Array/Index-Operator für Listen operator[] eine angepasste Syntax in C++ Builder erfordert, da der C++ Builder im Gegensatz zu Delphi keine “default”-Arrayeigenschaften unterstützt.

    Entweder man stellt den Name der Eigenschaft voran:
    UnicodeString sLayerName = proj->Layers->Items[0]->Name;

    Oder man führt eine explizite Dereferenzierung der Liste durch:
    UnicodeString sLayerName = (*proj->Layers)[0]->Name;

So würde ein Code-Snippet im C++ Builder aussehen, um mit Hilfe der DOM-API ein Listen-Projekt zu öffnen, den Name der ersten Ebene abzufragen und den Druckernamen für den ersten Layoutbereich zu setzen:

...
UnicodeString projectFile = "<MyProjectFileName>";

// open an existing project file
TLlDOMProjectList* proj = 
    new TLlDOMProjectList((L[xx]commoninterfaces::ILlDomParent*)*ListLabel);
proj->Open(projectFile, TLlDOMFileMode::fmOpen, TLlDomAccessMode::amReadWrite);

// set the printer name for the first region - using 
// explicit dereferencing for element access
(*proj->Regions)[0]->Device->Name = "\"<MyPrinterName>\"";

// get the first layer name - using
// the property name for element access
UnicodeString sLayerName = proj->Layers->Items[0]->Name;

// save and close project
proj->Save(projectFile);
proj->Close();
...