Objeto LayoutForm

<< Click to Display Table of Contents >>

Navigation:  Sistemas > Gestor >

Objeto LayoutForm

Previous pageReturn to chapter overviewNext page

Usando objeto LayoutForm para criar e gerenciar formulários de impressão como Nota Fiscal e Boletos

Exemplo 1:  Impressão de cheques

 

Tabela na base a ser impressa usando o objeto TLayoutForm:

 

Campo

Tipo

NM_CHEQUE

DM_NOME

VL_CHEQUE

DM_VALOR

NM_EXTENSO

DM_NOME

DT_DATA

DATE

 

Crie um novo form com a aparência básica abaixo:

 

 

Componentes:

Componentes visuais

    ModeloCombo : TACombo;

    NovoBtn     : TButton;

    EditarBtn   : TButton;

    ImprimirBtn : TButton;

    SairBtn     : TButton;

 

Componentes não visuais

    RDp         : TRDprint;

    Tb          : TClientDataSet;

 

Campos

    TbNM_CHEQUE : TStringField;

    TbVL_CHEQUE : TFloatField;

    TbNM_EXTENSO: TStringField;

    TbDT_DATA   : TDateField;

 

private do form

    LF          : TLayoutForm;   // uses LayoutFormUnit

 

Eventos do Form:

procedure TExemploLayoutForm.FormCreate(Sender: TObject);

begin

  LF := TLayoutForm.Create(Self);                             // cria o objeto

  LF.InicializaCampos := SetaPadrao;                          // associa o evento

  LF.InicializaLayout(Rdp, TComboBox(ModeloCombo), 'CHEQUE'); // inicializa propriedades

end;

 

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

begin

  LF.Free;  // Willy

end;

 

O método InicializaLayout possui 3 parametros:

 

procedure InicializaLayout(RDp: TRDPrint; Combo: TComboBox; const Tipo: string);

 

RDPrint – Liga o componente de layout a um RDPrint para facilitar o processo de impressão

Combo – Associa a um componente descendente de um TComboBox para atualizar os tipos de layout existentes.

Tipo – um string que identifica o tipo de formulário a ser  trabalhado, se não existir será criado pelo objeto

 

Evento para criar o modelo de formulário padrão:

procedure TExemploLayoutForm.SetaPadrao(Sender: TObject);

begin

  LF.Fonte   := [normal];  // opcional: normal, comp12, comp17 e comp20 [normal]

  LF.Colunas := 137;       // opcional: 1-160 [80]

  LF.Linhas  :=  10;       // opcional: 1-88  [66]

 

  // estes comandos adicionam a "estrutura" padrão da nota, com as posições padrões

  LF.AddCampo('NR_CHEQUE''Número do cheque',  24,  4, LF.Dir);

  LF.AddCampo('NM_BANCO' , 'Nome do banco'   ,  1535, LF.Esq);

  LF.AddCampo('DT_DATA'  , 'Data do cheque'  , 60510, LF.Esq);

  LF.AddCampo('EXTENSO_1''Linha extenso 1' , 10735, LF.Esq);

  LF.AddCampo('EXTENSO_2''Linha extenso 2' ,  2835, LF.Esq);

  LF.AddCampo('VL_CHEQUE''Valor do cheque' , 65,1012, LF.Dir);

end;

 

Este método é associado ao evento “InicializaCampos” do objeto LayoutForm. Ele “ensina” para o objeto quais são os itens a serem usados na impressão, bem como fonte e tamanho do formulário.

 

Parâmetros do método AddCampo do LayoutForm:

 

procedure AddCampo(const FieldName: string; Descricao: string = ''; DefaultX: Integer = 1

 DefaultY: Integer = 1; DefaultSize: Integer = 10; DefaultAlign: Integer = 0

 Area: string = ''; DefaultVisivel: Boolean = True);

 

FieldName – Nome do campo, sugestão é colocar o mesmo nome do que está no DataSet para facilitar a transferência de dados para impressão

Descrição – Descrição aparece na tela que o usuário configura o formulário, é opcional, mas pode ajudar muito na tela de configuração

DefaultX – Posição padrão X (coluna – valores válidos: 1-88)

DefaultY – Posição padrão Y (linha – valores válidos 1-160)

DefaultSize – Tamanho do texto a ser impresso neste item (até 160)

DefaultAlign – Alinhamento: 0 = esquerda, 1 = direita e 2 = centralizado, pode-se usar as constantes LayoutForm.Esq, LayoutForm.Dir e LayoutForm.Centro

GroupColor - deve ser indicado um valor inteiro de 0..9, onde na tela de configuração ele diferenciara por cor, os grupos de dados

Área – se for um formulário com áreas de impressão como Produtos no caso de nota fiscal,  indique o nome da área neste campo

DefaultVisivel – Se True, este campo é impresso. Se False ele é preenchido mas não impresso.

 

Botão NovoBtn.Click:

 

procedure TExemploLayoutForm.NovoBtnClick(Sender: TObject);

begin

  // abre a tela do configurador com novo layout baseando-se

  // no layout padrão (procedure SetaPadrao)

  LF.CriarNovo;  

end;

 

Botão EditarBtn.Click:

 

procedure TExemploLayoutForm.EditarBtnClick(Sender: TObject);

begin

  // abre a tela do configurador com o layout selecionado no combobox

  // para edição

  LF.Editar;

end;

 

Botão ImprimirBtn.Click:

 

procedure TExemploLayoutForm.ImprimirBtnClick(Sender: TObject);

begin

  // o método abrir faz aparecer uma tela para selecionar a impressora

  if not LF.Abrir then Exit;

 

  // looping de impressão

  Tb.First;

  while not Tb.EOF do

  begin

    // Este método (SetTextFromDataset) aceita um DataSet como parâmetro, ele transfere o 

    // DisplayText de todos os TFields cujo FieldName é o mesmo dos que criamos ao usar

    // o método SetaPadrao na rotina AddCampo. Caso queria definir um campo em especial

    // use LF.SetText

    LF.SetTextFromDataset(Tb);  

 

    // O método Imp percorre todos os Itens de impressão e imprime-os nas suas posições      

    // conforme configuradas

    LF.Imp;

    Tb.Next;

  end;

 

  // Fechar finaliza a impressão

  LF.Fechar;

end;

 

Pronto. Como apenas estes códigos é possível criar vários layouts para um tipo de formulário

Exemplo 2: Impressão de nota fiscal (usando áreas)

 

Para impressão de áreas (uma área, seria como a parte de produtos que repete x vezes no mesmo formulário), vamos usar os mesmos métodos do exemplo anterior (já explicados), porém vamos modificar poucas coisas:

 

Tabela cabeçalho de nota (Tb)

 

Campo

Tipo

NR_NOTA

DM_INT

VL_NOTA

DM_VALOR

NM_RAZAO

DM_NOME

DT_DATA

DATE

 

Tabela itens de nota  (TbItens)

 

Campo

Tipo

CD_PRODUTO

DM_INT

NM_PRODUTO

DM_NOME

VL_UNIT

DM_VALOR

VL_QUANT

DM_VALOR

Eventos do Form:

 

procedure TExemploLayoutForm.FormCreate(Sender: TObject);

begin

  LF := TLayoutForm.Create(Self);                             // cria o objeto

  LF.InicializaCampos := SetaPadrao;                          // associa o evento

  LF.InicializaLayout(Rdp, TComboBox(ModeloCombo), 'NOTA FISCAL'); 

end;

 

Única coisa que muda deste exemplo para o outro é o tipo de formulário (nota fiscal)

 

Evento para criar o modelo de formulário padrão:

 

procedure TExemploLayoutForm.SetaPadrao(Sender: TObject);

begin

  LF.Fonte   := [normal];  

 

  // estes comandos adicionam a "estrutura" padrão da nota, com as posições padrões

  LF.AddCampo('NR_NOTA' , 'Número da nota'  ,  22,  6, LF.Dir);

  LF.AddCampo('VL_NOTA' , 'Valor da nota'   , 70210, LF.Dir);

  LF.AddCampo('DT_DATA' , 'Data da nota'    , 60310, LF.Esq);

  LF.AddCampo('NM_RAZAO''Nome do cliente' , 10735, LF.Esq);

 

  // cria a área de produto

  LF.AddArea('PRODUTOS'827020False, [comp17]);

 

  // estes campos pertence a área de produtos (note que todos eles o numero do Y = 1)

  LF.AddCampo('CD_PRODUTO' , 'Código do produto',  21,  6, LF.Dir, 'PRODUTOS');

  LF.AddCampo('VL_UNIT'    , 'Valor unitário'   , 12110, LF.Dir, 'PRODUTOS');

  LF.AddCampo('VL_QUANT'   , 'Quantidade'       , 25110, LF.Dir, 'PRODUTOS');

  LF.AddCampo('NM_PRODUTO' , 'Nome do produto'  , 40135, LF.Esq, 'PRODUTOS');

 

  // cria a área de duplicatas

  LF.AddArea('DUPLICATA'21010018False, [comp17],3);

 

  // estes campos pertence a área de duplicatas, onde serão divididos em três colunas dentro da area

  LF.AddCampo('NR_TITULO' , 'Número do Título'            , 111012'DUPLICATA');

  LF.AddCampo('VL_VALOR'  , 'Valor do Título'             , 911012'DUPLICATA');

  LF.AddCampo('DT_VCTO'   , 'Data do Vencimento do Título',2011002'DUPLICATA');

end;

 

Aqui você pode notar que é chamado o método AddArea. Este criar uma “área” de impressão, os demais campos (AddCampo abaixo do AddArea) possuem mais um parâmetro chamado ‘PRODUTOS’, que indica ao componente que todos os 4 ultimos campos pertencem a área “Produtos”.

 

Sintaxe do AddArea:

 

procedure AddArea(const Nome: string; const X, Y, Largura, Altura: Integer; const ANegrito: Boolean; const Fonte: TFonte);

 

Nome – Nome da área que será referenciada pelos campos que estiverem dentro da mesma através do AddCampo

X e Y – Posição X (coluna) e Y (linha) do inicio da área em questão

Largura e Altura – Em caracteres e linhas. No exemplo acima foi indicado que a área conterá até 20 produtos

ANegrito – Se True coloca fonte em negrito

Fonte – Fonte usado em todos os campos desta área

QtColuna - Indica quantas colunas que será dividido os dados dentro da área

 

Podem ser adicionados tantas áreas quanto necessário. E tantos campos dentro de cada área.

 

Os botões Novo e Editar ficam igual ao exemplo anterior.

 

Botão ImprimirBtn.Click:

 

Este exemplo imprime apenas 1 nota (1 registro de Tb, e vários [produtos] de TbItens)

 

procedure TExemploLayoutForm.ImprimirBtnClick(Sender: TObject);

begin

  // o método abrir faz aparecer uma tela para selecionar a impressora

  if not LF.Abrir then Exit;

 

  // impressão do cabeçalho

  LF.SetTextFromDataset(Tb);  

  LF.Imp(False);  // False = não avança página ao terminar o cabeçalho

 

  // looping de impressão dos itens

  TbItens.First;

  while not TbItens.EOF do

  begin

    // Este método (SetTextFromDataset) aceita um DataSet como parâmetro, ele transfere o 

    // DisplayText de todos os TFields cujo FieldName é o mesmo dos que criamos ao usar

    // o método SetaPadrao na rotina AddCampo. Caso queria definir um campo em especial

    // use LF.SetText

    LF.SetTextFromDataset(TbItens);  

 

    // O método ImpArea imprime 1 linha da área de produtos conforme configurada

    LF.ImpAreaLn('PRODUTOS');

 

    Tb.Next;

  end;

  // este método efetua a leitura do ClientDataSet e atravez do parâmetro "QtColuna", 

  // estabelecido na área ele divide os dados em colunas que são impressas dentro da área

  LF.ImpAreaColunaLn(Tbfatura,'DUPLICATA');

 

  // Avança página

  RDp.NovaPagina;

 

  // Fechar finaliza a impressão

  LF.Fechar;

end;

 

Usando a tela do configurador:

Ao abrir a tela do configurador estas opções estarão disponíveis:

 

 

O modo interativo

 

 

Tudo que for feito no modo interativo reflete no modo literal e vice-versa, tanto faz o usuário usar um modo ou outro.