Gli operatori logici in Visual Basic Net? Li trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
Le API: Riferimenti ad oggetti e a periferiche, puntatori e flags


Come si può indicare al sistema o in modo indiretto all'applicazione a quale oggetto riferirsi? Con un riferimento ad un oggetto, cosiddetto handle dell'oggetto. Le API utilizzano tali riferimenti per tenere una mappa di tutti gli oggetti presenti nel progetto (ma non solo). In realtà ogni oggetto presente sullo schermo anche non in fase di progettazione ha un numero di riferimento. E ciò rappresenta per un programmatore l'unica possibilità di gestire e manipolare gli oggetti nonchè lo standard disponibile, anche perchè questo è il sistema comunemente utilizzato da Windows.
In realtà gli handles sono strutture interne a Windows che al loro interno custodiscono tutte le informazioni e le proprietà di un oggetto. La loro struttura è composta da un numero intero a 32 bit, utilizzato nelle chiamate API. In ogni caso, nel modo in cui è concepito Visual Basic, non c'è grossa differenza in fase iniziale tra un riferimento ad un oggetto e un qualsiasi altro semplice intero a 32 bit: i riferimenti acquistano valore e diventano tali nel momento in cui vengono passati come parametri ad una funzione API. E del resto non ci sarebbe certo necessità di conoscere il numero identificatore di un oggetto se non fosse possibile associarlo ad una funzione che lo elabori (e che naturalmente faccia altrettanto con l'oggetto in questione...).

Ricapitolando sommariamente quanto detto, la maggior parte degli oggetti supportati da Windows è accompagnata da un numero di riferimento. La lista di tali oggetti comprende praticamente qualsiasi cosa appaia sullo schermo: menu, pulsanti, finestre, textbox e così via. Una volta creato uno degli oggetti menzionati, viene "attaccato" a tale oggetto una particolare proprietà, hWnd che non è altro che il numero di riferimento a tale oggetto. O meglio a tale finestra. Questo perchè è da tenere presente che per Windows i pulsanti, le forms, le textbox sono considerati speciali tipi di finestre. Ecco perchè possiamo tradurre hWnd come handle (of the) Window.
Facciamo un esempio: abbiamo su un piano (la form) un pulsante. Manteniamo le denominazioni degli oggetti dati per default da Microsoft: Command1 e Form1. Se vogliamo scoprire qual'è l'intero col quale Windows fa riferimento a Command1 dal momento stesso in cui è stato creato, possiamo utilizzare questa linea di codice:

MsgBox (Command1.hWnd)

Dando l'avvio all'applicazione appare una finestra di messaggio che rivela il numero identificatore dell'oggetto, ad esempio 2020. Richiudendo l'applicazione e riavviandola senza apportare alcuna modifica si noterà che il riferimento a Command1 è cambiato. Adesso ad esempio è 2039. Questo avviene in quanto l'assegnazione del numero di riferimento all'oggetto non avviene nel momento in cui l'oggetto viene posto sul piano, ma nel momento in cui l'applicazione viene compilata. Per Windows infatti una serie di oggetti su una form di un progetto in fase di sviluppo non significa niente, e quindi non viene considerata.
Lo stesso procedimento può essere applicato a Form1:

MsgBox (Form1.hWnd)

Anche qui aprendo e richiudendo l'applicazione, il numero identificatore di Form1 cambia.
Molto simile all'intero di riferimento di un oggetto è il riferimento ad una periferica. Anche questo numero infatti richiama in realtà una struttura interna a Windows che non può essere direttamente accessibile da un'applicazione esterna.
In ogni caso, come già il nome suggerisce, il riferimento ad una periferica (o device context) fa da intermediario tra un'applicazione (che nello specifico può essere il programma che stiamo sviluppando in Visual Basic) ed una periferica fisica come la tastiera, il monitor o la stampante. Questo sistema di gestire le periferiche ha l'enorme vantaggio di trattare allo stesso modo differenti modelli e marche di periferiche. Non sarà necessario infatti distinguere tra un monitor di marca X o di marca Y, in quanto il riferimento al monitor è identico.
La cosa particolarmente interessante è che in Windows le stesse finestre sono considerate allo stesso modo delle periferiche e dunque trattate in modo del tutto analogo: hanno anche loro il numero di riferimento di periferica (che come il riferimento all'oggetto è un intero a 32 bit). La possibilità di trattare una finestra come una periferica deriva principalemente dalla necessità delle API di disegnare su tale finestra e in ogni caso di manipolarne l'espetto estetico.
In questo modo per sapere qual'è l'intero di riferimento alla periferica "finestra" si può utilizzare il seguente blocco di codice:

MsgBox (Form1.hDC)



dove appunto hDC sta per handle (of the) Device Context.


Inoltre, poichè i files DLL che custodiscono le API di Windows sono stati creati con l'utilizzo di C++, molte funzioni richiedono di indicare il puntatore a questo o a quell'oggetto, sottoforma di parametro.
L'argomento dei puntatori è piuttosto complesso e richiederebbe uno studio che per il momento non interessa, visti gli scopi di questo articolo. Passiamo quindi direttamente all'ultimo oggetto dell'analisi: i Flags

Per i flags non esiste una buona traduzione. Così useremo il termine anglosassone. Un flag non è altro che uno speciale tipo di costante. Che cosa differisce allora dalle altre costanti? Principalmente il fatto che possono essere combinate con altre costanti. Questo permette di ottenere combinazioni multiple utilizzando una sola costante, come si farebbe normalmente. Pensiamo infatti che ad esempio attraverso una sola costante flag è possibile passare ad una funzione API ad esempio una serie di combinazioni del tipo: on/off o si/no come preferite. Quando si combinano più flags sarebbe cosa opportuna utilizzare l'operatore Booleano Or. Questo infatti previene dal formare una combinazione di flags erronea o che comunque non rappresenta ciò che volevamo (sempre che comunque sia una combinazione valida).
Consideriamo ad esempio una funzione che accetta un solo parametro. La funzione fa apparire una finestra di messaggio. Il parametro si riferisce al pulsante che si vuole far comparire sulla finestra (ad esempio: OK, OK-Annulla e così via). Un flag combinato che individua il tipo di pulsante che deve apparire può essere ad esempio:

Const PK_OK = 1

che fa apparire appunto il pulsante "OK", oppure :

Const PK_CANCEL = 2


che si riferisce al pulsante "CANCEL", o ancora:

Const PK_OKCANCEL = 3


che invece farebbe apparire la combinazione di due pulsanti: "OK" e "CANCEL". Questo dimostra perchè un flag è una combinazione di costanti. Allora nel caso in cui il programmatore volesse richiamare la funzione assegnandole il parametro PK_OK gli basterebbe fare una cosa del genere:

ValoreDiRitorno = Funzione(PK_OK)

Bisogna a questo punto fare attenzione. Non è possibile infatti richiamare una combinazione col segno "+". Questo perchè se ad esempio scriviamo:

ValoreDiRitorno = Funzione(PK_OK + PK_CANCEL)

per ottenere la combinazione dei pulsanti "OK" e "CANCEL", si otterrebbe un altro pulsante (ad esempio "?") in quanto il + fa la somma di 1 e 2 e non di "OK" e "CANCEL". Ecco perchè basterebbe allora utilizzare Or:

ValoreDiRitorno = Funzione(PK_OK Or PK_CANCEL)





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