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

Justificação E Entre-linhas Em Richedit


Micheus

Pergunta

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

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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

Editado por wania oliveira
Link para o comentário
Compartilhar em outros 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?

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

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

Editado por Micheus
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
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...