На этом шаге мы рассмотрим компонент TRichEdit.
Компонент TRichEdit (Текстовый редактор) представляет собой стандартный элемент управления Windows, адаптированный для работы в Delphi, как и большинство других элементов управления Windows. По сравнению с компонентов TMemo он обладает дополнительными возможностями, такими как форматирование отдельных абзацев текста и выбор шрифта, поддержка формата RTF и т.д. Текстовый редактор позволяет выполнять следующие действия:
Компонент TRichEdit можно применять только в приложениях, использующих библиотеку VCL.
Основная особенность данного компонента - это возможность форматирования отдельных абзацев. Такое форматирование выполняется на основе двух свойств компонента: Paragraph - определяющего характеристики текущего абзаца текста и SelAttributes - определяющего характеристики выделенного текста. Свойство Paragraph имеет тип TParaAttributes. Основные свойства этого типа приведены ниже в таблице.
Свойство | Описание |
---|---|
property Alignment: TAlignment; | Выравнивание. Возможныt значения:
|
property FirstIndent: LongInt; | Определяет отступ текста первой строки абзаца в пикселях от левого края рабочей зоны компонента |
property LeftIndent: LongInt; | Определяет отступ остальных строк текста абзаца в пикселях от границы, устанавливаемой свойством FirstIndent |
property RightIndent: LongInt; | Определяет отступ текста абзаца в пикселях от правого края компонента |
property Numbering: TNumberingStyle; | Превращение текста в список. Такое форматирование происходит при значении nsBullet свойства |
property Tab [Index: Byte] : LongInt; | Массив сдвигов (абсолютных позиций по отношению к левой границе), которые определяют, где будет останавливаться курсор при нажатии клавиши Tab |
property TabCount : Integer; | Число элементов в массиве Tab |
Рассмотрим свойства компонента TRichEdit.
Свойство | Описание |
---|---|
property DefAttributes: TTextAttributes; | Определяет шрифтовые атрибуты всего текста |
property HideScrollBars: 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 заменяет выделенный текст новым, а если нет выделения - вставляет его в позицию курсора |
Методы компонента TRichEdit перечислены в таблице.
Метод | Описание |
---|---|
procedure Clear; | Удаляет весь текст |
function FindText (const SearchStr: String; StartPos, Length: Integer; Options: TSearchTypes): Integer; | Ищет в тексте строку SearchStr и возвращает индекс первого ее символа при удачном поиске: StartPos - начало поиска: Length - длина строки. Options указывает, будет ли поиск идти по целым словам и надо ли учитывать регистр букв |
function GetSelTextBuf (Buffer: PChar; BufSize: Integer): Integer; | Копирует не более BufSize символов выделенного текста в буфер Buffer и возвращает количество скопированных символов |
procedure Print (const Caption: String); | Форматирует текст по границам листа бумаги и печатает его на принтере, заданном по умолчанию. Параметр Caption определяет заголовок печати |
События компонента представлены в таблице.
Событие | Описание |
---|---|
type TRichEditProtectChange = procedure (Sender: TObject; StartPos, EndPos: Integer; var AllowChange: Boolean) of object; property OnProtectChange: TRichEditProtectChange; |
Возникает при попытке изменить текст, имеющий атрибут Protected: StartPos, EndPos - соответственно начальная и конечная позиции изменяемого текста. В параметре AllowChange обработчик возвращает значение True, если можно изменять текст |
type TRichEditResizeEvent = procedure (Sender: TObject; Rect: TRect) of object; property OnResizeRequest: TRichEditResizeEvent; |
Событие связано с перерисовкой текста из-за изменения размеров шрифта. Параметр Rect содержит прямоугольник, который будет перерисован |
type TRichEditSaveClipboard = procedure (Sender: TObject; NumObjects, NumChars: Integer;
var SaveClipboard: Boolean) of object; property OnSaveClipboard: TRichEditSaveClipboard; |
Возникает в момент удаления компонента и извещает его о том, что в буфере обмена осталось помещенная компонентом информация. Если обработчик вернет значение False в параметре SaveClipboard, буфер обмена будет очищен |
property OnSelectionChange: TNotifyEvent; | Возникает при изменении выделенного текста |
Рассмотрим пример загрузки нескольких RTF файлов в RichEdit. Для этого помещаем на форму RichEdit1, Button1, OpenDialog1 и создаём следующую процедуру:
procedure TForm1.Button1Click(Sender: TObject); var i, nFiles: integer; FileNames, UnitedText, Separator, Tmp: String; TextStream: TStringStream; begin TextStream := TStringStream.Create(''); Separator := 'par par par '; // Это разделитель между // файлами, в данном случае - 3 параграфа. UnitedText := ''; // Чтобы можно было выбрать несколько файлов. OpenDialog1.Options := OpenDialog1.Options + [ofAllowMultiSelect]; // Предусмотрительно увеличиваем максимальный // объем загружаемых данных в RichEdit1. RichEdit1.MaxLength := $7FFFFFF0; try // А вдруг что.. if OpenDialog1.Execute then begin nFiles := OpenDialog1.Files.count - 1; for i := 0 to nFiles do begin FileNames := OpenDialog1.Files.Strings[i]; RichEdit1.Lines.LoadFromFile(FileNames); // Открываем каждый файл поочереди в RichEdit1 RichEdit1.Lines.SaveToStream(TextStream); // и записываем данные уже от туда в поток TextStream, Tmp := TextStream.DataString; // а из потока во временную // переменную Tmp типа String. TextStream.Position := 0; // ставим указатель в потоке на 0. if i = 0 then // Проверяем - является ли данный Tmp := copy(Tmp, 0, length(Tmp) - 5) // файл первым, последним, else if i = nFiles then // или между ними, в зависимости Tmp := Separator + copy(Tmp, 2, length(Tmp)) // от этого удаляем управляющие else // символы начала или окончания Tmp := Separator + copy(Tmp, 2, length(Tmp) - 5); // RTF-файла и всталяем разделитель. // Дело в том, что каждый RTF-файл // начинаетcя c символа '( и заканчивается '). UnitedText := UnitedText + Tmp; // записываем все в переменную UnitedText. end; TextStream.WriteString(UnitedText); // Помещаем уже объедененный текст в поток. TextStream.Position := 0; // Ставим указатель на 0 RichEdit1.Lines.LoadFromStream(TextStream); // и записываем потом в RichEdit1. end; finally TextStream.Free; end; end;
Рис.1. Пример загрузки нескольких RTF файлов в RichEdit
Текст этого примера можно взять здесь.
На следующем шаге мы рассмотрим компонент TTrackBar.