Página 1 de 1

SETGET Como funciona em uma classe

Enviado: 09 Fev 2021 22:09
por asimoes
Alguém que entende de criação de classe, poderia me explicar como funciona o SETGET com algum exemplo?

SETGET Como funciona em uma classe

Enviado: 09 Fev 2021 23:09
por JoséQuintas
Não olhei os detalhes, mas basicamente o SETGET é usar uma função como se fosse variável.
Isso permite algum tratamento extra nela.

SETGET Como funciona em uma classe

Enviado: 09 Fev 2021 23:23
por JoséQuintas

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main

   LOCAL xTela := c():New()

   SetMode( 20, 80 )
   xTela:nRow := 10
   @ Row(), Col() SAY "teste"
   xTela:nRow := 12
   @ Row(), Col() SAY "outro"
   Inkey(0)

   RETURN

CLASS c
   METHOD nRow( xValue ) SETGET
   END CLASS

METHOD nRow( xValue ) Class c

   IF xValue != NIL
      @ xValue, 0 SAY ""
   ENDIF

   RETURN Row()
Usa nRow como variável, mas ela faz mais que uma simples variável.

De repente, pra controles, oControl:BackColor := 127646
E o método BackColor trocaria a cor de fundo do controle.

SETGET Como funciona em uma classe

Enviado: 10 Fev 2021 01:34
por alxsts

SETGET Como funciona em uma classe

Enviado: 10 Fev 2021 09:00
por asimoes
Desculpa a minha falta de informação, o uso do SETGET seria isso:

::metodo():variavel := "teste" //para SET

teste := ::metodo() //para GET

?

SETGET Como funciona em uma classe

Enviado: 10 Fev 2021 09:25
por Fernando queiroz
asimoes escreveu:Desculpa a minha falta de informação, o uso do SETGET seria isso:

::metodo():variavel := "teste" //para SET

teste := ::metodo() //para GET

?
Não, assim você estaria colocando valores nas variáveis publicas da classe.

desta forma você correria o risco de receber na variável um comando de apagar o banco de dados.
o SET / GET seria uma função para colocar valores nas variáveis PROTECTED: passando por criticas para que isso não aconteça

Código: Selecionar todos

CREATE CLASS CADASTROSCLASS


	METHOD New( ParamServer )   INLINE   ::oServer := ParamServer, Self
	METHOD CADASTROS_MANUTENCAO(  )
	METHOD CADASTROS_PESQUISA_FORNECEDORES(  ) 
	METHOD CADASTROS_PESQUISA_CLIENTES(  )
	METHOD CADASTROS_PESQUISA_CLIENTES_REMOTO( cFilial )
	METHOD CADASTROS_PESQUISA_FUNCIONARIOS(  )

PROTECTED:

	VAR oServer
	VAR cReportOption
	VAR cDefaultPrinter
	VAR nPrinterType

	VAR TIPCLI  			INIT 1
	VAR NRAZ_SOC		
	VAR CPFANT  		
	VAR CPFCGC  		
	VAR INSEST  	
	VAR INSMUN  	
	VAR ISENTO  		
	VAR SUFRAMA 		
	VAR EMAIL   		
	VAR ENDER   		
	VAR NUMERO  		
	VAR COMPLEM 		
	VAR BAIR    		
	VAR CEP     	
	VAR PAIS    			INIT "BRASIL"		
	VAR UF      			INIT "AC"	
	VAR CIDADE  			INIT "RIO BRANCO"
	VAR FONE    		
	VAR CONTATO 		
	VAR DATCAD	 			INIT CTOD("00-00-0000")
	VAR DATALT  			INIT CTOD("00-00-0000")
	VAR LIMCRE  			INIT 0.00
	VAR TOTCRE  			INIT 0.00
	VAR VENBLO  			INIT 1
	VAR FL_CLIENTE			INIT .F.
	VAR FL_FORNECEDOR		INIT .F.
	VAR FL_FUNCIONARIO		INIT .F.
	VAR FL_EXFUNCIONARIO 	INIT .F.
	VAR cRichedit1     		INIT .F.


	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS_CARREGA( PERINI, PERFIN, FORNECEDOR_ID, nTotalVales )
	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS_onDlgInit( oDlg, nTotalVales )
	METHOD CADASTROS_CONSULTA_VALES_FUNCIONARIOS( FORNECEDOR_ID, NRAZ_SOC )
No caso eu teria que criar um metodo para colocar valores nas variaveis protegidas (SET) e outro metodo para pegar o retorno (GET)

https://youtu.be/6wVmqY-CrGM

SETGET Como funciona em uma classe

Enviado: 10 Fev 2021 12:32
por asimoes
Fernando,

Obrigado pela sua explicação, mas não vi o uso de SETGET que a hbclass permite

SETGET Como funciona em uma classe

Enviado: 15 Mar 2023 00:44
por vcatafesta
Poderá usar o SETGET de várias formas:

Código: Selecionar todos

METHOD getName()
   return ::Name

METHOD setName(cName)
   ::Name := cName;

METHOD setgetName(cName)
  if pcount() == 1
      ::Name := cName
   endif
   return ::Name

METHOD Max(nMaxCounter)
  if pcount() == 1
      ::MaxCounter := nMaxCounter
   endif
   return ::MaxCounter


SETGET Como funciona em uma classe

Enviado: 15 Mar 2023 08:26
por ivanil
Caro amigo,

Sugiro que dê uma olhada na documentação para fazer uso do melhor que a Classe pode oferecer, abaixo um exemplo que uso;

Código: Selecionar todos

CREATE CLASS TConfig

    //Ate mesmo as variaveis podem ser controladas a nivel de visibilidade/alteração/Nivel
    DATA Chave        INIT ""
    DATA PATH         INIT ""
    DATA Usuario      INIT ""   ReadOnly  EXPORTED //Guarda o nome do usuario
    DATA Usu          INIT ""   ReadOnly  EXPORTED //Guarda o codigo do usuario criptografado
    ....
    //Get  cTitle := ::Title  //o interessante é que voce pode ate mesmo omitir o Set
    ACCESS Title      INLINE if( TestaVar( '_'+::Name ),GetwindowText( GetFormHandle( ::Name ) ),"" )
    //Set  ::Title := cTitle
    ASSIGN Title( c )   INLINE if( TestaVar( '_'+::Name ),SetwindowText( GetFormHandle( ::Name ), c ),"" )

    DATA cor          INIT  { 212, 208, 200 }
    
    METHOD New()
    METHOD Password()
    
    ENDCLASS
    // ***************************************************************************
    // //////////////////////////////////////////////////////////////////////////
    // ***************************************************************************

SETGET Como funciona em uma classe

Enviado: 15 Mar 2023 15:00
por vcatafesta
JoséQuintas escreveu:

Código: Selecionar todos

#include "hbclass.ch"

PROCEDURE Main

   LOCAL xTela := c():New()

   SetMode( 20, 80 )
   xTela:nRow := 10
   @ Row(), Col() SAY "teste"
   xTela:nRow := 12
   @ Row(), Col() SAY "outro"
   Inkey(0)

   RETURN

CLASS c
   METHOD nRow( xValue ) SETGET
   END CLASS

METHOD nRow( xValue ) Class c

   IF xValue != NIL
      @ xValue, 0 SAY ""
   ENDIF

   RETURN Row()
Usa nRow como variável, mas ela faz mais que uma simples variável.

De repente, pra controles, oControl:BackColor := 127646
E o método BackColor trocaria a cor de fundo do controle.
Na verdade a proposta do SETGET ou "settergetter" em todas as linguagens é ler e escrever dados encapsulados.
O significado de encapsulamento é garantir que os dados "sensíveis" são ocultados dos usuários.
Para conseguir isso, você deve declarar variáveis/atributos de classe como private(não pode ser acessado de fora da classe).
Se você quiser que outras pessoas leiam ou modifiquem o valor de um membro privado, você pode fornecer get público e definir métodos.

Da forma exposta pelo cavalheiro, esse teu código não se presta tal para proposta, em vista da implementação equivocada diante da proposta do SETGET.
Nesse teu caso, o METHOD nrow() está trabalhando como uma função normal.
O correto nessa implementação seria basicamente assim:

Código: Selecionar todos

#include "hbclass.ch"

function main()
   LOCAL xTela := c():New()

   //SetMode(20, 80)
   Scroll()
   SetPos( 0, 0 )

   @ xTela:Getrow, Col() SAY "1st teste" // row foi definido em 10 default na criação da classe

   xTela:setRow(11) // ou xTela:setgetRow(10)
   @ xTela:Getrow, Col() SAY "2nd teste"

   xTela:setRow(12) // ou xTela:setgetRow(12)
   @ xTela:getRow, Col() SAY "3th teste"

   inkey(0)
   // linha abaixo somente para mostrar o erro ao acessar variável privada/hidden
   @ xTela:Row,      Col() SAY "outro" // Error BASE/41  Scope violation (hidden): C:ROW
   return nil

CLASS c
   HIDDEN:
      VAR row INIT 10
   EXPORTED:
      METHOD setgetRow(xValue) SETGET
      METHOD setRow(xValue) SETGET
      METHOD getRow() SETGET
END CLASS

METHOD setgetRow(xValue) Class c
   IF xValue != NIL
      ::row := xValue
   ENDIF
   return ::row

METHOD setRow(xValue) Class c
   IF xValue != NIL
      ::row := xValue
   ENDIF

METHOD getRow(xValue) Class c
   return ::row