PDA

View Full Version : Gestire un elenco di indirizzi vb


mon--edited--romo
21-06-2006, 14:34
Oggi tentavo di gestire un elenco di indirizzi email con il vb, quindi ho pensato di utilizzare un vettore (di dimensione pari al numero degli indirizzi) e di dichiarare come record ogni elemento del vettore.

Sulla carta ho tutto pronto, ma "non funziona" il codice che avrei predisposto è questo ed almeno per il momento dovrei riuscire ad inserire e visualizzare gli indirizzi con i loro dati senza salvare nulla su file, in seguito tenterò di salvare tutto su un file tipo Archivio.dat.


PEr ora ho scritto questo... vedete un pò:



Private Sub Form_Load()

Public Type archivio

email As String
nome As String
password As String
dataregistrazione As String

datiutente As utente

Dim registrazioni() As archivio

End Type

Type utente

nome As String
cognome As String
indirizzo As String
città As String
via As String
telefono As String

End Type






End Sub



Purtroppo nonostante in teoria sembri tutto corretto, il programma genera l'errore "invalid inside procedure e si ferma" che fare per andare avanti???

mynos79
21-06-2006, 14:52
Private Sub Form_Load()

Public Type archivio

email As String
nome As String
password As String
dataregistrazione As String

datiutente As utente

Dim registrazioni() As archivio

End Type

Type utente

nome As String
cognome As String
indirizzo As String
città As String
via As String
telefono As String

End Type



End Sub

E' tutto errato ... perchè:
1) dichiari dei Type dentro un evento load al posto che nelle dichiarazioni o in un modulo
2) dichiari datiutente come utente quando devi ancora dichiarare quel tipo
3) dichiari registrazioni() come archivio da dentro il tipo archivio

Prova così:

Type utente
nome As String
cognome As String
indirizzo As String
città As String
via As String
telefono As String
End Type

Public Type archivio
email As String
nome As String
password As String
dataregistrazione As String

datiutente As utente
End Type

Private Sub Form_Load()
Dim registrazioni() As archivio
End Sub

oppure con le dichiarazioni dei 2 type in un modulo.

Spike79
21-06-2006, 14:56
Mah, con VB6 ho messo tutto in un module:

Public Type utente
nome As String
cognome As String
indirizzo As String
città As String
via As String
telefono As String
End Type

Public Type archivio
email As String
nome As String
password As String
dataregistrazione As String
datiutente As utente
End Type

e questo in un form:

Dim registrazioni() As archivio

e funzia tutto.
Con il tuo 'ordine' dava un errore di dichiarazione anticipata.

EDIT: appunto, mentre provavo, mi hai anticipato :D

mon--edited--romo
21-06-2006, 18:43
il codice è:
Public Type archivio
email As String
nomeaccount As String
nomeserver As String
password As String
dataregistrazione As String
nomeutente As String
cognomeutente As String
indirizzo As String
via As String
città As String
datanascita As String
codicefiscale As String
telefono As String
mailcollegata As String

End Type


ed in form load ho inserito l'istruzione:

Dim email() As archivio


ok.


ora dovrei, caricare il vettore, visualizzare, salvare sul file, leggere dal file, visualizzare ed eventualmente modificare i campi. Inoltre si pone il problema del dimensionamento dinamico del vettore. (non vorrei cancellare tutto ogni volta che inserisco o elimino un singolo record all'interno del vettore email)

mon--edited--romo
21-06-2006, 18:45
con l'istruzione:


dim dimensione as string

redim email (1 to dimensione)




Potrei andare incontro a questo genere di problemi??

wingman87
21-06-2006, 21:49
"dimensione" deve essere un numero, dichiaralo come integer.
E poi se fai il "redim" semplice ogni volta cancella tutto il contenuto del vettore, se vuoi conservarne il contenuto devi usare "redim preserve".

mon--edited--romo
22-06-2006, 00:13
Public Type indirizzi
email As String
nomeaccount As String
nomeserver As String
password As String
dataregistrazione As String
nomeutente As String
cognomeutente As String
indirizzo As String
via As String
città As String
datanascita As String
codicefiscale As String
telefono As String
mailcollegata As String

End Type

const max as integer = 500
dim email as indirizzi
dim archivio(1 to max) as indirizzi



più o meno dovrebbe essere così... domani vedrò di caricare gli indirizzi e di salvare tutto sul file archivio.dat.

mon--edited--romo
22-06-2006, 14:25
ok il programma inizia a prendere forma.


http://img223.imageshack.us/img223/4559/indirizzi6ka.png


le 13 text box a sinistra ricevono i dati di imput dei singoli indirizzi email, la label sulla destra, permette di scorrere gli indirizzi email da 1 a 500 visualizzando le informazioni oppure di visualizzare direttamente una posizione in particolare.


il codice fin'ora è:

Const max As Integer = 500
Dim archivio(1 To max) As indirizzi
Dim dimensione As Integer

Private Sub Command1_Click()
Call inserisci

End Sub






Private Sub inserisci()

dimensione = dimensione + 1
If dimensione <= max Then

With archivio(dimensione)

nomeaccount = Text1.Text
nomeserver = Text2.Text
password = Text3.Text
dataregistrazione = Text4.Text
nomeutente = Text5.Text
cognomeutente = Text6.Text
indirizzo = Text7.Text
via = Text8.Text
città = Text9.Text
datanascita = Text10.Text
codicefiscale = Text11.Text
telefono = Text12.Text
mailcollegata = Text13.Text

End With
End If


Call ripulisci

End Sub

Private Sub ripulisci()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Text6.Text = ""
Text7.Text = ""
Text8.Text = ""
Text9.Text = ""
Text10.Text = ""
Text11.Text = ""
Text12.Text = ""
Text13.Text = ""



End Sub

Private Sub Command2_Click()
Dim i As Integer
For i = 0 To 13
Debug.Print "text" & i & ".text ="
Next i


End Sub

Private Sub Form_Load()

End Sub



più una piccola aggiunta sul modulo (add module, come avete suggerito)


Public Type indirizzi
email As String
nomeaccount As String
nomeserver As String
password As String
dataregistrazione As String
nomeutente As String
cognomeutente As String
indirizzo As String
via As String
città As String
datanascita As String
codicefiscale As String
telefono As String
mailcollegata As String

End Type

Dim email As indirizzi




Che mi dite???


(starei prendendo in considerazione l'idea di visualizzare una piccola immagine per ogni indirizzo email, inoltre dovre utilizzare un database...??? insomma vedete anche qua... http://www.hwupgrade.it/forum/showthread.php?t=1226212 )



ok.

mynos79
22-06-2006, 14:57
Puoi tranquillamente usare un file di testo sequenziale, in cui ogni riga sarà un record contenente le varie informazioni separate ognuna da una virgola ... vb6 mette a disposizione alcuni comandi per la lettura di file sequenziali molto veloci e semplici, in poche righe si fa tutto (a differenza magari di un database in cui si deve fare la connessione, una query etc etc ... anche se nel tuo caso sarebbe ugualmente semplice); da tenere conto che poi un file di testo sequenziale in cui ogni campo è separato da una virgola, può essere facilmente importato in Excel che verrà trattato automaticamente in righe e colonne, senza nessuno smanettamento particolare.

Per aprire un file e leggerlo sequenzialmente, si può fare così:

dim var1, var2, var3, var4 as string
dim i as integer
i = 0

Open nomefile For Input As #1
Do While Not EOF(1)
Input #1, var1, var2, var3, var4
archivio(i).nomeaccount = var1
archivio(i).nomeserver = var2
' ...
i = 1 + 1
Loop
Close #1

è solo un esempio!!! cmq funzionante.
Il comando Input #1 var1, var2, var3, var4 non fa altro che prendere i vari pezzettini di riga separati da virgole e assegnarli alle 4 variabili var1 etc.
Poi sempre da dentro il ciclo "do while" puoi salvarti le variabili dove meglio credi, ad esempio facendo avanzare il contatore di archivio e memorizzando in esso tutte le righe.

Per scrivere invece in un file sequenziale (aggiungengo all' ultima riga) si fa semplicemente così:

Open nomefile For Append As #1
Print #1, variabile1; ","; variabile2; ","; variabile3
Close #1

Ovvero scrive una riga formata dalle 3 variabili separate dalle virgole.
E' bene, un consiglio mio, usare le variabili (in salvataggio) come stringhe tra virgolette; es:
variabile1 = chr(34) & "pippo" & chr(34)
variabile2 = chr(34) & "pluto" & chr(34)
variabile3 = chr(34) & "paperino e clarissa" & chr(34)
In modo che se apri il file col blocconote avrai la riga:
"pippo","pluto","paperino e clarissa"
così da non avere problemi in caso di spazi tra le stringhe; anche i numeri puoi salvarli tra virgolette, tanto li puoi dopo trattare come numeri con le solite funzioni val() etc etc ...

mon--edited--romo
22-06-2006, 18:07
ho quasi finito, ora il programmino riesce a :


Salvare 13 campi per ogni record su un file, per un massimo di 500 indirizzi email,
caricare il file già salvato, leggere un record di posizione indicata oppure visualizzare i dati di ogni indirizzo procedendo avanti o indietro a passi di 1.


Ora:
1)Potrei caricare il programmino sul web e rendere disponibile qui l'indirizzo, in modo che anche voi abbiate un sorgente ?

2) Piccoli problemi della visualizzazione avanti, ossia, dal primo in avanti il programma continua a procedere nonostante i record siano terminati e non riesco a trovare un "limite " come invece ho fatto per il bottone "indietro", pensavo al numero dell'ultimo record ossia della dimensione del file.. ma come fare per selezionarlo????


ecco il codice che non va:


Private Sub Avanti_Click()
Dim f As Integer

f = Text14.Text + 1
Text14.Text = f
Text14.Refresh

If f <= (qui dovrei indicare il valore corrispondente al numero dell'ultimo record del file... )Then

Call mostra(f)

Else

End If

End Sub


Quando invece si scorre a ritroso... funziona tutto a meraviglia...

Private Sub Indietro_Click()
Dim f As Integer
f = Text14.Text - 1
Text14.Text = f
Text14.Refresh
If f <= 0 Then
MsgBox (finito)
Text14.Text = 1
Else

Call mostra(f)
End If

End Sub




ok

mynos79
22-06-2006, 19:08
1)Potrei caricare il programmino sul web e rendere disponibile qui l'indirizzo, in modo che anche voi abbiate un sorgente ?
Certo ...

2) Piccoli problemi della visualizzazione avanti, ossia, dal primo in avanti il programma continua a procedere nonostante i record siano terminati e non riesco a trovare un "limite "



Beh, il limite lo puoi conoscere solo leggendo il file sequenziale ed incrementando un contatore nel ciclo di input:

dim contatore as integer
contatore = 0

Open nomefile For Input As #1
Do While Not EOF(1)
Input #1, var1, var2, var3, var4
contatore = contatore + 1
Loop
Close #1

La variabile contatore poi la puoi usare come limite ...

Piccolo appunto:

Private Sub Avanti_Click()
Dim f As Integer

f = Text14.Text + 1
Text14.Text = f
Text14.Refresh

If f <= (qui dovrei indicare il valore corrispondente al numero dell'ultimo record del file... )Then

Call mostra(f)

Else

End If

End Sub

Quell' Else in grassetto non serve e lo puoi togliere, se non usi la parte Else del ciclo.

mon--edited--romo
22-06-2006, 19:13
ora cerco un sito di file hosting ed inserisco qui il link dei sorgenti. ..


vedrai che la (i) che utilizzo come contatore all'interno di una private sub, non è (almeno così ho capito) "visibile" all'interno di altre sub sel programma, per questo dovre accedere in lettura da una public e riutilizzare poi il valore all'interno di tutto il programma.



ora arrivano i sorgenti.

mynos79
22-06-2006, 19:17
Dichiara la variabile i come globale ... magari in un modulo, vedrai che sarà leggibile e modificabile ovunque :p

mon--edited--romo
22-06-2006, 19:17
http://www.hostfiles.org/files/20060622072001_email.zip



ok ecco i sorgenti, trattandosi di un file.txt, preferisco almeno per ora, cancellare le registrazioni "manualmente" anche se appena avrò ottenuto una versione "riciclabile" mi occupero anche dei bottoni, Modifica ed Elimina, che per il momento ho escluso..

mynos79
22-06-2006, 19:25
Devo ancora provare il programma ma ti faccio ugualmente due appunti:

1) abituati ad usare i rientri per avere anche a vista d' occhio la struttura del programma e soprattutto impara ad usare anche nei passaggi più semplici i commenti

2) non ti consiglio di usare (sempre che non serva o sia necessario) dei percorsi di file assoluti ... falli relativi ... magari con l' utilizzo di app.path o selezionandoli con una commondialog (perchè se io non ho il volume c: il programma va in errore)

Ora guardo il programma ... che ci devo fare? :D

mynos79
22-06-2006, 19:37
Allora, è pieno di errori ... ma cmq, sbaglio o non funziona?
Open "c:\archivio.txt" For Append As #1
Print #1, nomeaccount; ","; nomeserver; ","; password; ","; dataregistrazione; ","; nomeutente; ","; cognomeutente; ","; indirizzo; ","; via; ","; città; ","; datadinascita; ","; codice; ","; fiscale; ","; telefono; ","; mailcollegata; ",";
Close #1La parte in grassetto finale non ci va (l' ultima variabile non deve essere seguita nè dal ; nè dal ","); mentre il ","; in mezzo si.
Altra cosa importante che ti consiglio vivamente di fare ... è di aggiungere a tutte le variabili che scrivi le virgolette (le puoi scrivere da codice usando chr(34)).

Es:

nomeaccount = chr(34) & nomeaccount & chr(34)
nomeserver = chr(34) & nomeserver & chr(34)
Print #1, nomeaccount; ","; nomeserver

In modo che nel file i dati siano così, es:
"pippo","pluto"
e non:
pippo,pluto

f = Text14.Text + 1
e
f = Text14.Text - 1Ti consiglio di fare un casting e trasformare la stringa in intero prima di fare i conti ... usa val() o cint() ...

MsgBox (finito)Il finito va tra virgolette essendo stringa, altrimenti msgbox non visualizza nulla: MsgBox ("finito")

mon--edited--romo
22-06-2006, 20:16
altrimenti che lo mettevo a fare..


tuttavia... al primo avvio è necessario

1) fare clic almeno una volta su "inserisci" in modo che venga creato il file archivio.txt.

e qui come dici tu, se uno non ha il c: si va in errore, per cui ora cercherò il codice che crei il file nella stessa directory dell'eseguibile.

2) quando si fa click su visualizza n^ è necessario che ci sia almeno un numero sulla text box adiacente.


(per cui forse dovrei invertire l'ordine della textbox e del bottone...)



Ora vado ad applicare il tutto.. ma un'ultima cosa..


se inserisco le virgolette, quando poi il prog ricarica i dati dal file... queste virgolette compaiono anche nelle text box???


ok,


(per associare un'immagine ad ogni indirizzo pensavo a due vettori paralleli...)

mynos79
22-06-2006, 20:25
Per avere il percorso della directory in cui è presente l' eseguibile del programma basta usare: app.path & "\nomefile.txt"

Per il discorso delle virgolette, quando carichi il valore nella variabile stringa, viene in automatico convertito a stringa in quanto trova le virgolette :D per quello ti ho consigliato sto trucchetto onde evitare problemi con spazi o altri caratteri particolare, ad esempio l' uso di virgole nella stringa che genera confusione al programma in quanto le virgole sono usate per separare le variabili.

La gestione delle immagini, puoi implementarla come vuoi ... visto che hai il file di testo sequenziale coi vari dati, perchè non usare un' ulteriore variabile che contiene il percorso dell' immagine? magari solo il percorso relativo a partire dalla dir dell' applicazione, così basta semplicemente aggiungerla ad app.path ..

mon--edited--romo
22-06-2006, 23:55
bene, ora il programmino funziona... perquanto sia ancora ristretto all'osso.


Ho aggiunto l'immagine per ogni file, come mi hai detto tu, non con due vettori paralleli ma semplicemente aggiungendo un campo a quelli che già c'erano...

qui ho trovato il primo errore (segnalato da un commento...) nel caso si commetta un errore digitando il nome del file, infatti il programma procede ma al momento di caricare il file si pianta tutto... dovrò quindi utilizzare una funzione predefinita tipo msgbox o inputbox per sfogliare le cartelle e selezionare manualmente il nome del file.


Ora il programmino va fino a 500 indirizzi. Il secondo errore stà nel fatto che nonostante sia riuscito ad agganciare il contatore al numero reale delle registrazioni presenti sul file...non sono ancora riuscito ad impedire che si vada oltre con il bottone avanti... (al momento non so perchè...).



Il prossimo passo sarà utilizzare delle funzioni come modifica, (dato che modificando i valori ed utilizzando il bottone inserisci si crea una nuova registrazione ed il contatore viene aggiornato, quindi dovrò aggiungere un'altro bottone..) elimina (dato che per ora ho preferito eliminare i campi manualmente dal file .txt). Inoltre vorrei poter (so che è facile e dovrei riuscirci in una mezzoretta...) generare una lista in html con un bottone apposito. Ovviamente per fare questo dovrò necessariamente conoscere la fine del file... altrimenti ogni volta sarà generato un file da 500 campi.


Beh.. dimmi che ti sembra... io ho già iniziato ad inserire 3 indirizzi (primo, secondo e terzo) e 3 immagini (yahoo, lycos e tiscali) almeno per verificare il funzionamento. (vi è poi un immagine standard nel caso il campo sia vuoto, tutte le immagini sono sulla stessa cartella del programma e del file txt)

http://www.hostfiles.org/files/20060622114837_email.zip


ok,

un ultima cosa, non ho inserito le virgolette.. poichè ho paura che poi vengano visualizzate sulle text box.

mynos79
23-06-2006, 10:20
Parto dal ri-chiarire alcune cose su questi file sequenziali ... il file lo puoi creare come vuoi tu (quindi con la struttura che preferisci) ... ma cerca però di dargli una struttura corretta. Ti spiego ...
Tu quando salvi nel file ottieni questa cosa qua:primo,,,,,,,,,,,,,tiscalimail.gif,secondo,,,,,,,,,,,,,lycos.jpg,terzo,,,,,,,,,,,,,yahoomail.gif,è un caso che il programma che hai fatto riesca a suddividerla in 3 parti (come dovrebbe essere) ed è anche poi difficile da esaminare (parlo ad occhio) e da mantenere e modificare ...
Io ti CONSIGLIO (prendilo come un ordine) di usare innanzitutto le virgolette (fidati che non si vedono nelle variabili in quanto il vb le considera come delimitatore di stringhe!!!!!) e di separare i record in righe (ogni riga un record!!!) ... ultima cosa che ti avevo già segnalato in un post precedente, alla fine l' ultimo campo del record non deve finire con una virgola!!!!

Il file che dovresti ottenere è questo:"primo","","","","","","","","","","","","","tiscalimail.gif"
"secondo","","","","","","","","","","","","","lycos.jpg"
"terzo","","","","","","","","","","","","","yahoomail.gif"Il problema sta nella sub Inserisci in cui hai scritto questo codice errato (come ti avevo già segnalato in precedenza):Open App.Path & "\archivio.txt" For Append As #1
Print #1, nomeaccount; ","; nomeserver; ","; password; ","; dataregistrazione; ","; nomeutente; ","; cognomeutente; ","; indirizzo; ","; via; ","; città; ","; datadinascita; ","; codice; fiscale; ","; telefono; ","; mailcollegata; ","; immagine; ",";
Close #1","; non ci va!! questa virgola finale è la causa che non ti suddivide le righe in quanto il vb pensa che ci siano altre variabili campo da inserire nello stesso record.
Per risolvere poi il 1° problema delle virgolette ... quando assegni alle variabili le stringhe delle textbox, aggiungici prima e dopo le virgolette tramite il carattere ascii 34: miavariabile = chr(34) & textbox.text & chr(34) o qualcosa di simile in base a come assegni.

##############################

Per quanto riguarda invece l' inserimento del file immagine, ti consiglio di aggiungere alla tua maschera un pulsante sfoglia così uno può cercare comodamente l' immagine senza dover scrivere a mano il percorso (e niente inputbox!!!!!!!!!) ... per fare questo si usano le CommonDialog ...
Come si fa? devi innanzitutto aggiungere il componente "Microsoft Common Dialog Control" facendo tasto destro sulla casella degli strumenti, cliccare su "Componenti" e cercare nella lista il componente che di ho detto.
Ora te lo ritrovi nella casella degli strumenti, facci un doppio-click così da inserirlo nel form (non lo puoi modificare esteticamente in quanto è un controllo invisibile che funziona solo in esecuzione).
Che fa sto CommonDialog? è il componente di Windows che gestisce tutte le finestre di dialogo (Apri, Salva, Caratteri, Colori, ...).
Come si usa?
All' interno del pulsante che aprirà la finestra di dialogo inserisci questo codice:CommonDialog1.ShowOpen

textbox.text = CommonDialog1.FileNameQuesto non fa altro che aprire la finestra di dialogo "Apri" e assegnare alla textbox (che cambiera nome) il percorso completo del file (puoi quando vai a salvarlo devi togliere le varie directory per usare app.path, o quello che devi fare).
Questo codice però non ha la gestione degli errori in caso il file non fosse disponibile (impegnato da un altro programma) e gli mancano delle proprietà che permettono di visualizzare solo alcuni formati di file, di nascondere i file nascosti, etc etc ... ecco il codice rivisitato e migliorato per il tuo caso:CommonDialog1.CancelError = True
On Error GoTo ErrHandler
CommonDialog1.Flags = cdlOFNHideReadOnly
CommonDialog1.Filter = "Tutti i file (*.*)|*.*|Immagine JPG (*.jpg)|*.jpg|Immagine GIF (*.gif)|*.gif|Immagine BMP (*.bmp)|*.bmp"
CommonDialog1.FilterIndex = 2
CommonDialog1.ShowOpen

textbox.text = CommonDialog1.FileName

ErrHandler:
Exit SubLa proprietà filter indica quali formati filtrare; la proprietà filterindex serve a impostare il formato predefinito (il 2°: jpg).

####################################

Detto questo ... riguardo il codice perchè non ricordo più cosa dovevo dirti :D :sofico:

mynos79
23-06-2006, 10:52
qui ho trovato il primo errore (segnalato da un commento...) nel caso si commetta un errore digitando il nome del file, infatti il programma procede ma al momento di caricare il file si pianta tutto... dovrò quindi utilizzare una funzione predefinita tipo msgbox o inputbox per sfogliare le cartelle e selezionare manualmente il nome del file.Ti ho risposto prima con la CommonDialog ... invece nel caso il file non esistesse più ed il programma tenta di caricare l' immagine, puoi usare le gestione degli errori come:on error goto etichettaCheVuoiTu
..... codice in cui tenti di aprire l' immagine
.....
etichettaCheVuoiTu:
..... istruzioni da compiere in caso di errore

Il secondo errore stà nel fatto che nonostante sia riuscito ad agganciare il contatore al numero reale delle registrazioni presenti sul file...non sono ancora riuscito ad impedire che si vada oltre con il bottone avanti... (al momento non so perchè...).Forse perchè in verità non l' hai fatto?
Innanzitutto nella sub Scrivi togli la dichiarazione delle variabili in quanto la dichiarazioni delle variabili è meglio se le fai nelle dichiarazioni generali (ovvero in alto nella pagina del codice, prima di qualsiasi altra sub, function ... proprio le prime righe del codice vengono considerate dichiarazioni generali) anche perchè altrimenti ogni volta che richiami la funzione "scrivi" ridichiari le variabili sovrascrivendole (e non serve) ... (come altro errore, non serve fare il refresh delle textbox visto che poco prima avevi assegnato una stringa, si aggiornano da sole ;)).
Tornando al contatore, dichiari una variabile generale "contatore" (oppure la dichiari nel pulsante "avanti"), fai leggere tutto il file senza usare le variabili ma solamente incrementando il contatore (nel pulsante "avanti"):
contatore = 0
Open App.Path & "\archivio.txt" For Input As #1
Do While Not EOF(1)
Input #1, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var15
contatore = contatore + 1
Loop
Close #1Ora puoi usare la variabile contatore:If f <= contatore Then
Call mostra(f)
Else: MsgBox ("Finito!")
End IfTu invece avevi fatto un errore:If f Then

Call mostra(f)
Else: MsgBox ("Finito!")
End Ifquello che hai scritto significa "se F è vero allora" ma f è sempre vero! dovevi scrivere una condizione migliore :D

mynos79
23-06-2006, 12:17
Allora, c'erano molti altri errori di distrazione ...
Ti allego il file rar contenente il tuo programma con le seguenti modifiche:
- corretto il codice da alcuni errori sintattici e di distrazione
- spostato le dichiarazioni in alto e cancellato quelle che non servivano
- sistemato il problema del pulsante avanti (ora si ferma giusto)
- sistemata la scrittura nel file (con virgolette, virgole e a capi al punto giusto)
- aggiunto il pulsante sfoglia con relativa CommonDialog (ora puoi selezionare una immagine presente in una qualsiasi directory, questa immagine verrà copiata nella dir del programma se non presente, così da essere sempre disponibile)

www.mynos.com/varie/email.rar (http://www.mynos.com/varie/email.rar)

Guarda per bene il codice; se ci sono alcune cose che non sai chiedi pure ...
Ma fai attenzione a come ho modificato il codice ... nel senso ad esempio che ti ho cambiato la funzione mostra, da function a sub (la function usala solo se la funzione stessa restituisce un valore, altrimenti usa la sub!); poi non serve dichiarare in ogni routine la variabile f ... dichiarala solo una volta nelle dichiarazioni generali ...
Usa i commenti ... usa i rientri per organizzare il codice ... altrimenti ti perdi ...
Se una riga di codice diventa troppo lunga e sfora lo schermo, suddividila in più parti usando il carattere _ ... es:Open App.Path & "\archivio.txt" For Append As #1
Print #1, nomeaccount; ","; nomeserver; ","; password; ","; dataregistrazione; ","; nomeutente; ","; cognomeutente; ","; indirizzo; ","; via; ","; città; ","; datanascita; ","; codicefiscale; ","; telefono; ","; mailcollegata; ","; immagine;
Close #1

trasformalo così:

Open App.Path & "\archivio.txt" For Append As #1
Print #1, nomeaccount; ","; nomeserver; ","; password; ","; dataregistrazione; ","; nomeutente; ","; _
cognomeutente; ","; indirizzo; ","; via; ","; città; ","; datanascita; ","; codicefiscale; ","; telefono; ","; _
mailcollegata; ","; immagine;
Close #1

E attento agli errori di distrazione ... ovvero dichiari le variabili come datanascita e poi usi datadinascita che non è stata dichiarata.

mon--edited--romo
23-06-2006, 15:29
ho rivisto tutto il codice, devo dire che alcune funzioni non le conoscevo, per esempio (UBound(nomefile))) qui:


Text15.Text = nomefile(UBound(nomefile))


ma anche questa istruzione qua:

ErrHandler:


insomma, al momento ho visto che il programmino funziona abbastanza bene, la cosa importante almeno per il momento è che non sovrascriva i record o li modifichi senza preavviso.

Per ora proverò ad utilizzarlo così, poi man mano che inserirò nuove funzioni, riporterò il codice qui.



ok,

mynos79
23-06-2006, 15:51
Ubound(array) è una funzione che restituisce l' ultimo indice dell' array; quindi se l' array ha 9 elementi, i suoi indici sono 0, 1, 2, 3, 4, 5, 6, 7, 8 ... ubound restituisce 8 (di solito si usa per avere accesso dinamico all' ultimo elemento, senza sapere quanti elementi ci sono).

Split(stringa, delimitatore) è una funzione che divide la stringa in pezzi separati dal delimitatore e assegna tutti i pezzi ad un array di stringa ...
Ad esempio:dim stringa as string
dim arraystringa() as string

stringa = "ciao come ti chiami?"
arrayStringa = split(stringa, " ")l' array conterrà:
arrayStringa(0) = "ciao"
arrayStringa(1) = "come"
arrayStringa(2) = "ti"
arrayStringa(3) = "chiami?"

mentreUbound(arrayStringa)restituisce 3.

ErrHandler: che dici tu è semplicemente una etichetta ... di solito si usano con la gestione degli errori:
on error goto GestioneErrori
..... ' prova a fare qualcosa altrimenti se scatta l' errore salta alla riga etichettata GestioneErrori

GestioneErrori:
...' se è scattato l' errore viene eseguito questo codiceLe etichette sono normali nomi seguiti dai due punti :

Ho chiamato ErrHandler in quanto in inglese significa maniglia dell' errore, su molti esempi si trovano nomi del genere ed ormai mi sono abituato ad usarli.

#############

Funziona abbastanza bene ... diciamo che almeno ora funziona :ciapet:


PS. Comunque, non è per criticare, ma ti consiglio di studiarti prima un po la sintassi ed i comandi vb, prima di cimentarti in software vari ... altrimenti anche per cose semplici, non conoscendo i costrutti o i comandi, non ne vieni fuori.

mon--edited--romo
23-06-2006, 16:21
Funziona abbastanza bene ... diciamo che almeno ora funziona


PS. Comunque, non è per criticare, ma ti consiglio di studiarti prima un po la sintassi ed i comandi vb, prima di cimentarti in software vari ... altrimenti anche per cose semplici, non conoscendo i costrutti o i comandi, non ne vieni fuori.




Hai perfettamente ragione, anche se, ti dirò mi è stato particolarmente difficile, studiare quel pò che ho studiato, forse a causa del libro che non è un gran chè... pensa solo che le strutture di dati costituiscono un intero capitolo ben suddiviso in paragrafi "lacunosi" mentre per le operazioni sui file si deve ricercare un'altro capitolo in cui però non si trova traccia dell'applicazione delle strutture di file, viste in precedenza ai file... :muro:

Così ho preferito buttar giù un programmino per vedere di capirci qualcosa.



Vabbè...

ok,

mynos79
23-06-2006, 16:29
Purtroppo lo so ... un buon manuale vuol dire tanto ...

Cmq, prova ad aggiungere la funzione per rimuovere un record o per la modifica ... vedrai che non è difficile, basta solo usare bene il contatore dei record nel file.

Certo, un database sarebbe stato più comodo a sto punto, ma avresti dovuto impararti l' sql per le qyery, come creare la connessione al database, etc etc ...

Se hai altri problemi, fischia ...