Riferimento Lingua del Tivoli Service Desk 6.0 Developer's Toolkit TSD Script

Gestione degli eventi

Ritorna alla pagina principale


$Event

Descrizione

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.

Sintassi

Non applicabile.

Note

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.

Consultare anche

Per ulteriori informazioni sugli eventi, consultare il Manuale per la programmazione Tivoli Service Desk 6.0 Developer's Toolkit TSD Script.


$EventParm

Descrizione

Consente a un handler degli eventi di accedere a parametri extra inclusi con un messaggio.

Sintassi

FUNCTION $EventParm(n: INTEGER, type: DATATYPE): DATATYPE;

Note argomenti

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.

Note

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 ...

Esempio

EVENT MyEvent(REF r: MyRecord);
VARIABLES
width, height : INTEGER;
ACTIONS
WHEN $Event IS $MsgSize THEN
 width:=$EventParm(1,Integer);
 height:=$EventParm(2,Integer);
 ...

Consultare anche

Per ulteriori informazioni sugli eventi, consultare il Manuale per la programmazione Tivoli Service Desk 6.0 Developer's Toolkit TSD Script.


$Handle

Descrizione

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.

Esempio

EVENT MyEvent(REF r: MyData);
ACTIONS
      WHEN $Event IS $MsgCreate THEN
 WinSetIconBar($Handle,{'CREATE.ICO','DESTROY.ICO'}: LIST
 OF STRING);
...

$NullHandler

Descrizione

Specifica che nessun evento è in elaborazione per un'istruzione che richiede un handler degli eventi.

Sintassi

EVENT $NullHandler{initializationData}: INTEGER;

Note argomenti

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.

Note

La sintassi utilizzata per $NullHandler è la stessa di quella per tutti i valori dollaro utilizzati con gli handler degli eventi.

Esempio

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;

Consultare anche


DelegateEvent

Descrizione

Delega la gestione di un evento da una routine gestione eventi a un'altra.

Sintassi

FUNCTION DelegateEvent ( VAL handler: EVENT,
 [ REF userData: ANY ] ): INTEGER;

Note argomenti

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.

Note

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.

Esempio

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;

Codici di ritorno

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.

Consultare anche


PostMessage

Descrizione

Spedisce un messaggio a un handler degli eventi della finestra.

Sintassi

PostMessage( VAL whdl: WINDOW, VAL message: INTEGER,
 [ VAL msgParm: ANY ... ] ): INTEGER;

Note argomenti

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:
  • DlgBox
  • WinFileDialog
  • WinMessageBox
  • WinWait
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.

Esempio

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;

Codici di ritorno

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

Consultare anche


SendMessage

Descrizione

Invia un messaggio a una finestra o a una casella di dialogo.

Sintassi

SendMessage( VAL whdl: WINDOW, VAL message: INTEGER,
 [ VAL or REF messageParm: ANY ... ] ): INTEGER;

Note argomenti

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.

Note

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.

Esempio

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));

Codici di ritorno

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

Consultare anche

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

Copyright