Page 1 of 1

VERTICAL FONT en Report

PostPosted: Mon Nov 17, 2008 8:28 pm
by Manuel Valdenebro
¿Es posible imprimir en un report, una linea vertical?

Lo he intentado emulando lo que ya hago con Tprinter, usando un font y NESCAPEMENT 900, y aplicandolo a un SAY, pero me da error.

¿Alguien lo ha conseguido?

PostPosted: Tue Nov 18, 2008 11:17 am
by karinha

PostPosted: Tue Nov 18, 2008 6:00 pm
by Manuel Valdenebro


Gracias Karinha por contestar. Pero lo necesito para un REPORT. En Tprinter no tengo problemas. Pero con la clase REPORT se me ocurre ponerlo con un oRpt:SAY(....) pero no consigo que me tome el FONT declarado como vetical.

Esto te puede servir

PostPosted: Wed Nov 19, 2008 3:17 am
by Ramon Paredes
Hola Manuel,

Ojala sea esto lo que andas buscando, como poner con treport un dato vertical, prueba esto :

Local oFnt,oFnt2,oPen1,oReport,oFont9,oFont10


DEFINE FONT oFnt NAME "Arial" SIZE 0,-10
DEFINE FONT oFnt2 NAME "Arial" SIZE 0,-8 NESCAPEMENT 900
DEFINE FONT oFont9 NAME "Arial" SIZE 0,-14 UNDERLINE NESCAPEMENT -900
DEFINE FONT oFont10 NAME "Times New Roman" SIZE 0,-56 NESCAPEMENT -450

DEFINE PEN oPen1 WIDTH 2

REPORT oReport CAPTION "FACTURA Nº 123456" ;
FONT oFnt,oFnt2 ;
PEN oPen1 ;
TITLE "Titulo " LEFT ;
HEADER "Cabeceras" ;
FOOTER "Se puede Imprimir un Centrado al PIE de Pagina" ,;
"Despues un Titulo Vertical centrado ...." CENTER ;
PREVIEW

COLUMN TITLE "Nueva Columna " DATA "ESTA ES LA COLUMNA DE DATOS"

oReport:oFooter:aFont[1] := {|| 1 }
oReport:oFooter:aFont[2] := {|| 2 }
oReport:oFooter:aPad[2] := 1

END REPORT

ACTIVATE REPORT oReport

oPen1:End()
oFnt:End()
oFont9:End()
oFont10:end()

oFnt2:End()

RETURN NIL

Saludes desde Managua, Nicaragua

Ramon Paredes

PostPosted: Wed Nov 19, 2008 5:47 am
by Manuel Valdenebro
Ramon, muchas gracias por tu ayuda. Se acerca bastante, pero no consigue lo que
realmente necesito. Me explico con mas detalle.

Es contumbre en algunas empresas españolas (sociedades limitadas y anónimas)
indicar en el margen izquierdo de sus documentos (facturas, cartas, etc) los
datos registrales y fiscales de dicha sociedad. En las aplicaciones que tengo
en uso, en las facturas, vengo indicando dichos datos con la clase Tprinter:

http://perso.wanadoo.es/cris-rueda/screen1.jpg

Ahora quiero hacer lo mismo, pero en los documentos que genero con la clase
Treport.

La solución de Ramón, tiene dos inconvenientes:
1) La leyenda no sale en el extremo de la página, sino que deja el margen
normal.
2) La leyenda se escribe con las letras hacia afuera y no hacia adentro.

http://perso.wanadoo.es/cris-rueda/screen2.jpg

Creo que la solución está en el método SAY de la propia clase Treport, que a
su vez usa el método de la propia clase Tprinter. Pero al usarlo me da el
siguiente error al compilar:

oReport:Say( 1, "Texto vertical", 4, 1, 5 )

Error description: Error BASE/1111 Error de argumento: LEN
Args:
[ 1] = U

Stack Calls
===========
Called from: => LEN(0)
Called from: .\source\classes\REPORT.PRG => TREPORT:SAY(0)

¿Alguien ha usado el método SAY de la clase TReport? Creo que el tema es
importante, ya que el uso de este método complementaría TReport.

Muchas gracias por vuestra ayuda.

PostPosted: Wed Nov 19, 2008 2:49 pm
by Armando
Manuel:

Si no recuerdo mal, ahoro no estoy en mi pc para leer la doc, en el valor del NETSCAPEMENT puedes darle un valor positivo o negativo, si el valor es negativo el texto gira en el sentido de las manecillas del reloj, pero si es positivo gira en sentido contrario.

Entonces, se me ocurre que puedes probar con un valor positivo o bien un valor negativo más alto que haga girar más al texto hasta lograr el sentido que deseas.

Saludos

PostPosted: Wed Nov 19, 2008 3:21 pm
by karinha
Intente con SAYROTATED()

Code: Select all  Expand view
   ( SayRotated( oReport, 260,  10,   ;
                 "Ventas ", oFont1,,, .t. ),    ;
     SayRotated( oReport, 150, 500, "About ", oFont2, ;
              CLR_HRED, CLR_YELLOW, .F. ) )

//---------------------------------------------------------------------------//

Function SayRotated( oWnd, Y, X, cPrompt, oFont, nClrText, nClrPane, l3D )

  Local hDC := oWnd:hDC

  DEFAULT nClrText := CLR_HRED, l3D := .T.
 
  IF l3D
    DrawRotated( hdc, cPrompt, Y + 1, X + 1, CLR_BLACK, nClrPane, oFont )
    DrawRotated( hdc, cPrompt, Y - 1, X - 1, nClrText, nClrPane, oFont )
  ENDIF

  DrawRotated( hdc, cPrompt, Y , X , nClrText, nClrPane, oFont )

Return Nil

//----------------------------------------------------------------------------

Static Function DrawRotated( hDC, cPrompt, Y, X, nClrText, nClrPane, oFont )

  Local hOldFont, nOldMode, nOldClrText, nOldClrPane, nOldBkMode

  nOldClrText := SetTextColor( hDC, nClrText )

  if nClrPane <> Nil
    nOldClrPane := SetBkColor( hDC, nClrPane )
  else
    nOldBkMode := SetBkMode( hDC,1 )
  Endif

  hOldFont := SelectObject( hDC, oFont:hFont )

  TextOut( hDC, Y, X, cPrompt, Len( cPrompt ) )

  SelectObject( hDC, hOldFont )

  if nClrPane<>nil
    SetBkColor( hDC, nOldClrPane )
  else
    SetBkMode( hDC, nOldBkMode )
  Endif

  SetTextColor( hDC, nOldClrText )

Return Nil

PostPosted: Wed Nov 19, 2008 4:16 pm
by Manuel Valdenebro
Armando wrote:Manuel:

Si no recuerdo mal, ahoro no estoy en mi pc para leer la doc, en el valor del NETSCAPEMENT puedes darle un valor positivo o negativo, si el valor es negativo el texto gira en el sentido de las manecillas del reloj, pero si es positivo gira en sentido contrario.

Entonces, se me ocurre que puedes probar con un valor positivo o bien un valor negativo más alto que haga girar más al texto hasta lograr el sentido que deseas.

Saludos


Armando, gracias por contestar. Si le pongo a NETSCAPEMENT el valor 900 o -2700, invierte el sentido de las letras hacia la derecha (correcto) pero en ambos casos empeora el tema del margen ya que lo escribe en la columna num. 1.

PostPosted: Wed Nov 19, 2008 4:18 pm
by Manuel Valdenebro
karinha wrote:Intente con SAYROTATED()


Karinha, he incluido el código y me da el siguiente error:

Error description: Error BASE/1004 Message not found: TREPORT:HDC

Stack Calls
===========
Called from: source\rtl\tobject.prg => TREPORT:ERROR(172)
Called from: source\rtl\tobject.prg => TREPORT:MSGNOTFOUND(205)
Called from: source\rtl\tobject.prg => TREPORT:HDC(0)
Called from: a_frutas.prg => SAYROTATED(1709)


¿ NO ES POSIBLE EL USO DEL METODO SAY?

PostPosted: Wed Nov 19, 2008 4:42 pm
by karinha
Intente en el ON INIT del ACTIVATE REPORT... ???

Creo no sea posible. Mejor és usar TPRINTER mismo.

Saludos.

SOLUCIONADO

PostPosted: Wed Nov 19, 2008 6:26 pm
by Manuel Valdenebro
Como bien dice Karinha no es posible, porque la clase Treport impide escribir fuera de los margenes. Por ello, he modificado dicha clase y todo solucionado.

En el método SAY de Treport, en el DO CASE, he añadido un nuevo caso, con los datos siguientes:

do case

case nPad == 8
nStartCol := 75

En la aplicación en el ACTIVATE del report:

ACTIVATE REPORT oReport ;
ON ENDPAGE (oReport:NewLine(), ;
oReport:Say( 1, "texto que quiero poner en vertical", 4, 8, 5500 ))

4 = DEFINE FONT oFonV NAME "ARIAL" SIZE 0,-10 NESCAPEMENT -2700
8 = para que el Report tome este nPad


y todo solucionado como quería.

Gracias a Armando y Karinha por su ayuda.

Re: SOLUCIONADO

PostPosted: Wed Nov 19, 2008 7:10 pm
by karinha
Manuel Valdenebro wrote:Como bien dice Karinha no es posible, porque la clase Treport impide escribir fuera de los margenes. Por ello, he modificado dicha clase y todo solucionado.

En el método SAY de Treport, en el DO CASE, he añadido un nuevo caso, con los datos siguientes:

do case

case nPad == 8
nStartCol := 75

En la aplicación en el ACTIVATE del report:

ACTIVATE REPORT oReport ;
ON ENDPAGE (oReport:NewLine(), ;
oReport:Say( 1, "texto que quiero poner en vertical", 4, 8, 5500 ))

4 = DEFINE FONT oFonV NAME "ARIAL" SIZE 0,-10 NESCAPEMENT -2700
8 = para que el Report tome este nPad


y todo solucionado como quería.

Gracias a Armando y Karinha por su ayuda.


Bién!!

Bela idéa! Parabiéns!

Gracias.

Saludos.

PostPosted: Wed Nov 19, 2008 8:32 pm
by Armando
Bien Manuel, una vez más; el bien triunfa sobre el mal :)

Saludos