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

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

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

  • Выравнивать текст по правой, левой границе или по центру.
  • Сохранять текст в свойстве Text и контролировать изменения с помощью свойства Modified.
  • Использовать строки текста как список строк.
  • Определять преобразование текста из кодировки ANSI в кодировку OEM при вводе.
  • Устанавливать режим переноса строки при достижении правой границы, для чего используется свойство
    WordWrap.
  • Использовать клавишу Enter при вводе текста, что определяется свойством WantReturns.
  • Использовать клавишу Tab при вводе текста, что определяется свойством WantTabs.
  • Использовать свойство AutoSelect для автоматического выделения текста при получении фокуса ввода.
    Для выделения всего текста используется метод SelectAll.

   
Компонент 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий