Newsgroup: it.comp.lang.visual-basic
Titolo: Sintassi files accesso casuale in vb6

Per favore, oltre all'aspirina, mi indicate la corretta sintassi per gestire 
i files con accesso casuale in VB6?
Dove sbaglio?
Open "dati.rnd" For Random As #1 Len = 245
a = LOF(1) / 245      ' numero dei record presenti nel file
Close #1
a = a + 1                   ' aggiungi 1 al contatore
Open "indice" For Append As #1
Print #1, a, text1, Text2     ' scrivi nell'indice i dati fondamentali 
(contatore, text1 e text2) per poterli poi rintracciare
Close #1
E fin qui credo di esserci in quanto è molto simile al vecchio Gwbasic.
Open "Gdati.rnd" For Random As #1 Len = 245
Type dati  ===> ERRORE DI COMPILAZIONE. NON VALIDO ALL'INTERNO DI UNA 
ROUTINE. Che significa??????
n1 As String * 50
n2 As String * 50
n3 As String * 50
n4 As String * 50
n7 As String * 50
n5 As String * 20
n6 As String * 20
End Type
LSet n1 = Text1
LSet n2 = Text2
LSet n3 = Text3
LSet n4 = Text4
LSet n5 = Text5
LSet n6 = Text6
LSet n7 = Text7
Put #1, a, dati
Close #1
Ho incorporato tale routine all'interno di un Command1 il quale verifica la 
correttezza di un campo e poi provvede al salvataggio dei dati
Private Sub Command1_Click()
....
...
End Sub
Come faccio a scrivere 7 caselle di testo (text1..7) di lunghezza 
predefinita (n1..7)?
Grazie per ogni aiuto.
Il Balena qui non mi dice nulla mentre il McGraw Hill accenna appena ed è 
dal libro che ho preso spunto, sbagliando.
(G)

Type dati  ===> ERRORE DI COMPILAZIONE. NON VALIDO ALL'INTERNO DI UNA
Ovviamente la "G" prima di dati NON c'è nel listato originario e pertanto il 
compando OPEN è sempre
Open "dati.rnd" For Random As #1 Len = 245
Mi dite dove sbaglio?????
Private Sub Command1_click()
....
....
Open "dati.rnd" For Random As #1 Len = 245
a = LOF(1) / 245      ' numero dei record presenti nel file
Close #1
a = a + 1                   ' aggiungi 1 al contatore
Open "indice" For Append As #1
Print #1, a, text1, Text2     ' scrivi nell'indice i dati fondamentali
(contatore, text1 e text2) per poterli poi rintracciare
Close #1
E fin qui credo di esserci in quanto è molto simile al vecchio Gwbasic.
Open "dati.rnd" For Random As #1 Len = 245
Type dati  ===> ERRORE DI COMPILAZIONE. NON VALIDO ALL'INTERNO DI UNA
ROUTINE. Che significa??????
n1 As String * 50
n2 As String * 50
n3 As String * 50
n4 As String * 50
n7 As String * 50
n5 As String * 20
n6 As String * 20
End Type
LSet n1 = Text1
LSet n2 = Text2
LSet n3 = Text3
LSet n4 = Text4
LSet n5 = Text5
LSet n6 = Text6
LSet n7 = Text7
Put #1, a, dati
Close #1
End Sub

Significa che questa parte, che in pratica è la dichiarazione della 
struttura del Record, non si può fare in una Sub, ma deve essere fatta nel 
modulo1.BAS ad esempio, quindi taglia tutto quello che vedi scritto qui 
sotto, da Type a EndType compresi e incollalo nel modulo Bas.
Tutte le altre istruzioni invece, lasciale invariate nella SUB in cui si 
trovano ma questa struttura spostala nel modulo:
Type Dati
n1 As String * 50 :Rem fisso la dimensione a 50 Byte il Campo N1 sarà una 
stringa vuota di dimensione fissa a 50 byte anche se vuota
n2 As String * 50
n3 As String * 50
n4 As String * 50
n7 As String * 50
n5 As String * 20
n6 As String * 20
End Type
In GwBasic questo era l'equivalente
Field #1,50 As N1$,50 As N2$,50 As N3$,50 As N4$,50 As N7$,50 As N5$,50 As 
N6$
E si poteva probabilmente come anche in Qbasic si poteva definire 
immediatamente a seguito dell l'istrusione OPEN......
In VB6 non è così, con Type si crea una struttura (che è globale e quindi in 
un modulo .bas) e poi con Get o Put si accede ad essa per leggere o scrivere 
il record.

CUT
Sei gentilissimo, quindi in VB6 devo dichiarare determinati "blocchi" al "di 
fuori" delle singole subroutne.
Ma dove hai imparato?
Mi consigli un libro che mi permetta di capire come funziona il VB6 e mi 
spieghi la sintassi dei vari comandi?
Adesso continuo a provare le tue indicazioni al fine di ottere un codice che 
svolga i compiti che io "vorrei" svolgesse...
Grazie ancora e buona serata.
(G)

 svolga i compiti che io "vorrei" svolgesse...
Allora, prima di tutto
Dim file As long
file = FreeFile
Open ... As file
Questo ti permette di gestire in modo corretto l'indice del file: te lo dice
VB qual è quello giusto e tu non rischi di aprire contemporaneamente due
file #1
Poi, se posso darti un consiglio personale, butta via i file Random e lavora
sempre For Binary, così hai un controllo completo sul file e non devi stare
sempre a scegliere tra Print, Write o Put.
E comunque per i file di tipo binario (compresi i random) usa sempre Get/Put
e non Print/Write/Input/Read che vanno bene solo per i file di testo, con un
mucchio di implicazioni (ti lascio alla guida in linea per approfondimenti).
Ciao
--
Reporting tool: 
http://www.neodatatype.net

 approfondimenti).
Ti ringrazio moltissimo per le preziose indicaizoni.
Stavo guardando che i file di tipo "binario" sono trattati in modo un po' 
piů approfondito rispetto alle altre tipologie di I/O sul Mc Graw Hill: 
inoltre leggo che "...i file binari non considerano i caratteri di fine file 
(EOF) che si trovano nei file".
Come faccio a sapere quanti record ho scritto nel file, ovvero a conoscere 
la posizione di uno specifico record?
Grazie ancora.
(G)

 Ma dove hai imparato?
Questo è il punto, non avevo e no ho nessun libro, mi sono dovuto imparare 
tutto da solo con degli esempi che trovavo qua e la, infatti sebbene io 
sappia già abbastanza non sò tuttavia molto piu di te provenendo io da 
QBasic, riesco infatti a risponderti su cose che io ho già tritato e 
ri-tritato per esigenze personali mie.
Ma qui nel NG c'è gente decisamente piu preparata di me, ed io da tantissimi 
degli amici di questo NG, sto imparando cose che comunque non sono riuscito 
ad apprendere da solo nonostante io abbia MSDN installato.
Vedi Guido, MSDN spiega si: parole chiave,  metodi e proprietà; ma gli 
esempi che ci sono nel 80% dei casi non sono mai attinenti a ciò che sto 
programmando io e così mi trovo anche io a impazzire per adattare questi 
esempi fino a farmi venire dei gran mal di testa, solo che non prendo le 
aspirine, senno a quest'ora non avrei piu il fegato oltre che la testa :-)
Ivan
 

 aspirine, senno a quest'ora non avrei piu il fegato oltre che la testa :-)
Te beato, allora! ;-)))))
Ciao e grazie, credo che ti/vi romperò ancora un bel po'.
(G)