Clipper On Line • Ver Tópico - Classe obtendo nome do método/propriedade faltante

Classe obtendo nome do método/propriedade faltante

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

Moderador: Moderadores

 

Classe obtendo nome do método/propriedade faltante

Mensagempor JoséQuintas » 22 Set 2020 09:49

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

Exemplo, criar uma classe pra um DBF:

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.

METHOD Value( cCampo )
   RETURN FieldGet( cCampo )


Até aí seria o uso normal.

DBF:Value( "codigo" )


O que eu queria era justamente usar direto:

DBF:Codigo
DBF:Skip()


Tem alguma coisa do tipo detectar que não existe e pegar esse nome?
Sei lá... de repente....

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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Classe obtendo nome do método/propriedade faltante

Mensagempor rossine » 22 Set 2020 13:50

Olá José,

Veja se este código te ajuda:


// 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.
rossine
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 313
Data de registro: 06 Ago 2007 09:57
Cidade/Estado: Divinópolis-MG
Curtiu: 1 vez
Mens.Curtidas: 21 vezes

Classe obtendo nome do método/propriedade faltante

Mensagempor JoséQuintas » 22 Set 2020 16:59

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

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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro