Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
Tatiane.InterArt

(Resolvido) Deixar texto justificado em relatório

Question

Preciso deixar um texto justificado em um relatório gerado no QuickRep, bem para q fique melhor explicado, gero um recibo, onde traz dados como Nome do Agência, Valor R$, Valor por extenso, n° Orçamento e n° parcela de uma tabela chamada PagtoAgencia.

Trabalho com Delphi7 e InterBase, tentei usar o QRLabel, e o sistema de contagem de letras Length, mas nem sempre dá o mesmo tamanho em comprimento, depende de maiúscula e minúscula, bem imagine q medi em letra maiúscula a largura de uma margem do relatório a outra mede 78 caracteres e em minúscula 104.

como tenho uma variante de maiúsculas e minúsculas gerando esse recibo esse sistema ficou furado, umas linhas se encaixam e outras não, fora que corro o risco de cortar uma palavra no meio.

Alguém saberia me dizer como poderia fazer isso de uma forma melhor, que deixe justificado sem cortar palavras?

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0
Alguém saberia me dizer como poderia fazer isso de uma forma melhor, que deixe justificado sem cortar palavras?

trabalhe com fonte Courier, as letras tem o mesmo espaçamento.

abraço

Share this post


Link to post
Share on other sites
  • 0

Então Jhonas, isso seria uma opção, mas e o caso de palavras cortadas? afinal, terei agências com nomes de tamanho diferente entende, então encorporando o contexto em determinado mometo posso ter uma linha assim

Eu, AMAURI DE SOUZA, portador do CPF/CNPJ n°:000.000.000-00 e RG n°00.000.000-0, DECLARO, para os devidos fins

e em outra situação posso ter uma assim:

Eu, SANDRA DE LIMA TORRES, portador do CPF/CNPJ n°:000.000.000-00 e RG n°00.000.000-0, DECLARO para os devid

os fins

compreendeu o que quis dizer com cortar as palavras de acordo com o número de caracteres?

Share this post


Link to post
Share on other sites
  • 0
Então Jhonas, isso seria uma opção, mas e o caso de palavras cortadas?

Justifica Texto no QR

Function TQuickReport2.justifica(s: string; iMax: integer): string;
var
iCont: integer;
iPos: integer;
sAux: string;
begin
   // executa enquanto a string for maior que o comprimento da linha
   while Length(s) > iMax do
      begin
          iPos := iMax;
          // procura o espaço que será o final da linha
          while s[iPos] <> ' ' do
             iPos := iPos - 1;

          // carrega a substring a ser justificada
          sAux := copy(s, 0, iPos);
          delete(s, 1, iPos);

          iCont := iPos - 1;
          // inclui espaços até a substring ter o tamanho máximo da linha
          while iPos <> iMax do
             begin
                // posiciona o cursor para incluir o espaço
                while sAux[iCont] <> ' ' do
                   begin
                      iCont := iCont - 1;
                      if iCont < 0 then
                         iCont := iPos - 1;
                   end;
                Insert(' ', sAux, iCont);

                // ajusta o cursor para que não sejam incluídos mais espaços na
                // mesma posição de justificação
                while (sAux[iCont] = ' ') and (iCont > 0) do
                   iCont := iCont - 1;

                   iPos := iPos + 1;
                end;

                Result := Result + sAux;
             end;

         Result := Result + s;
end;

Observação: Lembrar de deixar a propriedade Autosize como false e Autostretch como true do QRMemo ou QRBMemo . O parametro " S " é o texto de um QRMemo ou QRBMemo e o " iMax " é a quantidade de caracteres de cada linha. a fonte tem que ser " Courier ou Courier New ".

Modifique o codigo para seu uso

abraço

Share this post


Link to post
Share on other sites
  • 0

Nossa Jhonas muito fofo tudo isso, mas deixa te falar, não consegui jogar o texto que é uma string no campo QRMemo, juro está muito estranho, seu código está perfeito e poderia até mesmo usá-lo exatamente como está para a justificação, mas diga-me como você faz para colocar os dados gerados pelo relatório na MEMO?

Bem para q você entenda como estou fazendo o relatório, no botão imprime relatório q é onde gera minha pesquisa estou jogando todos os dados, texto fixo+ itens da tabela em uma variável tipo STRING e quando tento enviar esses mesmos dados ao campo MEMO dá incompatibilidade, já tentei tudo... e nada funcionou, no máximo, quando usei a forma normal para enviar dados para campo MEMO, nem mesmo gera o relatório, clico no botão e não acontece nada, nadinha!

Share this post


Link to post
Share on other sites
  • 0
já tentei tudo... e nada funcionou, no máximo, quando usei a forma normal para enviar dados para campo MEMO, nem mesmo gera o relatório, clico no botão e não acontece nada, nadinha!

vou te dar um exemplo simples

Coloque num Form um botao e no evento OnClick do botao coloque o codigo

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
   QuickReport2.preview;
end;

end.
Agora pegue um QR coloque duas bandas... uma de title e uma de Detail na banda de Deteil coloque um componente QRMemo, deixe a propriedade Autosize como false e Autostretch como true , na propriedade Font do QRMemo coloque Courier / Normal / 10 e na propriedade Width digite 673. No evento BeforePrint do QR coloque o codigo:
unit Unit2;

interface

uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
  StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;

type
  TQuickReport2 = class(TQuickRep)
    QRBand1: TQRBand;
    QRBand3: TQRBand;
    QRLabel1: TQRLabel;
    QRMemo1: TQRMemo;
    procedure QuickRepBeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);
  private

  public

  end;

var
  QuickReport2: TQuickReport2;
  s,s1 : string;
implementation

{$R *.DFM}

Function justifica(s: string; iMax: integer): string;
var
iCont: integer;
iPos: integer;
sAux: string;
begin
   // executa enquanto a string for maior que o comprimento da linha
   while Length(s) > iMax do
      begin
          iPos := iMax;
          // procura o espaço que será o final da linha
          while s[iPos] <> ' ' do
             iPos := iPos - 1;

          // carrega a substring a ser justificada
          sAux := copy(s, 0, iPos);
          delete(s, 1, iPos);

          iCont := iPos - 1;
          // inclui espaços até a substring ter o tamanho máximo da linha
          while iPos <> iMax do
             begin
                // posiciona o cursor para incluir o espaço
                while sAux[iCont] <> ' ' do
                   begin
                      iCont := iCont - 1;
                      if iCont < 0 then
                         iCont := iPos - 1;
                   end;
                Insert(' ', sAux, iCont);

                // ajusta o cursor para que não sejam incluídos mais espaços na
                // mesma posição de justificação
                while (sAux[iCont] = ' ') and (iCont > 0) do
                   iCont := iCont - 1;

                   iPos := iPos + 1;
                end;

                Result := Result + sAux;
             end;

         Result := Result + s;
         s1 := Result;
end;


procedure TQuickReport2.QuickRepBeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
   s := 'Displays a list of items from which a user can update a field in the current record. The list of display items is a property of the control. '+
        'TDBComboBox Combines an edit box with a list box. A user can update a field in the current record by choosing a value from the drop-down list or by entering a value. The list of display items is a property of the control. '+
        'TDBLookupListBox Displays a list of items from which a user can update a column in the current record. The list of display items is looked up in another dataset. '+
        'TDBLookupComboBox Combines an edit box with a list box. A user can update a field in the current record by choosing a value from the drop-down list or by entering a value. The list of display items is looked up in another dataset.';

   justifica(s,80);

   QuickReport2.QRMemo1.Lines.Text := s1;
end;

end.

OBS: O texto digitado na string S, sera formatado em uma linha de 80 colunas e sera mostrado no QR

abraço

Share this post


Link to post
Share on other sites
  • 0
como tenho uma variante de maiúsculas e minúsculas gerando esse recibo esse sistema ficou furado, umas linhas se encaixam e outras não, fora que corro o risco de cortar uma palavra no meio.

Alguém saberia me dizer como poderia fazer isso de uma forma melhor, que deixe justificado sem cortar palavras?

Tatiane.InterArt, há ainda a possibilidade de você utilizar os componentes TRichEdit associado ao TQRRichEdit.

você precisará, em design-mode :

- adicionar um componente TRichEdit ao form do seu relatório (não preocupe-se com qualquer configuração dele, simplesmente coloque ele em um cantinho do form);

- adicionar um TQRRichEdit e configurar a propriedade ParentRichEdit para apontar para o componente TRichEdit acionado no item anterior; Também, deverá setar a propriedade AutoStretch = True;

e no código:

- atribuir a sua string para o TRichEdit do form do relatório, via propriedade Lines.Text (como já lhe exemplificou o Jhonas) - RichEdit1.Lines.Text := s;

- utilizar a função para identação de RichEdit que coloquei neste post, para que o texto possa ser justificado após atribuido ao TRichEdit - JustifyRichEdit(RichEdit1, True);

Se você utilizar uma procedure no form do relatório para mostrar o texto (como meu exemplo anexo), o procedimento ficaria assim:

procedure TForm2.ImprimeDoc(S :string);
begin
  RichEdit1.Lines.Text := S;
  JustifyRichEdit(RichEdit1, True);
  QuickRep1.PreviewModal;
end;

a função, evidentemente deve estar na unit do relatório ou em uma unit de utilidades que seja referenciada nele.

Abraços

TstRichJustificado.zip

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148593
    • Total Posts
      644312
×
×
  • Create New...