L'indice, nel caso delle combo e delle listbox, corrisponde alla posizione della stringa nell'array ".List" dell'oggetto; se tenti di inserire un valore in una posizione inesistente (vedi index=5), mentre l'array è vuoto, non è cosa gradita. Il metodo dell'oggetto non ritorna errore (e questo può essere buono), ma non ti avverte di questo problema (tocca stare attenti...).
Un esempio puoi farlo con un semplice array:
DIM arr AS NEW String[] 'creo un array vuoto (0 items)
arr[10] = "PIPPO" 'ERRORE!
arr.Add("PIPPO") 'inserisce l'elemento come primo item dell'array
PRINT arr[0]
>PIPPO
arr.Add("PIPPO",10) 'e gli altri 9 item prima? me li devo creare io Gambas?
'io lo inserisco in fondo all'elenco, così per non
'sbagliare, che in questo caso è la posizione 0 (zero)
PRINT arr[0]
>PIPPO
L'utilità dell'indice, è quando si ha necessità di inserire un elemento (o più) in un array già popolato ovvero, quando occorre che il nuovo elemento vada in elenco prima di altri, come ad esempio:
DIM arr AS NEW String[10] 'creo un array di 10 elementi
arr[5] = "PIPPO"
PRINT arr[5]
arr.add("PLUTO",5)
PRINT arr[5]
>PLUTO
PRINT arr[6]
>PIPPO
l'inserimento dell'item sposta in basso l'item 5 precedente, e il nuovo viene inserito nella posizione del precedente.
Spero di aver chiarito il giochetto.
Riguardo all'evento di selezione di un item della combo, hai tre modi per capire quale item è selezionato, e quale testo contiene:
.Text 'ritorna il testo selezionato
.Selection 'ritorna un oggetto con le informazioni necessarie (vedi doc)
.Index 'ritorna l'indice del testo selezionato, riferito all'array
Per capire quando cambia, puoi usare l'evento Change, che si attiva quando viene modificato il testo visualizzato dalla combo (o quando viene sostituito da un'altro della lista); questo sia se la combo è ReadOnly (non editabile) o meno.
Riguardo all'ultima serie di controlli, con cui hai creato una sorta di oggetto, non capisco se il motivo è la sostituzione della combobox o altro.
Buona sera a tutti,
mi introduco in questa discussione per non aprirne una nuova, visto che il mio problema è inerente la funzionalità di una ComboBox è ha a che fare comunque con quanto discusso, ho questo codice:
PRIVATE cboItems AS NEW Object[]
PUBLIC SUB Button1_Click()
Result = conn.db.Exec("SELECT campo1, campo2 FROM tabella")
END
PUBLIC SUB ComboBox1_Click()
FOR EACH Result
ComboBox1.Add(Result!campo2)
cboItems.Add([Result!campo1, Result!campo2])
NEXT
Label1.Text = cboItems[ComboBox1.Index][0]
END
ho la necessità che il primo item (index 0) della ComboBox sia vuoto e il Result sia accodato a partire dall'index 1.
......il caffè lo prendo al bar.... :-)
PRIVATE cboItems AS NEW Object[]
PUBLIC SUB Button1_Click()
Result = conn.db.Exec("SELECT campo1, campo2 FROM tabella")
ComboBox1.Add(" ")
FOR EACH Result
ComboBox1.Add(Result!campo2)
cboItems.Add([Result!campo1, Result!campo2])
NEXT
END
PUBLIC SUB ComboBox1_Click()
Label1.Text = cboItems[ComboBox1.Index][0]
END
Ho ripostato il codice essendo errato quello postato precedentemente, ma la sostanza non cambia va sempre fuori indice quando clicco sull'ultimo dato della lista.
E' come ti avevo detto. Non tieni conto del fatto che la numerazione negli oggetti e nei vettori in Gambas inizia dall'indice 0 e che hai aggiunto un elemento in più a ComboBox1 rispetto a cboItems.
Quando chiedi l'oggetto ComboBox1.Index a cboItems, avendo aggiunto un elemento con spazio vuoto al primo ma non al secondo, non tieni conto della differenza negli indici (cboItems è lungo un elemento in meno rispetto a ComboBox1). Per cui chiedi ad esempio l'elemento 4 quando cboItems ne contiene 3.
Quindi, o chiami l'elemento (ComboBox1.Index - 1)
PRIVATE cboItems AS NEW Object[]
PUBLIC SUB Button1_Click()
Result = conn.db.Exec("SELECT campo1, campo2 FROM tabella")
ComboBox1.Add(" ")
FOR EACH Result
ComboBox1.Add(Result!campo2)
cboItems.Add([Result!campo1, Result!campo2])
NEXT
END
PUBLIC SUB ComboBox1_Click()
Label1.Text = cboItems[ComboBox1.Index - 1][0]
END
oppure aggiungi anche a cboItems un elemento spaziatore:
PRIVATE cboItems AS NEW Object[]
PUBLIC SUB Button1_Click()
Result = conn.db.Exec("SELECT campo1, campo2 FROM tabella")
ComboBox1.Add(" ")
cboItems.Add(" ", " ")
FOR EACH Result
ComboBox1.Add(Result!campo2)
cboItems.Add([Result!campo1, Result!campo2])
NEXT
END
PUBLIC SUB ComboBox1_Click()
Label1.Text = cboItems[ComboBox1.Index][0]
END
P.S.:
indenta il tuo codice, ne guadagnerai in leggibilità quando userai molti cicli annidati (es. IF/THEN dentro a FOR/NEXT dentro a....).
1)
Sì, è con le [].
2)
Perché alla fine mi sono confuso anch'io. Non tengo conto del fatto che cliccando sull'item n°0 in ComboBox chiedi di caricare l'indice -1 in cboItems. Usa il 2° esempio, è più semplice e più corretto.
3)
Indentare significa allineare il codice spostando i cicli annidati tipo appunto i FOR, gli IF, ecc... più a destra del restante. In questa maniera la lettura del codice è semplificata e si capisce subito a cosa si riferisce un ENDIF o un NEXT se ne hai più di uno annidati. E' un'abitudine che imparai col Pascal e che, poi, mi sono portato dietro anche nel VB prima ed in Gambas poi Adesso, che studio il Python, è un "obbligo", non una scelta, però poi a distanza di mesi ti rendi conto di quanto è stato comodo fare così quando devi rileggere del codice.
Per capirsi, guarda questa porzione di codice:
IF A=1 THEN
IF B=1 THEN
FOR L=1 TO N
C=C+1
FOR M=C TO X
V=V+1
IF G=1 THEN
F=F+1
ENDIF
NEXT
NEXT
ENDIF
ENDIF
e dimmi se ci hai capito qualcosa!
Adesso guarda la stessa porzione con l'indentazione:
IF A=1 THEN
IF B=1 THEN
FOR L=1 TO N
C=C+1
FOR M=C TO X
V=V+1
IF G=1 THEN
F=F+1
ENDIF
NEXT
NEXT
ENDIF
ENDIF
capisci subito ad occhio a quale ciclo IF si riferisce ogni ENDIF, così come a quale FOR si riferisce ogni NEXT.
Non è più chiaro?
Dovresti inserire il comando
variabile_stringa = stringa_indirizzo_ftp
ComboBox.add(variabile_stringa, n)
in un cliclo for che esegue il comando "n" volte...dove "n" è il numero delle righe contenute nella cartella ftp...
nel caso avessi una variabile array come contenitore dei file remoti puoi usare:
dim linee as string[]
combobox1.list=linee