Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Difficoltà: 3 / 5 Questo articolo tratta un bug che si verifica esclusivamente con Visual Basic 5, anche dopo aver installato l'ultimo Service Pack 3 per Visual Studio 97. Lo strano comportamento riguarda il passaggio per riferimento di dati Variant all'evento di un controllo utente e si verifica soltanto nei progetti compilati.
Sebbene i conrolli utente ed i moduli di classe
siano concettualmente uguali, il comportamento anomalo si verifica soltanto
nei controlli utente, in un momento ben preciso.
L'evento in questione è dichiarato alla riga 3, prende il nome di Saluta e riceve, per riferimento, un parametro di nome Saluto e di tipo Variant. Sono presenti due metodi di nome Salutami e Salutami2 che sostanzialmente non faranno altro che lanciare l'evento Saluta; la differenza tra loro è data dal fatto che il primo passa all'evento Saluta la variabile varSaluto, mentre il secondo passa la stringa contenuta nella stessa variabile. Potrebbe sembrar strana come chiamata, una stringa dove invece va passata una variabile, ma si tratta comunque di un'operazione comunissima, utilizzata spesso quando si desidera che la funzione chiamata non vada ad intaccare dati al suo esterno, ma si desidera comunque ricevere gli effetti dati dal suo richiamo. È stata aggiunta al controllo utente, che prenderà il nome di SmileControl, la seguente routine per impedirne il ridimensionamento, ma non ha alcun effetto con il resto del progetto:
Il form che utilizzerà i due moduli conterrà quattro semplici pulsanti di nome cmdClsVar, cmdClsStr, cmdCtlVar e cmdCtlStr, ed un'istanza del controllo SmileControl appena creato.
I quattro pulsanti richiameranno rispettivamente: i metodi Salutami e Salutami2 dell'istanza clsSaluta ed i metodi Salutami e Salutami2 del controllo SmileControl1. Il codice del form pertanto si riduce a poche miserevoli righe:
L'istanza clsSaluta è dichiarata con WithEvents (riga 2) in modo da poterne utilizzare gli eventi, ed è istanziata al caricamento del form (riga 5) e deallocata alla sua chiusura (riga 9).
Come già detto, i quattro pulsanti richiamano i metodi Salutami e Salutami2 del controllo utente e dell'istanza della classe. Lo ricordiamo, il metodo Salutami genera l'evento Saluta passandovi una variabile Variant, mentre Salutami2 genera lo stesso evento ma passandovi invece una stringa. Concludiamo il nostro progetto con le ultime due routine conclusive:
Anche queste strutturalmente identiche: la prima riguarda l'evento Saluta dell'istanza della classe, mentre la seconda riguarda lo stesso evento ma del controllo utente. Per entrambe è visualizzato un avviso con il valore del parametro Saluto, fornito dai metodi Salutami e Salutami2.
Lanciando il progetto all'interno dell'IDE di Visual Basic, tutto funziona regolarmente, ma una volta compilato il progetto e lanciato il file eseguibile, i primi tre pulsanti rispondono regolarmente, mentre il quarto pulsante (Controllo con String) genererà l'errore di runtime 458 mostrato nella figura a fianco. L'errore sarà generato in occasione della lettura tramite MsgBox dei dati forniti all'evento e non al ricevimento degli stessi alla routine evento. La descrizione dell'errore è "La variabile utilizza un tipo di automazione non supportato in Visual Basic" e descrive abbastanza bene l'errore. Infatti, nonostante il metodo Salutami2 avesse passato una stringa all'evento Saluta, quest'ultimo riceve dei dati differenti. È possibile verificarlo sostituendo la riga 33 con:
La funzione VarType restituirà infatti un valore assai anomalo:
99 decimale, un valore che indica un tipo di dati non previsto nei Variant
di Visual Basic. Vedi a tal scopo l'articolo dedicato all'analisi
della struttura dei Variant. |
Ciò che lascia parecchio perplessi è il fatto che all'interno dell'IDE tutto scorre regolarmente e l'errore è generato soltanto nella lettura di stringhe passate ad eventi di un controllo utente, che si aspettano sia passata una variabile Variant. L'errore è infatti generato leggendo il valore, il contenuto di Saluto e non leggendone il suo tipo tramite VarType o altro. L'errore non si genera quindi:
Il bug è stato corretto in Visual Basic 6. Fibia
FBI
|
Torna all'indice delle Stranezze |