Newsgroup: it.comp.lang.visual-basic
Titolo: [?] ComboBox

Ciao a tutti
io avrei la necessità di fare la seguente cosa ma non ho la più pallida idea
di come farlo:
Supponete di avere una combobox caricata con molti elementi
e che questa combobox mi serva in più form
Per evitare di caricarla ogni volta ho tentato la seguente
Form 1 :
contiene la combobox caricata
form2 :
ha una poperty alla quale passo la combobox.appena form2 è viaualizzata,
creo un controllo di tipo combobox
tramite controls e faccio Set NuovoControllo=combobox passato da form1
Risultati :
Nuovocontrollo non visualizza nessun elemento ma se leggo il listcount,
selindex e via dicendo,è tutto identico alla combo originale.ho provato con
un NuovoControllo.Refresh ma non ha effetto.
Anche riuscendo a risolvere il problema della visualizzazione, gli elementi
caricati sembrano essere condivisi ma lo è anche selindex che in caso
di due controlli visualizzati contemporaneamente impedirebbe di scegliere
due voci diverese.
Qualcuno di voi ha qualche idea su come far condividere ad una combobox solo
gli elenti caricati di un'altra senza ogni volta doverla caricare da capo??
Grazie a tutti
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 gli elenti caricati di un'altra senza ogni volta doverla caricare da
capo??
Perche non vuoi caricarla ogni volta?
da dove li carichi gli elementi? db,file,variabile?
se è per motivi di tempo di lettura da file o db
potresti usare una matrice public...
altrimenti non saprei


Si è per motivi di tempo, e soprattutto posso averne anche più di uno con
gli stessi elementi sulla stessa form.
Come lo risolveresti con una matrice pubblica?


 Come lo risolveresti con una matrice pubblica?
caricando tutti gli elementi in una matrice dichiarata nel form principale
(cioč in un form che non scarichi mai, al massimo lo nascondi, oppure in un
modulo)
public matrix() as string
poi una volta che hai saputo quanti elementi sono,
dichiari le dimensioni della matrice:
redim matrix(x,y) as string    'sinceramente non so se č necessario
ridefinire il tipo cmq...
a questo punto con un bel ciclo for inserisci tutti i tuoi dati nella
matrice
e successivamente dove ti servono...combobox,listview,grid,ecc
da un altro form ci accederai semplicemente cosě:
form1.matrix(i,j)    'se dichiarata public nel form1
che ne dici?
ciao!


 da un altro form ci accederai semplicemente così:


 ma fare in modo di clonare una combo già caricata
Improbabile.
Cmq un modo per risolvere il tutto c'e', ma non e' cosi' semplice...

Come si potrebbe fare??
potresti almeno indicarmi la strada?

--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 potresti almeno indicarmi la strada?
Alur...io ho provato con un'altra tecnica, funzionava, ma alla fin fine ho
lasciato perdere.
Quello che segue e' un'analisi, creata al momento, di qualcosa che secondo
me funzionerebbe in maniera spettacolare. Se qualcuno si sente di provare ad
implementarla e di renderla pubblica e' un grande :-)
(ed un folle, ma tant'e'...)
Si tratta di creare un'OCX ultraleggero che mima un Combo. Questo OCX deve
avere tutti i metodi di impostazione visiva del combo normale, piu'
ListIndex ed ItemData. Non deve disporre di input utente o dei normali
eventi
di un combo.
Le uniche opzioni in piu' che questo combo farlocco dovrebbe avere sono
 - la proprieta' "LinkedControl", che dice al controllo quale Combo (vero)
visualizzare in caso di interazione con l'utente
 - L'evento "UserInteract", che viene lanciato dal controllo nel momento in
cui l'utente tenta di interagire con il
combo-che-non-c'e'-ma-che-ci-in-teoria-ci-doveva-essere
 - Il metodo "LostUser", che viene usato dal nuovo combo(finto) che va' ad
interagire con il combo(vero)
La sostanza e' semplice:
Carico in una form separata tutti i combo di cui ho bisogno.
Sulle form normali al posto di ogni combo inserisco il FarlocCombo.ocx
Ad ogni FarlocComb assegno il combo di destinazione e imposto tutte le
proprieta' per renderlo uguale. Importantissimo e' impostare le proprieta'
ListIndex ed ItemData.
Ogni volta che l'utente interagisce con il FarlocCombo, quest'ultimo:
1) Lancia il metodo LostUser sul FarlocCombo che possedeva fino a questo
momento il combo associato
2) Quest'ultimo si memorizza tutte le impostazioni del combo, in modo da
sembrare lui sia all'utente che al programmatore.
4) Il nuovo FarlocCombo comunica al combo l'aspetto da assumere, imposta il
parent del combo al suo parent, lo posiziona nel posto giusto e gli
trasmette l'eventuale evento che ha fatto scattare lo UserInteract
Cose da notare:
Il punto 1 non e' assolutamente di facile soluzione, considerato che ad ogni
combo normale bisognerebbe poter associare il FarlocCombo attivo in quel
momento. Intravedo qualche possibilita', ma...
Il punto 4 diventa molto complicato a seconda di che evento si decide di
usare per fare il trigger dell'evento UserInteract. Secondo me, la cosa
migliore sarebbe quella di usare il MouseMove e far scattare l'evento quando
l'utente passa con il mouse sopra il FarlocCombo. (se il combo non e' gia'
li')...
In alternativa a tutto questo macello ci sarebbe anche un'altra soluzione:
rivedere l'interfaccia utente. Io ho fatto cosi', e non ho avuto problemi di
nessun tipo. Certo, se qualcuno implementasse il codice di cui sopra... :-)

 public matrix() as string
[CUT]
secondo me, la matrice, è il metodo più facile e veloce!
clonare una combo non significa che il processore non farà nulla, anzi mi sa
che a furia di oggetti ocx ecc ti prenda più tempo di interrogare un db!
in effetti, credo, che anche se riesci a clonare la combo il processore
scorrerà lo stesso i valori della vecchia combo mettendoli, con chissà quali
giri, in una nuova area di memoria, quella della nuova combo appunto!
Più o meno quello che faresti tu scorrendo una matrice...in più con la
matrice hai altri 200 vantaggi: puoi caricarla mentre apri il form iniziale
così non se ne accorge nessuno, puoi contare, caricare i valori da qualche
altra parte ecc.
max
-- 
ciao
max