Ciao, sono nuovo in questo forum ed ho una serie di problemi di programmazione con VB
Sistema operativo Windows XP Professional
Office Professional (o meglio) Excel 2002 SP3
Visual Studio 2005 - 8.0 di cui ho solo installato Visual Basic 2005 (prima avevo installato tutto, ma alla fine ho disinstallato e reinstallato solo VB).
Ho scritto una serie di procedure in Excel, utilizzando poco le capacità di Excel, ma sfruttando invece la programmazione del basic di Excel, mi risultava comodo distribuire fogli che poi hanno personalizzato in vari modi. Essendo ormai consolidate ho pensato di riunirle in un unico programma e ho affrontato Visual Studio.
1. In Excel ho dimensionato tranquillamente
codice:
Public NumeDati As Integre
Public DataMemo() As Date
Public ValoriMemo() As Byte
Public ControlMemo() As Boolean
Public AltroMemo() As Integer
.
.
NumeDati=5000 ‘Circa
ReDim DataMemo(1 To NumeDati) As Date
ReDim ValoriMemo(1 To NumeDati, 1 To 5, 1 To 11, 0 To 24) As Byte
ReDim ControlMemo(1 To NumeDati) As Boolean
ReDim AltroMemo(1 to 100, 1 To NumeDati) As Integer
Ora Visual Basic non vuole dimensioni che non partono da zero. Esiste un sistema, una Option, una direttiva al compilatore per passare questo ostacolo? (non è neanche possibile dimensionare un vettore da -100 a 100). In più solo l’ultima dimensione può essere variata.
2. In Excel scrivendo
codice:
Dim FileNumber As Integer
FileNumber = FreeFile
Open ThisWorkbook.Path & "\NomeFile.fil" For Binary Access Write As #FileNumber
Put FileNumber, , NumeDati
Put FileNumber, , DataMemo
Put FileNumber, , ValoriMemo
Put FileNumber, , ControlMemo
Put FileNumber, , AltroMemo
Close #FileNumber
Il tutto funziona correttamente e i tempi di lettura/scrittura sono più che accettabili
In Visual Basic non va accetta solo matrici (vettori) mono-dimensionali
Ho provato sia con FilePut(Nf, ValoriMemo) che con My.Computer.FileSystem.WriteAllBytes(...)
Convertire il tutto con:
codice:
For N=1 to NumeDati
For K=1 to 5
For J=1 to 11
For I=0 to 24
Put FileNumber, , ValoriMemo(N, K, J, I)
Next I
Next J
Next K
Next N
Ha dei tempi di esecuzione che sono eterni. Come fare?
3) Al momento del salvataggio, eseguito con i 4 loop, eseguo questo codice
codice:
Response = MsgBox("Salvo l'archivo?", MsgBoxStyle.YesNoCancel)
If Response = MsgBoxResult.Yes Then
Call ScriviArchivio()
Exit Sub
End If
Mi resta sullo schermo la maschera del messaggio parzialmente disegnata e solo alla fine del salvataggio esegue un repaint corretto della zona prima occupata dalla MsgBox, l’effetto grafico è orrendo, come si risolve questo problema? E’ la mia scheda grafica difettosa?
L’unica soluzione che mi viene in mente è di dimensionare un vettore
ReDim V(NumeDati*5*11*25) as Byte
Questo dovrei riuscire a leggerlo e scriverlo facilmente, se non esistono limiti di dimensioni
E poi di indirizzarlo io con una Function
codice:
Public Function DataMemo(ByVal N As Integer, ByVal K As Integer, ByVal J As Integer, ByVal I As Integer) As Byte
DataMemo = V(I * (NumeDati * 5 * 11) + (J - 1) * (NumeDati * 5) + (K - 1) * NumeDati + N)
End Function
(non garantisco che l’indirizzamento sia giusto è solo un esempio)
Devo ricorrere a questo? VB6 ha lo stesso questi problemi? Se inserisco queste matrici che dipendono tutte da NumeDati in una Structure poi riesco a leggerle e scriverle?. (all’interno della struttura avrei comunque una matrice a più dimensioni).
Esiste un compilatore Basic possibilmente visual che superi questi problemi?
Se riscrivo il tutto in Pascal (Delphi) o C commetto tanti errori di conversione che è come ricominciare da capo.
Qualche consiglio grazie. Anche per il punto 3 che non dipende strettamente dalla Dim.
Tomas