Olá, amigos programadores!
Hoje, o objetivo é apresentar uma maneira rápida, simples e funcional de exportar relatórios elaborados em QuickReport para PDF, sem instalações de componentes pagos e sem a necessidade de instalar a versão Professional do componente. Quer saber como? Acompanhe!
Introdução
Eu tenho um projeto de controle de pedidos desenvolvido em Delphi, no qual um dos recursos do software é gerar arquivos PDF dos pedidos para que os vendedores possam enviá-los por e-mail. Foi aí que a minha história com essa funcionalidade começou.
Primeiro, tentei utilizar a classe TQRPDFDocumentFilter
da versão Professional do QuickReport, mas não fiquei satisfeito com a qualidade do documento gerado. Depois, tomei conhecimento do ExportPack (TExportQR), porém, não encontrei versões atualizadas deste componente para a família XE. Em seguida, tentei o componente Gnostice, mas, além de pago, o componente trouxe várias funcionalidades adicionais que eu não precisava.
Bom, continuei pesquisando, pesquisando… e encontrei o Synopse! É apenas uma biblioteca que deve ser vinculada ao projeto para gerar o PDF, sem complexidades.
Vamos fazer na prática?
Instalação
O primeiro passo é baixar as bibliotecas neste link e descompactá-las em uma pasta específica de bibliotecas, como, por exemplo, C:\BibliotecasDelphi
.
O segundo passo é apontar esse caminho no Library Path do Delphi para que as bibliotecas sejam encontradas na compilação. Para isso, no Delphi, clique no menu Tools > Options. Ao abrir a janela, navegue até Delphi Options > Library e clique no botão de reticências do Library Path. Agora, encontre o caminho da pasta de bibliotecas e clique em Add, conforme a imagem abaixo:
Codificação
O próximo passo é adicionar a unit SynPdf
na seção uses do projeto. Adicione também a unit Printers
, caso ainda não esteja adicionada:
1 2 |
uses SynPdf, Printers; |
Pronto! Agora é só partir para a codificação:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
var // variáveis necessárias para a geração do PDF lPDF: TPDFDocument; lMetaDados: TMetafile; lPosicionamento: TPDFCanvasRenderMetaFileTextPositioning; lPagina: integer; begin // cria uma instância do documento PDF lPDF := TPDFDocument.Create(True, 0, False, nil); // inicializa a variável de metadados lMetaDados := nil; try // configura o tipo do papel lPDF.DefaultPaperSize := psA4; // configura o posicionamento dos caracteres lPosicionamento := tpKerningFromAveragePosition; // configura o layout de visualização do documento lPDF.Root.PageLayout := plOneColumn; // ajusta a orientação do documento, caso o relatório esteja em paisagem if QuickRep1.Page.Orientation = poLandscape then begin lPDF.DefaultPageLandscape := True; end; // prepara o relatório QuickRep1.Prepare; // carrega os metadados de cada página do relatório for lPagina := 1 to QuickRep1.QRPrinter.PageCount do begin // adiciona uma nova página no documento lPDF.AddPage; // carrega os metadados da página lMetaDados := QuickRep1.QRPrinter.PageList.GetPage(lPagina); // renderiza os metadados lPDF.Canvas.RenderMetaFile(lMetaDados, 1, 0, 0, lPosicionamento); // limpa a variável de metadados lMetaDados := nil; end; // salva o arquivo lPDF.SaveToFile('C:\Relatorios\Relatorio.pdf'); finally // libera as variáveis lMetaDados.Free; lPDF.Free; end; end; |
Problema resolvido, pessoal! 🙂
Clique neste link e baixe um exemplo dessa funcionalidade desenvolvido em Delphi XE7, mas deixo uma observação: para que o exemplo funcione em qualquer ambiente, coloquei todos arquivos do Synopse na mesma pasta do projeto, ok?
Para tirar o máximo de proveito da biblioteca, recomendo que as outras propriedades das classes sejam exploradas, como os parâmetros de criação da classe TPDFDocument
, tratamento de fontes e os tipos de posicionamento de caracteres. Mesmo assim, em caso de dúvidas, deixe um comentário!
Abraços e até a próxima!
Olá tudo bem? Você saberia me dizer se já tem algo para android com delphi?
Olá, William, tudo bem?
Sim, as versões mais recentes do Delphi (salvo engano, a partir da versão XE3), já disponibiliza uma plataforma para desenvolvimento de projetos mobile. Infelizmente tive pouco contato com esse recurso, mas aparentemente é funcional.
Abraço!
Boa noite, tudo beleza?
Interessante a sua explicação, fiz uns teste e consegui gerar o relatório usando o Delphi 6 e QuickReport 3.0.9, só que nos relatórios aqui da empresa, o total de páginas também aparece no cabeçalho, isto é, página 1/5.
No seu exemplo, como você faria para incluir o total de páginas no cabeçalho do relatório? Seria usando a instrução QuickRep1.QRPrinter.PageCount ?
Olá, Airton, como vai?
Isso mesmo, utilize as seguintes propriedades:
– QuickReport.PageNumber para acessar o número da página atual;
– QuickReport.QRPrinter.PageCount para acessar a quantidade total de páginas.
Ou então, utilize o componente TQRSysData e configure a propriedade Data para qrsPageNumber. Ao abrir o relatório, este componente exibirá automaticamente o número da página atual.
Abraço!
Boa tarde,
Então no momento da impressão do relatório, os comandos usados são:
Onde v_total_pagina é uma variável criada no form do relatório, e no evento beforeprint da band de detalhe tem a linha abaixo:
É dessa forma que é criada a informação com a página corrente / total de páginas.
Como você faria para colocar o total de páginas conforme exemplo acima?
Olá, Airton.
É justamente dessa forma mesmo. Tenho esse mesmo código no meu projeto.
Primeiro, obtemos a quantidade de página após o Prepare e atribuímos à uma label no relatório. Depois, no evento BeforePrint, exibimos a página atual.
Entendi, o detalhe é que impressão normal sem gerar o PDF, o total de páginas aparece corretamente, mas na impressão do PDF aparece zerado.
Pelo que percebi, para o PDF a variável não esta assumindo o valor.
Estranho, Airton. Deveria aparecer, já que o PDF é um “reflexo” do QuickReport.
Vou entrar em contato por e-mail.
Abraço!
Olá André, meus parabéns pelo código. Ficou muito bom!! Principalmente porque este procedimento faz com seja impresso diretamente em PDF sem reimprimir o relatório, como acontece com os relatórios impressos em impressoras virtuais.
Minha contribuição para o seu código é a seguinte: Caso queiram utilizar o procedimento para exportar em PDF após o relatório já estar impresso na tela, segue código abaixo. Para este exemplo abaixo, considerem o seguinte cenário: Uma unit com um TQRPREVIEW onde todos os relatórios do sistema são visualizados nesta unit, ou seja, todos os relatórios são gerados no mesmo lugar, acoplados ao QRPREVIEW. Um botão para exportar em PDF e o procedimento segue abaixo para exportar qualquer relatório já impresso na tela.
//Código abaixo é quase 100% o código do André, apenas sem o prepare já que já está impresso e considerando as properties direto QRPREVIEW.
// onde qrprvwPadrao é o TQRPREVIEW e dlgsavedialog é um TSaveDialog para pedir ao usuário o local onde salvar o PDF.
Perfeito, Leonardo!
Agradeço fortemente pela visita e pelo tempo dedicado para deixar essa contribuição!
Também uso o TQRPreview para elaborar visualizadores personalizados e disponibilizar recursos adicionais, como opções de exportação e envio do relatório por e-mail através de uma integração com o Microsoft Outlook. Dá pra fazer bastante coisa! 🙂
Grande abraço!
Olá, boa tarde!
Estou usando o delphi para gerar relatório, uso o TQuickRep, adicionei o QRPDFFilter para salvar em PDF, Porém estou notando que esta sumindo todos os acentos e caracteres especiais.
Boa noite, Milton, tudo bem?
Isso não deveria ocorrer. Vou entrar em contato com você, ok?
Abraço!
Bom dia ,
Gostei muito do post , porem estou com dificuldade de agregar uma imagem ao pdf ,poderia me ajudar?
Bom dia, Pedro, tudo bem?
Não fiz o teste, mas, se existir uma imagem no relatório (QuickReport), você testou se o Synopse consegue exportá-la?
Abraço!
Opa obrigado pela resposta. Estava utilizando o QRComposite, depois que coloquei cada relatório separado funcionou certinho. Só ficou meio ruim de trocar a fonte do relatório. Mudava pelo comando SetFontAndSize, porém nada acontecia… no final tive que tirar a justificação do parágrafo para imprimir de forma correta. De qualquer forma obrigado, vou dar uma olhada em seu site para ver algumas outras postagens.
Que bom que deu certo, Pedro.
Espero que goste das outras publicações do blog também!
Abraço!
André, gostei muito de sua solução, mas não consigo fazer funcionar no Delphi 2010.
Acho que tudo que se refere ao QRPrinter não funciona = QuickRep1.QRPrinter.PageCount retorna zero e
Pode me ajudar?
Olá, Adriano!
Vou entrar em contato para pedir mais detalhes.
Abraço!
Oi André,
Obrigado por responder.
Utilizo no Delphi 2010 o QuickReport 5.04.2.
Temos 2 tipos de relatórios no Quick:
Um para Boletos e Danfe que é uma caixa tradicional
de banda, foi aí que eu testei o Synopse (Boleto bancário).
Se aí eu conseguir já me dou por satisfeito, mas deu erro…
oMetaDados := QuickRep1.QRPrinter.PageList.GetPage(nPagina); retorna nil.
O Outro tipo é quase em toda a aplicação, de modo
personalizado e sempre crio o relatório desta forma.
Inclusive mudei a forma pois no Delphi 5 não usava
o TQRPrinter.Create(RelItem);
Assim:
RelItem := TQuickRep.Create(nil);
Rel := TQRPrinter.Create(RelItem);
BeginDoc;
….
EndDoc;
Preview;
Resolvido !!!
Agradecimentos ao André por sua ajuda e conhecimento.
Obrigado pelo comentário, Adriano! 🙂
Segue código para ter um botão que salva PDF em todos os relatórios, alterando o QRprev.
Criando uma procedure genérica, mais ou menos abaixo.
Mudança importante no typecast:
A seguir:
Adriano, muito obrigado por ter dedicado um tempo para retornar aqui no blog e deixar a sua contribuição!
O seu código certamente será de grande ajuda para os desenvolvedores que acessarem este artigo.
Abração!
André, bom dia. Tenho alguns sistemas e utilizo 2 sistemas em Delphi XE8 e tenho 2 sistemas em Delphi 5. Um deles esta migrando para Delphi XE8. Estou precisando de uma soçução para gerar o relatório em PDF no Delphi 5 (enquanto não migra, essa solução vai funcionar no Delphi 5. Se não, você conhece alguma solução para Delphi 5?
Olá, Bruno, boa tarde!
Vou entrar em contato com você para entender melhor este cenário de migração.
Abraço!
Tentei utilizar o código, mas quando ocorre a exportação, o arquivo salvo está todo branco, sem conteúdo nenhum. Alguém pode ajudar?
Detalhe: estou utilizando o Delphi 7. Será que funciona?
Atualização:
Problema resolvido!!! Tinha esquecido de colocar os arquivos junto ao projeto. Obrigado!
Olá, Eder!
Desculpe-me por não ter respondido antes. Que bom que deu certo!
Abraço!
Oi André, tudo bem? Cara eu estou conseguindo exportar o QuickReport inclusive com imagens tudo certo… Mas, eu tenho um relatório com 200 imagens, no QuickReport ele carrega certo, porém durante a exportação utilizando o SynPDF dá “Out of memory” lá pela 160… possivelmente pela grande quantidade de imagens… Teria alguma dica para me dar? Desde já agradeço. Obrigado e Abraços!
Olá, Felipe, como vai?
Peço desculpas pela demora para respondê-lo. Retornei ontem de uma viagem.
Felipe, o seu caso é bem curioso. Por algum motivo, a memória reservada para cada imagem aumenta para cada iteração de página.
Vou pedir para que você faça um teste. Dentro do loop das páginas, troque esta linha:
Por esta:
Fico no aguardo do seu retorno.
Abraço!
Bom dia André, eu já havia tentando trocar o “oMetaDados := Nil;” por “oMetaDados.Free;” sim, mas não resolveu. Depois de muito pesquisar e testar, consegui resolver o meu problema trabalhando com TFileStream. Peguei o código no fórum da própria SynPDF. Desta forma cessou o erro de “Out of memory” e além disso, as imagens não sofreram mais perda na qualidade ao gerar o PDF. Detalhe é que eu gero PDF/A. Segue a solução:
Funcionando 100%! Espero que um dia ajude alguém =)
Abraços!
Olá, Felipe, boa noite!
Agradeço muito pela sua colaboração! Não conhecia essa forma de exportação com o Synopse. Vale até fazer uma continuação deste artigo (claro, com todos os créditos a você!).
Obrigado, Felipe. Essa solução certamente ajudará a comunidade Delphi!
Abração!
Obs: Não sabia que você era do blog “Delphi Para Iniciantes”. Já conheço e gostei bastante do conteúdo. Parabéns!
Boa tarde, é possível fazer algo semelhante utilizando ReportBuilder?
Olá, Luiz Gustavo, tudo bem?
Infelizmente não tenho experiências com ReportBuilder. Mesmo assim, fiz algumas pesquisas rápidas na web e notei que alguns desenvolvedores utilizam um componente chamado Export Devices para essa finalidade. Outros instalam impressoras virtuais que geram PDFs (como o PDF Creator). Neste caso, basta apenas chamar a função de impressão do Report Builder para que a janela para salvar o arquivo seja exibida.
Em adição, sugiro também que você assista este vídeo do MVP Victory Fernandes:
https://youtu.be/VGVZ27rL3eU
Abração!
Cara…. incrivel. A qualidade do PDF melhorou 200%. Obrigado pela dica. Abraço.
Muito bom, né?
Obrigado pelo comentário, Gilson!
Caro André,
Primeiro gostaria de felicitar pelo seu artigo, muito bom.
É que não consigo compilar o projeto…
ERRO NESTA LINHA: oPDF.Canvas.RenderMetaFile(oMetaDados, 1, 0, 0, oPosicionamento);
MENSAGEM DE ERRO: [DCC Error] minhaUnit.pas(338): E2010 Incompatible types: ‘Single’ and ‘TPdfCanvasRenderMetaFileTextPositioning’
Tem alguma ajuda?
Desde já agradeço!
Olá, Weliton, como vai? Peço desculpas pela demora.
Nas últimas versões do Synopse há algumas mudanças nos parâmetros de alguns métodos. O método
RenderMetaFile
, por exemplo, possui um parâmetro a mais, portanto, agora é necessário chamá-lo dessa forma:Abraço!
Agradecido pela sua atenção. Eu já tinha descobrido por aqui, às duras penas. Mais uma vez parabenizo pelo artigo. Abraço!
Certo, Weliton. Peço desculpas novamente pela demora para responder o seu comentário.
Estou com um problema com as letras. Em algumas palavras o espaço entre caracteres é maior que no original, o que faz com que saia fora de retângulos.
Sabe como resolver isto?
Olá, Paulo!
Experimente trocar o valor da variável “oPosicionamento” de tpKerningFromAveragePosition para tpExactTextCharacterPositining.
Abraço!
Olá, obrigado, funcionou muito bem.
Que bom, Sérgio!
Abraço!
André, sabe me dizer se a biblioteca SynPDF assina o PDF com certificado digital A1 ? Ou conhece alguma outra solução ?
Obrigado.
Olá, Júlio, tudo bem?
Não tenho certeza, mas acredito que o SynPDF é uma biblioteca dedicada somente à exportação de PDFs.
Para assinatura digital, um componente bem popular é o SecureBlackbox. Alguns comentam também sobre o GhostScript, mas não o conheço.
Abraço!
Gostaria de saber se isso funciona com Delphi 10.3 rio e unigui e como usar.
Olá, Maurício, tudo bem?
Infelizmente não tenho experiência com uniGUI, mas, como o Synopse são apenas classes que dispensam instalação, pode ser possível utilizá-lo com essa tecnologia, sim.
Abraço!
Olá. por algum motivo deu erro quando tentei implementar. erro de tipos incompativeis TPDFCanvasRenderMetaFileTextPositioning e Single. mas procurando, achei esse outro codigo na net que funcionou pra mim :
Ate mais, obrigado .
Olá, Wiliam!
Você provavelmente está utilizando uma versão mais atualizada do Synopse. Algumas propriedades, variáveis e classes foram alteradas nas versões mais recentes.
Obrigado pela contribuição! Certamente irá ajudar outros desenvolvedores.
Abraço!
Olá meu ídolo!!! rsrsrs Escuta, eu posso criar essa variável no evento OnShow do form? Porque no form tem um botão para exportar (Visualizar e imprimir no QuickR) e somente quando quero salvar é que vou no botão salvar do QuickR, entende?
Olá, Walter! Quanto tempo, hein? 🙂
Bom, não sei se entendi muito bem, mas, se você deseja exportar o PDF somente ao clicar em “Salvar” do QR, então você pode criar a variável e fazer todo o procedimento de exportação justamente na ação desse botão. Em outras palavras, somente o botão “Salvar” que fará a exportação. Dessa forma, você não precisará envolver o evento OnShow do formulário.
Abraço!
Amigo, você saberia como “pegar” o tamanho atual que estiver no objeto printer ? Porque no seu exemplo você defne como A4 mas poderia ser carta, ou outro tipo?
Olá, Vinícius, boa tarde!
Para recuperar as informações da impressora, você precisará trabalhar com a função
GetPrinter
, exemplificada neste link.No entanto, talvez, se você não especificar o tamanho do papel (ou seja, não preencher a propriedade
DefaultPaperSize
), a própria classe poderá obter o tamanho padrão da impressora selecionada. Não fiz esse teste, mas vale a pena tentar!Abraço!
Obrigado André, eu já usei o GetPrinter, mas preciso compatibilizar a informação dele com a do SynPDF, vou ver se consigo. Valeu mesmo!
Vinicius, não sei se pode te ajudar, mas com o
GetPrinter
você tem acesso ao tamanho do papel:Bastaria, então, converter este valor para o enumerado que o SynPDF espera.
Abraço!
Bom dia André, Sensacional. Como posso inserir um campo em metadados em uma coordenada?
Olá, Renato, bom dia!
Se você estiver usando QuickReport, dê uma olhada neste link:
https://www.quickreport.co.uk/faqs/
Essa página contém uma série de exemplos e documentações. Provavelmente a impressão por meio de coordenadas está disponível em um deles.
Abraço!
Essa Rotina funciona pro Delphi 7.0? Copiei ela exatamente como está no exemplo mas está dando erro em dois locais:
1 – oMetaDados := FmImpControleDeQualidade.QuickRep1.QRPrinter.PageList.GetPage(nPagina);
(Erro: Pagelist não declarada)
2 – oPDF.Canvas.RenderMetaFile(oMetaDados, 1, 0, 0, oPosicionamento);
(Erro: Tipos incompatíveis single and TPDFCanvasRenderMetaFileTextPositioning)
Agradeço e aguardo, muito obrigado.
Olá, André!
Infelizmente já deixei de programar no Delphi 7 há alguns anos. Como não tenho ele instalado aqui, não consigo reproduzir o erro. 🙁
Porém, eu recordo que tive que atualizar esse artigo para que o código funcionasse nas versões mais recentes do Delphi. O método
RenderMetaFile
, por exemplo, mudou de assinatura. Salvo engano, no Delphi 7 é um parâmetro a menos. Utilize o Code Insight (Ctrl + Shift + Space dentro da assinatura do método) para identificar quantos e quais parâmetros são exigidos.Sobre o erro do
PageList
, eu acredito que está relacionado com a versão do QuickReport. Essa propriedade foi adicionada na versão 5.Abraço!
André Celestino, Boa Noite.
Gostei muita da sua publicação.
Estou acompanhando até as dúvidas dos interessados.
Usei o exemplo de sua rotina de geração de pdf.
Mas estou tendo um problema que esta me deixando de cabelos brancos.
Tenho que emitir boletos bancários.
Se mando imprimir, imprimo todos.
Se quero preview, visualizo todos.
Mas se mando gerar em Pdf so gera o ultimo da relação.
Por gentileza, me diga aonde estou errando.
A rotina esta exatamente igual ao postado.
Me ajuda, por favor.
Muito obrigado.
Olá, Odyr!
Eu suspeito que esteja faltando um laço de repetição para percorrer todos os relatórios e chamar a rotina de exportação de PDF para cada um deles.
Verifique como a impressão é feita e tente replicar para a geração de PDFs.
Caso tenha dificuldades, envie um e-mail para [email protected] com o código.
Abraço!
Consegui resolver a geração com um componente que funciona pra Delphi 6 e 7… se chama ZASOFT… ele não é pago e extremamente fácil de usar. Vou deixar aqui a codificação que utilizei. Ele trabalha diretamente com o Quickreport.
Olá, André!
Muito obrigado pela sua contribuição!
Vou baixar e estudar esse componente. Quem sabe eu publico um artigo sobre ele! 🙂
Grande abraço!
Obs: removi parte do seu código para manter a sua privacidade.
Andre, quero aqui te agradecer de coração a inestimável ajuda que você me deu na elucidação do problema do “save to file”.
Fiquei impressionado com o seu senso de ajuda sem medir esforço.
Fica aqui registrado o meu muito obrigado.
Valeu e muito.
Obrigado pelo comentário, Odyr!
Eu gosto bastante de ajudar programadores, porque eu já estive nessa fase de ter muitas dúvidas e dificuldades na linguagem.
Boa sorte no seu projeto.
Abraço!
Boa tarde André,
Estou tentando aplicar esse código em um sistema em Delphi 2010, na linha FrmRCC_CAixa.QuickRep1.Prepare, da esse erro: ‘Access violation at address 007868CB in module….., vc pode ajudar por favor?
Desde ja agradeço
Claudir
Olá, Claudir. Vou entrar em contato com você.
Bom dia, André! Tudo bem?
Excelente biblioteca, parabéns!!! Estou utilizando com o Delphi 7 e deu tudo certo, exceto pelo código de barras que não aparece na visualização, em vez disso aparecem símbolos. O mais estranho é que se eu imprimir o boleto aparece o código de barras impresso. Tem alguma ideia de como resolver isso?
Obrigado
Olá, Jair, boa noite!
Que estranho. Bom, se o código de barras é impresso corretamente, então não parece ser um problema do Synopse.
Você visualizou o PDF em algum browser? A minha primeira sugestão seria abrir o PDF em outro browser e/ou em outro aplicativo.
Se possível, envie um PDF de exemplo para [email protected] e continuamos conversando por lá!
Abraço!
Olá André, primeiramente obrigado pelo material sobre o Synopse, material de excelente ajuda.
Estou com um probleminha na geração do meu arquivo PDF, o arquivo gerado está com todo o texto em negrito. Outro detalhe é que os frames do lado direito das Bands não foram desenhados, o que eu devo ter feito de errado?
Olá, Carlos, boa noite!
Primeiramente, agradeço pelo feedback!
Experimente adicionar essa linha na rotina de geração do PDF:
Se mesmo assim não funcionar, entre em contato comigo pelo [email protected].
Abraço!
André, bom dia, o link não funcionou para download, teria algum outro link para fazer o download?, ou poderia me mandar por email? obrigado
Olá, João Lúcio.
Enviei por e-mail!
André consegui fazer o download, você sabe me dizer se este componente funciona no Delphi 5.0?
Este código funciona perfeito no D7.
procedure TfrmPedido.BitBtn4Click(Sender: TObject);
var
Pdf: TPdfDocument;
aMeta: TMetaFile;
i: integer;
begin
if Modulo.tblItensPedidos.RecordCount <= 0 then
showmessage('Sem pedidos !') else
begin
Pdf := TPdfDocument.Create;
Pdf.UseUniscribe := True;
try
Pdf.DefaultPaperSize := psA4;
frmRelPedido.QuickRepPedido.Prepare;
for i := 1 to frmRelPedido.QuickRepPedido.QRPrinter.PageCount do begin
Pdf.AddPage;
aMeta := frmRelPedido.QuickRepPedido.QRPrinter.GetPage(i);
try
Pdf.Canvas.RenderMetaFile(aMeta,1,0,0);
finally
aMeta.Free;
end;
end;
if savedialog1.Execute then
Pdf.SaveToFile(savedialog1.filename);
//Pdf.SaveToFile('C:\Relatorios\Relatorio.pdf');
finally
Pdf.free;
end;
end;
end;
Muito obrigado, Antonio!
O blog está com uma falha na apresentação de códigos na seção de comentários, mas vou corrigir em breve.
Abraço!
Muito obrigado ao Andre Celestino pela iniciativa. Uso o Delphi 7 (ainda) e a solucao do Antonio Botinas deu certinho.
Obrigado, Meinardo!
Como faço para adquirir a versão mais atual do quick
report para delphi5. Alguém teria um link ou não é gratuito?
Olá, Antonio.
Pelo que pesquisei, existe a versão para Delphi 5, mas está disponível somente para desenvolvedores que já possuem uma licença:
https://www.qusoft.com/quick-report-legacy-versions-delphi/
Abraço!