Files
harbour-core/harbour/tests/dynobj.prg
Viktor Szakats 175f05df56 2013-02-26 14:41 UTC+0100 Viktor Szakats (harbour syenar.net)
* utils/hbmk2/hbmk2.*.po
  * utils/hbmk2/hbmk2.prg
    + do not share plugin variables (hbmk[ "vars" ])
      between different plugins. It avoids potentially nasty
      issues with plugins stepping onto each other's toes.
      [INCOMPATIBLE - though it's unlikely anyone is
      affected. If you must communicate between plugins,
      use public function or variable.]
    + clarified in help that -icon might not work on all
      platforms/compilers and detailed Windows implementation
      (in particular it's disabled on bcc/bcc64 and on
      mingw it won't work when a manual .rc is specified,
      also on some (old?) msvc versions. Consult your
      C compiler's Windows resource handling limitations.)
    + clarified in help the syntax of filters
    + clarified in help that .hbp references are handled as
      sub-projects
    + clarification to command substitution macro
    + clarification to filter syntax note
    ! strict parameter checks in all public shell APIs to
      avoid RTEs inside hbmk2 due to faulty API usage by scripts

  * utils/hbmk2/examples/plug_bis.hb
    * updated according to latest plugin changes

  * include/harbour.hbx
  * include/hbapi.h
  * src/vm/debug.c
  * src/vm/hvm.c
    + added internal function hb_vmInternalsEnabled()
      to query whether potentially sensitive internals
      are allowed to be accessed by public Harbour APIs
    + added .prg level function __vmNoInternals()
      to disable potentially sensitive internals
      by default accessible via public APIs.
      Intentionally a one-way function: once disabled,
      it cannot be reenabled from .prg or .c level.
      NOTE: It will break Harbour debug functionality,
      so it'd will be useful for hbrun scripts and
      release (non-debug) builds.
    + modified internal __dbg*() functions to return
      dummy values when internals are disabled via
      __vmNoInternals() functions. While the function
      return types are kept, apps relying on their
      specific values and certain relationships between
      them might break.
    ; NOTE: In the future, some more internals might
      be protected by this setting (f.e. low-level
      object and class functions and some API from
      hbdebug lib)
    ; Please review

  * tests/debugtst.prg
    ! fixed to compile warning-free without lowering
      warning level
    ! fixed to run RTE-free with internals disabled

  * bin/3rdpatch.hb
  * bin/commit.hb
  * config/postinst.hb
  * contrib/make.hb
  * contrib/hbtest/hbtest.ch
  * src/debug/*.prg
  * src/rtl/tclass.prg
  * utils/hbmk2/examples/plug_bis.hb
  * utils/hbmk2/examples/plug_tpl.hb
    * use short form #pragmas (the ones identical
      to Harbour options)
    ; NOTE: Except -l which works reversed compared
      to cmdline -l option. TOFIX? (I tried and failed)

  * src/rtl/hbi18n2.prg
  * contrib/xhb/tfile.prg
    * use F_ERROR instead of -1 literal

  * contrib/xhb/xhbtedit.prg
    ! replaced dirty xhb extension with std SubStr() call
      Reported by Tony Quick
      [pls report such bugs on Harbour devl list]

  * contrib/hbodbc/todbc.prg
    ! Don't continue ::Open() when SQLExecDir() have error
      Fix from xhb via Vicente Guerra, with cleanups.

  * tests/multifnc/multifnc.hbp
    + added comment
    + support for watcom

  * tests/multifnc/t1.prg
    ! missing file ending EOL

  * tests/*.prg
  * extras/gtwvw/tests/wvwtest9.prg
    * formatting
2013-02-26 13:44:10 +00:00

165 lines
3.2 KiB
Plaintext

/*
* $Id$
*/
//
// DynObj
//
// Implementation of dynamic objects in Harbour
//
// Written by Eddie Runia <eddie@runia.com>
// www - http://harbour-project.org
//
// Placed in the public domain
//
PROCEDURE Main()
LOCAL oForm := TForm():New()
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
/* Let's add an inline at run-time. Should already be possible */
? "Let's add inline 'CalcArea' at run-time to an already instanced class"
__objAddInline( oForm, "CalcArea", ;
{| self | ( ::nRight - ::nLeft ) * ( ::nBottom - ::nTop ) } )
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
? "What is the Form area ?"
? oForm:CalcArea()
? "Let's add method 'Smile' at run-time to an already instanced class"
__objAddMethod( oForm, "Smile", @Smile() )
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
? "Smile please "
oForm:Smile()
Pause()
? "Data items before"
? hb_ValToExp( oForm )
? "Let's add an additional data item"
__objAddData( oForm, "cHelp" )
oForm:cHelp := "This is a real tricky test"
? "Data items after"
? hb_ValToExp( oForm )
Pause()
? "Let's attach a bigger smile"
__objModMethod( oForm, "Smile", @BigSmile() )
? "Let's smile"
oForm:Smile()
? "And CalcArea() will now give a result in square inches"
__objModInline( oForm, "CalcArea", ;
{| self | ( ::nRight - ::nLeft ) * ( ::nBottom - ::nTop ) / ( 2.54 * 2.54 ) } )
? "What is the Form area ?"
? oForm:CalcArea()
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
? "Delete CalcArea"
__objDelInline( oForm, "CalcArea" )
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
? "Delete Smile"
__objDelMethod( oForm, "Smile" )
? "What methods are in the class :"
? hb_ValToExp( __objGetMethodList( oForm ) )
Pause()
? "Data items before"
? hb_ValToExp( oForm )
? "Let's delete cHelp"
__objDelData( oForm, "cHelp" )
? "Data items after"
? hb_ValToExp( oForm )
/* oForm:cHelp := "Please crash" */
RETURN
FUNCTION TForm()
STATIC s_oClass
IF s_oClass == NIL
s_oClass := HBClass():New( "TFORM" ) // starts a new class definition
s_oClass:AddData( "cText" ) // define this class objects datas
s_oClass:AddData( "nTop" )
s_oClass:AddData( "nLeft" )
s_oClass:AddData( "nBottom" )
s_oClass:AddData( "nRight" )
s_oClass:AddMethod( "New", @New() ) // define this class objects methods
s_oClass:AddInline( "Show", {| self | ::cText } )
s_oClass:Create() // builds this class
ENDIF
RETURN s_oClass:Instance() // builds an object of this class
STATIC FUNCTION New()
LOCAL Self := QSelf()
::nTop := 10
::nLeft := 10
::nBottom := 20
::nRight := 40
RETURN Self
STATIC FUNCTION Smile()
LOCAL self := QSelf()
IF ::CalcArea() == 300
? ":-)"
ELSE
? ":-("
ENDIF
RETURN self
STATIC FUNCTION BigSmile()
LOCAL self := QSelf()
? ":-)))"
RETURN self
FUNCTION Pause()
__Accept( "Pause :" )
RETURN NIL