Desenvolvimento - Mobile

Palm OS: Linguagem HB++ (Parte 1)

A linguagem adotada pela Handheld Basic em sua ferramenta HB++ é marcada pelas seguintes características: orientada a objetos e fortemente tipada.

por Wellington Pinto de Oliveira



A linguagem adotada pela Handheld Basic em sua ferramenta HB++ é marcada pelas seguintes características: orientada a objetos e fortemente tipada.

Esta poderosa ferramenta foi inspirada pelo well-known Microsoft® Visual Basic®. Porem a linguagem possui algumas particularidades, estas forçadas pelos recursos da plataforma e filosofia de utilização. No inicio do artigo estaremos dando um enfoque teórico muito importante para a o exemplo final deste artigo e servirá como base para os próximos artigos onde discutiremos padrões de projetos.

Variáveis e Tipos de Dados

Variáveis são nomes de espaços de memória, estes espaços de memória podem conter diferentes tipos de informações parametrizadas. Encontramos nesta linguagem os seguintes tipos de dados Boolena, Byte, Integer, Long, Single, Double, Date, String, Variat e Object.

Toda variável é automaticamente inicilizada quando é criado, seu valor padrão depende de seu tipo, abaixo temos uma tabela de tipos e seus valores padrões:


Tabela 1. Tipo de dado e valor padrão de inicialização.

Para eleição de um nome deve-se seguir as seguintes regras:

- O nome não pode exceder 32 caracteres;
- Deve apenas conter letras, números e underscores;
- O primeiro caracter deve ser uma letra;
- Não pode coincidir com as palavras reservadas da linguagem.

As variáveis podem ser classificadas quanto ao seu uso, podemos definir como:

- Variáveis Globais: são declaradas na cabeça de um arquivo module, e seu modificador de acesso é public.
- Variáveis Membro: São declaradas na cabeça de uma classe, user control ou formulário.
- Variável Local: São variáveis declaradas em procedures, são usadas para armazenar informações locais e ao final da execução da rotina são eliminadas.

Variáveis Globais

Delcarada em arquivos Module podem ser visualizadas por todo o aplicativo, isso porque este arquivo é carregado antes da inicialização do método Application_NormalLaunch() e persiste na memória dinâmica durante toda o tempo de vida do software, estas variáveis são usadas geralmente quando seu acesso é feito por vários formulários e classes, porem estes arquivos consomem muita a memória dinâmica, seu uso deve ser feito com consciência.

Sintaxe:
{ Public | Protected | Private } Dim VarName [([ Subscript ])] As [ New ] Type

Caso utilize os modificadores Protected e Private a variável não assume um escopo global porem seu acesso interno no próprio arquivo module não é afetado.

Exemplo:

Listagem 1. Declaração de variável em Module
Public Dim minhavar as Long

Variáveis Membro (Classes)

Como ela é parte da classe dependendo de sua acessibilidade ela pode ser visualizada nos objetos.

{ Public | Protected | Private } [ Static | Dim ] VarName [([ Subscript ])] As [ New ] Type

Exemplo:

Listagem 2. Declaração de variável em Classe
Public Dim minhavar as Long

Variáveis Locais

Quando uma variável é declarada dentro de uma procedure seu escopo não permite o acesso externo, apenas no corpo da rotina. Quando a procedure é finalizada o valor da variável é excluída da memória.

Dim VarName [([ Subscript ])] As [ New ] Type

Exemplo:

Listagem 3. Declaração de variável em Rotina
"Declarando uma variável numérica em uma procedure
Dim minha_variavel1 as Long.

Arrays

Arrays são coleções de elementos de um mesmo tipo, indexado por uma seqüência. Todo array deve ser declarado utilizando o prefixo Dim, ainda é necessário informar o tipo e quantos elementos o array deve conter.

Exemplo:

Listagem 4. Declaração de um array.
"Declarando 10 elementos do tipo Long
Public Dim meu_array(1 To 10) as Long 

Caso durante a execução seja necessário realocar o numero de posições no array utiliza-se a declaração ReDim, conforme a sintaxe abaixo:

Sintaxe:
ReDim [ Preserve ] Array ( Subscripts )

Exemplo:

Listagem 5. Redimensionando um array.
ReDim Preserve meu_array(1 to 11)

Constante

Uma constante é uma variável que possui o seu valor fixo, durante a execução do programa não é possível de forma alguma à alteração deste valor.

Sintaxe:
[ Public | Protected | Private ] Const ConstName As Type = Expression

Exemplo:

Listagem 6. Declaração de uma constante;
Public Const sysTrapPrefSetPreference as Long = &HA2D2
Enumeração

A Enumeração é basicamente um novo tipo definido pelo programador e é formado por um grupo de constates. O valor inicial por padrão e o primeiro item da enumeração com o valor zero.

Sintaxe:
{ Public | Protected | Private } Enum Name
MemberName = [ Value ]...
End Enum

Aconselha-se a criação destas enumerações em arquivos Module, conforme o exemplo abaixo:

Exemplo:

Listagem 6. Exemplo de uma enumeração criada em arquivo Module.
Public Enum EnCRUD
	NULL    =-1
	INSERT	=0
	UPDATE	=1
	DELETE	=2
End Enum

Procedures e Funções

Procedures ou funções são grupos de instruções agrupadas em blocos que podem ser chamadas por outras Procedures ou funções, utilizando esta técnica de modularização o código fica mais compacto e fácil de se entender, facilitando uma possível manutenção.

Procedures Sub

A procedure Sub é um tipo de rotina que recebe ou não parâmetros, ela executa um bloco de código mas não retorna valor algum.

Sintaxe:
{ Private | Protected | Public } [ Static ] Sub name ([[Optional] [ByRef | ByVal]arglist As type [()][ = Value ],...)]
[statements ]
[Exit Sub]
[statements ]
End Sub

A possibilidade de se ter uma rotina Static só foi possível na versão 2.0 do HB++, caso implemente uma rotina Static em um formulário ou classe o programador não necessita ter uma instancia para utilizar tal rotina.

Exemplo:

A seguinte rotina foi implementada em uma classe chamada clsMinhaClasse conforme Figura 1.


Figura 1. Project Explorer.

Listagem 7. Procedure Sub Static.
Public Static Sub MinhaSub()
	MsgBox "Minha Sub"
End Sub

Em um formulário qualquer edita-se o seguinte código:

Listagem 8. Chamada a Procedure estática.
Private Sub Button1_Click()
	clsMinhaClasse.MinhaSub
End Sub

Na última listagem podemos ver que não foi necessário criar uma instancia da classe clsMinhaClasse para ter acesso a rotina.

Função

Assim como a Sub rotina uma função também é capaz de receber parâmetros porem este tipo de rotina deve obrigatoriamente retornar um valor. Caso o retorno não seja efetuado a função retorna o valor padrão do tipo especificado.

Exemplo

Listagem 9. Exemplo de Função que retorna um numero inteiro.
Public Function MinhaFuncao() as integer
	if Year(Now)>= 2007 then
		"Retornando um valor qualquer
		MinhaFuncao = 1
	end if
End Function

Parâmetros

Como vimos toda procedure recebe ou não parâmetros, é importante conhecer toda as formas possíveis de passagem de parâmetros.

Sintaxe:
[[Optional] [ByRef | ByVal]arglist As type [()][ = Value ],...

Exemplo:

Listagem 10. Exemplo de função com parâmetros.
Public Function MinhaFuncao(Optional ByVal ano as Integer = 2007) as integer
	if ano>= 2007 then
		"Retornando um valor qualquer
		MinhaFuncao = 1
	end if
End Function

Poderíamos chamar esta procedure de duas formas:

Listagem 11. Chamando a função da listagem 10.
Private Sub Button2_Click()
	DebugPrint MinhaFuncao(2008)
End Sub
ou
Listagem 12. Chamando a função da listagem 10. 
Private Sub Button1_Click()
	DebugPrint MinhaFuncao()
End Sub

Na listagem 11 passamos como parâmetro um valor, este valor será utilizado pela função para execução do código, já na listagem 12 nenhum valor foi passado, segundo a declaração do parâmetro se nada for informado ele deve assumir o valor padrão 2007, veja na Figura 2 que o próprio mecanismo do HB++ exibe um ToolTip com todas as informações possíveis da Função.

Nos exemplos acima utilizei o DebugPrint para excrever o retorno da função no OutPut Windows.


Figura 2. Descrição da função.

Eventos

Podemos definir eventos em classes, formulários e user Controls, esta definição é fundamental no desenvolvimento de componentes e camadas de apoio.

Sintaxe:
{ Public | Protected | Private } Event EventName ( [ ArgList ] )

Exemplo:

Em uma determinada classe utiliza-se a seguinte declaração:

Listagem 13. Declarando eventos. 
Public Event BeforeUpdate(ByVal action as EnCRUD)
Public Event AfterUpdate(ByVal action as EnCRUD)

Declarações

Declarações são definições de rotinas externas, geralmente escritas em C e alocadas em Shared Library ou na própria API do sistema Operacional. Estes arquivos escritos em C são muito comuns na plataforma Palm OS. Uma impressora por exemplo, ela geralmente possui uma Shared Library que é portável a qualquer linguagem ou ferramenta que esteja nos padrões Palm Source.

Sintaxe:
{ Public | Private } Declare Sub Name ( [ ArgList ] ) Trap Trap [ { , | StdSel | HostSel | StackSel } Selector ]

ou:

{ Public | Private } Declare Function Name ( [ ArgList ] ) As Type Trap Trap [ { , | StdSel | HostSel | StackSel } Selector ]

Exemplos:

Listagem 14. Exemplo real de uso de funções externas. 
"Constantes utilizadas nas declarações
Public Const sysTrapPrefGetPreference as Long = &HA2D1
Public Const sysTrapPrefSetPreference as Long = &HA2D2

"Declarações que utilizam a API do sistema para alterar ou capturar preferências
Public Declare SUB PrefSetPreference(  ByVal ichoice as SystemPreferencesChoice, 
   ByVal value as Long) Trap sysTrapPrefSetPreference
Public Declare FUNCTION PrefGetPreference(  ByVal ichoice as SystemPreferencesChoice) 
   as Long Trap sysTrapPrefGetPreference

O código da listagem 14 é muito importante, todo software desenvolvido em nossa empresa contem as declarações acima, pois com ela podemos alterar os formatos e as preferências do usuário, no nosso projeto final ainda neste artigo estaremos demonstrando o uso destas declarações em um caso real.

O código em C destas funções é enorme e está disponível no site da Palm Source, mas aqui no HB++ estaremos apenas utilizando estas linhas o que nos economizará um tempo relativamente importante.

Wellington Pinto de Oliveira

Wellington Pinto de Oliveira - Autor do livro "Desenvolvendo Aplicações Palm com NS Basic", atualmente trabalha com automação de processos industriais e códigos de barras. http://www.softpalm.com.br.