Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580

    [vb.net] come non utilizzare il GoTo

    salve a tutti
    avendo questa routine
    codice:
        Private Sub VisualizzaRecordCercati(ByVal NumCol As Integer, Tiporicerca As TipoRicerca)
            Dim i As Integer
    
    inizio:
    
            For i = 0 To Me.ListView1.Items.Count - 1
                Select Case Tiporicerca
                    Case Is = FRM_ListaArticoli.TipoRicerca.Maggiore
                        If Not ListView1.Items(i).SubItems(NumCol).Text > valoreA Then
                            ListView1.Items(i).Remove()
                            GoTo inizio
                        End If
                End Select
            Next
        End Sub
    ho letto spesso che bisognerebbe evitare di mettere il goto
    purtroppo in questa situazione non so come fare, in quanto se cancello un item dalla lista devo rifare il ciclo,quindi :
    se richiamo la routine con un call...crea un ciclo infinito se trova qualcosa
    se utilizzo il goto...incappo in critiche da forum

    come posso modificarla togliendo il goto?
    misto spremento non trovo una soluzione
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Sostituisci a "Goto inizio" "i=0".
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Sostituisci a "Goto inizio" "i=0".
    Geniale nella sua semplicità. Complimenti, MItaly

    Chico

  4. #4
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580
    Originariamente inviato da MItaly
    Sostituisci a "Goto inizio" "i=0".
    ehm...sicuro?
    mi sembra che se tolgo un elemnto dalla lista dovrei ricalcolare il count, mentre se è ancora in ciclo e tolgo l'elemento ho il count diverso dagli elementi effettivi

    qundi penso dia errore di out of range
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,461
    In genere, non è formalmente corretto modificare il valore di una variabile utilizzata per l'indicizzazione di un ciclo. Esistono compilatori che lo impediscono.

    Nel caso specifico in esame, credo sarebbe sufficiente invertire il ciclo per evitare errori, partendo da Count - 1 fino a 0. Questo dovrebbe impedire il verificarsi di errori anche in caso di rimozione di elementi.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    L'approccio più pulito è questo:
    codice:
        Private Sub VisualizzaRecordCercati(ByVal NumCol As Integer, Tiporicerca As TipoRicerca)
            Dim ripeti As Boolean
            Do
                    ripeti=False
                    For i As Integer = 0 To Me.ListView1.Items.Count - 1
                        Select Case Tiporicerca
                            Case Is = FRM_ListaArticoli.TipoRicerca.Maggiore
                                If Not ListView1.Items(i).SubItems(NumCol).Text > valoreA Then
                                    ListView1.Items(i).Remove()
                                    ripeti=True
                                End If
                        End Select
                    Next
            Loop While ripeti
        End Sub
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    111
    Scusate il mio intervento che forse vi sembrerà sciocco.
    Vengo da VB6 e questa è la prima volta che sento che non si deve usare goto.
    Perchè?

  8. #8
    Originariamente inviato da MItaly
    L'approccio più pulito è questo:
    codice:
        Private Sub VisualizzaRecordCercati(ByVal NumCol As Integer, Tiporicerca As TipoRicerca)
            Dim ripeti As Boolean
            Do
                    ripeti=False
                    For i As Integer = 0 To Me.ListView1.Items.Count - 1
                        Select Case Tiporicerca
                            Case Is = FRM_ListaArticoli.TipoRicerca.Maggiore
                                If Not ListView1.Items(i).SubItems(NumCol).Text > valoreA Then
                                    ListView1.Items(i).Remove()
                                    ripeti=True
                                End If
                        End Select
                    Next
            Loop While ripeti
        End Sub

    ...perchè ricominciare sempre da zero;
    ...se non ricordo male il while valuta la condizione di fine ciclo ad ogni iterazione
    per cui credo si possa fare anche una cosa tipo :

    codice:
    I = 0
    While I <= Me.ListView1.Items.Count - 1
        I = I + 1
        Select Case TipoRicerca
            Case Is = FRM_ListaArticoli.TipoRicerca.Maggiore
                If Not ListView1.Items(I-1).SubItems(NumCol).Text > valoreA Then
                   ListView1.Items(I-1).Remove()
                    I = I - 1
                End If
        End Select
    Wend

  9. #9
    Originariamente inviato da Stibbert
    Scusate il mio intervento che forse vi sembrerà sciocco.
    Vengo da VB6 e questa è la prima volta che sento che non si deve usare goto.
    Perchè?
    I goto non andrebbero utilizzati fin dai tempi di QuickBasic, figurati in VB6... :rollo: Leggi qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di Jupy64
    Registrato dal
    Sep 2004
    Messaggi
    1,151
    Originariamente inviato da alka
    In genere, non è formalmente corretto modificare il valore di una variabile utilizzata per l'indicizzazione di un ciclo. Esistono compilatori che lo impediscono.

    Nel caso specifico in esame, credo sarebbe sufficiente invertire il ciclo per evitare errori, partendo da Count - 1 fino a 0. Questo dovrebbe impedire il verificarsi di errori anche in caso di rimozione di elementi.

    Quoto in pieno tutto! e la soluzione di alka è quella migliore.
    Jupy

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.