DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 
DevWare  
Novidade: DevMedia lança o DevWare - Saiba mais!


  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da ClubeDelphi DIGITAL
ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!

Artigo Clube Delphi 113 - RTTI no dia–a–dia

Persistência de dados e formulários personalizados pelo usuário

[fechar]

Você não gostou da qualidade deste conteúdo?

(opcional) Você gostaria de comentar o que não lhe agradou?





ClubeDelphi 113

[Artigo disponível no Leitor Digital DevMedia. Clique aqui para acessá-lo]

> Clique aqui para ler todos os artigos da ClubeDelphi 113


Boa Ideia
RTTI no dia–a–dia
Persistência de dados e formulários personalizados pelo usuário
 
Do que trata o artigo
Reflexão ou introspecção é a capacidade que muitas linguagens de programação modernas têm de permitir que se criem classes com o conhecimento de sua própria estrutura. Quando as classes “sabem” como são feitas, você pode obter valores de propriedades através de strings, sem necessariamente ter certeza de que a classe em questão realmente tem tal propriedade. Faremos isso usando o mecanismo de RTTI (Runtime Type Information – Informação em tempo de execução) do Delphi, que nos permite obter informações sobre a estrutura dos objetos instanciados. Mas não exploraremos apenas a RTTI, mas mostraremos como ela pode ser utilizada na flexibilização de projetos orientados a objetos.
Para que serve
Perguntando para um objeto se ele tem determinada propriedade e depois obtendo o seu valor nos permite criar em nossas classes métodos genéricos, que podem trabalhar literalmente com qualquer tipo de parâmetro.
Em que situação o tema é útil
Essa técnica pode ser muito útil quando o programador tem um objeto instanciado do tipo TForm, mas não sabe exatamente que form é e precisa consultar ou modificar o valor de determinado atributo.

Resumo do DevMan
    Serão expostas algumas técnicas de RTTI para se obter informações de objetos e persistir essas informações em banco de dados. Serão mostrados desde a criação das tabelas aos métodos para inserir, alterar e excluir registros. Também será apresentado como podemos criar interfaces que o próprio usuário possa alterar, diminuindo assim os custos de manutenções simples como trocar a cor ou posição de controles no formulário.

Trabalhando com desenvolvimento de software nos deparamos com inúmeras situações em que nossos clientes nos pedem customizações. Algumas vezes estas são mudanças significativas, mas interessantes, que podemos incorporar em nossos produtos e agregar valor aos nossos projetos. Entretanto a maioria das vezes essas alterações são úteis para apenas um cliente, às vezes nos forçando a trabalhar com dois projetos em paralelo.
    Essa tendência nos leva a criar sistemas bastante customizáveis, com muitos parâmetros de configuração. Estamos nos habituando a programar orientado a objetos criando classes cada vez mais genéricas para que possamos trocar livremente os objetos, unidades e componentes do nosso sistema.
    Quando precisamos passar como parâmetro para um método de uma classe um objeto de uma classe qualquer já instanciado, numa variável do tipo TObject, para ser “genérico”, dentro do escopo do método precisamos saber de que tipo esse objeto é, para podermos alterar seguramente as suas propriedades e invocar suas funções e procedimentos. Há uma maneira mais elegante de tratar esses objetos genéricos do que fazer Typecasts, muitas vezes inseguros, ou uma lista interminável de desvios condicionais com muitos if's e cases.
    As linguagens de programação modernas fornecem um recurso chamado Introspecção, ou Reflexão, que é a habilidade de uma classe de “conhecer” detalhes sobre sua estrutura, seus metadados, métodos e propriedades.
    O Delphi provê essa habilidade na sua RTTI (Runtime Type Information - Informação em Tempo de Execução).     Criada há mais de 10 anos, a RTTI tinha o objetivo inicial de facilitar o desenvolvimento da própria IDE do Delphi, para que ela pudesse cumprir com uma de suas missões que é “conhecer” as classes que estão sendo criadas ou usadas pelo desenvolvedor. Ela é amplamente utilizada na nossa ferramenta, por isso que o Object Inspector sabe de cada propriedade, valor e evento do componente que selecionamos, não importando qual componente seja.
    Embora a RTTI nunca tenha sido bem documentada fora da equipe de desenvolvimento do Delphi, ela sempre pôde ser usada por programadores para facilitar algumas de suas tarefas na programação orientada a objetos.
    Vamos ver como essa tecnologia pode nos ajudar a economizar bastante tempo, criar interfaces customizáveis para nossos clientes e usar a RTTI no dia-a-dia.
Conhecendo o básico
Talvez o leitor já use RTTI e não sabe. Sempre que usamos os operadores “is” para perguntar se um objeto é de um determinado tipo e “as” para fazer um Typecast seguro estamos usando na verdade RTTI.
Vamos ao código, que fala muito melhor a nossa língua. Usaremos neste exemplo o Turbo Delphi 2006, que pode ser obtido pelo site da Embarcadero. Fique à vontade para usar versões mais atuais do Delphi, apenas fique atento ao usar a versão 7 ou 2010. A versão 7 possui algumas diferenças, e o a 2010 teve a RTTI bastante modificada, assunto que já foi abordado aqui na revista e não focaremos neste artigo.
Crie uma nova aplicação Delphi VCL Forms para win32, renomeie o Form1 para frmTesteRTTI. Esta será nossa form principal e todos os nossos testes e exemplos partirão dela. Salve o projeto como ExemploRTTI.dpr e a Unit1 como uFrmTesteRTTI.pas. Inclua um Edit com o nome de edTeste e um Button com o nome de btTesteEdit.
    Crie uma procedure chamada AlteraTexto, que receba 2 parâmetros, um TObject  e uma string. Essa procedure será responsável por mudar o texto de nosso Edit e de qualquer outro componente que colocarmos no formulário. E depois vamos codificar o evento onClick do botão btTesteEdit para chamar esse procedimento passando como primeiro parâmetro o edTeste e como segundo parâmetro a mensagem  super original  “Alô Universo!”.
Neste método usaremos os operadores “is” para saber o tipo do objeto passado como parâmetro e o operador “as” para converter para o tipo que precisamos. Esse código pode ser visto na Listagem 1.

Listagem 1. Procedure AlteraTexto e botão btTesteEdit
//método público deste form: AlteraTexto
procedure TfrmTesteRTTI.AlteraTexto(obj: TObject; texto: string);
begin
  if obj is TEdit then            //verifica: obj é mesmo um edit?
    (obj as TEdit).Text := texto; //então, sendo um edit, modificamos a propriedade Text
end;

procedure TfrmTesteRTTI.btTesteEditClick(Sender: TObject);
begin
  AlteraTexto(edTeste, 'Olá Universo!');
end;

Este código não faz nada mais que usar o operador “is” para saber de que classe que é o objeto e o operador “as” para fazer typecast seguro e acessar suas propriedades. Uma das várias vantagens do Typecast seguro é que, se você tentar converter para o tipo errado, a instrução não vai passar deste ponto e causar um access violation depois da conversão, mas vai disparar uma exceção do tipo EinvalidCast com a mensagem “Invalid class typecast” no momento da conversão.
    Até agora, nenhuma novidade. Esta procedure que criamos não é muito útil, mas repare que ela não necessariamente precisaria estar neste formulário. Ela poderia estar em qualquer uma das nossas classes de negócio, servindo inclusive para preencher nossos forms.
    Vamos criar um outro botão, com o nome de btTesteCombo e adicionar um ComboBox com o nome cmbTeste. Nosso formulário ficará como a Figura 1.

 
Figura 1. Form com Edit, ComboBox e botões

Vamos fazer a mesma coisa agora para verificar o ComboBox. No código do btTesteCombo, repetimos o mesmo código do botão anterior, apenas passando o cmbTeste como primeiro parâmetro. A procedure AlteraTexto deve ser mudada para suportar o ComboBox, adicionando um if para verificar se o tipo é um TEdit ou um TComboBox, conforme a Listagem 2."
A exibição deste artigo foi interrompida.

  Este é um post disponível para assinantes MVP
Este post também está disponível para assinantes da ClubeDelphi DIGITAL
ou para quem possui Créditos DevMedia.  Clique aqui para saber mais!


Vitor Rubio
Tecnólogo em Processamento de Dados pela FATEC-SP e MCP. Atua como analista de Sistemas Sênior na Editora Revista dos Tribunais. Programa com Delphi desde a versão 3.
O que você achou deste post?

    2 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Vinicius Pedrosa De Oliveira.
Teria como disponibilizar o código-fonte deste artigo?
[há +1 mês] - Responder

 

Wesley Yamazack
Olá Vinicius, você pode baixar o código fonte no link: http://www.devmedia.com.br/revista-clube-delphi-edicao-113/15250

Um abraço e bons estudos.
[há +1 mês] - Responder
 
Cursos relacionados
Publicidade
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
[Fechar] Você precisa estar logado para dar seu feedback.

Clique aqui para efetuar o login

Caso não tenha um cadastro DevMedia, clique aqui para se cadastrar (gratuito)
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03