Classes heredadas - Ayuda

Classes heredadas - Ayuda

Postby rolando » Fri Sep 20, 2013 1:14 am

Buenas noches,

Estoy intentando crear una clase "heredada" porque estuve viendo en el foro y sería práctico no reformar directamente las clases.

Copio un pequeño ejemplo con la clase TRichedit a la cual le agrego un method (METHOD Cololo) y una data (lItalica).

Code: Select all  Expand view
#include "FiveWin.ch"
#include "Constant.ch"
#include "WColors.ch"
#include "RichEdit.ch"



CLASS NewRichedit FROM TRichEdit

CLASSDATA lRegistered AS LOGICAL  

    DATA  lItalica      AS LOGICAL INIT .f.                                                                        
        
    METHOD New( nTop, nLeft, bSetGet, oWnd, nWidth, nHeight, oFont, ;
               lPixel, cMsg, lHScroll, lReadOnly, bWhen, bValid, ;
               bChanged, lDesign, lHighlight, cFileName, ;
               nRTFSize, lNoURL, lNoScroll, lNoBorder ) CONSTRUCTOR
 
    METHOD Cololo( nStart, nEnd, nColor )

     
                                 
ENDCLASS



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

METHOD New( nTop, nLeft, bSetGet, oWnd, nWidth, nHeight, oFont, ;
            lPixel, cMsg, lHScroll, lReadOnly, bWhen, bValid, ;
            bChanged, lDesign, lHighlight, cFileName, ;
            nRTFSize, lNoURL, lNoScroll, lNoBorder ) CLASS NewRichedit//TRichEdit

   #ifdef __XPP__
      #undef New
   #endif

   DEFAULT nTop       := 0, ;
           nLeft      := 0, ;
           oWnd       := GetWndDefault(), ;
           nWidth     := GetClientRect( oWnd:hWnd )[ 4 ], ;
           nHeight    := GetClientRect( oWnd:hWnd )[ 3 ], ;
           lPixel     := .f., ;
           lHScroll   := .f., ;
           lReadOnly  := .f., ;
           lDesign    := .f., ;
           lHighlight := .f., ;
           cFileName  := "" , ;
           nRTFSize   := 1024 * 1024, ;
           lNoURL     := .f., ;
           lNoScroll  := .f., ;
           lNoBorder  := .f., ;
           oFont      := TFont():New( "Arial", 0, If( LargeFonts(), -11, -13 ) )

   if bSetGet != nil
      ::cCaption = cValToChar( Eval( bSetGet ) )
   else
      ::cCaption = ""
   endif

   ::nTop      = If( lPixel, nTop, nTop * SAY_CHARPIX_H )
   ::nLeft     = If( lPixel, nLeft, nLeft * SAY_CHARPIX_W )
   ::nBottom   = ::nTop + nHeight - 1
   ::nRight    = ::nLeft + nWidth - 1
   ::bSetGet   = bSetGet
   ::oWnd      = oWnd
   ::nStyle    = nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_VSCROLL, ;
                      If( lDesign   , WS_CLIPSIBLINGS, 0 ), ;
                      If( !lNoBorder, WS_BORDER, 0 ), ;
                      If( lHScroll  , WS_HSCROLL, 0 ), ;
                      If( !lHScroll , ES_WANTRETURN, 0 ), ;
                      If( !lNoScroll, ES_DISABLENOSCROLL, 0 ), ;
                      ES_MULTILINE )
   ::nId       = ::GetNewId()
   ::cCaption  = RTrim( ::cCaption )
   ::lDrag     = lDesign
   ::lCaptured = .f.
   ::oFont     = oFont
   ::cMsg      = cMsg
   ::lReadOnly = lReadOnly
   ::bWhen     = bWhen
   ::bValid    = bValid
   ::bChange   = bChanged
   ::cFileName = cFileName
   ::nRTFSize  = Max( nRTFSize, 32 * 1024 )
   ::lURL      = !lNoURL

   ::lHighlight  = lHighlight
   ::aKeywords1  = { "CLASS", "FROM", "ENDCLASS", "DATA", "AS", "METHOD", ;
                     "CONSTRUCTOR", "function", "return", "OBJECT", "ENDOBJECT" }
   ::aKeywords2  = { "#include", "Self", "nil", "public", "local", "Super" }
   ::cSeparators = " +-()[]:*/{},="

   ::nClrNumber    = CLR_HMAGENTA
   ::nClrString    = CLR_YELLOW
   ::nClrComment   = CLR_HBLUE
   ::nClrSeparator = CLR_WHITE
   ::nClrText      = CLR_BLACK
   ::nClrKey1      = CLR_HGREEN
   ::nClrKey2      = CLR_HCYAN
   
   
     ::lItalica         :=  .f.                    // by rolo
     
   
   
   ::SetOleInit()

   if ! Empty( oWnd:hWnd )
      ::Create( CTRL_CLASS )
      ::SendMsg( WM_SETFONT, oFont:hFont, 0 )
      ::Default()
      oWnd:AddControl( Self )
   else
      oWnd:DefControl( Self )
   endif

   ::SetFont2RTF( ::oFont:nHeight )  // to adjust point size

   if ::lHighlight
      ::HighLightAllText() // PostMessage( ::hWnd, FM_HIGHLIGHTALL )
   endif

   if lDesign
      ::CheckDots()
   endif

return Self

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



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


METHOD Cololo( nStart, nEnd, nColor ) CLASS NewRichedit //TRichEdit

   ::SetSel( nStart, nEnd )
   RESetCharFormat( ::hWnd, ::oFont:cFaceName, ;
                    Size2Font( ::oFont:nHeight ) * ::nTamano , nColor , ;              
                    ::oFont:nCharSet, ;
                    ::oFont:nPitchFamily, ;
                    (if(::lItalica,.t.,.f.)) ,;                                                                                            
                     ::oFont:lStrikeOut )
   ::HideSel()

   
return nil

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




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

STATIC FUNCTION Size2Font( nSize )

return Abs( Round( nSize * 3/4, 0 ) )

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



Esto lo compila bien sin ningún error pero si hago:

Code: Select all  Expand view
oRich:lItalica:=.t.


A la hora de ejecutar ese código da un error:

Code: Select all  Expand view
Error description: Warning BASE/1005  Message not found: TRICHEDIT:_LITALICA
Stack Calls
===========
   Called from: source\rtl\tobject.prg => TRICHEDIT:ERROR( 0 )
   Called from: source\rtl\tobject.prg => TRICHEDIT:MSGNOTFOUND( 0 )
   Called from: source\rtl\tobject.prg => TRICHEDIT:_LITALICA( 0 )


Esta pequeña reforma es solo una prueba para encontrar la forma de hacerlo bien. Si a la nueva data y al Method los coloco dentro de la clase TRichedit, funciona sin inconvenientes.

¿Alguien puede ayudarme a ver que estoy haciendo mal?. Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Classes heredadas - Ayuda

Postby Antonio Linares » Fri Sep 20, 2013 10:39 am

Rolando,

Si tu nueva clase se llama NewRichedit(), entonces tienes que usarla para crear tu control y no usar TRichEdit()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41365
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Classes heredadas - Ayuda

Postby rolando » Fri Sep 20, 2013 11:47 am

Antonio,

Gracias por responder.

Lo que pretendo es realizar cambios a un par de methods agregando datas y también agregar algunos methods más en el caso de la TRichedit.

La idea es que no tenga que rehacer todos los cambios que le hecho a cada clase cuando actualice versión.

¿Es esta la forma correcta de hacerlo o hay otra manera?.

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Classes heredadas - Ayuda

Postby Antonio Linares » Fri Sep 20, 2013 5:45 pm

Rolando,

La forma más correcta es crear una nueva clase derivada de la que quieres modificar, como has hecho.
Lo que ocurre es que eso hace que los comandos xbase no sirvan, ya que solo se refieren a las Clases originales.

Una solución es variar la Clase, sin modificar su código fuente. Esto no es "correcto", pero funciona bastante bien :-)

Para añadir nuevas DATAs puedes hacer:

EXTEND CLASS TRichEdit WITH DATA oMiData

Para añadir nuevos Métodos o cambiar los existentes:

EXTEND CLASS TRichEdit WITH MESSAGE MiMensaje METHOD MiMetodo

y defines en el código la función MiMetodo la referencia a Self:

local self := HB_QSelf()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41365
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Classes heredadas - Ayuda

Postby rolando » Fri Sep 20, 2013 6:27 pm

Gracias Antonio, ahora lo tengo un poco más claro.

Pero, por mi modo de programar (mezcla de clipper y POO), para crear clases heredadas, debería rehacer todos los prg's de mis aplicaciones.

Seguramente lo voy a intentar con algún proyecto nuevo, pero por ahora voy a probar sobreescribiendo métodos y, si eso no me resulta, seguiré como antes cambiando las clases a la medida de mis necesidades (como tengo asentados todos los cambios, calculo que me será más fácil de realizar que si debo cambiar todos los prg's de mis aplicaciónes).

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Classes heredadas - Ayuda

Postby Antonio Linares » Fri Sep 20, 2013 7:50 pm

Rolando,

Si tus cambios en las clases son genéricos y de utilidad para otros, siempre podemos estudiar el incluirlos en FiveWin,

asi no tendrías que cambiar nada en las clases estandard de FWH :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41365
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Classes heredadas - Ayuda

Postby rolando » Fri Sep 20, 2013 11:12 pm

Antonio,

He hecho pequeños cambios en distintas clases, pero en la que más trabajé es en la TRichedit (dentro de mis limitados conocimientos, le agregué algunas funcionalidades tal cual lo necesitaba).

Voy a preparar con tiempo un ejemplo y te lo enviaré, junto con la clase modificada, para que lo analices y si vale la pena publicar los cambios (y quizás mejorarlos), por supuesto que me gustaría que lo hagas.

Saludos.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Classes heredadas - Ayuda

Postby Antonio Linares » Tue Sep 24, 2013 2:16 pm

Rolando,

Parece muy interesante, asi que quedo a la espera de que me lo envies cuando puedas.

Muchas gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41365
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 42 guests