18.3.4. TRichEdit - ввод и отображение RTF-текста

Компонент TRichEdit представляет собой многострочный редактор, работающий с расширенным текстовым форматом RTF. Текст формата RTF хранит дополнительную служебную информацию, управляющую свойствами каждого абзаца и сменой шрифта по ходу текста.

Рис. 18.23. Окно демонстрационной программы DEMOS | RICHEDIT | RICHED1T.EXE

На рис. 18.23 показан пример использования возможностей компонента. Полный текст программы, с помощью которой создан рисунок, приводится в папке demos | RICHEDIT | RICHEDIT.DPR, котораянаходится в каталоге размещения Delphi.

Компонент использует вспомогательные объекты класса TTextAt-tributes для хранения атрибутов шрифта. Эти атрибуты распространяются на весь текст через свойство редактора DefAttributes или на выделенную часть текста - через его свойство SeiAttributes.

Помимо обычных шрифтовых свойств CharSet, Color, Height, Name, Pitch, Size И Style (см. класс TFont) объект TTextAttributes содержит также свойства consistentAttributes и protected. Первое доступно только для чтения и содержит набор текстовых характеристик, общих как для всего текста, так и для его выделенной части. Свойство protected защищает весь текст или его части от редактирования. Попытка изменить текст, имеющий атрибут protected, вызывает обработчик события OnProtectChange, который может разрешить или запретить изменения. По умолчанию изменения запрещены.

Для каждого текстового абзаца создается объект класса трага-Attributes, в котором сохраняются атрибуты абзаца. Эти атрибуты доступны через следующие свойства класса TparaAttributes:

property Alignment: TAlignment; | Определяет горизонтальное выравнивание текста абзаца относительно границ компонента
property Firstlndent: Longint; | Указывает отступ текста абзаца в пикселях от предыдущего абзаца
property Leftlndent: Longint; | Указывает отступ текста абзаца в пикселях от левого края компонента
TNumberingStyle = (nsNone, nsBullet) ; property Numbering: TNum beringStyle; | Указывает, надо ли вставлять слева от абзаца символы списка. Если содержит nsBullet, символы списка вставляются
property Rightlndent: Longint; | Указывает отступ текста абзаца в пикселях от правого края компонента
property Tab[Index: Byte] : Longing; | Для табулостопа с индексом index содержит его позицию в пикселях от левого края компонента
property TabCount: Irteger; | Определяет количество табулостопов в строке абзаца

Свойства класса TRichEdit

property DefAttributes: TTextAttributes; | Определяет шрифтовые атрибуты всего текста
TConversionClass = class of TConversion; property DefaultConverter: TConversionClass; | Свойство указывает класс конвертора, использующегося для преобразования текстовых форматов причтении или записи текста. По умолчанию нет преобразования
property HideScroliBars: Boolean; | Определяет, будет ли редактор автоматически вставлять полосы прокрутки, если текст отсекается границами компонента. Игнорируется, если scrollBars содержит ssNone
property HideSelection: Boolean; | Указывает, будет ли убираться выделение текста, если компонент потеряет фокус ввода
property Lines: TStrings; | Содержит набор строк текста. С помощью его методов LoadFromFile и SaveToFile компонент может читать текст из файла или записывать в него текст
property PageRect: TRect; | Указывает размеры страницы при печати на принтере
property Paragraph: TParaAttributes; | Содержит атрибуты текущего абзаца, т. е. абзаца с выделением или с текстовым курсором. Программа не может изменить свойство paragraph, но может изменить свойства связанного с ним абзаца
property PlainText: Boolean; | Запрещает/разрешает записывать в файл или читать из него служебную информацию формата RTF (True -запрещает)
property SelAttributes: TTextAttributes; | Определяет шрифтовые атрибуты выделенного текста
property SelLength: Integer; | Задает длину в символах выделенной части текста
property SelStart: Integer; | Определяет номер первого символа выделенной части текста от начала текста (нумерация символов начинается с 0). Если нет выделения, указывает символ, перед которым располагается текстовый курсор
property SelText: String; | Содержит выделенный текст. Установка нового значения SelText заменяет выделенный текст на новый, а если нет выделения - вставляет его в позицию курсора

Методы компонента:

procedure Clear; TSearchType = (stWholeWord, stMatchCase) ; TSearchTypes = set of TSear chType ; function FindText(const SearchStr: String; StartPos, Length: Integer; Options: TSear chTypes) :Integer; | Удаляет весь текст Ищет в тексте строку SearchStr и возвращает индекс первого ее символа при удачном поиске: StartPos - начало поиска: Length-длина строки, options указывает, будет ли поиск идти по целым словам и надо ли учитывать высоту букв
function GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer; | Копирует не более BufSize символов выделенного текста в буфер Buffer и возвращает количество скопированных символов
procedure Print(const Caption: String) ; | Форматирует текст по границам листа бумаги и печатает его на умалчиваемом принтере, caption определяет заголовок печати
TConversionClass = class of TConversion; class procedure RegisterConver- sionFormat(const AExtension: String; AConversionClass: TConversionClass) ; | Устанавливает соответствие между расширением файла AExtension и конвертором текста

Для компонента определены такие события:

TRichEditProtectChange = procedure(Sender: TObject; Start Pos, EndPos: Integer; var AllowChange: Boolean) of object property OnProtectChange: TRichE ditProtectChange; | Возникает при попытке изменить текст, имеющий атрибут Protected: StartPos, EndPos - соответственно начальная и конечная позиции изменяемого текста. В параметре AllowChange обработчик возвращает True, если можно изменять текст
TRichE'ditResizeEvent = proce dure (Sender: TObject; Rect: TRect) of object property OnResizeRequest: TRichEditResizeEvent; | Событие связано с перерисовкой текста из-за изменения размеров шрифта. Rect содержит прямоугольник, который будет перерисован
TRichEditSaveClipboard = procedure(Sender: TObject; NumObjects, NumChars: Integer; var SaveClipboard: Boolean) of object; property OnSaveClipboard: TRichEditSaveClipboard; | Возникает в момент уничтожения компонента и извещает его о том, что в clipboard осталась информация, которая помещена им. Если обработчик вернет False в параметре Save clipboard, буфер обмена будет очищен
property OnSelectionChange: TNotifyEvent; | Возникает при изменении выделенного текста