FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Fri Jul 21, 2023 05:30 PM
Buenas tardes. 驴C贸mo hacer un OVERRIDE en la clase TGET.PRG?
驴Para no tener que modificar la clase TGET.PRG cada vez que cambio la versi贸n de FIVEWIN?
驴Usando el c贸digo fuente de este ejemplo?
Code (fw): Select all Collapse
#Include "FiveWin.ch"

FUNCTION CAMBIA_GET() // OVERRIDE() in TGET.PRG

聽 聽/*
聽 聽Vamos para o nosso POG. Na Classe TGET.PRG, fa莽a as inclu莽玫es abaixo:
聽 聽*/

聽 聽//Declare as seguintes vari谩veis

聽 聽DATA 聽 oPlcHld INIT NIL
聽 聽DATA 聽 cPlcHld INIT ""
聽 聽DATA 聽 nPlcClr INIT RGB(100,100,100)

聽 聽/*
聽 聽//Declare o seguinte Method
聽 聽*/

聽 聽METHOD SetPlcHld(cPlc, nClr)

RETURN...

/*
// Localize o METHOD LostFocus( hCtlFocus ) CLASS TGet
// e adicione o seuinte c贸digo, logo no in铆cio
*/

METHOD LostFocus( hCtlFocus ) CLASS TGet
聽
聽 聽 //ADD Isso
聽 聽 if !empty(::oPlcHld)

聽 聽 聽 聽 if empty(::cText)

聽 聽 聽 聽 聽 聽 ::oPlcHld:nWidth := ::nWidth-8

聽 聽 聽 聽 endif

聽 聽 endif

RETURN...

/*
// Localize o METHOD GotFocus( hCtlLost ) CLASS TGet
// e adicione o seuinte c贸digo, logo no in铆cio
*/

METHOD GotFocus( hCtlLost ) CLASS TGet
聽
聽 聽 //ADD isso
聽 聽 if !empty(::oPlcHld)

聽 聽 聽 聽 ::oPlcHld:nWidth=0

聽 聽 endif

RETURN...

/*
// Inclua o Method SetPlcHld(cPlc, nClr)
*/

METHOD SetPlcHld(cPlc, nClr) CLASS TGet
聽
聽 聽 local oWnd := self
聽 聽 local nWidth := ::nWidth-8

聽 聽 DEFAULT nClr := ::nPlcClr

聽 聽 ::nPlcClr := nClr
聽 聽 ::cPlcHld := cPlc
聽
聽 聽 if !empty(::cText)

聽 聽 聽 聽 nWidth := 0

聽 聽 endif
聽
聽 聽 @ 2, 4 SAY ::oPlcHld VAR ::cPlcHld SIZE nWidth, ::nHeight-4 COLOR ::nPlcClr, ::nClrPane OF oWnd Pixel
聽
RETURN NIL

// FIN / END
Muchas gracias.

Regards, saludos.
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Sat Jul 22, 2023 02:28 PM
Karinha, te adjunto un modulo donde realizo OverrideAndExtend de las clase de fwh, puedes tomarlo como ejemplo. :-)
Code (fw): Select all Collapse
/*----------------------------------------------------------------------------*/

#include "prestamos.ch"

#ifdef __HARBOUR__
聽 聽#ifndef __XHARBOUR__
聽 聽 聽 #include "xhb.ch"
聽 聽 聽 #include "xhbcls.ch"
聽 聽#endif
#endif

#include "hbclass.ch"

/*----------------------------------------------------------------------------*/

PROCEDURE OverrideAndExtend()

聽 聽OVERRIDE METHOD GETDLGCODE IN CLASS TBUTTON WITH KGETDLGCODE

聽 聽EXTEND CLASS TCONTROL 聽 聽 WITH METHOD MyDisable
聽 聽EXTEND CLASS TDIALOG 聽 聽 聽WITH METHOD RefreshDialog
聽 聽EXTEND CLASS TFOLDER 聽 聽 聽WITH METHOD GoFirstControl
聽 聽EXTEND CLASS TFOLDER 聽 聽 聽WITH METHOD RefreshPages
聽 聽EXTEND CLASS TXBROWSE 聽 聽 WITH METHOD RefreshTotals
聽 聽EXTEND CLASS TXBROWSE 聽 聽 WITH METHOD SetMyBmpSort
聽 聽EXTEND CLASS TXBROWSE 聽 聽 WITH METHOD MyConfig
聽 聽EXTEND CLASS TMYSQLSERVER WITH METHOD ShowError

RETURN

/*----------------------------------------------------------------------------*/

FUNCTION KGetDlgCode( nLastKey )
聽 聽LOCAL Self := hb_QSelf()

聽 聽::oWnd:nLastKey := nLastKey

聽 聽DO CASE
聽 聽CASE !hb_isNil( ::oWnd:oWnd ) .and. ( ::oWnd:oWnd:IsKindOf( "TFOLDER" ) .or. ::oWnd:oWnd:IsKindOf( "TFOLDEREX" ) )
聽 聽 聽 RETURN DLGC_WANTALLKEYS
聽 聽CASE nLastKey == VK_ESCAPE .and. !hb_isNil( ::oWnd:oWnd ) .and. ( ::oWnd:oWnd:IsKindOf( "TWINDOW" ) .or. ::oWnd:IsKindOf( "TDIALOG" ) .or. ::oWnd:IsKindOf( "TPAGES" ) )
聽 聽 聽 RETURN DLGC_WANTALLKEYS
聽 聽ENDCASE

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION MyDisable( aCtrlType )
聽 聽LOCAL Self := hb_QSelf()

聽 聽IF ( ::ClassName() IN aCtrlType )
聽 聽 聽 ::bWhen := NIL
聽 聽 聽 ::Disable()
聽 聽ENDIF

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION RefreshDialog( nPos )
聽 聽LOCAl Self := hb_QSelf()

聽 聽DEFAULT nPos := 0

聽 聽AEval( ::aControls, { |oCtrl| oCtrl:Refresh() } )

聽 聽IF nPos > 0
聽 聽 聽 IF Between( nPos, 1, Len( ::aControls ) )
聽 聽 聽 聽 聽::aControls[ nPos ]:SetFocus()
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION GoFirstControl()
聽 聽LOCAL Self := hb_QSelf()

聽 聽IF Len( ::aDialogs ) > 0 .and. Len( ::aDialogs[ 01 ]:aControls[ 01 ] ) > 0
聽 聽 聽 ::aDialogs[ 1 ]:aControls[ 1 ]:SetFocus()
聽 聽ENDIF

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION RefreshPages( nSelectPage )
聽 聽LOCAl Self := hb_QSelf()
聽 聽LOCAL oPage

聽 聽DEFAULT nSelectPage := 0

聽 聽FOR EACH oPage IN ::aDialogs
聽 聽 聽 AEval( oPage:aControls, {|oCtrl| oCtrl:Refresh() } )
聽 聽NEXT

聽 聽IF Between( nSelectPage, 1, Len( ::aDialogs ) )
聽 聽 聽 ::SetOption( nSelectPage )
聽 聽ENDIF

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION RefreshTotals( lSavePos )
聽 聽LOCAL Self 聽 := hb_QSelf()
聽 聽LOCAL nRecNo := Eval( ::bBookMark )

聽 聽DEFAULT lSavePos := TRUE

聽 聽::MakeTotals()

聽 聽IF lSavePos .and. nRecNo > 0
聽 聽 聽 Eval( ::bBookMark, nRecNo )
聽 聽ENDIF

聽 聽::Refresh()

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION SetMyBmpSort()
聽 聽LOCAL Self := hb_QSelf()
聽 聽LOCAL oBmp, hBmp

聽 聽IF ::aSortBmp[ 1, 1 ] != 0
聽 聽 聽 DeleteObject( ::aSortBmp[ 1, 1 ] )
聽 聽ENDIF
聽 聽IF ::aSortBmp[ 2, 1 ] != 0
聽 聽 聽 DeleteObject( ::aSortBmp[ 2, 1 ] )
聽 聽ENDIF

聽 聽::aSortBmp := {}

聽 聽DEFINE BITMAP oBmp NAME "BMS_ARROWDOWN2"
聽 聽hBmp := oBmp:hBitmap
聽 聽AAdd( ::aSortBmp, { hBmp, 0, nBmpWidth( hBmp ), nBmpHeight( hBmp ), NIL, FALSE } )

聽 聽DEFINE BITMAP oBmp NAME "BMS_ARROWUP2"
聽 聽hBmp := oBmp:hBitmap
聽 聽AAdd( ::aSortBmp, { hBmp, 0, nBmpWidth( hBmp ), nBmpHeight( hBmp ), NIL, FALSE } )

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION MyConfig( lOrder, nFreeze, lCell, lColSize, lSchemeColor, lRowCount )
聽 聽LOCAL Self 聽 := hb_QSelf()
聽 聽LOCAL cAlias := ::cAlias

聽 聽DEFAULT lOrder 聽 聽 聽 := FALSE,;
聽 聽 聽 聽 聽 聽lCell 聽 聽 聽 聽:= FALSE,;
聽 聽 聽 聽 聽 聽lColSize 聽 聽 := FALSE,;
聽 聽 聽 聽 聽 聽lSchemeColor := FALSE,;
聽 聽 聽 聽 聽 聽nFreeze 聽 聽 聽:= 0,;
聽 聽 聽 聽 聽 聽lRowCount 聽 聽:= FALSE

聽 聽::lGDIP 聽 聽 聽 聽 聽 聽 聽 聽 聽:= FALSE
聽 聽::lFlatStyle 聽 聽 聽 聽 聽 聽 := FALSE
聽 聽::nRowHeight 聽 聽 聽 聽 聽 聽 := 24
聽 聽::lRecordSelector 聽 聽 聽 聽:= TRUE
聽 聽::nStretchCol 聽 聽 聽 聽 聽 聽:= STRETCHCOL_LAST
聽 聽::nColDividerStyle 聽 聽 聽 := LINESTYLE_DARKGRAY
聽 聽::lColDividerComplete 聽 聽:= TRUE
聽 聽::nRowDividerStyle 聽 聽 聽 := LINESTYLE_NOLINES
聽 聽//::nColDividerStyle 聽 聽 聽 := LINESTYLE_NOLINES
聽 聽IF !Empty( cAlias )
聽 聽 聽 ::bGoTop 聽 聽 聽 聽 聽 聽 聽:= {|| ( cAlias )->( dbGoTop() ) }
聽 聽 聽 ::bGoBottom 聽 聽 聽 聽 聽 := {|| ( cAlias )->( dbGoBottom() ) }
聽 聽 聽 ::bSkip 聽 聽 聽 聽 聽 聽 聽 := {|n| IIf( hb_isNil( n ), n := 1, ), ( cAlias )->( dbSkipper( n ) ) }
聽 聽 聽 ::bBof 聽 聽 聽 聽 聽 聽 聽 聽:= {|| ( cAlias )->( Bof() ) }
聽 聽 聽 ::bEof 聽 聽 聽 聽 聽 聽 聽 聽:= {|| ( cAlias )->( Eof() ) }
聽 聽 聽 ::bBookMark 聽 聽 聽 聽 聽 := {|n| IIf( hb_isNil( n ), ( cAlias )->( RecNo() ), ( cAlias )->( dbGoTo( n ) ) )}
聽 聽 聽 ::bKeyCount 聽 聽 聽 聽 聽 := {|| ( cAlias )->( ordKeyCount() ) }
聽 聽 聽 ::bKeyNo 聽 聽 聽 聽 聽 聽 聽:= {|| ( cAlias )->( ordKeyNo() 聽 聽) }
聽 聽ENDIF
聽 聽::bClrHeader 聽 聽 聽 聽 聽 聽 := {|| { CLR_BLUE, CLR_BROWTIT, CLR_BLACK } }
聽 聽::bClrSelFocus 聽 聽 聽 聽 聽 := {|| { CLR_WHITE, CLR_MIDNIGHTBLUE } }
聽 聽::bClrFooter 聽 聽 聽 聽 聽 聽 := {|| { CLR_RED, CLR_BROWTIT, CLR_BLACK } }
聽 聽::bClrSel 聽 聽 聽 聽 聽 聽 聽 聽:= {|| { CLR_WHITE, CLR_BLACK } }
聽 聽::l2007 聽 聽 聽 聽 聽 聽 聽 聽 聽:= TRUE
聽 聽::lFullGrid 聽 聽 聽 聽 聽 聽 聽:= FALSE
聽 聽::lAllowColHiding 聽 聽 聽 聽:= FALSE
聽 聽::lAllowColSwapping 聽 聽 聽:= FALSE
聽 聽::lAllowRowSizing 聽 聽 聽 聽:= FALSE
聽 聽::lAllowCopy 聽 聽 聽 聽 聽 聽 := FALSE
聽 聽::lKinetic 聽 聽 聽 聽 聽 聽 聽 := FALSE
聽 聽::lKineticBrw 聽 聽 聽 聽 聽 聽:= FALSE
聽 聽::lHScroll 聽 聽 聽 聽 聽 聽 聽 := FALSE

聽 聽IF nFreeze > 0
聽 聽 聽 ::nFreeze := nFreeze
聽 聽ENDIF

聽 聽IF !lCell
聽 聽 聽 ::nMarqueeStyle := MARQSTYLE_HIGHLROW
聽 聽ELSE
聽 聽 聽 ::bClrRowFocus 聽:= {|| { CLR_BLACK, RGB( 185, 220, 255 ) } }
聽 聽 聽 ::nMarqueeStyle := MARQSTYLE_HIGHLCELL
聽 聽ENDIF

聽 聽//AEval( ::aCols, {|oCol| oCol:cSortOrder := NIL, IIf( !lColSize, ( oCol:lAllowSizing := FALSE ), NIL ) } )
聽 聽AEval( ::aCols, {|oCol| IIf( !lColSize, ( oCol:lAllowSizing := FALSE ), NIL ) } )

聽 聽IF lSchemeColor
聽 聽 聽 ColorScheme( Self )
聽 聽ENDIF

聽 聽IF Type( "nScale" ) != "U" .and. nScale > 1
聽 聽 聽 AEval( ::aCols, {|oCol| IIf( ValType( oCol:nWidth ) == "N", ( oCol:nWidth *= nScale ), NIL ) } )
聽 聽ENDIF

聽 聽IF lRowCount
聽 聽 聽 ::nRecSelWidth 聽:= 50 * IIf( Type( "nScale" ) != "U" .and. nScale > 1, nScale, 1 )
聽 聽 聽 ::nRecSelColor 聽:= CLR_MYCELESTE2
聽 聽 聽 ::bRecSelHeader := "#"
聽 聽 聽 ::bRecSelData 聽 := {|oB| oB:KeyNo }
聽 聽ENDIF

聽 聽::SetMyBmpSort()

RETURN NIL

/*----------------------------------------------------------------------------*/

FUNCTION ShowError()
聽 聽LOCAL Self := hb_QSelf()

聽 聽IF ::nError > 0
聽 聽 聽 MsgStop( ::cError, "MYSQL-ERROR" )
聽 聽ENDIF

RETURN NIL

/*----------------------------------------------------------------------------*/
/*EOF*/
/*----------------------------------------------------------------------------*/
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Sat Jul 22, 2023 02:47 PM
aclarar que para que funcione en harbour, debes incluir la libreria xhb, ademas de los encbezados (.ch) de dicha libraria
algo que no encontre es como darle un valor inicial a cPlcHld y nPlcClr, para ello deberia sobreescribir el metodo new, lo cual no quiero hacer, pero pensando, no se si sea una opcion extender la clase tget con un metodo init y ahi si se pude inicializar las variables. en cuanto a los metodos gotfoucs y lostfocus, no estoy muy claro que hacer ellos...
Code (fw): Select all Collapse
#include "hbclass.ch"

/*----------------------------------------------------------------------------*/

PROCEDURE OverrideAndExtend()
聽 聽 EXTEND CLASS TGET WITH DATA oPlcHld 
聽 聽 EXTEND CLASS TGET WITH DATA cPlcHld
聽 聽 EXTEND CLASS TGET WITH DATA nPlcClr
聽 聽 EXTEND CLASS TGET WITH METHOD SetPlcHld
聽 聽 OVERRIDE METHOD LOSTFOCUS IN CLASS TGET WITH MYLOSTFOCUS
聽 聽 OVERRIDE METHOD GOTFOCUS IN CLASS TGET WITH MYGOTFOCUS
RETURN

FUNCTION MyLostFocus( hCtlFocus )
聽 聽 LOCAL Self := hb_QSelf()
聽 聽 if !empty(::oPlcHld)
聽 聽 聽 聽 if empty(::cText)
聽 聽 聽 聽 聽 聽 ::oPlcHld:nWidth := ::nWidth-8
聽 聽 聽 聽 endif
聽 聽 endif
RETURN ::Super:LostFocus()

FUNCTION MyGotFocus( hCtlFocus )
聽 聽 LOCAL Self := hb_QSelf()
聽 聽 if !empty(::oPlcHld)
聽 聽 聽 聽 ::oPlcHld:nWidth=0
聽 聽 endif
RETURN ::Super:GotFocus()

FUNCTION SetPlcHld( cPlc, nClr )
聽 聽 LOCAL Self := hb_QSelf()
聽 聽 LOCAL oWnd := self
聽 聽 LOCAL nWidth := ::nWidth-8

聽 聽 DEFAULT nClr := ::nPlcClr

聽 聽 ::nPlcClr := nClr
聽 聽 ::cPlcHld := cPlc
聽
聽 聽 if !empty(::cText)
聽 聽 聽 聽 nWidth := 0
聽 聽 endif
聽 聽 
聽 聽 //TO CONTINUE

RETURN NIL
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Fri Jul 28, 2023 01:22 AM

Que pena entrometerme en la conversi贸n, pero para que se usa OVERRIDE?

Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Fri Jul 28, 2023 04:43 AM

digamos que tienes una clase de la cual no tienes las fuentes y deseas modificar el comportamiento de un m茅todo, o agregar uno nuevo, pues usas extend u override para hacerlos, o de plano no deseas modificar las fuentes originales.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1387
Joined: Fri May 23, 2008 01:33 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Mon Aug 18, 2025 09:02 PM

Hi,

Has anyone been able to get the OVERRIDE command to work in harbour? Can anyone share an example?

Thanks,

Regards,



Hakan ONEMLI



Harbour & MSVC 2022 & FWH 23.06
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Tue Aug 19, 2025 06:44 AM
Use this command:
#command OVERRIDE METHOD <!Message!> [IN] CLASS <!Class!> ;
                          WITH [METHOD] <!Method!> [SCOPE <Scope>] => ;
         __clsModMsg( <Class>():classH, #<Message>, @<Method>() )
Posts: 1387
Joined: Fri May 23, 2008 01:33 PM
Re: C贸mo hacer un OVERRIDE en la clase TGET.PRG
Posted: Tue Aug 19, 2025 07:27 AM
Enrico Maria Giordano wrote: Use this command:
#command OVERRIDE METHOD <!Message!> [IN] CLASS <!Class!> ;
                          WITH [METHOD] <!Method!> [SCOPE <Scope>] => ;
         __clsModMsg( <Class>():classH, #<Message>, @<Method>() )
Hi Enrico,

It works. Thanks.
Regards,



Hakan ONEMLI



Harbour & MSVC 2022 & FWH 23.06

Continue the discussion