Lade...
 

InstantView®-Interpreter interaktiv unterbrechen

InstantView®-Interpreter interaktiv unterbrechen

Die fortlaufende Ausführung von InstantView®-Anweisungen durch den InstantView®-Interpreter kann unterbrochen (und abgebrochen) werden. So ist es möglich, den Anwender in die Lage zu versetzen, eine irrtümlich gestartete Aktivität vorzeitig zu beenden.

Mit der Funktion EnterKeyInterrupt des System-Objekts werden eine Tasten-Kombination und eine Message angemeldet, wahlweise kann auch ein Empfänger der Message (Modul oder Windowobjekt) vorgegeben werden.

Hinweis: Nur dann, wenn der InstantView®-Interpreter gerade InstantView®-Code ausführt, reagiert das ClassiX®-System in diesem Fall auf die Eingabe dieser Tasten. Möchte man stattdessen generell eine Message für eine Tasten-Kombination anmelden, ist der Hotkey-Manager die richtige Wahl.

Der gerade laufende Befehl wird noch beendet, danach werden implizit SendMsg(...) bzw. SendMsg(..., DIRECT) und Waitoninput ausgeführt. Eine laufende Transaktion bleibt offen!

Als Reaktion auf die Message gibt es zwei sinnvolle Möglichkeiten:

  • cancel, und die Verarbeitung wird abgebrochen (einschließlich Abbruch einer Transaktion)
  • FinishInput, und die Verarbeitung wird fortgesetzt, so als hätte es gar keine Unterbrechung gegeben.

Achtung: Aktuell kann FinishInput nicht direkt im Message-Handler des Interrupts ausgeführt werden, da das dazugehörige WaitOnInput erst nach dessen Ausführung gestartet wird. Das FinishInput muss aktuell entweder aus einem separat geöffneten Fenster oder über PostMsg ausgelöst werden.

Als Code für Tasten können die Konstanten ESC, ALT, SHIFT, CTRL, F2, F3, ..., F12 verwendet werden.
Für alle anderen Tasten ist der Code als Dezimal bzw. Hexadezimalzahl anzugeben.

Hinweis zur Syntax: F2 ... F12 werden abhängig vom Kontext als Event oder als Konstante erkannt:

Widget(... [ F3: // Event F3 F3 // die Konstante F3 . . . ]

 

Vorsicht: Wenn dem Anwender die Entscheidung über Fortsetzen oder Abbrechen überlassen bleibt, sollte mittels eines CX_TIMED_TRIGGER-Objekts ein Time-Out-Intervall programmiert werden. Andernfalls kann eine lange offen bleibende Transaktion zu Locking-Konflikten führen!

 

Programmbeispiel:

Module(TestKeyInterrupt) [ Var(count) Msg(ALFA, BETA, GAMMA) Define(DoSomething) -> count do FindAll(CX_PERSON) iterate { String count String(" (%d)") + PutValue(win) } Decr(count) count ifnot break loop; ALFA: BETA: GAMMA: OpenWindow(itWin, 1) INITIALIZE: [ ESC ] (ALFA) NULL SystemObject Call(EnterKeyInterrupt) [ ALT 0x31 ] (BETA) NULL SystemObject Call(EnterKeyInterrupt) [ SHIFT CTRL 0x20 ] (GAMMA) NULL SystemObject Call(EnterKeyInterrupt) ] Window(win, 23, 23, 1000, 100, "Test Key Interrupt") { Button(b, BLUE, 33, 70, 120, 7, "push me") [ SELECT: 1000 DoSomething // start processing ] Attach(b, BOTTOM, 11) } Window(itWin, 1023, 23, 335, 50, "...") [ ALFA: "ESCAPE ..." PutValue BETA: "ALT 1 ..." PutValue GAMMA: "SHIFT CTRL SPACE ..." PutValue ] { Button(b1, GREEN, DEFAULT, 15, 23, 100, 7, "continue") [ SELECT: CloseWindow FinishInput // to continue ] Button(b2, RED, 210, 23, 100, 7, "cancel") [ SELECT: CloseWindow cancel // abort processing immediately ] }