
Introdução
Embora seja possível desenvolver aplicações Palm OS com apenas um formulário, ou até mesmo sem formulário algum, é comum utilizarmos mais de um formulário em uma aplicação, seja para exibir caixas de diálogo, mensagens de processamento, por exemplo, ou até mesmo para separar diferentes módulos das aplicações em formulários individuais.
Conceito
O formulários utilizados nas aplicações Palm OS são criados pelo próprio sistema operacional através de chamadas de funções API. O HB++ implementa a chamada à estas funções na classe Form e todos os formulários criados a partir da IDE do Handheld Basic são automaticamente derivados desta classe, e por isso, podemos nos beneficiar de todos os métodos e propriedades herdadas desta classe.
Características dos Formulários
Todos os formulários possuem por padrão o tamanho de 160 x 160 pixels, uma barra de título exibindo o texto definido na propriedade Caption do formulário.

Estas características podem ser alteradas através das seguintes propriedades:
Left- Posição do formulário na horizontal;Top- Posição do formulário na vertical;Width- Largura do formulário;Height- Altura do formulário;Caption- Texto exibido na barra de títulos do formulário.

DICA: Para criar um formulário sem a barra de título, basta deixar a propriedade Caption, com nenhum texto (vazia).
Veja este exemplo de um formulário centralizado:
Left= 30;Top= 30;Width= 100;Height= 100;Caption= "Caixa de Diálogo".

DICA: Para criar um formulário centralizado basta fazer um cálculo simples considerando largura e a altura da tela do Palm (160 x 160) e a largura e a altura do formulário (width e height). Assim, a fórmula para calcular o valor da propriedade Left é: (LarguraTela - LarguraFormulario) / 2, assim como a fórmula para calcular o valor da propriedade Top é: (AlturaTela - AlturaFormulario) / 2. No exemplo acima, o cálculo utilizado foi:
Left = (160 - 100) / 2
Top = (160 - 100) / 2
Tipos de Formulário
No Palm OS existem basicamente dois tipos de formulários: Modeless e Modal, e ambos são utilizados em situações específicas. Em geral toda aplicação tem pelo menos um formulário Modeless, mas é comum combinar a utilização dos dois tipos em uma mesma aplicação.
Formulários Modeless
Formulários deste tipo são normalmente utilizados para exibir o formulário principal da aplicação (frmMain), e em formulários que representam módulos da aplicação. Em geral, utilizamos formulários do tipo Modeless quando desejamos abandonar o formulário atual e prosseguir para outro formulário da aplicação.

Formulários Modal
Formulários deste tipo são normalmente utilizados para mostrar caixas de diálogo para o usuário, sem abandonar o formulário principal. As caixas de diálogo devem, de preferência, possuir apenas o tamanho necessário para as informações contidas, embora seja possível possuirem o mesmo tamanho de um formulário comum (160 x 160 pixels).

Formulários "Status"
Uma outra utilização de formulários do tipo Modeless, que chamo neste artigo de formulário "Status", é a criação de formulários que aparecem por cima do formulário principal, apenas para mostrar mensagens, por exemplo, sobre o andamento de um processo demorado. O formulário "Status" é controlado pelo formulário principal, desde sua abertura até o fechamento.

Regras gerais para utilização de formulários
- a) A partir de um formulário Modeless, podemos navegar para outro formulário Modeless, apenas se fecharmos o atual *;
- b) A partir de um formulário Modeless, podemos abrir vários formulários do tipo Modal, mas somente 1 (um) cada vez;
- c) A partir de um formulário Modal, podemos abrir outros formulários do tipo Modal, 1 (um) de cada vez;
- d) A partir de um formulário Modal, não podemos abrir outros formulários do tipo Modeless *.
* Com exceção dos formulários "Status" que são do tipo Modeless, mas não se encaixam nestas regras.
Programação
Para abrir um formulário, é preciso criar um objeto da classe do formulário desejado, e executar o método Show deste objeto. O método Show é herdado pela classe Form, e recebe um parâmetro do tipo HbForm que pode ser um (ou uma combinação) dos valores abaixo:
hbFormGoto- Todos os formulários previamente carregados são destruídos, e o formulário carregado passa a ser o principal. Normalmente utilizado para exibir o formulário principal da aplicação;hbFormPopup- O formulário é exibido por cima de outros formulários previamente carregados. Normalmente utilizado para exibir caixas de diálogo;hbFormModeless- O métodoShowretorna imediatamente após o formulário ser exibido (assíncrono). Normalmente utilizado em conjunto com ohbFormGotopara exibir formulários do tipo Modeless.hbFormModal- O métodoShownão retorna enquanto o formulário estiver aberto (síncrono). Normalmente utilizado em conjunto com ohbFormPopuppara exibir caixas de diálogo.hbFormAlignBottom- Move o formulário para a parte inferior da tela. Normalmente utilizado para abrir caixas de diálogo com suporte à Dynamic Input Area (DIA).
O método Show pode ser executado de duas maneiras: Síncrono e Assíncrono; Se for passado o parâmetro hbFormGoto, o formulário é exibido e a rotina que executou o método Show continua sua execução normalmente (Assíncrono). Já se for passado o parâmetro hbFormPopup, o formulário é exibido e a rotina que executou o método Show fica em pausa até o fechamento do formulário (Síncrono)
Exemplo Formulário Modeless
Os formulários do tipo Modeless utilizam normalmente a combinação hbFormModeless + hbFormGoto no método Show. Essa combinação implica na destruição automática de qualquer formulário carregado previamente (se houver).
Private Sub btnAbrirModeless_Click()
'Instancia um novo objeto da classe frmModeless, executa
'o método Show do objeto para mostrar o formulário
Dim meuForm As New frmModeless
meuForm.Show hbFormModeless + hbFormGoto
'O formulário é exibido e a função continua... Se houvessem
'mais instruções aqui, seriam executadas normalmente.
End Sub

Uma vez que formulários do tipo Modeless, abertos com a combinação hbFormModeless + hbFormGoto são os únicos formulários em memória, para fechar um formulário deste tipo, existem apenas duas alternativas: Abrir outro formulário Modeless ou Finalizar a aplicação.
No exemplo acima, para fechar este formulário e retornar ao formulário principal, seria:
Private Sub btnFechar_Click()
'Fecha o formulário atual e volta
'para o formulário principal (frmMain)
'Não é necessário utilizar o Unload Me,
'pois o parâmetro hbFormGoto passado para
'o método Show implica na destruição do
'formulário atual automaticamente.
Dim frmPrincipal As New frmMain
frmPrincipal.Show hbFormModeless + hbFormGoto
End Sub
Exemplo Formulário Modal
Os formulários do tipo Modal utilizam normalmente a combinação hbFormModal + hbFormPopup no método Show. Essa combinação permite exibir o formulário sobrepondo o formulário atual, mas sem destruir os formulários previamente carregados em memória. O método Show é executado de forma síncrona.
Private Sub btnAbrirModal_Click()
'Instancia um novo objeto da classe frmModal, executa
'o método Show do objeto para mostrar o formulário
Dim meuForm As New frmModal
meuForm.Show hbFormModal + hbFormPopup
'Enquanto o formulário estiver aberto, esta função está
'em pausa no método Show (acima), se houvessem mais instruções
'aqui, seriam executadas normalmente somente após o fechamento
'do formulário.
End Sub

Para fechar um formulário deste tipo, basta descarregar o formulário da memória para, automaticamente, retornar ao formulário que o carregou. No exemplo acima, para fechar este formulário e retornar ao formulário principal, seria:
Private Sub btnFechar_Click()
'Fecha o formulário atual e volta
'para o formulário principal (frmMain)
Unload Me
End Sub
Exemplo Formulário "Status"
Os formulários "Status" utilizam a combinação hbFormModeless + hbFormPopup no método Show. Essa combinação permite exibir o formulário sobrepondo o formulário atual, mas sem destruir os formulários previamente carregados em memória. O método Show é executado de forma assíncrona e a mesma rotina que criou e exibiu o formulário pode fechá-lo.
Private Sub btnAbrirStatus_Click()
'Instancia um novo objeto da classe frmStatus, executa
'o método Show do objeto para mostrar o formulário
Dim meuForm As New frmStatus
meuForm.Show hbFormModeless + hbFormPopup
'...
'Executa operação demorada...
'...
'Fecha o formulário
Unload meuForm
End Sub

DICA: Para criar um formulário sem a barra de título, e com esta borda azul, basta deixar a propriedade Caption, sem nenhum texto (vazia) e alterar a propriedade Modal para True.
Propriedades Modal e SaveBehind
Todos os formulários possuem as propriedades Modal e SaveBehind que tem o seguinte objetivo:
Modal- Modifica a borda do formulário, e define como o formulário será exibido caso não sejam passados parâmetros para o método Show. Se a propriedadeModalforFalse(valor padrão), a combinação utilizada automaticamente seráhbFormModeless + hbFormGoto. Se o valor da propriedade forTrue, a combinação utilizada automaticamente seráhbFormModal + hbFormPopup;SaveBehind- Se a propriedadeSaveBehindforTrue, é armazenado um bitmap da tela (print-screen) em memória, antes do novo formulário ser exibido, para que quando este for fechado, seja possível restaurar a tela anterior sem precisar executar o eventoPaintdo formulário anterior. Se o valor da propriedade forFalse(valor padrão), o eventoPaintdo formulário anterior será executado no fechamento do novo formulário. É aconselhado definir esta propriedade comoTruesempre que a chamada ao métodoShowincluir o parâmetrohbFormPopup.
Histórico
- 12/06/2007 - Primeira versão deste artigo.
Sobre o Autor
Caio Proiete é Arquiteto de Soluções, especialista em desenvolvimento de softwares para PDAs e telefones celulares, principalmente nas plataformas Palm OS, Windows Mobile e Symbian OS.
Atualmente suas principais ferramentas/tecnologias de trabalho incluem CodeWarrior C++, Handheld Basic, eMbedded Visual C++, .NET Compact Framework, C# .NET, e Carbide.c++.
Possui extensa experiência em arquitetura e desenvolvimento de sistemas baseados em web e smart-clients, gerenciamento de projetos e treinamento, e atua também como instrutor oficial Microsoft em centros de treinamentos (CLPS), e é detentor das seguintes certificações:
- MCT - Microsoft Certified Trainer;
- MCSD - Microsoft Certified Solution Developer;
- MCDBA - Microsoft Certified Database Administrator;
- MCAD .NET - Microsoft Certified Application Developer;
- MCSD .NET - Microsoft Certified Solution Developer for .NET;
- MCTS - Microsoft Certified Technology Specialist for Windows Mobile.
Veja o todos os artigos publicados por Caio Proiete no PDAExpert.
Artigos Relacionados
3 Comentários »
Comentários via RSS TrackBack URI
-
Krlos em 13/06/2007 08:27
Excelente Artigo, parabéns !!!
-
Ananias Duarte em 21/06/2007 12:37
Maravilha!
Grande profissional. Ótimo escritor. Excelente artiigo.
Também sou fã do HB++ e dos PDAs
abraços -
Herbert Agles em 19/10/2007 11:59
Olá Caio Proiete,
primeiramente quero lhe dar parabéns por ter disponibilizado este excelente conteúdo sobre HB++.
e se não se emporta vou me basear em vc pois fiquei muito empolgado com seus exemplo.
sou iniciante na linguagem mas ja estou gostando muito
Obrigado por fornecer este conteudoAb+


Envie seu comentário
ATENÇÃO: A área de comentários deve ser utilizada apenas para dúvidas sobre este artigo. Para dúvidas não relacionadas a este artigo, utilize o Fórum PDAExpert.net.