Welcome, Guest
Username: Password: Remember me
Qui si parla italiano
  • Page:
  • 1

TOPIC:

ComboBox che non si apre 28 Jan 2023 13:43 #25083

  • claudiocarletta
  • claudiocarletta's Avatar
  • Topic Author


  • Posts: 94
  • Salve a tutti
    non riesco a mostrare il contenuto della ComboBox in automatico.
    Mi spiego meglio, ho una ComboBox che popolo con un array nel momento che in cui il controllo perde il focus o pigio il pulsante di ricerca con il seguente metodo:
    method CercaDocenti(DocCer as String)
        LOCAL RecTro	as LONG
        
        DocCer := StrTran(DocCer, "'", "\'")
        aNomDoc := {}                                                  // Svoto l'array
        cConnAs1 := "SELECT iddocente as id, concat(cognome, ' ', nome) as nome "+;
    				"FROM apprendistato.docenti "+;
    				"WHERE concat(cognome, ' ', nome) like '%" + DocCer + "%' "+;
    				"ORDER BY nome;"
        oSelectAs1 := SQLSelect{cConnAs1, oConnAs1}
        oSelectAs1:Execute()
     
         IF oSelectAs1:Status <> NULL_OBJECT
    	oSelectAs1:Close()
    	ErrorBox{SELF, "Errore durante accesso CercaDocenti"}:Show()
        else
            RecTro := SELF:oSelectAs1:RecCount
     	SELF:oSelectAs1:GoTop()
            DO WHILE .not. SELF:oSelectAs1:EOF
                AAdd(aNomDoc, {SELF:oSelectAs1:nome, SELF:oSelectAs1:id})              // Popolo l'array  
                SELF:oSelectAs1:skip()
            ENDDO
            SELF:oSelectAs1:FreeStmt(SQL_DROP)
        ENDIF
        SELF:oDCListaTutor:FillUsing(aNomDoc )
        if RecTro = 1						// decodifica l'unico elemento trovato
            SELF:oDCListaTutor:CurrentItemNo := 1
            SelezionaDoc()
        elseif RecTro = 0						// indica che la ricerca ha avuto
            LeggiStringa("Esito ricerca, negativa")	// esito negativo
            SELF:oDCListaTutor:TextValue := DocCer
            SELF:oDCListaTutor:SetFocus()
        else
    //     SELF:oDCListaTutor:SetXXX()		// Mostra gli elementi trovati (Come si fa?)
        endif
    return NIL

    Alla fine della ricerca:
    • se ho trovato un solo elemento lo decodifico e lo mostro
    • se non ho trovato nulla emetto un messaggio sonoro ecc.
    • se ho trovato più di un elemento vorrei aprire la ComboBox come mostrato in figura senza pigiare la freccia a discesa



    Cosa mi suggerite?
    Vi ricordo che adopero X# nel dialetto VO

    Grazie a tutti
    Claudio
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by claudiocarletta.

    ComboBox che non si apre 28 Jan 2023 18:38 #25085

    • Jamal
    • Jamal's Avatar


  • Posts: 305
  • Claudio,

    To open the combobox and set focus to it, you can use the following:
    SendMessage(self:oDCListaTutor:Handle(), CB_SHOWDROPDOWN, 1, 0)
    self:oDCListaTutor:SetFocus() 

    Jamal

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 28 Jan 2023 18:59 #25086

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Grazie Jamal,
    adesso si apre esattamente come volevo, sei grande :woohoo: :woohoo: :woohoo:

    Un'ultima domanda, come posso fare a controllare che su ComboBox ho pigiato il tasto KEYRETURN per uscire dal controllo e quindi eseguire la ricerca?

    Grazie mille
    Prometto che me ne starò buono per un po' di tempo

    Please Log in or Create an account to join the conversation.

    Last edit: by claudiocarletta.

    ComboBox che non si apre 28 Jan 2023 19:27 #25088

    • Jamal
    • Jamal's Avatar


  • Posts: 305
  • Your lucky day!

    how can I check that on the ComboBox I pressed the KEYRETURN key to exit the check and then run the search?


    Inherit your combobox from this class:
    METHOD Dispatch(oEvent) CLASS EnhancedComboBox    
    
    	IF oEvent:Message = WM_GETDLGCODE .AND. oEvent:wParam = KEYENTER
    		IF IsInstanceOf(SELF:Owner, #DATAWINDOW)
    			SendMessage(SELF:Owner:oFormSurface:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    		ELSE
    			SendMessage(SELF:Owner:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    		ENDIF
    		RETURN 1L	
    	ENDIF
    	RETURN SUPER:Dispatch(oEvent)

    Jamal

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 28 Jan 2023 19:48 #25089

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Ho l'impressione che io sia ad un livello troppo basso per capire il tuo suggerimento.
    Penso di dover inserire la classe (vedi figura)

    ma non ho idea di dove mettere il codice che mi hai inviato :(
    Ho paura che ti sto impegnando troppo
    Scusami
    Attachments:

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 00:40 #25090

    • Jamal
    • Jamal's Avatar


  • Posts: 305
  • I assumed you know how to construct the class. Let me clarify further. :):)

    The complete code is below:
    CLASS EnhancedComboBox INHERIT ComboBox
    
    METHOD Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle) CLASS EnhancedComboBox
    	SUPER:Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle)
    RETURN SELF
    	
    METHOD Dispatch(oEvent) CLASS EnhancedComboBox
    
    	IF oEvent:Message = WM_GETDLGCODE .AND. oEvent:wParam = KEYENTER
    		IF IsInstanceOf(SELF:Owner, #DATAWINDOW)
    			SendMessage(SELF:Owner:oFormSurface:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    		ELSE
    			SendMessage(SELF:Owner:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    		ENDIF
    		RETURN 1L	
    	ENDIF
    RETURN SUPER:Dispatch(oEvent)

    Then you set the Inherit from Class in the properties of your combobox just like you did already.

    Jamal

    Please Log in or Create an account to join the conversation.

    Last edit: by Jamal.

    ComboBox che non si apre 29 Jan 2023 11:25 #25091

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Purtroppo non sono riuscito a compilarlo, mi da questo errore:

    riesco a compilarlo solo se eseguo queste modifiche:
    CLASS EnhancedComboBox INHERIT ComboBox
        
    	CONSTRUCTOR()
    	RETURN
      
    //	METHOD Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle) CLASS EnhancedComboBox
    //		SUPER:Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle)
    //	RETURN SELF
    	
    	METHOD Dispatch(oEvent) //CLASS EnhancedComboBox
    		IF oEvent:Message = WM_GETDLGCODE .AND. oEvent:wParam = KEYENTER
    			IF IsInstanceOf(SELF:Owner, #DATAWINDOW)
    				SendMessage(SELF:Owner:oFormSurface:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ELSE
    				SendMessage(SELF:Owner:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ENDIF
    			RETURN 1L	
    		ENDIF
    	RETURN SUPER:Dispatch(oEvent)
     
    END CLASS
    Naturalmente il codice della classe DATAWINDOW è diventato:
    CONSTRUCTOR(oWindow,iCtlID,oServer,uExtra)
    
    	SELF:PreInit(oWindow,iCtlID,oServer,uExtra)
    
    	SUPER(oWindow , ResourceID{"AnaDoc2" , _GetInst()},iCtlID)
    
    	SELF:oDCListaTutor := EnhancedComboBox{SELF , ResourceID{ ANADOC2_LISTATUTOR  , _GetInst() } }
    	SELF:oDCListaTutor:HyperLabel := HyperLabel{#ListaTutor , NULL_STRING , NULL_STRING , NULL_STRING}
    Compilandolo in questo modo, dopo avere digitato i caratteri di ricerca sul controllo SELF:oDCListaTutor pigio il tasto ENTER, emette un beep ma non viene interpretato come un tasto KEYTAB.

    Sicuramente sbaglierò qualcosa ma le mie competenze sono insufficienti. :(
    Ti ringrazio per tutto il tempo che mi hai dedicato
    Attachments:

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 15:09 #25093

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3297
  • Ciao Claudio,

    prova a rimuovere il metodo "Constructor()"

    In .NET non esiste un metodo Init(), ma si chiama Constructor(). Per questo il compilatore traduce Init() in Constructor(), e visto che lavori in dialetto VO e i metodi sono definiti come "Clipper" non è possibile avere due metodi con lo stesso nome.

    Inoltre in C# il costruttore di una classe si chiama come la classe stessa, e questo spiega il messaggio di errore che potrebbe essere poco comprensibile.

    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 16:22 #25094

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Ciao Wolfgang

    grazie al tuo suggerimento non mi dà più alcun errore, né in compilazione né in esecuzione, ma purtroppo il tasto invio non viene interpretato come salto campo (KEYTAB).
    Rimando il nuovo codice ... possibilmente a qualcuno viene in mente qualche suggerimento
    CLASS EnhancedComboBox INHERIT ComboBox
      
    	METHOD Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle) CLASS EnhancedComboBox
    		SUPER:Init( oOwner, xID, oPoint, oDimension, kComboType, kStyle)
    	RETURN SELF
    	
    	METHOD Dispatch(oEvent) CLASS EnhancedComboBox
    		IF oEvent:Message = WM_GETDLGCODE .AND. oEvent:wParam = KEYENTER
    			IF IsInstanceOf(SELF:Owner, #DATAWINDOW)
    				SendMessage(SELF:Owner:oFormSurface:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ELSE
    				SendMessage(SELF:Owner:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ENDIF
    			RETURN 1L	
    		ENDIF
    	RETURN SUPER:Dispatch(oEvent)
    END CLASS

    Grazie comunque a tutti

    Claudio

    p.s. ho anche provato a sostituire la riga IF IsInstanceOf(SELF:Owner, #DATAWINDOW) con la riga IF IsInstanceOf(SELF:Owner, #AnaDoc2) dove AnaDoc2 e il nome della DATAWINDOW

    Please Log in or Create an account to join the conversation.

    Last edit: by claudiocarletta.

    ComboBox che non si apre 29 Jan 2023 16:33 #25095

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3297
  • Ciao Claudio,

    hai provato a mettere una chiamata a DebOut() nei vari posti del codice per capire cosa succede?
    Il metodo Dispatch() altrimenti è difficile da debuggare.
    Per rendere l'idea:
    METHOD Dispatch(oEvent) CLASS EnhancedComboBox
    		DebOut( "entrata Dispatch")
    		IF oEvent:Message = WM_GETDLGCODE .AND. oEvent:wParam = KEYENTER
    			DebOut( "ricevuto KEYENTER" )
    			IF IsInstanceOf(SELF:Owner, #DATAWINDOW)
    				DebOut( "Owner è DataWindow" )
    				SendMessage(SELF:Owner:oFormSurface:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ELSE
    				DebOut( "Owner non è DataWindow" )
    				SendMessage(SELF:Owner:Handle(),WM_NEXTDLGCTL, 0l, 0l)
    			ENDIF
    			RETURN 1L	
    		ENDIF
    	RETURN SUPER:Dispatch(oEvent)

    Saluti

    Wolfgang
    P.S. quello che DebOut() scrive puoi rilevare con DebugView++ (se usi XIDE): github.com/CobaltFusion/DebugViewPP/releases
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 16:45 #25096

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Uso Visual Studio ma provo lo stesso con il suo Debug

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 16:48 #25097

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3297
  • Ciao Claudio,
    con Visual Studio non hai bisogno di uno strumento supplementare per visualizzare questi messaggi - VS lo fa "di serie".
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre 29 Jan 2023 18:11 #25100

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Ciao Wolfgang
    ho modificato il codice perché altrimenti il programma sentiva il puntatore che entrava nell'area del controllo

    e non ci si capiva più nulla.
    In questo modo (debug su riga 461) avrebbe dovuto sentire solo la tastiera dentro il controllo ma il tasto KEYENTER non lo intercettava mai.
    Ho spostato il debug sulla riga 460 e non sentiva alcun tasto dentro il controllo. Entrava nel debug solamente quando un KEYTAB oppure un KEYTAB inverso faceva entrare il cursore dentro il controllo, ma wParam era sempre =0

    Sono piuttosto testardo ma ci sto quasi rinunciando
    Claudio :silly:
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by claudiocarletta.

    ComboBox che non si apre 29 Jan 2023 18:22 #25101

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3297
  • Ciao Claudio,
    WM_GETDLGCODE arriva solo con tasti molto specifici.
    Il ComboBox è un controllo strano perchè è composto da due controlli differenti: una listbox che si apre e una singlelineedit.
    In teoria si dovrebbe rintracciare entrambi i controlli ed intercettare quello che succede.
    Purtroppo non ho nessuna esperienza con questo e non posso dire niente, però ci sono altri esperti qui che magari possono aiutare.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    ComboBox che non si apre [RISOLTO] 29 Jan 2023 18:55 #25102

    • claudiocarletta
    • claudiocarletta's Avatar
    • Topic Author


  • Posts: 94
  • Ciao Wolfgang
    infatti mi ero accorto che questa sua dicotomia mostra degli inconvenienti.
    Se si cerca di controllare l'input con un FieldSpec non sente nulla, se viene riempito automaticamente da un elemento durante la selezione ho notato che mi dava un errore di stato in basso sulla Shell

    Nessun problema, tanto sono lavori scolastici mal pagati o per nulla pagati. ¿Come si dice?
    A caval donato ...

    Grazie comunque a tutti, ho imparato tante altre cose :woohoo:

    Please Log in or Create an account to join the conversation.

    Last edit: by claudiocarletta.
    • Page:
    • 1
    Moderators: wriedmann