Тула 2014 г.
1. ЦЕЛЬ И ЗАДАЧИ РАБОТЫ
Изучение возможностей по отображению, вводу и редактированию текстовой информации в среде Borland Delphi.
2. ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ
В Delphi важную роль в операциях с текстовыми данными играет класс TStrings. Для отображения надписей служит компонент Label. Ввод и редактирование информации выполняются в специальных полях. При необходимости пользователь может изменить отображаемые данные. Для обеспечения возможности редактирования информации Delphi предлагает различные компоненты, например, Edit, MaskEdit, Memo и RichEdit.
Класс TStrings является базовым классом для объектов, которые представляют список строк. От класса TStrings происходит большое количество производных классов, например, TStringList. Для операций со строками класс TStrings предоставляет соответствующие свойства и методы, которые позволяют:
° добавлять и удалять строки с определенной позиции в списке;
° переставлять строки в списке;
° обеспечить доступ к строке в конкретном месте;
° читать строки из файла или записывать в файлы или потоки;
° сопоставлять объекты с каждой строкой в списке;
° хранить и искать строки.
Визуальные компоненты, способные работать со списком строк, имеют свойства, которые являются массивами строк, содержащихся в этих компонентах. Например, для списков ListBox и RadioGroup таким свойством является Items, а для многострочных редакторов Memo – Lines.
Рассмотрим особенности и использование класса TStrings на примере свойства Items списков. Работа с другими объектами типа TStrings отличий не имеет.
Каждый элемент списка является строкой, к которой можно получить доступ по её номеру в массиве строк Items. Отсчёт элементов списка начинается с нуля. Для обращения к первому элементу нужно указать Items [0], ко второму – Items [1], к третьему – Items [2] и т. д.
Свойство Count задаёт число элементов в списке. Поскольку первый элемент списка имеет нулевой номер, то номер последнего элемента Count-1.
Методы Add и Insert служат для добавления и вставки, соответственно, строк в список. Функция Add (const S: String): Integer добавляет заданную параметром S строку в конец списка, а процедура Insert (Index: Integer; const S: String) вставляет строку S на позицию с номером, определяемым параметром Index. При вставке строки элементы списка, находившиеся до операции вставки в указанной позиции и ниже, смещаются вниз.
Для удаления элементов списка используются методы Delete и Clear. Процедура Delete (Index: Integer) удаляет элемент с номером, заданным параметром Index, а процедура Clear очищает список, удаляя все его элементы.
Поиск элемента в списке можно выполнить с помощью метода IndexOf. Процедура IndexOf (const S: String): Integer определяет, содержится ли строка S в списке. В случае успешного поиска процедура возвращает номер позиции найденной строки в списке. Если строковый элемент не найден, то возвращается значение -1.
Класс TStrings имеет методы SaveToFile и LoadFromFile, позволяющие непосредственно работать с текстовыми файлами. Процедура SaveToFile (const FileName: String) сохраняет строковые элементы списка в файле FileName. Если заданный файл отсутствует на диске, то он создается. Процедура LoadFromFile (const FileName: String) заполняет список содержимым указанного текстового файла, при этом предыдущее содержимое списка очищается.
При конструировании приложения изменение списка строк выполняется с помощью Редактора списка строк – String List Editor (рис. 1). Его вызов выполняется через Инспектор объектов двойным щелчком мыши в области значения свойства типа TStrings.Редактор списка строк позволяет добавлять строки в список, удалять их из списка и изменять содержимое имеющихся строк.
Рис. 1. Редактор списка строк
Надпись представляет собой нередактируемый текст и часто используется в качестве заголовков для других элементов, которые не имеют своего свойства Caption. Для отображения надписей используется компонент Label.
Для управления автоматической коррекцией размеров компонента Label в зависимости от текста надписи служит логическое свойство AutoSize. Если свойство имеет значение True (по умолчанию), то компонент Label изменяет свои размеры соответственно содержащемуся в нём тексту, заданному в свойстве Caption.
Способ выравнивания текста внутри компонента Label задаёт свойство Alignment, которое может принимать одно из значений:
° taLeftJustify (выравнивание по левому краю);
° taCenter (выравнивание по центру);
° taRightJustify (выравнивание по правому краю).
Управлять автоматическим переносом слов, не умещающихся по ширине, на другую строку можно с помощью логического свойства Wordwrap. При этом следует учитывать, что если свойство AutoSize имеет значение True, то свойства Alignment и Wordwrap не действуют.
Надпись может быть прозрачной или залитой цветом, что определяется логическим свойством Transparent. Цвет заливки устанавливается свойством Color. Прозрачный компонент Label может понадобиться в случаях, когда надпись размещается поверх рисунка и не должна закрывать изображение.
Для отображения нередактируемого текста также используют компонент StaticText, расположенный на странице Additional Палитры компонентов. По функциональному назначению Label и StaticText практически не отличаются. Однако компонент StaticText является наследником класса TwinControl и может отображаться в рамке, вид которой определяется его свойством BorderStyle.
Однострочный редактор, или поле редактирования, представляет собой поле ввода текста, в котором возможно отображение и изменение текста. В среде Delphi имеется несколько однострочных редакторов, из них наиболее часто используется компонент Edit, находящийся на странице Standard Палитры компонентов.
Компонент Edit позволяет вводить и редактировать с клавиатуры различные символы, при этом поддерживаются операции, такие как перемещение по строке с использованием клавиш управления курсором, удаление символов с помощью клавиш BackSpace и Delete, выделение части текста и др. Отметим, что у однострочного редактора отсутствует реакция на управляющие клавиши Enter и Esc.
Центральным свойством компонента является свойство Text, которое содержит отображаемую компонентом строку.
Для проверки информации, вводимой в редакторы, можно использовать обработчики событий нажатия клавиш, например обработчик события onKeyPress.
В следующем примере для редактора Edit1 установлено разрешение ввода только десятичных цифр:
procedure TForm1.Edit1KeyPress (Sender :TObject; var Key :Char);
begin
if (Key < '0') or (Key > '9') then Key := #0;
end;
Компонент MaskEdit, расположенный на странице Additional Палитры компонентов, также является однострочный редактор, но по сравнению с компонентом Edit он имеет возможность ограничения вводимой информации по шаблону (маске). С помощью шаблона можно ограничить число вводимых пользователем символов и тип вводимых символов (алфавитный, цифровой и т. д.). Кроме того, во вводимую информацию можно вставить дополнительные символы (разделители при вводе даты, времени и т. п.). Шаблон задаётся свойством EditMask.
Рис. 2. Шаблон маски и её вывод
Свойство EditText содержит текст до наложения на него маски ввода (т.е. то, что ввёл пользователь), а свойство Text может (в зависимости от шаблона) содержать либо исходный текст, либо результат наложения на него маски.
Шаблон состоит из трех частей (рис. 2), отделенных друг от друга символами точки с запятой (;). Первая часть задаёт маску ввода, вторая – это символ 0 или 1, определяющий, нужно ли записывать в свойство Text результат наложения маски (1) или требуется оставить исходный текст (0). В третьей части указывается символ, который в поле с маской ввода будет присутствовать в местах, предназначенных для ввода символов (текст в поле может содержать символы маски).
Маска состоит из описателей мест ввода, специальных символ и литералов. Описатель указывает, какой именно символ может ввести пользователь в данное место (описатель всегда указывает место для одного символа). Литерал вставляется в текст, показываемый в окне редактора, но при вводе курсор перескакивает через литерал и не даёт пользователю возможности изменить его.
Описатели мест ввода маски | |
L | Должно содержать букву |
l | Может содержать букву |
А | Должно содержать букву или цифру |
a | Может содержать букву или цифру |
C | Должно содержать любой символ |
c | Может содержать любой символ |
Должно содержать цифру | |
Может содержать цифру | |
# | Может содержать цифру, а также знаки + и - |
Специальные символы маски | |
\ | Следующий символ – литерал. Позволяет вставлять в маску символы, относящиеся к описателям мест ввода и специальным символам |
: | На это место вставляется символ-разделитель Windows для часов, минут, секунд |
/ | На это место вставляется символ-разделитель Windows для полей даты |
; | Разделитель частей шаблона |
! | Подавляет все начальные пробелы |
> | Все следующие за этим символом места ввода преобразуют буквы в прописные |
< | Все следующие за этим символом места ввода преобразуют буквы в строчные |
<> | Отменяет преобразование букв |
Для работы с многострочным текстом Delphi предоставляет компонент Memo, расположенный на странице Standard Палитры компонентов. Многострочный редактор имеет практически те же возможности по редактированию текста, что и однострочные. Главное его отличие в том, что он содержат несколько строк текста.
Для доступа ко всему содержимому многострочного редактора используется свойство Text. В этом случае всё содержимое компонента Memo представляется одной строкой, а конец строки, вставляемый при нажатии клавиши Enter, записывается двумя кодами #13#10, поэтому видимых пользователем символов будет меньше, чем их содержится в строке Text. Эту особенность нужно учитывать, например, при определении позиции заданного символа в какой-либо строке компонента Memo. Для работы с отдельными строками используется свойство Lines.
Содержимое компонента Memo можно загружать из текстового файла и сохранять в текстовом файле.
Для удобного просмотра информации можно задать в поле редактирования полосы прокрутки с помощью свойства ScrollBars, принимающего значения:
° ssNone – полосы прокрутки отсутствуют (по умолчанию);
° ssHorizontal – горизонтальная полоса прокрутки снизу;
° ssVertical – вертикальная полоса прокрутки справа;
° ssBoth – есть обе полосы прокрутки.
Текст в поле компонента Memo может быть выровнен различными способами. Способ выравнивания определяет свойство Alignment.
В отличие от однострочного редактора, компонент Memo обладает возможностью реакции на нажатие клавиши Enter. Чтобы при этом происходил ввод новой строки, свойству WantReturns должно быть установлено значение True (по умолчанию).
Аналогично значение свойства WantTabs определяет реакцию компонента на нажатие клавиши Таb. Если свойство установлено в значение True, то при нажатии клавиши Таb в текст вставляются символы табуляции. По умолчанию свойство WantTabs имеет значение False, и при нажатии клавиши Таb редактор передаёт фокус ввода следующему оконному элементу управления.
Компонент RichEdit, расположенный на странице Win32 Палитры компонентов, является компонентом редактирования с форматированием текста и поддерживает выравнивание, табуляцию, применение отступов, изменение гарнитуры и др. Текст, содержащийся в этом элементе, совместим с форматом RTF, поддерживаемым многими текстовыми процессорами в среде Windows.
Компоненты, используемые для редактирования информации, похожи друг на друга и, соответственно, имеют много общих свойств, событий и методов.
При любых изменениях в содержимом редактора возникает событие OnChange, которое можно использовать для проверки текста, содержащегося в поле ввода, например, для оперативного контроля правильности набора данных.
Для указания максимального количества символов, которые допускается вводить в поле редактирования, можно использовать свойство MaxLength. При этом ограничение на длину текста относится к вводу со стороны пользователя, а программно можно ввести большее. По умолчанию длина вводимого пользователем текста не ограничена (MaxLength = 0).
Свойства AutoSelect, SelStart, SelLength и SelText позволяют работать с выделенным фрагментом текста. Эти свойства доступны не только для чтения, но и для записи текста.
Логическое свойство AutoSelect определяет, будет ли автоматически выделен текст в поле редактирования при получении последним фокуса ввода.
Значение свойства SelText определяет выделенный фрагмент. При отсутствии выделенного текста значением свойства является пустая строка.
Свойства SelStart и SelLength задают начальную позицию в строке (отсчёт символов начинается с нуля) и длину выделенного фрагмента соответственно. Свойства SelStart и SelLength взаимозависимы.
Кроме свойств, для операций с выделенным фрагментом текста используются также методы SelectAll, CopyToClipBoard и CutToClipBoard.
Метод SelectAll выделяет весь текст в элементе редактирования.
Метод CopyToClipBoard копирует, a CutToClipBoard вырезает в буфер обмена выделенный фрагмент текста. Для работы с буфером обмена имеется также метод PasteFromClipBoard, вставляющий текст из буфера обмена в текущую позицию курсора в поле редактирования. Если имеется выделенный фрагмент, то вставляемый текст заменяет его.
Для проверки текста, введенного в поле редактирования, можно использовать событие OnExit, возникающее при окончании ввода, т. е. при потере этим элементом фокуса ввода.
Основное назначение полей редактирования – ввод и изменение текста, однако их можно использовать и для отображения нередактируемого текста, например, при выводе справочной информации. С этой целью нужно установить соответствующие значения свойств ReadOnly или Enabled.
Список представляет собой упорядоченную совокупность взаимосвязанных строк. Элементы списка могут быть отсортированы в алфавитном порядке или размещены в порядке их добавления в список. Как и другие объекты, представляющие собой совокупность данных, списки позволяют добавлять, удалять и выбирать отдельные их элементы (строки).
Простой список представляет собой прямоугольную область, в которой располагаются его строковые элементы. Для работы с простым списком в среде Delphi предназначен компонент ListBox, расположенный на странице Standard Палитры компонентов. Если количество строк больше, чем их может поместиться в видимой области списка, то у области отображения появляется полоса прокрутки. Ориентация полосы прокрутки, а также число столбцов, которые одновременно видны в области списка, зависят от свойства Columns. По умолчанию свойство имеет значение 0 ( все элементы списка расположены в одном столбце, и при необходимости автоматически появляется полоса прокрутки).
Если свойство Сolumns имеет значение, большее 0, то в области списка всегда присутствует горизонтальная полоса прокрутки, а элементы разбиваются на такое число столбцов, чтобы можно было, прокручивая список по горизонтали, просмотреть все его элементы. При этом в видимой области списка отображается число столбцов, равное значению свойства Columns.
Стиль простого списка определяет свойство Style, принимающее значения:
° lbStandard – стандартный стиль (по умолчанию);
° lbOwnerDrawFixed – список с элементами фиксированной высоты, устанавливаемой свойством ItemHeight;
° lbOwnerDrawVariable – список с элементами, которые могут иметь разную высоту.
Если стиль списка отличен от значения lbStandard, то за прорисовку элементов списка отвечает программист. Для этих целей используются графические возможности Delphi.
Список может иметь рамку. Наличие рамки определяет свойство BorderStyle, принимающее два возможных значения:
° bsNone – рамки нет;
° bsSingle – рамка есть (по умолчанию).
Комбинированный список объединяет поле редактирования и список. Пользователь может выбирать значение из списка или вводить его непосредственно в поле. В Delphi для работы с комбинированным списком служит компонент ComboBox, расположенный на странице Standard Палитры компонентов.
Список, находящийся в компоненте ComboBox, может быть простым либо раскрывающимся. Раскрывающийся список в свернутом виде занимает на экране меньше места. В отличие от простого, комбинированный список не может иметь горизонтальную полосу прокрутки и допускает выбор только одного значения.
Свойство Style, определяющее внешний вид и поведение комбинированного списка, может принимает значения:
° csDropDown – раскрывающийся список с полем редактирования (по умолчанию): пользователь может выбирать элементы в списке (при этом выбранный элемент появляется в поле ввода) или вводить (редактировать) информацию непосредственно в поле ввода;
° csSimple – поле редактирования с постоянно раскрытым списком (для того чтобы список был виден, необходимо увеличить высоту компонента ComboBox);
° csDropDownList – раскрывающийся список, допускающий выбор элементов в списке;
° csOwnerDrawFixed – список с элементами фиксированной высоты, задаваемой свойством ItemHeight;
° csOwnerDrawVariable – список с элементами, которые могут иметь разную высоту.
Если стиль списка имеет значение csOwnerDrawFixed или csOwnerDrawVariable, то за прорисовку элементов списка отвечает программист.
Свойство DropDownCount определяет количество строк, которые одновременно отображаются в раскрывающемся списке. Если значение свойства превышает число строк списка, определяемое значением подсвойства Count свойства Items, то у раскрывающегося списка автоматически появляется вертикальная полоса прокрутки. Если размер списка меньше, чем задано в свойстве DropDownCount, то отображаемая область списка автоматически уменьшается.
Логическое свойство DroppedDown позволяет определить, раскрыт ли список. Если свойство имеет значение True, то список отображается в раскрытом виде, в противном случае список свернут.
При работе с комбинированным списком генерируются следующие события: OnDropDown (открытие списка); onCloseUp (закрытие списка); OnSelect (выбор элемента); onChange (изменение текста в поле редактирования).
Общая характеристика списков. Простой и комбинированный списки во многом похожи друг на друга и имеют много общих свойств, методов и событий. Основным для списков является свойство Items, которое представляет собой коллекцию (массив) строк.
Элементы списка можно отсортировать в алфавитном порядке. Наличие или отсутствие сортировки определяет логическое свойство Sorted. При значении False этого свойства (по умолчанию) элементы в списке располагаются в порядке их поступления в список. Если же свойство Sorted имеет значение True, то элементы автоматически сортируются по алфавиту в порядке возрастания.
Пользователь может выбирать отдельные строки списка с помощью мыши и клавиатуры. Выбранный в списке элемент определяется свойством ItemIndex. При анализе номеров строк нужно иметь в виду, что отсчет начинается с нуля, поэтому, например, 7-я строка имеет номер 6.
По умолчанию в списке можно выбрать один элемент. Для выбора двух и более элементов логическое свойство MultiSelect, управляющее возможностью выбора нескольких строк, устанавливается в значение True. По умолчанию свойство MultiSelect имеет значение False.
В случае, когда список поддерживает возможность выбора нескольких строк, логическое свойство ExtendedSelect управляет способом выбора нескольких элементов. Когда свойство ExtendedSelect имеет значение False, добавить к выбранной группе очередной элемент можно только с помощью мыши. При этом первый щелчок мыши на строке выбирает её, а повторный щелчок отменяет выбор строки. Если свойство ExtendedSelect имеет значение True (по умолчанию), то в дополнение к мыши можно выбирать элементы с помощью клавиш Shift и Ctrl.
Поскольку комбинированный список допускает одновременный выбор только одного элемента, у него нет свойств MultiSelect и ExtendedSelect.
Число выбранных элементов в списке возвращает свойство SelCount. Для определения номеров выбранных строк можно просмотреть значения свойства Selected [Index: Integer], представляющего собой массив логических значений. Если строка с номером Index выбрана, то её признак Selected принимает значение True и наоборот, если строка не выбрана, то признак Selected имеет значение False. Свойства SelCount и Selected обычно используются для списков, поддерживающих множественный выбор элементов.
При выборе элемента списка происходит событие OnClick, которое можно использовать для обработки выбранных строк.
Дата добавления: 2015-03-19; просмотров: 855;