segunda-feira, 13 de abril de 2015

Os dois exercícios do Delphi




2 Exercícios de Delphi
Calculadora

Olá pessoal, nesse artigo será demonstrado como criar uma simples calculadora em Delphi. Este material é destinado aqueles que estão iniciando os estudos dessa linguagem de programação e IDE.

Será utilizado o componente TEdit, que se encontra na paleta Standard e o componente TSpeedButton da paleta Additional. Ao invés de utilizar o TSpeedButton, pode ser utilizado o TButton, pois as propriedades que serão utilizadas aqui são comuns aos dois.


Vamos iniciar um novo projeto no Delphi. Para essa calculadora será necessário apenas um form. Onde serão adicionados os seguintes componentes: 1 TEdit e 18 TSpeedButton. Vamos organizá-los da seguinte maneira, veja abaixo.







Figura 1: TSpeedButton e TEdits organizados na Form


Agora que o form já foi organizado com os componentes TEdit e TSpeedButton, vamos alterar as propriedades Caption e Name dos TSpeedButton no Object Inspector. Veja abaixo como deve ficar.
Componente
Name
Caption
TSpeedButton1
Um
1
TSpeedButton2
Dois
2
TSpeedButton3
Três
3
TSpeedButton4
Quatro
4
TSpeedButton5
Cinco
5
TSpeedButton6
Seis
6
TSpeedButton7
Sete
7
TSpeedButton8
Oito
8
TSpeedButton9
Nove
9
TSpeedButton10
Zero
0
TSpeedButton11
Mais
+
TSpeedButton12
Menos
-
TSpeedButton13
Dividir
/
TSpeedButton14
Multiplicar
*
TSpeedButton15
Maismenos
+-
TSpeedButton16
Virgula
,
TSpeedButton17
Igual
=
TSpeedButton18
Llimpar
C


Tabela 1: Propriedades Name e Caption dos TSpeedButtons


Agora que já alteramos as devidas propriedades do TSpeedButton, vamos configurar as seguintes propriedades do TEdit no Object Inspector: Name, Text e deixar a propriedade Enabled do TEdit como False.

Component
Name
Text
TEdit1
Visor
Deixe Vazio


Tabela 2: Propriedades Name e Text do TEdit


Veja como o visual da nossa calculadora já melhorou com essas alterações. Você também pode organizar os botões como bem entender, assim deixando a seu gosto. 




Figura 2: Botões com suas propriedades alteradas


Listagem 1: Declarando variáveis globais
private { Private declarations } public { Public declarations } end; var Form1: TForm1; valor1 : real; valor2 : real; funcao : integer; implementation



Vamos partir agora para a configuração dos botões.


Listagem 2: Vamos por o seguinte código nos botões de 0 a 9
procedure TForm1.umClick(Sender: TObject); begin visor.Text := visor.Text + (Sender as TSpeedButton).Caption end;



Observação: Basta fazer isso no evento OnClick de um único botão. Depois, selecionar todos os demais botões numéricos e, no Objetct Inspector, na aba Events, selecionar o método criado para o evento OnClick dos botões selecionados.


Já configuramos os botões numéricos, vamos então configurar agora os botões das operações, virgula e o limpar.


Listagem 3: Evento OnClick do botão mais
procedure TForm1.maisClick(Sender: TObject); begin valor1 := StrToFloat(visor.Text); visor.Text := ''; funcao := 1; end;



Listagem 4: Evento OnClick do botão menos
procedure TForm1.menosClick(Sender: TObject); begin valor1 := StrToFloat(visor.Text); visor.Text := ''; funcao := 2; end;



Listagem 5: Evento OnClick do botão Dividir
procedure TForm1.dividirClick(Sender: TObject); begin valor1 := StrToFloat(visor.Text); visor.Text := ''; funcao := 3; end;



Listagem 6: Evento OnClick do botão Multiplicar
procedure TForm1.multiplicarClick(Sender: TObject); begin valor1 := StrToFloat(visor.Text); visor.Text := ''; funcao := 4; end;



Listagem 7: Evento OnClick do botão “Mais ou Menos”
procedure TForm1.meisoumenosClick(Sender: TObject); begin visor.Text:='-'+visor.Text; end;



Listagem 8: Evento OnClick do botão Vírrgula
procedure TForm1.menosClick(Sender: TObject); begin valor1 := StrToFloat(visor.Text); visor.Text := ''; funcao := 2; end;



Listagem 9: Evento OnClick do botão limpar
procedure TForm1.cClick(Sender: TObject); begin visor.Text:=''; end;



Vamos configurar agora o botão igual, para isso inserimos o seguinte código.


Listagem 10: Evento OnClick do botão igual
procedure TForm1.igualClick(Sender: TObject); var soma: real; begin valor2:=StrToFloat(visor.Text); case (funcao) of 1: begin soma:=valor1+valor2; visor.text:=FloatToStr(soma); end; 2: begin soma:=valor1-valor2; visor.text:=FloatToStr(soma); end; 3: begin soma:=valor1*valor2; visor.text:=FloatToStr(soma); end; 4: begin if(valor2<>0)then begin soma:=valor1/valor2; visor.text:=FloatToStr(soma); end else begin SHowMessage('Divisão por zero!!'); visor.Text:='ERRO'; end end end; //finaliza o case end;



Esse será o código responsável por efetuar a operação que o usuário desejar, somar, diminuir, multiplicar, dividir e etc.


Já estamos com todos os botões numéricos e os demais botões configurados, vamos agora apenas aterar algumas propriedades do form. Para isso clique no form e no Object Inspector acess o evento OnShow e adicione essas duas linhas de código.


Listagem 11: Código OnShow do Form
procedure TForm1.FormShow(Sender: TObject); begin Valor1 := 0; valor2 := 0; end;






Figura 3: Object Inspector – OnShow do Form




Na propriedade KeyPreview, coloque como True.




Figura 4: KeyPreview ativado (True)


Agora, para finalizar as alterações no form, adicione o seguinte código no evento OnKeyDown. Esse código que vamos inserir agora serve para que possam ser utilizados os números do teclado ao invés de ter que ficar clicando com o mouse em cada botão na calculadora.






Figura 5: Acessando o evento OnKeyDown do form


Listagem 12: Evento OnKeyDown do form
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_NUMPAD1 then um.Click; if Key = VK_NUMPAD2 then dois.click; if Key = VK_NUMPAD3 then tres.click; if Key = VK_NUMPAD4 then quatro.click; if Key = VK_NUMPAD5 then cinco.click; if Key = VK_NUMPAD6 then seis.click; if Key = VK_NUMPAD7 then sete.click; if Key = VK_NUMPAD8 then oito.click; if Key = VK_NUMPAD9 then nove.click; if Key = VK_NUMPAD0 then zero.click; if Key = VK_ADD then mais.click; if Key = VK_SUBTRACT then menos.click; if Key = VK_MULTIPLY then multiplicar.click; if Key = VK_DIVIDE then dividir.click; if Key = VK_RETURN then igual.click; if Key = VK_DECIMAL then virgula.Click; if Key = VK_DELETE then c.click;
end;

Tela de Login:




Crie um novo diretório, onde serão salvos o Banco de Dados (caso use firebird/interbase) e os arquivos do Projeto.


Utilizando o Banco de Dados e o Front End de sua preferência, crie um novo banco e execute os scripts abaixo para criação da tabela Usuarios, e o usuario administrador, respectivamente:


Listagem 1: Scripts do Banco de Dados
// Criação da tabela USUARIOS CREATE TABLE USUARIOS ( CODIGO INTEGER NOT NULL, USUARIO VARCHAR(20) NOT NULL, SENHA VARCHAR(20) NOT NULL, CONSTRAINT PK_USUARIOS PRIMARY KEY (CODIGO) ) // INSERT do primeiro Usuario da tabela INSERT INTO USUARIOS (CODIGO, USUARIO, SENHA) VALUES (1,’administrador’,’admin123’)



Utilizando o Delphi, crie um novo projeto no Menu New -> VCL Forms Application – Delphi.


Adicione uma nova Unit ao projeto no Menu New -> Unit –Delphi.


Iremos utilizar a nova Unit para criação da classe TLoginModel, que será responsável por transferir informações entre a camada de negócios e a camada de apresentação.


A classe TLoginModel possui dois campos, que são: FUsuario e FSenha.


Respeitando as boas práticas de POO, não iremos expor publicamente nossos campos, mas iremos encapsular o acesso a eles utilizando métodos getters, setters e propriedades.


Listagem 2: Class TLoginModel
unit uLoginModel; interface Type TLoginModel = class strict private // campos FUsuario: string; FSenha: string; // getters function GetUsuario: string; function GetSenha: string; // setters procedure SetUsuario(const Value: string); procedure SetSenha(const Value: string); public // propriedades property Usuario : string read GetUsuario write SetUsuario; property Senha : string read GetSenha write SetSenha; end; implementation { TLoginModel } function TLoginModel.GetSenha: string; begin Result := FSenha; end; function TLoginModel.GetUsuario: string; begin Result := FUsuario; end; procedure TLoginModel.SetSenha(const Value: string); begin FSenha := Value; end; procedure TLoginModel.SetUsuario(const Value: string); begin FUsuario := Value; end; end.



Volte ao formulário da aplicação e altere a propriedade Name para frmLogin.


Utilizando a Tool Palette, adicione os seguintes controles:
3 Labels;
2 Edits;
2 Buttons.


Altere a propriedade Name dos controle para:
3 Labels (lblTitulo, lblUsuario, lblSenha);
2 Edits (edtUsuario, edtSenha);
2 Buttons (btnLogar, btnSair);


Organize o formulário e altere a propriedade Caption dos controle conforme a imagem abaixo:




Figura 1: Formulário frmLogin


Utilizando o menu New, adicione um Data Module ao seu projeto.


Adicione um controle do tipo SQLConnection da paleta DbExpress, que será usado para criar uma conexão com o Banco de Dados.


Configure o controle SQLConnection de acordo de o caminho do seu banco.


Defina a propriedade LoginPrompt como False para que a senha do banco não seja solicitada novamente a cada nova conexão.


Altere a propriedade Name do Data Module para dm_dados e a propriedade Name SQLConnection para LOGINOO.


Salve o projeto e as units no diretório criado no início do artigo, seguindo a nomenclatura:
Formulário Login - uFrmLogin;
Unit Login Model - uLoginModel;
Data Module - uDm_Dados;
Nome do Projeto – LOGINOO;


Inclua uma nova Unit no Menu New -> Unit –Delphi.


Salve a nova Unit criada como uLoginDAO.


A classe TLoginDAO será usada para centralizar as regras de negócio e o acesso ao banco de dados.


Para nossa classe TLoginDAO, utilizaremos métodos do framework DbExpress 4, que é a engine de acesso e manipulação de dados mais utilizada pelos programadores Delphi.


A nova arquitetura do DbExpress 4 traz novas features que permitem um desenvolvimento totalmente orientado a objetos, de maneira simples e elegante.


Digite as informações da classe TLoginDAO, e não esqueça de dar uses nas Units uLoginModel, DBXCommon, SysUtils.


Listagem 3: Classe TLoginDAO
unit uLoginDAO; interface uses uLoginModel, DBXCommon, SysUtils; type TLoginDAO = class public // função Logar passando um objeto LoginModel como parâmetro function Logar(LoginModel: TLoginModel): Boolean; end; implementation uses Dialogs; { TLoginDAO } function TLoginDAO.Logar(LoginModel: TLoginModel): Boolean; var dbcon : TDBXConnection; // objeto para conexao sql : TDBXCommand; // objeto para executar instruçoes SQL parametro : TDBXParameter; // objeto para parametrizar instruçao SQL reader : TDBXReader; // objeto que guarda o resultado de um TDBXCommand; begin try try // fabrica uma conexão com o banco dbcon:=TDBXConnectionFactory.GetConnectionFactory.GetConnection('LOGINOO', 'sysdba','masterkey'); // cria um comando sql no objeto dbcon sql := dbcon.CreateCommand; // instrução SQL sql.Text := 'SELECT * FROM USUARIOS WHERE UPPER(USUARIO) = UPPER(?) ' + ' AND UPPER(SENHA) = UPPER(?)'; // parametro Usuario parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pUsuario'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[0].Value.SetWideString(LoginModel.Usuario); // parametro Senha parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pSenha'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[1].Value.SetWideString(LoginModel.Senha); sql.Prepare; // prepara a instrução SQL para executar no Banco reader := sql.ExecuteQuery; // executa o SQL e guarda o resultado no reader; while (reader.Next) do // retorna True se o reader não estiver vazio Result := True; except on E : Exception do ShowMessage('Não foi possível logar no sistema' + #13 + E.Message); end; finally // libera os objetos da memória FreeAndNil(dbcon); FreeAndNil(sql); FreeAndNil(reader); end; end; end.



Passaremos agora à codificação do formulário de nossa aplicação. Adicione o seguinte código ao evento OnClick do botão btnLogar:


Listagem 4: Evento OnClick do Botão btnLogar
procedure TfrmLogin.btnLogarClick(Sender: TObject); var LoginModel: TLoginModel; LoginDAO: TLoginDAO; begin LoginModel := TLoginModel.Create; // cria o objeto LoginModel na Memória LoginDAO := TLoginDAO.Create; // cria o objeto LoginDAO na Memória // verifica se há algum edit em branco if (edtUsuario.Text = '') or (edtSenha.Text = '') then raise Exception.Create('Digite usuário e senha') else begin try LoginModel.Usuario := edtUsuario.Text; LoginModel.Senha := edtSenha.Text; if LoginDAO.Logar(LoginModel) then begin ShowMessage('Acesso Autorizado'); end else ShowMessage('Acesso não liberado'); finally // libera os objetos da memória FreeAndNil(LoginModel); FreeAndNil(LoginDAO); end; end; end;



No evento OnClick do botão btnSair, digite o seguinte o seguinte comando:


Listagem 5: Evento OnClick do Botão btnSair
procedure TfrmLogin.btnSairClick(Sender: TObject); begin Application.Terminate; // encerra a aplicação; end;

Nenhum comentário:

Postar um comentário