7 de fevereiro de 2011

Personalizando a edição de propriedades em componentes Delphi - parte I

Já comentei em outros posts sobre a criação de componentes em Delphi que programadores que se aventuram nessa seara devem ter em mente preocupações com dois públicos alvos distintos. Em primeiro lugar, definimos a aparência do componente e qual o tipo de interação esperado dele por um usuário final dos programas em que esse componente estará inserido. Isto é, devemos nos preocupar com a forma com que o componente aparecerá para seus usuários e como ele deve se comportar quando utilizado num sistema real.

Por outro lado, é importante também facilitar a vida do usuário mais imediato de um componente: o próprio programador que o usará em design time para montar seus programas. Em Delphi e C++ Builder, essa facilidade se traduz na exposição de propriedades e eventos no Object Inspector, de uma maneira que revela um pouco do funcionamento do componente ao mesmo tempo em que reduz a codificação necessária para que o programador ponha tal componente para funcionar.

Conforme explicato no post Criando Componentes em Delphi - parte II, a forma mais básica de publicar uma propriedade (ou evento) no Object Inspector é declará-la na área pública da classe do componente, através da palavra chave published. Neste caso, a validação do valor informado pelo programador no inspector é feita apenas com base no tipo de dado da propriedade. Isso também determina o modo com que o valor da propriedade será automaticamente anexado ao arquivo DFM do Form onde o componente foi inserido. Observação: um DFM contém os componentes adicionados em tempo de design, descrevendo o estado inicial de suas propriedades em Foms do Delphi.

Mas, nem sempre o básico é suficiente. Imagine, por exemplo, que você está criando um componente no qual uma das propriedades publicadas aceita uma lista com tipos de arquivos permitidos, nos moldes do filtro existente no TOpenDialog. Se tal propriedade for publicada como um texto simples, o programador poderá informar aí qualquer valor, mesmo um que não seja compatível com o formato de lista que definirmos.

Para essas situações, o Delphi permite que o criador de componentes registre editores diferentes do padrão para propriedades onde isso for necessário, evitando (ou até mesmo impedindo) que o programador tenha que informar diretamente o valor desejado em tempo de design. O registro é feito através da função RegisterPropertyEditor, que vincula uma propriedade do componente à classe que deve ser usada para editar seus valores durante o projeto. Essa classe deve ser uma herança de TBasePropertyEditor e deve implementar a interface IProperty. A boa notícia é que para os tipos básicos do Delphi já há classes prontas que satisfazem ambas as exigências, de modo que para montar nosso editor de filtros de arquivos nos bastará derivar uma classe a partir da TStringProperty, que é a classe nativa para edição do valor de propriedades do tipo string (texto) no Object Inspector. A ideia é abrir para o programador uma tela onde ele poderá facilmente estipular em tempo de design a lista de tipos de arquivos considerados pelo componente. A tela apresentada ao programador é reproduzida abaixo:
Editor de filtros de tipos de arquivos
É claro que essa interação é exclusiva para o programador, de modo que a tela para escolha de filtros não é apresentada em nenhum momento ao usuário final da aplicação. Esta é a razão para o Delphi diferenciar os tipos de pacotes: aqueles configurados como Design Time Only devem conter apenas as classes necessárias para o programador fazer seu trabalho, o que as dispensa de serem distribuídas junto com as aplicações que usarem o componente, reduzindo o tamanho dessas aplicações.

A implementação do comportamento inerente ao componente deve permanecer em pacotes do tipo Run Time Only, imprescindíveis para o funcionamento tanto do executável final quanto das interações em tempo de design.

No próximo post, apresento os métodos que merecem atenção quando criamos nossas próprias classes de editores e também mostro a construção de uma propriedade com as características do filtro de arquivos citada acima.

2 comentários :

Anônimo disse...

Boa tarde.. Estou esperando a segunda parte!!
Ficou muito boa a primeira!
Pois tenho algumas duvidas é estou acreditando q na segunda parte elas seriam resolvidas!

Luís Gustavo Fabbro disse...

A segunda parte foi publicada no post
Personalizando a edição de propriedades em componentes Delphi - parte II.

Se alguma dúvida sua ficou sem resposta neste outro artigo, poste-a aqui ou envie um email para o endereço do Balaio.

[]s

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.