5.7 Ereignisse

Ein OLE-Server kann Ereignisse an seinen Client versenden. Im Dialog Manager existiert hierfür die Ressource message und wird am Dialog oder Modul definiert. Der Entwickler muss bei dem Controlobjekt angeben, welche Messages versendet werden können. Das Messageobjekt steht auch anderen Objektklassen zur Verfügung und entspricht dem bisher bekannten extevent-Ereignis.

5.7.1 Die Ressource message

Ereignisse müssen vor der Benutzung inklusive Parameter definiert werden. Dazu dient die Message-Ressource. Sie ist wie folgt definiert:

<message> ::= {export | reexport} 'message' <label> { <messageSpec> };
<messageSpec> ::= '(' { <messageArg> [ ',' <messageArg> ] } ')'
<messageArg>  ::= <datatype> [<label>]

Damit die nach außen bekanntzugebenden Events auch zum Client weitergeleitet werden, sind diese am Control-Objekt zu definieren. Dazu dient das Feld-Attribut .message[]. Dieses Feld kann ähnlich wie .content[] behandelt werden, d.h. mit setvalue /getvalue angesprochen bzw. mittels .count[] nach der Größe gefragt werden.

Die Message-Ressource ist auch unabhängig von OLE-control nutzbar für die Definition von "benannten" Events. Das Event kann jetzt einfach mittels eines sendevent() an das Control-Objekt geschickt werden. Nur Events, die im .message[]-Feld definiert sind, werden an den Client geschickt, alle anderen werden wie externe Ereignisse im Dialog selber verarbeitet.

Einschränkungen

Die OLE-Option des IDM unterstützt nur die Datentypen integer, string und boolean. Zwar sind auch andere Typen an der allgemeinen Message-Ressource definierbar, aber es kann keine Typelibrary dafür generiert werden. Damit können diese Datentypen nicht zum Datenaustausch per OLE genutzt werden.

Beispiel

dialog D

message Msg(integer I, string S);

model control MC

{

  .message[1] Msg;

  :

  pushbutton Pb

  {

    on select

    {

      sendevent(this.control,Msg,1998,"Aktion ausloesen");

    }

  }

}

Anmerkungen und Einschränkungen

Der Client hat hierzu das Event-Interface auszuimplementieren und über die Standardprozedur für NotifySinks anzubinden. Der Client kann entweder dynamisch über die Type-Library des Servers den entsprechenden Sink generieren, oder statisch einen Sink für ein bekanntes Control verwenden. Werden unerwartete neue Events versendet, kann es zu Abstürzen kommen! Deshalb sollte man bei neuen Events dem Control eine neue UUID geben.