Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio Best seller su VBA
(v. www.hoepli.it)


Il mio ultimo libro su Open XML
(v. www.FAG.it):



La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Funzioni VB6 obsolete in VB . NET (divagazioni estive)

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

 

?>

?>

posted on sabato 8 agosto 2009 11.16