Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
Micheus

Justificação E Entre-linhas Em Richedit

Question

A partir do RichEdit 3.0 é possível justificar parágrafo/texto em um RichEdit.

Entretanto, no componente TRichEdit (ao menos até a versão 7), não há esta opção de alinhamento (apenas, taLeftJustify, taRightJustify e taCenter). Logo, temos que fazer uso de chamadas à API do Windows para que consigamos esta formatação.

Um outro recurso que pode ser aproveitado por quem utilizar TRichEdit em pequenos editores de texto é a variação do entre-linhas.

Abaixo, seguem duas funções para estes recursos mencionados:

// AllText : True=todo o texto; False=parágrafo atual
procedure JustifyRichEdit(RichEdit :TRichEdit; AllText :Boolean);
const
  TO_ADVANCEDTYPOGRAPHY   = $1;
  EM_SETTYPOGRAPHYOPTIONS = (WM_USER + 202);
  EM_GETTYPOGRAPHYOPTIONS = (WM_USER + 203);
var
  ParaFormat :TParaFormat;
  SelStart,
  SelLength :Integer;
begin
  ParaFormat.cbSize := SizeOf(ParaFormat);
  if SendMessage(RichEdit.handle, 
              EM_SETTYPOGRAPHYOPTIONS, 
              TO_ADVANCEDTYPOGRAPHY, 
              TO_ADVANCEDTYPOGRAPHY) = 1 then
  begin
    SelStart := RichEdit.SelStart;
    SelLength := RichEdit.SelLength;
    if AllText then
      RichEdit.SelectAll;
    ParaFormat.dwMask := PFM_ALIGNMENT;
    ParaFormat.wAlignment := PFA_JUSTIFY;
    SendMessage(RichEdit.handle, EM_SETPARAFORMAT, 0, LongInt(@ParaFormat));
 // Restaura seleção caso tenhamos mudado para All
    RichEdit.SelStart := SelStart;
    RichEdit.SelLength := SelLength;
  end;
end;
// Espaçamento: 0=simples; 1=1,5; 2=duplo
procedure LineSpaceRichEdit(RichEdit :TRichEdit; Espacamento :Integer; AllText :Boolean);
var
  ParaFormat :TParaFormat2;
begin
  if AllText then
    RichEdit.SelectAll;
  ParaFormat.cbSize := SizeOf(ParaFormat);
  ParaFormat.dwMask := PFM_LINESPACING or PFM_SPACEAFTER;
  ParaFormat.dyLineSpacing := Espacamento;
  ParaFormat.bLineSpacingRule := Espacamento;
  SendMessage(RichEdit.handle, EM_SETPARAFORMAT, 0, LongInt(@ParaFormat));
 // Restaura seleção caso tenhamos mudado para All
  RichEdit.SelStart := SelStart;
  RichEdit.SelLength := SelLength;
end;

Para usá-las, você possui 2 alternativas:

1) Todo o texto:

JustifyRichEdit(RichEdit1, True); // justifica todo o texto

LineSpaceRichEdit(RichEdit1, 2, True); // espaçamento duplo em todo o texto

2) Parâgrafo atual ou selecionado(s):

JustifyRichEdit(RichEdit1, False); // justifica parágrafo(s)

LineSpaceRichEdit(RichEdit1, 1, False); // espaçamento 1,5 no(s) paragrafo(s)

Obs: É necessário declarar a unit RichEdit na cláusula uses do seu form.

Espero que sejam úteis.

Abraços

______________

Ref. msdn: About Rich Edit Controls

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Estou tentando usar as duas procedures apresentadas acima, e a segunda procedure que trata a questão do espaçamento ( 0=simples; 1=1,5; 2=duplo) , passando qualquer um dos valores citados não acontece nada. Preciso que meu texto tenha espaçamento de 1,5 entre linhas. Alguém pode me ajudar?

Estou usando:

versão do Delphi : Delphi 7

Sistema Operacional : windows xp

Edited by wania oliveira

Share this post


Link to post
Share on other sites
  • 0

wania oliveira, como é que você está usando estas funções? Voce está chamando elas via algum botão, evento (tipo OnShow)? Está passando um componente do tipo TRichEdit ou é o richedit do quickreport ou similar?

Dá para exemplificar?

Share this post


Link to post
Share on other sites
  • 0

Estou fazendo a chamada as duas procedure no evento AfterOpen do Client Dataset que está sendo usado para um relatório no Rave.

No caso a procudure JustifyRichEdit funcionou com sucesso. Já a procedure LineSpaceRichEdit não acontece nada. Esta variável metexto é uma varável do tipo TRichedit.

metexto := TRichedit.Create(nil);

//aqui eu monto o texto que será exibido na metexto

metexto.Lines.Add('A ' + Trim(FieldByName('NM_RzaSclUndOpr').AsString) +

' confere o presente ' + Trim(FieldByName('NM_TrmGlsTpoDcmCnc').AsString) + ' ' + Trim(Maiuscula(FieldByName('NM_TrmOrg').AsString)) +

' a '+ Trim(Maiuscula(FieldByName('NM_CmtPsaFsc').AsString)) +

', nascido(a) em ' + Trim(FieldByName('DT_NscPsaFsc').AsString)+

', nacionalidade ' + Trim(FieldByName('DC_NcnPsaFsc').AsString) +

', natural de '+ Trim(FieldByName('NM_LclNtl').AsString) +

', portador(a) da Carteira de Identidade nº '+ Trim(FieldByName('NR_IdnPsaFsc').AsString) +

', expedida pelo(a) ' + Trim(FieldByName('DC_OroExoIdnPsaFsc').AsString) + ', em ' + Trim(FieldByName('DT_EmsDcmPsaFsc').AsString) +

', considerando a conclusão d' + Trim(FieldByName('NM_PrxTtcAcoEdc').AsString) + ' '+ Trim(FieldByName('NM_TpoAcoEdc').AsString) + ' de '+ Trim(FieldByName('NM_TrmOrg').AsString) +

', no período de '+ FieldByName('DT_IncDiaLtvTrmOrg').AsString +' a ' + FieldByName('DT_TroDiaLtvTrmOrg').AsString + '.');

JustifyRichEdit(metexto, True);

LineSpaceRichEdit(metexto, 1, True);

Share this post


Link to post
Share on other sites
  • 0
Estou fazendo a chamada as duas procedure no evento AfterOpen do Client Dataset que está sendo usado para um relatório no Rave.

No caso a procudure JustifyRichEdit funcionou com sucesso. Já a procedure LineSpaceRichEdit não acontece nada. Esta variável metexto é uma varável do tipo TRichedit.

Nada como um pouco de informação...

wania oliveira, usei muito pouco o Rave, mas eu acho que isto não vai funcionar com o ele.

Voce teria que ter acesso ao componente richedit seja ele qual for (VCL:TRichEdit/TDBRichEdit, QuickReport:TQRRichEdit/TQRDBRichEdit, JVCL:TJvRichEdit/TJvDBRichEdit,...) - isto é possível com o Rave?

Eu acredito que a justificação está funcionando porque talvez você assim a configurou no componente no Rave Designer (seria isso?).

metexto := TRichedit.Create(nil);

//aqui eu monto o texto que será exibido na metexto

Como é que este metexto vai parar "dentro" do relatório Rave? O Rave tem componente RichEdit? Só lembro de ter Memo. :huh:

_______

Eu pesquisei um pouco, e vi que provavelmente você usa um TMemoBuf através da propriedade RichEdit (string) (mas pela hierarquia dele não tenho certeza de que ele tratará todas as funcionalidades do richedit - teria que conhecer o seu código ou ter uma documentação mais completa)

Edited by Micheus

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  



  • Forum Statistics

    • Total Topics
      148575
    • Total Posts
      644272
×
×
  • Create New...