sábado, 7 de fevereiro de 2009

RTTI - Alterando as Propriedades de Um Objeto

Pode chegar o dia em que você precise acessar alguma (ou algumas) propriedade de um determinado objeto, mas o nome dessa propriedade você só vai conhecer em tempo de execução. Sei que pra muitos pode parecer, no mínimo, excêntrico. Coisa de programador que quer parecer phodão e adora inventar coisas que ninguém entende. Acredite-me, pode realmente chegar o dia em que você vai precisar disso! Aconteceu comigo e agora resolvi compartilhar minha experiência.
Imagine, por exemplo, que você tem um objeto que mapeia uma tabela no banco de dados, com as propriedades idênticas às colunas da tabela e você quer, a partir de um dataset, atribuir às propriedades do objeto os valores de uma linha da tabela. Ok, você dira: "Simples, basta eu esvrever no código a atribuição de todas as colunas às propriedades relacionadas, coluna por coluna". Muito bem, funciona que é uma beleza. Até você precisar fazer isso com outro objeto e com outro e com outro... Sabe, na natureza as coisas seguem o caminho mais fácil (você já viu um rio escalando uma pedra paa poder passar por ela?) e eu procuro fazer o mesmo no meu trabalho. Não quer dizer que eu seja adepto ao deus Thor (deus da marreta).
Então código. Primeiro faça uses em TypInfo. Para atribuir os valores do dataset às propriedades do objeto:


procedure DataSetToObject(ADataset: TDataSet; AObject: TObject);
var
ListProp: TPropList;
Indice: Integer;
begin
Indice := 0;
FillChar(ListProp, High(ListProp), 0);
GetPropInfos(AObject.ClassInfo, @ListProp);

while Assigned(ListProp[Indice]) do
begin
if Trim(ListProp[Indice].Name) <> EmptyStr then

SetPropValue(AObject, ListProp[Indice].Name, ADataSet.FieldByName(ListProp[Indice].Name).Value));

Inc(I);
end;
end;

Para fazer o contrário, ou seja alterar o dataset com as propriedaes do objeto, basta criar outro método e ao invés de SetPropValue use GetPropValue. Eu posso enviar um projeto exemplo por e-mail ou você pode baixar via ftp (usuário: blogdelphi, senha: blog).

Abertura - O que virá.

Vou começar este blog com uma série de mini artigos introdutórios que, depois de terminados, formarão a base para um artigo maior sobre um framework bem interessante que poderá ser usado num modelo de MVC em delphi (apesar de eu já ter ouvido que não dá pra fazer isso em delphi).
Espero que os assuntos aqui abordados sejam de alguma utilizade, mesmo que seja fazê-los rir.