Page 1 of 2
ComboBox che non si apre [RISOLTO]
Posted: Sat Jan 28, 2023 12:43 pm
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 (75.6 KiB) Viewed 1868 times
Cosa mi suggerite?
Vi ricordo che adopero X# nel dialetto VO
Grazie a tutti
Claudio
ComboBox che non si apre
Posted: Sat Jan 28, 2023 5:38 pm
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
ComboBox che non si apre
Posted: Sat Jan 28, 2023 5:59 pm
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
ComboBox che non si apre
Posted: Sat Jan 28, 2023 6:27 pm
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
ComboBox che non si apre
Posted: Sat Jan 28, 2023 6:48 pm
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 (71.07 KiB) Viewed 1868 times
ma non ho idea di dove mettere il codice che mi hai inviato
Ho paura che ti sto impegnando troppo
Scusami
ComboBox che non si apre
Posted: Sat Jan 28, 2023 11:40 pm
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
ComboBox che non si apre
Posted: Sun Jan 29, 2023 10:25 am
by claudiocarletta
Purtroppo non sono riuscito a compilarlo, mi da questo errore:
- Immagine 2023-01-29 110915.jpg (127.61 KiB) Viewed 1869 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
ComboBox che non si apre
Posted: Sun Jan 29, 2023 2:09 pm
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
ComboBox che non si apre
Posted: Sun Jan 29, 2023 3:22 pm
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
ComboBox che non si apre
Posted: Sun Jan 29, 2023 3:33 pm
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