Шаг 5.
Вкладка Win32. Компонент TRichEdit

    На этом шаге мы рассмотрим компонент TRichEdit.

    Компонент TRichEdit (Текстовый редактор) представляет собой стандартный элемент управления Windows, адаптированный для работы в Delphi, как и большинство других элементов управления Windows. По сравнению с компонентов TMemo он обладает дополнительными возможностями, такими как форматирование отдельных абзацев текста и выбор шрифта, поддержка формата RTF и т.д. Текстовый редактор позволяет выполнять следующие действия:

    Компонент TRichEdit можно применять только в приложениях, использующих библиотеку VCL.

    Основная особенность данного компонента - это возможность форматирования отдельных абзацев. Такое форматирование выполняется на основе двух свойств компонента: Paragraph - определяющего характеристики текущего абзаца текста и SelAttributes - определяющего характеристики выделенного текста. Свойство Paragraph имеет тип TParaAttributes. Основные свойства этого типа приведены ниже в таблице.

   
Таблица 1. Свойства типа TParaAttributes
Свойство Описание
property Alignment: TAlignment; Выравнивание. Возможныt значения:
  • taLeftJustify (По левому краю),
  • taCenter (По центру) и
  • taRightJustify (По правому краю).
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.

   
Таблица 2. Свойства компонента 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 перечислены в таблице.

   
Таблица 3. Методы компонента 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 определяет заголовок печати

    События компонента представлены в таблице.

   
Таблица 4. События компонента TRichEdit
Событие Описание
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.




Предыдущий шаг Содержание Следующий шаг