Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Deixar texto justificado em relatório


Tatiane.InterArt

Pergunta

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?

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 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?

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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!

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...