Erweiterte Programmierung


Sie können Eigenschaften (.NET-Properties) von Klassen in iPlus auf zwei Arten deklarieren:

  • im C#-Code,
  • oder virtuell über die iPlus-Entwicklungsumgebung.

Der Begriff "Virtuelle Deklaration" in iPlus sollte nicht verwechselt werden mit dem C#-Schlüsselwort "virtual". In iPlus bedeutet virtuelle Deklaration, dass die Definition der Eigenschaft nur in der SQL-Datenbank (genauer gesagt in der Tabelle ACClassProperty) erfolgt und nicht hartkodiert in einer .NET-Assembly. Die Entscheidung ob Sie Eigenschaften per Datenbank hinzukonfigurieren oder per C#-Code definieren hängt von verschiedenen Kriterien ab. Eine pauschale Antwort ist hierzu nicht möglich. Lesen Sie daher die nachfolgenden Abschnitte durch, um die dahinter liegende Technik besser zu verstehen.

Des Weiteren wird in den folgenden Abschnitten auf folgende Punkte näher eingegangen:

  • Lokale oder netzwerkfähige Eigenschaften
  • Quell- und Zieleigenschaften (Eigenschaftsbindungen)
  • ACPropertyInfo-Attributklasse
  • Standard-Werte und Persistierung 
  • Serialisierbare Typen und Editoren für Komplexe Typen
  • Überschreiben von Eigenschaften
  • Langzeitarchivierung
  • Änderungsereignisse und Handlerprogrammierung
  • Oberflächenbindung
  • Eigenschaftsgruppierung (Selected/Current/List/Access)
  • Besonderheit: Konfigurationsvariablen

Um eine neue virtuelle Eigenschaft hinzuzufügen gehen Sie wie folgt vor:

 

Wählen Sie im Explorer das gewünschte Projekt aus und selektieren Sie im Projektbaum die Klasse in der Sie eine neue Eigenschaft definieren möchten.

  1. Drücken Sie den Button "Neue Eigenschaft". Es erscheint ein neuer Eintrag in der Eigenschaftsliste, bei der die Eigenschaftsart automatisch auf "Virtuelle Eigenschaft" gesetzt wird. (Fest kodierte Eigenschaften aus der Assembly besitzen die Eigenschaftart "Eigenschaft")
  2. Vergeben Sie einen eindeutigen Eigenschaftsnamen, der keine Sonderzeichen enthalten darf.
  3. Beschreiben Sie die Eigenschaft ausführlich (Dieser Text wird automatisch bei Textboxen oder anderen Steuerelementen davor angezeigt). Zur Eingabe der Beschreibung in mehreren Sprachen, geben zuerst den I18N-Präfix ein gefolgt von einem Doppelpunkt und anschliessend den Text: z.B. "en:My Text"
  4. Definieren Sie von welchem Datentyp diese Eigenschaft ist. Es kann sich dabei entweder um primitive .NET-Typen (System-Namespace) handeln oder auch komplexere Datentypen, die Sie selbst definiert haben. Falls diese Eigenschaft persistierbar (Punkt 6) oder über das Netzwerk übertragen werden soll, dass sie serialisierbar ist bzw. mit den [ACSerializeableInfo] und dem [DataContract]-Attribut versehen worden ist!
  5. Optional: Geben Sie im Feld Wert den Standardwert an, den die Eigenschaft bei Ihrer Instanziierung haben soll. Ist der Wert leer erhält die Eigenschaft den .NET-Standardwert.
  6. Optional: Definieren Sie ob diese Eigenschaft Speicherbar (persistierbar) ist. Ist die Eigenschaft persistierbar schreibt iPlus den aktuellen Wert beim Auftreten eines Änderungsereignisses in die Datenbank (Tabelle ACClassTaskValue). Bei dem nächsten Hochfahren des iPlus-Dienstes bzw. bei der erneuten Instanziierung erhält die Eigenschaft.
    Achtung:
    1. Der eingestellte Standardwert (Punkt 5) wird in diesem Fall ignoriert.
    2. Komplexe Datentypen müssen, wie unter Punkt 4 bereits beschrieben, das ACSerializeableInfo und das DataContract-Attribut besitzen, damit der iPlus-DataContractSerializer diese serialisieren kann.
  7. Optional: Stellen Sie ein ob die Eigenschaft "Netzwerkfähig" ist. Lesen Sie mehr dazu im Unterkapitel "Netzwerk".
  8. Optional: Stellen Sie ein ob die Eigenschaft eine "Daten-Stellvertreter"-Variable ist. Lesen Sie mehr dazu im Unterkapitel "Netzwerk". Diese Einstellung gilt nur für "Netzwerkfähige" Eigenschaften (Punkt 7).
  9. Optional: Wählen Sie die Aktualisierungsrate aus mit der die Eigenschaftsänderungen im Langzeitarchiv gespeichert werden. Lesen Sie mehr dazu im Unterkapitel "Langzeitarchiv".

Damit Sie Ihre neu programmierten Eigenschaften aus der Assembly bzw. dem C# Code in iPlus verwenden können, müssen Sie eine der Ableitungen der Attributklasse [ACPropertyBase] verwenden.

Siehe: Verwendung von Attributen

Zudem müssen Sie die Klasse der iPlus-Runtime bekannt geben wie es im Kapitel "Eigene ACComponent programmieren" beschrieben ist.

Beispielcode:

 

Verwendung verschiedener Ableitungen der ACPropertyBase-Attributklasse.

Die Registrierung der Eigenschaften erfolgt, indem Sie beim iPlus-Login die linke Steuerungstaste gedrückt halten und mit der linken Maustaste die Logintaste drücken. Die iPlus-Runtime beginnt danach alle Assemblies, die sich im Programmverzeichnis befinden, zu untersuchen.

Es werden nur die Eigenschaften analysiert,

  • die mit Attributklassen versehen sind,
  • und die Ableitungen von ACPropertyBase sind (namespace gip.core.datamodel).

Ableitungen der ACPropertyBase:

Die aufgelisteteten Attributklassen unterscheiden sich nicht von Ihren Eigenschaften, da alle in der gemeinsamen Basisklasse ACPropertyBase definiert sind. Die verschiedenen Ableitungen dienen lediglich dazu den Programmcode verständlicher zu gestalten und die Konstruktoren so zu vereinfachen, dass nur noch die notwendigen Konstruktionsparameter übergeben werden müssen. Deswegen gibt es diese Attributklassen manchmal mit verschiedenen Konstruktoren. Auf die einzelnen Klassen wird in den folgenden Abschnitten noch näher eingegangen. Die übergebenen Konstruktionsparameter werden in die Felder übernommen, die Sie im Screenshot des vorigen Abschnittes sehen können (3, 5-8). Nur der Eigenschaftsname (2) und der Datentyp (4) wird per .NET-Reflection aus der Methodensignatur automatisch übernommen. Folgende Eigenschaften sind in der ACPropertyBase-Klasse definiert:

ParameterBeschreibung
short SortIndex[Pflicht] Sortierreihenfolge der Auflistung von den Eigenschaften in der iPlus-Entwicklungsumgebung. Ist der SortIndex > 9999, dann wird diese Eigenschaft nicht im Werkzeugfenster des Desginers angezeigt.

string
ACGroup

[Pflicht] Dient zur Zuordnung von zusammengehörigen Eigenschaften (List, Selected und Current). Verwenden Sie eine leeren String bei eigenständigen Eigenschaften.

string
ACCaptionTranslation

[Pflicht] Übersetzungstupel für die Übersetzung der Eigenschaft. Syntax für Übersetzungstupel:

  • I18N-Präfix: z.B. en, de, fr...
  • Geschweifte Klammer auf und einfaches Hochkomma: {'
  • Text in der entsprechenden Sprache
  • Einfaches Hochkomma und geschweifte Klammer zu: '}

Beispiel: en{'My english text'}de{'My german text'}

Dieser Text wird im Feld (3) "Bezeichnung" eingetragen. Siehe Screenshot aus vorigem Abschnitt.

Global.ACPropUsages
ACPropUsage

[Optional] Verwendungszweck der Eigenschaft.
object 
DefaultValue
[Optional] Standardwert welchen die Eigenschaft initial aufweisen soll sobald die Instanz vom iPlus-Framework erzeugt wird. Ist der Wert leer, erhält die Eigenschaft den .NET-Standardwert. Dieser Wert wird im Feld (5) "Wert" eingetragen. Siehe Screenshot aus vorigem Abschnitt.
bool
IsRightmanagement

[Optional] Eigenschaften mit Rechteverwaltung können im Modul Rechteverwaltung verschiedene Zugriffsrechte für einzelne Benutzer oder Gruppen erteilt werden

bool IsPersistable[Optional] Ist die Eigenschaft persistierbar, wird bei jedem Änderungereignis, der Wert in die Datenbank geschrieben (Tabelle ACClassTaskValue). Beim nächsten Hochfahren des iPlus-Dienstes bzw. bei der erneuten Instanziierung erhält die Eigenschaft den zuletzt gespeicherten Wert.
Achtung:
  • Der eingestellte Standardwert (Punkt 5) wird in diesem Fall ignoriert.
  • Komplexe Datentypen müssen, wie unter Punkt 4 bereits erwähnt, das ACSerializeableInfo und das DataContract-Attribut besitzen, damit sie vom iPlus-DataContractSerializer serialisiert werden können.

Dieser Wert wird im Feld (6) "Speicherbar" eingetragen. Siehe Screenshot aus vorigem Abschnitt.

bool 
IsBroadcast
[Optional] Ist die Eigenschaft netzwerkfähig wird diese bei Änderungsereignissen automatisch im Netzwerk verteilt. Dieser wert wird im Feld (7) "Im Netzwerk verteilen" eingetragen. Siehe Screenshot aus vorigem Abschnitt. Lesen Sie mehr dazu im Unterkapitel "Netzwerk".
bool IsProxyProperty[Optional] Ist die Eigenschaft eine "Stellvertreter"-Eigenschaft erhält diese ihren Wert durch eine Eigenschaftsbindung von einer Quell-Eigenschaft. Dieser Wert wird im Feld (8) "Datenstellvertreter/Ziel" eingetragen. Siehe Screenshot aus vorigem Abschnitt. Lesen Sie mehr dazu im Unterkapitel "Netzwerk"
bool ForceBroadcast

[Optional] Mit ForceBroadcast findet immer eine Verteilung der Eigenschaft im Netzwerk statt. Auch wenn Sie der Wert einer netzwerkfähigen Eigenschaft nicht geändert hat.

  • Für netzwerkfähige Eigenschaften (Ziel oder Quelle): Immer wenn ValueT gesetzt wird, findet eine Übertragung an die Clients statt, auch ohne Änderung des Wertes.
  • Für lokale Eigenschaften: Wenn gesetzt, dann ruft der Proxy den Wert nur einmal ab. Es findet nie eine Aktualisierung auf Proxy-Seite statt.
string
ACSource
[Optional] Falls die Eigenschaft in einem ItemsControl angezeigt und ausgewählt werden kann, kann hier die ACUrl zu einer ItemsSource angegeben werden.
Type
ConfigDataType
[Optional] Besitzt die ACPropUsage den Wert ConfigPointConfig oder ConfigPointProperty, dann wird der Eigenschaftswert bzw. die Listeneinträge in der Tabelle ACClassConfig gespeichert. Der Datentyp muss angegeben werden, damit der Serialisierer erkennt, welcher Datentyp serialisiert werden muss und die iPlus-Entwicklungsumgebung weiß, welcher Editor in der Registerkarte "Konfiguration" verwendet werden soll.
int
MinLength
[Optional] Minimale Anzahl an Zeichen, wenn der Datentyp der Eigenschaft ein String ist.
int
MaxLength
[Optional] Maximale Anzahl an Buchstaben, wenn der Datentyp der Eigenschaft ein String ist.
double
MinValue
[Optional] Minimal erlaubter Wert.
double MaxValue[Optional] Maximal erlaubter Wert.

 


Für jede Eigenschaft einer Klasse erzeugt das iPlus-Framework eine Instanz der generischen Klasse ACProperty<T> oder einer Ihrer Ableitungen. Dies betrifft sowohl Klassen die als C#-Code in einer Assembly vorliegen als auch Klassen die Sie virtuell in der iPlus-Entwicklungsumgebung angelegt haben. Siehe folgendes UML-Diagramm:

 

Die Klasse ACProperty<T> besitzt eine Eigenschaft ValueT, die den eigentlichen Wert kapselt. Sie können damit den Wert lesen oder setzen. Als normale C#-Property definierte Eigenschaften werden im Hintergrund automatisch die entsprechenden Setter- oder Getter-Methoden aufgerufen.

Um eine Referenz auf eine ACProperty<T> zu erhalten, rufen Sie die Methode IACPropertyBase GetProperty(string acName) auf und übergeben den Namen der Eigenschaft. Alle Eigenschaften einer Klasse werden in der Eigenschaft List<IACPropertyBase> ACPropertyList einer ACComponent bereitgestellt. Sie können daher auch auf diese Liste zugreifen und per LINQ sich ihre Eigenschaft selbst heraussuchen.

Das Interface IACPropertyBase ermöglicht einen Typ-Neutralen Zugriff auf eine Eigenschaft, wenn der Datentyp für den Anwendungsprogrammierer nicht bekannt ist. Über die Eigenschaft object Value können Sie ebenso auf den Wert per Boxing/Unboxing zugreifen. Wir empfehlen Ihnen jedoch immer mit der generischen Variante zu arbeiten, weil es dann keine Typ-Laufzeitfehler geben kann.

Casten Sie deswegen die IACPropertyBase in eine IACContainerT<T>-Referenz und arbeiten immer mit dieser!

Der Hintergrund weshalb Sie eher mit einer IACContainerT<T>-Referenz arbeiten sollen ist, weil sich aufgrund der Netzwerk-Abstraktionsfähigkeit des iPlus-Frameworks unterschiedliche Ableitungen der ACProperty<T>-Klasse verbergen können und Sie bei der Programmierung damit nicht belästigt werden sollen (siehe Diagramm oben).

Auf netzwerkfähige oder lokale Eigenschaften wird in den nachfolgenden Unterkapiteln näher eingegangen.