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.

























































