Hola amigo:
Yo utilizo algo como lo que pides, pero a ver como te lo explico. Lo intento... Este es el codigo del GET que tiene un bitmap (como puedes comprobar) tambien tengo en cuenta si el usuario pulsa simplemente Enter
que se lance la busqueda del codigo, tambien que pulse la tecla + , utilizo en ello dos funciones una trivial rellena() en la cual relleno automaticamente con ceros a la izquierda , la puedes desechar si quieres y luego
la de la busqueda en si que es un dialogo en el que se muestra el browse y permite buscar.
Se podria mejorar muchisimo con busqueda incremental, no lo he conseguido nunca desde un dialogo, tambien el codigo sera muy mejorable, pero a mi me funciona.
Ah veras que utilizo listbox en vez de XBrowse , no he conseguido nunca colocar los botones arriba del Xbrowse y que se vean bien, lo tengo pendiente, puedes probar tu.
Tambien veras que en la funciona hay uN DO CASE, ya que utilizo el mismo dialogo para todas las tablas que busco, ajusta tu, tus alias y las tablas que quieres buscar
A ver por partes.
codigo del GET
Code: Select all | Expand
REDEFINE GET oObra VAR cObra ID 101 BITMAP "OBRAS1" OF oDlg PICTURE "9999" ;
ACTION ( cObra := Busqueda( cAlias ), oInicio:SetFocus(), oDlg:UPDATE() ) ;
VALID ( Rellena( oObra ) ) .AND. ;
( IF( Obr->( dbSeek( cObra ) ), ( oDlg:UPDATE(), .T. ), ;
( cObra := Busqueda( "Obr" ), oSayObra:Refresh(), oInicio:SetFocus(), oDlg:UPDATE(), .T. ) ) ) UPDATE
oObra:bGotfocus := { || oWndMain:SetMsg( "Codigo de obra.Tecla <+> permite buscar" ) }
oObra:bKeyDown := { | nKey | IIf( nKey = VK_ADD, ( cObra := Busqueda( "Obr" ), oDlg:UPDATE(), oInicio:SetFocus() ), ) }
Codigo funciones Rellena y Busqueda
Code: Select all | Expand
FUNCTION Rellena( oVar1 )
LOCAL cValor
cValor := oVar1:cText() // Recupera el valor del Objeto Get
IF ! Empty( cValor )
cValor := PadL( AllTrim( cValor ), Len( cValor ), "0" )
oVar1:cText( cValor ) // Asigna el valor con Ceros al objeto Get
oVar1:Refresh() // le indico al objeto Get, que se vuelva a pintar
ENDIF
RETURN .T.
// ------------------------------------------------------------------------
FUNCTION Busqueda( cAlias )
LOCAL xVret
LOCAL oDlg, oBrw
LOCAL oRad, oBusqueda, oSayCodigo, oSayNombre
LOCAL nRad, cBusqueda
LOCAL oDbf
LOCAL lanzaEdit, lanzaAdd
LOCAL cBloqueEdit, cBloqueAdd, bBloqueEdit, bBloqueAdd
LOCAL cIndice := ( cAlias ) ->( ordSetFocus() )
dbSelectArea( cAlias )
DATABASE oDbf
DEFINE DIALOG oDlg NAME "BUSCAR" ;
TITLE "Buscar Registro"
// El alias puede ser Prov,Art,Trab,Obr. Hay que adaptarlo a los alias a buscar
DO CASE
CASE cAlias = "Prov"
lanzaEdit := "EditProve(.F.)"
lanzaAdd := "EditProve(.T.)"
CASE cAlias = "Obr"
lanzaEdit := "EditObras(.F.)"
lanzaAdd := "EditObras(.T.)"
CASE cAlias = "Trab"
lanzaEdit := "EditTraba(.F.)"
lanzaAdd := "EditTraba(.T.)"
CASE cAlias = "Art"
lanzaEdit := "EditArti(.F.)"
lanzaAdd := "EditArti(.T.)"
END CASE
cBloqueEdit := "{ |oBrw| " + lanzaEdit + ",oBrw:Refresh(),oBrw:SetFocus() }"
cBloqueAdd := "{ |oBrw| " + lanzaAdd + ",oBrw:Refresh(),oBrw:SetFocus() }"
bBloqueEdit := &( cBloqueEdit )
bBloqueAdd := &( cBloqueAdd )
nRad := Space( 1 )
nRad := 2
/* oDbf:SetOrder(2)
cBusqueda:=SPACE(15) */
REDEFINE SAY oSayCodigo PROMPT IF( nRad == 1, "Codigo", "Nombre" ) ID 99 OF oDlg COLOR CLR_GREEN UPDATE
REDEFINE SAY oSayNombre PROMPT ( cAlias ) ->Nombre ID 98 OF oDlg COLOR CLR_RED UPDATE
REDEFINE GET oBusqueda VAR cBusqueda ID 100 OF oDlg ;
PICTURE "@!" ON CHANGE ( ::Assign(), IIf( oDbf:SEEK( cBusqueda ), ( oBrw:UpStable(), oDlg:UPDATE() ), ) )
REDEFINE RADIO oRad VAR nRad ID 102, 103 OF oDlg ;
ON CHANGE ( IF( nRad == 1, ( oDbf:SetOrder( 1 ), cBusqueda := Space( 4 ) ), ( oDbf:SetOrder( 2 ), cBusqueda := Space( 15 ) ) ), oBusqueda:SetFocus() ) ;
VALID ( IF( nRad == 1, oSayCodigo := "Codigo", oSayCodigo := "Nombre" ), oDlg:UPDATE(), .T. ) UPDATE
REDEFINE BTNBMP ID 109 RESOURCE "ADD1" OF oDlg ACTION Eval( bBloqueAdd, oBrw ) TOOLTIP "Añadir egistros" NOBORDER // Añade un registro
REDEFINE BTNBMP ID 108 RESOURCE "EDIT1" OF oDlg ACTION Eval( bBloqueEdit, oBrw ) TOOLTIP "Modificar registros" NOBORDER // Modifica un regitro
REDEFINE BTNBMP ID 104 RESOURCE "SELECT1" OF oDlg ACTION ( xVret := ( cAlias ) ->Codigo, oDlg:END() ) TOOLTIP "Seleccionar registro" NOBORDER // Selecciona
REDEFINE BTNBMP ID 105 RESOURCE "EXIT3" OF oDlg ACTION ( xVret := ( cAlias ) ->Codigo, oDlg:END() ) TOOLTIP "Abandona busqueda" NOBORDER
REDEFINE LISTBOX oBrw FIELDS oDbf:Codigo, oDbf:Nombre ;
Alias (cAlias) HEADERS "CODIGO", "NOMBRE" ;
ON CHANGE ( oSayNombre := ( cAlias ) ->Nombre, oDlg:UPDATE() ) ;
ON DBLCLICK ( xVret := ( cAlias ) ->Codigo, oDlg:END() ) ;
ID 106 OF oDlg UPDATE
oDbf:Gotop()
oBrw:bSkip = { | nRecs | oDbf:Skipper( nRecs ) }
oBrw:nLineStyle := 3 // ( Puede asumir valores 0 a 10 ) 1,3
oBrw:bGotFocus := { || oBrw:Refresh() }
oBrw:bKeyDown := { | nKey | IIf( nKey = 13, ( xVret := ( cAlias ) ->Codigo, oDlg:END() ), ) }
ACTIVATE DIALOG oDlg CENTERED ON INIT ( oDbf:SetOrder( 2 ), cBusqueda := Space( 15 ), oBusqueda:SetFocus() ) ;
VALID ( xVret := ( cAlias ) ->Codigo, ( cAlias ) ->( ordSetFocus( cIndice ) ), .T. )
RETURN ( xVret )
// -------------------------------------------------------------------------
y el codigo del del dialogo que debes incluir a tu .RC
Code: Select all | Expand
LANGUAGE LANG_SPANISH, SUBLANG_SPANISH_MODERN
BUSCAR DIALOG 26, 47, 274, 173
STYLE DS_3DLOOK | DS_MODALFRAME | DS_SETFONT | WS_CAPTION | WS_POPUP | WS_SYSMENU
CAPTION "LOCALIZACION REGISTRO"
FONT 10, "Arial"
{
EDITTEXT 100, 8, 32, 204, 12, WS_GROUP, WS_EX_LEFT
CONTROL "", 106, "TWBrowse", 0x50A30000, 0, 68, 268, 102, 0x00000000
AUTORADIOBUTTON "Código", 102, 224, 20, 36, 10, 0, WS_EX_LEFT
AUTORADIOBUTTON "Nombre", 103, 224, 40, 36, 10, 0, WS_EX_LEFT
GROUPBOX "Busqueda", 101, 219, 1, 49, 63, 0, WS_EX_LEFT
LTEXT ".", 99, 79, 20, 69, 8, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
LTEXT "", 98, 12, 10, 121, 8, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
LTEXT "Búsqueda por :", -1, 11, 20, 51, 9, NOT WS_GROUP | SS_LEFT, WS_EX_LEFT
GROUPBOX "", 4001, 4, 0, 213, 64, 0, WS_EX_LEFT
PUSHBUTTON "", 109, 8, 48, 18, 14, BS_BITMAP, WS_EX_LEFT
PUSHBUTTON "", 108, 28, 48, 18, 14, BS_BITMAP, WS_EX_LEFT
PUSHBUTTON "", 104, 48, 48, 18, 14, BS_BITMAP, WS_EX_LEFT
PUSHBUTTON "", 105, 68, 48, 18, 14, BS_BITMAP, WS_EX_LEFT
}
Posdata, si quieres los bitmaps te los puedo enviar pero puedes usar los de tu eleccion eso no es problema.
Ya te digo que este tema es mejorable pero a mi me funciona.
Un saludo
Jose