O segundo bloco, com o começo da classe:
Código: Selecionar todos
CREATE CLASS PrimeiroClass INHERIT CadastroClass
METHOD AbreArquivos()
METHOD TelaDados( lDigita )
METHOD Especifico()
END CLASS
Ué... não entendi nada....
Aqui está sendo criada a classe PrimeiroClass.
Essa classe recebe por herança (INHERIT) a classe CadastroClass.
Significa que todas as rotinas, TUDO que está na classe CadastroClass, agora também está na classe PrimeiroClass.
E não é só isso, estarei modificando estas três "rotinas".
Comparando:
No jeito tradicional, copia todo fonte, e altera o que for diferente.
Com classe, cria com herança, e altera o que for diferente.
Mesma coisa, sem copiar nada.
É só isso, e tudo isso.....
Como assim? É pouco ou é muito?
Vamos pensar nisso na prática:
Um sistema, principalmente de nota fiscal, tem dezenas de cadastros.
Vixi... De cara já é vantagem.... muito código fonte pode ser eliminado.
Converter fontes antigos então... economiza muito tempo, porque o fonte da sua classe estará testado e pronto pra uso.
E o que mais....
Quer alterar o menu de opções de todos os cadastros de uma vez?
Ele está na classe principal, só alterar a classe principal e pronto.
Quer alterar o menu de opções pra gráfico?
Só alterar a classe principal e pronto.
Quer alterar o menu pra parte de cima, ao invés da parte de baixo?
Aí temos que pensar...
Foi o que eu fiz...
Alterei TelaDados() e Especifico() pra usar Row() + 1 ( linha atual da tela + 1 )
Alterei a classe pra quando entrar nessas opções posicionar no lugar correto.
E por fim, alterei o menu da classe principal, pra botões gráficose parte de cima.
A única coisa que o menu precisa fazer é retornar a letra da opção, não importa como o menu faz isso.
E por aí vai.
Eu comecei a criar a classe pra cadastros, conforme fui fazendo fui vendo o que precisava a mais e fui ajustando.
Nos pedidos, por exemplo, vi necessidade de algo mais, porque nem sempre pode alterar um pedido.
No início do post mostrei uma função reserva: PodeAlterar()
Serve como um exemplo simples de uso, onde a herança nos pedidos cria uma PodeAlterar() própria:
Código: Selecionar todos
METHOD PodeAlterar() CLASS PedidoClass()
IF pedido->Status == "N"
Mensagem( "Não pode mexer em pedido com nota emitida" )
RETURN .F.
ENDIF
IF UserLevel() < 1
Mensagem( "Usuário não tem permissão de alterar pedido" )
RETURN .F.
ENDIF
RETURN .T.
A mesma rotina simples de cadastro, usada pra digitação de pedidos, com checagem de nível de usuário e status de pedido.
Num caso desses, não vai deixar alterar ou excluir.
No caso dessa PodeAlterar(), o método original não fazia nada, mas a classe ficou pronta pra receber esse "adicional".
Basicamente é isso que uso, mas a minha classe tem muito mais coisas, que fui ajustando conforme fui usando para todo o sistema.
Por exemplo, nos pedidos, somente o menu básico não basta, acrescento mais opções no menu.
E acabei usando a classe básica até mesmo para um preview de impressão, pra navegar pelas páginas...
O limite é a imaginação.
E o negócio é não ter pressa.
Vai fazendo devagar, projetando com calma, e alterando um fonte de cada vez, sempre com calma.
Lembre-se que se mudar de idéia, por exemplo alterar o nome de TelaDados() pra outra coisa, terá que alterar todos os fontes que já tiver mexido,
Alterando um cadastro de cada vez vai confirmando se a classe atende ou se precisa de ajuste.
A que postei funciona, mas com certeza precisa ajuste na parte de inclusão, por exemplo, que já cadastra um registro com o código digitado.