Postagens Recentes

terça-feira, 10 de dezembro de 2013

Fundamentos da Orientação a Objetos

Olá pessoal, hoje vou falar sobre os fundamentos básicos da Orientação a Objetos.

O que é necessário para uma linguagem ser considerada orientada a objetos?

Bom, para uma linguagem ser considerada orientada a objetos ela necessita implanta pelo menos quatro princípios básicos da orientação a objetos:



  1. Abstração: Faz-se uso deste conceito ao abstrair as coisas do mundo real e pegar somente o que for relevante para a classe. Por exemplo, se eu quisesse fazer uma aplicação para manipular e armazenar dados de um aluno, eu deveria pegar os dados que permita-me identificar um aluno como: Nome, Curso, Turma e HorarioAula. Estes são chamados atributos. Muito falaremos de “atributos”, como sendo partes de classes. Um aluno tem muitas características, porém só nos interessa pegar o que nos for relevante para nossa aplicação.
  2. EncapsulamentoÉ a capacidade de "ocultar" detalhes de implementação. objetivo principal do Encapsulamento é tornar o objeto independente da sua implementação interna, para isso, a implementação das propriedades e métodos da classe são "ocultadas". Desta forma, quem for utilizar nossa classe não precise conhecer sua implementação, apenas a interface do objeto para poder utilizá-la.
  3. Herança: É capacidade herdar atributos, métodos e comportamentos de outra classe.
  4. Polimorfismo: É a possibilidade de um objeto assumir várias formas, ou seja, o(s) método(s) desse objeto pode(m) assumir várias formas.
Esses são, digamos assim, os pilares da POO.
Muito em breve estarei demonstrando na pática como isso tudo funciona.

Espero que tenham gostado e qualquer dúvida deixem seus comentários.
Read more ...

quinta-feira, 21 de novembro de 2013

Tratamentos de erro

Saudações!

Hoje vou falar sobre tratamentos de exceções ou erros como muitos estão acostumados.

Uma exceção é levantada quando um erro ou outras interrupções de eventos  é gerado em um programa. A exceção transfere o controle para um manipulador de exceção, que permite separar a lógica normal do programa de tratamento de erros. Como as exceções são objetos, eles podem ser agrupados em hierarquias usando herança, e novas exceções podem ser introduzidas sem afetar o código existente. Uma exceção pode transportar informação, tais como uma mensagem de erro, a partir do ponto em que é aumentada para o ponto onde ele é tratado.

Quando um aplicativo usa a unidade SysUtils, a maioria dos erros de execução são convertidas automaticamente em exceções. Muitos erros que poderiam encerrar um aplicativo - como memória insuficiente, a divisão por zero, e falhas de proteção geral - podem ser capturados e manipulados. Help Embarcadero Rad Studio - XE3

O que acha de apresentar um exemplo?

Por exemplo, digamos que queremos validar uma data que o usuário informa no momento em que está realizando a manutenção de um cliente. Sem querer, o usuário informa o seguinte valor: ExpertDelphi.
Quando o usuário clicar em Salvar (estou considerando que será validado a data apenas no momento em que for pressionado o botão Salvar), o sistema emitirá a seguinte mensagem:

''ExpertDelphi'' is not a valid date.

Para evitarmos que o usuário receba este tipo de mensagem, pode ser feito o seguinte tratamento:

  procedure proValidaData(const Value: ShortString);
  begin
    try
      StrToDate(Value);
    except
      ShowMessage('Data inválida');
    end;
  end;

No evento OnClick de um botão, chame a procedure da seguinte forma: proValidaData('ExpertDelphi');

Veja que agora foi emitido uma mensagem personalizada para o usuário.

Agora vamos melhorar um pouco mais a procedure proValidaData.

procedure proValidaData(const Value: ShortString);
  begin
    try
      StrToDate(Value);
    except
      on E: Exception do
        ShowMessage('Data inválida.' + #13 + 'Mensagem original: ' + E.Message);
    end;

  end;

Ao chamar a procedure proValidaData('ExpertDelphi'), será apresentado a seguinte mensagem:

Data inválida.
Mensagem original: ''ExpertDelphi'' is not a valid date

Note que agora, além de mostrarmos a mensagem personalizada para o usuário, também mostramos a mensagem original.


Read more ...

quarta-feira, 23 de outubro de 2013

Programação orientada a objetos - 1º Parte

Olá amigos,
Quero apresentar meu primeiro artigo sobre Programação Orientada à Objetos usando Delphi.

O objetivo deste artigo é mostrar na prática como criar um programa orientado à objeto em Delphi, não apresentar conceitos sobre Orientação à Objetos.

Precisamos desenvolver um programa Orientado a Objeto para cadastrar clientes.
Para cada clientes cadastrado temos o Nome, CPF e a Data de nascimento.

- Crie um novo projeto e salve como POO_Delphi.

- Crie uma nova Unit, salve com o nome uPessoa e coloque o código abaixo:

unit uPessoa;

interface

uses
  // Foi declaro esta uses por causa do TDateTime
  SysUtils;

type TPessoa = class(TObject)
  protected
    FNome: string;
    FCpf: string;
    FDtNasc: TDateTime;
  public
    property Nome: string read FNome write FNome;
    property CPF: string read FCpf write FCpf;
    property DtNasc: TDateTime read FDtNasc write FDtNasc;
end;

implementation

{ TPessoa }

end.

- Crie um novo formulário, coloque 2 TGroupBox, três TLabel, dois TEdit, um TListView e um TMaskEdit.
- Em uses (logo depois da interface, inclua a unit uPessoa.
- Altere a propriedade Name e Caption de cada um deles conforme mostrado abaixo:

   TGroupBox - gbxCadastro - Cadastro
   TGroupBox - gbxConsulta - Consulta
   TLabel - lbNome - Nome:
    TLabel - lbCPF - CPF:
   TLabel - lbDtNasc - Dt. nasc.:
    TEdit - eNome
   TEdit - eCPF
    TButton - btnSalvar - Salvar
   TButton - btnRemover - Remover
   TMaskEdit - meDtNasc

   * Atenção *
   TListView - Name: lvConsulta
   ReadOnly: True
   RowSelect: True
   ViewStyle: vsReport
   Columns adicione 4 colunas e altere a propriedade Caption de cada uma das colunas.
   Código, Nome, CPF e Dt. nasc.
 
- Declare a procedure e a function na seção private

   procedure proGravaRegistro(const Value: TPessoa; ListView: TListView);
   function fncGetRegistro(ListView: TListView): TPessoa;

- Implemente a procedure e a function declarada

procedure TfrmMain.proGravaRegistro(const Value: TPessoa; ListView: TListView);
begin
  with ListView.Items, Add do
  begin
    Caption := IntToStr(ListView.Items.Count);
    SubItems.Add(Value.Nome);
    SubItems.Add(Value.CPF);
    SubItems.Add(DateToStr(Value.DtNasc));
  end;
end;

function TfrmMain.fncGetRegistro(ListView: TListView): TPessoa;
begin
  Result := TPessoa.Create;

  if Assigned(lvConsulta.Selected) then
  begin
    Result.Nome := ListView.Items.Item[ListView.Selected.Index].SubItems[0];
    Result.CPF := ListView.Items.Item[ListView.Selected.Index].SubItems[1];
    Result.DtNasc := StrToDate(ListView.Items.Item[ListView.Selected.Index].SubItems[2]);
  end;
end;

- No evento do OnClick do botão btnSalvar, implemente o seguinte código:

procedure TfrmMain.btnSalvarClick(Sender: TObject);
  procedure proConsiste(Value: TCustomEdit; Msg: string);
  begin
    if Trim(Value.Text) = '' then
    begin
      ShowMessage(Msg);
      Value.SetFocus;
      Abort;
    end;
  end;

var
  _rPessoa: TPessoa;
begin
  proConsiste(eNome, 'Informe o nome.');
  proConsiste(eCPF, 'Informe o CPF.');
  proConsiste(meDtNasc, 'Informe a data de nascimento.');

  try
    StrToDate(meDtNasc.Text);
  except
    ShowMessage('Data de nascimento não é uma data válida.');
    meDtNasc.SetFocus;
    Abort;
  end;

  _rPessoa := TPessoa.Create;
  try
    _rPessoa.Nome := eNome.Text;
    _rPessoa.CPF := eCPF.Text;
    _rPessoa.DtNasc := StrToDate(meDtNasc.Text);

    proGravaRegistro(_rPessoa, lvConsulta);

    ShowMessage('Cadastro realizado com sucesso!');
    eNome.Clear;
    eCPF.Clear;
    meDtNasc.Clear;
  finally
    _rPessoa.Free;
  end;
end;

- No evento OncClick do btnRemover, implemente o seguinte código:

procedure TfrmMain.btnRemoverClick(Sender: TObject);
begin
  if not Assigned(lvConsulta.Selected) then
    ShowMessage('Selecione um registro.')
  else
    begin
      lvConsulta.Selected.Delete;
      eNome.Clear;
      eCPF.Clear;
      meDtNasc.Clear;
    end;
end;

- No evento OnClick do lvConulta, implemente o seguinte código:

procedure TfrmMain.lvConsultaClick(Sender: TObject);
var
  _rPessoa: TPessoa;
begin
  _rPessoa := fncGetRegistro(lvConsulta);

  try
    if _rPessoa.Nome <> '' then
    begin
      eNome.Text := _rPessoa.Nome;
      eCPF.Text := _rPessoa.CPF;
      meDtNasc.Text := DateToStr(_rPessoa.DtNasc);
    end;
  finally
    _rPessoa.Free;
  end;
end;

- Execute o programa que acabamos de desenvolver, preencha os campos e teste as funcionalidades.

Bem pessoal, espero ter colaborado e qualquer dúvida postem aqui que eu responderei o mais rápido possível.

Em breve estarei postando a segunda parte desta série. Aguardem...

Você pode baixar o fonte do programa clicando aqui,
Read more ...

terça-feira, 15 de outubro de 2013

Procedimentos e Funções

Olá Delphianos, hoje vamos falar um pouco sobre procedimentos (procedures) e funções (funtions).
Mas por que criar procedimentos e/ou funções?
R: Podemos (ou devemos?) criar procedimentos e/ou funções simplesmente por uma questão de modularização do código ou por uma questão de reutilização da rotina.

Definição:

Procedimentos/funções (procedure/function), as vezes chamados apenas de rotinas, são blocos de códigos que podem ser chamados de lugares diferentes dentro de um programa.
  • Procedimento: Um procedimento é o tipo de rotina que não devolve um valor para quem o chamou.
    • Exemplo: Application.Terminate; O objetivo do método é encerrar a aplicação, ou seja, não precisa devolver nada, apenas faz.
  • Funções: Funções é o contrário do procedimento, ou seja, uma função sempre vai devolver um valor para quem a chamou.
    • Exemplo: Quando queremos saber se um TEdit está selecionado (foco), podemos chamar a função Focused que retorna True/False.
Declaração de uma procedure:
  • A assinatura de uma procedure é dada de duas formas:
    • procedure <nome_procedure>;
    • procedure <nome_procedure>(Parametro: Tipo);
      • Exemplo: 
      • procedure limpaMemo(Memo: TMemo);
      • begin
        • Memo.Lines.Clear;
      • end;
Declaração de uma function:
  • Para uma function também é possível passar uma parâmetro. Veja:
    • function <nome_function>: Tipo;
    • function <nome_function>(Parametro: Tipo): Tipo;
      • Exemplo:
        • function contarLinhas(Memo: TMemo): Integer;
        • begin
          • Result := Memo.Lines.Count - 1;
        • end;
  • Observações: 
    • Toda function possui a variável Result que é declara implicitamente na function e sempre será do tipo que foi declarado no final da function, no nosso exemplo, Integer.
    • Em Delphi/Pascal, quando atribuímos um valor para Result, o programa segue normalmente até encontrar uma instrução que interrompa a execução do código, por exemplo, end, Break, Exit, Abort.

Bom pessoal, espero que tenham gostado deste primeiro artigo.
No blog também será apresentado códigos e dicas para usuários avançados. Está primeira parte foi apenas para deixarmos claro a diferença entre procedure e function para aqueles que estão começando.

Abraços!
Read more ...

segunda-feira, 14 de outubro de 2013

Programação orientada a objetos

Aguardem... disponibilizarei uma matéria sobre Programação Orientada a Objetos em Delphi.
Não deixem de conferir!

Enviem sugestões para scsoftwarectba@gmail.com ou scsoftware@hotmail.com
Read more ...

Saudações

Olá Delphianos, é com muito prazer que inicio este blog onde irei postar assuntos relacionados ao desenvolvimento Delphi.
Read more ...