|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
Gestire un elenco di indirizzi vb
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??? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
Codice:
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 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ì: Codice:
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
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2004
Città: Provincia di Monza e Brianza
Messaggi: 6267
|
Mah, con VB6 ho messo tutto in un module:
Codice:
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 Codice:
Dim registrazioni() As archivio Con il tuo 'ordine' dava un errore di dichiarazione anticipata. EDIT: appunto, mentre provavo, mi hai anticipato
__________________
AMD Ryzen 5 7600X - Dissipatore Thermalright Assassin King 120SE - RAM Kingston Fury Beast 2x16Gb DDR5 CL30 @ 6000 - Motherboard ASROCK B650 Pro RS - NVME Kingston KC3000 2Tb - PSU FSP Hydro PRO 600w - Win 11 PRO |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
si, ora ho utilizzato un unico record
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) |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
con
con l'istruzione:
dim dimensione as string redim email (1 to dimensione) Potrei andare incontro a questo genere di problemi?? |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
"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". |
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok
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. |
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok il programma inizia a prendere forma.
http://img223.imageshack.us/img223/4...dirizzi6ka.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. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
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ì: Codice:
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
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ì: Codice:
Open nomefile For Append As #1 Print #1, variabile1; ","; variabile2; ","; variabile3 Close #1 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 ...
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok,
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 |
|
|
|
|
|
#11 | |||
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
Quote:
Quote:
Beh, il limite lo puoi conoscere solo leggendo il file sequenziale ed incrementando un contatore nel ciclo di input: Codice:
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
Piccolo appunto: Quote:
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|||
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok,
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. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
Dichiara la variabile i come globale ... magari in un modulo, vedrai che sarà leggibile e modificabile ovunque
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok
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.. Ultima modifica di monocromo : 22-06-2006 alle 19:21. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
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?
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|
|
|
|
|
#16 | |||
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
Allora, è pieno di errori ... ma cmq, sbaglio o non funziona?
Quote:
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 Quote:
Quote:
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|||
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ma, funzionare.. funziona
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...) |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
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 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 ..
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Jul 2005
Messaggi: 261
|
ok,
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. |
|
|
|
|
|
#20 | |||
|
Senior Member
Iscritto dal: Jun 2005
Città: Mestre (VE)
Messaggi: 1415
|
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: Codice:
primo,,,,,,,,,,,,,tiscalimail.gif,secondo,,,,,,,,,,,,,lycos.jpg,terzo,,,,,,,,,,,,,yahoomail.gif, 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: Codice:
"primo","","","","","","","","","","","","","tiscalimail.gif" "secondo","","","","","","","","","","","","","lycos.jpg" "terzo","","","","","","","","","","","","","yahoomail.gif" Quote:
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: Codice:
miavariabile = chr(34) & textbox.text & chr(34) ############################## 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: Quote:
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: Quote:
#################################### Detto questo ... riguardo il codice perchè non ricordo più cosa dovevo dirti
__________________
IN WIN 909 / AMD Ryzen 9 3950X / Gigabyte X570 Aorus Xtreme / 4x8gb G.Skill 3200 / Gigabyte Aorus RTX2080Ti Xterme / 2x Gigabyte Aorus NVMe M.2 1Tb / Corsair AX1200i / full liquid EK - Bitspower / circa 160 trattative nel mercatino |
|||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:07.



















