Page 1 of 1

Ajuste para samples\insptest.prg

PostPosted: Wed Sep 14, 2011 7:53 am
by Carlos Mora
Tratando de probar el inspector de objetos genérico, me arrojaba un error diciendo que la función __CLASSINS no existía. Claro, ahora en Harbour la función se llama __CLASSINSTANCE.
Eso se corrige añadiendo

Code: Select all  Expand view

     #ifdef __HARBOUR__
         #define __CLASSINS __CLASSINSTANCE
     #endif
 


para que cambie el nombre de la función si corresponde. No sé si corresponde aplicar el renombrado con xHarbour, pero sería fácil chequearlo con el mismo método.

Re: Ajuste para samples\insptest.prg

PostPosted: Wed Sep 14, 2011 8:41 am
by Carlos Mora
Otro detalle corregido:

en el método New_, en el bucle que determina las variables de instancia (DATAS), si las datas no son públicas el programa falla y no se recupera del error.

Modifiqué el bucle encerrando la llamada al oSend() en un Begin/Secuence

Code: Select all  Expand view

     /* Enclose in a custom ErrorBlock to catch OOP Errors */
        // bError:= ERRORBLOCK( {|oError| ::Error( oError )} )
        bError:= ERRORBLOCK( {|oError| Break( oError )} )  // cambio el manejador.
        BEGIN SEQUENCE

        FOR cx = 1 TO nLen

         /* ignore strings with a leading Underscore */
          IF !( StrChar( aDict[cx], 1) == '_')
            /* Method */
             IF ASCAN( aDict, LEFT( "_" + aDict[cx], 10 ) ) == 0
                AADD( aMeth, { aDict[cx] } )

            /* Var */
             ELSE
                BEGIN SEQUENCE                              // <--- desde acá
                  uData = OSend( oClient, aDict[cx] )
                RECOVER USING oError
                  uData = NIL
                END SEQUENCE                                 // <--- hasta acá

                AADD ( aIvar, { VALTYPE( uData ), aDict[cx], ::Val2Char( uData )})

             ENDIF


           ENDIF
        NEXT
        RECOVER USING oError
           eval( bError, oError )

        END SEQUENCE
        ERRORBLOCK( bError )

 


Si bien al producirse un error pone como valor de la DATA en NIL y no es muy elegante, al menos permite acceder y ver el resto de los componentes.

Re: Ajuste para samples\insptest.prg

PostPosted: Wed Sep 14, 2011 6:54 pm
by Antonio Linares
Carlos,

Gracias! :-)

El problema ahora es que recientemente hemos añadido unas DATAs PROTECTED a la Clase TWindow y parece que no se puede recuperar ese error. Habria que ver la forma de detectar si una DATA es PROTECTED antes de intentar acceder a ella...

Re: Ajuste para samples\insptest.prg

PostPosted: Wed Sep 14, 2011 7:23 pm
by Antonio Linares
Existe la función __CLSMSGTYPE( oObject:ClassH, cMsgName ), pero necesitariamos __CLSMSGSCOPE( oObject:ClassH, cMsgName )

No es dificil de implementar, vamos a probar... :-)

Re: Ajuste para samples\insptest.prg

PostPosted: Wed Sep 14, 2011 9:06 pm
by Antonio Linares
Implementada y reportada al grupo de desarrollo de Harbour para que si la encuentran util la incluyan en el próximo build de Harbour:

http://groups.google.com/group/harbour-devel/browse_thread/thread/6175d1ca3a54047d#

Re: Ajuste para samples\insptest.prg

PostPosted: Thu Sep 15, 2011 6:41 am
by Carlos Mora
Excelente!

La verdad es que un inspector de objetos es algo que siempre hecho en falta. Alguna vez hablando del tema con Walter Negro, la idea que surgió era que si la DATA estaba como un elemento del array-objeto, sabiendo el índice se podría intentar obtener el valor. En xHarbour Walter lo resolvió, el estaba muy puesto con el tema objetos, pero en Harbour habría que buscar si es posible tener esa funcionalidad.

Gracias.

Re: Ajuste para samples\insptest.prg

PostPosted: Thu Sep 15, 2011 7:20 am
by Carlos Mora
Antonio,

me he puesto a leer classes.c despues de muuucho tiempo. He encontrado que se han implementado las funciones amigas, que aparentemente tienen permitido un acceso menos restringido a los componentes.

HB_FUNC( __CLSADDFRIEND )

permite añadir un símbolo a la lista de funciones amigas, con lo que se podría probar añadir una funcion propia para facilitar la inspección del objeto. No he probado nada, solo lo he estado mirando, en nuestro caso es un método, habrá que crear la función.