Complex Collections mit Gupta COM

Im letzten Blogpost habe ich beschrieben, wie komplexe Parameter in COM-Funktionen übergeben werden können. Ein weiteres großes Problem íst die Übergabe von Arrays komplexer Datenstrukturen, wie z.B. Aufträge und deren Positionen. Bislang hatte ich dafür zwei Lösungen, mit denen ich aber nicht zufrieden war. Eine davon ist, die Daten im JSON-Format zu serialisieren und den resultierenden String zu übergeben. Die andere, jedes einzelne Element der Datenstruktur als SafeArray anzulegen, das wiederum in einen Variant verpackt werden muss, um es an COM übergeben zu können.

Collections

Der COM-Class-Wizard bietet noch eine dritte Möglichkeit an: Ein COM-Objekt, dessen Interface als Collection gekennzeichnet wird (siehe Checkbox).

ComWizardCollection

ComWizardCollection

Das Beispielprojekt

Der Reihe nach: Im Beispiel möchte ich

  • eine rudimentäre Auftrag-Klasse bestehend aus AuftragNr, Kunde und Datum,
  • sowie einer beliebig langen Liste von Auftragspositionen bestehend aus Artikel und Preis als komplexe Datenstruktur definieren.
  • Eine Service-Klasse soll eine beliebig große Liste von Auftragsdatensätzen liefern können

OrderDetails

Zuerst wird mit dem COM-Wizard die Klasse OrderDetailItem mit den Propertys Article (String) und Price (Number) definiert. Analog, wie es im Blogpost Complex Parameters mit Gupta COM beschrieben ist.

OrderDetailItem

OrderDetailCollection

Anschließend wird mit dem Wizard eine zweite Klasse OrderDetailCollection erstellt. Dieser wird die Eigenschaft „Collection“ zugewiesen.

OrderDetailCollection

Im nächsten Schritt gibt man im Wizard den Datentyp der Collection an. Für unser Beispiel ist das die oben erstellte Klasse OrderDetailItem.

OrderDetailCollectionType

Schaut man sich den resultierenden Programmcode an, dann sieht man, dass die Collection aus einem Array von OrderDetailItems besteht. Dieses ist in COM nicht direkt ansprechbar. Stattdessen kann man über die COM-Funktionen Item, Add und Remove darauf zugreifen, ebenso kann man auf das Property „Count“ lesend zugreifen.

Leider macht der Wizard bei der Code-Erzeugung einen kleinen, aber entscheidenden Fehler: Das interne Array m_aCollection[*] ist vom Typ IOrderDetailItem. Wie schon im letzten Blogpost beschrieben, muss als „Instance Variable“ die CoClass ohne das führende I verwendet werden. Das muss man also manuell korrigieren, ansonsten erhält man Fehlermeldungen zur Laufzeit. Übrigens lässt die Gupta-IDE (Version 3.1) nicht zu, dass man einfach das I löscht. Stattdessen muss die ganze Zeile gelöscht und neu geschrieben werden: OrderDetailItem: m_aCollection[*]

OrderDetailCollectionCode

OrderItem

Der Auftragsdatensatz besteht im Beispiel aus den Feldern Id (Number), Customer (String), Date (Date/Time) und – tadaaa – den Auftragspositionen vom Typ IOrderDetailCollection.

OrderItemWizard

Aber auch hier macht der Wizard einen Fehler: Die Instance Variable muss vom Typ OrderDetailCollection sein. Der Wizard erzeugt stattdessen eine InterfaceVar, was sogar zu einem Compile-Fehler führt. Die Datentypen im Returnwert und Parameter in den PropSet- und PropGet-Funktionen dagegen sind mit IOderDetailCollection korrekt.

OrderItemCode

OrderCollection

Im Beispiel soll eine Liste von Aufträgen übergeben werden, also erzeugen wir noch eine Collection, dieses Mal vom Typ OrderItem. Auch hier muss der Typ der Variablen m_aCollection[] auf die CoClass geändert werden (ohne I).

Service

Zu guter Letzt wird ein COM-Service-Klasse erstellt, deren Funktion „GetOrderCollection“ die oben definierte Collectionklasse zurückgibt. Üblicherweise kommen die Dateninhalte natürlich aus einer Datenbank. Für das Beispielprojekt habe ich Funktionen geschrieben, die den Propertys Zufallswerte zuweisen.

Consumer

Als Consumer habe ich mit der kostenlosen Visual Studio 2012 Express Edition (Desktop) eine WinForm-Applikation erstellt. Das registrierte COM-Objekt wird als Verweis eingebunden. Die Applikation holt eine Liste von Sample-Aufträge aus dem oben erstellen COM-Objekt ab und bildet sie in einem TreeView-Control ab.

ComComplexCollectionConsumer

Download

Alle im Blog beschriebenen Projekte sind in Datei ComComplexCollection.zip  enthalten:

  • Das Gupta 3.1-Projekt „ComComplexCollection“
  • Das VisualStudio-Projekt „ComComplexCollectionConsumer“
  • Eine lauffähige Demo-Applikation (Gupta 3.1-Runtime vorausgesetzt).

Happy Coding

Advertisements

Über thomasuttendorfer
Ich bin Entwicklungsleiter bei der Softwarefirma [ frevel & fey ] in München. Wir entwickeln Business-Software für Verlage und verwenden dafür den Gupta Team-Developer sowie Visual Studio.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: