Autore Topic: [RISOLTO] combobox intelligente  (Letto 1533 volte)

Offline giango

  • Grande Gambero
  • ***
  • Post: 164
    • Mostra profilo
Re: [RISOLTO] combobox intelligente
« Risposta #15 il: 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.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re: [RISOLTO] combobox intelligente
« Risposta #16 il: 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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline giango

  • Grande Gambero
  • ***
  • Post: 164
    • Mostra profilo
Re: [RISOLTO] combobox intelligente
« Risposta #17 il: 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
« Ultima modifica: 01 Novembre 2014, 19:55:11 da giango »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO] combobox intelligente
« Risposta #18 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline giango

  • Grande Gambero
  • ***
  • Post: 164
    • Mostra profilo
Re: [RISOLTO] combobox intelligente
« Risposta #19 il: 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
« Ultima modifica: 01 Novembre 2014, 21:41:17 da giango »