sábado, 4 de agosto de 2012

Tutorial Delphi - Programa de Cálculo de média com validação


Tutorial Delphi - Programa de Cálculo de média com validação


unit untPrincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls;

type
  TfrmPrincipal = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    edtNomeAluno: TEdit;
    Label2: TLabel;
    edtNota1: TEdit;
    Label3: TLabel;
    edtNota2: TEdit;
    Label4: TLabel;
    edtNota3: TEdit;
    btnMedia: TButton;
    edtMedia: TEdit;
    Label5: TLabel;
    Label6: TLabel;
    resultado: TLabel;
    btnLimpar: TButton;
    procedure btnMediaClick(Sender: TObject);
    procedure edtNota1KeyPress(Sender: TObject; var Key: Char);
    procedure edtNota1Exit(Sender: TObject);
    procedure edtNomeAlunoExit(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure btnLimparClick(Sender: TObject);
    procedure edtNomeAlunoKeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

procedure TfrmPrincipal.btnMediaClick(Sender: TObject);
var
  N1, N2, N3, MEDIA: Currency ;
begin
// StrToCurr    = Converte String para Currency
// StrToCurrDef = Converte String para Currency caso não consiga converter o valor padrão será 0
  N1 := StrToCurrDef(edtNota1.Text, 0);
  N2 := StrToCurrDef(edtNota2.Text, 0);
  N3 := StrToCurrDef(edtNota3.Text, 0);

// Calcula a média
  MEDIA := (N1+N2+N3) / 3;

// Verifica performance do aluno
  if MEDIA >= 7 then
   begin
   resultado.Caption := 'Parabéns pelo seu resultado positivo!';
   resultado.Font.Color := clGreen;
   resultado.Visible := True;
   end
  else if MEDIA < 5 then
   begin
   resultado.Caption := 'Que pena aluno reprovado!';
   resultado.Font.Color := clMaroon;
   resultado.Visible := True;
   end
  else
  begin
    resultado.Caption := 'Recuperação';
    resultado.Visible := True;
    resultado.Font.Color := clBlue;
  end;

// Formata os edits para visualizar os pontos decimais
  edtMedia.Text := FormatCurr('0.00',Media);
  edtNota1.Text := FormatCurr('0.00',N1);
  edtNota2.Text := FormatCurr('0.00',N2);
  edtNota3.Text := FormatCurr('0.00',N3);
  btnLimpar.SetFocus;
end;

procedure TfrmPrincipal.btnLimparClick(Sender: TObject);
begin
// Limpa os campos do formulário
 edtNota1.Text := '';
 edtNota2.Text := '';
 edtNota3.Text := '';
 edtNomeAluno.Text := '';
 edtMedia.Text := '';
 resultado.Visible := False;
 edtNomeAluno.SetFocus;
end;

procedure TfrmPrincipal.edtNomeAlunoExit(Sender: TObject);
var
  edt: TEdit;
  Campo : String;
begin
// Verifica se o campo do nome está preenchido corretamente
  if Sender is TEdit then
  begin
    edt := TEdit(Sender);
    if edt.Text = '' then
    begin
      edt.SetFocus;
      raise Exception.Create('O aluno precisa de um nome!');
    end;
  end;

// Validando o nome do aluno

end;

procedure TfrmPrincipal.edtNota1Exit(Sender: TObject);
var
  edt: TEdit;
  Valor : Currency;
begin
// Verifica se o valor digitado está de acordo com a condição, gerando uma exception caso contrário
  if Sender is TEdit then
  begin
   edt := TEdit(Sender);
   Valor := StrToCurrDef(edt.Text,0);
   edt.Text := FormatCurr('0.00',Valor);
   if ((Valor < 0) or (Valor > 10)) then
   begin
   edt.SetFocus;
   raise Exception.Create('Nota deve estar entre 0 e 10.');
   end;

  end;
end;

procedure TfrmPrincipal.edtNota1KeyPress(Sender: TObject; var Key: Char);
begin
// Se a tecla não for entre 0 e 9 ou virgulas ou a tecla backspace não irá digitar nada
  IF NOT (Key in ['0'..'9',',',#8]) then
   Abort;
end;

procedure TfrmPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AnimateWindow(Handle, 1000, AW_HIDE+AW_BLEND);
end;

procedure TfrmPrincipal.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
// Esta função utiliza a interação com o Windows "SendMessage"
// Faz com que o Enter e as setas para cima e para baixo mudem os campos
  case Key of
  // WM_NEXTDLGCTL -> MUDA O CONTROLE, 0 INDICA PARA O PRÓXIMO, 1 INDICA O ANTERIOR
  // VK_RETURN = ENTER, VK_DOWN = TECLA PARA BAIXO, VK_UP = TECLA PARA CIMA
   VK_RETURN, VK_DOWN : SendMessage(Self.Handle, WM_NEXTDLGCTL, 0, 0);
   VK_UP: SendMessage(Self.Handle, WM_NEXTDLGCTL,1,0);
  end;

// A mesma função acima só que utilizando os recursos so Delphi
{
  case Key of
   VK_RETURN, VK_DOWN : Self.SelectNext(Self.ActiveControl, True, True);
   VK_UP: Self.SelectNext(Self.ActiveControl, False, True);
  end;
}

end;

procedure TfrmPrincipal.edtNomeAlunoKeyPress(Sender: TObject; var Key: Char);
begin
    if (key in ['0'..'9']) then
    begin
    Application.MessageBox('Somente letras por favor.','titulo',MB_ok +
    MB_defbutton1 + MB_iconexclamation);
    Key := #0;
    Abort;
end;
end;
end.

Nenhum comentário:

Postar um comentário