Gli operatori logici in Visual Basic Net? Li trovi su Opentraining.it Visual Basic Italia Guida al sito Tre tipi di collaborazione con Visual Basic Italia Scrivici per ogni tua necessità Guide di programmazione Visual Basic in rete Cerca all'intreno di Visual Basic Italia Aggiungi un sito alla lista Torna alla pagina principale
Guide e Tutorials:indexed
Le API: funzioni callback


Comprendere il concetto di Funzione Callback è molto semplice per chi ha seguito gli articoli precedenti sulle API.
Una Funzione Callback infatti processano delle informazioni nello stesso istante in cui la funzione API viene richiamata, in modo quindi da evitare di attendere il termine dell'elaborazione e da un altro lato di inserire la chiamata API all'interno di un ciclo.
Per fare un esempio pratico si può pensare al processo di enumerazione di tutte le finestre aperte attraverso la funzione EnumWindows. Una volta chiamata l'API EnumWindows essa ritornerà il riferimento alla prima finestra trovata, cosa che in sè non ha molto significato.
Ecco perchè la funzione passa immediatamente tale riferimento alla funzione callback che la elabora in tempo reale, ancor prima di ricevere il riferimento alla seconda finestra.
Elaborazione che naturalmente consiste in una serie di operazioni a discrezione dello sviluppatore, proprio come in una funzione normale.
E fa parte delle possibilità della funzione callback l'interruzione del processo ossia la segnalazione di stop alla funzione API.

L'utilizzo delle funzioni callback si rivela molto semplice con l'utilizzo dell'istruzione AddressOf che contiene l'indirizzo della funzione callback.
Cosa molto importante da ricordare è che la funzione callback dev'essere pubblica (Public Function) e contenuta in un modulo e non all'interno di un modulo di form.
Questo per permettere la piena accessibilità delle funzioni API in qualsiasi parte del codice siano state inserite. Le limitazioni all'utilizzo dell'operatore AddressOf sono molto chiare nella documentazione di sviluppo di Visual Studio:

  • "AddressOf può essere utilizzata solo immediatamente prima di un argomento di un elenco di argomenti. Tale argomento può essere il nome di una routine Sub, Function o Property definita dall'utente"

  • "La routine Sub, Function o Property richiamata con AddressOf deve trovarsi nello stesso progetto delle dichiarazioni e routine correlate."

  • "È possibile utilizzare AddressOf solo con routine Sub, Function o Property definite dall'utente. Non è possibile utilizzarla con funzioni esterne dichiarate con l'istruzione Declare o con funzioni a cui si fa riferimento da librerie dei tipi."

  • "È possibile passare un puntatore a una funzione a un argomento impostato come As Any o As Long in una definizione dichiarata come Sub, Function o di tipo definito dall'utente. "
    La sintassi dell'operatore AddressOf è la seguente:

    AddressOf NomeFunzione

  • dove naturalmente NomeFunzione indica il nome della funzione callback che si vuole chiamare ogni volta che la funzione API ritorna un risultato utile.
    In definitiva quindi utilizzare un puntatore ad una funzione callback significa passare il valore ritornato dalla funzione API alla funzione callback:

    EnumWindows AddressOf Funzione_Callback, 0

    Ad esempio possiamo creare un progetto nel quale, per ogni finestra correntemente aperta viene visualizzato in una finestra di messaggio il testo contenuto nella barra del titolo.
    A tale scopo dovremo innanzitutto inserire in un modulo la funzione callback con le dichiarazioni delle funzioni necessarie a recuperare la lunghezza del testo della barra del titolo ed il testo stesso:

    '// MODULO STANDARD
    Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal _
    hwnd As Long) As Long
    Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, _
    ByVal lpString As String, ByVal cch As Long) As Long
    '// la funzione callback
    Public Function TestoFinestre(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim LTesto As Long, TBuffer As String '// lungh. del testo e della memoria che lo contiene
    LTesto = GetWindowTextLength(hwnd) + 1 '// richiama l'API per ottenere la lunghezza
    TBuffer = Space(LTesto) '// crea uno spazio in memoria pari alla lunghezza del testo
    GetWindowText hwnd, TBuffer, LTesto '// richiama l'API per ottenere il testo
    MsgBox Left(TBuffer, LTesto - 1) '// mostra il testo della barra del titolo
    End Function

    E adesso nel modulo di codice di Form1:

    '// MODULO DI CODICE
    Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, _
    ByVal lParam As Long) As Long
    Private Sub Form_Load()
    EnumWindows AddressOf TestoFinestre, 0
    End Sub



    Archivio:ndexed
    Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
    Proponi un argomento

    Visual Basic Italia© copyright 2000 - tutti i diritti riservati
    E-mail:
    vbitalia@libero.it