Autore Topic: Uso di TreeView  (Letto 1849 volte)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Uso di TreeView
« il: 24 Novembre 2009, 13:31:33 »
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:
Codice: [Seleziona]
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?

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #1 il: 24 Novembre 2009, 14:45:45 »
Codice: [Seleziona]

 '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..

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Uso di TreeView
« Risposta #2 il: 24 Novembre 2009, 15:12:22 »
Mitico! Lo provo subito!!!!!

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #3 il: 24 Novembre 2009, 15:45:33 »
Quello che ho scritto io è spartano e rapido ma efficace...se poi dai maggiori info sarò ben contento di aiutarti a stendere un bel codice..:-)

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Uso di TreeView
« Risposta #4 il: 24 Novembre 2009, 21:42:39 »
In che modo è possibile stendere del codice migliore? Cosi funziona comunque, ma sono curioso.

Edit: Non ho utilizzato l'if, ma funziona comunque.
Cliccando sul padre, mi visualizza i figli, quindi se non erro il padre è cliccabile ma i figli no. è ciò che volevo. :2birre:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #5 il: 25 Novembre 2009, 21:06:52 »
Se tu hai ancora delle particolari esigenze ne discutiamo qui e vediamo di migliorare questo codice....

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Uso di TreeView
« Risposta #6 il: 25 Novembre 2009, 21:55:27 »
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:
Codice: [Seleziona]
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:

Codice: [Seleziona]
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!

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #7 il: 25 Novembre 2009, 22:22:31 »
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.

Codice: [Seleziona]
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.

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Uso di TreeView
« Risposta #8 il: 26 Novembre 2009, 01:53:09 »
@Ceskho

ho un problema simile ma con una combo

vorrei caricare in una combo codicecliente(numerico) e nome(testo), prima uno o l'altro non ha importanza

al click sul cliente la combo dovrebbe caricare il codicecliente in una variabile.

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #9 il: 26 Novembre 2009, 11:50:36 »
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

Codice: [Seleziona]
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

Codice: [Seleziona]
$valori = "codice cliente - nome cliente"


e successivamente inserire tale stringa nella combobox mediante:

Codice: [Seleziona]
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

Codice: [Seleziona]
$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

Codice: [Seleziona]
Combobox1.Index


che restituisce l'indice del valore selezionato. Potrebbe tornarti utile.

Offline Lux

  • Maestro Gambero
  • ****
  • Post: 417
    • Mostra profilo
Re: Uso di TreeView
« Risposta #10 il: 26 Novembre 2009, 12:15:18 »
E se volessi avere anche un "figlio" in una nuova label?
Diciamo che il nodo padre sia [a1], come identifico il ramo che contiene l'informazione che mi serve?

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Uso di TreeView
« Risposta #11 il: 26 Novembre 2009, 12:56:03 »
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

Codice: [Seleziona]
label1.text = treeview["a"].text
label1.text &= " - " & treeview["a1"].text
label1.text &= " - " & treeview["a2"].text


In questo modo alla fine nella label avrò

Codice: [Seleziona]
testo-padre - testo-figlio1 - testo figlio2