5.5.3 Программное формирование текста в RichEdit

Рис. 5.12. Документ с форматированием строк (а) и отдельных слов (б)

Приведенный способ формирования документа допускает форматирование только отдельных абзацев, так как форматирование распространяется на весь текст, вводимый методом Add и заканчивающийся символами окончания строки "#13#10". Но часто желательно иметь возможность форматировать отдельные слова или фрагменты, не завершающиеся концом строки. В этих случаях занесение очередных фрагментов текста в приложениях VCL Win32 удобно осуществлять методом SetSelTextBuf (в VCL .NET этот метод отсутствует). В метод передается указатель на строку с нулевым символом в конце, содержащую вставляемый текст. А позиция вставки определяется свойством SelStart компонента RichEdit.

Если в тексте есть выделенный фрагмент, то свойство SelStart указывает на начало выделения, а другое свойство - SelLength определяет длину выделенного текста в символах. Если же выделенного текста нет, то SelLength = 0, а SelStart указывает на текущую позицию, в которой расположен курсор. Так что при наличии выделенного текста метод SetSelTextBuf заменяет его новым текстом. А если выделения нет, текст вставляется в текущую позицию курсора.

Ниже приведен пример, аналогичный предыдущему, но обеспечивающий выделение жирным шрифтом фамилий, как показано на рис. 5.12 б:

RichEditl.Clear;

RichEditl.SelAttributes.Name := 'Courier New'; RichEditl.SelAttributes.Size := 14; RichEditl.Paragraph.Alignment := taCenter; RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style + [fsBold]; RichEditl.Lines.Add('ДОГОВОР'); RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style - [fsBold];
RichEditl.Lines.Add('О ' + AnsiUpperCase(Edit1.Text));
RichEditl.SelAttributes.Size := 10;
RichEditl.Paragraph.Alignment := taLeftJustify;
RichEditl.Paragraph.Firstlndent := 15;
RichEditl.Paragraph.Leftlndent := -15;

RichEditl.Lines.Add('Зицпредседатель конторы "Рога и копыта" '); // Обход двух последних символов, завершающих строку RichEditl.SelStart := RichEdit1.SelStart - 2; RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style + [fsBold]; RichEditl.SetSelTextBuf('Фунт'); RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style - [fsBold]; RichEditl .SetSelTextBuf ( ' и M^-RichEditl. SelAttributes . Style : =

RichEditl.SelAttributes.Style + [fsBold];
RichEditl.SetSelTextBuf(PChar(Edit2.Text));

RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style - [fsBold];
RichEditl.SetSelTextBuf(' заключили настоящий договор ...');

Начало кода совпадает с приведенным ранее. Но текст, вставляемый методом Add, обрывается перед фамилией "Фунт". Затем значение свойства SelStart уменьшается на 2. Дело в том, что после применения метода Add в текст заносятся символы "#13#10" и курсор располагается после них. Так как нам нужно продолжать текст в той же строке, надо сдвинуть курсор на 2 символа назад, чтобы он расположился перед этими символами. Дальнейшее, вероятно, понятно без дополнительных объяснений. Устанавливается полужирный шрифт, методом SetSelTextBuf заносится текст "Фунт", убирается полужирный шрифт, заносится текст и " и т.д.

Того же эффекта выделения отдельных фрагментов текста можно было бы добиться иначе. Сначала сформировать весь текст без выделения, как это было сделано в первом примере, а затем найти нужные слова, выделить их и задать требуемое форматирование. Например, приведенный выше первый пример можно было бы дополнить операторами:

RichEditl.SelStart := Pos('Фунт', RichEditl.Text)-1; RichEditl.SelLength := Length('Фунт'); RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style + [fsBold]; RichEditl.SelStart := Pos(Edit2.Text, RichEditl.Text)-1; RichEditl.SelLength := Length(Edit2.Text); RichEditl.SelAttributes.Style :=

RichEditl.SelAttributes.Style + [fsBold];

Результат будет идентичным приведенному на рис. 5.12 б.

В данном примере поиск позиции, с которой начинается выделяемый фрагмент, осуществляется функцией Pos, применимой к любым строкам. Первый параметр функции указывает искомый фрагмент, а второй - строку, в которой проводится поиск. Функция возвращает позицию первого вхождения фрагмента в строку или -1, если фрагмент не найден.

5.5.2 Форматирование абзацев || Оглавление || 5.5.4 Печать документа


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Сентябрь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс