none
convertire variant vb6 in array vb net

    Domanda

  • Buon giorno a tutti,
    ho un componente com che mi ritorna un vettore multidimensionale che in VB6 era dichiarato così: 

     Dim arrvarMatRate()  As Variant  '   Vettore a base 1
      '   TIPO_RATA  (colonna 1)
      '   BOLLI_RATA (colonna 2)
      '   SPESE_RATA (colonna 3)
      '   ESENTI_E_IVA_RATA (colonna 4)
      '   DESCR_RATA = (colonna 5)</param>

    In vb net devo dichiarare la variabile da passare ByRef quando utilizzo il metodo.

    Ho provato con: 

    Structure StrutturaRata
    
            Public TIPO As Integer
            Public BOLLI As Decimal
            Public SPESE As Decimal
            Public ESIVA As Decimal
            Public DESC As String
            Public Sub New(ByVal TIPOX As Integer, ByVal BOLLIX As Decimal, ByVal SPESEX As Decimal, ByVal ESIVAX As Decimal, ByVal DESCX As String)
                Me.TIPO = TIPOX
                Me.BOLLI = BOLLIX
                Me.SPESE = SPESEX
                Me.ESIVA = ESIVAX
                Me.DESC = DESCX
            End Sub
    
        End Structure
    
        Public VettoreRate As New List(Of StrutturaRata)

    ma quando lo utilizzo nel modo seguente

    CalcolaScadenze("C", CType(VettoreRate, Object))

    viene sollevata l'eccezione seguente:

    impossibile eseguire il cast di oggetti di tipo System.Collection.GenericList sul tipo System.Array.

    Qualcuno riesce a darmi una dritta su come dovrei dichiarare in vb net l'array che mi serve?

    Grazie 1000

    Ciao

    Beppe



    • Modificato Beppe1964 mercoledì 11 aprile 2018 12:47
    mercoledì 11 aprile 2018 07:22

Risposte

Tutte le risposte

  • Data una lista puoi creare un array con il metodo ToArray. Poi non è detto che quello sia l'unico problema che dovrai affrontare nel porting.

    mercoledì 11 aprile 2018 08:38
  • Data una lista puoi creare un array con il metodo ToArray. Poi non è detto che quello sia l'unico problema che dovrai affrontare nel porting.

    Ciao BlueLed,
    grazie per la risposta.
    Forse non mi sono spiegato bene :-(
    Io ho un programma vb net che utilizza un componente com, non devo effettuare alcun porting da VB6 a vb net.
    Il mio problema è come dichiarare il VettoreRate che devo passare ByRef al componente com.

    Grazie ancora.

    Beppe

    mercoledì 11 aprile 2018 09:32
  • Se fai

    VettoreRate.ToArray()

    ottieni un array dalla lista.

    mercoledì 11 aprile 2018 10:04
  • Se fai

    VettoreRate.ToArray()

    ottieni un array dalla lista.

    Ciao BlueLed,
    grazie per la risposta.

    Facendo: 

    CalcolaScadenze("C", VettoreRate.ToArray)

    mi dice che "la matrice specificata non è del tipo previsto".

    Ma non saprei come dichiararla altrimenti..... suggerimenti?

    Grazie

    Beppe 

    mercoledì 11 aprile 2018 11:08
  • Come ti avevo detto, probabilmente il porting che hai fatto definendo la struttura non corrisponde a quello che sta dietro al Variant. Hai un esempio di utilizzo in VB6 ?
    mercoledì 11 aprile 2018 11:33
  • Comunque leggo che il VB.NET non supporta il Variant quindi non so se la cosa sia fattibile.
    mercoledì 11 aprile 2018 11:39
  • Ciao BlueLed,
    ecco un pezzo di codice VB6 che ho tratto da un esempio:

      Dim arrcurImprate()  As Currency '   Vettore a base 1
      Dim arrdatDateRate() As Date     '   Vettore a base 1
      Dim arrvarMatRate()  As Variant  '   Vettore a base 1
      '   TIPO_RATA  (colonna 1)
      '   BOLLI_RATA (colonna 2)
      '   SPESE_RATA (colonna 3)
      '   ESENTI_E_IVA_RATA (colonna 4)
      '   DESCR_RATA = (colonna 5)
      
      Dim intNumRate As Integer
      Dim ModPagamento as String = "001"
      
      intNumRate = objCom.CalcolaScadenze("C", ModPagamento, arrcurImprate(), arrdatDateRate, arrvarMatRate())
    Il codice VB Net che ho scritto io è questo ma, fino ad oggi non ho mai utilizzato il terzo vettore e non mi ero mai accorto dell'errore. I primi 2 vettori utilizzati ByRef sono monodimensionali, il terzo è multidimensionale

    Dim intNumRate As Integer
      Dim ModPagamento as String = "001"
      Dim VetDateList As New ArrayList
      Dim VetImpoList As New ArrayList
      Dim VetDate As Array
      Dim VetImpo As Array
      Dim VetTipiP As Array
    					
      intNumRate = objCom.CalcolaScadenze("C", ModPagamento, VetImpo, VetDate, VetTipiP)
      VetDateList = New ArrayList(VetDate)
      VetImpoList = New ArrayList(VetImpo)
      
      For x = 0 To VetDateList.Count - 1
    			...
    			...
    			...
      Next
    I primi 2 vettori li utilizzo tranquillamente, con il terzo (quello multi dimensione) ho problemi. Come ho scritto all'inizio ho provato ad utilizzare il terzo tramite la List Of della struttura che ho dichiarato ma ricevendo l'errore...

    Non saprei proprio cos'altro provare.

    Grazie ancora.

    ciao

    Beppe

    mercoledì 11 aprile 2018 12:42
  • Se il terzo tipo è un Variant dovrai usare una struttura VARIANT e gestirtela a basso livello, perchè sembra che in VB.NET non sia supportata direttamente.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627(v=vs.85).aspx

    mercoledì 11 aprile 2018 13:48
  • Se il terzo tipo è un Variant dovrai usare una struttura VARIANT e gestirtela a basso livello, perchè sembra che in VB.NET non sia supportata direttamente.

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627(v=vs.85).aspx

    Accidenti...... è certamente una operazione non alla mia portata :-(

    Grazie lo stesso.

    Buona serata.

    Beppe

    mercoledì 11 aprile 2018 15:11
  • Ma VetTipiP lo hai dichiarato come array perché così lo definisce il prototipo di CalcolaScadenze?

    VetTipiP lo riempie CalcolaScadenze?

    Perchè non provi a scandirlo come array di array?

    mercoledì 11 aprile 2018 16:06
  • Ma VetTipiP lo hai dichiarato come array perché così lo definisce il prototipo di CalcolaScadenze?

    VetTipiP lo riempie CalcolaScadenze?

    Perchè non provi a scandirlo come array di array?

    Si, VetTipiP lo riempie CalcolaScadenze che è un metodo della dll com.

    Perdona l'ignoranza, come faccio a scandirlo come array di array? Potresti farmi un esempio?

    Grazie 1000.

    Buona notte.

    Beppe

    mercoledì 11 aprile 2018 21:19
  • Se gli elementi dell'array a sono altri array:

                Dim i As Integer
                For i = a.GetLowerBound(0)  To a.GetUpperBound(0)
                    Dim b as Array = a.GetValue(i)
                    Dim j As Integer
                    For j = b.GetLowerBound(0) To b.GetUpperBound(0)
                        Console.WriteLine(b.GetValue(j))
                    Next
                Next
    Se non dovesse essere così prova a scandirlo come una matrice.


    • Modificato BlueLed giovedì 12 aprile 2018 07:22
    giovedì 12 aprile 2018 07:21
  • Se gli elementi dell'array a sono altri array:

                Dim i As Integer
                For i = a.GetLowerBound(0)  To a.GetUpperBound(0)
                    Dim b as Array = a.GetValue(i)
                    Dim j As Integer
                    For j = b.GetLowerBound(0) To b.GetUpperBound(0)
                        Console.WriteLine(b.GetValue(j))
                    Next
                Next
    Se non dovesse essere così prova a scandirlo come una matrice.


    Grazie BlueLed,
    questa sera provo.
    Buona giornata.
    Beppe
    giovedì 12 aprile 2018 08:10
  • Ho fatto una prova:

    Dim xx As Integer
    For xx = VetTipiP.GetLowerBound(0) To VetTipiP.GetUpperBound(0)
        Dim b As Array = VetTipiP.GetValue(xx)
        Dim j As Integer
        For j = b.GetLowerBound(0) To b.GetUpperBound(0)
                MessageBox.Show(b.GetValue(j).ToString)
        Next
    Next

    ma alla riga Dim b As Array .....

    mi da il seguente errore: La matrice non è unidimensionale.

    Questa l'immagine di come è fatto VetTipiP:

    Grazie ancora per le risposte.

    Ciao

    Beppe

    sabato 14 aprile 2018 13:57
  • Come avevo detto prova come matrice VetTipiP.GetValue(i, j)
    • Contrassegnato come risposta Beppe1964 domenica 15 aprile 2018 07:19
    sabato 14 aprile 2018 14:20
  • Ciao BlueLed,

    alla fine (grazie anche ai tuoi suggerimenti) ho risolto dichiarando VetTipiP Object(,)

    La scansione dei valori la faccio con questo codice:

    For x As Integer = 1 To VetTipiP.GetLength(0)
        For y As Integer = 1 To VetTipiP.GetLength(1)
            MessageBox.Show("Elementi x -" + x.ToString + "- y -" + y.ToString + "- valore: " + VetTipiP.GetValue(x, y).ToString)
        Next
    Next

    Grazie ancora e buona domenica.

    Beppe

    domenica 15 aprile 2018 07:19