Há alguns anos atrás, logo depois de ter adquirido meu primeiro dispositivo com Windows Mobile (eca!), tentei criar uma aplicação simples compatível com Windows CE, para ver o quão difícil seria.
Como nosso Delphi até hoje não tem essa capacidade, e não estava a fim de usar .Net nem qualquer outra linguagem da MS, o caminho mais obvio foi usar o Lazarus/FreePascal, mas sem muito sucesso: inúmeros erros na instalação, compilação, etc.
Ontem, resolvi tentar novamente. Baixei o instalador do Lazarus e do compilador add-on pra WinCE (ambos versões snapshot), e logo de cara me espantei: Ambos instalaram sem qualquer problema!
Em seguida, baixei um exemplo de código feito em Lazarus, para acessar o GPS do PDA. Após baixar algumas units que não estavam incluídas no download do código fonte da aplicação, compilei e rodei normalmente no Windows XP. Configurei então as opções do projeto para gerar código WinCE, compilei novamente, e vualá! Uma aplicação WinCE, sem precisar mudar uma linha de código sequer!
Copiei a aplicação (13MB!!!!) para o PDA, e funcionou logo de primeira! O tamanho do arquivo deixa claro que o FreePascal ainda precisa melhorar nessa área. Felizmente, desligando as opções de informações de debug, o tamanho do arquivo diminuiu para 1.8MB (que diferença! mas fica mais difícil debugar os problemas).
Existe uma biblioteca chamada KOL-CE, que permite criar aplicações GUI para Win32/WinCE que ficam bem menores do que as nativas do Lazarus. No entanto, a última versão do FreePascal tem algumas incompatibilidades com o código da KOL-CE, portanto, não consegui usa-la.
Resolvi escrever minha própria aplicação. Criei um componente para acessar o GPS via porta serial. Compilou de primeira!
Os primeiros problemas começaram com a interface da aplicação:
Fiz uma interface muito simples, com um PageControl, alguns labels, etc. Rodando no Win32, tudo perfeito! Ao gerar para WinCE e jogar no PDA, os labels simplesmente não apareciam! Uma Googlada rápida e descobri que é um bug da versão atual do LCL (equivalente ao VCL do Delphi). Solução gambiarra: inserir um TPanel dentro do TabSheet e colocar os componentes dentro do Panel, fazendo assim com que eles sejam “pintados” na tela. Feito isso, tudo blz!
O que me deixa mais feliz com tudo isso, é ver que o Lazarus/FreePascal tem progredido, apesar que lentamente. O fato de se poder utilizar uma mesma base de código para criar aplicações (inclusive GUI) multi-plataforma, é um sonho de qualquer programador.
A falecida Borland tentou algo nessa área, via Kylix. Infelizmente, não vingou. O FreePascal parece estar no caminho certo. Fico torcendo para que o ritmo de desenvolvimento aumente, e para que a ferramenta fique cada vez mais completa e estável.
Dica:
- A nova versão do Lazarus é compatível com arquivos DFM do Delphi.
- Apesar da maioria dos comandos, funcões, etc. serem equivalentes ao que estamos acostumados no Delphi, deve-se ficar atento à algumas diferenças, por exemplo: FloatToStr no FreePascal utiliza o DecimalSeparator para fazer a conversão. No Delphi, o “.” é sempre utilizado como separador decimal.
- As versões snapshot, apesar de não serem testadas, tem a vantagem de incluirem as correções mais recentes (mas podem incluir novos bugs também).
- O FreePascal/Lazarus produz código 64bits (coisa que o Delphi ainda não faz).
PS: Agora preciso descobrir como fazer para gravar audio do microfone do PDA para um arquivo .wav