Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

Memo и RichEdit - многострочные окна редактирования

CuBook3.335

Компоненты Memo и RichEdit являются окнами редактирования многострочного текста. Они так же, как и окно Edit, снабжены многими функциями, свойственными большинству редакторов. В них предусмотрены типичные комбинации «горячих» клавиш: Ctrl+C - копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl+X - вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl+V - вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl+Z - отмена последней команды редактирования.
 
В компоненте Memo формат (шрифт, его атрибуты, выравнивание) одинаков для всего текста и определяется свойством Font. Если вы сохраните в файле текст, введенный или отредактированный пользователем, то будет создан текстовый файл, содержащий только символы, и не содержащий элементов форматирования. При последующем чтении этого файла в Memo формат будет определяться текущим состоянием свойства Font компонента Memo, а не тем, в каком формате ранее вводился текст.
 
Компонент RichEdit работает с текстом в обогащенном формате RTF. При желании изменить атрибуты вновь вводимого фрагмента текста вы можете задать свойство SelAttributes. Это свойство типа TTextAttributes, которое в свою очередь имеет подсвойства: Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и ряд других. Например, введите на форму компонент RichEdit, диалог выбора шрифта FontDialog со страницы Dialogs и кнопку Button, которая позволит пользователю менять атрибуты текста. В обработчик щелчка кнопки введите текст:
if(FontDialog1->Execute())
RichEdit1->SelAttributes->Assign(FontDialog1->Font) ;
RichEdit1->SetFocus();
Запустите приложение и увидите, что вы можете менять атрибуты текста, выполняя отдельные фрагменты различными шрифтами, размерами, цветами, стилями. Устанавливаемые атрибуты влияют на выделенный текст или, если ничего не выделено, то на атрибуты нового текста, вводимого начиная с текущей позиции курсора (позиция курсора определяется свойством SelStart).
В компоненте имеется также свойство DefAttributes, содержащее атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойстве SelAttributes. Но значения атрибутов в DefAttributes сохраняются и в любой момент эти значения могут быть методом Assign присвоены атрибутам свойства SelAttributes, чтобы вернуться к прежнему стилю.
 
Свойство DefAttributes доступно только во время выполнения. Поэтому его атрибуты при необходимости можно задавать, например, в обработчике события OnCreate.
За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойство Paragraph типа TParaAttributes. Этот тип в свою очередь имеет ряд свойств:
Значение Описание
Alignment Определяет выравнивание текста. Может принимать значения taLeftJustify (влево), taCenter (по центру) или taRightJustify (вправо).
Firstlndent Число пикселов отступа красной строки.
Numbering Управляет вставкой маркеров, как в списках. Может принимать значения nsNone - отсутствие маркеров, nsBullet - маркеры ставятся.
Leftlndent Отступ в пикселах от левого поля.
Rightlndent Отступ в пикселах от правого поля.
TabCount Количество позиций табуляции.
Tab Значения позиций табуляции в пикселах.
 
Значения подсвойств свойства Paragraph можно задавать только в процессе выполнения приложения, например, в событии создания формы или при нажатии какой-нибудь кнопки. Значения подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответственное выравнивание текущего абзаца:
RichEdit1->Paragraph->Alignment = taLeftJustify;
RichEdit1->Paragraph->Alignment = taCenter;
RichEdit1->Paragraph->Alignment = taRightJustify;
Следующий оператор приведет к тому, что текущий абзац будет отображаться как список, т.е. с маркерами:
RichEdit1->Paragraph->Numbering = nsBullet;
Уничтожение списка в текущем абзаце осуществляется оператором:
RichEdit1->Paragraph->Numbering = nsNone;
В целом, если с помощью компонента ActionList определено некоторое действие ввода и уничтожения списка, названное ABullet, то операторы обработки соответствующего действия могут иметь вид:
if (ABullet->Checked)
RichEdit1->Paragraph->Numbering = nsBullet;
else RichEdit1->Paragraph->Numbering = nsNone;
ABullet->Checked = ! ABullet->Checked;
Они обеспечивают переключение соответствующей быстрой кнопки и раздела меню из нажатого состояния (отмеченного) в не нажатое с соответствующим изменением вида текущего абзаца.
Свойства TabCount и Tab имеют смысл при вводе текста только при значении свойства компонента WantTabs = true. Это свойство разрешает пользователю вводить в текст символ табуляции. Если WantTabs = false, то нажатие пользователем клавиши табуляции просто переключит фокус на очередной компонент и символ табуляции в текст не введется.
 
Мы рассмотрели основные отличия Memo и RichEdit. Теперь остановимся на общих свойствах этих окон редактирования.
 
Свойства Alignment и WordWrap имеют тот же смысл, что, например, в метках, и определяют выравнивание текста и допустимость переноса длинных строк. Установка свойства Readonly в true задает текст только для чтения. Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = О, то длина текста не ограничена. Впрочем, реально она и в этом случае ограничена системой. Свойства WantReturns и WantTab определяют допустимость ввода пользователем в текст символов перевода строки и табуляции.
 
Свойство ScrollBars определяет наличие полос прокрутки текста в окне. По умолчанию ScrollBars = ssNone, что означает их отсутствие. Пользователь может в этом случае перемещаться по тексту только с помощью курсора. Можно задать свойству ScrollBars значения ssHorizontal, ssVertical или ssBoth, что будет соответственно означать наличие горизонтальной, вертикальной или обеих полос прокрутки. Окна Memo и RichEdit по-разному реагируют на задание полос прокрутки. В Memo задание этих полос означает, что они появляются независимо от размера текста в окне. А в RichEdit полосы появляются автоматически только в тех случаях, когда текст не помещается в окне.
 
Основное свойство окон Memo и RichEdit - Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, нажав кнопку с многоточием около свойства Lines в окне Инспектора Объектов. Перед вами откроется окно редактирования списков строк. Вы можете редактировать или вводить текст непосредственно в этом окне, или нажать кнопку CodeEditor и работать в обычном окне Редактора Кода. В этом случае, завершив работу с текстом, выберите из контекстного меню, всплывающего при щелчке правой кнопкой мыши, команду Close Page и ответьте утвердительно на вопрос, хотите ли вы сохранить текст в соответствующем свойстве окна редактирования.
 
Во время выполнения приложения вы можете заносить текст в окно редактирования с помощью методов свойства Lines типа TStrings. Весь текст, представленный одной строкой типа String, внутри которой используются разделители типа символов возврата каретки и перевода строки, содержится в свойстве Text.
 
Доступ к отдельной строке текста вы можете получить с помощью свойства AnsiString Strings[int Index], Индексы, как и везде в C++Builder, начинаются с 0. Так что Memo1->Lines->Strings[0] - это текст первой строки. Учтите, что если окно редактирования изменяется в размерах при работе с приложением и свойство WordWrap = true, то индексы строк будут изменяться при переносах строк, так что в этих случаях индекс мало о чем говорит.
Свойство только для чтения Count указывает число строк в тексте. Для очистки текста в окне надо выполнить процедуру Clear. Этот метод относится к самому окну, а не к его свойству Lines.
 
Для занесения новой строки в конец текста окна редактирования можно воспользоваться методами Add или Append свойства Lines. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в файле осуществляется методом SaveToFile.
 
Пусть, например, в вашем приложении имеется окно редактирования Edit1, в котором пользователь вводит имя сотрудника, и есть кнопка, при щелчке на которой в окно Memo1 должна занестись шапка характеристики этого сотрудника, после чего пользователь может заполнить текст характеристики. Обработчик щелчка на кнопке может иметь вид:
Memo1->Clear();
Memo1->Lines->Add("Характеристика");
Memo1->Lines->Add("Сотрудник "+Edit1->Text);
Memo1->SetFocus();
Свойство SelStart компонентов Memo и RichEdit указывает позицию курсора в тексте или начало выделенного пользователем текста. Свойство CaretPos указывает на структуру, поле X которой содержит индекс символа в строке, перед которым расположен курсор, а поле Y - индекс строки, в которой находится курсор. Таким образом, учитывая, что индексы начинаются с 0, значения RichEdit1->CaretPos.у+1 и RichEdit1->CaretPos.x+1 определяют соответственно номер строки и символа в ней, перед которым расположен курсор.
Для окон RichEdit имеется множество сообщений Windows, позволяющих управлять отображением текста в окне, выделением отдельных фрагментов текста (слов, строк), прокруткой текста и т.п.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий