Para criar aplicações que executem em dispositivos móveis com SO Windows Mobile ou WinCE é necessário instalar o cross-arm-wince, que tem apenas versão para Win32. Se já existir o Lazarus instalado, baixe e instale o Lazarus-0.9.28.2-fpc-2.2.4-cross-arm-wince-win32.exe no mesmo diretório do Lazarus.
A partir de agora sua instalação continuará compilando para o ambiente Windows, mas terá a opção de compilar para o WinCE. Sempre que você iniciar um projeto WinCE é necessário fazer algumas configurações em Project -> Compiler options. Na aba Paths selecione wince em LCL Widget Type (various). Na aba Code escolha WinCE em Target OS (-T) e arm em Target CPU family (-P). Pronto. O compilador irá gerar um executável que executa apenas no PDA. Dessa forma para compilar use sempre CTRL + F9.
Banco de dados
A opção pelo SQLite é quase forçada. Só precisamos de uma dll e tudo funciona. Bem de acordo com as limitações impostas pelos PDAs. Prefiro sempre baixar alguma coisa já pronta, compilar os fontes gera um certo incômodo. Se você prefere compilar pode baixar os fontes aqui. Mas pode obter algo pronto aqui, inclusive com um visualizador de tabelas para WinCE. A dll deverá ser instalada na mesma pasta do PDA onde estará o banco de dados SQLite e o executável.
Escolha dos componentes
Essa foi a parte mais difícil. Muitas opções mas não tive muito sucesso. Para banco de dados tive problemas com SQLdb e Zeos. Com SQLdb não reconhecia o banco no PDA. Com Zeos deram alguns erros durante a compilação. Então optei por usar o TSQLite3Dataset da unit sqlite3ds. Mesmo existindo um pacote com o componente eu usei código FreePascal direto.
Para a interface existe o pacote KOL-CE. No entanto nos meus testes eu não consegui integrar esses componentes com banco de dados. Vou continuar tentando e apresento o resultado mais tarde.
Assim, usei os próprios componentes nativos do Lazarus. A grande dificuldade é adequar a interface ao modelo de PDA onde a aplicação irá executar. Fiz testes em um HP iPAQ com Windows Mobile 5.0.
Criação da interface
Crie uma nova aplicação no Lazarus. Altere a propriedade Name do form para frmCidade, Caption para Cidades. Salve tudo. Para a unit dê o nome u_cidade e para o projeto digite Cidade. Faça as alterações em Project -> Compiler options conforme falamos anteriormente.
Desenhe o form de acordo com a figura abaixo: coloque dois TEdits, dois TLabels, cinco TButtons da aba Standard, e um TStringGrid da aba Additional.
Note que não estamos usando controles da aba Data Controls. Defina as propriedades dos componentes - da esquerda para a direita e de cima para baixo - da seguinte forma:
TLabel - Caption defina como ID.
TLabel - Caption defina como Nome.
TEdit - Name defina com edId e apague o conteúdo de Text.
TEdit - Name defina com edNome e apague o conteúdo de Text.
TButton - Caption defina como Inserir e Name defina como btnInserir.
TButton - Caption defina como Excluir e Name defina como btnExcluir.
TButton - Caption defina como Alterar e Name defina como btnAlterar.
TButton - Caption defina como Consultar e Name defina como btnConsultar.
TButton - Caption defina como Sair e Name defina como btnSair.
TStringGrid - Name defina como grdDados e FixedCols como 0. Clique no botão à direita na propriedade Columns. Clique no botão Add para adicionar duas colunas. Selecione a primeira e expanda a propriedade Title. Digite ID na propriedade Caption. Faça o mesmo na segunda coluna e digite NOME na propriedade Caption. Feche a janela.
Você deve ajustar as dimensões do form de acordo com o PDA onde a aplicação será executada. O form do exemplo tem 243 x 300.
O código
Para nosso exemplo usarei o mesmo banco de dados criados nos post anteriores. Inicialmente as declarações de variáveis. Inclua sqlite3ds na cláusula uses:
var
frmCidade: TfrmCidade;
tbCidade: TSQLite3Dataset;
sSql: string;
No evento OnShow do form o objeto tbCidade é criado e inicializado com os dados do banco de dados e da tabela Cidade:
tbCidade := TSqlite3Dataset.Create(nil);
tbCidade.FileName := 'clientes.db';
tbCidade.TableName := 'cidade';
tbCidade.PrimaryKey := 'Id_Cidade';
No evento OnSelectCell da TStringGrid definimos que a os dados na linha selecionada na StringGrid são copiados para os TEdits:
edId.Text := grdDados.Cells[0, aRow];
edNome.Text := grdDados.Cells[1, aRow];
No evento OnClick de btnConsultar a tabela é consultada e seus dados mostrados na StringGrid:
tbCidade.Close;
tbCidade.SQL := 'select * from cidade';
tbCidade.Open;
grdDados.Clear;
while not tbCidade.EOF do
begin
grdDados.Row := grdDados.RowCount - 1;
grdDados.RowCount := grdDados.RowCount + 1;
grdDados.Cells[0, grdDados.Row] := tbCidade.Fields[0].AsString;
grdDados.Cells[1, grdDados.Row] := tbCidade.Fields[1].AsString;
tbCidade.Next;
end;
tbCidade.Close;
No evento OnClick de btnAlterar o comando UPDATE é construído e executado:
sSql := 'update cidade set nome = ''%s'' where id_cidade = %d';
tbCidade.SQL := Format(sSql, [edNome.Text, StrToInt(edId.Text)]);
tbCidade.ExecSQL;
No evento OnClick de btnInserir fazemos o mesmo com o comando INSERT:
sSql := 'insert into cidade(id_cidade, nome) ' +
'values(%d, ''%s'')';
tbCidade.SQL := Format(sSql, [StrToInt(edId.Text), edNome.Text]);
tbCidade.ExecSql;
O comando DELETE é construído e executado no evento OnClick de btnExcluir:
if MessageDlg('Confirmação','Deseja excluir o registro?', mtConfirmation, [mbYes, mbNo],0) = mrYes then
begin
sSql := 'delete from cidade where id_cidade = %d';
tbCidade.SQL := Format(sSql, [StrToInt(edId.Text)]);
tbCidade.ExecSQL;
end;
Este programa é apenas um exemplo e muita coisa precisa ser feita para que ele funcione bem. Por exemplo, os botões btnAlterar e btnExcluir só podem ser habilitados se houver um ID a ser pesquisado, entre outras melhorias que devem ser implementadas.
62 Comentários
Segue meu e-mail para possíveis contatos... cipii@hotmail.com
Devido a limitações dos PDAs não existem muitos bancos de dados que rodem nele. Conseguimos rodar sqlite porque existe essa dll. Podemos também gravar dados em arquivos texto e xml.
testei seu exemplo no meu WM6.5 e sempre crashou... depois tentei com o emulador e o WM6.1 e o mesmo acontecia. Será que fiz alguma coisa errada? vc nao pode testar no 6.1 ou 6.5? muito obrigado!
Pedro
Pedro
Você copiou a dll correta para WinCE? Verifique se o sqliteviewer funciona. Eu testei em um pda com WM 5. Vou tentar um emulador do 6 pra ver se dá certo.
miniSQLiteViewer-win32-1.1.beta.zip
miniSQLiteViewer-wince-1.1.beta.zip
o sqliteviewer nao crasha mas nao abre a db...
Pedro
Segui os passos para instalação, ajuste e compilação para a plataforma ARM, mas infelizmente algo não deu certo, pois o HP Jornada 520 que tenho disponível, rodando Windows CE versão 3.0.9348. Processador SH3, 16 MB RAM.
Compilo, copio para um cartão CF, e tento executar. Diz que o meu HelloWorld, codigo abaixo, é incompatível. Poderias me informar como proceder para resolver. Muito obrigado.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Label1.Caption:='Hello World';
end;
initialization
{$I unit1.lrs}
end.
vc nao poderia postar os fontes desse seu exemplo nao?
e que eu to tentando fazer exatamente como vc colou e nao ta funcionando. obrigado.
t+
Está aqui:
http://sites.google.com/site/carlosctrl/documentos-1/WCE.rar?attredirects=0&d=1
primeiro, os componentes de tela utilizados são Label,Image, TextBox, EditMask sendo assim acredito que não será necessário KOL-CE,QT4, mesmo pq QT4, esta dando erro na compilação do LCL (0.9.28.2 beta,FPC 2.2.4 SVN 22279)
Até o momento ja vi que terei de colocar este codigo de controle
{$ifdef LCLWinCE}
WinCEWidgetset.WinCETitlePolicy := tpOKButtonOnlyOnDialogs;
Application.ApplicationType := atSmartphone;//atKeyPadDevice; atPDA
//FrmInicio.BorderStyle:=bsDialog;
{$else}
//FrmInicio.BorderStyle:=bsNone; // em windows ou linux nao tem botao de fechar
{$endif} assim como este include
{$ifdef LCLWinCE}
WinCEInt,
{$endif}
hoje a aplicacao em Win/Linux não pode ser encerrada por meio dos botões de Dialogo, espero que o código acima possibilite isto
roadmap:
- verificar diretorios no wincexlinux
- verificar bibliotecas/porte .dll/.so
- verificar coordenadas/dimensao de tela, fontes de letra
- criar "utilitario" para impressão, no linux uso cat > lpt
vou postando o progresso
Segui todos procedimentos e não consegui acessar o banco com o TSQLite3Dataset, pois o mesmo não constava na paleta de componentes.
Pergunto, como faço pra instalar o componente TSQLite3Dataset e deixá-lo funcionando, eu estou usando o Lazarus Version 0.9.28.2.
Obrigado.
Ass. Hugo
estou usando:
- sqliteviewer.exe para criar e visualizar o banco no Win CE;
- sqlite3.dll estou usando essa DLL, sendo que a mesma quando abro o emulador ela não aparece no diretório compartilhado;
Ele está dando um erro de conexão com o banco na hora de inserir um registro. Caso for possível gostaria que mim enviasse os fontes para que eu possa analisar.
Email: hugoleoal@gmail.com
Ass: Hugo
Obrigado.
http://sites.google.com/site/carlosctrl/documentos-1/WCE.rar?attredirects=0&d=1
Baixei seu demo e tentei rodar em iPAQ da HP com Windows CE, coloquei dentro de uma pasta chamada IBGE com a sqlite3.dll, porem percebi que nao tinha o arquivo clientes.db, criei com SQLite Browser com a tabela "cidade" e os campos "Id_Cidade","nome", porem a apalicação abre na hora de cadastrar uma cidade com seu código da msg de erro "SQLITE_ERRC - no such table: cidade."
Obrigado pela ótima dica, com isso estamos crecendo mais em nossas vidas proficionais.
Abraços.
Thiago Gobatti
Vou checar mais uma vez. Rodei esse demo num iPAQ com WinCE 5.0. Já viu esse outro post? http://professorcarlos.blogspot.com/2010/08/lazarus-wince-com-dbf.html.
Neste eu usei tabelas dBase.
Grato desde já.
estou tentando fazer uma aplicação onde o programa, no WinCE, enxergue a Base de Dados, em SQL Server, em um servidor WinServer.
vc tem alguma dica por onde posso iniciar??
mto obrigado
Rafael
Não consegui entender os exemplos que vem junto com o pacote do LNET, poderia me ajudar ?
Você pode usar o exemplo na pasta tcpudp. Quando você executa ele, pode-se escolher o tipo da conexão e a porta. No desktop você pressiona o botão "Host" pra ficar aguardando uma conexão. No PDA você escolhe o mesmo tipo de conexão, a mesma porta, informa o nome do host e pressiona o botão "Connect". Daí pra testar você digita algo na caixa de texto e pressiona "Send". O host deve receber a mensagem. Eu já fiz testes assim com um PDA enviando comando SQL para um servidor Firebird num desktop. Funcionou bem. Esse exemplo é excelente pra você escrever o seu.
Entre Java e Lazarus fiz os testes e achei Lazarus bem mais interessante.Pois em pouco tempo foi muito fácil criar um aplicativo com tabelas dbf.
Não saberia me dizer se no Windows Mobile 7 o Lazarus funciona?
Valeu.
Eu ainda não fiz testes, mas acredito que funcione. Tente baixar o emulador e verifique isso. Qualquer dúvida, poste aqui ou me mande uma mensagem.
Você já conseguiu usar as versões mais recentes do Snapshots do Lazarus para WinCE?
Obrigado.
Jairo Gurgel
jsgurgel@hotmail.com
parabens pelo seu trabalho.
fiz um pequeno exemplo para win ce que esta funcionando como preciso, porem gostaria de comunicar em tempo real com um servidor que usa um banco mysql.
ha alguma dll ou algo parecido para se comunicar com o servidor?
[]`s
juvencio
bdxy@bol.com.br
Uma solução é usar um componente chamado lnet (lnet.wordpress.com) e fazer a comunicação via tcp/ip.
Obrigado pela dica.
Instalei o componente e compilei alguns dos exemplos no desktop sem problemas , porem não compila para o windows ce.
Usei o lazarus 0.9.31 com fpc 2.5.1.
O senhor conseguiu compilar para wince? com qual versão? qual exemplos testou?
[]`s
juvencio
conforme havia prometido, removendo as linhas de comentario consegui compilar tambem para o wince.
Compilei o exemplo testnet da pasta de exemplos.
coloquei em um micro 64 bits, para testar, mas sempre reclama da falta do OpenSSL library.
Ja fiz a instalação, copie para a psta do aplicativo, para a pasta do windows, mas não tem jeito de funcionar.
Nao tentei ainda para o wince,pois primeiro preciso entender o funcionamento, mas nao estou conseguindo.
alguma orientação?
[]'
juvencio
Coloquei os arquivos na pasta C:\Windows\SysWOW64, mas no windows 7 não tem jeito de funcionar.
Ha um misterio que nao entendi que é o seguinte:
no windows XP para poder executar fora do diretorio original do exemplo precisa copiar os arquivos pkey e cert para o diretorio do arquivo.
No Windows 7 nem assim funcionou.
bom, esses arquivos não foram "compilados" no momento da compilacao do exemplo, pois mantiveram a data original.
O senhor teria alguma ideia do que fazer com esses arquivos no dispositivo movel?
E as dll's openSSL existem para windows CE? procurei na internet mas nao encontrei nada.
[]`s
Juvencio
Nao consigo rodar os aplicativos que usam openSSL no windows CE, pois reclama da falta das dll`s.
O Sr. conseguiu localizar essas dll`s?
Poderia disponibiliza-las ou informar onde consegui-las.
Juvencio
Estou tentando integrar "on-line" um aplicativo em dispositivo movel com um sistema em um servidor.
Compilei o exemplo tcpudp que acompanha o lnet, porem para funcionar no celular, somente removendo a parte que usa as bibliotecas SSL.
De micro a micro, com windows xp consegui comunicar, porém no dispositivo movel ainda não.
[]`s
juvencio
Não sei se existem essas dlls para WM. Já tentou pesquisar alguma coisa no próprio site da lnet?
Error: ppcarm.exe can't be executed, error message: Failed to execute ""ppcarm.exe" -MObjFPC -Scghi -O1 -Twince -gl -Xs -WG -vewnhi -l "-FiC:\Documents and Settings\usuario002\Meus documentos\TESTE LAZRUS\lib\i386-win32" -Fuc:\lazarus\lcl\units\arm-wince -Fuc:\lazarus\lcl\units\arm-wince\wince -Fuc:\lazarus\packager\units\arm-wince "-FuC:\Documents and Settings\usuario002\Meus documentos\TESTE LAZRUS\" -Fu. "-FUC:\Documents and Settings\usuario002\Meus documentos\TESTE LAZRUS\lib\i386-win32\" -oproject1.exe -dLCL -dLCLwince project1.lpr
O que poderia ser feito para contornar esse erro ?
Obrigado pela atenção.
Estou com 2 Problemas :
1° - Baixe o seu executavel ja compilado para windows ce e da a seguinte mensagem ao executar ele no emulador do windows ce:
"sqlteviewer" is not a valid windows Ce application.
2 ° - Pelos fontes disponibilizados pelo senhor, tentei compilar em ambiente do windows 7 64 bits e no xp 32 bits, em nenhum dos dois com sucesso.
Mensagem:
Error: ppcarm.exe can't be executed, error message: Failed to execute ""ppcarm.exe" -B -MObjFPC -Scgi -O1 -Twince -vewnhi -l -Fuc:\lazarus\lcl\units\arm-wince -Fuc:\lazarus\lcl\units\arm-wince\wince -Fuc:\lazarus\packager\units\arm-wince -FuC:\Users\gustavo\Desktop\WCE\WCE\ -Fu. -oTeste.exe -dLCL -dLCLwince Teste.lpr
Ja instalei tanto o
lazarus-0.9.30-fpc-2.4.2-win32
Quanto o
Lazarus-0.9.31-34218-fpc-2.4.4-20111216-cross-arm-wince-win32.
Pode me ajudar?
Desde de já, agradeco!
Um Abraço
Quanto à compilação, houve algumas diferenças na forma de configurar o widgetset e o ambiente alvo.
Atualmente você configura o widget em Opções de Projeto -> Opções de compilador -> Caminhos
E o SO alvo você configura em Opções de Projetos -> Opções de compilador -> Geração código
Tente e me retorne
Lazarus-0.9.28.2-fpc-2.2.4-cross-arm-wince-win32.exe
, pois no link do site nao aponta pra ele!
Desde de ja obrigado.
Att
Essa versão está obsoleta. Você precisa baixar a versão mais recente, tanto o Lazarus quanto o pacote para wince. Aqui você tem isso
http://sourceforge.net/projects/lazarus/files/Lazarus%20Windows%2032%20bits/Lazarus%200.9.30.2/
Com o link que me mandou o lazarus compilar certinho para windows Ce, agora os que estao no proprio site , não funcionam.
Ate ai tudo bem, gerei o executavel so que quando coloco no emulador do windows ce 5 diz que nao e compativel, vi que em uma resposta mais acima o Sr disse que o lazarus nao poderia ser o pra cross-arm se nao , nao geraria o executavel corretamente, consigo lhe enviar o .exe para o Sr rodar ou tem como eu saber se o problema esta com o lazarus instalado?
Obrigado
Att
http://sites.google.com/site/carlosctrl/documentos-1/WCE.rar?attredirects=0&d=1
Não consegui fazer a configuração inicial da IDE Lazarus para compilar conforme descrito no inicio de seu post, "Project -> Compiler options. Na aba Paths selecione wince em LCL Widget Type (various). Na aba Code escolha WinCE em Target OS (-T) e arm em Target CPU family (-P). Pronto. O compilador irá gerar um executável que executa apenas no PDA. Dessa forma para compilar use sempre CTRL + F9."
Minha versão do Lazarus 1.0.8 e Fpc 2.6.2 ; Traz o seguinte erro: O compilador C:\lazaus\fpc\2.6.2\bin\i386-win32\fpc.exe nao suporta o alvo arm-wince.
O que faço pra resolver ?
No aguardo !
Marcos Martins
Para poder compilar para arm é necessário instalar o pacote correspondente. No mesmo local onde você baixou o pacote principal existe o pacote cross-arm-wince.