ComboBox con get y añadir lo del get al array del combo
ComboBox con get y añadir lo del get al array del combo
Pues eso, a ver si me explico.
Deseo poner algo parecido al combobox pero con posibilidad de poder "teclear" lo que se quiera en un get que este "encima" de este combo.
Así cada vez que se teclee algo al dar al <intro> pase a aumentar el array del combo para posterior selección.
A la vez si deseamos volver a algo tecleado anteriormente solo dar a la flecha del combo y recorrerlo en busca de lo deseado y al seleccionar lo que se "ponga" en ese get para poder modificarlo o dejarlo igual o lo que sea.
No se si me he explicado.
Deseo poner algo parecido al combobox pero con posibilidad de poder "teclear" lo que se quiera en un get que este "encima" de este combo.
Así cada vez que se teclee algo al dar al <intro> pase a aumentar el array del combo para posterior selección.
A la vez si deseamos volver a algo tecleado anteriormente solo dar a la flecha del combo y recorrerlo en busca de lo deseado y al seleccionar lo que se "ponga" en ese get para poder modificarlo o dejarlo igual o lo que sea.
No se si me he explicado.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
JmGarcia, prueba con esto.... en teoria debería funcionar:
Define dialog
redefine combobox ocombobox var ccombo... on change(cambiarget())
redefine get oget var cget .... valid (newitem(cget))
....
activate dialog...
Funct newitem(cget)
local aItems:=ocombobox:aItems
if empty(cget)
return .f.
endif
AAdd(aItems,cget)
Asort(aItems)
ocombobox:setItems(aItems)
ocombobox:refresh()
return .t.
funct cambiarget
cget=ccombo
oget:refresh()
return
__________
Un saludo.
LORENZO
Define dialog
redefine combobox ocombobox var ccombo... on change(cambiarget())
redefine get oget var cget .... valid (newitem(cget))
....
activate dialog...
Funct newitem(cget)
local aItems:=ocombobox:aItems
if empty(cget)
return .f.
endif
AAdd(aItems,cget)
Asort(aItems)
ocombobox:setItems(aItems)
ocombobox:refresh()
return .t.
funct cambiarget
cget=ccombo
oget:refresh()
return
__________
Un saludo.
LORENZO
Loren, tengo un problema: Como "junto" el get y el combo en el mismo espacio fisico.
Con el mismo numero de ID de recurso no va.
Montando un recurso encima de otro tengo que tabular para cambiar de get/combo combo/get.
Ademas esta sentencia ocombobox:setItems(aItems) me da este erroe: Error BASE/1132 Bound error: array access
Con el mismo numero de ID de recurso no va.
Montando un recurso encima de otro tengo que tabular para cambiar de get/combo combo/get.
Ademas esta sentencia ocombobox:setItems(aItems) me da este erroe: Error BASE/1132 Bound error: array access
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
- Manuel Aranda
- Posts: 561
- Joined: Wed Oct 19, 2005 8:20 pm
- Location: España
Hola JMGarcia:
No se si es lo que estás buscando pero yo lo hago de esta manera y da resultado. Tengo una DBF con los conceptos que cargo en un array aConceptos y que muestro con un Combobox así:
REDEFINE COMBOBOX oConcepto VAR cConcepto ITEMS aConceptos ID 202 OF oDlg
Puedo elegir alguno de los registros existentes o teclear uno nuevo en el mismo combo.
Después, al cerrar el diálogo, si he tecleado uno nuevo, pregunto si se desea añadir el nuevo texto al fichero de conceptos. Si es así, la próxima vez que despliegues el combo está disponible el nuevo concepto añadido.
//
IF ASCAN(aConceptos, cConcepto) = 0
IF MsgYesNo("El Concepto: "+"´"+alltrim(cConcepto)+"´"+" no está en el fichero datos de conceptos. ¿Quiere añadirlo ahora?","Seleccione una opción" )
//
AADD(aConceptos, cConcepto)
ASORT(aConceptos)
//
IF CONCEPTO->(!RecLock(5))
ELSE
CONCEPTO->(DbAppend())
CONCEPTO->Concepto = cConcepto
CONCEPTO->(DbRunLock())
CONCEPTO->(DbCommit())
ENDIF
//
ENDIF
//
ENDIF
Saludos,
Manuel
No se si es lo que estás buscando pero yo lo hago de esta manera y da resultado. Tengo una DBF con los conceptos que cargo en un array aConceptos y que muestro con un Combobox así:
REDEFINE COMBOBOX oConcepto VAR cConcepto ITEMS aConceptos ID 202 OF oDlg
Puedo elegir alguno de los registros existentes o teclear uno nuevo en el mismo combo.
Después, al cerrar el diálogo, si he tecleado uno nuevo, pregunto si se desea añadir el nuevo texto al fichero de conceptos. Si es así, la próxima vez que despliegues el combo está disponible el nuevo concepto añadido.
//
IF ASCAN(aConceptos, cConcepto) = 0
IF MsgYesNo("El Concepto: "+"´"+alltrim(cConcepto)+"´"+" no está en el fichero datos de conceptos. ¿Quiere añadirlo ahora?","Seleccione una opción" )
//
AADD(aConceptos, cConcepto)
ASORT(aConceptos)
//
IF CONCEPTO->(!RecLock(5))
ELSE
CONCEPTO->(DbAppend())
CONCEPTO->Concepto = cConcepto
CONCEPTO->(DbRunLock())
CONCEPTO->(DbCommit())
ENDIF
//
ENDIF
//
ENDIF
Saludos,
Manuel
Re: ComboBox con get y añadir lo del get al array del combo
Eso es una propiedad ya definida en TComboBox (Estilo CB_DROPDOWN), revisa \FWH\Samples\Combos.prg. En el segundo ejemplo teclea "Dos" y verás que al salir de ese Combo, el array ha cambiado.JmGarcia wrote:Así cada vez que se teclee algo al dar al <intro> pase a aumentar el array del combo para posterior selección
Saludos
Manuel Mercado
Re: ComboBox con get y añadir lo del get al array del combo
He revisado el ejemplo PRG y el RC, creo que ya lo tengo.mmercado wrote:Eso es una propiedad ya definida en TComboBox (Estilo CB_DROPDOWN), revisa \FWH\Samples\Combos.prg...
Ahora solo me falta que al pulsar <INTRO> o un BOTON pueda saltar a una funcion definida por mi.
La clausula ON CHANGE no me vale ya que al seleccionar un item del combobox sale por ahi y puede que no haya terminado de rellenar el campo.
Imaginate que el item es "format" y depues de seleccionarlo deseo añadir en el get "c:/Q" y pulsar <INTRO> o BOTON (con el nombre, por ejemplo "Ejecutar") y saltar a una funcion pasandole de parametro "format c:/Q".
Por otro lado, y dentro del get, me gustaria que pulsando flecha arriba/abajo en el get me apareciesen los textos de los items del array del combobox. Flecha arriba el primero y sucesivos, flecha abajo retroceder en la posicion.
Ademas el tema del SCROLL-VERTICAL no logro que me salga.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Me contesto yo mismo:
Solo me queda el tema del SCROLL-VERTICAL, no logro que me salga.
Con esto esta hecho oCombo:bKeyDown:={|nK|iif(nK==VK_RETURN,MiFuncion(),)}JmGarcia wrote:Ahora solo me falta que al pulsar <INTRO> o un BOTON pueda saltar a una funcion definida por mi.
Pues lo hace solito en Combobox.JmGarcia wrote:Por otro lado, y dentro del get, me gustaria que pulsando flecha arriba/abajo en el get me apareciesen los textos de los items del array del combobox. Flecha arriba el primero y sucesivos, flecha abajo retroceder en la posicion.
Solo me queda el tema del SCROLL-VERTICAL, no logro que me salga.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Re: ComboBox con get y añadir lo del get al array del combo
Podrías agregar lo siguiente:JmGarcia wrote: La clausula ON CHANGE no me vale ya que al seleccionar un item del combobox sale por ahi y puede que no haya terminado de rellenar el campo
Code: Select all
#define MAX_GET_LEN 10
oCbx:oGet:bChange := { || AutoComplete( oCbx, MAX_GET_LEN ) }
//----------------------------------------------------------------------------//
Static Function AutoComplete( oCbx, nLen )
LOCAL cBuffer, nEle, ;
nPos := oCbx:oGet:nPos
If oCbx == Nil
Return Nil
EndIf
Default nLen := 10
cBuffer := SubStr( oCbx:oGet:oGet:Buffer, 1, nPos - 1 )
IF ( nEle := ASCAN( oCbx:aItems, {|e| Upper( e ) = Upper( cBuffer ) } ) ) > 0
oCbx:oGet:oGet:Buffer := PadR( oCbx:aItems[ nEle ], nLen )
oCbx:oGet:Assign()
oCbx:oGet:Refresh()
oCbx:oGet:SetPos( nPos )
Else
oCbx:oGet:oGet:Buffer := PadR( cBuffer, nLen )
oCbx:oGet:Assign()
oCbx:oGet:Refresh()
oCbx:oGet:SetPos( nPos )
END
Return Nil
//----------------------------------------------------------------------------//
Static Function cProper( cText )
Return Upper( SubStr( cText, 1, 1 ) ) + Lower( SubStr( cText, 2 ) )
Manuel Mercado
Re: ComboBox con get y añadir lo del get al array del combo
Me da este error Error BASE/1110 Argument error: SUBSTR en la linea del SubStr...mmercado wrote:Code: Select all
cBuffer := SubStr( oCbx:oGet:oGet:Buffer, 1, nPos - 1 )
Por otro lado: como funciona esta subrrutina. Puedo entender que según vas tecleando se puede llegar a completar el texto si algun item del array del combo comienza igual...
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Re: ComboBox con get y añadir lo del get al array del combo
Tomando el mismo ejemplo de FWH Samples:JmGarcia wrote:Por otro lado: como funciona esta subrrutina. Puedo entender que según vas tecleando se puede llegar a completar el texto si algun item del array del combo comienza igual...
Code: Select all
// Showing the use of different styles of ComboBoxes controls
#include "FiveWin.ch"
#include "Combos.ch"
#define GET_MAX_LEN 10
//----------------------------------------------------------------------------//
function Main()
local oDlg, oSay
local oCbx1, oCbx2, oCbx3
local cItem1, cItem2 := "One", cItem3, cItem4 := "None"
SET _3DLOOK ON
SetDebug()
DEFINE DIALOG oDlg RESOURCE "Combos"
REDEFINE COMBOBOX oCbx1 VAR cItem1 ITEMS { "One", "Two", "Three" } ;
ID ID_SIMPLE OF oDlg ;
ON CHANGE ( cItem4 := cItem1, oSay:Refresh() ) ;
VALID ( cItem4 := cItem1, oSay:Refresh(), .t. )
REDEFINE COMBOBOX oCbx2 VAR cItem2 ITEMS { "One", "Two", "Three" } ;
ID ID_DROPDOWN OF oDlg ;
STYLE CBS_DROPDOWN ;
VALID ( If( ! oCbx2:Find( oCbx2:oGet:GetText() ), oCbx2:Add( cProper( oCbx2:oGet:GetText() ) ),), .t. )
oCbx2:oGet:bChange := {|| AutoComplete( oCbx2, GET_MAX_LEN )}
REDEFINE COMBOBOX oCbx3 VAR cItem3 ITEMS { "One", "Two", "Three" } ;
ID ID_DROPDOWNLIST OF oDlg ;
ON CHANGE ( cItem4 := cItem3, oSay:Refresh() ) ;
VALID ( cItem4 := cItem3, oSay:Refresh(), .t. )
REDEFINE SAY oSay PROMPT cItem4 ID ID_SELECTION OF oDlg COLOR "R+/W"
ACTIVATE DIALOG oDlg CENTERED
return nil
//----------------------------------------------------------------------------//
Static Function AutoComplete( oCbx, nLen )
LOCAL cBuffer, nEle, ;
nPos := oCbx:oGet:nPos
If oCbx == Nil
Return Nil
EndIf
Default nLen := 10
cBuffer := SubStr( oCbx:oGet:oGet:Buffer, 1, nPos - 1 )
fDebug( cBuffer )
IF ( nEle := ASCAN( oCbx:aItems, {|e| Upper( e ) = Upper( cBuffer ) } ) ) > 0
oCbx:oGet:oGet:Buffer := PadR( oCbx:aItems[ nEle ], nLen )
oCbx:oGet:Assign()
oCbx:oGet:Refresh()
oCbx:oGet:SetPos( nPos )
Else
oCbx:oGet:oGet:Buffer := PadR( cBuffer, nLen )
oCbx:oGet:Assign()
oCbx:oGet:Refresh()
oCbx:oGet:SetPos( nPos )
END
Return Nil
//----------------------------------------------------------------------------//
Static Function cProper( cText )
Return Upper( SubStr( cText, 1, 1 ) ) + Lower( SubStr( cText, 2 ) )
Saludos
Manuel Mercado
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
A mi no me las encuentra:Manuel Valdenebro wrote:Manuel,
Que son las funciones SetDebug() y fDebug()
Error: Unresolved external '_HB_FUN_SETDEBUG' referenced from E:\COMBOS_AUTOCOMPLETE.OBJ
Error: Unresolved external '_HB_FUN_FDEBUG' referenced from E:\COMBOS_AUTOCOMPLETE.OBJ
Las he comentado en el código y funciona. Supongo que son el DEBUG.
Pues si funciona, vere de adaptarlo a mi codigo.mmercado wrote:Tomando el mismo ejemplo de FWH Samples
Muchas gracias Manuel.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Hola Manuel:
Saludos
Manuel Mercado
Es un debugger rústico casero que utilizo en mis desarrollos para testear valores de variables y detectar puntos de error, es muy elemental pero me ha sido de una gran utilidad. El programa Debug.prg lo puedes encontrar en \TSBrowse\Samples.Manuel Valdenebro wrote:Que son las funciones SetDebug() y fDebug()
Saludos
Manuel Mercado
Pues sigo si poder adaptarlo, pondré el código fuente cuando lo tenga ya terminado.JmGarcia wrote:Pues si funciona, vere de adaptarlo a mi codigo.mmercado wrote:Tomando el mismo ejemplo de FWH Samples
Muchas gracias Manuel.
Por otro lado, NO consigo que el campo GET del Combobox se desplace horizontalmente a la izquierda cuando llego escribiendo al final de la derecha.
Code: Select all
@ 10,100 COMBOBOX oCombo VAR cCombo ITEMS aCombo SIZE 650,200 OF oWnd ;
STYLE CBS_DROPDOWN PIXEL FONT oFont ;
VALID (iif(.not. oCombo:Find(oCombo:oGet:GetText()),;
oCombo:Insert(left(alltrim(oCombo:oGet:GetText())+space(MAX_PATH),MAX_PATH),1),),.T.)
oCombo:bKeyDown:={|nK|iif(nK==VK_RETURN,EnviaComando(alltrim(oCombo:oGet:GetText()),aSeleccion),nil)}
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013