Delphi@Brasil Magazine - Maio 98


Tópico do mês : Criação de um componentes simples, que nos fornece meios de exibir um hint de um componente em mais de uma linha.

- O componente deste mês é relativamente pequeno em tamanho, mas por trás estão conceitos avançados, que serão dissecados aqui de modo que auxiliará o programador que queira conhecer um pouco mais sobre o funcionamento da VCL do Delphi. O componente nada mais faz do que ler todos os componentes pertencentes a um Form, e a partir disto pesquisar na String Hint de cada TControl(muito importante), se existe a ocorrência de um caractere especial, que no nosso caso será "|", porém pode ser qualquer um adotado pelo programador.

- Para iniciarmos o trabalho vamos fazer uma pesquisa de modo a encontrar qual o objeto na árvore da VCL que é a responsável pela criação do Hint. Por quê isto ? Posteriormente você irá verificar que fazemos uma tipagem de modo a descobrir se o componente no Form é descendente deste objeto responsável pela criação do hint, caso seja nos faremos o tratamento. Mas como faremos isso ? Aí é que entra uma parte do Help do Delphi altamente útil, mas pouco utillizada. É o menu Hierarchy do help, o qual nos traz todos os ancestrais do objeto por ordem de criação. Para acharmos onde o hint é criado, vá até o help do Delphi e digite por exemplo TButton no índice do Delphi e dê um duplo clique na opção TButton. A partir disso aparece a definição do componente, e do lado superior esquerdo o menu hierarchy. Clique nele e surgirá a tela mostrada na figura I. Mas e agora ? Podemos clicar em cima de cada tipo de objeto para nos certificarmos que o hint não foi criado ali, porém vamos dar um chute mais ou menos conciente, vamos clicar em TWinControl.

Figura I

- Quando abrirmos a tela de help de TWinControl clicamos em Properties, e verificamos se existe a propriedade Hint, como não a encontramos ela deve estar num objeto mais ancestral ainda, então clicamos novamente em Hierarchy e escolhemos o ancestral direto que será o TControl. Clicamos novamente em Properties e desta vez encontramos a propriedade Hint como verificado na figura II.

Figura II.

- Pronto, agora que sabemos que nosso objeto vai ter de verificar se o objeto no Form é do tipo ou descendente de TControl podemos começar a escrever o código. Para iniciar vá até o menu components e escolha a opção New Component e preencha os dados como mostrado na figura III.

Figura III

- Veja que escolhemos como ancestral o tipo TComponent, já que nosso componente será simples, apenas colocado no Form sem mais nenhuma opção. Após clicarmos em Create Unit vamos dar um Override no construtor Create de TComponent, e nesse create será digitado todo o código necessário para o funcionamento do nosso componente. Primeiro começamos com a declaração de Inherited o que é comun em todo o Override de create, a não ser que saibamos exatamente inicializar todas as propriedades herdadas do ancestral. Agora é que começa o código. Vamos parar um pouco para pensar. Como podemos verificar quais são todos os componentes presentes num Form ? Simples, para isso vamos criar uma variável X do tipo Integer, que nos servirá como índice no loop dos componentes e criemos um loop For de modo que seja declarado nesta forma :

For X := 0 to AOwner.ComponentCount - 1 do

- Veja que AOwner é componente possuidor do nosso componente que é do tipo TControl, ou seja necessita estar num objeto que tenha um handle(TForm, TPanel etc...). Então nosso loop vai do componente O(primeiro componente), até o último componente representando por AOwner.ComponentCount, o que seria mais ou menos o mesmo que Form1.ComponentCount - 1 caso o nome do componente possuidor do nosso componente fosse Form1.

- Agora que criamos o loop ficou mais fácil verificar o tipo de componente e se este têm a propriedade hint que queremos alterar. Isto é feito no seguinte código :

if AOwner.Components[X] IS TControl then

- Ou seja se o componente atual no loop for do tipo TControl(ou descendente), então este possui a propriedade hint a qual queremos alterar. Notar o uso da palavra IS, que nos retorna um booleano para uma RTTI, ou Run Time Type Information, o qual já foi discutida em matérias anteriores a esta, aqui mesmo. A próxima linha simplesmente verifica se a propriedade ShowHint do componente é True que senão volta ao loop, feito desta forma para otimizar o código :

if Not (AOwner.Components[X] AS TControl).ShowHint then

Continue;

- As próximas linhas têm como única função verificar dentro da string hint se existe o caractere que definimos como LF(line Feed), caso sim então o substituimos pelo line Feed original (o Chr(13)). Note que a variável cStr é do tipo String e também precisa ser definida :

cStr := TControl(AOwner.Components[X]).Hint;

if Pos('|',cStr) > 0 then

begin

cStr := Copy(cStr,1,Pos('|',cStr)-1) + #13 + Copy(cStr,Pos('|',cStr)+1,length(cStr));

TControl(AOwner.Components[X]).Hint := cStr;

end;

- Para utilizarmos nosso componente, definimos a propriedade do componente que queremos visualizar o hint multi-linha como True, e definimos um caption como por exemplo o a seguir :

'Este é um teste para verificar se o|componente multi-linha funciona.'

- E assim terminamos o nosso componente, na figura IV podemos verificar o mesmo em ação.

Figura IV.

- Se desejar baixar o código por nos criado clique aqui, se desejar olhá-lo no formato Html, clique aqui.

- A matéria deste mês tratou de um componente realtivamente simples, mas que serve muito bem para revelar o que há por trás da VCL, e com isso ajudar o programador a criar suas próprias rotinas. Venho reforçar o pedido para que se desejarem entrem em contato conosco por meio de [email protected] , e também lembrá-los que estamos abertos a publicar matérias vindas de nossos leitores para que desse modo possamos melhorar ainda mais os nossos serviços para os leitores e servir de vitrine para o autor da matéria.

 

Fúlvio C. Albuquerque

Editor Responsável

Hosted by www.Geocities.ws

1