ComboBox con get y añadir lo del get al array del combo

Post Reply
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

ComboBox con get y añadir lo del get al array del combo

Post 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.
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
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Post 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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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
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
User avatar
Manuel Aranda
Posts: 561
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Post 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
User avatar
mmercado
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Re: ComboBox con get y añadir lo del get al array del combo

Post 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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post by JmGarcia »

A ver si con este grafico me explico:

Image
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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: ComboBox con get y añadir lo del get al array del combo

Post 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.
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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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.
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
User avatar
mmercado
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Re: ComboBox con get y añadir lo del get al array del combo

Post 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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Re: ComboBox con get y añadir lo del get al array del combo

Post 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...
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
User avatar
mmercado
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Re: ComboBox con get y añadir lo del get al array del combo

Post 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
User avatar
Manuel Valdenebro
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Post by Manuel Valdenebro »

Manuel,

Que son las funciones SetDebug() y fDebug()
Un saludo

Manuel
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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.
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
User avatar
mmercado
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Post 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
User avatar
JmGarcia
Posts: 654
Joined: Mon May 29, 2006 3:14 pm
Location: Madrid - ESPAÑA

Post 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)}  
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
Post Reply