Software Development Kit
to the Delphi-Win32 and Free Pascal compilers
Home > Wiki > br/ProjetoAgenda/Artigo1

br/ProjetoAgenda/Artigo1

english (en) | português (pt)



Este é o primeiro de uma série de artigos que apresentam os passos necessários para criar uma aplicação funcional com PressObjects.

Este primeiro artigo apresenta como criar o projeto, corrigir dependências e como criar a parte visual.

Contents

Pré requisitos

  • Delphi 5 ou superior, ou Lazarus
  • Versão recente do PressObjects
  • Componente de conexão a banco de dados que o PressObjects suporte. Por enquanto apenas DOA, FBLib, IBX, SQLdb, UIB ou Zeos com PostgreSQL, Firebird, Interbase ou Oracle.
  • FastMM (opcional)

Instalação

Descompacte o PressObjects e configure o projeto ou a IDE de forma que as pastas {press}\Source\Core e {press}\Source\Brokers possam ser encontradas pelo compilador. No Delphi, coloque as pastas no Library Path da IDE ou em Project | Options | Directories | Search Path do projeto. No Lazarus, coloque as pastas no campo Project | Compiler Options | Other Unit Files. Faça também a instalação do componente de conexão, caso não tenha sido feito, ou ao menos indique o caminho das units. O PressObjects não exige a instalação do componente de conexão, precisa apenas encontrar suas units para que a aplicação possa ser compilada.

Crie a seguinte árvore de diretórios para o projeto (sugestão):

+-{agenda}
  +-Source
    +-Core
    | +-Main
    | | +-vcl5 (ou sua versão de Delphi)
    | | +-lcl
    | +-Custom
    | | +-vcl5
    | | +-lcl
    | +-Contato
    | | +-vcl5
    | | +-lcl
    +-Metadata
    | +-Firebird
    | +-Oracle
    | +-PostgreSQL
    +-Projects
      +-D5 (ou sua versão do Delphi)
      +-Laz

Projeto

Crie um novo projeto, informe o path para localizar o PressObjects (caso necessário, vide informações na área Instalação) e altere o nome do form principal para MainForm.

Dê um File | Save All para gravar os arquivos do projeto:

  • {agenda}\Source\Core\Main\vcl5\MainFrm.pas para o main form
  • {agenda}\Source\Projects\D5\Agenda.dpr para o arquivo principal do projeto

Utilize nome de pasta e extensão do arquivo do projeto conforme IDE utilizada. Caso utilize FastMM, altere o .dpr e inclua a unit FastMM4 antes de todas as outras units.

Nenhum form terá código, com exceção de um. Crie um método para o evento OnKeyDown do MainForm e implemente:

...
implementation

uses
  Dialogs, Clipbrd, PressOPF;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = Ord('9')) and (Shift = [ssShift, ssAlt]) then
  begin
    Clipboard.AsText := PressOPFService.CreateDatabaseStatement;
    ShowMessage('Metadata do banco de dados copiado para o Clipboard');
  end;
end;

end.

A combinação de teclas Shift + Alt + 9 irá copiar o metadata de criação do banco para a área de transferência. Passe a propriedade KeyPreview do Form para True para que este evento funcione.

Crie uma nova unit (apenas o .pas, sem form), grave em {agenda}\Source\Core\Main\Brokers.pas e coloque o seguinte conteúdo:

unit Brokers;

interface

implementation

uses
  PressSubject,
  PressAttributes,
  PressUIBBroker,  // e/ou o negociador para o seu componente de conexão
  PressMessages_ptbr;

initialization
  PressModel.ClassIdStorageName := 'ModelClasses';
  PressModel.DefaultGeneratorName := 'gen_agenda';
  PressModel.DefaultKeyType := TPressInteger;

end.

PressUIBBroker é a unit que registra o conector para o framework OPF. É possível utilizar mais de um conector no mesmo projeto e escolher qual deles irá utilizar através do arquivo de configuração (que será abordado no terceiro artigo).

Dê um build all no projeto a fim de verificar se todas as dependências foram encontradas. Talvez ocorra um erro de compilação na unit MainFrm. Escolha entre fazer uma limpeza no cabeçalho da área interface, ou remover Dialogs da área implementation.

Quando a compilação ocorrer com sucesso neste ponto, provavelmente não ocorrerá mais problema relacionado às dependências do PressObjects em qualquer outro ponto do projeto.

Forms

Crie os forms para a agenda com os seguintes nomes e pastas. Note que os exemplos usam a pasta vcl5, utilize a pasta conforme a versão do Delphi, ou lcl caso esteja construindo o projeto no Lazarus. Dentro dos parênteses estão o nome do form e de qual form ele herda, quando aplicável.

CustomEditForm

  • {agenda}\Source\Core\Custom\vcl5\CustomEditFrm.pas (CustomEditForm)

Crie com pelo menos um botão Gravar (GravarButton) e um Cancelar (CancelarButton).

Retire alguns excessos do form, tal como a área private e public da classe e a variável que apontaria para a instância. Eles não são necessários.

No final da unit, inclua:

uses
  PressVCLBroker, CustomMVP;  // ou PressLCLBroker caso utilize o Lazarus

initialization
  PressVCLForm(TCustomEditPresenter, TCustomEditForm);  // ou PressLCLForm
  // caso utilize o Lazarus, mantenha o código {$I...} gerado pela IDE

end.

Este trecho de código é usado para registrar o form no framework MVP.

CustomQueryForm

  • {agenda}\Source\Core\Custom\vcl\CustomQueryFrm.pas (CustomQueryForm)

Crie este form com um TStringGrid (QueryStringGrid) e um botão Pesquisar (PesquisarButton). Atenção para o nome dos componentes, eles devem ser idênticos aos indicados entre parênteses. É através deste nome que o MVP irá encontrá-los mais tarde.

Adicionar o registro no MVP, da mesma forma que foi feito com o form CustomEditForm, no entanto apontando para as classes TCustomQueryPresenter e TCustomQueryForm.

ContatoEditForm

  • {agenda}\Source\Core\Contato\vcl\ContatoEditFrm.pas (ContatoEditForm - CustomEditForm)

Atenção para a herança de CustomEditForm. Além dos botões herdados, coloque também um TEdit junto com Label para Nome (NomeEdit), Endereço (EnderecoEdit), mais um TComboBox para a Cidade (CidadeComboBox) e um TStringGrid para os telefones (FonesStringGrid). Configure a propriedade FocusControl dos Labels para seus respectivos controles. Não use componentes que possuem Label, use TEdit, do contrário o framework MVP não o reconhecerá (no entanto você poderá criar uma view para ele a fim de utilizá-lo em seu projeto).

Sempre observe o nome dos componentes, é necessário declará-los corretamente para fazer o mapeamento na unit que controla o MVP, e que será escrito mais tarde.

Não esquecer de registrar o Form junto ao framework MVP, referenciando as classes TContatoEditPresenter e TContatoEditForm, e utilizando a unit ContatoMVP:

uses
  PressVCLBroker, ContatoMVP;  // ou PressLCLBroker caso utilize o Lazarus

initialization
  PressVCLForm(TContatoEditPresenter, TContatoEditForm);  // ou PressLCLForm
  // caso utilize o Lazarus, mantenha o código {$I...} gerado pela IDE

end.

ContatoQueryForm

  • {agenda}\Source\Core\Contato\vcl\ContatoQueryFrm.pas (ContatoQueryForm - CustomQueryFrm)

Coloque um TEdit para entrar o nome do contato que será pesquisado (NomeEdit) e um TComboBox para filtrar por cidade (CidadeComboBox). Crie também os Labels e sempre observe o nome dos componentes para evitar erros em runtime.

Registrar o form no final da unit, idêntico ao form ContatoEditForm, no entanto referenciando as classes TContatoQueryPresenter e TContatoQueryForm.

ContatoFoneEditForm

  • {agenda}\Source\Core\Contato\vcl\ContatoFoneEditFrm.pas (ContatoFoneEditForm - CustomEditFrm)

Coloque um TComboBox para o tipo (TipoFoneComboBox), um TEdit para o número (NumeroEdit).

O registro do form referencia as classes TContatoFoneEditPresenter e TContatoFoneEditForm.

Lembre que nenhum dos forms precisa da área private, public, nem da variável que receberia o endereço da instância. A unit ContatoFoneEditForm fica assim:

unit ContatoFoneEditFrm;

interface

uses
  CustomEditFrm, Classes, Controls, StdCtrls;

type
  TContatoFoneEditForm = class(TCustomEditForm)
    TipoFoneLabel: TLabel;
    TipoFoneComboBox: TComboBox;
    NumeroLabel: TLabel;
    NumeroEdit: TEdit;
  end;

implementation

{$R *.DFM}

uses
  PressVCLBroker, ContatoMVP;  // ou PressLCLBroker caso utilize o Lazarus

initialization
  PressVCLForm(TContatoFoneEditPresenter, TContatoFoneEditForm);  // ou PressLCLForm
  // caso utilize o Lazarus, mantenha o código {$I...} gerado pela IDE

end.

CidadeEditForm

  • {agenda}\Source\Core\Contato\vcl\CidadeEditFrm.pas (CidadeEditForm - CustomEditFrm)

Coloque um TEdit para o nome (NomeEdit) e outro para o estado (UFEdit) da cidade. O registro do form referencia as classes TCidadeEditPresenter e TCidadeEditForm.

CidadeQueryForm

  • {agenda}\Source\Core\Contato\vcl\CidadeQueryFrm.pas (CidadeQueryForm - CustomQueryFrm)

Coloque um TEdit para o nome (NomeEdit) da cidade para pesquisa, e registre o form no final da unit referenciando as classes TCidadeQueryPresenter e TCidadeQueryForm.

MainForm

Por fim crie quatro botões no MainForm: Novo Contato (NovoContatoButton), Pesquisar Contato (PesqContatoButton), Pesquisar Cidade (PesqCidadeButton) e Fechar (FecharButton).

A parte visual está pronta. O próximo post irá apresentar como escrever a parte lógica (objetos de negócio e MVP), criar o banco, configurar o conector e finalmente testar a aplicação.

Observações

Normalmente a ordem de construção de uma aplicação é:

  • Projeto e MainForm
  • Unit Brokers
  • Classes de negócio
  • Classes MVP
  • Forms
  • Banco e configuração do conector

Este artigo colocou os forms antes das classes de negócio e classes MVP, para que a parte mais familiar ao programador Delphi/Lazarus fosse apresentada primeiro. O próximo artigo apresentará a construção destas classes.

Neste ponto não é possível compilar o projeto porque os forms dependem das classes MVP, que por sua vez dependem das classes de negócio. O projeto poderá ser compilado novamente no final do segundo artigo.