Page 1 of 1

Heredando la TPrinter

PostPosted: Fri Nov 21, 2008 8:24 am
by Ricardo Ramirez E.
Porqué cuando heredamos una clase de la TPrinter es necesario pasar como parámetro "Self" a los metodos.
me explico :
Code: Select all  Expand view
CLASS TRptConc FROM TPrinter
           METHOD Dialog() 
           METHOD Go()
           METHOD Head()
           METHOD Foot()
           METHOD Body()
ENDCLASS
...
PRINT Self PREVIEW
          PAGE
                ::Head() //al ejecutar esta linea arroja un error de parametros
                ::Head(Self) // cuando mando el objeto, ahi si funciona
               
          ENDPAGE
ENDPRINT

METHOD Head(oPrn) CLASS TRptConc
  oPrn:cmSay( 3.0,9.0, "testtttt".... )
  ::cmSay( 3.0,9.0, "testtttt".... ) //se supone que esta linea deberia tener el mismo efecto que la anterior... pq no es asi,???
Return Self


Alguna pista.. ?

PostPosted: Sun Nov 23, 2008 9:16 am
by Carlos Mora
Hola compañero:

Miles de pistas! Estás heredando pero después pasas de la herencia!

Es que estás mezclando el código, y el resultado que te da es el lógico.

1) Si haces un método y le pones un parámetro, OBVIAMENTE cuando hagas referencia a ese parámetro y no lo hayas pasado te dará un error.

2) La declaracion

Code: Select all  Expand view
PRINT Self PREVIEW


está creando un objeto nuevo, encima del que ya había en Self, que se pierde al salir del método. Mira el código pre procesado para que te des una idea de que es lo que te digo.

Si pones justo debajo un ? Self:Classname(), verás que te imprime 'TPRINTER', no 'TUCLASE', porque con el comando te cargaste la variable self original, creaste un objeto nuevo y lo pusiste encima.
Averigua un poco más sobre herencia y como se usa el mensaje SUPER, es lo que te hace falta.

3) Respecto de

Code: Select all  Expand view
METHOD Head(oPrn) CLASS TRptConc
  oPrn:cmSay( 3.0,9.0, "testtttt".... )
  ::cmSay( 3.0,9.0, "testtttt".... ) //se supone que esta linea deberia tener el mismo efecto que la anterior... pq no es asi,???
Return Self


Como te decia en 2, creas un objeto print que tendra vida dentro del método donde lo creaste, pero se destruirá al salir, y que es diferente del objeto SELF real. El oPrn:ClassName() == 'TPRINTER', y Self:ClassName() == 'TUCLASE'.


De todas maneras FW no está preparada para usar herencia de manera sencilla, porque tiene comandos que usan las clases y no hay lugar donde inyectar el código de tus clases. Lo que te sucede es un claro síntoma de esto. Hace un tiempo que puse algunos trucos para poder usar herencia, pero no es tan simple.

Un saludo,

Carlos

PostPosted: Sun Nov 23, 2008 5:14 pm
by Ricardo Ramirez E.
Carlos....
Subestime.. la TPrinter y la heredé a "ciegas", pues tienes razón revisé el Print.ch y Print.prg y el resultado es el siguiente

Code: Select all  Expand view
CLASS TRptConc FROM TPrinter
           METHOD Dialog()
           METHOD Go()
           METHOD Head()
           METHOD Foot()
           METHOD Body()
ENDCLASS
/*-----------------------------------------------*/
Method Go() CLASS TRptConc
::New(,,.t.)
   ::StarPage()
        ::Head()
    ::EndPage()
::Preview()
Return Self
/*-----------------------------------------------*/
METHOD Head(oPrn) CLASS TRptConc
  ::cmSay( 3.0,9.0, "testtttt".... )
Return Self


Gracias...