Criando Uma App em Lazarus
Criando Uma App em Lazarus
Criando Uma App em Lazarus
Douglas Fernando Scheibler douglass at certelnet.com.br Neste artigo abordaremos o desenvolvimento de uma aplicao em Lazarus. Nossa necessidade ser criar uma simples soluo de cadastro de clientes. Sem muitos rodeios, vamos ao desenvolvimento... Criando o Banco de dados Para construir nosso sistema de clientes, vamos comear pelo banco de dados. Foi utilizado o banco Firebird (www.firebirdsql.org), no entrarei em detalhes de instalao. Depois de instalado, temos de criar o nossa base de dados. Utilizei o utilitrio FlameRobin(www.flamerobin.org), disponvel para vrias plataformas. Aps instalado entre no menu Database na opo Create new database...
Crie o diretrio /opt/sisclientes e preencha as informes conforme na imagem acima. A senha para a criao da base masterkey ou a senha informada no momento da instalacao do Firebird. Atente para a informao contida em Charset, pois esta informao define o correto armazenamento de dados em nossa lingua. Para criar as tabelas, clique sobre sysclientes e com o boto direito clique sobre Tables e selecione a opo Create New, escreva: CREATE TABLE ESTADOS ( UF VARCHAR(2) NOT NULL, NOME VARCHAR(40), PRIMARY KEY (UF) ); CREATE TABLE CIDADES ( CODIGO INTEGER NOT NULL, NOME VARCHAR(60), ESTADO VARCHAR(2) NOT NULL, PRIMARY KEY (CODIGO), FOREIGN KEY (ESTADO) REFERENCES ESTADOS (UF) ); CREATE TABLE CLIENTES (
CODIGO INTEGER NOT NULL, NOME VARCHAR(80), ENDERECO VARCHAR(100), CIDADE INTEGER NOT NULL, CEP VARCHAR(10), FONE VARCHAR(30), CELULAR VARCHAR(30), TIPO CHAR(10) , CNPJ_CPF VARCHAR(20), PRIMARY KEY (CODIGO), FOREIGN KEY (CIDADE) REFERENCES CIDADES (CODIGO) ); Aps clique em Execute e logo depois em Commit. Pronto, se tudo estiver correto, nosso banco de dados j est criado com trs tabelas.
Instalando os componentes FIBL Depois de criada nossa base de dados vamos instalar os componentes de acesso. Utilizaremos os componentes FIBL(http://sourceforge.net/projects/fibl/) para acessar os dados no Firebird, voc pode encontr-los em http://prdownloads.sourceforge.net/fibl/fibl_050823.zip?download. Depois de baixa-lo descompacte-o em lazarus/components. Agora abra o lazarus e selecione no menu Components a opo Open package file (.lpk), procure por fiblaz.lpk em lazarus/components/fibl. Aps abrir a tela de instalacao de componentes do lazarus, clique em Compile e se tudo ocorrer bem em Install. Depois de alguns segundos, o lazarus reiniciar. Note que agora a paleta de componentes possui uma nova aba chamada FIBL com os seguintes componentes:
TFIBDatabase - Componente responsvel pela conexo com a base de dados. TFIBTransaction - Componente de manupilao das transaes (commit, rollback).
TFIBDatabase - Componente responsvel pela conexo com a base de dados. TFIBQuery - Componente de consulta e execuo de comando no banco de dados. TFIBDataSet - Componente de manipulao dos dados (incluso, excluso, etc).
Desenvolvendo o sistema Agora podemos desenvolver o sistema, clique em Project, escolha a opo New Project e selecione Application.Antes de fazermos qualquer coisa vamos salvar nosso projeto, menu File > Save All. Nomeie a unit como uprincipal.pas e o project como sisclientes.lpi. Criando o Datamodule Vamos criar nosso datamodule, datamodule um objeto(form) no visual, podemos colocar qualquer objeto no visual, em nosso caso utilizaremos o datamodule para conter os componentes de acessso ao banco de dados, facilitando o compartilhamento entre as diversas units e melhorando a organizaco e simplicidade do sistema. Para inserir um datamodule, entre no menu File > New selecione a opo Datamodule. Abrir um formulrio com fundo branco onde voc pode adicionar componentes no visuais. Para nosso sistema adicione os componentes de acesso ao banco de dados e altere as propriedades como mostrado abaixo:
TFIBDatabase Name : FibBase Username : SYSDBA Password : masterkey Enconding : WIN1252 Dialect : 3 DefaultTransaction : FibTrans TFIBDataSet Name : FIBDSEstados AutoCommit : True AutoStartTransaction : True DataBase : FibBase SelectSQL : Select UF, Nome from Estados RefreshSQL : Select UF, Nome from Estados where UF = :UF InsertSQL : Insert into Estados (UF,Nome) values (:UF, :Nome) UpdateSQL : Update Estados set Nome = :Nome where UF = :UF DeleteSQL : Delete from Estados where UF = :UF TFIBDataSet Name : FIBDSCidades Name : FibTrans
AutoCommit : True AutoStartTransaction : True DataBase : FibBase SelectSQL : Select Codigo, Nome, Estado from Cidades RefreshSQL : Select Codigo, Nome, Estado from Cidades where Codigo = :Codigo InsertSQL : Insert Into Cidades (Codigo,Nome,Estado) values (:Codigo,:Nome,:Estado) UpdateSQL : Update Cidades set Nome = :Nome, Estado = :Estado where Codigo = :Codigo DeleteSQL : Delete from Cidades where Codigo = :Codigo TFIBDataSet Name : FIBDSClientes AutoCommit : True AutoStartTransaction : True DataBase : FibBase SelectSQL : Select Codigo, Nome, Endereco, Cidade, Cep, Fone, Celular, Tipo, CNPJ_CPF from Clientes RefreshSQL : Select Codigo, Nome, Endereco, Cidade, Cep, Fone, Celular, Tipo, CNPJ_CPF from Clientes where Codigo = :Codigo InsertSQL : Insert into Clientes (Codigo, Nome, Endereco, Cidade, Cep, Fone, Celular, Tipo, CNPJ_CPF) values (:Codigo, :Nome, :Endereco, :Cidade, :Cep, :Fone, :Celular, :Tipo, :CNPJ_CPF) UpdateSQL : Update Clientes set Nome = :Nome, Endereco = :Endereco, Cidade = :Cidade, Cep = :Cep, Fone = :Fone, Celular = :Celular, Tipo= :Tipo, CNPJ_CPF = :CNPJ_CPF where Codigo = :Codigo DeleteSQL : Delete from Clientes where Codigo = :Codigo
Depois que os componentes e as propriedades estejam devidamente criados, temos que acessar nosso banco de dados. Normalmente isto feito na abertura do sistema. Utilizaremos o evento Create do datamodule. Partiremos da idia que o banco de dados sempre se encontrar no mesmo diretrio da aplicao. Veja como fica : procedure TDataModule1.DataModule1Create(Sender: TObject); begin FibBase.DBName := ExtractFileDir(Application.ExeName) + '/sisclientes.fdb'; FibBase.Connected := True; end; Criando o cadastro de Estados Vamos iniciar o desenvolvimento do cadastro de estados. Crie um novo Form em File > NewForm, altere em suas propriedades, name para FrmEstados, caption para Cadastro de Estados e salve como uestados.pas. Insira os componentes DataSource, DBNavigator, DBGrid, DBEdits e Labels como mostrado na figura abaixo.
Depois de montado o esqueleto vamos ligar os componentes alterando suas propriedades. Adicione a linha Uses udatamod; logo aps a linha Implementation. Nos componentes DBNavigator, DBGrid e DBEdits altere a propriedade DataSource para datasource1. Nos DBEdits necessrio informar o DataField, no primeiro coloque UF e no segundo Nome. Depois configure as colunas do DBGrid na propriedade Columns. Para ligarmos os componentes de acesso ao banco de dados que esto no datamodule, escreva o seguinte cdigo no evento Create do Form: procedure TFrmEstados.FrmEstadosCreate(Sender: TObject); begin DataModule1.FIBDSEstados.Open; Datasource1.DataSet := DataModule1.FIBDSEstados; end; Agora s falta fecharmos o DataSet ao sairmos do Form, isso ocorre no evento close: procedure TFrmEstados.FrmEstadosClose(Sender: TObject; var CloseAction: TCloseAction); begin DataModule1.FIBDSEstados.Close; CloseAction := caFree; end; Criando o cadastro de Cidades Para criar o cadastro de cidades, repita a mesma operao. Crie um novo Form em File > NewForm, altere em suas propriedades, name para FrmCidades, caption para Cadastro de Cidades e salve como ucidades.pas. Insira os componentes DataSource, DBNavigator, DBGrid, DBEdits, Labels, SpeedButtons e Panels como mostrado na figura abaixo.
Conecte os componentes alterando suas propriedades. Adicione a linha Uses udatamod; logo aps a linha Implementation. Nos componentes DBNavigator, DBGrid e DBEdits altere a propriedade DataSource para datasource1. Nos DBEdits necessrio informar o DataField, no primeiro coloque UF e no segundo Nome. Depois configure as colunas do DBGrid na propriedade Columns. Para ligarmos os componentes de acesso ao banco de dados que esto no datamodule, escreva o seguinte cdigo no evento Create do Form: procedure TFrmCidades.FrmCidadesCreate(Sender: TObject); begin DataModule1.FIBDSCidades.Open; Datasource1.DataSet := DataModule1.FIBDSCidades; end; Agora s falta fecharmos o DataSet ao sairmos do Form, isso ocorre no evento close: procedure TFrmCidades.FrmCidadesClose(Sender: TObject; var CloseAction: TCloseAction); begin DataModule1.FIBDSCidades.Close; CloseAction := caFree; end; Note que neste Form temos um relacionamento master-detail entre Estados e Cidades. Assim temos que dar a opo ao usurio de selecionar o Estado a que a Cidade em questo faz parte. Criaremos um Form de consulta, onde possamos selecionar o Estado. Este mesmo forma ser utilizado no cadastro de Clientes para referenciar a Cidade. Vamos a sua criao. Crie um novo Form em File > NewForm, altere em suas propriedades, name para FrmConsulta, caption para Consulta e salve como uconsulta.pas. Insira os componentes, DataSource, FIBDataSet, DBGrid e BitBtns como a figura abaixo:
Vamos criar as ligaes entre os componentes. Adicione a linha Uses udatamod, uestados; logo aps a linha Implementation. No componente DataSource, ligue a propriedade DataSet ao FIBDataSet, neste caso salvamos como FIBDS. Nos componentes DBGrid altere a propriedade DataSource para datasource1. Nos componentes BitBtns altere a propriedade Kind para bkOK e bkCancel respectivamente. Para conectar ao banco de dados precisamos ligar aos componentes de acesso do datamodule, veja o codigo: procedure TFrmConsulta.FrmConsultaCreate(Sender: TObject); begin FIBDS.Database := DataModule1.FibBase; end; Ao fechar o Form de consulta, precisamos destru-lo da memria. procedure TFrmConsulta.FrmConsultaClose(Sender: TObject; var CloseAction: TCloseAction); begin CloseAction := caFree; end; Depois de desenvovido nosso Form de consulta, necessitamos utiliza-lo no Cadastro de Cidades. Adicione a chamada uconsulta na clausula uses. No evento Click do boto F3, escreva a chamada ao Form de consulta : procedure TFrmCidades.F3_EstadosClick(Sender: TObject); begin FrmConsulta := TFrmConsulta.Create(Self); try FrmConsulta.FIBDS.SelectSQL.Clear; FrmConsulta.FIBDS.SelectSQL.Add('Select * from Estados'); FrmConsulta.FIBDS.Open; if FrmConsulta.ShowModal = mrOk then begin DataSource1.Edit; Datasource1.DataSet.FieldByName('ESTADO').asString := FrmConsulta.FIBDS.FieldByName('UF').asString; end; except FrmConsulta.Free;
end; end; Ainda nos falta mostrar o nome do Estado na movimentao das cidades, utilizaremos um Panel para isso. Veja o cdigo de busca, no evento DataChange do componente datasource1, abaixo: procedure TFrmCidades.Datasource1DataChange(Sender: TObject; Field: TField); begin //Busca o Nome do Estado if dataSource1.DataSet.FieldByName('ESTADO').AsString <> '' then begin if (DataSource1.State = dsBrowse) or (Field = DataSource1.DataSet.FieldByName('Estado')) then begin FIBDSAux.Database := DataModule1.FibBase; FIBDSAux.Close; FIBDSAux.SelectSQL.Clear; FIBDSAux.SelectSQL.Add('Select NOME from Estados where UF = ''' + DataSource1.DataSet.FieldByName('ESTADO').asString + ''''); FIBDSAux.Open; PanelEstado.Caption := FIBDSAux.FieldByname('NOME').asString; FIBDSAux.Close; end; end; end; Para facilitar ao usurio, criamos uma tecla de atalho (F3) para buscar os Estados. Voc deve adicionar LCLType na clusula uses para que este cdigo funcione corretamente. procedure TFrmCidades.DBEdit3KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F3 then begin F3_EstadosClick(Self); key := VK_UNKNOWN; end; end;
Criando o cadastro de Clientes Chegamos ao nosso cadastro principal, repita os mesmos passos do cadastro anterior. Basicamente este cadastro possui as mesmas funcionalidades do cadastro de Cidades, com uma funcionalidade de busca da cidade atravz de um Form de consulta, veja abaixo:
E o cdigo completo do ucliente.pas : unit uclientes; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, DBCtrls, StdCtrls, DBGrids, ExtCtrls, Buttons, DB, FIBDataSet, LCLType; type { TFrmClientes } TFrmClientes = class(TForm) Datasource1: TDatasource; DBComboBox1: TDBComboBox; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; DBEdit4: TDBEdit; DBEdit5: TDBEdit; DBEdit6: TDBEdit; DBEditDoc: TDBEdit; DBEdit8: TDBEdit; dbGrid1: TdbGrid; DBNavigator1: TDBNavigator; F3_Cidades: TSpeedButton; FIBDSAux: TFIBDataSet; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; PanelCidade: TPanel;
PanelEstado: TPanel; procedure DBEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Datasource1DataChange(Sender: TObject; Field: TField); procedure F3_CidadesClick(Sender: TObject); procedure FrmClientesClose(Sender: TObject; var CloseAction: TCloseAction); procedure FrmClientesCreate(Sender: TObject); private { private declarations } public { public declarations } end; var FrmClientes: TFrmClientes; implementation Uses udatamod, uconsulta; { TFrmClientes } procedure TFrmClientes.FrmClientesCreate(Sender: TObject); begin DataModule1.FIBDSClientes.Open; Datasource1.DataSet := DataModule1.FIBDSClientes; end; procedure TFrmClientes.FrmClientesClose(Sender: TObject; var CloseAction: TCloseAction); begin DataModule1.FIBDSClientes.Close; CloseAction := caFree; end; procedure TFrmClientes.Datasource1DataChange(Sender: TObject; Field: TField); begin //Cidade if dataSource1.DataSet.FieldByName('Cidade').AsString <> '' then begin if (DataSource1.State = dsBrowse) or (Field = DataSource1.DataSet.FieldByName('Cidade')) then begin FIBDSAux.Database := DataModule1.FibBase; FIBDSAux.Close; FIBDSAux.SelectSQL.Clear; FIBDSAux.SelectSQL.Add('Select Nome, Estado from Cidades where CODIGO = ''' + DataSource1.DataSet.FieldByName('CIDADE').asString + ''''); FIBDSAux.Open; PanelCidade.Caption := FIBDSAux.FieldByname('Nome').asString; PanelEstado.Caption := FIBDSAux.FieldByname('Estado').asString; FIBDSAux.Close; end; end; end; procedure TFrmClientes.F3_CidadesClick(Sender: TObject); begin FrmConsulta := TFrmConsulta.Create(Self); try FrmConsulta.FIBDS.SelectSQL.Clear; FrmConsulta.FIBDS.SelectSQL.Add('Select * from Cidades'); FrmConsulta.FIBDS.Open; if FrmConsulta.ShowModal = mrOk then
begin DataSource1.Edit; Datasource1.DataSet.FieldByName('CIDADE').asString := FrmConsulta.FIBDS.FieldByName('CODIGO').asString; end; except FrmConsulta.Free; end; end; procedure TFrmClientes.DBEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F3 then begin F3_CidadesClick(Self); key := VK_UNKNOWN; end; end; initialization {$I uclientes.lrs} end. Criando o formulrio principal Agora todos os cadastros esto desenvolvidos, temos que criar uma interface principal. Antes de mais nada, precisamos que os forms no sejam criados ao entrarmos no sistema, isso nos traz um srie de benefcios. Para isso entre em Project > Project Options aba Forms, passe a direita (Avaiable Forms) os Forms: FrmEstados, FrmCidades, FrmClientes e FrmConsulta. A esquerda (Auto-create Forms) devem permanacer o DataModule e o Form principal. Insira quatro botes do tipo BitBtn e mude as propriedades caption e glyph de acordo com seu gosto. Para chamar os demais Forms precisamos declarar na clausula uses, aps a linha implementation. Desta maneira : uses uestados, ucidades, uclientes;. O cdigos para as chamadas dos outros Forms: procedure TFrmPrincipal.BitBtnEstadosClick(Sender: TObject); begin FrmEstados := TFrmEstados.Create(Self); FrmEstados.Show; end; procedure TFrmPrincipal.BitBtnCidadesClick(Sender: TObject); begin FrmCidades := TFrmCidades.Create(Self); FrmCidades.Show; end; procedure TFrmPrincipal.BitBtnClientesClick(Sender: TObject); begin FrmClientes := TFrmClientes.Create(Self); FrmClientes.Show; end;
Nossa aplicao: