Oppure

Loading
27/08/11 16:07
Mic
Allora, vi spiego. Ho una listbox con degli elementi, e vorrei eliminare questi elementi tramite una voce di menù chiamata elimina. Questa apre un InputBox in cui scrivere il nome dell'elemento della listbox che si vuole eliminare, il programma trova l'elemento, lo elimina sia dalla listbox, sia dal vettore (la listbox è composta da elementi in un vettore) e sia da un file .txt che è adibito a salvare gli elementi del vettore quando il programma si chiude.

Il mio codice è questo:

Private Sub mnuRimuovi_Click()
Rimuovere = InputBox("Inserisci il nome dell'elemento da rimuovere", "Elimina Elemento")
For I = 1 To N
If Rimuovere = V(I) Then
    V(I) = ""
    J = I
    Do While J < N
        V(J) = V(J + 1)
        J = J + 1
    Loop
    N = N - 1
    ReDim Preserve V(N)
Else
    MsgBox "L'elemento non è stato trovato."
End If
Next
For I = 1 To N
lst1.Clear
lst1.AddItem V(I)
Next
End Sub


(probabilmente l'indentazione farà schifo, non ho mai imparato a farla).

Solo che non funziona: pur scrivendo esattamente il nome dell'elemento mi dice "L'elemento non è stato trovato", e pur cliccando su Ok continua a uscire quella MsgBox fin quando premendo sempre Ok non elimina tutti gli elementi tranne uno o da errore di indice non trovato. :-| Come vedete non ho fatto in modo che si eliminassero anche dalla textbox perchè lì non ho la minima idea di come si faccia... potete aiutarmi? :hail:

EDIT: Ho capito perchè mi elimina gli ultimi due elementi, il lst1.clear va fuori dal ciclo naturalmente, però continua a dirmi elemento non trovato...
Ultima modifica effettuata da Mic 27/08/11 16:11
aaa
28/08/11 8:36
Mic
Ok, ho scoperto perchè diceva sempre "elemento non trovato". È ovvio si trovava nel ciclo! Però ora quando scrivo l'elemento nell'inputbox mi da un errore "indice non compreso nell'intervallo" e alla funzione di debug esce in giallo
If Rimuovere = V(I) Then. Tenendo il mouse sulla I esce I = 3, ovvero il massimo (gli elementi sono 3). Cosa può essere? Vi posto il codice che ho cambiato.

Private Sub mnuRimuovi_Click()
X = 0
Rimuovere = InputBox("Inserisci il nome dell'elemento da rimuovere", "Elimina Link")
For I = 1 To N
If Rimuovere = V(I) Then
    X = 1
    V(I) = ""
    J = I
    Do While J < N
        V(J) = V(J + 1)
        J = J + 1
    Loop
    N = N - 1
    ReDim Preserve V(N)
End If
Next
If X = 0 Then
    MsgBox "L'elemento non è stato trovato."
End If
For I = 1 To N
lst1.Clear
lst1.AddItem V(I)
Next
End Sub
Ultima modifica effettuata da Mic 28/08/11 8:36
aaa
28/08/11 10:43
Ultimo
I vettori o Array partono da 0

    Private Sub mnuRimuovi_Click()
    X = 0
    Rimuovere = InputBox("Inserisci il nome dell'elemento da rimuovere", "Elimina Link")
    For I = 0 To N
    If Rimuovere = V(I) Then
        X = 1
        V(I) = ""
        J = I
        Do While J < N
            V(J) = V(J + 1)
            J = J + 1
        Loop
        N = N - 1
        ReDim Preserve V(N)
    End If
    Next
    If X = 0 Then
        MsgBox "L'elemento non è stato trovato."
else
 lst1.Clear
   For I = 0 To N
    lst1.AddItem V(I)
    Next 
 End If
   
    End Sub
Ultima modifica effettuata da Ultimo 28/08/11 10:58
If ok Then GOTO Avanza else GOTO Inizia

28/08/11 13:55
Mic
Questo non lo sapevo, ho sempre lavorato con For I = 1... ed è forse perchè i vettori li carico sempre con un ciclo For I = 1 non mi son mai trovato male. Fattostà che il problema non si risolve, da sempre errore di indice non compreso nell'intervallo... passando con il mouse sopra mi da I = 3 (che è il numero degli elementi) mentre N = 2 quando dovrebbe essere 3... i vettori li carico al form load tramite un file di testo, vi faccio vedere il codice del caricamento:

Private Sub Form_Load()
Open "C:\Resto del percorso\file.txt" For Input As 1
    N = 0
    Do
    Input #1, Testo
    N = N + 1
    ReDim Preserve V(N)
    V(N) = Testo
    lst1.AddItem V(N)
    Loop Until EOF(1) = True
    Close
End Sub


EDIT: Inoltre non capisco quell'else dopo la MsgBox... se rimuovere = V(I) Then... altrimenti cancella la lista?
Ultima modifica effettuata da Mic 28/08/11 13:59
aaa
28/08/11 17:06
Mic
Dunque, per quanto riguarda il vettore e la lista è ok. Il codice è quasi perfetto, visto che mi ha dato errore solo una volta e non sono riuscito a riprodurlo una seconda volta. Il problema era che una volta trovato l'elemento e quindi una volta ridotto il vettore (N = N-1) il ciclo continuava e I diventava > N. Così esco dal ciclo con una cosa tipo I = N +1

Codice (non so, magari qualcuno che ha avuto il mio stesso problema può trovarlo utile).

Private Sub mnuRimuovi_Click()
X = 0
Rimuovere = InputBox("Inserisci il nome dell'elemento da rimuovere", "Elimina Link")
For I = 1 To N
If Rimuovere = V(I) Then
    X = 1
    V(I) = ""
    J = I
    Do While J < N
        V(J) = V(J + 1)
        J = J + 1
    Loop
    N = N - 1
    I = N + 1
    ReDim Preserve V(N)
End If
Next
If X = 0 Then
    MsgBox "L'elemento non è stato trovato."
End If
lst1.Clear
For I = 1 To N
lst1.AddItem V(I)
Next
End Sub


Il problema ora è eliminare l'elemento cercato dal file .txt adibita a salvare gli elementi del vettore, e su questo non ho la più pallida idea di come possa fare, mi aiutate? :hail:
Ultima modifica effettuata da Mic 28/08/11 17:08
aaa
30/08/11 9:39
Mic
Ok ho risolto da solo. In pratica ho fatto in modo che il contenuto del primo file si copiasse in un altro file tranne la riga che mi interessava, poi ho eliminato il primo file e rinominato il secondo come il primo file. Non era poi così difficile in effetti, bastava ragionarci un po'. Fornisco il codice per chi magari cercando su Google oppure con la funzione cerca di questo stesso forum si è trovato nella mia stessa situazione e non sa come fare (molti disapprovano i codici già scritti ma tanto devono sempre adattarseli alle loro esigenze).

Private Sub mnuRimuovi_Click()
'Eliminazione elemento da vettore e listbox
X = 0
Rimuovere = InputBox("Inserisci il nome dell'elemento da rimuovere", "Elimina Elemento")
For I = 1 To N
If Rimuovere = V(I) Then
    X = 1
    V(I) = ""
    J = I
    Do While J < N
        V(J) = V(J + 1)
        J = J + 1
    Loop
    N = N - 1
    I = N + 1
    ReDim Preserve V(N)
End If
Next
If X = 0 Then
    MsgBox "L'elemento non è stato trovato."
End If
lst1.Clear
For I = 1 To N
lst1.AddItem V(I)
Next
'Eliminazione elemento da file txt
I = 0
Open "C:\Miopercorso\File.txt" For Input As 1
Open "C:\Miopercorso\File2.txt" For Output As 2
Do
Input #1, Elemento
If Elemento <> Rimuovere Then
Print #2, Elemento
End If
Loop Until EOF(1) = True
Close
Kill ("C:\Miopercorso\File.txt")
Name "C:\Miopercorso\File2.txt" As "C:\Miopercorso\File.txt"
Close
End Sub
Ultima modifica effettuata da Mic 30/08/11 9:41
aaa