RTF (quebras de páginas)?

11/01/2005

0

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.


Gilsonmv

Gilsonmv

Responder

Post mais votado

13/01/2005

Vai aí um exemplo então:

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.


Bon Jovi

Bon Jovi
Responder

Mais Posts

12/01/2005

Bon Jovi

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.


Responder

12/01/2005

Gilsonmv

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.


Responder

13/01/2005

Gilsonmv

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.


Responder

13/01/2005

Bon Jovi

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.


Responder

14/01/2005

Gilsonmv

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.


Responder

15/01/2005

Bon Jovi

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.


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar