FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Clase TGET bKeyDown, bChange
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
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:
 ::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()
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.
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Clase TGET bKeyDown, bChange
Posted: Tue Jan 08, 2008 12:35 PM
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:
 ::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()
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
::bChange := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }
por:
::bPostKey := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }

y deja de usar oGet:Assign().


Saludos y suerte.
Carlos G.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Clase TGET bKeyDown, bChange
Posted: Tue Jan 08, 2008 12:52 PM
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:
 ::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()
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
::bChange := {| nKey, nFlags | ::FastSeek( nKey, nFlags ) }
por:
::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.... :-)
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Clase TGET bKeyDown, bChange
Posted: Tue Jan 08, 2008 01:14 PM
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.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Clase TGET bKeyDown, bChange
Posted: Tue Jan 08, 2008 03:48 PM
Bueno, despues de volver de comer, vemos que;
En bCHange, hay que cambiarlo por;

::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;
       ::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.
       ::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.
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)

Continue the discussion