Lade...
 

Aufruf von Procedures

Aufruf von Procedures

Einführung

Eine in einem Modul A definierte Procedure kann aufgerufen werden
1. in diesem Modul (Trivialfall)
2. in allen von A abgeleiteten Modulen (Vererbung)
3. in einem beliebigen Modul wenn Modul A die Procedure für externen Aufruf zugänglich macht (A wird Provider)

callProcedure.JPG

Fall 1 und 2 entsprechen genau dem Methodenaufruf in vielen anderen Programmiersprachen.
Fall 3 ist ab DLL Version 4.5.2.174605 verfügbar.
Die Beziehung zwischen Aufrufer (Modul C im Beispiel) und der aufgerufenen Procedure (hier in Module A) ist indirekt; ein Identifikator (Provider Tag) steht dazwischen.
InstantView® erzeugt die Verbindung dynamisch zur Laufzeit.
Zwischen aufrufendem Modul (C) und bereitstellendem Modul (A) besteht eine lose Kopplung.
Der exportierte Code und der Programmcode der Aufrufer können unabhängig voneinander weiterentwickelt werden.

Das aufrufende Module kennt niemals das exportierende Modul, denn dieses kann sich ändern:
- Weiterentwicklung des InstantView®-Programmcodes allgemein
- Einfügen kundenspezifischer Ableitungen

Provider Tags müssen im aufrufenden Modul deklariert werden (Statement Provider).
Ein Modul beschreibt den Export über ein Provider-Tag in der Extern Anweisung.
Für einen Aufruf provider_tag::Procedure muss es im Projekt genau einen Provider geben. Andernfalls erscheint eine Fehlermeldung.

Procedure Export / Import und Vererbung

Export von einem Basis-Modul bezieht sich nur auf diesen. In abgeleiteten Modulen überdefinierte Procedures sind nicht sichtbar. InstantView® erzeugt intern einen abgeleiteten Modul ohne weiteren Inhalt.
Beispiel:

callProcedure2.JPG
 

SetFormat und call(Procedure) in Zugriffsausdrücken

Hier stimmen der Zeitpunkt des Aufrufs von SetFormat und der des Aufrufs einer in der Formatbeschreibung definierten Procedure nicht überein.
In welchem Module ist die Procedure Foo definiert, wenn eine Anweisung wie

[ "CX_ITEM::pattern.call(Foo)" . . . ] SetFormat

ausgeführt wird?
Das bestimmt folgende Regel:

 

a) im Modul, wo das Ziel-Windowobject (ListView, Tree, Combobox) definiert ist. Das gilt vor DLL Version 4.5.2.174605 immer. Danach immer dann, wenn Fall b) nicht zutrifft.
b) SetFormat wird in einer Procedure ausgeführt, die aus einem anderen Modul mit Provider Tag aufgerufen wird: Dann gilt die Annahme, dass alle über call(Procedure) aufzurufenden Procedures auch in diesem Modul definiert sind.

Beispiel:

callFormat.JPG

Bei der Darstellung der Daten wird das ListView für Spalte 1 und 2 unterschiedliche Procedures aufrufen.
Hinter dieser Festlegung steckt die Annahme, dass sich call(Procedure) in einer SetFormat-Anweisung auf das Modul bezieht, wo SetFormat gerade ausgeführt wird.
Wenn das nicht zutrifft, kann SendMsg benutzt werden:
 

callFormat2.JPG
 

Bei der Darstellung der Daten wird das ListView für Spalte 1 und 2 die gleiche Procedure aus Modul A aufrufen.