Heredando la TPrinter

Post Reply
User avatar
Ricardo Ramirez E.
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde
Contact:

Heredando la TPrinter

Post 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

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

Post 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

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

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
User avatar
Ricardo Ramirez E.
Posts: 161
Joined: Wed Jan 25, 2006 10:45 am
Location: Praia - Cape Verde
Contact:

Post 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

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
Post Reply