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