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

Postby JmGarcia » Fri Feb 15, 2008 10:31 pm

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

Postby Loren » Fri Feb 15, 2008 11:18 pm

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

Postby JmGarcia » Sat Feb 16, 2008 10:49 am

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

Postby Manuel Aranda » Sat Feb 16, 2008 1:07 pm

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

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

Postby mmercado » Sat Feb 16, 2008 2:53 pm

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

Postby JmGarcia » Sat Feb 16, 2008 3:20 pm

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

Postby JmGarcia » Sat Feb 16, 2008 4:07 pm

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

Postby JmGarcia » Sat Feb 16, 2008 5:21 pm

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
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

Postby mmercado » Sat Feb 16, 2008 6:42 pm

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  Expand view
#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
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

Postby JmGarcia » Sat Feb 16, 2008 10:33 pm

mmercado wrote:
Code: Select all  Expand view
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
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

Postby mmercado » Sat Feb 16, 2008 10:55 pm

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

Postby Manuel Valdenebro » Sun Feb 17, 2008 7:26 am

Manuel,

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

Manuel
User avatar
Manuel Valdenebro
 
Posts: 706
Joined: Thu Oct 06, 2005 9:57 pm
Location: Málaga-España

Postby JmGarcia » Sun Feb 17, 2008 12:21 pm

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

Postby mmercado » Sun Feb 17, 2008 3:22 pm

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

Postby JmGarcia » Mon Feb 18, 2008 8:15 am

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 33 guests