Quem é desenvolvedor há algum tempo pôde acompanhar a evolução do modelo de interface gráfica de aplicações Windows, no tocante à organização de janelas. Basicamente tínhamos dois caminhos a seguir: os padrões MDI (Multi Document Interface) e SDl (Single Document Interface)
Quase sempre optávamos pelo primeiro, e foi assim por muito tempo. Porém, nos últimos anos, a situação mudou. A complexidade dos softwares aumentou e a usabilidade dos programas passou a ser algo importante na hora de desenvolver interfaces gráficas.
Então, o modelo SDI, por trabalhar com janelas individuais ao invés de janelas "filhas'; tornando, de certa forma, mais limpa a organização visual dos módulos de uma aplicação, passou a ocupar o lugar do seu antecessor em muitas aplicações.
Atualmente, um novo conceito de interface visual entrou para esse pequeno grupo. Ele atende pela sigla TDI, ou Tabbed Document Interface.
O que é TDI?
Sem dúvida, esse modelo foi primeiramente implementado por Web Browsers, que passaram a exibir várias páginas na mesma janela, agrupadas em abas. De acordo com a Wikipedia, o pioneiro nesse tipo de interface foi o navegador InternetWorks, em 1994.
Com o tempo, várias outras aplicações passaram a adotar o conceito, e com boa aceitação por parte dos usuários. É o caso do Delphi, a partir da versão 8. E para capacitar o leitor a fazer o mesmo com seus programas, veremos nesse artigo como fazer isso utilizando componentes nativos da VCL, bons princípios da orientação a objetos e várias técnicas interessantes de programação.
Vantagens e desvantagens
Assim como os outros modelos de interface, o padrão TDI também apresenta prós e contras. Veja alguns deles na Tabela 1.
Agrupamento visual no Delphi
A VCL possui vários componentes que são containeres visuais para outros controles, também visuais. Para um componente poder ser agrupado dentro de outro, ele precisa ser descendente de TControl. Já para ele agrupar outros controles, ele deve derivar de TWinControl.
A relação entre "grupo" e "membros" é estabelecida pela propriedade Parent. Dessa forma, para agrupar componentes visualmente basta apontar essa propriedade para um controle derivado, de TWinControl.
Atente, entretanto, para o seguinte detalhe: a classe container deve implementar o suporte ao agrupamento visual. Isso quer dizer que não basta apenas um controle ser descendente de TWinControl para ser possível inserir outros componentes dentro dele.
Por exemplo, a classe TButton deriva indiretamente de TWinControl e, portanto, possui a propriedade Parent. Mas ao definir um botão como container de outro controle, não acontecerá o que é esperado. Faça o teste!
Você pode mudar o Parent de componentes quantas vezes quiser em runtime, e eles serão automaticamente ajustados dentro de seus novos containeres. Para comprovar isso, crie a nova aplicação e adicione um Label e vários Panels. Espalhe os painéis pelo formulário, e implemente o evento OnClick do primeiro para:
Labell.Parent := Sender as TWinControl;
Em seguida selecione os outros painéis e aponte o evento OnClick deles para a implementação do primeiro painel. Execute e veja o resultado. Entendido esses conceitos, podemos começar o desenvolvimento de interfaces TDI.
Componentes de abas
O Delphi oferece pelo menos dois componentes que podem ser usados, separados ou em conjunto, para agrupar controles em abas. O primeiro deles é o PageControl, a implementação da VCL para o controle original do Windows, e o TabSet, esse criado pela Borland. A diferença básica entre os dois é que o primeiro funciona como container para componentes derivados de TWinControl, e o segundo apenas exibe as abas.
Neste artigo falaremos apenas do PageControl.
Criando a aplicação
Para ilustrar o que aprenderemos neste artigo, vamos criar uma aplicação Win32 simples. Abra o Delphi e clique em File>New>Application (File>New>VCLFormsApplication, no Delphi 2005/2006).Adicione ao formulário principal um MainMenu, um Bevel e um PageControl. Crie um menu com a seguinte estrutura:
- Cadastros ...