Gambas-it

Gambas3 => Programmazione => Topic aperto da: giango - 31 Ottobre 2014, 17:24:59

Titolo: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 17:24:59
Qualcuno in questo forum ha forse già realizzato una funzione che permette di posizionarsi sulla prima ricorrenza
di un item in una combo quando si digitano le prime lettere dell'item richiesto?
Era una funzione già implementata di default nell'oggetto combo di altri software, ma qui non l'ho trovata, a meno che....
a meno che sia proprio io che non so cercare!
Grazie.
Titolo: Re: combobox intelligente
Inserito da: vuott - 31 Ottobre 2014, 17:32:47
Per mera curiosità ti segnalo questo tentativo:
http://www.gambas-es.org/viewtopic.php?f=4&t=1441&highlight=combobox
Titolo: Re: combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 17:36:47
Ma guarda un pò! Qualcuno ci aveva gia pensato.
Grazie per la dritta vuott, ho quasi ultimato il mio lavoro e volevo proprio
arricchirlo con questa chicca. Grazie!
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: vuott - 31 Ottobre 2014, 17:52:58
Ma forse... si può fare più semplicemente...
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 18:21:37
Ma forse... si può fare più semplicemente...
Si, probabilmente hai ragione. Ho notato che se si clicca sulla combo in modo che si apra, digitando la lettera
del nome richiesto, ne avviene il posizionamento automatico, che è quello che desidero.
Basterebbe fare in modo che intercettando l'evento Enter (quando il cursore vi entra) la combo si espanda
in modo automatico. Sto ancora cercando quale è il metodo per farla aprire però!!!
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: vuott - 31 Ottobre 2014, 20:16:24
Proporrei per la tua questione iniziale questa soluzione:   :-X
Codice: gambas [Seleziona]
Public Sub Form_Open()

  ComboBox1.Tag = 1

End


Public Sub ComboBox1_Change()

  With ComboBox1
    .Text = ComboBox1[.List.Find(String.Left(.Text, .Pos) & "*", gb.Like)].Text
    .Pos = .Tag
  End With

End



Public Sub ComboBox1_KeyRelease()

 If Key.Code < 127 Then
   Inc ComboBox1.Tag
 Else
   ComboBox1.Tag = ComboBox1.Pos + 1
 Endif

End
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 20:20:40
Ohibò! Qui si parla di TAG, un coso che non ho mai preso in esame!
Intanto ci provo, e poi mi devo documentare in modo completo!
Grazie.
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: vuott - 31 Ottobre 2014, 20:35:59
Ohibò! Qui si parla di TAG...

...ma... guarda, niente di che !
L'ho voluto usare al posto di una variabile globale, al solo fine di rendere (nonostante la proprietà .Tag occupi più memoria essendo un Variant) l'intero codice più essenziale possibile.
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 21:24:12
Una variabile globale dici, ma non comprendo la relazione esistente fra quest'ultima ed una proprietà dell'oggetto combo, come il "tag"!
O perlomeno sono rimasto al punto che una variabile è fine a se stessa, ovvero una allocazione di memoria che mantiene un dato
durante la sessione del prg, mentre questo "tag" che non deve essere il giorno in tedesco, appartiene all'oggetto combo, in questo
caso, e ne determina una caratteristica. O sbaglio?
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: Top Fuel - 31 Ottobre 2014, 21:33:30
Il tag è semplicemente una proprietà "di appoggio" che puoi usare come più ti pare ed è può essere utile a vari scopi, come ad es. per distinguere vari oggetti simili appartenenti ad un medesimo gruppo, o memorizzare variazioni in un determinato oggetto a seguito di un evento o calcolo particolare. Gli usi possono essere vari.
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 21:41:07
Penso di capire. E' dunque una proprietà vuota che appartiene all'oggetto,
in cui memorizzare qualsiasi cosa che ha relazione col medesimo.
Ho detto bene?
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: vuott - 31 Ottobre 2014, 21:44:54
In una mia vecchia discussione guarda che ho combinato:

http://www.gambas-it.org/smf/index.php?topic=2184.0
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 31 Ottobre 2014, 21:52:27
E' una megaproprietà sto TAG...... E bravo vuott!
Qui si impara di tutto, e forse qualche volta, anche aspetti di gambas
che forse nemmeno lo stesso autore ha previsto.
Per quanto riguarda il tuo codice, è una bomba! E' di una compattezza
impressionante rispetto a quello proposto dallo spagnolo.
Lo devo testare bene ed analizzare se vi è qualcosa che magari disturba
se si premono tasti non appropriati e così via.
Grazie di nuovo; sei un pozzo (nel senso buono, si intende)
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: Top Fuel - 31 Ottobre 2014, 21:55:54
In pratica ci puoi mettere vita morte e miracoli dell'oggetto. ;)
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: Gianluigi - 31 Ottobre 2014, 22:49:32
Quando sostengo che questo sito è una vera e propria preziosissima miniera di informazioni, non riesco comunque a descriverlo completamente.
Questa cosa mi era del tutto sconosciuta e dire che avevo fatto ricerche (accurate!?) sulle Strutture & C.
Di Tag ignoravo l'esistenza sig! La cosa un po mi demoralizza mi sento sempre più inadeguato all'improbo compito che mi sono dato.
Però ai nuovi arrivati non si può mica dire tutto no?
 :ciao:
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 01 Novembre 2014, 12:03:01
Di Tag ignoravo l'esistenza sig! La cosa un po mi demoralizza mi sento sempre più inadeguato all'improbo compito che mi sono dato.
Tranquillo Gianluigi, come vedi sei in buona compagnia; la cosa che considero molto importante è l'ammissione dei propri limiti, perchè se tutti si considerassero professori, questo forum non avrebbe alcun senso, e non verrebbero alla luce certe peculiarità che fanno di gambas un prodotto d'eccellenza.
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: Gianluigi - 01 Novembre 2014, 15:13:46
Tranquillo Gianluigi, come vedi sei in buona compagnia; la cosa che considero molto importante è l'ammissione dei propri limiti, perchè se tutti si considerassero professori, questo forum non avrebbe alcun senso, e non verrebbero alla luce certe peculiarità che fanno di gambas un prodotto d'eccellenza.

Ciao giango,
d'accordissimo con te, se fossi rimasto solo scolaro (somaro) ok, ma volevo lasciare un pochino del mio sapere (!?) a quelli messi peggio di me, il problema è che sembra proprio che messi peggio di me non ce ne siano.
Intendiamoci meglio così, però...
 :ciao:
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 01 Novembre 2014, 19:37:49
Per vuott.
Riprendendo il tuo esempio, ho notato che dopo aver trovato la prima ricorrenza, se ti scappa di digitare un carattere senza porsi all'inizio della stringa nella combo,
si presenta un errore. Mi sono quindi permesso di inserire nel tuo esempio una semplice modifica che si occupa di cancellare la stringa del precedente item trovato,
ricorrendo all'evento keypress(). Così facendo, qualsiasi carattere si digiti senza preoccuparsi di cancellare la precedente ricorrenza,
si posiziona subito sulla prima occorrenza che inizia col carattere digitato. Così mi sembra quasi perfetto per l'uso che ne voglio fare, ma devo inserire un controllo
che non ritorni un errore nel caso in cui la ricorrenza non viene trovata.

Citazione
' Gambas class file
Public carattere As String

    Public Sub Form_Open()  
        Cmb_prova.Tag = 1  
    End  
    
    Public Sub Cmb_prova_Change()  
        With Cmb_prova  
          .Text = Cmb_prova[.List.Find(String.Left(carattere, .Pos) & "*", gb.Like)].Text  
          .Pos = .Tag
        End With  
    End  
      
    Public Sub Cmb_prova_KeyRelease()  
        With Cmb_prova
            If Key.Code < 127 Then  
              Inc .Tag  
            Else  
              .Tag = .Pos + 1  
            Endif
        End With  
    End  

Public Sub Cmb_prova_KeyPress()
    carattere = Key.Text
End
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: vuott - 01 Novembre 2014, 20:11:28
Riprendendo il tuo esempio, ho notato che dopo aver trovato la prima ricorrenza, se ti scappa di digitare un carattere senza porsi all'inizio della stringa nella combo, si presenta un errore.



Sì, hai ragione; ...però forse si può fare a meno di scomodare addirittura un evento:
Codice: gambas [Seleziona]
Public Sub Form_Open()  
 
 ComboBox1.Tag = 1 
 
End 
 
 
Public Sub ComboBox1_Change() 
 
   Dim s As Short
     
    With ComboBox1 
      s = .List.Find(String.Left(.Text, .Pos) & "*", gb.Like)
        If s > -1 Then
          .Text = ComboBox1[s].Text 
          .Pos = .Tag 
        Endif
    End With 
 
End 
 
   
Public Sub ComboBox1_KeyRelease() 
 
  If Key.Code < 127 Then 
    Inc ComboBox1.Tag 
  Else 
    ComboBox1.Tag = ComboBox1.Pos + 1 
  Endif 
 
End
Titolo: Re: [RISOLTO] combobox intelligente
Inserito da: giango - 01 Novembre 2014, 20:23:07
Ho provato il tuo esempio, ma le cose non vanno ancora come dovrebbero. Visto che l'evento scomodato non si lamenta, posso anche usare
questa soluzione. Ho introdotto anche il controllo errori così che la combo non accetta qualsiasi carattere che non corrisponda ad una occorrenza.
Aggiornamento: ho dovuto anche inserire l'evento click() nella combo che azzera il carattere inserito per consentire il consueto funzionamento
nella selezione col mouse. Ora funziona proprio come volevo io. Quando apro il form, il focus è nella combo e se digito qualsiasi carattere si
posiziona sull'occorrenza solo se esiste nella combolist. Usando il mouse il comportamento è quello tradizionale.
Citazione
Public carattere As String

    Public Sub Form_Open()  
        Cmb_prova.Tag = 1  
    End  
      
    Public Sub Cmb_prova_Change()  
        With Cmb_prova  
          .Text = Cmb_prova[.List.Find(carattere & "*", gb.Like)].Text  
          .Pos = .Tag
        End With
    Catch
        Stop Event
        Cmb_prova.Text = ""
    End  
      
    Public Sub Cmb_prova_KeyRelease()  
        With Cmb_prova
            If Key.Code < 127 Then  
              Inc .Tag  
            Else  
              .Tag = .Pos + 1  
            Endif
        End With  
    End  

Public Sub Cmb_prova_KeyPress()
    carattere = Key.Text
End

Public Sub Cmb_prova_Click()
    carattere = ""
End