ComboBox che non si apre [RISOLTO]

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

ComboBox che non si apre [RISOLTO]

Post by claudiocarletta »

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:

Code: Select all

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
Immagine 2023-01-28 132059.jpg
Immagine 2023-01-28 132059.jpg (75.6 KiB) Viewed 1925 times
Cosa mi suggerite?
Vi ricordo che adopero X# nel dialetto VO

Grazie a tutti
Claudio
Jamal
Posts: 321
Joined: Mon Jul 03, 2017 7:02 pm

ComboBox che non si apre

Post by Jamal »

Claudio,

To open the combobox and set focus to it, you can use the following:

Code: Select all

SendMessage(self:oDCListaTutor:Handle(), CB_SHOWDROPDOWN, 1, 0)
self:oDCListaTutor:SetFocus() 
Jamal
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

ComboBox che non si apre

Post by claudiocarletta »

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
Jamal
Posts: 321
Joined: Mon Jul 03, 2017 7:02 pm

ComboBox che non si apre

Post by Jamal »

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:

Code: Select all

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
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

ComboBox che non si apre

Post by claudiocarletta »

Ho l'impressione che io sia ad un livello troppo basso per capire il tuo suggerimento.
Penso di dover inserire la classe (vedi figura)
Immagine 2023-01-28 194143.jpg
Immagine 2023-01-28 194143.jpg (71.07 KiB) Viewed 1925 times
ma non ho idea di dove mettere il codice che mi hai inviato :(
Ho paura che ti sto impegnando troppo
Scusami
Jamal
Posts: 321
Joined: Mon Jul 03, 2017 7:02 pm

ComboBox che non si apre

Post by Jamal »

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

The complete code is below:

Code: Select all

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
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

ComboBox che non si apre

Post by claudiocarletta »

Purtroppo non sono riuscito a compilarlo, mi da questo errore:
Immagine 2023-01-29 110915.jpg
Immagine 2023-01-29 110915.jpg (127.61 KiB) Viewed 1926 times
riesco a compilarlo solo se eseguo queste modifiche:

Code: Select all

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:

Code: Select all

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
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

ComboBox che non si apre

Post by wriedmann »

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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

ComboBox che non si apre

Post by claudiocarletta »

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

Code: Select all

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
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

ComboBox che non si apre

Post by wriedmann »

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:

Code: Select all

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): https://github.com/CobaltFusion/DebugViewPP/releases
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply