<< Click to Display Table of Contents >> Objeto LayoutForm |
![]() ![]() ![]() |
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', 2, 4, 4, LF.Dir);
LF.AddCampo('NM_BANCO' , 'Nome do banco' , 1, 5, 35, LF.Esq);
LF.AddCampo('DT_DATA' , 'Data do cheque' , 60, 5, 10, LF.Esq);
LF.AddCampo('EXTENSO_1', 'Linha extenso 1' , 10, 7, 35, LF.Esq);
LF.AddCampo('EXTENSO_2', 'Linha extenso 2' , 2, 8, 35, LF.Esq);
LF.AddCampo('VL_CHEQUE', 'Valor do cheque' , 65,10, 12, 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' , 2, 2, 6, LF.Dir);
LF.AddCampo('VL_NOTA' , 'Valor da nota' , 70, 2, 10, LF.Dir);
LF.AddCampo('DT_DATA' , 'Data da nota' , 60, 3, 10, LF.Esq);
LF.AddCampo('NM_RAZAO', 'Nome do cliente' , 10, 7, 35, LF.Esq);
// cria a área de produto
LF.AddArea('PRODUTOS', 8, 2, 70, 20, False, [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', 2, 1, 6, LF.Dir, 'PRODUTOS');
LF.AddCampo('VL_UNIT' , 'Valor unitário' , 12, 1, 10, LF.Dir, 'PRODUTOS');
LF.AddCampo('VL_QUANT' , 'Quantidade' , 25, 1, 10, LF.Dir, 'PRODUTOS');
LF.AddCampo('NM_PRODUTO' , 'Nome do produto' , 40, 1, 35, LF.Esq, 'PRODUTOS');
// cria a área de duplicatas
LF.AddArea('DUPLICATA', 2, 10, 100, 18, False, [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' , 1, 1, 10, 1, 2, 'DUPLICATA');
LF.AddCampo('VL_VALOR' , 'Valor do Título' , 9, 1, 10, 1, 2, 'DUPLICATA');
LF.AddCampo('DT_VCTO' , 'Data do Vencimento do Título',20, 1, 10, 0, 2, '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.