RTF (quebras de páginas)?
Olá alguém sabe como pegar um arquivo rtf e saber quantas páginas ele tem, ou melhor ainda atualmente só preciso saber se tem mais de uma página.
Já tentei com TPrinter (a forma como o RichEdit e RxRichEdit fazem no método print dos mesmos) e não teve o efeito desejado, funciona em alguns casos mas em outros não funciona. Também já tentei a seqüência ´\page´ dentro do rtf mas nem sempre esta sequência está presente, pois o arquivo rtf pode ter várias páginas sem esta seqüência.
O que preciso realmente é saber onde será a quebra de página do rtf.
abraços,
Gilson.
Já tentei com TPrinter (a forma como o RichEdit e RxRichEdit fazem no método print dos mesmos) e não teve o efeito desejado, funciona em alguns casos mas em outros não funciona. Também já tentei a seqüência ´\page´ dentro do rtf mas nem sempre esta sequência está presente, pois o arquivo rtf pode ter várias páginas sem esta seqüência.
O que preciso realmente é saber onde será a quebra de página do rtf.
abraços,
Gilson.
Gilsonmv
Curtidas 0
Melhor post
Bon Jovi
13/01/2005
Vai aí um exemplo então:
Unit1.pas:
Unit1.dfm:
Observe que o QRDBMemo deverá estar com a propriedade AutoStretch = True.
Unit1.pas:
unit Unit1; interface uses SysUtils, Classes, Controls, Forms, Dialogs, Db, DBClient, QuickRpt, Qrctrls, ExtCtrls; type TForm1 = class(TForm) QuickRep1: TQuickRep; DetailBand1: TQRBand; QRDBRichText1: TQRDBRichText; ClientDataSet1: TClientDataSet; ClientDataSet1TEXTO_RTF: TMemoField; PageFooterBand1: TQRBand; QRSysData1: TQRSysData; procedure FormShow(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); begin ClientDataSet1.CreateDataSet; ClientDataSet1.Insert; ClientDataSet1TEXTO_RTF.LoadFromFile(´C:\teste.rtf´); ClientDataSet1.Post; QuickRep1.Prepare; ShowMessage(´Total de páginas: ´ + IntToStr(QuickRep1.PageNumber)); QuickRep1.PreviewModal; ClientDataSet1.Close; Application.Terminate; end; end.
Unit1.dfm:
object Form1: TForm1 Left = 192 Top = 107 Width = 544 Height = 375 Caption = ´Form1´ Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = ´MS Sans Serif´ Font.Style = [] OldCreateOrder = False Scaled = False OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object QuickRep1: TQuickRep Left = 0 Top = 0 Width = 794 Height = 1123 Frame.Color = clBlack Frame.DrawTop = False Frame.DrawBottom = False Frame.DrawLeft = False Frame.DrawRight = False DataSet = ClientDataSet1 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = ´Arial´ Font.Style = [] Functions.Strings = ( ´PAGENUMBER´ ´COLUMNNUMBER´ ´REPORTTITLE´) Functions.DATA = ( ´0´ ´0´ 3939) Options = [FirstPageHeader, LastPageFooter] Page.Columns = 1 Page.Orientation = poPortrait Page.PaperSize = A4 Page.Values = ( 100 2970 100 2100 100 100 0) PrinterSettings.Copies = 1 PrinterSettings.Duplex = False PrinterSettings.FirstPage = 0 PrinterSettings.LastPage = 0 PrinterSettings.OutputBin = Auto PrintIfEmpty = True SnapToGrid = True Units = MM Zoom = 100 object DetailBand1: TQRBand Left = 38 Top = 38 Width = 718 Height = 147 Frame.Color = clBlack Frame.DrawTop = False Frame.DrawBottom = False Frame.DrawLeft = False Frame.DrawRight = False AlignToBottom = False Color = clWhite ForceNewColumn = False ForceNewPage = False Size.Values = ( 388.9375 1899.70833333333) BandType = rbDetail object QRDBRichText1: TQRDBRichText Left = 1 Top = 1 Width = 716 Height = 145 Frame.Color = clBlack Frame.DrawTop = False Frame.DrawBottom = False Frame.DrawLeft = False Frame.DrawRight = False Size.Values = ( 383.645833333333 2.64583333333333 2.64583333333333 1894.41666666667) Alignment = taLeftJustify AutoStretch = True Color = clWindow Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = ´Arial´ Font.Style = [] DataField = ´TEXTO_RTF´ DataSet = ClientDataSet1 end end object PageFooterBand1: TQRBand Left = 38 Top = 185 Width = 718 Height = 24 Frame.Color = clBlack Frame.DrawTop = False Frame.DrawBottom = False Frame.DrawLeft = False Frame.DrawRight = False AlignToBottom = False Color = clWhite ForceNewColumn = False ForceNewPage = False Size.Values = ( 63.5 1899.70833333333) BandType = rbPageFooter object QRSysData1: TQRSysData Left = 670 Top = 3 Width = 46 Height = 17 Frame.Color = clBlack Frame.DrawTop = False Frame.DrawBottom = False Frame.DrawLeft = False Frame.DrawRight = False Size.Values = ( 44.9791666666667 1772.70833333333 7.9375 121.708333333333) Alignment = taLeftJustify AlignToBand = False AutoSize = True Color = clWhite Data = qrsPageNumber Transparent = False FontSize = 10 end end end object ClientDataSet1: TClientDataSet Aggregates = <> Params = <> Left = 38 Top = 6 object ClientDataSet1TEXTO_RTF: TMemoField FieldName = ´TEXTO_RTF´ BlobType = ftMemo end end end
Observe que o QRDBMemo deverá estar com a propriedade AutoStretch = True.
GOSTEI 1
Mais Respostas
Bon Jovi
11/01/2005
Só quer saber qtas páginas? Se for isso vc pode tentar abrir o RTF num gerador de relatórios, tipo ReportBuilder ou QuickReport se tiver componente RTF. Daí o gerador de relatorio já tem pronto as propriedades de contar páginas que precisa.
GOSTEI 0
Gilsonmv
11/01/2005
e como eu faria esse relatório, seria apenas carregar o rtf para um QrRichEdit do quickReport por exemplo? e como eu faria para buscar esta contagem de páginas do Greador de relatórios (que propriedades seriam)?
obrigado pela dica, gostaria que vc me especificasse melho como se faz?
abraços,
Gilson.
obrigado pela dica, gostaria que vc me especificasse melho como se faz?
abraços,
Gilson.
GOSTEI 0
Gilsonmv
11/01/2005
Tu conhece um método tipo um ´desprepare´ para o quickReport?
é que caí em outro problema.
Quebrou_pagina := False;
RichEdit.Lines.LoadFromFile(´C:\teste.rtf´);
While not Quebrou_pagina then
begin
RichEdit.Lines.Add(´´);
qrRichEdit.Lines.Assign(RichEdit.Lines);
QuickRep1.Prepare;
ShowMessage(´Total de páginas: ´ + IntToStr(QuickRep1.PageNumber));
Quebrou_pagina := QuickRep1.PageNumber > 1;
end;
quando passa a primeira vez no loop dá certo me retorna 1, a partir da segunda vez retorna sempre 0 (zero).
tem como retornar sempre o valor correto de páginas do relatório?
abraços,
Gilson.
é que caí em outro problema.
Quebrou_pagina := False;
RichEdit.Lines.LoadFromFile(´C:\teste.rtf´);
While not Quebrou_pagina then
begin
RichEdit.Lines.Add(´´);
qrRichEdit.Lines.Assign(RichEdit.Lines);
QuickRep1.Prepare;
ShowMessage(´Total de páginas: ´ + IntToStr(QuickRep1.PageNumber));
Quebrou_pagina := QuickRep1.PageNumber > 1;
end;
quando passa a primeira vez no loop dá certo me retorna 1, a partir da segunda vez retorna sempre 0 (zero).
tem como retornar sempre o valor correto de páginas do relatório?
abraços,
Gilson.
GOSTEI 0
Bon Jovi
11/01/2005
Pq esse loop? Não entendi exatamente o q está desejando agora. Depois de executar o Prepare o PageNumber retorna o número da última página, até aí OK qto a querer saber o total de páginas, certo? Qto a mais outras coisas, descreva o q quer fazer na prática pro usuario.
GOSTEI 0
Gilsonmv
11/01/2005
Bom eu tenho um Laudo e este laudo tem um Cabeçalho, um corpo de laudo e um Rodapé, estou formatando em TRxRichEdit (Formato Rtf), assim quando adiciono cabeçalho e corpo do Laudo preciso adicionar o rodapé no final da página (completando o meio do laudo com enters (RxRicheEdit.Lines.Add(´´);) ) e no final adiciono o rodapé, o que preciso é saber quando vai quebrar a págia para adicionar este rodapé.
Por isso pensei em um Loop para saber quando vai quebrar a página. Se vc tiver outra dica será bem vinda.
abraços,
Gilson.
Por isso pensei em um Loop para saber quando vai quebrar a página. Se vc tiver outra dica será bem vinda.
abraços,
Gilson.
GOSTEI 0
Bon Jovi
11/01/2005
Como naquele exemplo DetailBand é pro corpo. E pq nao usa as bandas PageHeader e PageFooter pra cabeçalho e rodapé respectivamente? Se isso deve ser feito obrigatóriamente dentro do RTF entao não vai poder fazer desta maneira, q no caso nunca trabalhei com isso.
GOSTEI 0