Page 1 of 1
ComboBox con get y añadir lo del get al array del combo
Posted: Fri Feb 15, 2008 10:31 pm
by JmGarcia
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.
Posted: Fri Feb 15, 2008 11:18 pm
by Loren
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
Posted: Sat Feb 16, 2008 10:49 am
by JmGarcia
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
Posted: Sat Feb 16, 2008 1:07 pm
by Manuel Aranda
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
Re: ComboBox con get y añadir lo del get al array del combo
Posted: Sat Feb 16, 2008 2:53 pm
by mmercado
JmGarcia wrote:Así cada vez que se teclee algo al dar al <intro> pase a aumentar el array del combo para posterior selección
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.
Saludos
Manuel Mercado
Posted: Sat Feb 16, 2008 3:20 pm
by JmGarcia
A ver si con este grafico me explico:
Re: ComboBox con get y añadir lo del get al array del combo
Posted: Sat Feb 16, 2008 4:07 pm
by JmGarcia
mmercado wrote:Eso es una propiedad ya definida en TComboBox (Estilo CB_DROPDOWN), revisa \FWH\Samples\Combos.prg...
He revisado el ejemplo PRG y el RC, creo que ya lo tengo.
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.
Posted: Sat Feb 16, 2008 5:21 pm
by JmGarcia
Me contesto yo mismo:
JmGarcia wrote:Ahora solo me falta que al pulsar <INTRO> o un BOTON pueda saltar a una funcion definida por mi.
Con esto esta hecho
oCombo:bKeyDown:={|nK|iif(nK==VK_RETURN,MiFuncion(),)}
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.
Pues lo hace solito en Combobox.
Solo me queda el tema del SCROLL-VERTICAL, no logro que me salga.
Re: ComboBox con get y añadir lo del get al array del combo
Posted: Sat Feb 16, 2008 6:42 pm
by mmercado
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
Podrías agregar lo siguiente:
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 ) )
Saludos
Manuel Mercado
Re: ComboBox con get y añadir lo del get al array del combo
Posted: Sat Feb 16, 2008 10:33 pm
by JmGarcia
mmercado wrote:Code: Select all
cBuffer := SubStr( oCbx:oGet:oGet:Buffer, 1, nPos - 1 )
Me da este error
Error BASE/1110 Argument error: SUBSTR en la linea del SubStr...
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...
Re: ComboBox con get y añadir lo del get al array del combo
Posted: Sat Feb 16, 2008 10:55 pm
by mmercado
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...
Tomando el mismo ejemplo de FWH Samples:
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 ) )
Usa el segundo combobox, escribe t y luego h o escribe lo que quieras para agregar un nuevo item
Saludos
Manuel Mercado
Posted: Sun Feb 17, 2008 7:26 am
by Manuel Valdenebro
Manuel,
Que son las funciones SetDebug() y fDebug()
Posted: Sun Feb 17, 2008 12:21 pm
by JmGarcia
Manuel Valdenebro wrote:Manuel,
Que son las funciones SetDebug() y fDebug()
A mi no me las encuentra:
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.
mmercado wrote:Tomando el mismo ejemplo de FWH Samples
Pues si funciona, vere de adaptarlo a mi codigo.
Muchas gracias Manuel.
Posted: Sun Feb 17, 2008 3:22 pm
by mmercado
Hola Manuel:
Manuel Valdenebro wrote:Que son las funciones SetDebug() y fDebug()
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.
Saludos
Manuel Mercado
Posted: Mon Feb 18, 2008 8:15 am
by JmGarcia
JmGarcia wrote:mmercado wrote:Tomando el mismo ejemplo de FWH Samples
Pues si funciona, vere de adaptarlo a mi codigo.
Muchas gracias Manuel.
Pues sigo si poder adaptarlo, pondré el código fuente cuando lo tenga ya terminado.
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)}