Page 1 of 2

PICTURE "@!"

Posted: Sun Mar 02, 2008 7:56 am
by Andrés González
Alguien sabe a que se debe que cuando utilizo la sentencia picture en un get del tipo PICTURE "@!" osea que me tome en mayusculas cuando coge una ñ me la pone en minusculas y tengo que pulsar el Shift para que la ponga en Ñ.
Problema del Harbour o Fivewin... todo el resto de letras me lo toma correcto, todas en mayusculas pero no en este caso.

Alguien conoce una solucion...

Posted: Sun Mar 02, 2008 12:16 pm
by Kleyber
Hola Andres,


Realmente es muy extraño este comportamiento, pero lo que hago es en Resource Workshop, en la propriedad del get, lo pongo como UPPER CASE y listo.

Si alguna persona pueda darnos la solución desde codigo, seria buenissimo.

Saludos,

Posted: Sun Mar 02, 2008 9:29 pm
by ARCC
Buen día para todos...

Prueba colocando el siguiente código en la clase TGet en el método KeyChar despues de declaraciones LOCAL y antes de cualquier otra linea de código. Ejemplo

KeyChar( nKey, nFlags ) CLASS TGet

LOCAL .........
LOCAL .........

if !Empty( ::cPicture ) .and. '@!' $ ::cPicture
nKey := Asc( UpperCase( Chr( nKey ) ) )
endif

...............
...............
Resto de código del método.

Nota: Deberás compilar y enlazar la clase TGet con _ mencionados en tu aplicación para que tome el cambio. Esta modificacion tambien toma los signos de puntuación en mayúsculas. Ej. Á É Í Ó Ú

Posted: Mon Mar 03, 2008 9:33 am
by Andrés González
La sentencia que indicas ya viene incluida en la clase y justamente en el lugar que indicas, por lo que me temo que no es eso la solucion....

Gracias

Posted: Mon Mar 03, 2008 9:59 am
by Andrés González
Un poco basto pero funciona, el problema es que realizas una comparacion mas por cada pulsacion. Supongo que el error debe de estar en la funcion Upper que no realiza el trabajo bien.

Code: Select all

 if ! Empty( ::cPicture ) .and. '@!' $ ::cPicture
		  if chr( nKey ) = "ñ"
				nKey = 209    //Ñ en mayusculas
		  else
        		nKey = Asc( Upper( Chr( nKey ) ) )
		  end
   endif

Posted: Mon Mar 03, 2008 10:20 am
by Antonio Linares
Andrés,

Incluido para el próximo build, gracias!

Posted: Mon Mar 03, 2008 11:02 am
by FiveWiDi
Andrés González wrote:Un poco basto pero funciona, el problema es que realizas una comparacion mas por cada pulsacion. Supongo que el error debe de estar en la funcion Upper que no realiza el trabajo bien.

Code: Select all

 if ! Empty( ::cPicture ) .and. '@!' $ ::cPicture
		  if chr( nKey ) = "ñ"
				nKey = 209    //Ñ en mayusculas
		  else
        		nKey = Asc( Upper( Chr( nKey ) ) )
		  end
   endif
Ya puestos a hacer:

If ! Empty( ::cPicture ) .and. '@!' $ ::cPicture
If chr( nKey ) $ "ñç"
if chr( nKey ) = "ñ"
nKey = 209 //Ñ en mayusculas
elseif chr( nKey ) = "ç"
nKey = ??? //Ç en mayusculas ¿Alguién sabe este código?
EndIf
EndIf
Else
nKey = Asc( Upper( Chr( nKey ) ) )
Endif


Saludos
Carlos G.

Posted: Mon Mar 03, 2008 11:38 am
by Manuel Valdenebro
Creo que debe ser otra cosa. Yo uso la clase Tget sin modificar esa parte y me funciona sin problemas.

Posted: Mon Mar 03, 2008 1:01 pm
by Andrés González
Sí Manuel tienes razón, seguro que corresponde a otro procedimiento el asignar el tema de las mayúsculas por eso he hecho la refexión que el tema esta a la hora de transformar los códigos en el procedimiento UPPER no se si el tema va de la tabla ascii o que, pero bueno con esto se soluciona desde fivewin. Supongo que el tema del upper viene del harbour y que debe ser ahí donde se solucione.

Efectivamente también hace falta la ç, sobre todo aquellos que como yo vivimos en regiones de dominio del catalán. No usan la ñ (ny) pero si la ç.

Posted: Mon Mar 03, 2008 3:00 pm
by ARCC
Buen día para todos...
Andrés González wrote:La sentencia que indicas ya viene incluida en la clase y justamente en el lugar que indicas, por lo que me temo que no es eso la solucion....

Gracias
Fe de errata, el problema es la funcion Upper y se resuelve con este código que se me olvidó colocar en mi post anterior. fijate lo que coloque antes y veras la función UpperCase(), lo que se me olvidó es este código colocalo al final de la clase y listo. Disculpa que pasé por alto esto.

DLL32 STATIC Function UpperCase(cStr AS STRING) AS STRING PASCAL;
FROM "CharUpperA" LIB "user32.dll"

Nota: Por favor utilizalo y me comentas.

Posted: Mon Mar 03, 2008 6:56 pm
by FiveWiDi
ARCC wrote:Buen día para todos...
Andrés González wrote:La sentencia que indicas ya viene incluida en la clase y justamente en el lugar que indicas, por lo que me temo que no es eso la solucion....

Gracias
Fe de errata, el problema es la funcion Upper y se resuelve con este código que se me olvidó colocar en mi post anterior. fijate lo que coloque antes y veras la función UpperCase(), lo que se me olvidó es este código colocalo al final de la clase y listo. Disculpa que pasé por alto esto.

DLL32 STATIC Function UpperCase(cStr AS STRING) AS STRING PASCAL;
FROM "CharUpperA" LIB "user32.dll"

Nota: Por favor utilizalo y me comentas.
A mi me da en los huesos que debe ser cosa de Harbour.
El error se da también en FiveLinux y/o FWPPC? Si es así la solución sólo vale para nuestro FiveWin y entonces se pierde la compatibilidad con los otros entornos.

Cierto? Cómo lo ven?

Saludos
Carlos G.

Posted: Mon Mar 03, 2008 7:03 pm
by Antonio Linares
Así funciona correctamente:

Code: Select all

REQUEST HB_Lang_ES 
REQUEST HB_CODEPAGE_ESWIN 

function Main()

   HB_LangSelect("ES") // Para mensajes, fechas, etc.. 
   HB_SetCodePage("ESWIN") // Para ordenación, requiere CodePage.lib

   MsgInfo( Upper( "ñ" ) )

return nil

Posted: Mon Mar 03, 2008 7:06 pm
by Antonio Linares
Ojo, aqui funciona bien con Harbour pero NO con xHarbour

Posted: Mon Mar 03, 2008 8:50 pm
by ARCC
Buen día para todos...
Antonio Linares wrote:Ojo, aqui funciona bien con Harbour pero NO con xHarbour
Antonio:

Si tienes razón en xHarbour no funciona y el problema con la clase tGet es muy viejo, yo saqué esa función UpperCase la cual uso desde FWH 2.4, por favor prueba tu mismo ejemplo con la función UpperCase en FWH y FWxH funciona de maravilla.

#include "FiveWin.ch"

REQUEST HB_Lang_ES
REQUEST HB_CODEPAGE_ESWIN

function Main()

HB_LangSelect("ES") // Para mensajes, fechas, etc..
HB_SetCodePage("ESWIN") // Para ordenación, requiere CodePage.lib

MsgInfo( Upper( "ñ" ) )
MsgInfo( UpperCase( "ñ" ) )

return nil

DLL32 STATIC Function UpperCase(cStr AS STRING) AS STRING PASCAL;
FROM "CharUpperA" LIB "user32.dll"

Posted: Mon Mar 03, 2008 11:10 pm
by Antonio Linares
Antonio,

Totalmente de acuerdo. _ Upper() por UpperCase(). Gracias!

Visto que xHarbour no lo hace bien, y que además hay diferencia con Harbour, lo idóneo es usar la propia función del API de Windows.