Page 1 of 1

Clase TGET bKeyDown, bChange

Posted: Tue Jan 08, 2008 12:22 pm
by thefull
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:

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 }
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()

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.

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.

Re: Clase TGET bKeyDown, bChange

Posted: Tue Jan 08, 2008 12:35 pm
by FiveWiDi
thefull wrote: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:

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 }
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()

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.

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.
Busca mensajes sobre bpostkey y bchange; si no me equivoco cambió/añadió comportamiento a TGet desdes versión 0704.

Creo que te ahorrabas hacer oGet:Assign().

Que versión de FWH tienes?
...

He mirado mi código; intenta cambiar
::oGet:bChange := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }
por:
::oGet:bPostKey := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }

y deja de usar oGet:Assign().


Saludos y suerte.
Carlos G.

Re: Clase TGET bKeyDown, bChange

Posted: Tue Jan 08, 2008 12:52 pm
by thefull
FiveWiDi wrote:
thefull wrote: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:

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 }
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()

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.

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.
Busca mensajes sobre bpostkey y bchange; si no me equivoco cambió/añadió comportamiento a TGet desdes versión 0704.

Creo que te ahorrabas hacer oGet:Assign().

Que versión de FWH tienes?
...

He mirado mi código; intenta cambiar
::oGet:bChange := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }
por:
::oGet:bPostKey := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }

y deja de usar oGet:Assign().


Saludos y suerte.
Carlos G.
Gracias Carlos voy a ver lo que dices.

Estoy intentado cambiar desde la 2.7 a la 7.12, pero bajo mi punto de vista, y no es la primera vez que me pasa, es que cuando intento usar una version nueva , ya sea de Fivewin / Harbour, empiezo precisamente con esto, Y LO ODIO! porque vuelvo a perder el tiempo en cosas que no deberia.

Eso si, decir que Antonio me ha brindado un soporte EXCELENTE!, pero no voy a estar llamandole cada 5 minutos, que seguro que alguien le a pasado algo similar...

Y ya puesto. ¿ Has probado si con xHarbour/FWH se te queda colgado según le parece... ? Con Harbour no tengo problemas, estoy pasandolo todo a Harbour, y mirar de usar los 2 a la vez, pero donde unas cosas me funcionan en uno, en el otro no funciona, por ejemplo;
DATA hHeap AS NUMERIC INIT 0 // Own heap for @ ..., ... GET
Eso lo inicializa bien xHarbour, Harbour simplemete me casca en Runtime a la hora de usar la clase TGet hHeap.

Y como eso , de tooooo.... aburrido toy, coño, jajaja.... ;-)

Re: Clase TGET bKeyDown, bChange

Posted: Tue Jan 08, 2008 1:14 pm
by FiveWiDi
thefull wrote:Gracias Carlos voy a ver lo que dices.

Estoy intentado cambiar desde la 2.7 a la 7.12, pero bajo mi punto de vista, y no es la primera vez que me pasa, es que cuando intento usar una version nueva , ya sea de Fivewin / Harbour, empiezo precisamente con esto, Y LO ODIO! porque vuelvo a perder el tiempo en cosas que no deberia.

Eso si, decir que Antonio me ha brindado un soporte EXCELENTE!, pero no voy a estar llamandole cada 5 minutos, que seguro que alguien le a pasado algo similar...

Y ya puesto. ¿ Has probado si con xHarbour/FWH se te queda colgado según le parece... ? Con Harbour no tengo problemas, estoy pasandolo todo a Harbour, y mirar de usar los 2 a la vez, pero donde unas cosas me funcionan en uno, en el otro no funciona, por ejemplo;
DATA hHeap AS NUMERIC INIT 0 // Own heap for @ ..., ... GET
Eso lo inicializa bien xHarbour, Harbour simplemete me casca en Runtime a la hora de usar la clase TGet hHeap.

Y como eso , de tooooo.... aburrido toy, coño, jajaja.... ;-)
No he usado nunca xHarbour y mi manera de trabajar es muy elemental/básica/estándar com pocos inventos; intento evitar problemas como los que comentas.

Por cierto en declaraciones en las clases del tipo:
DATA mivariable AS NUMERIC INIT 0
había algún caso en que debí eliminar "AS ...", ahora no recuerdo que tipo de variable era. (cosas del desarrollo de Harbour).

Saludos y suerte.
Y vete a comer que són las 2. A las 4 lo verás diferente.
Carlos G.

Re: Clase TGET bKeyDown, bChange

Posted: Tue Jan 08, 2008 3:48 pm
by thefull
Bueno, despues de volver de comer, vemos que;
En bCHange, hay que cambiarlo por;

::oGet:bPostKey := {| This, cBuffer | ::FastSeek( This, cBuffer ) }

Y he tenido que modifcar el METHOD FastSeek() para esta nueva implementación, por lo que ahora me funciona correctamente, las teclas BACK, LEFT, RIGTH en el GET...

Pero el problema es que ahora las teclas F2, F3 si las conecto atraves del
codeblock bKeyDown, entonces no me funciona el BACK, LEFT, RIGTH del GET....

¿ A cambio alguna cosa tambien en este ? Pues parece que si, antes tenia esto;

Code: Select all

       ::oGet:bKeyDown  := {| nKey, nFlags | iif( nKey == VK_F3, ::NextTabOption(),;
                                             iif( nKey == VK_F2, ::PrevTabOption(), ) ) ,0}
Ahora, para que siga propagandose el evento en la clase, hay que devolver un númerico distinto de cero.

Code: Select all

       ::oGet:bKeyDown  := {| nKey, nFlags | iif( nKey == VK_F3, ::NextTabOption(),;
                                             iif( nKey == VK_F2, ::PrevTabOption(), ) ), 1 }
De esta manera, parece ser que vuelvo a tener la misma funcionalidad que anteriormente..

Dios que cristo esto de cambiar de FWH , de Harbour, a Windows Vista, vamos, todo de golpe....
Gracias por la ayuda.