Riferimento Lingua del Tivoli Service Desk 6.0 Developer's Toolkit TSD Script
Ritorna alla pagina principale
Questa variabile è un parametro implicito che contiene un numero evento per un handler degli eventi (ad esempio, un numero messaggio come $MsgPaint, ecc.) per la chiamata corrente dell'handler.
Non applicabile.
In un'applicazione TSD Script visualizzata in finestra, gli eventi rappresentano la forza primaria dell'applicazione. Questi eventi possono avere diverse origini, comprese le seguenti:
Gli eventi vengono consegnati da TSD TSD Script agli handler degli eventi. Diverse routine TSD TSD Script (come quelle che creano le finestre o le finestre di dialogo) consentono di specificare una routine per intercettare e reagire agli eventi.
Un handler degli eventi accede al parametro $Event in esso contenuto. $Event contiene una delle costanti di messaggio predefinite o una costante di messaggio definita dal programmatore TSD TSD Script. Ogni costante di messaggio indica il tipo di evento da consegnare.
Per ulteriori informazioni sugli eventi, consultare il Manuale per la programmazione Tivoli Service Desk 6.0 Developer's Toolkit TSD Script.
Consente a un handler degli eventi di accedere a parametri extra inclusi con un messaggio.
FUNCTION $EventParm(n: INTEGER, type: DATATYPE): DATATYPE;
Nome dell'argomento | Descrizione |
n | Questo argomento identifica il parametro dell'evento. I parametri degli eventi sono numerati a partire da 1. |
Type | Questo è un tipo di dati, predefinito o definito dall'utente, che corrisponde al tipo di dati del parametro a cui si fa riferimento. Se il tipo di dati qui specificato non corrisponde a quello del parametro inoltrato dal mittente del messaggio, viene visualizzato un messaggio di errore al tempo di esecuzione. |
Gli handler degli eventi TSD Script ricevono sempre tre parametri fissi. Il primo è una copia del record di istanza della finestra. Questo parametro è esplicitamente riportato nella dichiarazione dell'handler degli eventi. I successivi due sono parametri impliciti, $Event e $Handle, e identificano, rispettivamente, l'evento da elaborare e la finestra che provoca l'evento.
Un handler degli eventi può ricevere un numero variabile di parametri aggiuntivi. Alcuni eventi di sistema (come $MsgSize) sono accompagnati da ulteriori informazioni inoltrate come parametri aggiuntivi.
I messaggi definiti dall'utente inviati dall'istruzione SendMessage possono inoltrare parametri aggiuntivi. E' necessario che il mittente e il destinatario siano concordi sul numero, i tipi e i significati di questi parametri. Un handler degli eventi accede a questi parametri degli eventi tramite $EventParm.
$EventParm richiede due argomenti: un numero intero che identifica il parametro extra da richiamare e un tipo di dati valido che corrisponda al tipo di dati del parametro inviato. Sebbene sia possibile inviare un numero variabile di parametri extra a un handler degli eventi, è necessario che il numero e i tipi dei parametri siano indicati dal numero di evento stesso.
Ad esempio, è necessario impostare un evento definito dall'utente in modo che qualsiasi finestra possa chiedere a un'altra il suo nome. Supporre che esista un campo nome nei dati di istanza per ogni finestra e che venga inoltrato attraverso i dati di inizializzazione. E' possibile impostare un messaggio definito dall'utente definendo una costante generica come in:
CONSTANTS QUERY_WINDOW_NAME IS $MsgUser+1;
Una volta fornita una handle della finestra, è possibile ottenere il nome di quella finestra nel seguente modo:
VARIABLES window_name: String; ACTIONS SendMessage(some_window,QUERY_WINDOW_NAME,window_name);
Ogni finestra avrà il seguente handler degli eventi:
ACTIONS WHEN $Event IS ... ... ELSWHEN QUERY_WINDOW_NAME THEN $EventParm (1,String):=myData.myName; ELSWHEN ...
EVENT MyEvent(REF r: MyRecord); VARIABLES width, height : INTEGER; ACTIONS WHEN $Event IS $MsgSize THEN width:=$EventParm(1,Integer); height:=$EventParm(2,Integer); ...
Per ulteriori informazioni sugli eventi, consultare il Manuale per la programmazione Tivoli Service Desk 6.0 Developer's Toolkit TSD Script.
Il parametro implicito inoltrato a ogni handler degli eventi che identifica la finestra che riceve il messaggio.
Avvertenza: $Handle contiene sempre l'handle della finestra della finestra che riceve l'evento corrente. $Handle viene visualizzato solo all'interno di un handler degli eventi.
EVENT MyEvent(REF r: MyData); ACTIONS WHEN $Event IS $MsgCreate THEN WinSetIconBar($Handle,{'CREATE.ICO','DESTROY.ICO'}: LIST OF STRING); ...
Specifica che nessun evento è in elaborazione per un'istruzione che richiede un handler degli eventi.
EVENT $NullHandler{initializationData}: INTEGER;
Nome dell'argomento | Descrizione |
initilizationData | Questo argomento è facoltativo. Se presente, provoca la creazione di dati di istanza di tipo uguale. I dati di istanza vengono inizializzati sul valore di questo argomento. |
La sintassi utilizzata per $NullHandler è la stessa di quella per tutti i valori dollaro utilizzati con gli handler degli eventi.
KNOWLEDGEBASE Desktop; ROUTINES PROCEDURE Example; PRIVATE ROUTINES (* Create a scroll window parented by the desktop with default event processing *) PROCEDURE Example IS VARIABLES whdl: WINDOW; ACTIONS WinCreateScrollWindow($Desktop,
(* Window is a child of (*OS/2 desktop *) whdl,
(* return handle of new window *) $NullHandler,
(* Default event processing *) 5, 5, 80, 20,
(* Window location and size *) 'Example',
(* Window title *) '',
(* Use default font *) 0,
(* Point size is ignored for default *) BitOr($WinTitle, $WinBorder, $WinSysMenu)); WinWait(whdl); END;
Delega la gestione di un evento da una routine gestione eventi a un'altra.
FUNCTION DelegateEvent ( VAL handler: EVENT, [ REF userData: ANY ] ): INTEGER;
Nome dell'argomento | Descrizione |
handler | Il nome di una funzione gestione eventi. |
userData | La variabile passata per riferimento a una funzione gestione eventi specificata. |
Avvertenza: E' necessario che le chiamate della funzione DelegateEvent siano nell'ambito di una routine gestione eventi.
Spesso diverse caselle di dialogo o altri oggetti di gestione messaggi trattano gli stessi tipi di dati e rispondono a messaggi uguali nello stesso modo. E' possibile utilizzare la funzione DelegateEvent per evitare di ripetere lo stesso codice nelle routine di gestione messaggi per ognuno di tali oggetti.
DelegateEvent chiama la routine gestione eventi specificata e inoltra tutti gli pseudo parametri dall'handler che li contiene (ossia, $Event, $Handle e tutti i parametri $EventParm). Se l'handler specificato richiede un parametro esplicito per i dati dell'utente e non ne viene specificato nessuno nella chiamata di DelegateEvent, i dati dell'utente inoltrati all'handler che li contiene vengono inoltrati per default.
KNOWLEDGEBASE Test; ROUTINES PROCEDURE Main; PRIVATE TYPES BaseData IS RECORD f1: INTEGER; f2: STRING; END; DerivedData IS RECORD base: BaseData; f3: REAL; END; CONSTANTS MSG_ONE IS $MsgUser + 1; MSG_TWO IS $MsgUser + 2; MSG_THREE IS $MsgUser + 3; ROUTINES EVENT BaseHandler (REF userData: BaseData) IS ACTIONS WHEN $Event IS MSG_ONE THEN userData.f1 := $EventParm(1, INTEGER); WinWriteLn($Handle, 'f1 set to [' & userData.f1 &']'); ELSWHEN MSG_TWO THEN userData.f2 := $EventParm(1, STRING); WinWriteLn($Handle, 'f2 set to [' & userData.f2 & ']'); END; END; EVENT DerivedHandler (REF userData: DerivedData) IS ACTIONS WHEN $Event IS MSG_THREE THEN userData.f3 := $EventParm(1, REAL); WinWriteLn($Handle, 'f3 set to [' & userData.f3 & ']'); ELSE $Result := DelegateEvent(BaseHandler, userData.base); END; END; PROCEDURE Main IS VARIABLES w: WINDOW; ACTIONS IF 0 > WinCreateScrollWindow($Desktop, w, DerivedHandler, 10, 10, 80, 25, 'Test', $Courier, 8, $WinDefaultStyle) THEN EXIT; END; WinWriteLn(w, 'Ready to send MSG_ONE.'); SendMessage(w, MSG_ONE, 37); WinWriteLn(w, 'Ready to send MSG_TWO.'); SendMessage(w, MSG_TWO, 'I''m pink, therefore I''m Spam.'); WinWriteLn(w, 'Ready to send MSG_THREE.'); SendMessage(w, MSG_THREE, $Pi); WinWriteLn(w, 'Test complete.'); SendMessage(w, $MsgClose); END; END;
Il valore numero intero restituito da DelegateEvent è quello restituito dall'handler degli eventi chiamato. La semantica del valore di ritorno varia a seconda del messaggio $Event.
Spedisce un messaggio a un handler degli eventi della finestra.
PostMessage( VAL whdl: WINDOW, VAL message: INTEGER, [ VAL msgParm: ANY ... ] ): INTEGER;
Nome dell'argomento | Descrizione |
whdl | L'handle di un oggetto di elaborazione eventi, come una finestra. |
message | PostMessage spedisce un messaggio a una finestra e restituisce immediatamente un codice di errore o di riuscita senza attendere l'invio del messaggio. Il messaggio viene aggiunto alla coda messaggi del processo della finestra di destinazione. Esso viene consegnato alla finestra di destinazione quando l'applicazione entra in un handler degli eventi. Le istruzioni TSD Developer's Toolkit che includono un loop di elaborazione del messaggio sono:
|
messageParameters | Tutti. E' responsabilità di chi spedisce e di chi riceve concordare sui tipi, sull'ordine e il numero dei parametri messaggio da inoltrare. Tutti i parametri sono passati per valore. |
KNOWLEDGEBASE PostMsg; ROUTINES PROCEDURE PostMessageExample; PRIVATE CONSTANTS menuList IS { 'Options', 'Post message', 'Exit' }: LIST OF STRING; ROUTINES EVENT PostMessageEvent( REF whdlTarget: WINDOW ) IS VARIABLES i: INTEGER; ACTIONS WHEN $Event IS $MsgCreate THEN WinSetMenuBar( $Handle, menuList ); ELSWHEN $MsgMenu THEN WHEN $MenuSelection IS 101 THEN FOR i := 1 TO 5 DO WinWriteLN( $Handle, 'Posting message #' & i ); PostMessage( whdlTarget, $MsgUser + i ); END; WinWriteLN( $Handle ); WinWriteLN( $Handle, 'Wait in for 5 seconds' ); WinWriteLN( $Handle ); SysDelay( 5000 ); ELSWHEN 102 THEN SendMessage( $Handle, $MsgClose ); SendMessage( whdlTarget, $MsgClose ); END; ELSE IF $Event = $MsgUser THEN WinWriteLN( $Handle, 'Received target window handle' ); whdlTarget := $EventParm( 1, WINDOW ); ELSIF $Event > $MsgUser THEN WinWriteLN( $Handle, 'Received message #' & $Event - $MsgUser ); END; END; NOTHING; END; PROCEDURE PostMessageExample IS VARIABLES whdl1: WINDOW; whdl2: WINDOW; ACTIONS WinCreateScrollWindow( $Desktop, whdl1, PostMessageEvent{whdl1 }, 0, 0, 40, 25, 'Post message Window 1', $TimesRoman, 14, BitOr($WinBorder, $WinTitle, $WinMenu, $WinAutoPos ) ); WinCreateScrollWindow( $Desktop, whdl2, PostMessageEvent{ whdl2 }, 0, 0, 40, 25, 'Post message Window 1', $TimesRoman, 14, BitOr($WinBorder, $WinTitle, $WinMenu, $WinVScroll, $WinAutoPos ) ); PostMessage( whdl1, $MsgUser, whdl2 ); PostMessage( whdl2, $MsgUser, whdl1 ); WinWait( whdl1 ); END;
Codice di ritorno | Descrizione |
>0 | Esito positivo |
0 | La spedizione del messaggio non è riuscita |
-1 | L'handle della finestra non si riferisce a una finestra valida. E' possibile che la finestra non esista più o che non supporti il comando |
-2 | Valore sconosciuto |
-9 | Sintassi errata |
-11 | Valore non compreso nell'intervallo |
Invia un messaggio a una finestra o a una casella di dialogo.
SendMessage( VAL whdl: WINDOW, VAL message: INTEGER, [ VAL or REF messageParm: ANY ... ] ): INTEGER;
Nome dell'argomento | Descrizione |
whdl | L'handle di un oggetto di elaborazione eventi, come una finestra. |
Message | Il messaggio da inviare. |
messageParm | Un numero variabile di espressioni di qualsiasi tipo. L'handler degli eventi che riceve può accedere a queste espressioni tramite il valore $EventParm. |
TSD Script offre una consistente architettura per l'inoltro dei messaggi. I più comuni destinatari di messaggi sono gli handler degli eventi associati alle finestre o alle caselle di dialogo.
SendMessage può iniziare un evento in un handler degli eventi, una volta fornita un'handle dell'oggetto (ad esempio, un'handle della finestra) servita da quell'handler. Il secondo argomento per SendMessage viene messo in corrispondenza col parametro $Event per l'handler degli eventi. Gli argomenti successivi vengono messi in corrispondenza coi parametri evento nell'handler degli eventi.
L'handler degli eventi accede a questi argomenti chiamando $EventParm e fornisce il numero dell'argomento (da 1 a n) e il tipo di dati dell'argomento. Se viene inoltrato dal mittente un valore assegnabile (come una variabile), esso viene automaticamente passato per riferimento. Altrimenti, viene passato per valore. SendMessage si comporta come la chiamata di una funzione poiché il comando non ritorna all'istruzione che segue la chiamata di SendMessage fino a quando l'handler degli eventi non ha elaborato e restituito il messaggio.
La routine chiamante si interrompe fino a quando non ritorna l'handler degli eventi. Il valore di ritorno dell'handler degli eventi è quello restituito da SendMessage.
GLOBALS.KB ---------- CONSTANTS ADD_WINDOW_TO_LIST IS $MsgUser+1; REMOVE_WINDOW_FROM_LIST IS $MsgUser+2; VARIABLES mainWindow : WINDOW; SENDER.KB --------- USES Globals; ROUTINES EVENT MyEvent(REF r: MyRecord); ACTIONS WHEN $Event IS $MsgCreate THEN SendMessage(mainWindow,ADD_WINDOW_TO_LIST, $Handle); ELSWHEN $MsgDestroy THEN SendMessage(mainWindow, REMOVE_WINDOW_FROM_LIST,$Handle); ... MAIN.KB ------- USES Globals; TYPES MainRecord IS RECORD ... openList: LIST OF WINDOW; END; ROUTINES EVENT MainEvent(REF r: MainRecord); ACTIONS WHEN $Event IS ... ... ELSWHEN ADD_WINDOW_TO_LIST THEN ListInsert(r.openList,$EventParm(1,Window)); ELSWHEN REMOVE_WINDOW_FROM_LIST THEN ListDelete(r.openList,$EventParm(1,Window));
Codice di ritorno | Descrizione |
Valore di ritorno dell'handler degli eventi | Il valore di ritorno dell'handler degli eventi è quello restituito da SendMessage |
-1 | L'handle della finestra non si riferisce a una finestra valida. E' possibile che la finestra non esista più o che non supporti il comando |
-2 | Valore sconosciuto |
-9 | Sintassi errata |
-11 | Valore non compreso nell'intervallo |
Per informazioni sugli handler degli eventi, consultare il Manuale per la programmazione Tivoli Service Desk 6.0 Developer's Toolkit TSD Script.
Riferimento Lingua del Tivoli Service Desk 6.0 Developer's Toolkit TSD Script
Ritorna alla pagina principale