PDA

Visualizza versione completa : [VB6] Errore nel caricamento dati


Jamester
11-05-2008, 03.43.56
Visto che attualmente sono le 03:31 immagino debba dire buongiorno a tutti ;)

a..."grande richiesta" ecco un altra domanda che suppongo sia molto + semplice dell'altra di qualche ora fa:

Ci sono 2 funzioni nel mio programma: una di salvataggio e una di caricamento. Il salvataggio viene fatto prendendo tt i dati di tutte le textbox e vengono salvati uno sotto l'altro in un comunissimo file txt. Ora il problema si presenta durante il caricamento: il terzo valore nel file e' decimale apparendo cosi:


685
30
155,52


Come codice di caricamento (che dovrebbe riportare i valori salvati in precedenza nelle medesime posizioni) c'e' questo:


Text4.Text = ""
Text9.Text = ""
Text11.Text = ""


che servirebbe ad azzerare i precedenti valori rimasti nelle textbox per evitare concatenamenti. Il secondo blocco di istruzioni che poi e' probabilmente imperfetto e' questo:


Open App.Path & "\testo.txt" For Input As 1
Do
Input #1, linea
Text4.Text = Text4 & linea
Input #1, linea
Text9.Text = Text9 & linea
Input #1, linea
Text11.Text = Text11 & linea


Ora succede che il parametro decimale viene diviso in 2 e la parte prima della virgola va normalmente al terzo textbox a il 52 va nel quarto scombinando l'ordine dei textbox di uno (per la cronaca i textbox saranno una 40ina)

Ora la mia richiesta e' la seguente:

- Arrotondare i valori delle textbox qualora si verifichi che il risultato sia decimale quindi da 155.52 venga arrotondato a 156

- Oppure scrivere 155.52 tutto nella stessa textbox (sarebbe preferibile la prima opzione e la seconda magari per capire come si fa).

Ringrazio anticipatamente :)

UG0_BOSS
11-05-2008, 11.28.53
Prova a utilizzare come istruzione la Line Input al posto della Input:
Line Input #1, linea

Che dovrebbe prendere in input tutta la linea fino al byte di ritorno a capo :)

LoryOne
11-05-2008, 11.46.06
Buongiorno, dormito bene ? :D
Se vuoi un consiglio, quando torni dalla disco vai a dormire e non accendere il PC !

Tornando in topic, ci sarebbero parecchie cose da dire.

Prima di tutto, considerato che avrai bisogno di numerosi textbox, ti converrà utilizzare le matrici di controlli perchè ti sarà più facile gestire gli eventi comuni ad essi associati e scriverai sicuramente meno codice, ottimizzando il tutto con poche righe.
Per creare una matrice di controlli, devi inserire il primo textbox sul form e poi effettuare un copia-incolla. VB ti chiederà se considerare l'oggetto incollato come matrice monodimensionale. Una matrice monodimensionale è un insieme di oggetti dello stesso tipo identificati da un solo indice numerico.

Nel tuo caso, quando avrai inserito tutti i textbox di cui necessiti, avrai n textbox identificati con textbox(0), textbox(1), textbox(2), ,... textbox(n)
Noterai che anche gli eventi associati ad ogni textbox avranno un identificativo numerico (index) tra i parametri associati all'evento stesso, in modo che tu possa scrivere codice relativo all'elemento(index) di elemento(n).

Dai un'occhiata non solo ad input #, ma anche all' istruzione line input # (come ti è stato suggerito), cercando di capire quali siano le differenze nell' utilizzo delle due istruzioni. Per quanto riguarda l'arrotondamento, esistono funzioni di conversione del tipo di dato, ad esempio int.

Un ultimo consiglio che è indipendente dal linguaggio che utilizzi, è quello di non partire in quarta, ma di dotarsi di parecchia pazienza, magari scrivendo il codice strettamente necessario a comprendere il funzionamento di un'unica istruzione, cambiando i parametri di input e leggendo l'errore che il compilatore ti restituisce quando il parametro non obbedisce alle regole di compilazione adottate.

Jamester
11-05-2008, 13.28.38
Buongiorno, dormito bene ? :D
Se vuoi un consiglio, quando torni dalla disco vai a dormire e non accendere il PC !

Tornando in topic, ci sarebbero parecchie cose da dire.

Prima di tutto, considerato che avrai bisogno di numerosi textbox, ti converrà utilizzare le matrici di controlli perchè ti sarà più facile gestire gli eventi comuni ad essi associati e scriverai sicuramente meno codice, ottimizzando il tutto con poche righe.
Per creare una matrice di controlli, devi inserire il primo textbox sul form e poi effettuare un copia-incolla. VB ti chiederà se considerare l'oggetto incollato come matrice monodimensionale. Una matrice monodimensionale è un insieme di oggetti dello stesso tipo identificati da un solo indice numerico.

Nel tuo caso, quando avrai inserito tutti i textbox di cui necessiti, avrai n textbox identificati con textbox(0), textbox(1), textbox(2), ,... textbox(n)
Noterai che anche gli eventi associati ad ogni textbox avranno un identificativo numerico (index) tra i parametri associati all'evento stesso, in modo che tu possa scrivere codice relativo all'elemento(index) di elemento(n).

Dai un'occhiata non solo ad input #, ma anche all' istruzione line input # (come ti è stato suggerito), cercando di capire quali siano le differenze nell' utilizzo delle due istruzioni. Per quanto riguarda l'arrotondamento, esistono funzioni di conversione del tipo di dato, ad esempio int.

Un ultimo consiglio che è indipendente dal linguaggio che utilizzi, è quello di non partire in quarta, ma di dotarsi di parecchia pazienza, magari scrivendo il codice strettamente necessario a comprendere il funzionamento di un'unica istruzione, cambiando i parametri di input e leggendo l'errore che il compilatore ti restituisce quando il parametro non obbedisce alle regole di compilazione adottate.

L'unico errore che mi da e' INPUT OLTRE LA LINEA DEL FILE che appunto vuol dire che mette i valori oltre il numero massimo di textbox e cmq ho visto abbastanza chiaramente cosa succede. Quanto alle MSDN, io nn le ho installate in quanto i cd corrispondenti erano danneggiati quindi nn posso avvalermi delle guide interne...

Quanto alla matrice di controlli, e' quello che ho fatto solo che i numeri delle textbox sono un po' sballati e il codice ora e' fissato cosi quindi nn mi conviene ora rimettere gli indici in ordine cmq grazie per il suggerimento.

Per quanto riguarda la funzione INT, potresti farmi un esempio pratico ? Suppongo che questa funzione vada messa da qualche parte prima che io faccia SALVA DATI cosi nel file viene gia salvato intero e cn il successivo carica dati nn mi darà problemi :)

LoryOne
11-05-2008, 15.37.29
Prendo spunto da uno script trovato in rete che ben si adatta alle tue esigenze:

Public Sub DumpFile_V01(ByVal FileName As String)
Dim FileNo As Long
Dim LineNo As Long
Dim LineText As String

FileNo = FreeFile ' Get next available file number.

Open FileName For Input Access Read Shared As #FileNo
Do Until EOF(FileNo) ' Repeat until end of file...
Line Input #FileNo, LineText ' Read a line from the file.
LineNo = LineNo + 1
Debug.Print Format(LineNo, "00000"); ": "; LineText
DoEvents ' Allow Windows to handle other tasks.
Loop
Close #FileNo
End Sub


Noterai un Do Until EOF(FileNo) ... Loop, spesso sostituito da un While Not EOF(FileNo) ... Wend
Di particolare rilevanza è l' istruzione EOF(FileNo) perchè indica la fine del file letto: Tutte le istruzioni contenute all'interno del Do Until EOF(FileNo) ... Loop, verranno eseguite fino a quando non verrà raggiunta la fine del file in lettura.
Poichè hai utilizzato le matrici di controlli, quel LineNo = LineNo + 1 all'interno del ciclo Do Until ... Loop ti fornirà l'indice relativo al controllo textbox di cui vorrai modificare il testo.

Per quanto riguarda Int, l'unica cosa da dire è che è un'istruzione che trasforma in intero un valore es:

Dim S As string
Dim I As Integer

S = "156,56"
I = Int( Val( S))


Ps: Non mi riferivo alle MSDN, bensì all'aiuto in linea che puoi consultare all' interno dell' ambiente di sviluppo.

Jamester
11-05-2008, 15.51.36
Dim S As string
Dim I As Integer

S = "156,56"
I = Int( Val( S))


Quanto a questo pezzo, non mi e' molto chiaro in quanto:

La prima riga definisce la variabile S come stringa, la seconda la variabile I come un numero intero. Ora la terza riga S da un numero che poi sarebbe un esempio decimale ma il numero in questione e' contenuto nella text11 (nel mio caso) quindi suppongo vada messo S = text11.text. Ora la 4a riga nn l'ho ben capita: Dice che il parametro I è uguale al numero intero del valore S. Ora quando vado a salvare, cosa dovrei dirgli di stampare? S ?


Private Sub salva_Click()

On Error GoTo fine
Open App.Path & "\testo.txt" For Output As #1

Dim S As String
Dim I As Integer

S = Text11.Text
I = Int(Val(S))

Print #1, Text4.Text
Print #1, Text9.Text
Print #1, I


Io ho fatto cosi ma il valore viene messo a 155 e nn 156 come per arrotondamento inoltre ai lati del 155 vengono messi 2 spazi 1 a dx e uno a sx. Dove sbaglio?

LoryOne
11-05-2008, 16.58.50
"Io ho fatto cosi ma il valore viene messo a 155 e nn 156 come per arrotondamento inoltre ai lati del 155 vengono messi 2 spazi 1 a dx e uno a sx. Dove sbaglio?"

Ha ha haaaa :D
Prova a vedere cosa succede con Int, CInt e Fix
Poi guarda cosa cambia se al posto della virgola metti un punto.

Jamester
11-05-2008, 17.03.07
"Io ho fatto cosi ma il valore viene messo a 155 e nn 156 come per arrotondamento inoltre ai lati del 155 vengono messi 2 spazi 1 a dx e uno a sx. Dove sbaglio?"

Ha ha haaaa :D
Prova a vedere cosa succede con Int, CInt e Fix
Poi guarda cosa cambia se al posto della virgola metti un punto.

Ho messo le altre 2 alternative a


I = Int(Val(S)) cn CINT e FIX


ma nn cambia nulla

:mm:

LoryOne
11-05-2008, 18.29.36
Poi guarda cosa cambia se al posto della virgola metti un punto.

Toglimi una curiosità: VB6 ha l'istruzione Ceil ?

Jamester
11-05-2008, 18.34.15
Poi guarda cosa cambia se al posto della virgola metti un punto.

Toglimi una curiosità: VB6 ha l'istruzione Ceil ?

1) Cioe' ? esempio pratico

2) Boh !

LoryOne
11-05-2008, 18.35.48
Intendo dire con "punto al posto della virgola" associare al punto la funzione di separatore decimale.
Cambia qualcosa se alla stringa s associ "156,5" oppure "156.5" ?

LoryOne
11-05-2008, 18.38.16
2) Boh !

Come boh :eek: :eek: :D
Tu c'ha dda vedè se VB6 'tte dice che ceil nun esisteeeee :D

Jamester
11-05-2008, 18.41.52
Cambia qualcosa se alla stringa s associ "156,5" oppure "156.5" ?

la stringa nn e' + come l'hai scritta te xche il numero viene generato e nn e' fisso quindi ora la stringa e' cosi


S = Text11.Text


quindi la tua domanda nn e' valida

LoryOne
11-05-2008, 18.49.37
La mia domanda è sempre valida, anche se cambia la stringa di testo nel textbox.
Dammi retta per un attimo.
Lascia perdere il tuo programmino e creane un altro semplice, semplice.

Inserisci una textbox, tre label ed un pulsante.
Alla pressione del pulsante,
la label1 deve restituire:
int(val(text1))
la label2 deve restituire:
cint(val(text1))
la label3 deve restituire
fix(val(text1))

La prima volta in text1 inserisci 156,5 e premi il pulsante
La seconda volta in text1 inserisci 156.5 e premi il pulsante.

Jamester
11-05-2008, 18.50.43
La mia domanda è sempre valida, anche se cambia la stringa di testo nel textbox.

Allora nn capisco dove dovrei mettere questa virgola o punto che sia visto che nn c'e' + alcuna stringa numerica nel codice