Esse artigo faz parte da revista Clube Delphi edição 11. Clique aqui para ler todos os artigos desta edição



Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.

Componente TFrame

Mais um recurso de reutilização de código disponibilizado pelo Delphi

 

A utilização de frames em um projeto é mais um recurso de reutilização de código disponibilizado pelo Delphi. É como se fosse um formulário modelo, com a diferença de permitir a inclusão de objetos e códigos, que podem ser reaproveitados.

         O uso de frames segue aos padrões da programação orientada à objetos: as alterações feitas em um frame são automaticamente refletidas em todos os formulários no qual  foi utilizado. E o código inserido nos frames filhos não alteram a funcionalidade primária do frame pai.

         No exemplo deste artigo iremos criar um frame contendo cinco botões e um DataSource. O seu funcionamento será  semelhante ao de um DbNavigator.

         Para criar o frame vá ao menu File/New e clique duas vezes sobre a  opção Frame. Altere as propriedades width e height para 120 e 200. Insira um objeto DataSource e configure sua propriedade name para DS1. Insira mais cinco objetos Tbitbtn, e configure-os de acordo com a tabela abaixo:

 

 

 

 

         O código dos botões está listado abaixo:

type

  TFrame2 = class(TFrame)

private

    { Private declarations }

    opc :Char;

    Procedure LigaBotoes;

  public

end;

 

//Procedore para controlar o estado  dos botões

 

Procedure TFrame2.LigaBotoes;

begin

    BtInclui.Enabled := not BtInclui.Enabled;

    BtAltera.Enabled := not BtAltera.Enabled;

    BtExclui.Enabled := not BtExclui.Enabled;

    BtGrava.Enabled  := not BtGrava.Enabled;

    BtDesfaz.Enabled := not BtDesfaz.Enabled;

end;

 

procedure TFrame2.BtIncluiClick(Sender: TObject);

begin

    If Ds1.Dataset.Active Then

    Begin

       LigaBotoes;

       Opc := 'I';

       Ds1.Dataset.Append;

    End

    Else

       ShowMessage('A Tabela não está aberta !');

end;

 

procedure TFrame2.BtAlteraClick(Sender: TObject);

begin

    If Ds1.Dataset.Active Then

    Begin

       LigaBotoes;

       Opc := 'A';

       Ds1.Dataset.Edit;

    End

    Else

       ShowMessage('A Tabela não está aberta !');

end;

 

procedure TFrame2.BtExcluiClick(Sender: TObject);

begin

    If Ds1.Dataset.Active Then

    Begin

       LigaBotoes;

       Opc := 'E';

    End;

end;

 

procedure TFrame2.BtGravaClick(Sender: TObject);

begin

   If Ds1.Dataset.Active Then

   Begin

      Case Opc Of

         'I','A': Ds1.Dataset.Post;

         'E'    : Ds1.Dataset.Delete;

      End;

      LigaBotoes;

   End

   Else

      ShowMessage('A Tabela não está aberta !');

end;

 

procedure TFrame2.BtDesfazClick(Sender: TObject);

begin

   If Ds1.Dataset.Active Then

   Begin

      Ds1.Dataset.Cancel;

      LigaBotoes;

   End

   Else

      ShowMessage('A Tabela não está aberta !');

end;

 

         Vamos criar um formulário para ilustrar a idéia de reutilização de código através de Frames. Imagine um form no qual o usuário pode incluir registros em várias tabelas. Normalmente, utilizamos um PageControl para esta situação e temos muito trabalho para programar todas as TabSheets. A proposta é criar um  tipo de formulário onde não tenhamos que programar muito para efetuar a gravação dos registros nessas tabelas.

         Em um formulário vazio, coloque um PageControl (palheta Win32), clique com o botão inverso do mouse e escolha a opção New Page. Repita isto para criar a Segunda página. Altere a propriedade Caption da primeira TabSheet para Animais e a Segunda para Países.

 

         Insira um botão para Sair do programa e Duas Tables. Com as seguintes configurações:

 

 

         Após incluir estes componentes a aparência do formulário deverá ser parecida com a figura abaixo:

 

 

         Vamos inserir um frame em cada TabSheet. Selecione o objeto Tframe (palheta standard) e insira-o na primeira TabSheet. Na janela de seleção de frames, selecione Frame2 e Clique Ok. Repita a operação para inserir o frame na Segunda TabSheet. A aparência do formulário serrá parecida com a figura a seguir.

 

 

         Selecione o DataSource do primeiro frame e preencha a propriedade DataSet com  o nome da tabela de animais(TbAnimais). Faça o mesmo com o DataSource do segundo frame ligando-o a Tabela de países (TbPaises). Insira na primeira TabSheet quatro  componentes DbEdit e quatro Labels. Configure as propriedades dos objetos da seguinte forma:

 

 

 

O formulário terá a seguinte aparência:

 

         Coloque por cima dos Labels e dos DbEdits um DbGrid ocultando os componentes que já estavam na página. Clique duas vezes sobre o DbGrid,  insira uma coluna e altere suas propriedades:

 

 

Configure a propriedade DataSource do objeto DbGrid para Frame21.DS1

 

         Repita os procedimentos para colocar os Labels, DbEdits e o DbGrid na Segunda TabSheet, seguindo a listagem abaixo:

 

 

 

O código utilizado nos botões está descrito abaixo:

 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  StdCtrls, Buttons, ComCtrls, Db, DBTables, frmcadastro, DBCtrls, Mask,  Grids, DBGrids;

type

TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

BitBtn1: TBitBtn;

TbAnimais: TTable;

TbPaises: TTable;

Frame22: TFrame2;

Frame21: TFrame2;

DBEdit1: TDBEdit;

DBEdit2: TDBEdit;

DBEdit3: TDBEdit;

DBEdit4: TDBEdit;

DBGrid1: TDBGrid;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

DBGrid2: TDBGrid;

DBEdit5: TDBEdit;

DBEdit6: TDBEdit;

DBEdit7: TDBEdit;

DBEdit8: TDBEdit;

DBEdit9: TDBEdit;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

         procedure FormShow(Sender: TObject);

         procedure FormClose(Sender: TObject; var Action: TCloseAction);

         procedure Frame21BtIncluiClick(Sender: TObject);

         procedure Frame21BtAlteraClick(Sender: TObject);

         procedure Frame21BtExcluiClick(Sender: TObject);

         procedure Frame21BtGravaClick(Sender: TObject);

         procedure Frame21BtDesfazClick(Sender: TObject);

         procedure Frame22BtIncluiClick(Sender: TObject);

         procedure Frame22BtAlteraClick(Sender: TObject);

         procedure Frame22BtExcluiClick(Sender: TObject);

         procedure Frame22BtGravaClick(Sender: TObject);

         procedure Frame22BtDesfazClick(Sender: TObject);

  private

  public

  end;

 

var

  Form1: TForm1;

implementation

{$R *.DFM}

 

procedure TForm1.FormShow(Sender: TObject);

begin

   TbAnimais.Open;

   TbPaises.Open;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

   TbAnimais.Close;

   TbPaises.Close;

end;

 

procedure TForm1.Frame21BtIncluiClick(Sender: TObject);

begin

  DbGrid1.Visible := False;

  Frame21.BtIncluiClick(Sender);

end;

 

procedure TForm1.Frame21BtAlteraClick(Sender: TObject);

begin

  DbGrid1.Visible := False;

  Frame21.BtAlteraClick(Sender);

end;

 

procedure TForm1.Frame21BtExcluiClick(Sender: TObject);

begin

  DbGrid1.Visible := False;

  Frame21.BtExcluiClick(Sender);

end;

 

procedure TForm1.Frame21BtGravaClick(Sender: TObject);

begin

  Frame21.BtGravaClick(Sender);

  DbGrid1.Visible := True;

end;

 

procedure TForm1.Frame21BtDesfazClick(Sender: TObject);

begin

  Frame21.BtDesfazClick(Sender);

  DbGrid1.Visible := True;

end;

 

procedure TForm1.Frame22BtIncluiClick(Sender: TObject);

begin

  DbGrid2.Visible := False;

  Frame22.BtIncluiClick(Sender); 

end;

 

procedure TForm1.Frame22BtAlteraClick(Sender: TObject);

begin

  DbGrid2.Visible := False;

  Frame22.BtAlteraClick(Sender);

end;

 

procedure TForm1.Frame22BtExcluiClick(Sender: TObject);

begin

  DbGrid2.Visible := False;

  Frame22.BtExcluiClick(Sender);

end;

 

procedure TForm1.Frame22BtGravaClick(Sender: TObject);

begin

  DbGrid2.Visible := True;

  Frame22.BtGravaClick(Sender);

end;

 

procedure TForm1.Frame22BtDesfazClick(Sender: TObject);

begin

  DbGrid2.Visible := True;

  Frame22.BtDesfazClick(Sender);

end;

end.

 

         O código fonte deste formulário é muito reduzido graças a utilização destes dois frames. É importante notar que novos componentes não podem ser inseridos na instância do frame, mas somente  em sua versão original.

Este aplicativo está disponível para download, no site do ClubeDelphi. Clique na seção Forms, selecione o item banco de dados e baixe o arquivo frame11.zip.