Esse artigo faz parte da revista Clube Delphi edição 26. Clique aqui para ler todos os artigos desta edição

 

Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Conheça seu programa por dentro

Uma introdução à RTTI

Este artigo trata da RTTI (Runtime Type Information), uma tecnologia que permite obter informações sobre as classes existentes em uma aplicação Delphi, em tempo de execução.

A tecnologia RTTI possui um correspondente em Java (o conceito de reflexão, ou reflection), através do qual se pode saber tudo sobre uma classe. O programador consegue inferir e descobrir informações sobre o que quiser.

Já em Delphi, apenas informações publicadas (published) das classes estão disponíveis para consulta. Informações públicas e privadas não são disponibilizadas pela RTTI. Outro ponto importante é que as funcionalidades disponibilizadas pela RTTI para os programadores são expandidas a cada versão do Delphi. Por exemplo, uma das funcionalidades que vamos usar nas seções seguintes, para buscar informações sobre classes, funciona perfeitamente no Delphi 6, mas no Delphi 3, por exemplo, ainda não existia. Certamente, nas próximas versões do Delphi, mais e mais funcionalidades aparecerão.

A idéia deste artigo é mostrar para o leitor o básico sobre a RTTI, com vários exemplos, e depois apresentar algumas funcionalidades adicionais que vão mostrar um pouco do poder dessa tecnologia.

Exemplo1: nome e tipo de componentes

Como primeiro exemplo, vamos perguntar para os componentes existentes em um Form Delphi qual o nome deles e a qual classe pertencem. Se o componente for um componente visual, vamos também obter o componente em que está contido. Vamos jogar o resultado deste exemplo dentro de um componente Memo.

Em um Form, coloque um Memo, um botão e outros componentes a seu gosto. No evento OnClick do botão, coloque o seguinte código:

 

procedure TFormExemploClassName.BtnObterInfoClick(

  Sender: TObject);

var

 i: Integer;

begin

  Memo1.Lines.Clear;

  for i := 0 to Self.ComponentCount - 1 do

    if(Self.Components[i] is TWinControl) then

       Memo1.Lines.Add(

          Self.Components[i].Name + ' = ' +

          Self.Components[i].ClassName + ' ('+

          TWinControl(Self.Components[i]).Parent.Name + ')')

    else

       Memo1.Lines.Add(

          Self.Components[i].Name + ' = ' +

          Self.Components[i].ClassName + ' (null)');

end;

 

...

Quer ler esse conteúdo completo? Tenha acesso completo