This is an example, in next posts we will check more advanced techniques from Manuel Exp贸sito:
#include <hbapi.h>
#include <hbapicls.h>
#include <hbapiitm.h>
#include <hbstack.h>
typedef struct {
聽 聽 int x;
聽 聽 int y;
} Point;
// Set the x value for the Point object
HB_FUNC_STATIC( POINT_SETX )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽Point * p;
聽 聽hb_arrayGet( pSelf, 1, hb_stackReturnItem() );
聽 聽p = hb_parptr( -1 );
聽 聽if( p )
聽 聽{
聽 聽 聽 hb_retni( p->x );
聽 聽 聽 p->x = hb_parni( 1 );
聽 聽}
聽 聽else
聽 聽 聽 hb_retni( 0 ); // raise an error ? 聽
}
// Get the x value from the Point object
HB_FUNC_STATIC( POINT_GETX )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽Point * p;
聽 聽hb_arrayGet( pSelf, 1, hb_stackReturnItem() );
聽 聽p = hb_parptr( -1 );
聽 聽if( p )
聽 聽 聽 hb_retni( p->x );
聽 聽else
聽 聽 聽 hb_retni( 0 ); // raise an error ?
}
// Set the y value for the Point object
HB_FUNC_STATIC( POINT_SETY )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽Point * p;
聽 聽hb_arrayGet( pSelf, 1, hb_stackReturnItem() );
聽 聽p = hb_parptr( -1 );
聽 聽if( p )
聽 聽{
聽 聽 聽 hb_retni( p->y );
聽 聽 聽 p->y = hb_parni( 1 );
聽 聽}
聽 聽else
聽 聽 聽 hb_retni( 0 ); // raise an error ? 聽
}
// Get the y value from the Point object
HB_FUNC_STATIC( POINT_GETY )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽Point * p;
聽 聽hb_arrayGet( pSelf, 1, hb_stackReturnItem() );
聽 聽p = hb_parptr( -1 );
聽 聽if( p )
聽 聽 聽 hb_retni( p->y );
聽 聽else
聽 聽 聽 hb_retni( 0 ); // raise an error ?
}
HB_FUNC_STATIC( POINT_NEW )
{
聽 聽 PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽 Point * p = ( Point * ) hb_xgrab( sizeof( Point ) );
聽 聽 p->x = hb_parni( 1 );
聽 聽 p->y = hb_parni( 2 );
聽 聽 hb_arraySetPtr( pSelf, 1, p );
聽 聽 hb_itemReturn( pSelf ); 聽// return Self
}
HB_FUNC_STATIC( POINT_DESTROY )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽PHB_ITEM p = hb_itemNew( NULL );
聽 聽hb_arrayGet( pSelf, 1, p );
聽 聽if( hb_itemGetPtr( p ) )
聽 聽{
聽 聽 聽 hb_xfree( hb_itemGetPtr( p ) );
聽 聽 聽 hb_arraySetPtr( pSelf, 1, NULL );
聽 聽} 聽
聽 聽hb_itemRelease( p );
}
HB_FUNC_STATIC( POINT_GETPOINTDATA )
{
聽 聽PHB_ITEM pSelf = hb_stackSelfItem();
聽 聽hb_arrayGet( pSelf, 1, hb_stackReturnItem() ); 聽// 1 for first DATA
}
// class creation
HB_FUNC( POINT )
{
聽 聽static HB_USHORT uiClass = 0;
聽 聽if( uiClass == 0 )
聽 聽{
聽 聽 聽 uiClass = hb_clsCreate( 1, "POINT" ); // just one DATA
聽 聽 聽 // Add methods to the class
聽 聽 聽 hb_clsAdd( uiClass, "POINTDATA", HB_FUNCNAME( POINT_GETPOINTDATA ) ); 聽// the only DATA we are using
聽 聽 聽 hb_clsAdd( uiClass, "_X", HB_FUNCNAME( POINT_SETX ) );
聽 聽 聽 hb_clsAdd( uiClass, "X", HB_FUNCNAME( POINT_GETX ) );
聽 聽 聽 hb_clsAdd( uiClass, "_Y", HB_FUNCNAME( POINT_SETY ) );
聽 聽 聽 hb_clsAdd( uiClass, "Y", HB_FUNCNAME( POINT_GETY ) );
聽 聽 聽 hb_clsAdd( uiClass, "DESTROY", HB_FUNCNAME( POINT_DESTROY ) );
聽 聽 聽 hb_clsAdd( uiClass, "NEW", HB_FUNCNAME( POINT_NEW ) );
聽 聽}
聽 聽// create the object
聽 聽hb_clsAssociate( uiClass );
}