Fonte: www.activedelphi.com.br
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 (existem apenas, taLeftJustify, taRightJustify e taCenter). Logo, temos que fazer uso de chamadas à API do Windows para que consigamos esta formatação.
Além do "Marcador de Texto", 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 os 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.
Além do "Marcador de Texto", 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 os 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.
Nenhum comentário:
Postar um comentário