HB++: Aplicações com Múltiplos Formulários

Gostou deste artigo? Compartilhe!

CategoriasPalm OS, Handheld Basic
ComentáriosComentários (3)

HB++: Aplicações com Múltiplos Formulários

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.

Formulário Padrão

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.

Propriedades Left, Top, Width, Height e Caption 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".

Formulário Centralizado

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ário Modeless

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ário Modal

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.

Formulário Modeless de Status

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étodo Show retorna imediatamente após o formulário ser exibido (assíncrono). Normalmente utilizado em conjunto com o hbFormGoto para exibir formulários do tipo Modeless.
  • hbFormModal - O método Show não retorna enquanto o formulário estiver aberto (síncrono). Normalmente utilizado em conjunto com o hbFormPopup para 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

Formulário Modeless

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

Formulário Modal

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

Formulário Modeless de Status

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 propriedade Modal for False (valor padrão), a combinação utilizada automaticamente será hbFormModeless + hbFormGoto. Se o valor da propriedade for True, a combinação utilizada automaticamente será hbFormModal + hbFormPopup;
  • SaveBehind - Se a propriedade SaveBehind for True, é 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 evento Paint do formulário anterior. Se o valor da propriedade for False (valor padrão), o evento Paint do formulário anterior será executado no fechamento do novo formulário. É aconselhado definir esta propriedade como True sempre que a chamada ao método Show incluir o parâmetro hbFormPopup.

Histórico

  • 12/06/2007 - Primeira versão deste artigo.

Sobre o Autor

Caio ProieteCaio 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

  1. Krlos em 13/06/2007 08:27

    Excelente Artigo, parabéns !!!

  2. 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

  3. 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 conteudo

    Ab+

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.

Nome

E-mail

URL

Comentário

XHTML: São permitidas as seguintes tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

campos obrigatórios