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