Clase TGET bKeyDown, bChange
Posted: Tue Jan 08, 2008 12:22 pm
Estoy teniendo unos problemas tremendos con la clase TGET con Harbour.
Resulta que tenia una clase modificada para usar el tema de los colores de foco, he visto que en Fivewin se ha puesto lo mismo usando la funcion SetGetColorFocus( nColoR ), que realiza exactamente lo mismo.
El problema , es que el código fuente que tengo, aparte de eso, uso un GET para buscar en un browse de esta manera:
Por encima, la explicacion;
Si algo cambia en el GET, bChange, voy a saltar a FASTSEEK.
Si tomo el foco, me voy al final del GET; bGotFocus.
Si presiono, F2 o F3, ejecuta la accion del tab correspondiente.
El method FastSeek()
El problema que xCadena SIEMPRE es la tecla pulsada, es más, NO FUNCIONA la tecla BackSpace, teclas derecha e izquierda en el GET,
¿ Porque ?
Joder, esto funcionaba de pelotas, y ahora estoy teniendo una de problemas con Harbour/xHarbour, me desanimo bastante estos problemas, que costaron en su día y volver a pelearse con ello, pues la verdad es que desespera hasta el más pintado.
Llevo toda la mañana para esta tonteria, haber si alguien me algo que se me escapa.
Resulta que tenia una clase modificada para usar el tema de los colores de foco, he visto que en Fivewin se ha puesto lo mismo usando la funcion SetGetColorFocus( nColoR ), que realiza exactamente lo mismo.
El problema , es que el código fuente que tengo, aparte de eso, uso un GET para buscar en un browse de esta manera:
Code: Select all
::oGet:bChange := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }
::oGet:bGotFocus := {|| if(!Empty( ::oGet:VarGet ),::oGet:KeyDown( VK_END ),) }
::oGet:bKeyDown := {| nKey, nFlags | iif( nKey == VK_F3, ::NextTabOption(),;
iif( nKey == VK_F2, ::PrevTabOption(), ) ), 0 }
Si algo cambia en el GET, bChange, voy a saltar a FASTSEEK.
Si tomo el foco, me voy al final del GET; bGotFocus.
Si presiono, F2 o F3, ejecuta la accion del tab correspondiente.
El method FastSeek()
Code: Select all
METHOD FastSeek( nKey, nFlags ) CLASS TMANTI
local cType
local xCadena
local nRecNo
local nOrd
local oGet := ::oGet
Local cKey := ( ::oDbf:cAlias() )->( &(IndexKey() )) // Tipo de expresion en el indice
Local cExpIndex := ( ::oDbf:cAlias() )->( IndexKey() )
Local cTexto, cText, nPos := 0, nLen := 0, xText
DEFAULT nKey := 0
oGet:Assign()
xCadena := SubStr( oGet:varGet(), 1, oGet:nPos - 1 ) + Chr( nKey )
// Si esta dtos y la posicion que ocupa sea < 3
if upper("dtos") $ upper(cExpIndex) .AND. ( ( nPos := At( "dtos" , cExpIndex ) ) < 3 )
if len(xCadena) >= 8
::oDbf:Seek( DTOS( CTOD( xCadena ) ) , .T. )
endif
elseif upper("str") $ upper( cExpIndex ) .AND. ( ( nPos := At( "str" , cExpIndex ) ) < 3 )
nPos := At( "," , cExpIndex ) // Busco la ,
if nPos != 0
cTexto := SubStr( cExpIndex, nPos+1 ) // Cadena a partir de la ","
nPos := At( ")", cTexto ) // Busco el ")"
if nPos != 0
cText := SubStr( cTexto, 1, nPos -1 ) // cText := 'Str(cadena, nLen)'
nLen := Val( cText ) // Longitud
xText := Val( xCadena ) // valor
::oDbf:Seek( str( xText, nLen ), .T. )
endif
endif
elseif Valtype( cKey ) == "D"
if len(xCadena) >= 8
::oDbf:Seek( CTOD( xCadena ) , .T. )
endif
else
::oDbf:Seek( if(Valtype(cKey) != "N",xCadena, VAL( xCadena ) ) , .T. )
endif
::oBrw:refresh()
IF ::lSplitter // Evaluamos el bChange del master
if ::oDbf:Eof()
::oBrw:GoBottom() // Pos en el ultimo, para que evalua posteriormente bien el bChange
::oBrw:Refresh()
SysRefresh()
endif
Eval( ::oBrw:bChange, Self )
ENDIF
#ifdef _HARBOUR__
::cBusca := xCadena + SPACE( 50 ) // La suma es por un BUG en FHW/HArbour
#else
::cBusca := xCadena
#endif
return .T.
¿ Porque ?
Joder, esto funcionaba de pelotas, y ahora estoy teniendo una de problemas con Harbour/xHarbour, me desanimo bastante estos problemas, que costaron en su día y volver a pelearse con ello, pues la verdad es que desespera hasta el más pintado.
Llevo toda la mañana para esta tonteria, haber si alguien me algo que se me escapa.