CAMPO MEMO

CAMPO MEMO

Postby Andrés González » Sat Apr 03, 2010 6:45 am

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  RUN
  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
 
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 629
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: CAMPO MEMO

Postby Antonio Linares » Sat Apr 03, 2010 10:14 am

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  RUN

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


2. Que RDD usas ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: CAMPO MEMO

Postby Andrés González » Mon Apr 05, 2010 8:18 am

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  RUN
                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
 
Last edited by Andrés González on Mon Apr 05, 2010 8:37 am, edited 1 time in total.
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 629
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: CAMPO MEMO

Postby Andrés González » Mon Apr 05, 2010 8:34 am

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?
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 629
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: CAMPO MEMO

Postby anserkk » Mon Apr 05, 2010 9:23 am

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  RUN
#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
User avatar
anserkk
 
Posts: 1333
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Re: CAMPO MEMO

Postby Antonio Linares » Mon Apr 05, 2010 10:38 am

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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: CAMPO MEMO

Postby Andrés González » Mon Apr 05, 2010 11:06 am

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

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 629
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: CAMPO MEMO

Postby antolin » Mon Apr 05, 2010 12:30 pm

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  RUN
if nkey == CK_TAB
   RETURN ...

esto es lo que puedes añadir:
Code: Select all  Expand view  RUN
  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  RUN
  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
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
antolin
 
Posts: 498
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: CAMPO MEMO

Postby Daniel Garcia-Gil » Mon Apr 05, 2010 12:46 pm

Saludos...

la clase MGet proporsiona un metodo para limitar el texto

METHOD LimitText( nChars )

la forma de usarlo

oMGet:LimitText( 5 )
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: CAMPO MEMO

Postby antolin » Tue Apr 06, 2010 6:36 am

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  RUN
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  RUN
METHOD LimitText( nChar )  INLINE  SendMessage( ::hWnd, EM_LIMITTEXT, nChar , 0 )
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55
antolin
 
Posts: 498
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Re: CAMPO MEMO

Postby Andrés González » Tue Apr 06, 2010 7:52 am

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

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 629
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 54 guests