Un paio di divagazioni estive
Svolte in contatto, a volte un po’ tempestoso ma sempre proficuo, con preclari esperti d’Informatica, come il ben noto Francesco Balena e il ben informato Diego Cattaruzza, solerte redattore capo dell’ottimo sito Visual Basic Tips & Tricks (che mi ha onorato ospitando miei articoli).
La prima: obsolescenza delle vecchie funzioni VB6 (cum grano salis, anzi due). Si riferisce a un vizietto abitudinario di cui, confesso, sono afflitto anch’io come quelli che operano prevalentemente in ambito VBA, ergo VB6. Informo chi non lo sapesse che dal VB .NET in avanti le vecchie, care funzioni VB6 – come Asc, Chr e le altre di trattamento stringhe, o l’inattesa Ubound per il limite superiore di una matrice – vanno considerate obsolete e “moralmente” da sostituire, ad esempio, con la proprietà Lenght. Esempio:
' Vecchia versione:
For i = 0 To Ubound(MiaMatr)
' Versione moderna
For i = 0 To MiaMatr.Lenght - 1
Per chi vuole aggiornarsi (cosa che ovviamente, con Office, riguarda i VSTO e non le normali macro VBA) indico un prezioso elenco stilato da Diego Cattaruzza:
Tabella funzioni da VB6 a VB .NET
( su http://www.visual-basic.it/areaarticoli.asp )
Che dire? Diego predica bene, anzi ha ragione, salvo un’osservazione e una strana eccezione:
- La libreria Visual Basic (delle vecchie funzioni) non solo è tuttora supportata fino a VB 2010 p.v. , ma lo è per default (con Francesco Balena che sembra sostenere che funzioni antiche sono a volte più prestanti);
- La funzione Mid è scomparsa in lettura ma continua a essere supportata anche disabilitando la libreria Visual Basic in scrittura
Esempi:
MioCar = Mid("Ambaraba", 5, 1) 'Non più supportata
MiaStr = "Ambaraba"
Mid(MiaStr, 5, 1) = "*" ' SUPPORTATO! (MiaStr diventa "Amba*aba”)
Nel corso dello scambio email un terzo guru di VB T&T sosteneva l’obsolescenza anche di Redim. Creando, involontariamente credo, un po’ di confusione in quanto tale parolina chiave non fa parte della libreria Visual Basic e, soprattutto, è viva e vegeta.
Per chiarire la vexata quaestio propongo la tabella seguente:
|
Vb6 |
Vb .NET e succerss. |
NOTE |
|
Dim MiaMatr(5) |
Dim MiaMatr(5) |
Lecito in entrambi i mondi |
|
Dim MiaMatr() |
Dim MiaMatr() |
Obbligatorio, solo in VB6, far seguire una Redim |
|
|
Dim N = 12
Dim MiaMatr(N)
Dim MiaMatr(N * 2) |
Espressioni Dim non lecite in VB6 |
La novità espressa dalla seconda riga può indurre a pensare che Redim nel nuovo mondo non serva più. Non è esatto, ha richiamato Francesco, con l’esempio seguente:
Sub ExpandArray(ByRef arr() As Integer)
ReDim arr(arr.Length * 2 - 1)
End Sub
In questo caso non si può sostituire Redim con Dim.
A mia volta mi permetto due ulteriori indicazioni. La prima è un richiamo alle variabili definite a livello modulo (Sezione Dichiarazioni). La seconda è l’ineludibile impiego di Redim Preserve in molte applicazioni dinamiche. L’esempio seguente completa l’osservazione di Francesco:
Module Module1
Sub ExpandArray(ByRef Arr() As Integer)
Dim Lung = Arr.Length
ReDim Preserve arr(Lung * 2 - 1)
For i As Integer = 0 To UBound(arr)
If i >= Lung Then Arr(i) = i * i ' Quadrati nelle celle aggiunte
' MessageBox.Show (Arr(i)) ' Servita per debug
Next
End Sub
Sub Main()
Dim MioArr(3) As Integer
For i As Integer = 0 To UBound(MioArr)
MioArr(i) = i ' <= 0, 1, 2, 3
Next
ExpandArray(MioArr)
For i As Integer = 0 To UBound(MioArr)
MessageBox.Show(MioArr(i)) ' => 0, 1, 2, 3, 16, 25, 36, 49
Next
End Sub
End Module
?>
?>