Italian Rimozione di row da una combo

toro1950

Active Member
Licensed User
Buon fine setiimana , devo rimuovere da una combo delle righe e in alcune condizioni rimuovere la successiva,
rieesco a rimovere la row ma non la successiva, l'app esce senza nessun avviso,questo è il mio codice
ho inerita un msgbox per vedere che i parametri fossero giusti e cosi è, dove sbaglio non riesco a capirlo
B4X:
Private Sub oredisp
    Dim l As Label
    Dim t As Label
    Dim y As Int
    Dim x As Int
    Dim a As Int
    a=combora.Size-2
    For x = 0 To  listapre.Size - 1
        Dim p As Panel = listapre.GetPanel(x)
        l = p.GetView(2)
        t= p.GetView(4)
        For y= 0 To a
            combora.SelectedIndex=y
            If combora.SelectedItem =l.text Then
                combora.cmbBox.RemoveAt(y)
                a=a-1
            If t.Text="60" Then
                'rem il messaggio mi conferma che l'item è giusto  Msgbox(combora.GetItem(y),t.text)
                combora.cmbBox.RemoveAt(y)
                    a=a-1
            End If
            End If

        Next
    Next
    combora.SelectedIndex=0
End Sub
 

giannimaione

Well-Known Member
Licensed User
Longtime User
in un for next, ? una logica un po' strana; io calcolerei la posizione da cancellare da un ciclo e dopo eseguirei removeat
 

toro1950

Active Member
Licensed User
Grazie Gianni, ho provato come mi hai consigliato e cosi funziona, ho modificato poche righe, praticamente
esco dal ciclo for next quando trovo la condizione, non capisco perche non funziona all'interno del ciclo, sul pc con un altro linguaggio funziona benissimo.
B4X:
Private Sub oradisp
    Dim l As Label
    Dim t As Label
    Dim y As Int
    Dim x As Int
    Dim a As Int
    r=0
    a=combora.size-2
    For x = 0 To  listapre.Size - 1
        Dim p As Panel = listapre.GetPanel(x)
        l = p.GetView(2)
        t= p.GetView(4)
        For y= 0 To a
        combora.SelectedIndex=y
        If combora.SelectedItem =l.text Then
            combora.cmbBox.RemoveAt(y)
            a=a-1
            If t.Text="60" Then
                r=y
                Exit
            End If
        End If
        Next
        If r>0 Then
            combora.cmbBox.RemoveAt(r)
        End If
    Next
    
    combora.SelectedIndex=0
End Sub
 

Sagenut

Expert
Licensed User
Longtime User
Ma si parla di B4A o di B4J?
Perchè in B4A io mica la trovo la ComboBox.
O parli dello Spinner di B4A?
 

toro1950

Active Member
Licensed User
Buonasera, chiedo scusa se ho chiamato combobox una CustomView, abituato a programmare pc con un linguaggio che usa le combobox
e visto che la CustomView si comporta come tale ho dimenticato che si chiama CustomView. Adesso ho capito perche ho avuto una sola risposta
 

Sagenut

Expert
Licensed User
Longtime User
Listapre immagino sia una CustomListView.
Ma non capisco cosa sia
Combora
Senza sapere da cosa è composto il layout non è facile.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Normalmente quando da una lista devi cancellare degli elementi si parte dal fondo della lista per poi risalire, perchè al "removeAt" tutti gli "items" successivi cambiano di posto e quindi il ciclo for ha i suoi problemi.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Buonasera, chiedo scusa se ho chiamato combobox una CustomView, abituato a programmare pc con un linguaggio che usa le combobox
e visto che la CustomView si comporta come tale ho dimenticato che si chiama CustomView. Adesso ho capito perche ho avuto una sola risposta

Facciamo un po' di chiarezza, premettendo che è corretto ciò che ha scritto @sirjo66 qui sopra e vale per qualunque tipo di lista, anche NON grafica (ovvero "le variabili" List).

Genericamente, le View nell'ambiente B4X equivalgono ai Controlli VB.

Esistono View di base, come Label, EditText (B4A, ma in B4J, ad esempio, sono TextField), ImageView, ...

Poi esistono View aggiuntive, che tutti noi possiamo creare, dandogli i nomi che vogliamo. Queste sono "custom view" (tutte!), ovvero "view personalizzate" (o Controlli personalizzati, se parlassimo di VB). Ad esempio, @Star-Dust ha creato e pubblicato molte custom view di tipo diverso, io qualcuna, Erel tante. La sua libreria XUI Views , ad esempio, contiene tante custom view:

1721044021522.png


Queste sopra sono TUTTE custom view, create da Erel e messe nella libreria XUI Views.

Quella che stai usando tu, @toro1950, è una custom view a cui è stato dato nome "CustomLISTView", perché è una lista di elementi grafici (panel/pane).

Infine, non è uguale ad una ComboBox (questa è una View di base), perché le ComboBox sono "chiuse", l'utente vede solo il primo elemento contenuto nella ComboBox, ci fa click (o tap) e solo a quel punto vedrà più elementi (righe, diciamo), mentre CustomListView è "sempre aperta".
 

toro1950

Active Member
Licensed User
La mia è una CustomView personalizzata di tipo B4XComboBox, è come un combobx, visualizza sempre il primo elemento e per comodità l'ho chiamata combora perché contiene un elenco di orari disponibili. Per rimuovere gli orari non disponibili ho avuto dei problemi, grazie al consiglio di giannimaione ho risolto come da codice, anche se in seguito, per altre variabili inserite ho dovuto modificare.
 

Sagenut

Expert
Licensed User
Longtime User
Se ti và prova così per evitare di dover ciclare in continuazione la combo ogni volta
B4X:
Private Sub oradisp
    Dim l As Label
    Dim t As Label
    For x = 0 To  listapre.Size - 1
        Dim p As Panel = listapre.GetPanel(x)
        l = p.GetView(2)
        t = p.GetView(4)
        Dim posizione As Int = combora.cmbBox.IndexOf(l.Text)
        If posizione <> -1 Then
           combora.cmbBox.RemoveAt(posizione)
           if t.Text = "60" then combora.cmbBox.RemoveAt(posizione)
        End If
    Next
    combora.SelectedIndex=0
End Sub
*** EDIT ***
Ho eliminato la variabile Elemento, era superflua.
Avevo scritto combo nel mio esempio, ora corretto in combora.
 
Last edited:

toro1950

Active Member
Licensed User
Grazie Fabio, sei un grande, non conoscevo il codice cmbBox.IndexOf, ho dovuto modificare leggermente il codice per altre variabili introdotte, "45" e "75" Ora ho un altro piccolo problema, per questo farò un altro post. Grazie ancora
 

Sagenut

Expert
Licensed User
Longtime User
Felice di esserti stato d'aiuto.
Ci abbiamo messo un pó perché, almeno io, facevo fatica senza sapere da cosa fosse composto il tuo layout.
Per questo, quando non è possibile postare un progetto di esempio su cui iniziare, chiediamo di dare più informazioni possibili.
Perché altrimenti dobbiamo fare i veggenti e pare che non ci riesca troppo bene. ?
 

MrKim

Well-Known Member
Licensed User
Longtime User
I'll just clarify a little what @sirjo66 said. The problem is with
B4X:
For x = 0 To  listapre.Size - 1
listapre.Size - 1 sets the size of the for loop. Once you remove something the list is smaller so you will exceed the list size and throw an error. Also, if you remove say, item 27 it is removed immediately so item 28 becomes item 27. Then you increment your counter and wind up skipping an item. Always best to step up from the bottom to zero.
 
Top