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
Il tutto funziona correttamente e i tempi di lettura/scrittura sono più che accettabilicodice: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
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:
Ha dei tempi di esecuzione che sono eterni. Come fare?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
3) Al momento del salvataggio, eseguito con i 4 loop, eseguo questo codice
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?codice:Response = MsgBox("Salvo l'archivo?", MsgBoxStyle.YesNoCancel) If Response = MsgBoxResult.Yes Then Call ScriviArchivio() Exit Sub End If
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
(non garantisco che l’indirizzamento sia giusto è solo un esempio)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
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



