•  

ГлавнаяЛитература по DelphiРазработка приложений в системе Delphi → 4.5. Компоненты для работы со строками

Создано: 04.09.2010 4:09:43 · Исправлено: 04.09.2010 4:09:43 · Прочтений: 4625

Строка редактирования Edit

Компонент Edit используется для ввода, вывода и редактирования строк. Отображается строка, записанная в свойстве Text. Строки могут быть достаточно длинные. Однако этот компонент не распознаёт символов конца строки и не может быть использован для работы с несколькими строками. С помощью компонента Edit можно отобразить нередактируемый текст, если свойству ReadOnly присвоить значение true.

Для изменения шрифта, используемого при записи текста, необходимо изменить значение свойства Font. Свойство CharCase используется для задания регистра символов, а свойство MaxLength позволяет ограничить длину строки.

Метод Clear применяется для удаления всего текста, а метод ClearSelection – для удаления выделенной части строки. По умолчанию введённый текст выделяется при получении компонентом фокуса ввода – это определяется значением свойства AutoSelect (если true – то выделяется). Компонент Edit можно использовать для ввода пароля. Для этого свойству PassWordChar необходимо присвоить значение символа, который будет отображаться на экране при наборе пароля.

Компонент MaskEdit

Компонент MaskEdit – аналог Edit, но с возможностью ввода текста по некоторому шаблону. Шаблон задаётся свойством EditMask, имеет вид текстовой строки и управляет тем, что, сколько и в каком порядке вводит пользователь. В редакторе свойств для EditMask есть заготовки форматов даты, валюты и т.п. Шаблон можно выбрать из имеющихся, либо разработать самому. Если это свойство не задано, то MaskEdit работает как обычный редактор Edit.

Свойство EditText содержит текст до наложения на него шаблона, то есть то, что ввёл пользователь. Свойство Text может содержать либо исходный текст, либо результат наложения на него маски. Свойство IsMasked доступно только для чтения и содержит true, если строка шаблона задана.

Шаблон состоит из трех частей, отделенных друг от друга символами «;». Первая часть задает маску ввода, вторая – это символ 0 или 1, определяющий, записывается ли в Text результат наложения маски или исходный текст (0 – исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях, предназначенных для ввода данных.

Маска состоит из описателей полей ввода, специальных символов и литералов. Описатель указывает, какой именно символ (один!) может ввести пользователь в данное поле. Литерал вставляется в текст, показываемый в окне редактора, но при вводе курсор перескакивает через литерал и не даёт пользователю возможности изменить его. Литералами считаются любые символы, кроме описателей полей и специальных символов, а также любой символ, которому предшествует символ «\». Специальные символы формируют дополнительные указания редактору. Если не все требуемые поля ввода заполнены и компонент лишился фокуса ввода, то на экран выводится окно с сообщением, после закрытия которого курсор устанавливается на позицию, где закончился правильный ввод.

Редактор Memo

Компонент Memo предназначен для ввода, редактирования и отображения текста. В отличие от редактора Edit может содержать несколько строк, которые задаются либо свойством Text, либо свойством Lines. Свойство Text используется для доступа ко всему содержимому компонента, а свойство Lines – для работы с отдельными строками. Редактор Memo может содержать полосы прокрутки ScrollBars.

Многострочный редактор хранит информацию в массиве Lines типа TStrings. Для загрузки текста из файла используется метод LoadFromFile. Для сохранения информации в файле используется метод SaveToFile. При необходимости добавить, удалить, вставить строку используются методы Add, Delete, Insert. Для записи текста в процессе проектирования приложения надо открыть окно редактора String list editor кнопкой, расположенной в Инспекторе объектов у свойства Lines.

В примере редактор Memo1 очищается, и в него с помощью метода Add выводятся значения из массива целых чисел x. Так как компонент Memo работает со строками, то предварительно выполняется перевод целого числа в строку функцией inttostr:

Memo1.Lines.Clear;
for i:=0 to n-1 do Memo1.Lines.Add(inttostr(x[i]));

Списки

Простой список ListBox позволяет выбирать один или несколько элементов, может содержать изображения. Элементы списка всегда присутствуют на экране, то есть список всегда раскрыт. Список ComboBox представляет собой комбинацию компонент Edit и ListBox. Имеет несколько модификаций. В отличие от ListBox можно выбирать только один элемент.

Модификации комбинированного списка ComboBox задаются свойством Style: при значении csSimple список всегда раскрыт, значение csDropDown задаёт раскрывающийся список с полем редактирования, csDropDownList позволяет только выбрать строку. Количество строк, которые отображаются на экране, задаётся свойством DropDownCount. По умолчанию видно 8 строк. Если в списке больше элементов, то появляется полоса прокрутки. Свойство DroppedDown логического типа определяет, раскрыт ли список (true – раскрыт).

Свойство ItemIndex хранит индекс выбранной строки. Если ни одна строка не выбрана, ItemIndex=-1. Это свойство задётся только во время выполнения программы. У компонента ComboBox дополнительно выбранное значение можно определить по свойству Text.

Работа со списками организуется через свойство Items, имеющее тип TStrings и представляющее собой совокупность строк списка. Строки нумеруются с нуля, доступ к строке осуществляется по номеру. Например, Items[0], Items[13]. Количество строк хранится в свойстве Count, последняя строка имеет номер Count-1. При добавлении или удалении строк значение свойства Count изменяется.

Метод Add(const S:string):integer добавляет строку S в конец списка и возвращает номер нового элемента.

Процедура Insert(Index:integer;const S:string) вставляет строку S в позицию Index. Строки, расположенные на этой позиции и за ней – смещаются.

Процедура Delete(Index: integer) удаляет строку с номером Index. Если такой строки нет, то действие не выполняется и никаких сообщений не выводится. После удаления номера строк корректируются.

Процедура Clear очищает список, то есть удаляет все элементы.

Процедура Move(Index1, Index2: integer) перемещает строку с позиции Index1 в позицию Index2. После перемещения номера строк корректируются.

Метод IndexOf(const S:string):integer определяет, содержится ли строка S в списке. Если строка присутствует в списке, то возвращается её номер, иначе возвращается значение -1.

Методы LoadFromFile и SaveToFile позволяют загрузить строки в список из файла и сохранить список строк в файле. При чтении строк из файла, предыдущее содержимое списка удаляется. Если при сохранении списка будет указано имя файла, которого нет, то такой файл будет создан. Для выбора элементов из списка можно ещё использовать компоненты CheckListBox, ComboBoxEx, ValueListEditor.

Список CheckListBox подобен ListBox, но у каждой строки есть индикатор, состояние которого характеризуется свойством Checked. Это свойство можно устанавливать программно, либо читать, отслеживая действия пользователя во время работы приложения (аналогично CheckBox). Например:

if CheckListBox1.Checked[1] and CheckListBox1.Checked[2]
then Form2.Show;

С помощью задаваемого программно свойства Header список CheckListBox можно разбить на разделы и дать этим разделам названия:

CheckListBox1.Header[3]:=true;

Расширенный комбинированный список ComboBoxEx подобен ComboBox, но хорошо приспособлен для включения в элементы списка изображений.

Компонент ValueListEditor предназначен для ввода строк вида «имя=значение». Окно имеет две колонки с заголовками Key для имён и Value – для значений. ValueListEditor удобно использовать для работы с данными сложной структуры. Например, вводить и редактировать списки студентов, содержащие большое количество сведений (фамилию, имя, отчество, год рождения, пол, адрес, телефон, шифр и т.д.).

Компоненты-таблицы DrawGrid и StringGrid

Компоненты DrawGrid и StringGrid имеют форму таблиц, предоставляют программисту мощные возможности создания и обслуживания табличных структур данных, позволяют отображать и редактировать данные в каждой ячейке по отдельности.

В ячейках таблицы DrawGrid вместе с текстом можно поместить и рисунки. Чтобы таблица была работоспособной, в ней как минимум следует определить обработчик события OnDrawCell, которое возникает при необходимости прорисовать ту или иную ячейку. Для прорисовки используется свойство Canvas. При формировании процедур прорисовки используются методы CellRect и MouseToSell. Компонент DrawGrid только отображает информацию, но не хранит её.

Более простой и удобной в использовании является таблица StringGrid, предназначеная для работы с текстовыми данными. Компонент StringGrid является прямым потомком DrawGrid, от которого унаследовал большинство свойств и методов. Поэтому StringGrid тоже позволяет отображать графические образы, но их прорисовка и хранение выполняются программно.

Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для отображения заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы. Остальная часть таблицы – рабочая, она содержит произвольное число столбцов и рядов. Количество рядов и столбцов можно изменять в Инспекторе объектов и программно. По умолчанию свойства ColCount и RowCount, определяющие размеры таблицы, имеют значение 5. Так как нумерация столбцов и строк начинается с нуля, то первоначальный размер таблицы 6?6. Если рабочая часть не умещается в пределах окна компонента, то используются полосы прокрутки. При прокрутке рабочей области фиксированная область не исчезает, но меняется её содержимое – заголовки строк и столбцов.

С помощью сложного свойства Options определяется внешний вид и функциональные свойства таблицы. Так, параметр goEditing управляет режимом редактирования. Чтобы можно было вводить в таблицу данные и редактировать содержимое ячеек, параметр goEditing надо установить в true. При работе приложения пользователь может вводить данные только в ячейки рабочей области. Однако программно может быть реализован доступ к любым ячейкам таблицы.

Свойство Cells[ACol,ARow:integer]:String обеспечивает доступ к отдельным ячейкам и представляет собой двумерный массив, содержащий строки текста ячеек таблицы. Размеры массива определяются значениями свойств ColCount и RowCount. Параметр ACol указывает колонку ячейки, а параметр ARow – её строку. Доступ к ячейкам таблицы осуществляется во время выполнения приложения. Для примера зададим нужное число строк таблицы и запишем заголовки первого и второго столбца:

StringGrid1.RowCount:=10;
StringGrid1.Cells[0,0]:='Аргумент';
StringGrid1.Cells[1,0]:='Функция';

Свойство Objects[ACol,ARow:integer]:TObject обеспечивает доступ к объекту, связанному с ячейкой (ACol, Arow). Это свойство применяется, в основном, для связывания изображения со строками и использования их для специфического отображения данных в таблице. Следующая строка помещает объект MyBitmap типа TBitmap в 10-ю колонку, 3-ю строку таблицы StringGrid:

StringGrid1.Objects[10,3]:= MyBitmap;

Если объект был помещен в массив Objects, он продолжит своё существование даже после того, как таблица StringGrid будет удалена. Свойство Cols[index:integer]:TString – представляет собой список строк, содержащий значения всех ячеек колонки с номером index. Это свойство используется для получения доступа к любому столбцу.

Свойство Rows[index:integer]:TString обеспечивает доступ к ряду с номером, заданным параметром index. Для примера выполним копирование первой строки StringGrid2 в четвёртую строку StringGrid1:

StringGrid1.Rows[4].Assign(StringGrid2.Rows[1]);

Аналогично можно выполнять копирование в любые компоненты, имеющие свойства класса TString, например, в ComboBox или ListBox. Компонент StringGrid позволяет выбирать значения, отображённые в ячейках, во время работы приложения. В момент выбора ячейки генерируется событие OnSelectCell, в обработчик которого передаются номера столбца ACol и строки ARow выделенной ячейки. Это событие позволяет использовать в программе значение из выбранной ячейки:

procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if (ACol in[1..3]) and (ARow in[1..3])
then case ARow of
1: xn:=strtofloat(StringGrid2.cells[ACol,ARow]);
2: xk:=strtofloat(StringGrid2.cells[ACol,ARow]);
3: hx:=strtofloat(StringGrid2.cells[ACol,ARow]);
end;
end;