Em determinadas situações tratar arquivos textos é necessário. Arquivos nesse formato são usados com frequência para troca de dados entre sistemas. Mesmo com a força de XML, esse formato ainda tem seu espaço.
Em Lazarus existem componentes que possibilitam o tratamento desse tipo de fontes de dados. Na aba de componentes Data Access encontramos o TSdfDataSet e o TFixedFormatDataSet. A seguir vamos abordar cada um deles e mostrar exemplos.
TSdfDataSet
Este componente permite tratar um arquivo texto que usa um delimitador entre os campos, como um arquivo csv. O arquivo já deve existir para ser utilizado. Pode ser criado facilmente usando um editor comum. Crie um arquivo e digite uma linha com três campos separados por vírgula, por exemplo:
1,JOÃO DA SILVA,joao@meuemail.com.br
Chame o arquivo de cliente.txt. Ele terá três campos: ID, NOME e EMAIL.
Crie uma nova aplicação no Lazarus. Vamos fazer tudo no próprio form, mas mantenha o hábito de colocar seus componentes de banco de dados em um Data Module, como costumamos fazer nos artigos anteriores.
Localize a aba Data Access e coloque um TSdfDataSet. Altere a propriedade Name para tbContato e, em FileName informe o nome do arquivo criado acima com o caminho completo. Na propriedade Delimiter é possível especificar um delimitador, que por padrão é (,).
Da mesma aba selecione um TDataSource e coloque no form. Altere Name para dsContato e selecione tbContato na propriedade DataSet.
Coloque três TDBEdits no form e identifique-os apropriadamente com TLabels. Defina a propriedade DataSource de cada um deles com dsContato. Defina DataField como Field1, Field2 e Field3, respectivamente. Deve ocorrer um erro em cada atribuição mas não se preocupe com isso. Se preferir, pode mudar a propriedade Active de tbContato para True e os nomes dos campos - Field1, Field2 e Field3 - devem aparecer automaticamente. Se ocorrer um erro ou os nomes dos campos não aparecerem verifique se o nome do arquivo está corretamente definido. Agora coloque um TDBNavigator da aba Data Controls e defina a propriedade DataSource como dsContato.
Agora vamos escrever o código para abrir e fechar a tabela. Faça como antes já fizemos. No evento OnShow do form escreva:
tbContato.Open;
E no evento OnClose, escreva:
tbContato.Close;
Execute o programa. Ele deve funcionar normalmente. Permite inserir, excluir, alterar e navegar nos registros.
TFixedFormatDataSet
Este componente é usado para manipular arquivos de texto onde cada campo tem um tamanho fixo. Quando o valor do campo não preenche totalmente o tamanho dele, o restante é completado com espaços. Assim como no componente anteior, neste também é necessário criar o arquivo antes. Simplesmente vamos criar um novo arquivo texto vazio. Fica definido que o campo Id terá 5 caracteres, Nome e Email terão 30 caracteres, cada um. Diferente de TSdfDataSet, a programação de exige um pouco de código, como veremos mais a frente.
Crie uma nova aplicação no Lazarus. Coloque um TFixedFormatDataSet no form e defina a propriedade Name como tbContato e na propriedade FileName informe o nome do arquivo texto criado com o caminho completo.
Coloque também um TDataSource. Mude Name para dsContato e selecione tbContato em DataSet.
Bem, este componente precisa de algum código para funcionar. Ele só reconhece um campo - Line. Line representa uma linha do arquivo. Então coloque três TEdits e mude as propriedades Names para edId, edNome e edEmail, respectivamente. Coloque três TLabels para identificar esses campos. Coloque um TDBNavigator e defina a propriedade DataSource como dsContato.
Localize o evento AfterScroll de tbContato e escreva o seguinte código para ele:
edId.Text := copy(tbContato.FieldByName('Line').Value, 1, 5);
edNome.Text := copy(tbContato.FieldByName('Line').Value, 6, 30);
edEmail.Text := copy(tbContato.FieldByName('Line').Value, 36, 30);
Com isso, a cada vez que navegamos em um registro, este código extrai cada parte e a atribui ao TEdit correspondente. No evento BeforePost de tbContato escreva:
tbContato.FieldByName('Line').Value := Espacos(edId.Text,5) + Espacos(edNome.Text,30) + Espacos(edEmail.Text,30);
A função Espacos() preenche cada campo com espaços até completar o tamanho do campo:
function TfrmTexto.Espacos(s: string; t: integer): string;
var
i: integer;
begin
result := s;
for i := length(s) + 1 to t do
result := result + ' ';
end;
O cabeçalho dessa função deve ser declarado na seção type junto aos outros métodos da unit. Agora escreva o código para abrir a tabela em OnShow e para fechar em OnClose.
Pronto. Compile e execute o programa. Neste exemplo, a tabela não entra em modo de edição automaticamente quando alteramos algum campo nos TEdits. É necessário ativar o modo de edição pressionando o botão correspondente no TDBNavigator.
terça-feira, 16 de março de 2010
Lazarus - Tratamento de Arquivos Texto
Marcadores:
arquivos texto,
TFixedFormatDataSet,
TSdfDataSet
Posts Relacionados
domingo, 14 de março de 2010
Pausa para uma xícara de café
Em Java usamos a classe Scanner para separar uma fonte de dados em partes delimitadas por um delimitador específico. Quem é responsável pela entrada de dados é System.in e não Scanner. Por exemplo, vamos observar esse trecho de código:
Scanner sc = new Scanner(System.in); // declara um objeto
// Scanner
String nome;
String endereco;
System.out.println("Digite o nome:");
nome = sc.next(); // lê nome do teclado
System.out.println("Digite o endereço:");
endereco = sc.next(); // lê endereço do teclado
System.out.println(nome + ", " + endereco);
Se você, quando for pedido o nome, entrar por exemplo: "Joao da Silva", vai observar que nome irá receber "Joao" e endereco, "da". O programa nem irá solicitar a digitação do endereço. Isso acontece porque o delimitador padrão da classe Scanner é o espaço. Scanner é um tokenizador, ou seja, divide uma string em pedaços, e quem delimita esses pedaços, por padrão, é o espaço. Dessa forma quando digitamos "Joao da Silva", Scanner o divide em três pedaços. O primeiro ("João") é atribuido a nome, o segundo ("da") é atribuido a endereço e o terceiro fica perdido. Então, como solucionar isso? A boa notícia é que Scanner tem um método que permite alterar o delimitador. Inclua a seguinte linha após a declaração do objeto Scanner:
System.getProperty("line.separator") retorna o separador de linhas definido no sistema e passa para o método useDelimiter(), que o define como um novo delimitador para Scanner. Normalmente o separador de linhas é o "\n". No Windows é "\r\n". Dessa forma quando for solicitado o nome, tudo que for digitado até o "\n", será considerado parte da variável nome. Podemos definir qualquer string como delimitador ou mesmo uma expressão regular (regex). Scanner pode tokenizar quaisquer strings, não apenas o que é lido do teclado.
Scanner sc = new Scanner(System.in); // declara um objeto
// Scanner
String nome;
String endereco;
System.out.println("Digite o nome:");
nome = sc.next(); // lê nome do teclado
System.out.println("Digite o endereço:");
endereco = sc.next(); // lê endereço do teclado
System.out.println(nome + ", " + endereco);
Se você, quando for pedido o nome, entrar por exemplo: "Joao da Silva", vai observar que nome irá receber "Joao" e endereco, "da". O programa nem irá solicitar a digitação do endereço. Isso acontece porque o delimitador padrão da classe Scanner é o espaço. Scanner é um tokenizador, ou seja, divide uma string em pedaços, e quem delimita esses pedaços, por padrão, é o espaço. Dessa forma quando digitamos "Joao da Silva", Scanner o divide em três pedaços. O primeiro ("João") é atribuido a nome, o segundo ("da") é atribuido a endereço e o terceiro fica perdido. Então, como solucionar isso? A boa notícia é que Scanner tem um método que permite alterar o delimitador. Inclua a seguinte linha após a declaração do objeto Scanner:
sc.useDelimiter(System.getProperty("line.separator"));
System.getProperty("line.separator") retorna o separador de linhas definido no sistema e passa para o método useDelimiter(), que o define como um novo delimitador para Scanner. Normalmente o separador de linhas é o "\n". No Windows é "\r\n". Dessa forma quando for solicitado o nome, tudo que for digitado até o "\n", será considerado parte da variável nome. Podemos definir qualquer string como delimitador ou mesmo uma expressão regular (regex). Scanner pode tokenizar quaisquer strings, não apenas o que é lido do teclado.
Marcadores:
classe Scanner,
Java
Posts Relacionados
sábado, 13 de março de 2010
Lazarus - Conectando PostgreSQL com ZeosLib
Neste artigo mostraremos como criar uma aplicação simples usando o conjunto de componentes ZeosLib e o banco de dados PostgreSQL (PG). ZeosLib precisar ser baixado e instalado. Depois de extrair os arquivos, inicie o Lazarus. Selecione no menu Package -> Open package file (.lpk). Localize o diretório onde você extraiu o componente e selecione o pacote zcomponent.lpk em \packages\lazarus. Na janela que abrir clique em Compile. Aguarde finalizar e então clique em Install. Esse procedimento irá recompilar o Lazarus e depois ele será reinicializado. Confira que uma nova aba foi adicionada na paleta de componentes - Zeos Access.
Com relação ao banco de dados, você pode baixá-lo no site oficial. A instalação é muito simples, inclusive no Ubuntu. No Windows localize libpq.dll no diretório de instalação do PG e copie-a para o diretório System32 - procedimento necessário para o funcionamento do Zeos com PG.
Agora que está tudo instalado, no PG, crie um novo banco de dados - chame-o de clientes - e as tabelas necessárias para o nosso exemplo:
create table cidade (id_cidade integer primary key, nome varchar(30));
create table cliente (id_cliente integer primary key, nome varchar(40), endereco varchar(40), id_cidade integer references cidade(id_cidade), telefone varchar(14), tipo char(1), status boolean);
Vamos criar uma aplicação semelhante àquela que criamos nos posts em Lazarus - Acessando banco de dados com SQLdb - Parte I e Parte II. Como a interface é a mesma, vamos descrever apenas a criação do Data Module.
Inicie o Lazaus, crie uma nova aplicação e adicione um Data Module ao programa. Defina Name como dmDados. É no Data Module que tudo irá acontecer daqui em diante.
TZConnection
Esse componente é reponsável por criar uma conexão com o banco de dados e controlar as transações. Veremos que ele possui propriedades que permitem que seja configurado para se conectar a vários bancos de dados: PostgreSQL, Firebird, Oracle, SQLite e outros. Coloque um desses no Data Module. As seguintes propriedades merecem um melhor entendimento:
AutoCommit - determina de que forma as alterações são confirmadas no banco de dados. Se deixar em True as alterações são confirmadas implicitamente. Caso se deseje confirmar explicitamente devemos mudar para False. No nosso caso deixemos em True.
Connected - estabelece uma conexão com o banco. Durante o desenvolvimento, se for necessário, coloque em True. Mas lembre de voltar para False antes de finalizar o projeto.
Database - define o nome do banco de dados. Digite clientes. Se estiver usando o Firebird ou SQLite você deve informar o caminho completo do arquivo do banco de dados.
HostName - informa o nome ou IP do servidor de banco de dados. Se for a máquina local atribua o nome localhost.
Name - informe dbCliente.
Password - informar a senha do servidor de banco de dados. Informe a senha do usuário definida durante a instalação do PG.
Protocol - define qual o banco de dados que será conectado. Informe postgresql-8 ou o que for adequado ao banco usado.
TransactionIsolation - define o nível de isolamento da transação. No nosso caso vamos usar tiReadCommitted.
User - define o nome do usuário do banco de dados. Informe o usuário criado durante a instalação do PG.
Para fazer um teste da conexão, mude a propriedade Connected para True. Se estiver tudo certo não deve acontecer erro.
TZUpdateSQL
Especifica os comandos SQL de atualização - INSERT, UPDATE e DELETE. Atua em conjunto com um TZQuery. Inclua um componente desse no Data Module e defina suas propriedades assim:
DeleteSQL - DELETE FROM CIDADE WHERE ID_CIDADE = :OLD_ID_CIDADE;
InsertSQL - INSERT INTO CIDADE VALUES (:ID_CIDADE, :NOME);
ModifySQL - UPDATE CIDADE SET NOME = :NOME WHERE ID_CIDADE = :OLD_ID_CIDADE;
Para informar os comandos clique na propriedade correspondente do Inspetor de Objetos. Digite o comando no editor e tecle OK.
Name - defina como upCidade.
Qualquer identificador precedido por dois pontos (:) é um parâmetro que será definido quando o comando for executado. O prefixo OLD possibilita o acesso ao valor do campo antes dele ser modificado.
TZQuery
Query que deve ser usada para atualizar dados em tabelas. É usada em conjunto TZUpdateSQL para que execute as operações de INSERT, UPDATE ou DELETE. Para cada tabela do banco deveremos ter um desses componentes no Data Module. Inclua uma TZQuery no Data Module e vamos alterar suas propriedades:
Connection - especifica o objeto TZConnection. Selecione dbCliente.
Name - queCidade.
SQL - especifica um comando SELECT para mostrar os dados da tabela. Informe: SELECT * FROM CIDADE.
UpdateObject - define o objeto TZUpdateSQL que será usado em conjunto com TZQuery. Selecione upCidade.
Para finalizar o desenho do acesso à tabela Cidade, coloque um TDataSource da aba Data Access. Defina Name como dsCidade e DataSet como queCidade.
Com exceção de TZConnection - que deve ser apenas um - repita o processo para definir o acesso à tabela Cliente. O Data Module deverá ter esse aspecto:
Não é necessário incluir todo aquele código no evento AfterPost das TZQueries. Isso é feito automaticamente pois a propriedade AutoCommit de TZConnection está definida como True. A partir de agora o programa é exatamente igual ao que foi criado em Lazarus - Acessando banco de dados com SQLdb - Parte I e Parte II. Siga os mesmos passos desses posts. Bem, uma pequena modificação se faz necessária. Nos eventos OnShow e OnClose de frmPrincipal na aplicação anterior nós incluimos códigos para abrir e fechar a conexão. Diferente do SQLdb, no Zeos, o comando para abrir a conexão será:
e para encerrar:
Qualquer dúvida na criação dessa aplicação, podem me escrever ou deixar um comentário. Terei o maior prazer em ajudar.
Com relação ao banco de dados, você pode baixá-lo no site oficial. A instalação é muito simples, inclusive no Ubuntu. No Windows localize libpq.dll no diretório de instalação do PG e copie-a para o diretório System32 - procedimento necessário para o funcionamento do Zeos com PG.
Agora que está tudo instalado, no PG, crie um novo banco de dados - chame-o de clientes - e as tabelas necessárias para o nosso exemplo:
create table cidade (id_cidade integer primary key, nome varchar(30));
create table cliente (id_cliente integer primary key, nome varchar(40), endereco varchar(40), id_cidade integer references cidade(id_cidade), telefone varchar(14), tipo char(1), status boolean);
Vamos criar uma aplicação semelhante àquela que criamos nos posts em Lazarus - Acessando banco de dados com SQLdb - Parte I e Parte II. Como a interface é a mesma, vamos descrever apenas a criação do Data Module.
Inicie o Lazaus, crie uma nova aplicação e adicione um Data Module ao programa. Defina Name como dmDados. É no Data Module que tudo irá acontecer daqui em diante.
TZConnection
Esse componente é reponsável por criar uma conexão com o banco de dados e controlar as transações. Veremos que ele possui propriedades que permitem que seja configurado para se conectar a vários bancos de dados: PostgreSQL, Firebird, Oracle, SQLite e outros. Coloque um desses no Data Module. As seguintes propriedades merecem um melhor entendimento:
AutoCommit - determina de que forma as alterações são confirmadas no banco de dados. Se deixar em True as alterações são confirmadas implicitamente. Caso se deseje confirmar explicitamente devemos mudar para False. No nosso caso deixemos em True.
Connected - estabelece uma conexão com o banco. Durante o desenvolvimento, se for necessário, coloque em True. Mas lembre de voltar para False antes de finalizar o projeto.
Database - define o nome do banco de dados. Digite clientes. Se estiver usando o Firebird ou SQLite você deve informar o caminho completo do arquivo do banco de dados.
HostName - informa o nome ou IP do servidor de banco de dados. Se for a máquina local atribua o nome localhost.
Name - informe dbCliente.
Password - informar a senha do servidor de banco de dados. Informe a senha do usuário definida durante a instalação do PG.
Protocol - define qual o banco de dados que será conectado. Informe postgresql-8 ou o que for adequado ao banco usado.
TransactionIsolation - define o nível de isolamento da transação. No nosso caso vamos usar tiReadCommitted.
User - define o nome do usuário do banco de dados. Informe o usuário criado durante a instalação do PG.
Para fazer um teste da conexão, mude a propriedade Connected para True. Se estiver tudo certo não deve acontecer erro.
TZUpdateSQL
Especifica os comandos SQL de atualização - INSERT, UPDATE e DELETE. Atua em conjunto com um TZQuery. Inclua um componente desse no Data Module e defina suas propriedades assim:
DeleteSQL - DELETE FROM CIDADE WHERE ID_CIDADE = :OLD_ID_CIDADE;
InsertSQL - INSERT INTO CIDADE VALUES (:ID_CIDADE, :NOME);
ModifySQL - UPDATE CIDADE SET NOME = :NOME WHERE ID_CIDADE = :OLD_ID_CIDADE;
Para informar os comandos clique na propriedade correspondente do Inspetor de Objetos. Digite o comando no editor e tecle OK.
Name - defina como upCidade.
Qualquer identificador precedido por dois pontos (:) é um parâmetro que será definido quando o comando for executado. O prefixo OLD possibilita o acesso ao valor do campo antes dele ser modificado.
TZQuery
Query que deve ser usada para atualizar dados em tabelas. É usada em conjunto TZUpdateSQL para que execute as operações de INSERT, UPDATE ou DELETE. Para cada tabela do banco deveremos ter um desses componentes no Data Module. Inclua uma TZQuery no Data Module e vamos alterar suas propriedades:
Connection - especifica o objeto TZConnection. Selecione dbCliente.
Name - queCidade.
SQL - especifica um comando SELECT para mostrar os dados da tabela. Informe: SELECT * FROM CIDADE.
UpdateObject - define o objeto TZUpdateSQL que será usado em conjunto com TZQuery. Selecione upCidade.
Para finalizar o desenho do acesso à tabela Cidade, coloque um TDataSource da aba Data Access. Defina Name como dsCidade e DataSet como queCidade.
Com exceção de TZConnection - que deve ser apenas um - repita o processo para definir o acesso à tabela Cliente. O Data Module deverá ter esse aspecto:
Não é necessário incluir todo aquele código no evento AfterPost das TZQueries. Isso é feito automaticamente pois a propriedade AutoCommit de TZConnection está definida como True. A partir de agora o programa é exatamente igual ao que foi criado em Lazarus - Acessando banco de dados com SQLdb - Parte I e Parte II. Siga os mesmos passos desses posts. Bem, uma pequena modificação se faz necessária. Nos eventos OnShow e OnClose de frmPrincipal na aplicação anterior nós incluimos códigos para abrir e fechar a conexão. Diferente do SQLdb, no Zeos, o comando para abrir a conexão será:
dmDados.dbCliente.Connect;
e para encerrar:
dmDados.dbCliente.Disconnect;
Qualquer dúvida na criação dessa aplicação, podem me escrever ou deixar um comentário. Terei o maior prazer em ajudar.
Marcadores:
PostgreSQL,
ZeosLib
Posts Relacionados
sexta-feira, 5 de março de 2010
Lazarus - Criando uma aplicação para WinCE
Preparando o ambiente
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:
No evento OnShow do form o objeto tbCidade é criado e inicializado com os dados do banco de dados e da tabela Cidade:
No evento OnSelectCell da TStringGrid definimos que a os dados na linha selecionada na StringGrid são copiados para os TEdits:
No evento OnClick de btnConsultar a tabela é consultada e seus dados mostrados na StringGrid:
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:
O comando DELETE é construído e executado no evento OnClick de btnExcluir:
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.
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.
Marcadores:
WinCE,
Windows Mobile
Posts Relacionados
quarta-feira, 24 de fevereiro de 2010
Lazarus - Acessando banco de dados com SQLdb - Parte II
Form de Cliente
No DataModule já deve ter uma TSQLQuery e um TDataSource devidamente configurados para acesso à tabela Cliente. Vamos então inserir um novo form no programa definindo Name como frmCliente, Caption como Clientes. Mande salvar e informe u_cliente no nome da unit. Acesse o editor de código referente a esse form e abaixo de Implementation, para permitir que a unit u_cliente tenha acesso aos objetos do DataModule, digite:
uses u_dmdados;
Volte ao form e inclua um TPanel da mesma forma que foi feito para o form de Cidade. Selecione um TDBNavigator da aba Data Controls e coloque sobre o painel. Defina a propriedade DataSource como dsCliente. Insira um TSpeedButton da aba Additional no painel e o configure semelhante ao que fizemos no form de Cidade, inclusive definindo o código do evento OnClick para fechar o form. O form de Cliente deverá ter essa aparência:
Coloque dois TDBedit no form, o primeiro deve ter Name definido como edIdCliente, DataSource como dsCliente e DataField como ID_CLIENTE. No segundo defina Name como edNome, DataSource como dsCliente e DataField como NOME. Coloque dois TLabel para identificar esse campos e defina os Caption de acordo com a figura anterior.
O componente TDBLookupComboBox é usado para que, no caso de uma chave estrangeira (ID_CIDADE na tabela Cliente), o usuário possa escolher o registro na tabela referenciada (Cidade). Neste componente os dados da tabela referenciada são mostrados em uma lista. Pegue então um componente desses na aba Data Controls e coloque no form abaixo do segundo TDBEdit. Defina Name como dblIdCidade, DataSource como dsCliente e DataField como ID_CIDADE. Para definir a lista primeiramente defina a propriedade ListSource como dsCidade, na propriedade ListField (campo que será visualizado na lista) defina NOME e KeyField (campo chave) defina como ID_CIDADE. Existe ainda a propriedade Sorted que define se a lista estará ordenada e Style que define o comportamento do controle. Deixe Sorted como True e Style como dsDropDownList (o usuário não poderá digitar no controle, apenas selecionar da lista). Coloque um TLabel para identificar este campo.
Coloque mais um TDBEdit abaixo do LookupComboBox. Defina Name como edTelefone, DataSource como dsCliente e DataField como TELEFONE. Coloque um TLabel para fazer a identificação do campo.
O campo TIPO da tabela Cliente é usado para informar se o cliente é pessoa física - representado pela letra F - ou pessoa jurídica - representado pela letra J. Para este controle vamos usar um TDBRadioGroup, que permite que sejam definidas opções para serem selecionadas. Pegue um componente desses e o coloque no form. Defina a propriedade Caption como Tipo e Name como rgTipo. DataSource será dsCliente e DataField será TIPO. Clique no botão da propriedade Items. Será aberta uma janela com o editor de strings. Digite Pessoa física na primeira linha e Pessoa jurídica na segunda e pressione OK. Na propriedade Columns digite 2 para que as opções apareçam em linha. Clique no botão da propriedade Values - onde estão os valores correspondentes às opções definidas em Items. Digite F na primeria linha e J na segunda. Desta forma quando for selecionada a opção Pessoa física será gravado F no banco de dados, e J caso contrário. Redimensione o componente adequadamente.
Finalmente coloque um TDBCheckBox no form. Defina Caption como Ativo e Name como chxStatus. DataSource é definido como dsCliente e em DataField digite STATUS. As propriedades ValueChecked e ValueUnchecked são usadas para definir o que será gravado no campo quando o componente estiver marcado ou não marcado. Como nosso campo no banco de dados é boolean, não é necessário alterar nada.
Para programar a abertura e o fechamento da Query faça de forma análoga ao que foi feito no form de Cidade. Escreva os códigos correspondentes nos eventos OnShow e OnClose de frmCliente.
Mude para o DataModule e selecione queCliente. Selecione a aba Eventos do Inspetor de objetos e dê um duplo clique ao lado do evento AfterPost. Digite o código como na figura:
Note que esse código é ligeiramente diferente do que fizemos para queCidade. Em vez de usarmos CommitRetaining, agora usamos Commit. Commit fecha todas as tabelas abertas, por isso a Query é aberta na linha 68. Na linha 63 guardamos as chave primária do registro atual na variável chave. E depois que a Query é aberta, usamos Locate para localizar o registro correspondente à variável chave. Esta é outra forma de fazer o COMMIT na transação.
Localize o evento AfterDelete da Query. Clique no botão da caixa à direita para selecionar um método existente. Selecione queClienteAfterPost para que a transação seja encerrada da mesma forma quando um registro for excluído.
Agora vamos ao form principal. Na linha uses abaixo de Implementation acrescente u_cliente para que ela fique assim:
Clique no menu Cadastros -> Clientes e no código do evento OnClick digite:
Execute o programa e chame o form de Cliente para fazer os testes.
Consultas
O próximo passo do desenvolvimento será criar as telas de consulta às tabelas Cidade e Cliente. Neste artigo mostraremos a criação da consulta de cidades. Supomos que a consulta de clientes é análoga e não haverá dificuldade em criá-la.
Para iniciar vamos ao DataModule inserir dois componentes necessários: um TSQLQuery e um TDataSource. Na Query mude Name para queConsCidade. Na propriedade Database selecione dbCliente. Certifique-se que a propriedade Transaction está corretamente definida como trGeral. No TDataSource mude Name para dsConsCidade e DataSet para queConsCidade.
Uma interface de consulta é necessária, portanto deve-se inserir um novo form. Defina Name como frmConsCidade e Caption como Consulta de cidades. Salve e digite u_conscidade no nome da unit.
A consulta irá oferecer duas opções de consulta - pela chave primária ou por parte do nome. Então insira um TRadioGroup da aba Standard. Defina Caption como Campo. Na propriedade Items inclua as linhas Código e Nome. Na propriedade Name digite rgCampo. Redimensione o componente adequadamente.
Observe a figura acima para orientar o seu desenho. Inclua um TEdit da aba Standard. Defina Name como edDado e delete o conteúdo da propriedade Text.
Coloque um TLabel para identificar o campo. Defina Caption como Dado a consultar.
Insira um TButton. Defina Name btnConsultar. Localize o componente TDBGrid na aba Data Controls. Insira um no form. Defina sua propriedade Name com dbgDados. Abra o editor de código e digite abaixo de Implementation:
Volte ao form e na propriedade DataSource da TDBGrid selecione dsConsCidade. Dê um duplo clique no botão btnConsultar e digite o código:
Execute o programa e faça testes de consulta. Falta validar edDado para que aceite apenas dígitos numéricos quando a consulta for direcionada para o campo chave. Deixamos essa tarefa e a criação da consulta de clientes como um exercício.
Baixe aqui o código completo do programa.
Algumas considerações
Durante a criação dessa pequena aplicação encontramos dificuldade em achar relatos de experiências usando os componentes SQLdb. Já utilizamos outros componentes tanto em Lazarus quando no Delphi e sentimos algumas dificuldades principalmente no que diz respeito ao controle de transações. SQLdb só permite um objeto SQLTransaction na aplicação. Isso torna-se um obstáculo quando é necessário abrir mais de um form simultaneamente, pois quando fechamos uma transação todas as tabelas são fechadas. Outra dificuldade refere-se ao ponteiro TBookmark. Antes de encerrar uma transação guardamos o ponteiro do registro atual. Após encerrar a transação, quando o método GotoBookmark() é chamado para posicionar o registro no ponteiro salvo anteriormente ocorre uma exceção. Vale observar que chamar o GotoBookmark() antes de encerrar a transação funciona normalmente. Por esses motivos nos próximos artigos usaremos os componentes ZeosLib.
No DataModule já deve ter uma TSQLQuery e um TDataSource devidamente configurados para acesso à tabela Cliente. Vamos então inserir um novo form no programa definindo Name como frmCliente, Caption como Clientes. Mande salvar e informe u_cliente no nome da unit. Acesse o editor de código referente a esse form e abaixo de Implementation, para permitir que a unit u_cliente tenha acesso aos objetos do DataModule, digite:
uses u_dmdados;
Volte ao form e inclua um TPanel da mesma forma que foi feito para o form de Cidade. Selecione um TDBNavigator da aba Data Controls e coloque sobre o painel. Defina a propriedade DataSource como dsCliente. Insira um TSpeedButton da aba Additional no painel e o configure semelhante ao que fizemos no form de Cidade, inclusive definindo o código do evento OnClick para fechar o form. O form de Cliente deverá ter essa aparência:
Coloque dois TDBedit no form, o primeiro deve ter Name definido como edIdCliente, DataSource como dsCliente e DataField como ID_CLIENTE. No segundo defina Name como edNome, DataSource como dsCliente e DataField como NOME. Coloque dois TLabel para identificar esse campos e defina os Caption de acordo com a figura anterior.
O componente TDBLookupComboBox é usado para que, no caso de uma chave estrangeira (ID_CIDADE na tabela Cliente), o usuário possa escolher o registro na tabela referenciada (Cidade). Neste componente os dados da tabela referenciada são mostrados em uma lista. Pegue então um componente desses na aba Data Controls e coloque no form abaixo do segundo TDBEdit. Defina Name como dblIdCidade, DataSource como dsCliente e DataField como ID_CIDADE. Para definir a lista primeiramente defina a propriedade ListSource como dsCidade, na propriedade ListField (campo que será visualizado na lista) defina NOME e KeyField (campo chave) defina como ID_CIDADE. Existe ainda a propriedade Sorted que define se a lista estará ordenada e Style que define o comportamento do controle. Deixe Sorted como True e Style como dsDropDownList (o usuário não poderá digitar no controle, apenas selecionar da lista). Coloque um TLabel para identificar este campo.
Coloque mais um TDBEdit abaixo do LookupComboBox. Defina Name como edTelefone, DataSource como dsCliente e DataField como TELEFONE. Coloque um TLabel para fazer a identificação do campo.
O campo TIPO da tabela Cliente é usado para informar se o cliente é pessoa física - representado pela letra F - ou pessoa jurídica - representado pela letra J. Para este controle vamos usar um TDBRadioGroup, que permite que sejam definidas opções para serem selecionadas. Pegue um componente desses e o coloque no form. Defina a propriedade Caption como Tipo e Name como rgTipo. DataSource será dsCliente e DataField será TIPO. Clique no botão da propriedade Items. Será aberta uma janela com o editor de strings. Digite Pessoa física na primeira linha e Pessoa jurídica na segunda e pressione OK. Na propriedade Columns digite 2 para que as opções apareçam em linha. Clique no botão da propriedade Values - onde estão os valores correspondentes às opções definidas em Items. Digite F na primeria linha e J na segunda. Desta forma quando for selecionada a opção Pessoa física será gravado F no banco de dados, e J caso contrário. Redimensione o componente adequadamente.
Finalmente coloque um TDBCheckBox no form. Defina Caption como Ativo e Name como chxStatus. DataSource é definido como dsCliente e em DataField digite STATUS. As propriedades ValueChecked e ValueUnchecked são usadas para definir o que será gravado no campo quando o componente estiver marcado ou não marcado. Como nosso campo no banco de dados é boolean, não é necessário alterar nada.
Para programar a abertura e o fechamento da Query faça de forma análoga ao que foi feito no form de Cidade. Escreva os códigos correspondentes nos eventos OnShow e OnClose de frmCliente.
Mude para o DataModule e selecione queCliente. Selecione a aba Eventos do Inspetor de objetos e dê um duplo clique ao lado do evento AfterPost. Digite o código como na figura:
Note que esse código é ligeiramente diferente do que fizemos para queCidade. Em vez de usarmos CommitRetaining, agora usamos Commit. Commit fecha todas as tabelas abertas, por isso a Query é aberta na linha 68. Na linha 63 guardamos as chave primária do registro atual na variável chave. E depois que a Query é aberta, usamos Locate para localizar o registro correspondente à variável chave. Esta é outra forma de fazer o COMMIT na transação.
Localize o evento AfterDelete da Query. Clique no botão da caixa à direita para selecionar um método existente. Selecione queClienteAfterPost para que a transação seja encerrada da mesma forma quando um registro for excluído.
Agora vamos ao form principal. Na linha uses abaixo de Implementation acrescente u_cliente para que ela fique assim:
uses u_cidade, u_cliente;
Clique no menu Cadastros -> Clientes e no código do evento OnClick digite:
frmCliente.Show;
Execute o programa e chame o form de Cliente para fazer os testes.
Consultas
O próximo passo do desenvolvimento será criar as telas de consulta às tabelas Cidade e Cliente. Neste artigo mostraremos a criação da consulta de cidades. Supomos que a consulta de clientes é análoga e não haverá dificuldade em criá-la.
Para iniciar vamos ao DataModule inserir dois componentes necessários: um TSQLQuery e um TDataSource. Na Query mude Name para queConsCidade. Na propriedade Database selecione dbCliente. Certifique-se que a propriedade Transaction está corretamente definida como trGeral. No TDataSource mude Name para dsConsCidade e DataSet para queConsCidade.
Uma interface de consulta é necessária, portanto deve-se inserir um novo form. Defina Name como frmConsCidade e Caption como Consulta de cidades. Salve e digite u_conscidade no nome da unit.
A consulta irá oferecer duas opções de consulta - pela chave primária ou por parte do nome. Então insira um TRadioGroup da aba Standard. Defina Caption como Campo. Na propriedade Items inclua as linhas Código e Nome. Na propriedade Name digite rgCampo. Redimensione o componente adequadamente.
Observe a figura acima para orientar o seu desenho. Inclua um TEdit da aba Standard. Defina Name como edDado e delete o conteúdo da propriedade Text.
Coloque um TLabel para identificar o campo. Defina Caption como Dado a consultar.
Insira um TButton. Defina Name btnConsultar. Localize o componente TDBGrid na aba Data Controls. Insira um no form. Defina sua propriedade Name com dbgDados. Abra o editor de código e digite abaixo de Implementation:
uses u_dmdados;
Volte ao form e na propriedade DataSource da TDBGrid selecione dsConsCidade. Dê um duplo clique no botão btnConsultar e digite o código:
Analisando o código:
linha 39 - define que propriedades e métodos sem referência a um objeto são considerados como sendo de queConsCidade.
linha 41 - fecha a Query.
linha 42 - limpa o conteúdo da propriedade SQL.
linha 43 - verifica que campo foi selecionado no RadioGroup.
linhas 45 e 46 - definem um comando SELECT para buscar linhas na tabela pela chave primária. pIdCidade é um parâmetro definido na linha 46.
linhas 50 e 51 - definem um comando SELECT para buscar linhas na tabela por parte do nome da cidade.
linha 53 - abre a Query.
Mude para o form principal. No editor de código inclua a unit u_conscidade na linha uses abaixo de Implementation. Clique na opção Consultas -> Cidades. Digite o código:
frmConsCidade.Show;
Execute o programa e faça testes de consulta. Falta validar edDado para que aceite apenas dígitos numéricos quando a consulta for direcionada para o campo chave. Deixamos essa tarefa e a criação da consulta de clientes como um exercício.
Baixe aqui o código completo do programa.
Algumas considerações
Durante a criação dessa pequena aplicação encontramos dificuldade em achar relatos de experiências usando os componentes SQLdb. Já utilizamos outros componentes tanto em Lazarus quando no Delphi e sentimos algumas dificuldades principalmente no que diz respeito ao controle de transações. SQLdb só permite um objeto SQLTransaction na aplicação. Isso torna-se um obstáculo quando é necessário abrir mais de um form simultaneamente, pois quando fechamos uma transação todas as tabelas são fechadas. Outra dificuldade refere-se ao ponteiro TBookmark. Antes de encerrar uma transação guardamos o ponteiro do registro atual. Após encerrar a transação, quando o método GotoBookmark() é chamado para posicionar o registro no ponteiro salvo anteriormente ocorre uma exceção. Vale observar que chamar o GotoBookmark() antes de encerrar a transação funciona normalmente. Por esses motivos nos próximos artigos usaremos os componentes ZeosLib.
Marcadores:
Data Module,
SQLdb,
SQLite
Posts Relacionados
terça-feira, 23 de fevereiro de 2010
Lazarus - Acessando banco de dados com SQLdb - Parte I
Para fazer nossa primeira aplicação usando banco de dados no Lazarus vamos usar o SQLite e o conjunto de componentes nativo SQLdb. Inicialmente vamos apresentar passo como essa aplicação foi criada. Essa foi a maneira que eu fiz, e eu agradeço sugestões e questionamentos que pessoas que já passaram por essa experiência. Depois irei fazer algumas considerações sobre o uso do SQLdb.
SQLite
SQLite é uma biblioteca que implementa um motor de banco de dados SQL. É livre para qualquer finalidade, seja uso particular ou comercial. Lê e escreve em um único arquivo que pode ter além de tabelas, índices, gatilhos e visões. Executa em várias plataformas e é indicado para aplicações embarcadas. Maiores detalhes podem ser encontrados no site oficial. Para usá-lo, baixe-o do site e faça a instalação adequada para o seu sistema operacional. No Windows isso é muito simples, apenas copie sqlite3.dll para o system32 da pasta do sistema operacional.
Existe uma ferramenta de linha de comando chamada sqlite3 que podemos usar para criar o banco de dados e as tabelas. Pode ser baixada no próprio site oficial do SQLite. Depois de instaladas a dll e a ferramenta de criação do banco execute-a digitando o seguinte comando no console do sistema operacional:
sqlite3 banco.db
Se o banco já existir ele será aberto para operações como criar/alterar tabelas e consultar/inserir/atualizar/deletar dados nas tabelas existentes. Depois disso digite os comandos SQL para a criação de duas tabelas necessárias para nossa aplicação:
create table cidade (id_cidade integer primary key, nome varchar(30));
create table cliente (id_cliente integer primary key, nome varchar(40), endereco varchar(40), id_cidade integer, telefone varchar(14), tipo char(1), status boolean);
Feito isso digite .quit para sair e voltemos ao nosso IDE.
SQLdb
Esse é o pacote para acessar bancos de dados no Lazarus. Você o encontra na aba SQLdb. Algumas informações estão em http://wiki.freepascal.org/SQLdb_Package. Com esse pacote podemos conectar ao PostgreSQL, Oracle, MySQL, Firebird, SQLite e ODBC. Para cada um desses existe um componente TXXXConnection. Para conectar ao Firebird, por exemplo, existe o componente TIBConnection. Para executar as operações sobre tabelas temos o TSQLQuery e o TSQLTransaction. A seguir iremos criar a aplicação e mostraremos como utilizar esses componentes.
A aplicação exemplo
Vamos então iniciar o Lazarus e criar uma nova aplicação. No primeiro form crie um menu com a seguinte estrutura. Se for necessário leia o artigo sobre criação de menus em http://professorcarlos.blogspot.com/2010/01/lazarus-criando-menus.html:
Arquivo
Sair
Cadastros
Cidade
Cliente
Consultas
Cidade
Cliente
Mude a propriedade Name desse form para frmPrincipal. Mande salvar tudo. Escolha u_principal para nome da unit e Clientes para nome do projeto.
É fortemente aconselhado que os componentes de conexão e acesso ao banco de dados estejam agrupados em um repositório denominado DataModule. Para criar um DataModule no Lazarus selecione o menu Arquivo -> Novo. Selecione Data Module abaixo do grupo Módulo e pressione o botão OK. Mude a propriedade Name para dmDados, mande salvar e dê o nome u_dmdados para esta unit.
Agora selecione a aba de componentes SQLdb e coloque um TSQLite3Connection no DataModule. Na propriedade DatabaseName informe o nome do arquivo do banco de dados com o caminho. Mude a propriedade Name para dbCliente. Neste momento podemos mudar a propriedade Connected para True. Se nenhum erro acontecer o componente de conexão está corretamente configurado. Volte a propriedade Connected para False. Coloque um componente TSQLTransaction no DataModule. Na propriedade Database selecione dbCliente e em Name digite trGeral. Retorne ao SQLite3Connection e selecione trGeral na propriedade Transaction. TSQLTransaction é o componente que controla as transações no banco de dados. Em um banco de dados as operações ocorrem no contexto de uma transação. Uma transação finaliza com sucesso através de um COMMIT e ROLLBACK desfaz as operações realizadas anteriormente.
Selecione um TSQLQuery e coloque no DataModule. Na propriedade Database selecione dbCliente. Na propriedade Name digite queCidade e em SQL informe select * from cidade. Na propriedade Transaction defina trGeral. Agora localize a aba Data Access. Selecione um componente TDataSource e coloque no DataModule. Defina Name como dsCidade e em DataSet selecione queCidade. Resumindo, fizemos a conexão com o banco de dados usando SQLite3Connection, em seguida definimos um componente para controlar as transações, definimos uma conexão com uma tabela do banco usando TSQLQuery, e criamos uma ligação entre a tabela e os componentes que terão a função de ler os campos dessa tabela usando TDataSource. Esse é um procedimento repetitivo para novas tabelas nessa aplicação e mesmo quando usarmos outros conjuntos de componentes. O DataModule terá essa aparência, já com os componentes para acesso à tabela Cliente.
Repita os mesmos passos para a tabela Cliente, inserindo mais um TSQLQuery e um TDataSource. Selecione o form principal e, no editor de código, digite abaixo de Implementation:
Localize o evento OnShow na aba Eventos do Inspetor de objetos. Dê um duplo clique à direita e digite:
Assim, sempre que o programa for iniciado a conexão com o banco de dados será aberta.
Form de Cidade
Insira um novo form na aplicação. Ele será desenhado para fazer as atualizações na tabela Cidade. Defina o Name do form como frmCidade e o Caption como Cidades. Salve a unit e defina seu nome como u_cidade. O desenho deste form deve ter a seguinte aparência.
Antes de começar a desenhar a janela, acesse o código da unit e insira o seguinte código abaixo de Implementation:
uses u_dmdados;
Isso permite que esta unit acesse os objetos do DataModule.
Pegue um componente TPanel na aba Standard e coloque no form. Defina a propriedade Align como alTop. Exclua o conteúdo de Caption. As propriedades BevelInner e BevelOuter são usadas para definir contornos para o painel. Deixe, por exemplo, como bvLowered e bvRaised respectivamente.
Agora selecione um TDBNavigator na aba Data Controls e o coloque no form sobre o painel. Na propriedade DataSource do navegador selecione dsCidade.
Dessa mesma aba selecione TDBEdit e coloque dois deles no form. No primeiro defina Name como edIdCidade, em DataSource selecione dsCidade e em DataField digite ID_CIDADE. Essa última atribuição irá provocar um erro, mas isso não vai interferir no resultado. No segundo TDBEdit defina Name como edNome, DataSource como dsCidade e em DataField digite NOME. Selecione TLabel na aba Standard e coloque um à esquerda de cada TDBEdit para identificá-los. Defina suas propriedades Caption como ID e Nome, respectivamente. Para finalizar o desenho coloque um TSpeedButton da aba Additional sobre o painel. Defina Name como btnSair e escolha um ícone apropriado para ele usando a propriedade Glyph. No evento OnClick deste botão digite:
É necessário programar a abertura e o fechamento da Query no form. A abertura será programada no evento OnShow e o fechamento será programado no evento OnClose, ambos de form. Com o form selecionado selecione da aba Eventos no Inspetor de Objetos. Localize o evento OnShow, dê um duplo clique na caixa à direita e digite o seguinte:
Faça o mesmo para o evento OnClose e digite:
Agora precisamos programar a chamada do form frmCidade a partir no form principal. Selecione o form principal, mude para o editor de código e digite abaixo de Implementation:
Volte para o form e clique no menu Cadastros -> Cidades. No editor de código digite:
Se você compilar e executar o programa verificará que não consegue ainda inserir dados na tabela Cidade. Todos os dados que são inseridos ficam em cache. É necessário enviar os dados para o banco e finalizar a transação.
Isso será feito no evento AfterPost da Query. Este evento ocorre após um registro ser gravado no banco. Selecione o DataModule e em seguida queCidade. Clique na aba Eventos do Inspetor de Objetos. Localize o evento AfterPost, dê um duplo clique à direita dele e digite o seguinte:
Vamos esclarecer o código:
linha 42 - declara um TBookMark, que é um ponteiro para um registro.
linha 45 - try, juntamente com except consiste em um tratamento de exceção. Se algo falhar no bloco try, o código em except é executado.
linha 46 - guarda o ponteiro do registro atual.
linha 47 - envia para o banco de dados o que estiver no cache.
linha 48 - verifica se existe uma transação ativa.
linha 50 - executa um COMMIT no banco, mas mantém a transação aberta.
linha 51 - desvia para o ponteiro salvo na linha 46.
linha 54 - executa um ROLLBACK se algo sair errado no bloco try.
Localize o evento AfterDelete da Query. Clique no botão da caixa à direita para selecionar um método existente. Selecione queCidadeAfterPost. Assim reaproveitamos o código que executa a mesma operação necessária no AfterDelete.
Compile e execute o programa. No post seguinte daremos seguimento ao desenvolvimento dessa aplicação.
SQLite
SQLite é uma biblioteca que implementa um motor de banco de dados SQL. É livre para qualquer finalidade, seja uso particular ou comercial. Lê e escreve em um único arquivo que pode ter além de tabelas, índices, gatilhos e visões. Executa em várias plataformas e é indicado para aplicações embarcadas. Maiores detalhes podem ser encontrados no site oficial. Para usá-lo, baixe-o do site e faça a instalação adequada para o seu sistema operacional. No Windows isso é muito simples, apenas copie sqlite3.dll para o system32 da pasta do sistema operacional.
Existe uma ferramenta de linha de comando chamada sqlite3 que podemos usar para criar o banco de dados e as tabelas. Pode ser baixada no próprio site oficial do SQLite. Depois de instaladas a dll e a ferramenta de criação do banco execute-a digitando o seguinte comando no console do sistema operacional:
sqlite3 banco.db
Se o banco já existir ele será aberto para operações como criar/alterar tabelas e consultar/inserir/atualizar/deletar dados nas tabelas existentes. Depois disso digite os comandos SQL para a criação de duas tabelas necessárias para nossa aplicação:
create table cidade (id_cidade integer primary key, nome varchar(30));
create table cliente (id_cliente integer primary key, nome varchar(40), endereco varchar(40), id_cidade integer, telefone varchar(14), tipo char(1), status boolean);
Feito isso digite .quit para sair e voltemos ao nosso IDE.
SQLdb
Esse é o pacote para acessar bancos de dados no Lazarus. Você o encontra na aba SQLdb. Algumas informações estão em http://wiki.freepascal.org/SQLdb_Package. Com esse pacote podemos conectar ao PostgreSQL, Oracle, MySQL, Firebird, SQLite e ODBC. Para cada um desses existe um componente TXXXConnection. Para conectar ao Firebird, por exemplo, existe o componente TIBConnection. Para executar as operações sobre tabelas temos o TSQLQuery e o TSQLTransaction. A seguir iremos criar a aplicação e mostraremos como utilizar esses componentes.
A aplicação exemplo
Vamos então iniciar o Lazarus e criar uma nova aplicação. No primeiro form crie um menu com a seguinte estrutura. Se for necessário leia o artigo sobre criação de menus em http://professorcarlos.blogspot.com/2010/01/lazarus-criando-menus.html:
Arquivo
Sair
Cadastros
Cidade
Cliente
Consultas
Cidade
Cliente
Mude a propriedade Name desse form para frmPrincipal. Mande salvar tudo. Escolha u_principal para nome da unit e Clientes para nome do projeto.
É fortemente aconselhado que os componentes de conexão e acesso ao banco de dados estejam agrupados em um repositório denominado DataModule. Para criar um DataModule no Lazarus selecione o menu Arquivo -> Novo. Selecione Data Module abaixo do grupo Módulo e pressione o botão OK. Mude a propriedade Name para dmDados, mande salvar e dê o nome u_dmdados para esta unit.
Agora selecione a aba de componentes SQLdb e coloque um TSQLite3Connection no DataModule. Na propriedade DatabaseName informe o nome do arquivo do banco de dados com o caminho. Mude a propriedade Name para dbCliente. Neste momento podemos mudar a propriedade Connected para True. Se nenhum erro acontecer o componente de conexão está corretamente configurado. Volte a propriedade Connected para False. Coloque um componente TSQLTransaction no DataModule. Na propriedade Database selecione dbCliente e em Name digite trGeral. Retorne ao SQLite3Connection e selecione trGeral na propriedade Transaction. TSQLTransaction é o componente que controla as transações no banco de dados. Em um banco de dados as operações ocorrem no contexto de uma transação. Uma transação finaliza com sucesso através de um COMMIT e ROLLBACK desfaz as operações realizadas anteriormente.
Selecione um TSQLQuery e coloque no DataModule. Na propriedade Database selecione dbCliente. Na propriedade Name digite queCidade e em SQL informe select * from cidade. Na propriedade Transaction defina trGeral. Agora localize a aba Data Access. Selecione um componente TDataSource e coloque no DataModule. Defina Name como dsCidade e em DataSet selecione queCidade. Resumindo, fizemos a conexão com o banco de dados usando SQLite3Connection, em seguida definimos um componente para controlar as transações, definimos uma conexão com uma tabela do banco usando TSQLQuery, e criamos uma ligação entre a tabela e os componentes que terão a função de ler os campos dessa tabela usando TDataSource. Esse é um procedimento repetitivo para novas tabelas nessa aplicação e mesmo quando usarmos outros conjuntos de componentes. O DataModule terá essa aparência, já com os componentes para acesso à tabela Cliente.
Repita os mesmos passos para a tabela Cliente, inserindo mais um TSQLQuery e um TDataSource. Selecione o form principal e, no editor de código, digite abaixo de Implementation:
uses u_dmdados;
Localize o evento OnShow na aba Eventos do Inspetor de objetos. Dê um duplo clique à direita e digite:
dmDados.dbCliente.Open;
Assim, sempre que o programa for iniciado a conexão com o banco de dados será aberta.
Form de Cidade
Insira um novo form na aplicação. Ele será desenhado para fazer as atualizações na tabela Cidade. Defina o Name do form como frmCidade e o Caption como Cidades. Salve a unit e defina seu nome como u_cidade. O desenho deste form deve ter a seguinte aparência.
Antes de começar a desenhar a janela, acesse o código da unit e insira o seguinte código abaixo de Implementation:
uses u_dmdados;
Isso permite que esta unit acesse os objetos do DataModule.
Pegue um componente TPanel na aba Standard e coloque no form. Defina a propriedade Align como alTop. Exclua o conteúdo de Caption. As propriedades BevelInner e BevelOuter são usadas para definir contornos para o painel. Deixe, por exemplo, como bvLowered e bvRaised respectivamente.
Agora selecione um TDBNavigator na aba Data Controls e o coloque no form sobre o painel. Na propriedade DataSource do navegador selecione dsCidade.
Dessa mesma aba selecione TDBEdit e coloque dois deles no form. No primeiro defina Name como edIdCidade, em DataSource selecione dsCidade e em DataField digite ID_CIDADE. Essa última atribuição irá provocar um erro, mas isso não vai interferir no resultado. No segundo TDBEdit defina Name como edNome, DataSource como dsCidade e em DataField digite NOME. Selecione TLabel na aba Standard e coloque um à esquerda de cada TDBEdit para identificá-los. Defina suas propriedades Caption como ID e Nome, respectivamente. Para finalizar o desenho coloque um TSpeedButton da aba Additional sobre o painel. Defina Name como btnSair e escolha um ícone apropriado para ele usando a propriedade Glyph. No evento OnClick deste botão digite:
Close;
É necessário programar a abertura e o fechamento da Query no form. A abertura será programada no evento OnShow e o fechamento será programado no evento OnClose, ambos de form. Com o form selecionado selecione da aba Eventos no Inspetor de Objetos. Localize o evento OnShow, dê um duplo clique na caixa à direita e digite o seguinte:
dmDados.queCidade.Open;
Faça o mesmo para o evento OnClose e digite:
dmDados.queCidade.Close;
Agora precisamos programar a chamada do form frmCidade a partir no form principal. Selecione o form principal, mude para o editor de código e digite abaixo de Implementation:
uses u_cidade;
Volte para o form e clique no menu Cadastros -> Cidades. No editor de código digite:
frmCidade.Show;
Se você compilar e executar o programa verificará que não consegue ainda inserir dados na tabela Cidade. Todos os dados que são inseridos ficam em cache. É necessário enviar os dados para o banco e finalizar a transação.
Isso será feito no evento AfterPost da Query. Este evento ocorre após um registro ser gravado no banco. Selecione o DataModule e em seguida queCidade. Clique na aba Eventos do Inspetor de Objetos. Localize o evento AfterPost, dê um duplo clique à direita dele e digite o seguinte:
Vamos esclarecer o código:
linha 42 - declara um TBookMark, que é um ponteiro para um registro.
linha 45 - try, juntamente com except consiste em um tratamento de exceção. Se algo falhar no bloco try, o código em except é executado.
linha 46 - guarda o ponteiro do registro atual.
linha 47 - envia para o banco de dados o que estiver no cache.
linha 48 - verifica se existe uma transação ativa.
linha 50 - executa um COMMIT no banco, mas mantém a transação aberta.
linha 51 - desvia para o ponteiro salvo na linha 46.
linha 54 - executa um ROLLBACK se algo sair errado no bloco try.
Localize o evento AfterDelete da Query. Clique no botão da caixa à direita para selecionar um método existente. Selecione queCidadeAfterPost. Assim reaproveitamos o código que executa a mesma operação necessária no AfterDelete.
Compile e execute o programa. No post seguinte daremos seguimento ao desenvolvimento dessa aplicação.
Marcadores:
Data Module,
SQLdb,
SQLite
Posts Relacionados
segunda-feira, 15 de fevereiro de 2010
Aventurando-se no Linux - VirtualBox
Sou um remanescente do bom e velho sistema operacional (SO) MS-DOS. Tudo era feito através de linha de comando semelhante ao que é feito no Linux, mas devo confessar que a cada vez que eu vejo os procedimentos para instalar um programa no Linux eu fico cansado e desisto até de continuar lendo o tutorial. Eu uso o Windows, mesmo com todos os problemas, devido a facilidade com que eu consigo instalar um programa. É só clicar em Instalar, Próximo, Próximo ... e Finalizar. Para um sujeito preguiçoso como eu não tem coisa melhor.
Bem, o que eu queria mesmo era utilizar os recursos do Cross Compiler do Lazarus. Recurso muito interessante que permite que você gere um executável para Windows a partir de uma instalação Linux, por exemplo. Em tese é possível gerar para qualquer sistema estando em qualquer um outro. Gostaria de pode criar executáveis Linux estando no Windows, mas não encontrei informação clara que me ajudasse. Em http://wiki.freepascal.org/Cross_compiling/pt#De_Windows existe algo um pouco confuso, e não tentei nada seguindo essas informações. Decidi então encarar uma instalação Ubuntu e depois o Lazarus. Para poder continuar usando o Windows e alternar entre um e outro SO, eu optei por instalar um software de virtualização. Após alguma pesquisa me decidi pela VirtualBox da Sun, que hoje é Oracle. Distribuida sob licença GPL, roda em Windows, Linux, Macintosh e OpenSolaris. Depois de instalar o VirtualBox, criei uma máquina virtual (VM). Podemos criar mais de uma e instalar vários SOs num mesmo micro. Em seguida instalei o Ubuntu a partir de um CD. Não é necessário instalar nenhum driver, o que é um alívio. Quando você instala a VM, ela instala um cartão de rede virtual e seleciona o modo NAT (Network Address Translation). Dessa forma o sistema guest (Linux no meu caso) pode acessar a Internet através de uma conexão do sistema host (Windows no meu caso). Instalei o VirtualBox Guest Additions. Isso possibilita alguma melhoria em vídeo, pastas compartilhadas entre host e guest, etc. Bem, até agora não consegui compartilhar uma pasta entre os dois SOs. Vejam na figura abaixo a VM executando na área de trabalho do Windows.
Agora eu já tinha um Linux rodando e precisava instalar o Lazarus. Não foi difícil encontrar dicas de como fazer isso. Em http://sites.google.com/site/silvioprogbs/documentos tem algumas coisas interessantes. Até que não deu muito trabalho. E dá-lhe baixar pacotes e mais pacotes dos quais o Lazarus e o FreePascal dependem para rodar. Confesso que fiquei bem animado quando terminou tudo, executei o Lazarus e ele compilou e executou um programinha simples. Bem, dai eu fui para um teste mais rigoroso. Copiei o programa Editor que criei nos posts anteriores para dentro da VM, abri o Lazarus e o compilei. Executou sem problema. Vejam ai a tela do programa rodando na VM.
Este post não é um tutorial de como instalar uma VM, dada a sua simplicidade. É mais para compartilhar minha experiência. No entanto se alguém se interessar pelo assunto gostaria de trocar idéias. Preciso compartilhar uma pasta entre os dois SOs e ainda não consegui e, claro, explorar mais recursos disponíveis.
Bem, o que eu queria mesmo era utilizar os recursos do Cross Compiler do Lazarus. Recurso muito interessante que permite que você gere um executável para Windows a partir de uma instalação Linux, por exemplo. Em tese é possível gerar para qualquer sistema estando em qualquer um outro. Gostaria de pode criar executáveis Linux estando no Windows, mas não encontrei informação clara que me ajudasse. Em http://wiki.freepascal.org/Cross_compiling/pt#De_Windows existe algo um pouco confuso, e não tentei nada seguindo essas informações. Decidi então encarar uma instalação Ubuntu e depois o Lazarus. Para poder continuar usando o Windows e alternar entre um e outro SO, eu optei por instalar um software de virtualização. Após alguma pesquisa me decidi pela VirtualBox da Sun, que hoje é Oracle. Distribuida sob licença GPL, roda em Windows, Linux, Macintosh e OpenSolaris. Depois de instalar o VirtualBox, criei uma máquina virtual (VM). Podemos criar mais de uma e instalar vários SOs num mesmo micro. Em seguida instalei o Ubuntu a partir de um CD. Não é necessário instalar nenhum driver, o que é um alívio. Quando você instala a VM, ela instala um cartão de rede virtual e seleciona o modo NAT (Network Address Translation). Dessa forma o sistema guest (Linux no meu caso) pode acessar a Internet através de uma conexão do sistema host (Windows no meu caso). Instalei o VirtualBox Guest Additions. Isso possibilita alguma melhoria em vídeo, pastas compartilhadas entre host e guest, etc. Bem, até agora não consegui compartilhar uma pasta entre os dois SOs. Vejam na figura abaixo a VM executando na área de trabalho do Windows.
Agora eu já tinha um Linux rodando e precisava instalar o Lazarus. Não foi difícil encontrar dicas de como fazer isso. Em http://sites.google.com/site/silvioprogbs/documentos tem algumas coisas interessantes. Até que não deu muito trabalho. E dá-lhe baixar pacotes e mais pacotes dos quais o Lazarus e o FreePascal dependem para rodar. Confesso que fiquei bem animado quando terminou tudo, executei o Lazarus e ele compilou e executou um programinha simples. Bem, dai eu fui para um teste mais rigoroso. Copiei o programa Editor que criei nos posts anteriores para dentro da VM, abri o Lazarus e o compilei. Executou sem problema. Vejam ai a tela do programa rodando na VM.
Este post não é um tutorial de como instalar uma VM, dada a sua simplicidade. É mais para compartilhar minha experiência. No entanto se alguém se interessar pelo assunto gostaria de trocar idéias. Preciso compartilhar uma pasta entre os dois SOs e ainda não consegui e, claro, explorar mais recursos disponíveis.
Marcadores:
Linux,
VirtualBox,
virtualização
Posts Relacionados
terça-feira, 2 de fevereiro de 2010
Lazarus - Barras de ferramentas e de status
Vamos continuar usando a aplicação criada no post anterior. Agora vamos acrescentar uma barra de ferramentas e de status e mostrar também como implementar menus locais, chamados de pop-ups.
Barra de Ferramentas
Selecione a aba Common Controls na paleta de componentes. Pegue um TToolBar e coloque no form. Não precisa se preocupar com a posição, o Lazarus sabe exatamente onde fica uma barra de ferramentas e já a posiciona corretamente. Vamos dar o nome (Name) de tbaPrincipal ao componente. Nossa ToolBar terá botões para alterar as cores e o alinhamento do texto. Exatamente as mesmas opções do menu. Para inserir os botões, clique com o botão direito e selecione New Button. Insira dois botões. Em seguida insira um separador, selecionando New Separator. Após isso insira mais três botões.
ImageList
Para definir imagens para os botões devemos usar o componente TImageList. Pegue um desses na própria aba Common Controls e dê a ele o nome imlPrincipal. Depois de por no form - em qualquer posição - clique com o botão direito nele e selecione Editor "Image List". Clique no botão adicionar e selecione um ícone apropriado para cada botão. Depois disso selecione o ToolBar, vá na propriedade Images e selecione imlPrincipal. Clique então em cada botão e defina na propriedade ImageIndex qual o índice do ícone que você deseja para ele. O índice do primeiro botão do ImageList é 0. Nosso form deve estar com a aparência da figura abaixo, dependendo claro dos ícones que você escolheu para os botões.
Vamos então programar os eventos OnClick de cada botão. Neste caso iremos simplesmente reutilizar os códigos dos eventos OnClick das opções de menu correspondentes. Para fazer isso clique no primeiro botão e no Inspetor de Objetos selecione a aba Eventos. Em vez de dar um duplo clique no evento, apenas clique na caixa e localize o procedimento mnuCorTextoClick. Selecione-o. Pronto, agora a opção de menu Cor do Texto de o botão da barra de ferramentas têm o mesmo código no evento OnClick. Repita o procedimento para os demais botões.
Observe que no menu foi criada uma opção Visualizar -> Barra de ferramentas. Essa opção permitirá visualizar/ocultar a ToolBar. Dê um clique nessa opção para abrir o editor de código no procedimento OnClick e escreva:
tbaPrincipal.Visible := not tbaPrincipal.Visible;
mnuBarraFerramentas.Checked := tbaPrincipal.Visible;
Dê um duplo clique no MainMenu e selecione Barra de ferramentas. Localize a propriedade Checked e mude-a para True. Como sempre que abrimos o programa a ToolBar está visível, então deixamos a opção de menu marcada. Note que a opção Visualizar -> Barra de ferramentas funciona como um CheckBox.
Barra de Status
A barra de status é usada para apresentar inúmeras informações ao usuário. Pode mostrar mensagens, a data e hora atuais, dicas, etc. O Lazarus possui um componente para essa finalidade. Na paleta de componentes vá até a aba Common Controls, selecione o componente TStatusBar e o insira na nossa aplicação. Não importa onde você insere o StatusBar, o Lazarus sempre o posiciona na base da janela. Mude a propriedade Name do componente para stbPrincipal.
Uma barra de status pode ter vários painéis que agrupam informações relacionadas. Vamos dividir esta barra em dois painéis. Clique no botão elipse ao lado direito da propriedade Panels. Isso irá abrir o editor de painéis. Adicione dois painéis pressionando o botão Adicionar na parte superior do editor.
O Lazarus guarda as informações sobre os painéis do StatusBar em um array. O primeiro painel é chamado stbPrincipal.Panels[0] e o segundo stbPrincipal.Panels[1]. Cada painel é um objeto do tipo TStatusPanel. Portanto possui propriedades e métodos. Mantenha o editor de painéis aberto. Clique no primeiro painel e digite Desenvolvido por João da Silva. Altere a propriedade Width para um valor conveniente, 300 por exemplo.
No segundo painel mostraremos a hora atual. Esta informação deve ser mostrada de forma dinâmica. Para isso será usado o componente TTimer que se encontra na aba System. Esse componente tem um evento chamado OnTimer que ocorre em intervalos de tempo que são definidos pela propriedade Interval. Por padrão o intervalo é de 1000 milissegundos. Coloque esse componente em qualquer posição no form e altere a propriedade Name para timHora. Deixamos Interval como está pois o evento ocorrerá exatamente a cada segundo.
Selecione a aba Eventos e dê um duplo clique o evento OnTimer. Escreva o seguinte código:
stbPrincipal.Panels[1].Text := TimeToStr(Time);
Esse código converte para string a hora atual devolvida por Time e a atribui à propriedade Text do segundo painel. Lembre que esse código é executado a cada segundo, mantendo a hora no painel sempre atualizada.
Menu local
Nas aplicações Windows é comum haver menus locais ativados com um clique no botão direito do mouse. O menu que é mostrado geralmente depende do local onde o mouse é clicado. Esses menus agrupam opções relacionadas com o elemento da interface que está selecionado. São mais rápidos que o menu estudado anteriormente porque não necessita que o mouse seja movimentado para ativá-lo.
Para adicionar um menu local a um form, selecione o componente TPopupMenu na aba Standard e o insira no form em qualquer posição. Altere a propriedade Name para popAlinhamento. Dê um duplo clique no componente e insira as opções: Esquerda, Centro e Direita. A maneira de inserira as opções é semelhante ao que fizemos para o MainMenu. Ou seja, queremos um menu local com as mesmas opções referentes ao alinhamento do texto do MainMenu que criamos.
Ainda com o editor de menus aberto, clique na opção Esquerda. Selecione a aba Eventos e no evento OnClick selecione o procedimento mnuEsquerdaClick. Proceda de forma semelhante para as outras duas opções. Ou seja, reutilize o código, visto que é exatamente o mesmo.
Selecione o Memo e na propriedade PopupMenu selecione popAlinhamento. Esta é a maneira de associar o menu local a um componente. Execute o programa, teste todas as funcionalidades implementadas.
A partir do próximo artigo falaremos de aplicações de banco de dados usando o Lazarus. Até lá.
Barra de Ferramentas
Selecione a aba Common Controls na paleta de componentes. Pegue um TToolBar e coloque no form. Não precisa se preocupar com a posição, o Lazarus sabe exatamente onde fica uma barra de ferramentas e já a posiciona corretamente. Vamos dar o nome (Name) de tbaPrincipal ao componente. Nossa ToolBar terá botões para alterar as cores e o alinhamento do texto. Exatamente as mesmas opções do menu. Para inserir os botões, clique com o botão direito e selecione New Button. Insira dois botões. Em seguida insira um separador, selecionando New Separator. Após isso insira mais três botões.
ImageList
Para definir imagens para os botões devemos usar o componente TImageList. Pegue um desses na própria aba Common Controls e dê a ele o nome imlPrincipal. Depois de por no form - em qualquer posição - clique com o botão direito nele e selecione Editor "Image List". Clique no botão adicionar e selecione um ícone apropriado para cada botão. Depois disso selecione o ToolBar, vá na propriedade Images e selecione imlPrincipal. Clique então em cada botão e defina na propriedade ImageIndex qual o índice do ícone que você deseja para ele. O índice do primeiro botão do ImageList é 0. Nosso form deve estar com a aparência da figura abaixo, dependendo claro dos ícones que você escolheu para os botões.
Observe que no menu foi criada uma opção Visualizar -> Barra de ferramentas. Essa opção permitirá visualizar/ocultar a ToolBar. Dê um clique nessa opção para abrir o editor de código no procedimento OnClick e escreva:
tbaPrincipal.Visible := not tbaPrincipal.Visible;
mnuBarraFerramentas.Checked := tbaPrincipal.Visible;
Dê um duplo clique no MainMenu e selecione Barra de ferramentas. Localize a propriedade Checked e mude-a para True. Como sempre que abrimos o programa a ToolBar está visível, então deixamos a opção de menu marcada. Note que a opção Visualizar -> Barra de ferramentas funciona como um CheckBox.
Barra de Status
A barra de status é usada para apresentar inúmeras informações ao usuário. Pode mostrar mensagens, a data e hora atuais, dicas, etc. O Lazarus possui um componente para essa finalidade. Na paleta de componentes vá até a aba Common Controls, selecione o componente TStatusBar e o insira na nossa aplicação. Não importa onde você insere o StatusBar, o Lazarus sempre o posiciona na base da janela. Mude a propriedade Name do componente para stbPrincipal.
Uma barra de status pode ter vários painéis que agrupam informações relacionadas. Vamos dividir esta barra em dois painéis. Clique no botão elipse ao lado direito da propriedade Panels. Isso irá abrir o editor de painéis. Adicione dois painéis pressionando o botão Adicionar na parte superior do editor.
O Lazarus guarda as informações sobre os painéis do StatusBar em um array. O primeiro painel é chamado stbPrincipal.Panels[0] e o segundo stbPrincipal.Panels[1]. Cada painel é um objeto do tipo TStatusPanel. Portanto possui propriedades e métodos. Mantenha o editor de painéis aberto. Clique no primeiro painel e digite Desenvolvido por João da Silva. Altere a propriedade Width para um valor conveniente, 300 por exemplo.
No segundo painel mostraremos a hora atual. Esta informação deve ser mostrada de forma dinâmica. Para isso será usado o componente TTimer que se encontra na aba System. Esse componente tem um evento chamado OnTimer que ocorre em intervalos de tempo que são definidos pela propriedade Interval. Por padrão o intervalo é de 1000 milissegundos. Coloque esse componente em qualquer posição no form e altere a propriedade Name para timHora. Deixamos Interval como está pois o evento ocorrerá exatamente a cada segundo.
Selecione a aba Eventos e dê um duplo clique o evento OnTimer. Escreva o seguinte código:
stbPrincipal.Panels[1].Text := TimeToStr(Time);
Esse código converte para string a hora atual devolvida por Time e a atribui à propriedade Text do segundo painel. Lembre que esse código é executado a cada segundo, mantendo a hora no painel sempre atualizada.
Menu local
Nas aplicações Windows é comum haver menus locais ativados com um clique no botão direito do mouse. O menu que é mostrado geralmente depende do local onde o mouse é clicado. Esses menus agrupam opções relacionadas com o elemento da interface que está selecionado. São mais rápidos que o menu estudado anteriormente porque não necessita que o mouse seja movimentado para ativá-lo.
Para adicionar um menu local a um form, selecione o componente TPopupMenu na aba Standard e o insira no form em qualquer posição. Altere a propriedade Name para popAlinhamento. Dê um duplo clique no componente e insira as opções: Esquerda, Centro e Direita. A maneira de inserira as opções é semelhante ao que fizemos para o MainMenu. Ou seja, queremos um menu local com as mesmas opções referentes ao alinhamento do texto do MainMenu que criamos.
Ainda com o editor de menus aberto, clique na opção Esquerda. Selecione a aba Eventos e no evento OnClick selecione o procedimento mnuEsquerdaClick. Proceda de forma semelhante para as outras duas opções. Ou seja, reutilize o código, visto que é exatamente o mesmo.
Selecione o Memo e na propriedade PopupMenu selecione popAlinhamento. Esta é a maneira de associar o menu local a um componente. Execute o programa, teste todas as funcionalidades implementadas.
A partir do próximo artigo falaremos de aplicações de banco de dados usando o Lazarus. Até lá.
Posts Relacionados
domingo, 24 de janeiro de 2010
Lazarus - Criando menus
Aplicação exemplo
Para exemplificarmos a construção de menus vamos criar uma nova aplicação. Nossa aplicação será um editor de textos usando o componente TMemo. Após iniciar a nova aplicação defina a propriedade Name do form como frmEditor, o Caption como Editor e salve tudo atribuindo à unit o nome u_editor e ao projeto o nome Editor.
Selecione um componente Memo na aba Standard e insira-o no form. Defina a propriedade Name como mmEditor. Na propriedade Align selecione alClient, dessa forma o Memo ocupará toda a área do form. Acesse a propriedade Lines e exclua a linha que lá aparece. Na propriedade ScrollBars selecione ssAutoVertical. Assim, quando for digitado um texto maior do que o pode caber no Memo, a barra de rolagem vertical irá aparecer automaticamente.
O Editor de Menus
Vamos criar um menu com a seguinte estrutura:
Arquivo
Sair
Visualizar
Barra de ferramentas
Opções
Cor do texto
Cor do fundo
Alinhamento
Esquerda
Centro
Direita
Ajuda
Sobre
Para utilizar o Editor de Menus do Lazarus precisamos de um componente TMainMenu. Selecione esse componente na aba Standard e o insira no form em qualquer posição. O Lazarus se encarrega de posicionar
o menu no lugar correto, abaixo da barra de título.
Para abrir o editor dê um duplo clique no MainMenu. Na propriedade Caption digite &Arquivo e na propriedade Name digite mnuArquivo. Isso define o primeiro item de menu. Clique com o botão direito no item recém-criado. Em seguida clique em Inserir novo item (depois), digite &Visualizar no Caption e mnuVisualizar em Name. Repita esses passos para os itens &Opções e A&juda. Agora clique com o botão direito no item Arquivo e clique em Criar Submenu. Digite Sai&r no Caption, e mnuSair em Name. Faça o mesmo nos itens seguintes. Quando quiser incluir novo item use a opção Inserir novo item (depois) ou Inserir novo item (antes). Clique com o botão direito em Alinhamento e escolha Criar Submenu. Inclua os itens conforme descrito na estrutura do menu acima. Seu form deve estar com esta aparência:
Teclas de atalho e hotkeys
Uma característica dos itens de menu é que eles podem conter uma letra sublinhada, chamada hotkey. Esta letra é usada para selecionar o menu usando o teclado. Pressionando ALT mais a letra sublinhada seleciona-se o menu. Pressionando outra letra sublinhada envia-se o comando. As letras sublinhadas de cada item dentro de um submenu devem ser diferentes. Observe que durante a criação do nosso menu, definimos as letras sublinhadas inserindo um & antes da letra.
Outra característica padrão dos menus são as teclas de atalho. Quando aparece uma combinação de teclas no lado direito do item de menu, significa que você pode usar essa combinação para executar o comando. Essa característica oferece a maneira mais rápida de executar um comando.
Para associar teclas de atalho a um item de menu é muito fácil. No Editor de Menus simplesmente escolha uma combinação de teclas na propriedade ShortCut do item. Vamos fazer isso para as opções: Esquerda, Centro e Direita do item de menu Alinhamento. Selecione a opção Esquerda e na propriedade ShortCut selecione a combinação CTRL + E. Para a opção Centro selecione CTRL + C e para a opção Direita selecione CTRL + D. Veja a figura abaixo:
Respondendo aos comandos do menu
Vamos inserir o componente TColorDialog da aba Dialogs na nossa aplicação. Esse componente é uma janela onde podemos selecionar um cor. Mude a propriedade Name desse componente para dlgCores. Usaremos esse componente para mudar as cores do texto e do fundo do nosso editor. Dessa forma quando selecionarmos a opção Cor do texto ou Cor do fundo no menu Opções, a caixa de diálogo de cores será aberta e poderemos selecionar uma nova cor. Clique então em Cor do texto. O editor de código será aberto no método do evento OnClick dessa opção e digite o seguinte código:
dlgCores.Color := mmEditor.Font.Color;
if dlgCores.Execute then
mmEditor.Font.Color := dlgCores.Color;
A primeira linha do código define que a cor selecionada no ColorDialog será a mesma do texto do Memo. Na linha seguinte definine-se que, se o usuário clicar OK no ColorDialog, a cor selecionada será atribuída à propriedade Color de Font do Memo. Compile e execute o programa. Digite um texto e mude sua cor usando a opção Cor do texto.
dlgCores.Color := mmEditor.Color;
if dlgCores.Execute then
mmEditor.Color := dlgCores.Color;
Este código é semelhante ao código de Cor do texto, mas neste caso mudamos a propriedade Color do Memo, que significa mudar a cor do fundo.
No grupo de Alinhamento, usaremos as opções para alinhar o texto à esquerda, à direita ou centralizar. Além disso queremos que a opção de menu que estiver selecionada fique marcada. Clique então na opção Esquerda. Digite o seguinte código no método que foi aberto:
A primeira linha define o alinhamento do texto no Memo. As três linhas seguintes definem qual opção de menu está selecionada. Vamos definir o código para OnClick de Centro:
E para o evento OnClick de Direita:
Chamadas a forms
Com certeza suas aplicações sempre terão muitos forms. Existe um form principal (main) que faz chamadas a outros forms. A maneira de fazer chamadas a outros forms será estudada agora. Vamos criar um novo form na nossa aplicação. Esta nova janela será o nosso Sobre (About). Para incluir um novo form selecione no menu Arquivo -> Novo formulário. Ou utilize o botão correspondente na barra de ferramentas. Neste novo form defina Caption como Sobre. Na propriedade Name informe frmSobre. Salve-o e escolha u_sobre para nome da unit. Você é livre para criar o Sobre da maneira que preferir. Mas no nosso exemplo vamos inserir um rótulo (TLabel) onde definimos o Caption como Programa desenvolvido por Carlos Araújo apenas para fins didáticos. Deixe a propriedade Width como 220 e WordWrap como True. A propriedade WordWrap define se o Caption permite quebra de linha. Inclua mais um rótulo e defina o Caption como Versão 1.0. Inclua um botão do tipo TBitBtn da paleta Additional e defina Name como btnFechar e Kind como bkClose.
Agora selecione o evento OnClick do comando Ajuda -> Sobre e digite o seguinte código:
Selecione o evento OnClick do comando Arquivo -> Sair e digite Close no editor. Execute o programa e clique em Ajuda -> Sobre. Observe que você não pode fazer nada no programa sem que o form Sobre seja fechado. Confirme o funcionamento correto das outras opções do menu. Digite um texto no Memo e teste alterações de cores e alinhamento.
No próximo post mostraremos como criar barras de ferramentas, de status e menus locais (pop-ups).
Para exemplificarmos a construção de menus vamos criar uma nova aplicação. Nossa aplicação será um editor de textos usando o componente TMemo. Após iniciar a nova aplicação defina a propriedade Name do form como frmEditor, o Caption como Editor e salve tudo atribuindo à unit o nome u_editor e ao projeto o nome Editor.
Selecione um componente Memo na aba Standard e insira-o no form. Defina a propriedade Name como mmEditor. Na propriedade Align selecione alClient, dessa forma o Memo ocupará toda a área do form. Acesse a propriedade Lines e exclua a linha que lá aparece. Na propriedade ScrollBars selecione ssAutoVertical. Assim, quando for digitado um texto maior do que o pode caber no Memo, a barra de rolagem vertical irá aparecer automaticamente.
O Editor de Menus
Vamos criar um menu com a seguinte estrutura:
Arquivo
Sair
Visualizar
Barra de ferramentas
Opções
Cor do texto
Cor do fundo
Alinhamento
Esquerda
Centro
Direita
Ajuda
Sobre
Para utilizar o Editor de Menus do Lazarus precisamos de um componente TMainMenu. Selecione esse componente na aba Standard e o insira no form em qualquer posição. O Lazarus se encarrega de posicionar
o menu no lugar correto, abaixo da barra de título.
Para abrir o editor dê um duplo clique no MainMenu. Na propriedade Caption digite &Arquivo e na propriedade Name digite mnuArquivo. Isso define o primeiro item de menu. Clique com o botão direito no item recém-criado. Em seguida clique em Inserir novo item (depois), digite &Visualizar no Caption e mnuVisualizar em Name. Repita esses passos para os itens &Opções e A&juda. Agora clique com o botão direito no item Arquivo e clique em Criar Submenu. Digite Sai&r no Caption, e mnuSair em Name. Faça o mesmo nos itens seguintes. Quando quiser incluir novo item use a opção Inserir novo item (depois) ou Inserir novo item (antes). Clique com o botão direito em Alinhamento e escolha Criar Submenu. Inclua os itens conforme descrito na estrutura do menu acima. Seu form deve estar com esta aparência:
Uma característica dos itens de menu é que eles podem conter uma letra sublinhada, chamada hotkey. Esta letra é usada para selecionar o menu usando o teclado. Pressionando ALT mais a letra sublinhada seleciona-se o menu. Pressionando outra letra sublinhada envia-se o comando. As letras sublinhadas de cada item dentro de um submenu devem ser diferentes. Observe que durante a criação do nosso menu, definimos as letras sublinhadas inserindo um & antes da letra.
Outra característica padrão dos menus são as teclas de atalho. Quando aparece uma combinação de teclas no lado direito do item de menu, significa que você pode usar essa combinação para executar o comando. Essa característica oferece a maneira mais rápida de executar um comando.
Para associar teclas de atalho a um item de menu é muito fácil. No Editor de Menus simplesmente escolha uma combinação de teclas na propriedade ShortCut do item. Vamos fazer isso para as opções: Esquerda, Centro e Direita do item de menu Alinhamento. Selecione a opção Esquerda e na propriedade ShortCut selecione a combinação CTRL + E. Para a opção Centro selecione CTRL + C e para a opção Direita selecione CTRL + D. Veja a figura abaixo:
Respondendo aos comandos do menu
Vamos inserir o componente TColorDialog da aba Dialogs na nossa aplicação. Esse componente é uma janela onde podemos selecionar um cor. Mude a propriedade Name desse componente para dlgCores. Usaremos esse componente para mudar as cores do texto e do fundo do nosso editor. Dessa forma quando selecionarmos a opção Cor do texto ou Cor do fundo no menu Opções, a caixa de diálogo de cores será aberta e poderemos selecionar uma nova cor. Clique então em Cor do texto. O editor de código será aberto no método do evento OnClick dessa opção e digite o seguinte código:
dlgCores.Color := mmEditor.Font.Color;
if dlgCores.Execute then
mmEditor.Font.Color := dlgCores.Color;
A primeira linha do código define que a cor selecionada no ColorDialog será a mesma do texto do Memo. Na linha seguinte definine-se que, se o usuário clicar OK no ColorDialog, a cor selecionada será atribuída à propriedade Color de Font do Memo. Compile e execute o programa. Digite um texto e mude sua cor usando a opção Cor do texto.
No evento OnClick da opção Cor do fundo digite o seguinte código:
if dlgCores.Execute then
mmEditor.Color := dlgCores.Color;
Este código é semelhante ao código de Cor do texto, mas neste caso mudamos a propriedade Color do Memo, que significa mudar a cor do fundo.
No grupo de Alinhamento, usaremos as opções para alinhar o texto à esquerda, à direita ou centralizar. Além disso queremos que a opção de menu que estiver selecionada fique marcada. Clique então na opção Esquerda. Digite o seguinte código no método que foi aberto:
mmEditor.Alignment := taLeftJustify;
mnuEsquerda.Checked := True;
mnuCentro.Checked := False;
mnuDireita.Checked := False;
mnuEsquerda.Checked := True;
mnuCentro.Checked := False;
mnuDireita.Checked := False;
A primeira linha define o alinhamento do texto no Memo. As três linhas seguintes definem qual opção de menu está selecionada. Vamos definir o código para OnClick de Centro:
mmEditor.Alignment := taCenter;
mnuEsquerda.Checked := False;
mnuCentro.Checked := True;
mnuDireita.Checked := False;
mnuEsquerda.Checked := False;
mnuCentro.Checked := True;
mnuDireita.Checked := False;
E para o evento OnClick de Direita:
mmEditor.Alignment := taRightJustify;
mnuEsquerda.Checked := False;
mnuCentro.Checked := False;
mnuDireita.Checked := True;
mnuEsquerda.Checked := False;
mnuCentro.Checked := False;
mnuDireita.Checked := True;
Chamadas a forms
Com certeza suas aplicações sempre terão muitos forms. Existe um form principal (main) que faz chamadas a outros forms. A maneira de fazer chamadas a outros forms será estudada agora. Vamos criar um novo form na nossa aplicação. Esta nova janela será o nosso Sobre (About). Para incluir um novo form selecione no menu Arquivo -> Novo formulário. Ou utilize o botão correspondente na barra de ferramentas. Neste novo form defina Caption como Sobre. Na propriedade Name informe frmSobre. Salve-o e escolha u_sobre para nome da unit. Você é livre para criar o Sobre da maneira que preferir. Mas no nosso exemplo vamos inserir um rótulo (TLabel) onde definimos o Caption como Programa desenvolvido por Carlos Araújo apenas para fins didáticos. Deixe a propriedade Width como 220 e WordWrap como True. A propriedade WordWrap define se o Caption permite quebra de linha. Inclua mais um rótulo e defina o Caption como Versão 1.0. Inclua um botão do tipo TBitBtn da paleta Additional e defina Name como btnFechar e Kind como bkClose.
Este botão não precisa de código no evento OnClick. A propridade Kind define a função do botão.
Agora que Sobre estrá pronto queremos que nossa aplicação mostre-o quando o usuário selecionar o menu Ajuda -> Sobre. Para efetivarmos isso precisamos primeiramente informar à unit u_editor que ela usará a unit u_sobre. Isto é feito digitando o seguinte código logo abaixo da seção implementation de u_editor:
uses u_sobre;
Agora u_editor tem acesso a tudo que é público em u_sobre. Há duas maneiras de fazer chamadas a forms:
- Modal - o foco fica preso ao form e não é liberado até que este seja fechado. O usuário pode ativar qualquer outra aplicação, mas não pode ativar outra janela da aplicação cuja janela foi aberta como modal. Para ativar esse modo chame o form usando o método ShowModal.
- Não modal - o foco pode ser transferido para outra janela sem que esta precise ser fechada. Para ativar esse modo chame o form usando o método Show.
Agora selecione o evento OnClick do comando Ajuda -> Sobre e digite o seguinte código:
frmSobre.ShowModal;
Selecione o evento OnClick do comando Arquivo -> Sair e digite Close no editor. Execute o programa e clique em Ajuda -> Sobre. Observe que você não pode fazer nada no programa sem que o form Sobre seja fechado. Confirme o funcionamento correto das outras opções do menu. Digite um texto no Memo e teste alterações de cores e alinhamento.
No próximo post mostraremos como criar barras de ferramentas, de status e menus locais (pop-ups).
Posts Relacionados
domingo, 17 de janeiro de 2010
Lazarus - Explorando os Componentes Básicos (Parte III)
Entrando múltiplas linhas
Vimos antes, que o componente TEdit permite a entrada de uma única linha de texto. Para possibilitar a entrada de mais de uma linha de texto usaremos o componente memorando (TMemo). Selecione o componente Memo da paleta Standard e o insira no form dentro de um GroupBox, como mostrado na figura abaixo.
Juntando tudo
Insira um novo botão no form. Esse botão, quando pressionado, mostrará os dados pessoais no campo Memo. Defina a propriedade Caption como Mostrar, Default como True e Name como btnMostrar.
A definição da propriedade Default como True indica que, se o usuário pressionar a tecla Enter, o evento OnClick será executado.
Agora iremos escrever o código que fará todo o trabalho para nós.
Como vimos no nosso primeiro programa, se queremos que a ação aconteça quando pressionarmos o botão, então deveremos programar o evento OnClick do botão. Dê um duplo clique no botão e o editor de código será aberto para inserirmos o código.
Vamos analisar cada linha do código mostrado na figura acima. A linha 52 é responsável por deletar as linhas do memorando. Dessa forma toda vez que inserirmos os dados de uma nova pessoa e pressionarmos o botão btnMostrar, os dados anteriores são apagados. Observe que, para chamar um método de um componente, informamos o nome do componente seguido do nome do método separados por ponto.
A propriedade Lines do componente Memo é um objeto do tipo TStrings, portanto possui propriedades e métodos. Dos métodos disponíveis de Lines usaremos Add, para adicionar novas linhas ao texto do controle.
Na linha 53 do código o nome da pessoa é adicionada ao texto. Observe a forma de invocarmos o método Add. Add é um método de Lines, e Lines é uma propriedade de mmDados. O argumento do método deve ser uma string. Como argumento usamos um literal, que identifica o dado da linha de texto, concatenado ao
nome da pessoa, que é dado pela propriedade Text do componente edNome. A linha 54 é semelhante à 53, não merece maiores comentários.
A profissão da pessoa é adicionada na linha 55. As profissões estão na propriedade Items de lbxProfissao. O índice do elemento selecionado no ListBox é dado pela propriedade ItemIndex. Items pode ser tratado como um vetor indexado por ItemIndex. Por isso a linha 55 é escrita dessa forma.
Na linha 56 adicionamos a idade da pessoa, definida pela propriedade Position de ScrollBar. Position é uma propriedade numérica do tipo integer. Antes de concatenar seu valor é necessário convertê-lo para string. Por isso usamos a função IntToStr(), para converter um número inteiro para string.
A linha 57 pode ser analisada de forma semelhante à linha 55. Portanto não será necessário acrescentar nenhum comentário a respeito.
No caso da linha 58 e seguintes, é o que se faz necessário para mostrar o sexo da pessoa. Como a propriedade Checked do componente CheckBox é boolean, usamos isso para implementar uma estrutura de decisão. Se Checked estiver marcado (True) então será mostrada situação ativo, caso contrário será mostrada situação inativa.
Bem, esse é um programa didático. Foi usado apenas para apresentar alguns componentes. Logo iniciaremos uma nova série de posts para apresentar mais recursos dessa poderosa ferramenta.
Vimos antes, que o componente TEdit permite a entrada de uma única linha de texto. Para possibilitar a entrada de mais de uma linha de texto usaremos o componente memorando (TMemo). Selecione o componente Memo da paleta Standard e o insira no form dentro de um GroupBox, como mostrado na figura abaixo.
Usaremos este componente para mostrar todos os dados pessoais cadastrados quando for pressionado o botão correspondente. Assim, precisamos modificar algumas propriedades de Memo.
- Align - alClient. Para o Memo preencher todo o GroupBox, onde ele está contido.
- Lines - clique no botão elipse e apague o conteúdo.
- Name - mmDadosPessoais.
- ReadOnly - True. Define que o usuário não pode editar o conteúdo do controle.
Juntando tudo
Insira um novo botão no form. Esse botão, quando pressionado, mostrará os dados pessoais no campo Memo. Defina a propriedade Caption como Mostrar, Default como True e Name como btnMostrar.
A definição da propriedade Default como True indica que, se o usuário pressionar a tecla Enter, o evento OnClick será executado.
Agora iremos escrever o código que fará todo o trabalho para nós.
Como vimos no nosso primeiro programa, se queremos que a ação aconteça quando pressionarmos o botão, então deveremos programar o evento OnClick do botão. Dê um duplo clique no botão e o editor de código será aberto para inserirmos o código.
Vamos analisar cada linha do código mostrado na figura acima. A linha 52 é responsável por deletar as linhas do memorando. Dessa forma toda vez que inserirmos os dados de uma nova pessoa e pressionarmos o botão btnMostrar, os dados anteriores são apagados. Observe que, para chamar um método de um componente, informamos o nome do componente seguido do nome do método separados por ponto.
A propriedade Lines do componente Memo é um objeto do tipo TStrings, portanto possui propriedades e métodos. Dos métodos disponíveis de Lines usaremos Add, para adicionar novas linhas ao texto do controle.
Na linha 53 do código o nome da pessoa é adicionada ao texto. Observe a forma de invocarmos o método Add. Add é um método de Lines, e Lines é uma propriedade de mmDados. O argumento do método deve ser uma string. Como argumento usamos um literal, que identifica o dado da linha de texto, concatenado ao
nome da pessoa, que é dado pela propriedade Text do componente edNome. A linha 54 é semelhante à 53, não merece maiores comentários.
A profissão da pessoa é adicionada na linha 55. As profissões estão na propriedade Items de lbxProfissao. O índice do elemento selecionado no ListBox é dado pela propriedade ItemIndex. Items pode ser tratado como um vetor indexado por ItemIndex. Por isso a linha 55 é escrita dessa forma.
Na linha 56 adicionamos a idade da pessoa, definida pela propriedade Position de ScrollBar. Position é uma propriedade numérica do tipo integer. Antes de concatenar seu valor é necessário convertê-lo para string. Por isso usamos a função IntToStr(), para converter um número inteiro para string.
A linha 57 pode ser analisada de forma semelhante à linha 55. Portanto não será necessário acrescentar nenhum comentário a respeito.
No caso da linha 58 e seguintes, é o que se faz necessário para mostrar o sexo da pessoa. Como a propriedade Checked do componente CheckBox é boolean, usamos isso para implementar uma estrutura de decisão. Se Checked estiver marcado (True) então será mostrada situação ativo, caso contrário será mostrada situação inativa.
Bem, esse é um programa didático. Foi usado apenas para apresentar alguns componentes. Logo iniciaremos uma nova série de posts para apresentar mais recursos dessa poderosa ferramenta.
Marcadores:
componentes lazarus
Posts Relacionados
sexta-feira, 15 de janeiro de 2010
Lazarus - Explorando os Componentes Básicos (Parte II)
Escolhendo opções
Há dois controles que permitem ao usuário escolher diferentes opções. O primeiro é a caixa de verificação (TCheckBox), que corresponde a uma opção que pode ser selecionada livremente. O segundo controle é o botão de rádio (TRadioButton), que corresponde a uma seleção exclusiva. Por exemplo, se você tiver dois botões de rádio com rótulos A e B, você pode selecionar um dos dois, mas não ambos ao mesmo tempo. A outra característica é que a escolha de uma das opções é obrigatória. Selecione uma caixa de verificação na paleta Standard e insira-o no form. Usaremos a caixa de verificação para definir a situação cadastral da pessoa - pode assumir a situação Ativo, se a caixa estiver marcada e Não ativo, caso contrário.
Vamos alterar as propriedades da caixa de verificação:
Vamos inserir um componente para selecionarmos o sexo da pessoa que está sendo cadastrada. Nesse caso precisamos de um componente que possibilite mais opções. Usaremos então o grupo de botões de rádio (TRadioGroup). Grupo de botões de rádio permite que sejam inseridos vários botões, cada um com uma opção. Selecione o grupo de botões de rádio da paleta Standard e o insira no form.
Uma lista com muitas opções
Se você precisar de muitas opções os botões de rádio não são apropriados, a menos que você tenha um form realmente grande. Não se deve usar mais que 5 ou 6 botões de rádio. A solução é usar caixas de lista (TListBox). Uma caixa de lista pode manter um grande número de opções em um pequeno espaço, pois ela tem uma barra de rolagem para mostrar na tela apenas uma pequena parte da lista completa. Outra vantagem é que podemos facilmente adicionar ou remover elementos da lista. Caixas de lista também podem permitir uma única escolha ou múltiplas escolhas.
A caixa de lista usada em nossa aplicação servirá para a definição da profissão do cadastro de dados pessoais. Selecione um TGroupBox da paleta Standard e o insira no form conforme a figura mostrada a seguir. Defina a propriedade Caption dessa caixa como Profissão. Agora coloque uma caixa de lista dentro desta caixa.
Muitas opções em pouco espaço
Caixas de lista ocupam muito espaço na tela e suas opções são fixas, não dando ao usuário a oportunidade e escolher uma opção diferente daquelas previamente programadas.
Podemos solucionar essas dificuldades usando caixas combinadas (TComboBox). Uma caixa combinada reúne em um mesmo controle uma caixa de edição, onde se pode digitar algum texto, e uma caixa de lista que é aberta quando pressionamos a seta. O próprio nome do controle sugere que ele é a combinação de dois
componentes, um Edit e um ListBox. No entanto, o comportamento do ComboBox pode mudar, dependendo do valor da propriedade Style. Veremos um pouco mais adiante como definir corretamente esta propriedade para que o componente tenha o comportamento desejado.
Vamos usar uma caixa combinada para definir a escolaridade no cadastro de dados pessoais. Selecione o componente na paleta Standard e o posicione no form conforme a figura. Coloque um rótulo também para identificar a caixa. No rótulo defina a propriedade Caption como Escolaridade.
Defina as seguintes propriedades:
Vamos explorar agora o controle chamado barra de rolagem (TScrollBar). Barras de rolagem são normalmente associados com outros componentes, tais como caixas de lista. Nesses casos a barra de rolagem é parte do componente, uma propriedade sua.
Iremos usar a barra de rolagem para definir a idade da pessoa no cadastro.
Selecione então uma barra de rolagem na paleta Standard e o insira no form conforme é mostrado na figura abaixo. Coloque um rótulo para identificar o componente.
No próximo post concluiremos este programa.
Há dois controles que permitem ao usuário escolher diferentes opções. O primeiro é a caixa de verificação (TCheckBox), que corresponde a uma opção que pode ser selecionada livremente. O segundo controle é o botão de rádio (TRadioButton), que corresponde a uma seleção exclusiva. Por exemplo, se você tiver dois botões de rádio com rótulos A e B, você pode selecionar um dos dois, mas não ambos ao mesmo tempo. A outra característica é que a escolha de uma das opções é obrigatória. Selecione uma caixa de verificação na paleta Standard e insira-o no form. Usaremos a caixa de verificação para definir a situação cadastral da pessoa - pode assumir a situação Ativo, se a caixa estiver marcada e Não ativo, caso contrário.
- Caption - digite Ativo.
- Checked - defina como True. Especifica que o controle estará marcado por padrão.
- Name - chxSituacao.
Vamos inserir um componente para selecionarmos o sexo da pessoa que está sendo cadastrada. Nesse caso precisamos de um componente que possibilite mais opções. Usaremos então o grupo de botões de rádio (TRadioGroup). Grupo de botões de rádio permite que sejam inseridos vários botões, cada um com uma opção. Selecione o grupo de botões de rádio da paleta Standard e o insira no form.
Defina as propriedades do grupo de botões da seguinte forma:
- Caption - Sexo.
- ItemIndex - 0. Define o item do grupo de botões que será selecionado por padrão (o primeiro item é 0).
- Items - Masculino/Feminino. Lista de opções do grupo de botões.
- Name - rgSexo.
Uma lista com muitas opções
Se você precisar de muitas opções os botões de rádio não são apropriados, a menos que você tenha um form realmente grande. Não se deve usar mais que 5 ou 6 botões de rádio. A solução é usar caixas de lista (TListBox). Uma caixa de lista pode manter um grande número de opções em um pequeno espaço, pois ela tem uma barra de rolagem para mostrar na tela apenas uma pequena parte da lista completa. Outra vantagem é que podemos facilmente adicionar ou remover elementos da lista. Caixas de lista também podem permitir uma única escolha ou múltiplas escolhas.
A caixa de lista usada em nossa aplicação servirá para a definição da profissão do cadastro de dados pessoais. Selecione um TGroupBox da paleta Standard e o insira no form conforme a figura mostrada a seguir. Defina a propriedade Caption dessa caixa como Profissão. Agora coloque uma caixa de lista dentro desta caixa.
Defina as propriedades da caixa de lista assim:
- Align - alClient. Define o alinhamento do controle. Neste caso a caixa de lista é alinhada para preencher exatamente o controle onde está contida.
- ItemIndex - 0. Define que item será selecionado por padrão.
- Items - Carpinteiro/Analaista de Sistemas/Arquiteto/Enfermeira/Engenheiro/Pedreiro e outras que você preferir. Para informar as opções o procedimento é semelhante ao que foi feito na propriedade Items de TRadioGroup.
- Name - lbxProfissao.
- Sorted - True. Define que os elementos da lista serão ordenados.
Muitas opções em pouco espaço
Caixas de lista ocupam muito espaço na tela e suas opções são fixas, não dando ao usuário a oportunidade e escolher uma opção diferente daquelas previamente programadas.
Podemos solucionar essas dificuldades usando caixas combinadas (TComboBox). Uma caixa combinada reúne em um mesmo controle uma caixa de edição, onde se pode digitar algum texto, e uma caixa de lista que é aberta quando pressionamos a seta. O próprio nome do controle sugere que ele é a combinação de dois
componentes, um Edit e um ListBox. No entanto, o comportamento do ComboBox pode mudar, dependendo do valor da propriedade Style. Veremos um pouco mais adiante como definir corretamente esta propriedade para que o componente tenha o comportamento desejado.
Vamos usar uma caixa combinada para definir a escolaridade no cadastro de dados pessoais. Selecione o componente na paleta Standard e o posicione no form conforme a figura. Coloque um rótulo também para identificar a caixa. No rótulo defina a propriedade Caption como Escolaridade.
Defina as seguintes propriedades:
- Name - cbxEscolaridade.
- Sorted - True. Define que os elementos da lista estarão ordenadas.
- Style - csDropDown. Define o estilo de apresentação da caixa. Neste caso a caixa permite a escolha de uma opção e também a edição de uma nova opção. csDropDownList não permite edição, mas podem ser digitados caracteres que posicionam na primeira opção que inicie com os caracteres digitados.
Vamos explorar agora o controle chamado barra de rolagem (TScrollBar). Barras de rolagem são normalmente associados com outros componentes, tais como caixas de lista. Nesses casos a barra de rolagem é parte do componente, uma propriedade sua.
Iremos usar a barra de rolagem para definir a idade da pessoa no cadastro.
Selecione então uma barra de rolagem na paleta Standard e o insira no form conforme é mostrado na figura abaixo. Coloque um rótulo para identificar o componente.
Vamos alterar as seguintes propriedades do componente:
- LargeChange - 10. Especifica o quanto Position varia quando clicamos nso lados da barra.
- Max - 100. Especifica o valor máximo de Position.
- Min - 1. Especifica o valor mínimo de Position.
- Name - sbIdade.
- Position - 1. Define a posição atual da barra.
- SmallChange - 1. Especifica o quanto Position varia quando clicamos nas setas.
No próximo post concluiremos este programa.
Marcadores:
componentes lazarus
Posts Relacionados
terça-feira, 12 de janeiro de 2010
Lazarus - Explorando os Componentes Básicos (Parte I)
Agora que já conhecemos um pouco o ambiente Lazarus, já entendemos a estrutura de uma aplicação, já criamos um pequeno programa, estamos prontos para ir para a parte principal do ambiente de programação: o uso de componentes. Esta é a característica chave deste ambiente: programação visual usando componentes.
O sistema vem com uma série de componentes prontos para uso. Não serão descritos aqui todos os componentes em detalhes com suas propriedades, métodos e eventos. Mas será suficiente para que você possa explorar os demais objetos. Neste capítulo usaremos exemplos bastante simples para focar em apenas algumas características mais importantes.
Iniciaremos dando destaque a um grupo de componentes básicos, tais como botões, rótulos, caixas de listas, campos de edição e outros controles relacionados. A maioria dos componentes que são discutidos neste capítulo está presente na aba Standard da paleta de componentes.
Vamos então criar uma nova aplicação. Selecione o menu Arquivo e em seguida em Novo. Na janela clique em Aplicação que está sob o grupo Projeto. Será criado um novo projeto e um novo form.
Vamos então salvar nosso projeto para atribuir nomes aos arquivos. Clique em Salvar Tudo no menu Arquivo. Inicialmente é solicitado o nome da unit. Vamos salvá-la com o nome u_exemplo. Em seguida é pedido o nome do projeto. Digite Exemplo e confirme. Para definir um ícone para a aplicação selecione Opções de Projeto no menu Projeto. Na aba Aplicação clique em Carregar Icone. Escolha o ícone apropriado e confirme.
Nosso programa consistirá de um cadastro de dados pessoais: nome, idade, profissão, escolaridade, sexo e situação cadastral.
Propriedades de form
Vamos modificar as seguintes propriedades do form no Inspetor de Objetos.
Usando um Botão
O Lazarus disponibiliza alguns tipos de botão. Vamos selecionar o botão (TButton) da paleta Standard e posicioná-lo no form.
Como desejamos que o form seja fechado quando clicarmos no botão, isso representa uma ação a ser realizada pelo form. Portanto devemos usar um método que tenha esse comportamento, por isso escolhemos o método Close. Close é o método de form que causa o seu fechamento.
Compile e execute o programa. Agora o form pode ser fechado usando o botão padrão do Windows ou o botão que programamos.
Aceitando dados do usuário
Já vimos que o usuário pode interagir com uma aplicação usando o mouse, ou o teclado em vez do mouse para selecionar um botão pressionando a tecla correspondente à letra sublinhada no Caption.
Além desses casos, o Windows pode manipular entrada do teclado diretamente. O Lazarus oferece uma série de controles para construir campos de edição e editores de texto. Dentre esses vamos utilizar o componente campo de edição (TEdit) da paleta Standard. Este componente permite que o usuário digite apenas uma linha de texto. Mais adiante usaremos um componente que possibilita a entrada de mais de uma linha. Selecione então esse componente e insira-o no form.
Esse primeiro campo de edição que estamos inserindo será utilizado para entrada do nome da pessoa em nosso cadastro de dados pessoais.
Identificando controles
Rótulos são apenas texto, ou comentários, escritos em um form. Geralmente o usuário não interage com rótulos - pelo menos não diretamente. Não faz muito sentido clicar em um rótulo, embora no Lazarus isso seja tecnicamente possível.
Usamos rótulos para descrever outros componentes, tais como campos de edição e caixas de lista ou combo, pois eles não têm legenda. O Lazarus implementa rótulos como componentes gráficos, não ajanelados.
Vamos então inserir um rótulo no nosso form. Selecione o rótulo (TLabel) na paleta Standard e insira-o ao lado esquerdo do campo de edição conforme mostrado na figura seguinte.
Vamos alterar suas propriedades conforme o seguinte:
Tenha em mente que nos referimos apenas nas propriedades que são necessárias para a nossa aplicação. Certamente vamos necessitar usar outras em diferentes programas. Vamos continuar explorando os componentes no próximo post.
O sistema vem com uma série de componentes prontos para uso. Não serão descritos aqui todos os componentes em detalhes com suas propriedades, métodos e eventos. Mas será suficiente para que você possa explorar os demais objetos. Neste capítulo usaremos exemplos bastante simples para focar em apenas algumas características mais importantes.
Iniciaremos dando destaque a um grupo de componentes básicos, tais como botões, rótulos, caixas de listas, campos de edição e outros controles relacionados. A maioria dos componentes que são discutidos neste capítulo está presente na aba Standard da paleta de componentes.
Vamos então criar uma nova aplicação. Selecione o menu Arquivo e em seguida em Novo. Na janela clique em Aplicação que está sob o grupo Projeto. Será criado um novo projeto e um novo form.
Vamos então salvar nosso projeto para atribuir nomes aos arquivos. Clique em Salvar Tudo no menu Arquivo. Inicialmente é solicitado o nome da unit. Vamos salvá-la com o nome u_exemplo. Em seguida é pedido o nome do projeto. Digite Exemplo e confirme. Para definir um ícone para a aplicação selecione Opções de Projeto no menu Projeto. Na aba Aplicação clique em Carregar Icone. Escolha o ícone apropriado e confirme.
Nosso programa consistirá de um cadastro de dados pessoais: nome, idade, profissão, escolaridade, sexo e situação cadastral.
Propriedades de form
Vamos modificar as seguintes propriedades do form no Inspetor de Objetos.
- biMaximize em BorderIcons - coloque em False. Isso evita que o form seja maximizado.
- BorderStyle - defina como bsSingle. Para evitar o redimensionamento da janela.
- Caption - informe Exemplo.
- Height - defina como 480. Altura da janela.
- Name - defina como frmExemplo.
- Position - defina como poScreenCenter. Para centralizar a janela na tela do monitor.
- Witdh - defina como 640. Largura da janela.
Usando um Botão
O Lazarus disponibiliza alguns tipos de botão. Vamos selecionar o botão (TButton) da paleta Standard e posicioná-lo no form.
Vamos alterar as propriedades do botão:
- Caption - defina como &Fechar. É a legenda do botão. O & define um atalho para o caso de querer usar o teclado em vez do mouse. Neste caso se você pressionar F será o mesmo que clicar no botão.
- Name - defina como btnFechar. A propriedade Name em qualquer componente define o identificador desse componente.
Close;
Como desejamos que o form seja fechado quando clicarmos no botão, isso representa uma ação a ser realizada pelo form. Portanto devemos usar um método que tenha esse comportamento, por isso escolhemos o método Close. Close é o método de form que causa o seu fechamento.
Compile e execute o programa. Agora o form pode ser fechado usando o botão padrão do Windows ou o botão que programamos.
Aceitando dados do usuário
Já vimos que o usuário pode interagir com uma aplicação usando o mouse, ou o teclado em vez do mouse para selecionar um botão pressionando a tecla correspondente à letra sublinhada no Caption.
Além desses casos, o Windows pode manipular entrada do teclado diretamente. O Lazarus oferece uma série de controles para construir campos de edição e editores de texto. Dentre esses vamos utilizar o componente campo de edição (TEdit) da paleta Standard. Este componente permite que o usuário digite apenas uma linha de texto. Mais adiante usaremos um componente que possibilita a entrada de mais de uma linha. Selecione então esse componente e insira-o no form.
Esse primeiro campo de edição que estamos inserindo será utilizado para entrada do nome da pessoa em nosso cadastro de dados pessoais.
Da mesma forma que procedemos com o botão e o form iremos alterar as propriedades desse componente.
- Name - defina como edNome.
- Width - defina como 400.
- Text - apague o conteúdo dessa propriedade. Na verdade esta propriedade irá retornar o conteúdo do campo que for digitado pelo usuário do programa.
Identificando controles
Rótulos são apenas texto, ou comentários, escritos em um form. Geralmente o usuário não interage com rótulos - pelo menos não diretamente. Não faz muito sentido clicar em um rótulo, embora no Lazarus isso seja tecnicamente possível.
Usamos rótulos para descrever outros componentes, tais como campos de edição e caixas de lista ou combo, pois eles não têm legenda. O Lazarus implementa rótulos como componentes gráficos, não ajanelados.
Vamos então inserir um rótulo no nosso form. Selecione o rótulo (TLabel) na paleta Standard e insira-o ao lado esquerdo do campo de edição conforme mostrado na figura seguinte.
- Caption - &Nome.
- FocusControl - edNome. Define qual componente receberá o foco quando for selecionada a tecla de atalho definida no Caption.
- Name - lblNome.
Tenha em mente que nos referimos apenas nas propriedades que são necessárias para a nossa aplicação. Certamente vamos necessitar usar outras em diferentes programas. Vamos continuar explorando os componentes no próximo post.
Marcadores:
componentes lazarus
Posts Relacionados
Assinar:
Postagens (Atom)














































