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.
Formulários Orientados a Objetos
Herança de formulários na prática
Quando as técnicas de programação orientada a objetos (POO) começaram a ser amplamente difundidas e utilizadas, acreditava-se que haveria uma revolução profunda e definitiva na forma de se programar. Hoje uma realidade, a POO é questão corriqueira do dia-a-dia. O próprio Delphi é um completo ambiente de desenvolvimento orientado a objetos.
Mas quando é que na prática realmente aplicamos os conceitos de orientação a objetos e nos beneficiamos desse “nirvana” da programação? De fato, a biblioteca de componentes visuais (VCL) é totalmente orientada a objetos e qualquer programa que desenvolvemos em Delphi utiliza alguns desses componentes. Por isso apenas podemos dizer que estamos usando técnicas de programação orientada a objetos?
Verdadeiramente orientada a objetos
Um dos mais fortes argumentos que os defensores catequistas do Delphi fazem contra o Visual Basic é justamente o fato de o VB não ser uma linguagem rigorosamente orientada a objetos, já que recursos de herança e polimorfismo são inacessíveis ao programador. Nas versões mais recentes do VB até que se pode criar – com restrições – componentes COM, mas não é como o Delphi, onde até mesmo os componentes nativos são codificados com a própria linguagem Object Pascal.
Se nos sistemas que criamos, simplesmente usamos instâncias de classes TDBEdit, TClientDataset e outras da paleta de componentes, configurando propriedades e chamando métodos públicos, não fazemos nada além do que um programador Visual Basic não faria.
Estamos realmente fazendo programação orientada a objetos quando escrevemos um novo componente no Delphi. Só que no dia-a-dia, um desenvolvedor de aplicações de negócios não tem necessidade de ficar criando novos componentes. Ele apenas reutiliza os existentes, seja do próprio Delphi, seja de terceiros.
Quer dizer então que para o desenvolvedor comum a promessa da POO morreu? Não mesmo, pois, como veremos a seguir, as técnicas de orientação a objetos podem ser utilizadas no cotidiano em um nível mais alto de abstração, mais próximo da camada de negócios. São os formulários orientados a objetos ou, se preferir, o repositório de objetos.
Herança de formulários
No Delphi, pode-se criar formulários que descendem de outros formulários usando o Object Repository. Citando o manual do Delphi: “O Object Repository (Tools|Repository) é uma ferramenta versátil que torna possível compartilhar (ou copiar) com facilidade formulários, caixas de diálogo e data modules entre projetos ou dentro de um único projeto”.
Vamos nos concentrar na forma mais simples e, acredito, mais prática de compartilhar formulários: dentro de um mesmo projeto, diretamente, sem adicioná-lo ao Object Repository. Programar formulários orientados a objetos é fácil e muito útil.
Para começar, execute o comando "File | New" (ou "File | New > Other" no Delphi 6), abrindo a caixa de diálogo "New Items". Você verá uma guia com o nome do projeto atual. Ali são listados todos os formulários e data modules do seu projeto. Você pode derivar um novo item a partir de um item existente e customizá-lo como for necessário.
Faça a seguinte experiência. Crie um novo formulário da forma habitual, acrescente componentes visuais, como TEdit e TButton, defina algumas de suas propriedades (Caption, Width e Color, por exemplo) e atribua “FormPai” à propriedade Name do formulário. Este será o formulário “pai", dos quais os próximos formulários criados herdarão.
Abra novamente a caixa "New Items" (usando "File | New", ou "File | New > Other") e vá para a página "Project1" (ou qual seja o nome do seu projeto). Um novo ícone, com o nome do formulário recém-criado, estará disponível. Note, na parte de baixo da caixa, que apenas a opção "inherit" (herdar) está marcada, o que indica que o novo formulário herdará as características da classe escolhida. Selecione “FormPai” e clique em "OK" (Figura 1).
Figura 1. Criação de um formulário descendente de "FormPai"
Pronto, você acaba de criar uma nova classe de formulário descendente de "FormPai", sem que fosse necessário escrever uma única linha de código (Figura 2). Vamos chamar esse formulário de "TFormFilho1". Os componentes herdados não podem ser excluídos no descendente, mas todas as suas propriedades podem ser livremente alteradas. Os valores das propriedades definidas na classe ancestral (pai) funcionam como valores default para as propriedades de TFormFilho1.
Figura 2. Formulários descendentes – com a herança de formulários, aumenta muito o reaproveitamento de código
Nada se perde
Todo formulário criado no Delphi é uma subclasse de TForm. Mesmo o "TFormFilho1" que é descendente de "TFormPai", herda as características da classe TForm, já que seu ancestral é descendente direto dela. Usando um termo de matemática, dizemos que a herança entre objetos é transitiva, isto é, uma classe herda as características de todas as suas classes ancestrais (veja a Figura 3).