Avrei una curiosità, vorrei utilizzare un treeview in modo però da rendere selezionabile soltanto la "radice" dell'albero, rendendo quindi inselezionabile il resto. Provo a spiegarmi meglio che cosi non è molto chiaro.
Ho un treeview, nel quale visualizzo delle informazioni in questo modo:
nome
mio nome
mio cognome
mia età
ora normalmente posso selezionare oltre al "nome" anche il resto, quindi "mio nome" ecc... io invece vorrei poter selezionare soltanto "nome" ed utilizzare il resto semplicemente come informazioni di "nome" rendendoli non selezionabili...è possibile?
'popolo la treeview
PUBLIC SUB Form_Open()
TreeView1.Add("a", "padre")
TreeView1.Add("a1", "figlio1",, "a")
TreeView1.Add("a2", "figlio2",, "a")
END
'disabilito il click sui nodi figli
PUBLIC SUB TreeView1_Click()
IF TreeView1["a1"].Selected = TRUE OR TreeView1["a2"].Selected = TRUE THEN
TreeView1["a1"].Selected = FALSE
TreeView1["a2"].Selected = FALSE
TreeView1["a"].Selected = TRUE
END IF
END
Questo è unmetodo se vuoi possiamo migliorarlo..
Allora, ho delle esigenze :-)
La treeview, in pratica mi serve per visualizzare tutti i dispositivi webcam connessi al mio pc. Per far ciò ho inserito questo codice:
PUBLIC DeviceName AS String
PUBLIC DeviceLocation AS String
PUBLIC DeviceVersion AS String
PUBLIC DeviceMaxWidth AS String
PUBLIC DeviceMaxHeight AS String
PUBLIC DeviceMinWidth AS String
PUBLIC deviceMinHeight AS String
SUB DeviceDetectModule()
DIM hWebcam AS VideoDevice
DIM hDir AS String
DIM hPatch AS String
hDir = "/dev/"
FOR EACH hPatch IN Dir("/dev", "video*", gb.Device)
DeviceLocation = "Device location: " & hDir & hPatch
TRY hWebcam = NEW VideoDevice(hDir & hPatch)
IF ERROR THEN
Message.Error("Video device do not work!")
ELSE
DeviceName = hWebcam.Features.Name
DeviceVersion = "Device version: " & hWebcam.Features.Version DeviceMaxWidth = "Max Width: " & hWebcam.Features.MaxWidth DeviceMaxHeight = "Max Height: " & hWebcam.Features.MaxHeight DeviceMinWidth = "Min Width: " & hWebcam.Features.MinWidth deviceMinHeight = "Min Height: " & hWebcam.Features.MinHeight ENDIF
NEXT
CATCH Message.Error("No usb video device connected!")
END
Questo modulo viene richiamato ed aggiunge le varie info del mio device.
Sinceramente non so se aggiungendo un secondo dispositivo webcam, questo venga visto e mi restituisca due dispositivi nella treeview e i rispettivi "rami" con le info del device(perché non posseggo più di una webcam!!)
Ora vorrei che selezzionando l'oggetto "padre" questo mi copi come testo in una label, il nome della camera selezionata e la sua rispettiva posizione(di solito è: /dev/video*)
Ora quando clicco, non mi inserisce il nome nella label....
ecco il codice che ho inserito:
PUBLIC SUB TreeView1_Click() TreeView1[DeviceDetectModule.DeviceLocation].Selected = FALSE TreeView1[DeviceDetectModule.DeviceVersion].Selected = FALSE TreeView1[DeviceDetectModule.DeviceMaxWidth].Selected = FALSE TreeView1[DeviceDetectModule.DeviceMaxHeight].Selected = FALSE TreeView1[DeviceDetectModule.DeviceMinWidth].Selected = FALSE TreeView1[DeviceDetectModule.deviceMinHeight].Selected = FALSE
Label2.Caption = TreeView1.Item.Selected
Label4.Caption = DeviceDetectModule.DeviceLocation
END
Spero d'aver messo tutto!
Ciao!
Quando vuoi fare riferimento ad un particolare componente della treeview devi usare la sua posizione come indice dell'array...la treeview infatti non è latro che un array (o vettore) contenente i vari "rami" con la particolarità di creare delle specie di dipendenze tra gli oggetti. Come avrai visto dal mio codice, ad ogni oggetto viene attribuito un codice univoco (la cosiddetta key = chiave) che non è altro che una stringa alfanumerica che identifica in maniera univoca quel oggetto tra tutti quelli contenuti nella treeview. Pertanto, immaginando che la chiave identificativa del nodo padre sia "a1", se vuoi che nella label ci sia il nome di questo allora devi prelevare il suo parametro testo semplicemente con la sintassi.
Label1.text = Treeview1["a1"].text
Inserita nella sub Treeview1_click ovviamente.
Spero di essere stato il più esaustivo possibile anche didatticamente. Se hai dubbi chiedi pure.
Per quanto concerne quesot tipo di oggetti in stile array (come per l'appunto treeview o combobox) è possibile inserire nuovi elementi interni mediante l'uso della funzione Add. La sintassi
Oggetto.Add("Cosa_inserire")
permette infatti di aggiungere un nuovo elemento al vettore. Ora siccome penso che tu voglia inserire il nome cliente e e il codice sulla stessa riga allora prima devi comporre la stringa del tipo
$valori = "codice cliente - nome cliente"
e successivamente inserire tale stringa nella combobox mediante:
Combobox1.add($valori, 0)
Come avrai notato ho inserito uno 0 accanto alla stringa. Quel valore si chiama indice, è univoco per ogni elemento e permette, non solo di gestire l'ordine degli elementi (elemento con indice più basso apparirà più in alto nella combobox) ma mi permette di richiamare le caratteristiche di quel determinato elemento in particolare.
Ora, infatti, volendo che ad un click sulla combobox si carichi la striga in una variabile chiamata $PrelevoDati basta usare
$PrelevoDati = Combobox[0].text
Ora sta a te gestire l'indice in modo da sapere quale prelevare. Tuttavia ti volgio precisare che esiste la funzione
che restituisce l'indice del valore selezionato. Potrebbe tornarti utile.
Semplicemente richiamando anche il figlio con la sua key. Cioè, immaginiamo di avere una label (label1), è la treeview con un padre "a" e due figli "a1" e "a2". A questo punto puoi scrivere il testo di questi tre elementi mediante
label1.text = treeview["a"].text
label1.text &= " - " & treeview["a1"].text
label1.text &= " - " & treeview["a2"].text
In questo modo alla fine nella label avrò
testo-padre - testo-figlio1 - testo figlio2