Page 1 of 1

CAMPO MEMO

PostPosted: Sat Apr 03, 2010 6:45 am
by Andrés González
Nunca había trabajado con campos memo y ahora que me pongo me surgen dos cuestiones a ver quien me puede explicar a que se deben.

1.- Cuando intento aplicar un comando PICTURE "@1" para que me lo coja en mayúsculas peta. En los includes veo que no está implementada la clausula PICTURE en el tMultiget. Habría forma de hacerlo ?. Solo se me ocurre que sea via el comando UPPER pero en mi caso no me sirve. No es posible incorporar esta clausula para que se pueda tomar los datos en mayusculas.

3.- Como no controlo el tema del memo, cuando creo una BD y le añado un campo memo, da un error a la hora de cargar la base de datos con el comando USE. (Error base 1102) también algo del comando UPPER pero no tiene sentido puesto que lo que falla es el comando use. Me he fijado que los ejemplos que hay en FWH/Samples todos generan junto a la dbf un dbt, pero en mi caso se genera un dbv. Como lo hago para que sea un .dbt ? Uso el windbu.

Code: Select all  Expand view
  if !file(v_file)
      MsgInfo("No existe el fichero " + v_file ) //+ ".DBF")
      return .f.
   endif
       do while v_forever .or. v_wait > 0
      if ex_use
            //? "Abro la base dedatos en exclusive: " + v_file
            ? "2"
         use &V_FILE alias &v_alias exclusive
      else
            ? "3"
            //? "Abro la base dedatos en shared: " + v_file
         use &V_FILE alias &v_alias shared  //<<<< Me falla aqui y no se el motivo.
      endif

        if !neterr()
         return .t.
      endif
      tecla = netMsgInfo(1)  //Modificar la funcion para que tenga un tiempo de ejecuncion
      if tecla = 27
         exit
      endif
 

Re: CAMPO MEMO

PostPosted: Sat Apr 03, 2010 10:14 am
by Antonio Linares
Andrés,

1. La Clase TMultiGet no usa un objeto GET de Harbour, por lo que para usar modo mayúsculas debes hacerlo via Windows y no usando PICTURE:
Code: Select all  Expand view

SetWindowLong( oMGet:hWnd, GWL_STYLE, nOr( GetWindowLong( oMGet:hWnd, GWL_STYLE ), ES_UPPERCASE ) )
 


2. Que RDD usas ?

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 8:18 am
by Andrés González
La verdad Antonio, me pillas, ya que nunca me he visto en la necesidad de cambiar el RDD, o sea, sigo utilizando el mismo codigo clipper antiguo adaptado al fivewin. Por lo tanto ni tan siquiera utilizo el comando REQUEST en ningún lado. Por lo tanto me imagino que el tema debe ser ponerle el REQUEST DBFNTX ya que sigo utilizando las NTX en los indices y nunca, digo nunca, me ha planteado ningún problema, por lo tanto no he tenido la necesidad cambiarlo.

Todo ha surgido con el uso de los campos MEMO, ahora después de investigar un poco me he dado cuenta que parece que el wDbu algo hace al crear el campo memo ya que no coge la extensión DBT sino una que es DBV, igual tengo que cambiar algo para que las cree. Pero he creado de nuevo la BD con el DBU antiguo y ya me crea el DBT, automáticamente todo me ha empezado a funcionar sin problemas.

Por cierto el tema es tan extenso que por mucho que he buscado información de los campos memo, no he encontrado información de su uso por ningún lado. Donde la busco, supongo que en harbour, verdad, en fivewin no lo he encontrado.

Por otra parte, como hago para el tema de las mayúsculas del get-memo. Utilizo un procedimiento automático para coger los campos que tengo definido en un fichero externo, con lo cual como hago para poder mandar esa linea que dices a ciertos campos memos. Quiero decir que no todos tienen que ser en mayusculas. No se me ocurre como hacerlo en tiempo de ejecución. Te dejo la manera que tengo de cogerlos en tiempo de ejecución. Antes con PICTURE le mandaba como hacerlo, ahora no se me ocurre donde mandarle esa línea que dices.

El código esta incluido en un for next para todos los campos
Code: Select all  Expand view
                if  f_tip_e[n] = "S" //Solo lo puedo ver
                     @ f_px[n] - nInicio + 0.3 , f_py[n] - 2  GET &oGet VAR &v_temp OF oDlgMod ;
                                                                               SIZE v_long , v_high ;
                                                                               PICTURE &p ;
                                                                               VALID &v_fval ;
                                               READONLY;
                                    UPDATE

                         elseif  f_tip_e[n] = "M" //Campo memo nuevo
                          @ f_px[n] - nInicio + 0.3 , f_py[n] - 2  GET &oGet VAR &v_temp MEMO OF oDlgMod ;
                                                                               SIZE v_long , v_high ;
                                                                               VALID &v_fval ;
                                                                               UPDATE

                elseif f_tip_e[n] != "S" //Gets normales
                      @ f_px[n] - nInicio + 0.3 , f_py[n] - 2  GET &oGet VAR &v_temp OF oDlgMod ;
                                                                                SIZE v_long , v_high ;
                                                                                PICTURE &p ;
                                                                                VALID &v_fval ;
                                        UPDATE
            end
 

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 8:34 am
by Andrés González
Antonio, me planteo también la siguiente cuestión, he hecho pruebas con un campo que no es memo pero que es de extensión muy larga, por ejemplo 240 caracteres. Como has visto en mi caso basta añadir una "M" para que me lo coja como campo MEMO. Edito el campo y visualmente es mas agradable que una sola linea, pero si me paso de la extensión de caracteres estos son truncados cuando son guardados en el campo. Hay forma de establecer una extensión determinada a los campos memo? o existe algún otro sistema para realizar esto?

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 9:23 am
by anserkk
Quiero decir que no todos tienen que ser en mayusculas. No se me ocurre como hacerlo en tiempo de ejecución. Te dejo la manera que tengo de cogerlos en tiempo de ejecución. Antes con PICTURE le mandaba como hacerlo, ahora no se me ocurre donde mandarle esa línea que dices.


Code: Select all  Expand view
#include "fivewin.ch"

#define GWL_STYLE -16
#define ES_UPPERCASE        0x0008

//-----------------------------------//
Function main()

Local oDlg,oMGet,cVar:=space(1000)

DEFINE DIALOG oDlg TITLE "Test"
@1,1 GET oMGet VAR cVar MEMO SIZE 100,30


ACTIVATE DIALOG oDlg ;
 ON INIT SetWindowLong( oMGet:hWnd, GWL_STYLE, nOr( GetWindowLong( oMGet:hWnd, GWL_STYLE ), ES_UPPERCASE ) )

Return nil


Image

Regards
Anser

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 10:38 am
by Antonio Linares
Andrés,

Aqui tienes documentación acerca de los campos memo:

http://www.x-hacker.org/ng/cldriv/ng1de35.html

Habría que comprobar si [x]Harbour respeta de igual forma esos tamaños

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 11:06 am
by Andrés González
Gracias por la informacion Antonio y Anserkk, voy a realizar unas pruebas para ver si consigo el efecto que quiero. Pero por lo que veo el tema de la longitud del campo memo no depende de la longitud de la variable que edita, ya que cuando editas te permite editar mucho mas que la longitud del campo y cuando lo guarda trunca todo el texto que excede de la longitud del campo. Eso naturalmente solo ocurre con lo campos del tipo carácter y no con los campos memo.

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 12:30 pm
by antolin
Andres, yo he modificado la clase MGET para que me avise si me paso de una cantidad de caracteres. Así puedo decirle que no admita mas de 240 caraceterres.

Lo he hecho asi:

1º he añadido el DATA ::MaxLong

2º he añadido las lineas siguinetes en el metodo KEYCHAR() despues de
Code: Select all  Expand view
if nkey == CK_TAB
   RETURN ...

esto es lo que puedes añadir:
Code: Select all  Expand view
  IF ::MaxLong > 0 .AND. nKey > 31 .AND. LEN( ::cText ) >= ::MaxLong
      MsgBeep()
      RETURN 0
   ENDIF
 


Con eso basta, aunque en realidad he añadido mas cosas, para que me salga un mensaje diciendo que estoy intentando escribir mas de lo que debo, o que me realice una accion si intento pasarme de caracteres a la cuarta vez que lo intenteto:
Code: Select all  Expand view
  IF ::MaxLong > 0 .AND. nKey > 31 .AND. LEN( ::cText ) >= ::MaxLong
      ++::nChars
      MsgBeep()
      IF ::nChars = 4
     IF ::bPassMax # NIL
        EVAL(::bPassMax,::MaxLong)
     ELSE
        MSGSTOP( "ESTE CAMPO NO ADMITE MÁS DE "+ALLTRIM(STR(::MaxLong))+" CARACTERES", ;
              "  SE INTENTÓ EXCEDER LONGITUD MÁXIMA" )
     ENDIF
     ::nChars := 2
      ENDIF
      RETURN 0
   ENDIF
   ::nChars := 0

Para eso tienes que añadir los DATA ::nChars y ::bPassMax (si quieres realizar una accion difierente al mensaje.
Espero que te sirva.

Un saludo

Re: CAMPO MEMO

PostPosted: Mon Apr 05, 2010 12:46 pm
by Daniel Garcia-Gil
Saludos...

la clase MGet proporsiona un metodo para limitar el texto

METHOD LimitText( nChars )

la forma de usarlo

oMGet:LimitText( 5 )

Re: CAMPO MEMO

PostPosted: Tue Apr 06, 2010 6:36 am
by antolin
Hola.

Es cierto Daniel, gracias por el apunte, no lo sabía.

Sin embargo en mi de FWH no viene para que el usuario pueda limitar el texto a su antojo, sino para que el MGET tome el máximo número de caracteres permitidos por su versión de Windows

Viene como:

Code: Select all  Expand view
METHOD LimitText()  INLINE  SendMessage( ::hWnd, EM_LIMITTEXT, 0, 0 )

y lo utiliza en Initiate() al principio para definir el número máximo permititdo de caractres.

Pero supongo que se puede cambiar. Cuando tenga un momento lo probaré. Supongo que será algo como esto:

Code: Select all  Expand view
METHOD LimitText( nChar )  INLINE  SendMessage( ::hWnd, EM_LIMITTEXT, nChar , 0 )

Re: CAMPO MEMO

PostPosted: Tue Apr 06, 2010 7:52 am
by Andrés González
Si señor !, funciona a la perfección, admirable este foro. La verdad revisé la clase pero solo para ver si se podía hacer lo del comando PICTURE, pero no se me ocurrió volver a revisarlo para ver si se podía poner un limite de texto.

Gracias Antolin y Daniel.