Page 1 of 1

Forzar Ancho de línea en un campo Memo

PostPosted: Fri Apr 07, 2023 5:18 pm
by VictorCasajuana
Hola Grupo!

He visto varios posts en el foro que tratan este tema pero no me acaba de funcionar. Necesito poder indicar el ancho de línea de un get de campo memo para que salte automáticamente a la siguiente línea cuando se supera.

He probado el siguiente código:
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oDlg
    Local oGet
    Local cVar := Space( 10000 )

    DEFINE DIALOG oDlg;
           SIZE 200,200
   
    @1,1 GET oGet;
         VAR cVar;
         MEMO;
         SIZE 90,70;
         OF oDlg

    oGet:LimitText(10)    

    ACTIVATE DIALOG oDlg CENTERED

Return ( Nil )
 


Pero el resultado es este:
Image

I me gustaría conseguir este resultado ( sin tener que pulsar enter )
Image

Es como si el método limitText() no me hiciese caso, o igual es que no sirve para lo que yo necesito.

Algún consejo?

Gracias de antemano y salud!

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Fri Apr 07, 2023 11:11 pm
by cmsoft
Victor:
El efecto del LimitText se logra asi:
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oDlg
    Local oGet
    Local cVar := Space( 10000 )

    DEFINE DIALOG oDlg;
           SIZE 200,200
   
    @1,1 GET oGet;
         VAR cVar;
         MEMO;
         SIZE 90,70;
         OF oDlg  

    ACTIVATE DIALOG oDlg CENTERED ON INIT oGet:LimitText(10)

Return ( Nil )

Pero claramente no es lo que buscas
Podría ser algo asi
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oDlg
    Local oGet
    Local cVar := Space( 1 )

    DEFINE DIALOG oDlg;
           SIZE 200,200
   
    @1,1 GET oGet;
         VAR cVar;
         MEMO;
         SIZE 90,70;
         OF oDlg

    oGet:bChange := { |nKey, nFlags| IF(oGet:GetCol() = 10, oGet:Append(chr(13)+chr(10), 2 ),nil ) }

    //oGet:LimitText(10)    

    ACTIVATE DIALOG oDlg CENTERED ON INIT oGet:LimitText(-1)

Return ( Nil )

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Sat Apr 08, 2023 2:15 am
by karinha

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Sat Apr 08, 2023 3:47 pm
by VictorCasajuana
cmsoft wrote:Victor:
El efecto del LimitText se logra asi:
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oDlg
    Local oGet
    Local cVar := Space( 10000 )

    DEFINE DIALOG oDlg;
           SIZE 200,200
   
    @1,1 GET oGet;
         VAR cVar;
         MEMO;
         SIZE 90,70;
         OF oDlg  

    ACTIVATE DIALOG oDlg CENTERED ON INIT oGet:LimitText(10)

Return ( Nil )

Pero claramente no es lo que buscas
Podría ser algo asi
Code: Select all  Expand view

#include 'fivewin.ch'

Function Main()

    Local oDlg
    Local oGet
    Local cVar := Space( 1 )

    DEFINE DIALOG oDlg;
           SIZE 200,200
   
    @1,1 GET oGet;
         VAR cVar;
         MEMO;
         SIZE 90,70;
         OF oDlg

    oGet:bChange := { |nKey, nFlags| IF(oGet:GetCol() = 10, oGet:Append(chr(13)+chr(10), 2 ),nil ) }

    //oGet:LimitText(10)    

    ACTIVATE DIALOG oDlg CENTERED ON INIT oGet:LimitText(-1)

Return ( Nil )


Cesar gracias por la respuesta, funciona bien hasta que intentas modificar algo, ya que entonces no lo respeta ( normal ). Me has dado una idea para utilizar el bchange e ir analizando la cadena y modificando el contenido del get ajustando cada línea en cada cambio, pero me da la sensación de que ya debe estar echo de alguna forma en fivewin y estoy reinventado la rueda, pero no doy con la tecla.
Image

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Sat Apr 08, 2023 3:53 pm
by VictorCasajuana


Karinha en los enlaces que me pasas veo la función SB_LimitText, pero lo único que hace es limitar el total del texto no cada línea.

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Sat Apr 08, 2023 4:51 pm
by cmsoft
funciona bien hasta que intentas modificar algo, ya que entonces no lo respeta ( normal )

Si, tal cual lo dices, no funciona cuando modificas, lo había visto.
Creo que, como dices, debes ir analizando la cadena y haciendo de forma manual que cumpla el requerimiento.
A mi humilde entender, no es una caracteristica que tenga la clase TMultiGet. Así que si lo logras, sería muy bueno...

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Tue Apr 11, 2023 8:09 am
by VictorCasajuana
cmsoft wrote:
funciona bien hasta que intentas modificar algo, ya que entonces no lo respeta ( normal )

Si, tal cual lo dices, no funciona cuando modificas, lo había visto.
Creo que, como dices, debes ir analizando la cadena y haciendo de forma manual que cumpla el requerimiento.
A mi humilde entender, no es una caracteristica que tenga la clase TMultiGet. Así que si lo logras, sería muy bueno...


Lo he intentado pero tiro la toalla, en el método bchange meto la lógica para revisar el contenido del get y ajustar cada línea a 10 de ancho, hasta ahí todo bien, pero pierdo el control de la posición del cursor, al modificar el contenido del get, si intento reposicionar el cursor, no me funciona del todo bien y tengo que controlar cosas como el borrado por selección, el pegado de portapapeles, etc... creo que estoy reinventando la rueda y que puede que haya algo que ya lo haga y no lo sepa.

Voy a intentar ir por otro camino, cambiar el tipo de letra del get a un ancho fijo como el COURIER NEW y crear el control del get con el ancho justo.

Hay alguna forma de saber el ancho de un caracter según el fuente elegido ( ancho fijo ) para poder calcular el ancho que me hará falta en el get?

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Wed Apr 12, 2023 1:45 am
by nageswaragunupudi
Code: Select all  Expand view
oWnd:GetWidth( ctext, oFont ) --> nWidth

Re: Forzar Ancho de línea en un campo Memo

PostPosted: Wed Apr 19, 2023 3:59 pm
by VictorCasajuana
nageswaragunupudi wrote:
Code: Select all  Expand view
oWnd:GetWidth( ctext, oFont ) --> nWidth

Thanks!