Heredando la TPrinter

Heredando la TPrinter

Postby Ricardo Ramirez E. » Fri Nov 21, 2008 8:24 am

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.. ?
Saludos
Ricardo R.
xHarbour 1.1.0 Simplex , Microsoft Visual Studio 2008, Bcc55, Fwh Build. 9.01
User avatar
Ricardo Ramirez E.
 
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde

Postby Carlos Mora » Sun Nov 23, 2008 9:16 am

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
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Postby Ricardo Ramirez E. » Sun Nov 23, 2008 5:14 pm

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...
Saludos
Ricardo R.
xHarbour 1.1.0 Simplex , Microsoft Visual Studio 2008, Bcc55, Fwh Build. 9.01
User avatar
Ricardo Ramirez E.
 
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: José and 62 guests