Page 1 of 2

GET sin longitud con espacios blancos

Posted: Sun Dec 17, 2017 11:10 pm
by Xevi
El tema que me ocupa ahora... el GET.

Resulta que de antaño, Clipper a la hora de solicitar los datos, se comportó de una forma que con la evolución informática no se corresponde.
Las DBFs se definian _ Caracter con anchura máxima que íbamos a preveer y eso al guardar los datos de registros ocupaba un espacio innecesario.
Con _ (SQL por ejemplo) las bases de datos se definen _ casi igual, pero al guardar los registros SOLO se guarda el espacio que ocupan los datos introducidos, no el ancho total definido.
Creo que es así, sinó que alguine me corrija.

Bien, la pregunta... FW veo que sigue arrastrando la forma de introducción de datos del antigui GET.
Pero, hay alguna forma de que se comporte de manera que solo se vean los datos que ocupa ese campo???
Por ejemplo...
Si tenemos una variable/campo tipo caracter contenido "Maria"
al hacer un GET, de esa variable me deja cambiar esos datos, si, pero SOLO me va a dejar introducir 5 carácteres. Así pues no puedo cambiar ese valor por "Maria de las Mercedes", ni tan siquiera que el campo de la tabla permita una longitud de 25 caracteres.
Por contra, si la variable la defino con valor "Maria"+Space(20), me dejará escribir i cambiar el contenido hasta los 25 caracteres, hasta ahí correcto... PERO si hago clic en una zona "vacia" a partir del caracter 6, se ve que hay espacios en blanco formando parte de su contenido... y ese efecto es "feo", muy feo.

Image

Cuando veo que después de lo escrito, hay espacios en blanco, pienso en MSDOS y como se trabajava en Clipper. Los programas "modernos" la captura de datos son sin espaciados a la derecha. Cualquier programa en entorno Windows/Mac, incluso los formularios web, al introducir los datos no tienes un campo en blanco de longitud fija que vas rellenando, sinó que a medida que vas escribiendo se va rellenando el contenido, hasta llegar a un límite, o no.

Hay alguna variante, propiedad, clase que se haya desarrollado o que alguien esté utilizando para salvar este comportamiento del GET actual de FW???

Alguna Clase desarrollada por algun tercero, como un TEdit() ???
No se si se podria con el GET MEMO, solo de una línea, con una propiedad de longitud maxima (nMaxLenght)...


Un Saludo,
Xevi.

Re: GET sin longitud con espacios blancos

Posted: Mon Dec 18, 2017 7:40 am
by nageswaragunupudi
TEdit is FWH class. Not 3rd party.

For your requirements, you may use command EDIT instead of GET.

@ row, col EDIT cVar SIZE w,h PIXEL OF oDlg

Re: GET sin longitud con espacios blancos

Posted: Mon Dec 18, 2017 10:21 am
by Xevi
Guay!!!

Ahora... información para EDIT ???
Estoy buscando en la wiki, y no veo la clase TEdit()

propiedades como longidut máxima (nMaxLenght)
Posicionar el cursor en un caracter determinado SetPos()
Seleccionar parte, nada o todo...

Seguro que está, pero no veo la documentación.

Saludos,
Xevi.

Re: GET sin longitud con espacios blancos

Posted: Mon Dec 18, 2017 10:57 am
by Xevi
He mirado el prg edit.prg de la clase TEdit()...
SetLimitText(n) para limitar la longitud.

@ 300,40 EDIT oEdit VAR cVar SIZE 280,22 PIXEL OF oWnd
oEdit:SetLimitText(30)

Metodos SelectAll()
y otros como SetSel() que deben heredar de TControl.

Iré investigando!!!


Un Saludo,
Xevi.

Re: GET sin longitud con espacios blancos

Posted: Mon Dec 18, 2017 6:47 pm
by Antonio Linares

Re: GET sin longitud con espacios blancos

Posted: Mon Dec 18, 2017 10:29 pm
by Xevi
Gracias, Antonio.

En la lista de Clases no sale y no la encontraba.
http://wiki.fivetechsoft.com/doku.php?i ... eticamente
Ni en el listado de la columna derecha, ni en el de Clase a Clase.

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 4:54 am
by Antonio Linares
Xevi,

La lista no estaba actualizada en el wiki, la acabo de actualizar, gracias :-)

La documentación en el wiki no siempre está actualizada y por eso lo mejor es revisar el código fuente
de la clase como tu muy bien has hecho :-)

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 11:07 am
by Xevi
Estoy buscando y no encuentro como cambiar el color del borde, del fondo... al recibir o dejar el foco

Code: Select all

   @ 340,40 EDIT oEdit VAR cVarEdit SIZE 280,22 PIXEL OF oWnd
   oEdit:SetLimitText(30)
   oEdit:bGotFocus  := {|o| o:SetColor( 255 ) }
   oEdit:bLostFocus := {|o| o:SetColor( 0 ) }
 
Con esto cambio el color de la fuente, pero... como establezco color del Fondo y del borde ???

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 1:33 pm
by nageswaragunupudi

Code: Select all

@ 340 , 40 EDIT oEdit VAR cVarEdit SIZE 280 , 22 PIXEL OF oWnd ;
   LIMITTEXT BY 30 CHARS

oEdit: bGotFocus  : = { | o | o: SetColor ( CLR_HRED, CLR_YELLOW ) }
oEdit: bLostFocus : = { | o | o: SetColor ( CLR_BLACK, CLR_WHITE ) }
 
Can not chanage border color. The boder is managed by Windows

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 2:10 pm
by Xevi
bGotFocus, hace el cambio de fuente correctamente

oEdit: bGotFocus : = { | o | o: SetColor ( CLR_HRED, CLR_YELLOW ) }

Ahora bien, bLostFocus bien si se sale del Edit con teclado <Tab>, pero no surte efecto si se hace con raton
oEdit: bLostFocus : = { | o | o: SetColor ( CLR_BLACK, CLR_WHITE ) }

He añadido o:Refresh(), y ya funciona correcto.
oEdit: bLostFocus : = { | o | o: SetColor ( CLR_BLACK, CLR_WHITE ), o:Refresh() }


Por cierto, para salir del Edit o Get con Enter ???


Gracias.

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 2:17 pm
by Antonio Linares
Xevi,

Revisa en source\classes\tget.prg la implementación en el método KeyChar() de VK_RETURN

Habría que implementar ese código en source\classes\edit.prg

Ten en cuenta que ese comportamiento no es standard de Windows, por eso no se ha implementado en la Clase TEdit

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 2:21 pm
by nageswaragunupudi

Code: Select all

oEdit:bKeyChar   := { |k| If( k == VK_RETURN, ( oEdit:oWnd:GoNextCtrl( oEdit:hWnd ), 0 ), nil ) }
 

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 10:47 pm
by Xevi
Lo mejor de trabajar con Clases... la herencia!!!

Así que he creado una clase a partir de la TEdit...

Code: Select all

CLASS TxEdit FROM TEdit

   METHOD KeyDown( nKey, nFlags )

ENDCLASS

METHOD KeyDown( nKey, nFlags ) CLASS TxEdit

   IF nKey == VK_UP
      ::oWnd:GoPrevCtrl( ::hWnd )
      return 0    // We don't want API default behavior

   ELSEIF nKey == VK_RETURN .or. nKey == VK_DOWN
      ::oWnd:GoNextCtrl( ::hWnd )
      return 0    // We don't want API default behavior
   ENDIF
return ::Super:KeyDown( nKey, nFlags )

 
Funciona de lujo!!!

Donde se puede llegar??? Hay límites???
Creo que los límites estan en la imaginación!!!

Como me gusta aprender!!!

Ahora, pero... necesito un empujón. TEdit al recoger el foco no se "pinta" el recuadro del color como lo hace un Get.
Es un error de la Clase???
Hay algun arreglo/apaño???
No se donde mirar en la Clase Get.

Gracias.

Re: GET sin longitud con espacios blancos

Posted: Tue Dec 19, 2017 11:26 pm
by Xevi
Una cosa a comentar, por si alguien se puede encontrar en una situación similar.

Code: Select all

function Main()
 
   local oDlg, cFirst := "Hello", cLast := "World"
 
*   DEFINE DIALOG oDlg SIZE 500, 250
   DEFINE WINDOW oDlg FROM 1, 1 TO 30, 100
 
   @ 1, 1 EDIT cFirst OF oDlg SIZE 80, 10
 
   @ 2, 1 GET cLast OF oDlg SIZE 80, 10
 
   @ 5, 11 BUTTON "Ok" ACTION MsgInfo( cFirst + ", " + cLast )
 
   @ 5, 21 BUTTON "Cancel" ACTION oDlg:End()
 
*   ACTIVATE DIALOG oDlg CENTERED
    ACTIVATE WINDOW oDlg

return nil
 
//----------------------------------------------------------------------------//
 
Sin la modificación de la clase, tal como he expuesto anteriormente, cuando conviven GETs y EDITs en una misma WINDOW, no salta de control del EDIT con return, flecha arriba, flecha abajo...
En cambio, si el contenedor es un DIALOG si que se comporta igualmente un EDIT que un GET.

Es para tomar nota!!!

Gracias.

Re: GET sin longitud con espacios blancos

Posted: Wed Dec 20, 2017 10:05 am
by Xevi
Otra cosa que NO FUNCIONA EN UNA WINDOW

Los Edits no se remarca el borde cuando obtiene el Foco en una WINDOW, en un DIALOG si lo hace correctamente. De ahí que expusiera el como cambiar el color del borde de un TEdit.

Es un error o fallo de la clase, como el expuesto en el anterior post.

Gracias.