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 OliveiraEsta 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:
Tipo de Dado | Valor |
Numérico | Zero (0) |
Boolean | False |
Date | 1 de Janeiro de 1904 as 00:00:00 |
String | Texto vazio ("") |
Variant | Empty |
Object | Nothing (Nulo) |
Enumeração | Primeiro valor na enumeração |
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
Descrição |
VarName: Nome da variável; Subscripts: Dimensoes do array, caso seja necessário; Type: tipo de dado armazenado na variável. |
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 )
Descrição |
Preserve: Informa se os dados armazenados devem ser preservados. Array: Nome do array a ser redimensionado. Subscripts: Nova dimenção do array |
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
Descrição |
Const: Nome da consante; Type: Qualquer um tipo primitivo, exceto Variant; Expression: Uma expressão aceita pelo compilador. |
Exemplo:
Listagem 6. Declaração de uma constante; Public Const sysTrapPrefSetPreference as Long = &HA2D2Enumeraçã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
Descrição |
Name: Nome da enumeração; MemberName: Item da lista de constantes; Value: Valor numerico(Integer). |
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
Descrição |
Name: Nome da Procedure; Arglist: Lista de argumentos da procedure; Statements: Bloco de código que sera executado. |
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 ],...
Descrição |
Optional: Indica se o argumento é opcional ou não, caso seja ele deve ter um valor padrão conforme exemplo. ByRef: Caso o argumento seja passado como referencia; ByVal: Indica se o argumento deve ser clonado antes de iniciar a procedure. Value: Valor padrão caso não seja informado nada. |
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 Subou
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 ] )
Descrição |
EventName: Nome do evento; ArgList: Lista de argumentos. |
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 ]
Descrição |
Name: Nome da procedure; ArgList: Lista de argumentos esperados pela procedure; Type Return: Tipo de retorno da função externa; Trap: Numero que define a localização da função na rotina externa, se este numero for errado possivelmente ele executará outra rotina sem erro porem não executará o código desejado, este numero deve estar na faixa entre 40960 e 65535; Selector: Numero seletor. |
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.
- Como criar um player de audio para Windows PhoneDisp. móveis
- Windows Phone: Criando e lendo arquivos de textoDisp. móveis
- Inserindo, editando e lendo dados no Windows Phone com IsolatedStorageSettingsDisp. móveis
- Introdução ao jQuery MobileJavascript
- Entendendo a navegação entre páginas no Windows Phone 7Disp. móveis