Lade...
 

PostMsg

PostMsg

Syntax
PostMsg(message[, DIRECT])

PostMsg(message)

Parameter: Name einer Message

Stack
Stack Position Beschreibung
Stack(In) Top beliebig
  Top-1 ...
Stack(Out) Top unverändert

Dieser Befehl führt dazu, dass die angegebene Message ausgelöst wird. Im Gegensatz zu SendMsg wird die Message jedoch erst ausgelöst, nachdem die bis zum aktuellen Zeitpunkt in der Event-Queue befindlichen Events abgearbeitet sind. Trotzdem sehen die Empfänger den Stack, wie er zum Zeitpunkt von PostMsg aussah. PostMsg lässt den Stack unverändert.

Diese Art des Sendens einer Message wird z.B. benutzt, wenn im Transaktionsverlauf Umstände auftreten, die nach der Bearbeitung noch einmal geprüft werden sollen, bzw. um Benutzerhinweise zeitversetzt anzuzeigen. Falls die laufende Transaktion nicht vorher explizit beendet wurde, dann arbeitet die per PostMsg ausgelöste Message in der gleichen Transaktion wie das vorherige Event.

Mehrere PostMsg-Aufrufe werden in der gleichen Reihenfolge abgearbeitet, in welcher die Aufrufe erfolgt sind.

Treten Exceptions auf oder wird die Abarbeitung durch cancel gestoppt, so wird die Message nicht mehr ausgelöst.

 

PostMsg(message, DIRECT)

Parameter: Name einer Message, Flag DIRECT

Stack
Stack Position Beschreibung
Stack(In) Top ein Windowobjekt oder Modul oder Vector von Widgets/Modulen
  Top-1 beliebig
  Top-2 . . .
Stack(Out) Top -

Wird das Flag DIRECT angegeben, wird die Message nur von den Objekten (Module|Widgets) emfpangen, die als erster Parameter angegeben wurden. Der Aufruf von PostMsg(..., DIRECT) nimmt die Empfänger vom Stack und die Empfänger der Message sehen den Stack so, wie er beim Aufruf von PostMsg() war (ohne Empfänger). Das gilt auch für System-Events wie SELECT und INITIALIZE. So kann es vorkommen, dass durch PostMsg(,DIRECT) Messages mit Parametern auf dem Stack aufgerufen werden, die normalerweise mit einem leeren Stack ausgeführt werden.

Der Empfänger wird auf dem Stack übergeben (siehe Anweisung Widget bzw. Module). Ist der Empfänger ein Windowobjekt, wird die Message von dem Windowobjekt und allen Children empfangen. Ist der Empfänger ein Modul, wird die Message vom Modul und von allen zum Modul gehörenden Fenstern (und deren Children) empfangen.

PostMsg(,DIRECT) verhält sich genasuo, wie SendMsg(,DIRECT) mit dem Unterschied, dass der Stack nicht vollständig abgeräumt wird und die Message verzögert ausgeführt wird.

Code-Beispiel:

// At the start, send the message with the widget to response to! Button(CreateObjectBtn, 10, 10, 100, 8, T("Objekt erstellen", "Create object")) [ SELECT : Widget PostMsg(CREATE_OBJECT) // The command "Widget" puts the actual button on the stack. OBJECT_CREATED: -> newObject T("Objekt wurde erstellt!", "Object was created!") Attention(EndTXN, INFO) ] // Somewhere there is another module, which receives this message and does something with it: CREATE_OBJECT: // Receive the parameters from stack -> sender // Call the macro, which creates the object CreateObject // Send the message only to the sender! No broadcasting at all. // No other module will recognize this message! createdObject sender PostMsg(OBJECT_CREATED, DIRECT)

Siehe auch