Classe obtendo nome do método/propriedade faltante

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe obtendo nome do método/propriedade faltante

Mensagem por JoséQuintas »

Como crio uma classe pra obter o método/propriedade?

Exemplo, criar uma classe pra um DBF:

Código: Selecionar todos

CLASS DBF
   VAR Alias
   METHOD RecNo()
ENDCLASS
Aí eu queria acessar o campo, pra isso preciso o nome, então...
Eu poderia ter um método pra isso.

Código: Selecionar todos

METHOD Value( cCampo )
   RETURN FieldGet( cCampo )
Até aí seria o uso normal.

Código: Selecionar todos

DBF:Value( "codigo" )
O que eu queria era justamente usar direto:

Código: Selecionar todos

DBF:Codigo
DBF:Skip()
Tem alguma coisa do tipo detectar que não existe e pegar esse nome?
Sei lá... de repente....

Código: Selecionar todos

ON CLASS ERROR
   IF __Property() 
     RETURN ::Value( __PropertyName() )
  ELSEIF __Method() .AND. __MethodName() == "SKIP"
   RETURN dbSkip()
  ENDIF
     Alert( "Indefinido" )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Classe obtendo nome do método/propriedade faltante

Mensagem por rossine »

Olá José,

Veja se este código te ajuda:

Código: Selecionar todos


// EXEMPLO (Asignación Automática)

// http://forums.fivetechsupport.com/viewtopic.php?f=6&t=23214
//
//Designed by: Daniel Garcia-Gil [ danielgarciagil@gmail.com ]
//
//Class TPublic
//Create dynamically Datas
//Create "in fly" new methods


FUNCTION MAIN()

LOCAL oP

cls

oP := TPublic():New()

op:nome     := "Nome teste"
op:Endereco := "Rua teste"
op:Cidade   := "Cidade Teste"
op:Celular  := "Telefone Teste"
op:Empresa  := "Empresa Teste"

oP:Precio   := 1.15
oP:Cantidad := 10

oP:TOTAL    := oP:precio * oP:CANTIDAD

? oP:TOTAL

? op:Nome,op:Endereco,op:Cidade,op:celular,op:empresa

op:End()

Test()

RETURN NIL

FUNCTION Test()

local oP := TPublic():New(), aSave, nPos

oP:Add("Codigo")           // Defino variable sin valor inicial
oP:Add("Precio", 1.15)     // Defino variable con valor inicial
oP:Add("Cantidad", 10 )
oP:Add("TOTAL" )

? oP:Get("Precio")
? oP:Get("CANTIDAD")

// Acceso a variables por prueba/error
oP:Total := oP:Precio * oP:Cantidad


// Definicion y Acceso a variables directamente
oP:Set("Total", oP:Get("precio") * oP:Get("CANTIDAD") )

oP:Del("Total")         // Borro una variable
? oP:IsDef("TOTAL")     // Varifico si existe una variable

nPos := oP:GetPos("Total") // Obtengo la posición en el array
oP:aVars[nPos,2] := 0      // Modifico el Valor en el array directo

aSave := oP:Save()      // Guardo las Variables
oP:Release()         // Borro TODAS las variables
oP:Restore( aSave )     // Restauro las variables

oP:End()       // Termino

RETURN NIL

#include "hbclass.ch"

//------------------------------------------------//

CLASS TPublic

   DATA __hVar__

   METHOD New()
   METHOD AddData( cData )
   METHOD AddMethod( cMethod )
   METHOD DelData( cData )
   METHOD DelMethod( cMethod )
   METHOD IsDefData( cData )     INLINE __objHasData( Self, cData )
   METHOD IsDefMethod( cMethod ) INLINE __objHasMethod( Self, cMethod )

   METHOD Restore()
   
   METHOD Save()
   METHOD SendMsg()

   ERROR HANDLER ONERROR()    


ENDCLASS

//------------------------------------------------//

METHOD New( ) CLASS TPublic

   ::__hVar__ = {=>}

return Self

//------------------------------------------------//

METHOD AddData( cData ) CLASS TPublic
   
   if ! __objHasData( Self, cData )
      __objAddData( Self, cData )      
   endif
   
return nil  
   
//------------------------------------------------//

METHOD AddMethod( cMethod, pFunc )
 
   if ! __objHasMethod( Self, cMethod )  
      __objAddMethod( Self, cMethod, pFunc )    
   endif

return nil

//------------------------------------------------//

METHOD DelData( cData ) CLASS TPublic

   if ! __objHasData( Self, cData )
      __objDelMethod( Self, cData )      
   endif
   
return nil  

//------------------------------------------------//

METHOD DelMethod( cMethod, pFunc ) CLASS TPublic
 
   if ! __objHasMethod( Self, cMethod )  
      __objDelMethod( Self, cMethod )    
   endif

return nil

//------------------------------------------------//
//Return a Array with current data values
METHOD Restore() CLASS TPublic

   local b := {| cKey, uValue | ::SendMsg( "_" + cKey, uValue ) }
   local aOld := __objGetValueList( Self, HB_OO_DATA_SYMBOL )
   
#ifndef __XHARBOUR__  
   hb_HEVAL( ::__hVar__, b )
#else  
   HEVAL( ::__hVar__, b )
#endif  
   
return aOld

//------------------------------------------------//

/*
      oB := TBrowse():New()
      aData := array( 4, 2 )
      aData[ 1, HB_OO_DATA_SYMBOL ] = "nTop"
      aData[ 1, HB_OO_DATA_VALUE  ] = 1
      aData[ 2, HB_OO_DATA_SYMBOL ] = "nLeft"
      aData[ 2, HB_OO_DATA_VALUE  ] = 10
      aData[ 3, HB_OO_DATA_SYMBOL ] = "nBottom"
      aData[ 3, HB_OO_DATA_VALUE  ] = 20
      aData[ 4, HB_OO_DATA_SYMBOL ] = "nRight"
      aData[ 4, HB_OO_DATA_VALUE  ] = 70
      __ObjSetValueList( oB, aData )
      ? oB:nTop      // 1
      ? oB:nLeft     // 10
      ? oB:nBottom   // 20
      ? oB:nRight    // 70
*/

METHOD Save() CLASS TPublic
   
   local aDatas
   local a, cData
   
   aDatas = __objGetValueList( Self, HB_OO_DATA_SYMBOL )

   for each a in aDatas
      cData = Upper( a[ 1 ] )
      if cData != "__HVAR__"
         ::__hVar__[ cData ] = a[ 2 ]
      endif
   next
   
RETURN NIL

//------------------------------------------------//

#ifndef __XHARBOUR__
METHOD SendMsg( cMsg, ...  ) CLASS TPublic
   if "(" $ cMsg
      cMsg = StrTran( cMsg, "()", "" )
   endif
return __ObjSendMsg( Self, cMsg, ... )
#else  
METHOD SendMsg( ... ) CLASS TPublic
   local aParams := hb_aParams()
     
   if "(" $ aParams[ 1 ]
      aParams[ 1 ] = StrTran( aParams[ 1 ], "()", "" )
   endif
 
   ASize( aParams, Len( aParams ) + 1 )
   AIns( aParams, 1 )
   aParams[ 1 ] = Self
   
   return hb_execFromArray( aParams )  
     
#endif


//------------------------------------------------//

METHOD ONERROR( uParam1 ) CLASS TPublic
   local cCol    := __GetMessage()
   local uRet
   
   if Left( cCol, 1 ) == "_"
      cCol = Right( cCol, Len( cCol ) - 1 )
   endif
   
   if ! __objHasData( Self, cCol )
      ::AddData( cCol )
   endif
   
#ifndef __XHARBOUR__
   if uParam1 == nil
      uRet = __ObjSendMsg( Self, cCol )
   else
      uRet = __ObjSendMsg( Self, "_" + cCol, uParam1 )
   endif
#else  
   if uParam1 == nil
      uRet = hb_execFromArray( Self, cCol )
   else
      uRet = hb_execFromArray( Self, cCol, { uParam1 } )
   endif
#endif    
      
RETURN uRet
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Classe obtendo nome do método/propriedade faltante

Mensagem por JoséQuintas »

Pra entender melhor, eliminei o hash array, e a parte inútil, apesar de ser interessante deixar guardado.

Código: Selecionar todos

FUNCTION MAIN()

   LOCAL oP

   CLS

   oP := TPublic():New()

   op:nome     := "Nome teste"
   op:Endereco := "Rua teste"
   op:Cidade   := "Cidade Teste"
   op:Celular  := "Telefone Teste"
   op:Empresa  := "Empresa Teste"

   oP:Precio   := 1.15
   oP:Cantidad := 10

   oP:TOTAL    := oP:precio * oP:CANTIDAD

   ? oP:TOTAL

   ? op:Nome,op:Endereco,op:Cidade,op:celular,op:empresa

   ? op:Seila()
   ? op:Seila()
   Inkey(0)

   RETURN Nil

#include "hbclass.ch"

CLASS TPublic

   ERROR HANDLER ONERROR( uParam1 )

   ENDCLASS

METHOD ONERROR( uParam1 ) CLASS TPublic

   LOCAL cCol    := __GetMessage()
   LOCAL uRet

   ? "ERR", cCol, uParam1
   IF Left( cCol, 1 ) == "_" // com traço é variável
      cCol = Right( cCol, Len( cCol ) - 1 )
      IF ! __objHasData( Self, cCol )
         __objAddData( Self, cCol )
      ENDIF
      IF uParam1 == nil
         uRet = __ObjSendMsg( Self, cCol )
      ELSE
         uRet = __ObjSendMsg( Self, "_" + cCol, uParam1 )
      ENDIF
   ELSE
      uRet := "method not created"
      // IF ! __ObjHasMethod( Self, cMethod )
      //    __ObjAddMethod( Self, cMethod, pFunc )
      // ENDIF
   ENDIF

   RETURN uRet
Só sobrou a rotina de erro na classe, agora que vi kkkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder