Etiqueta com Fast Report
Bom dia.
Preciso fazer a impressão de etiquetas para papel Pimaco e gostaria de saber como faz pra definir o inicio da impressão a partir de uma linha especifica. Começar a imprimir a partir da terceira linha de impressão, por exemplo.
Obrigado!!
Preciso fazer a impressão de etiquetas para papel Pimaco e gostaria de saber como faz pra definir o inicio da impressão a partir de uma linha especifica. Começar a imprimir a partir da terceira linha de impressão, por exemplo.
Obrigado!!
Raylan Zibel
Curtidas 2
Melhor post
Raylan Zibel
06/01/2016
Fiz com array of array of string. Os primeiros registros vazios determinam a posição inicial para impressão.
//-----------------------------------------TABELA COM AS ETIQUETAS--------------------------------------------// type TEtiquetas = array of array of string;
//-----------------------------------------ROTINA DE IMPRESSÃO----------------------------------------------//
procedure EtiquetaPimacoFast(Etiquetas: TEtiquetas);
{
uses DateUtils, frxClass, Math;
}
const
TamFonte: Byte = 10;
AlturaLinha: Byte = 15; // pixels // menor que 15 depende da fonte
InchToPixel: Byte = 96; // 1 polegada
var
x, y: Byte;
i, j: Byte;
LinhaAtual: Byte;
TotLinha, TotColuna: Byte;
AlturaEtiqueta, LarguraEtiqueta: Double;
MargemEsquerda, MargemDireita: Double;
MargemSuperior, MargemInferior: Double;
AlturaFolha, LarguraFolha: Double;
Report: TfrxReport;
Page: TfrxReportPage;
Band: TfrxBand;
Memo: TfrxMemoView;
procedure novaPagina;
begin
// lendo ini // valores alternativos são de modelo A4->2x6 // valores em milímetros
LarguraEtiqueta := (IniReadFlt('REPORT', 'LARGURA_ETIQUETA', 90.00));
AlturaEtiqueta := (IniReadFlt('REPORT', 'ALTURA_ETIQUETA', 45.00));
MargemSuperior := (IniReadFlt('REPORT', 'MARGEM_SUPERIOR', 10.00));
MargemInferior := (IniReadFlt('REPORT', 'MARGEM_INFERIOR', 10.00));
MargemEsquerda := (IniReadFlt('REPORT', 'MARGEM_ESQUERDA', 10.00));
MargemDireita := (IniReadFlt('REPORT', 'MARGEM_DIREITA', 10.00));
LarguraFolha := (IniReadFlt('REPORT', 'LARGURA_FOLHA', 210.00));
AlturaFolha := (IniReadFlt('REPORT', 'ALTURA_FOLHA', 290.70));
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
TotLinha := Floor((AlturaFolha - MargemSuperior - MargemInferior) / AlturaEtiqueta);
// cria página
Page := TfrxReportPage.Create(Report);
Page.CreateUniqueName;
Page.SetDefaults;
// configura página
Page.Width := LarguraFolha;
Page.Height := AlturaFolha;
Page.TopMargin := MargemSuperior;
Page.BottomMargin := MargemInferior;
Page.LeftMargin := MargemEsquerda;
Page.RightMargin := MargemDireita;
// converte pra pixels pra posicionar os MemoViews
MargemEsquerda := MmToInch(MargemEsquerda) * InchToPixel;
MargemSuperior := MmToInch(MargemSuperior) * InchToPixel;
LarguraEtiqueta := MmToInch(LarguraEtiqueta) * InchToPixel;
AlturaEtiqueta := MmToInch(AlturaEtiqueta) * InchToPixel;
// cria banda na página
Band := TfrxReportTitle.Create(Page);
Band.CreateUniqueName;
Band.Top := 0;
Band.Height := Page.Height;
end;
procedure GravaMemo(Valor: string; Alinhamento: TfrxHAlign; Fonte: TFontStyles);
begin
// cria memo na banda da página
Memo := TfrxMemoView.Create(Band);
Memo.CreateUniqueName;
// configura memo
Memo.Text := Valor;
Memo.Font.Size := TamFonte;
Memo.Font.Style := Fonte;
Memo.HAlign := Alinhamento;
Memo.WordWrap := False;
// memo é posicionado abaixo do memo anterior ((LinhaAtual - 1) * AlturaLinha)
Inc(LinhaAtual);
// primeira linha/coluna posiciona em margemesquerda/margemsuperior
// demais linhas/colunas posicionam em margemesquerda+larguraetiqueta/margemsuperior+alturaetiqueta
Memo.SetBounds(IfThen(j = 1, MargemEsquerda * j, MargemEsquerda + ((j - 1) * LarguraEtiqueta)), IfThen(i = 1, MargemSuperior + (i *
LinhaAtual) + ((LinhaAtual - 1) * AlturaLinha), MargemSuperior + ((i - 1) * AlturaEtiqueta) + ((LinhaAtual - 1) * AlturaLinha)),
LarguraEtiqueta, AlturaLinha);
end;
begin
try
// cria report
Report := TfrxReport.Create(Self);
// configura preview do report
with Report do
begin
Clear;
PreviewOptions.ThumbnailVisible := True;
PreviewOptions.ZoomMode := zmWholePage
end;
// pagina inicial
novaPagina;
x := 0;
while x < Length(Etiquetas) do
begin
for i := 1 to TotLinha do
begin
if x = Length(Etiquetas) then
Break;
for j := 1 to TotColuna do
begin
if x = Length(Etiquetas) then
Break;
LinhaAtual := 0;
for y := 0 to Length(Etiquetas[x]) - 1 do
begin
if y = 0 then // haCenter, fdBold
GravaMemo(Etiquetas[x][y], haCenter, [fsBold])
else // haLeft
GravaMemo(Etiquetas[x][y], haLeft, []);
end;
Inc(x);
end;
end;
Inc(x);
// mais de uma página
if x < Length(Etiquetas) then
novaPagina;
end;
Report.ShowReport;
finally
Report.Free;
end;
end;
GOSTEI 2
Mais Respostas
Raylan Zibel
28/12/2015
Resolvi essa parte com registros vazios no clientdataset.
GOSTEI 1
Raylan Zibel
28/12/2015
Resolvido.
GOSTEI 0
Softsan Software
28/12/2015
Boa Tarde Raylan, tudo bem?
Achei muito interessante a sua solução, porem não estou tendo sucesso em implementa-la, você poderia me passar no email como vc faz uso dessa rotina, como você faz para carregar o array e mandar para a rotina?
thiquintino@gmail.com
Desde já agradeço.
Achei muito interessante a sua solução, porem não estou tendo sucesso em implementa-la, você poderia me passar no email como vc faz uso dessa rotina, como você faz para carregar o array e mandar para a rotina?
thiquintino@gmail.com
Desde já agradeço.
GOSTEI 1
Willian
28/12/2015
teria como vc mandar o projeto?
notorionet@hotmail.com
notorionet@hotmail.com
GOSTEI 0
Raylan Zibel
28/12/2015
Não entendi qual a duvida. É o processo de impressão de etiqueta normal. Mas pra começar de uma posição específica como eu precisava, coloquei registros vazios até chegar na posição que queria.
GOSTEI 0
Raylan Zibel
28/12/2015
Fiz com array of array of string. Os primeiros registros vazios determinam a posição inicial para impressão.
//-----------------------------------------TABELA COM AS ETIQUETAS--------------------------------------------// type TEtiquetas = array of array of string;
//-----------------------------------------ROTINA DE IMPRESSÃO----------------------------------------------//
procedure EtiquetaPimacoFast(Etiquetas: TEtiquetas);
{
uses DateUtils, frxClass, Math;
}
const
TamFonte: Byte = 10;
AlturaLinha: Byte = 15; // pixels // menor que 15 depende da fonte
InchToPixel: Byte = 96; // 1 polegada
var
x, y: Byte;
i, j: Byte;
LinhaAtual: Byte;
TotLinha, TotColuna: Byte;
AlturaEtiqueta, LarguraEtiqueta: Double;
MargemEsquerda, MargemDireita: Double;
MargemSuperior, MargemInferior: Double;
AlturaFolha, LarguraFolha: Double;
Report: TfrxReport;
Page: TfrxReportPage;
Band: TfrxBand;
Memo: TfrxMemoView;
procedure novaPagina;
begin
// lendo ini // valores alternativos são de modelo A4->2x6 // valores em milímetros
LarguraEtiqueta := (IniReadFlt('REPORT', 'LARGURA_ETIQUETA', 90.00));
AlturaEtiqueta := (IniReadFlt('REPORT', 'ALTURA_ETIQUETA', 45.00));
MargemSuperior := (IniReadFlt('REPORT', 'MARGEM_SUPERIOR', 10.00));
MargemInferior := (IniReadFlt('REPORT', 'MARGEM_INFERIOR', 10.00));
MargemEsquerda := (IniReadFlt('REPORT', 'MARGEM_ESQUERDA', 10.00));
MargemDireita := (IniReadFlt('REPORT', 'MARGEM_DIREITA', 10.00));
LarguraFolha := (IniReadFlt('REPORT', 'LARGURA_FOLHA', 210.00));
AlturaFolha := (IniReadFlt('REPORT', 'ALTURA_FOLHA', 290.70));
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
TotLinha := Floor((AlturaFolha - MargemSuperior - MargemInferior) / AlturaEtiqueta);
// cria página
Page := TfrxReportPage.Create(Report);
Page.CreateUniqueName;
Page.SetDefaults;
// configura página
Page.Width := LarguraFolha;
Page.Height := AlturaFolha;
Page.TopMargin := MargemSuperior;
Page.BottomMargin := MargemInferior;
Page.LeftMargin := MargemEsquerda;
Page.RightMargin := MargemDireita;
// converte pra pixels pra posicionar os MemoViews
MargemEsquerda := MmToInch(MargemEsquerda) * InchToPixel;
MargemSuperior := MmToInch(MargemSuperior) * InchToPixel;
LarguraEtiqueta := MmToInch(LarguraEtiqueta) * InchToPixel;
AlturaEtiqueta := MmToInch(AlturaEtiqueta) * InchToPixel;
// cria banda na página
Band := TfrxReportTitle.Create(Page);
Band.CreateUniqueName;
Band.Top := 0;
Band.Height := Page.Height;
end;
procedure GravaMemo(Valor: string; Alinhamento: TfrxHAlign; Fonte: TFontStyles);
begin
// cria memo na banda da página
Memo := TfrxMemoView.Create(Band);
Memo.CreateUniqueName;
// configura memo
Memo.Text := Valor;
Memo.Font.Size := TamFonte;
Memo.Font.Style := Fonte;
Memo.HAlign := Alinhamento;
Memo.WordWrap := False;
// memo é posicionado abaixo do memo anterior ((LinhaAtual - 1) * AlturaLinha)
Inc(LinhaAtual);
// primeira linha/coluna posiciona em margemesquerda/margemsuperior
// demais linhas/colunas posicionam em margemesquerda+larguraetiqueta/margemsuperior+alturaetiqueta
Memo.SetBounds(IfThen(j = 1, MargemEsquerda * j, MargemEsquerda + ((j - 1) * LarguraEtiqueta)), IfThen(i = 1, MargemSuperior + (i *
LinhaAtual) + ((LinhaAtual - 1) * AlturaLinha), MargemSuperior + ((i - 1) * AlturaEtiqueta) + ((LinhaAtual - 1) * AlturaLinha)),
LarguraEtiqueta, AlturaLinha);
end;
begin
try
// cria report
Report := TfrxReport.Create(Self);
// configura preview do report
with Report do
begin
Clear;
PreviewOptions.ThumbnailVisible := True;
PreviewOptions.ZoomMode := zmWholePage
end;
// pagina inicial
novaPagina;
x := 0;
while x < Length(Etiquetas) do
begin
for i := 1 to TotLinha do
begin
if x = Length(Etiquetas) then
Break;
for j := 1 to TotColuna do
begin
if x = Length(Etiquetas) then
Break;
LinhaAtual := 0;
for y := 0 to Length(Etiquetas[x]) - 1 do
begin
if y = 0 then // haCenter, fdBold
GravaMemo(Etiquetas[x][y], haCenter, [fsBold])
else // haLeft
GravaMemo(Etiquetas[x][y], haLeft, []);
end;
Inc(x);
end;
end;
Inc(x);
// mais de uma página
if x < Length(Etiquetas) then
novaPagina;
end;
Report.ShowReport;
finally
Report.Free;
end;
end;
Exemplo de uso do código acima.
procedure TForm1.btnTesteEtiquetaPimacoClick(Sender: TObject);
var
i, pos: Byte;
etiquetas: TEtiquetas;
begin
SQLExecute('select nome, telefone, email from pessoas where (telefone is not null) and (email is not null)');
SetLength(etiquetas, SQLCount);
// posição cima pra baixo, esquerda pra direita, começa de 1
pos := StrToIntDef(InputBox('Etiqueta', 'Posição Inicial da Etiqueta:', '1'), 1) - 1;
if pos < 0 then
Exit;
// adiciona qtd de registros vazios antes da posição inicial
SetLength(etiquetas, Length(etiquetas) + pos);
for i := 1 to pos do
SetLength(etiquetas[i-1], SQLFieldCount);
// começa a alimentar a partir da posição inicial informada
for i := pos to Length(etiquetas) - 1 do
begin
SetLength(etiquetas[i], SQLFieldCount);
etiquetas[i][0] := 'TITULO DA ETIQUETA';
etiquetas[i][1] := 'Nome: ' + SQLFields('nome').AsString;
etiquetas[i][2] := 'Telefone: ' + SQLFields('telefone').AsString;
etiquetas[i][3] := 'Email: ' + SQLFields('email').AsString;
SQLNext;
end;
// executando preview
EtiquetaPimacoFast(etiquetas);
end;
GOSTEI 1
Willian
28/12/2015
boa tarde raylan
sou iniciante, se vc pudesse mandar os fontes desse exemplo ficaria grato.
notorionet@hotmail.com
sou iniciante, se vc pudesse mandar os fontes desse exemplo ficaria grato.
notorionet@hotmail.com
GOSTEI 0
Raylan Zibel
28/12/2015
boa tarde raylan
sou iniciante, se vc pudesse mandar os fontes desse exemplo ficaria grato.
notorionet@hotmail.com
sou iniciante, se vc pudesse mandar os fontes desse exemplo ficaria grato.
notorionet@hotmail.com
Mas o fonte é só isso aí. Não tem form, não tem design. É gerado dinamicamente. Analise o código e entenda como foi feito.
GOSTEI 0
Willian
28/12/2015
vc usou delphi 7
GOSTEI 0
Raylan Zibel
28/12/2015
Sim.
GOSTEI 0
Willian
28/12/2015
bom dia Raylan.
estou com um problema para declarar o IniReadFlt
estou com um problema para declarar o IniReadFlt
GOSTEI 0
Raylan Zibel
28/12/2015
É o mesmo que "ReadFloat".
function IniReadFlt(Chave, Variavel: string; Retorno: Double): Double;
begin
with TIniFile.Create(DirExe + 'arquivo.ini') do
try
result := ReadFloat(Chave, Variavel, Retorno);
finally
Free;
end;
end;
GOSTEI 0
Willian
28/12/2015
bom dia
esta dando um erro nessa linha
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
e nessa
MmToInch
esta dando um erro nessa linha
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
e nessa
MmToInch
GOSTEI 0
Raylan Zibel
28/12/2015
uses Math;
function mmToInch(Mm: double): double; begin Result := Mm / 25.4; end;
GOSTEI 0
Willian
28/12/2015
esta dando um erro nessa linha
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
incompatilbe type: Byte and extended
como vc uso a funçao SQL
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
incompatilbe type: Byte and extended
como vc uso a funçao SQL
GOSTEI 0
Willian
28/12/2015
raylan bom dia
agradeço por ter me ajudado ate agora, quanto vc me vende o projeto fica mais facil para mim estudar o codigo, tenho que fazer trabalho e nao estou conseguindo acompanhar, a minha ideia e a seguinte.
segue em anexo
exemplo
agradeço por ter me ajudado ate agora, quanto vc me vende o projeto fica mais facil para mim estudar o codigo, tenho que fazer trabalho e nao estou conseguindo acompanhar, a minha ideia e a seguinte.
segue em anexo
exemplo
GOSTEI 0
Raylan Zibel
28/12/2015
Vou dar uma olhada aqui e a noite respondo.
GOSTEI 0
Willian
28/12/2015
Boa noite.
Vc olhou
Vc olhou
GOSTEI 0
Raylan Zibel
28/12/2015
Me manda um email. Amanhã vou tentar separar o código e mandar o fonte.
r@projetosr.com.br
r@projetosr.com.br
GOSTEI 0
Willian
28/12/2015
Mandei o email
GOSTEI 0
Willian
28/12/2015
bom dia
Raylan estou quase conseguindo!
como vc fez o arquivo INI
Raylan estou quase conseguindo!
como vc fez o arquivo INI
GOSTEI 1
Raylan Zibel
28/12/2015
Aqui. Tem um erro, mas você pode verificar se funciona. O ini ta na pasta.
https://dl.dropboxusercontent.com/u/25845203/ImprimirEtiquetas.zip
https://dl.dropboxusercontent.com/u/25845203/ImprimirEtiquetas.zip
GOSTEI 0
Willian
28/12/2015
boa tarde Raylan.
olha eu aqui de novo!
nao estou conseguindo gerar as etiquetas com as informação que esta na dbgrid?
procedure TEtiqueta.Button1Click(Sender: TObject);
var
pos: Byte;
etiquetas: TEtiquetas;
i, y: integer;
begin
y:=0;
// total de etiquetas que serão impressas
SetLength(etiquetas, lista.Count);
// posição cima pra baixo, esquerda pra direita, começa de 1
pos:= (EtiqInicial) -1;
if pos < 0 then
Exit;
// adiciona qtd de registros vazios antes da posição inicial
SetLength(etiquetas, Length(etiquetas) + pos);
for i := 1 to pos do
SetLength(etiquetas[i-1], 4);
// começa a alimentar a partir da posição inicial informada
for i := pos to Length(etiquetas) -1 do
begin
SetLength(etiquetas[i], 4);
etiquetas[i][0] := TDados(Lista[y]).Codigo;
etiquetas[i][1] := TDados(Lista[y]).Nome;
// etiquetas[i][2] := 'Meu Campo Dois';
// etiquetas[i][3] := 'Meu Campo Tres';
end;
// executando preview
EtiquetaPimacoFast(etiquetas);
end;
olha eu aqui de novo!
nao estou conseguindo gerar as etiquetas com as informação que esta na dbgrid?
procedure TEtiqueta.Button1Click(Sender: TObject);
var
pos: Byte;
etiquetas: TEtiquetas;
i, y: integer;
begin
y:=0;
// total de etiquetas que serão impressas
SetLength(etiquetas, lista.Count);
// posição cima pra baixo, esquerda pra direita, começa de 1
pos:= (EtiqInicial) -1;
if pos < 0 then
Exit;
// adiciona qtd de registros vazios antes da posição inicial
SetLength(etiquetas, Length(etiquetas) + pos);
for i := 1 to pos do
SetLength(etiquetas[i-1], 4);
// começa a alimentar a partir da posição inicial informada
for i := pos to Length(etiquetas) -1 do
begin
SetLength(etiquetas[i], 4);
etiquetas[i][0] := TDados(Lista[y]).Codigo;
etiquetas[i][1] := TDados(Lista[y]).Nome;
// etiquetas[i][2] := 'Meu Campo Dois';
// etiquetas[i][3] := 'Meu Campo Tres';
end;
// executando preview
EtiquetaPimacoFast(etiquetas);
end;
GOSTEI 0
Willian
28/12/2015
bom dia,
nao detalhei direito o erro
nao estou conseguindo gerar as etiquetas com as informação que esta na dbgrid, quando gero as etiquetas so pega a primeira linha do dbgrid, se eu trocar a variavel Y pela variavel I (TDados(Lista[y]).Codigo;) ai imprime todas as linhas, mas nao adiciona registros vazios antes da posição inicial?
nao detalhei direito o erro
nao estou conseguindo gerar as etiquetas com as informação que esta na dbgrid, quando gero as etiquetas so pega a primeira linha do dbgrid, se eu trocar a variavel Y pela variavel I (TDados(Lista[y]).Codigo;) ai imprime todas as linhas, mas nao adiciona registros vazios antes da posição inicial?
GOSTEI 0
Raylan Zibel
28/12/2015
A variavel EtiqInicial tem a posição onde a primeira etiqueta seria impressa. Com esse valor atribuido o programa adicionaria registros vazios nas posições anteriores.
GOSTEI 1
Willian
28/12/2015
vou te mandar o projeto para vc da uma olhada
em seu email
em seu email
GOSTEI 0
Willian
28/12/2015
Boa noite.
Raylan vc recebeu meu email
Raylan vc recebeu meu email
GOSTEI 0
Raylan Zibel
28/12/2015
Boa noite.
Raylan vc recebeu meu email
Raylan vc recebeu meu email
Não.
r@projetosr.com.br
GOSTEI 0
Raylan Zibel
28/12/2015
Sim, rs. Achei aqui. Nâo foi redirecionado, por algum motivo.. ¬¬
Vou dar uma olhada assim que puder.
Vou dar uma olhada assim que puder.
GOSTEI 0
Willian
28/12/2015
boa tarde Raylan.
deu Certo, conseguiu ver?
deu Certo, conseguiu ver?
GOSTEI 0
Willian
28/12/2015
Amigo Raylan.
nao conseguiu abrir o arquivo
nao conseguiu abrir o arquivo
GOSTEI 0
Vicente Santos
28/12/2015
infelizmente não me serviu de nada esse exemplo, pelo contrário me deixou mais confuso ainda.
GOSTEI 0
Raylan Zibel
28/12/2015
esta dando um erro nessa linha
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
incompatilbe type: Byte and extended
como vc uso a funçao SQL
TotColuna := Floor(LarguraFolha - MargemEsquerda - MargemDireita) / LarguraEtiqueta);
incompatilbe type: Byte and extended
como vc uso a funçao SQL
No final a solução melhor foi a mais simples. Apenas inserimos etiquetas em branco até alcançar a posição que deveria começar a imprimir.
GOSTEI 0