Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование Часть 2 - Delphi

.pdf
Скачиваний:
24
Добавлен:
16.03.2015
Размер:
734 Кб
Скачать

41

имеющихся, либо разработать самому. Если это свойство не задано, то MaskEdit работает как обычный редактор Edit.

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

если строка шаблона задана.

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

Text результат наложения маски или исходный текст (0 – исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях,

предназначенных для ввода данных.

Маска состоит из описателей полей ввода, специальных символов и литералов.

Описатель указывает, какой именно символ (один!) может ввести пользователь в данное поле. Литерал вставляется в текст, показываемый в окне редактора, но при вводе курсор перескакивает через литерал и не даѐт пользователю возможности изменить его.

Литералами считаются любые символы, кроме описателей полей и специальных символов, а также любой символ, которому предшествует символ «\». Специальные символы формируют дополнительные указания редактору. Если не все требуемые поля ввода заполнены и компонент лишился фокуса ввода, то на экран выводится окно с сообщением, после закрытия которого, курсор устанавливается на позицию, где закончился правильный ввод. Перечень описателей и специальных символов можно найти в литературе [2,5,6].

Редактор Memo

Компонент Memo предназначен для ввода, редактирования и отображения текста. В

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

Редактор Memo может содержать полосы прокрутки ScrollBars.

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

расположенной в Инспекторе объектов у свойства Lines.

42

В примере редактор 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[12]. Количество строк хранится в свойстве Count, последняя строка имеет номер Count-1. При добавлении или удалении строк значение свойства Count изменяется.

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

Процедура Insert(Index:integer;const S:string) вставляет строку S в позицию Index.

Строки, расположенные на этой позиции и за ней – смещаются.

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

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

43

Процедура 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. При формировании процедур

44

прорисовки используются методы 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). Это свойство применяется, в основном, для

45

связывания изображения со строками и использования их для специфического отображения данных в таблице. Следующая строка помещает объект 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;

3.4.6. Компоненты для отображения текста Метка Label

Компоненты класса TLabel (метки) предназначены для размещения текстов:

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

46

Свойство AutoSize указывает, будет ли метка изменять свои размеры в зависимости от помещѐнного в свойство Caption текста.

Свойство Alignment управляет выравниванием текста по горизонтали, а свойство

LayOut – по вертикали.

Свойство WordWrap разрешает/запрещает разрыв строки на границе слова. Для вывода многострочных надписей необходимо AutoSize присвоить значение false,

WordWrap присвоить значение true и задать необходимые размеры метки.

Статический текст StaticText

Статический текст StaticText очень похож на метку Label. Дополнительно этот компонент может иметь рамку, задаваемую свойством Border. Для записи длинного текста в несколько строчек достаточно установить в свойстве AutoSize значение false и задать достаточный размер компонента.

Форматированный текст RichEdit

Для создания, просмотра и редактирования rtf-документов в приложениях используется компонент RichEdit. Многострочный редактор RichEdit работает с расширенным текстовым форматом, хранит дополнительную служебную информацию,

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

Текст можно подготовить заранее, сохранить в файле, а затем при работе приложения в нужный момент загрузить в RichEdit методом LoadFromFile. Иногда удобно на этапе разработки приложения передать подготовленный текст через буфер или ввести небольшой текст с клавиатуры, используя String List Editor. В этом случае форматирование текста выполняется путѐм задания нужных значений свойств в инспекторе объектов. Кроме того, компонент RichEdit имеет сложные свойства

SelAttributes и Paragraph, доступные из программы и позволяющие динамически изменять параметры символов и абзацев. Для программного добавления строк используется метод

Add, а для очистки редактора – метод Clear.

3.4.7. Компоненты для работы с графикой Компонент Shape

Этот компонент рисует одну из простейших геометрических фигур: прямоугольник,

прямоугольник с закруглѐнными краями, квадрат, квадрат с закруглѐнными краями,

эллипс, окружность. Вид геометрической фигуры задаѐтся свойством Shape, заполнение внутреннего пространства – свойством Brush, а отрисовка внешних границ – свойством

Pen.

47

Свойства Brush и Pen сложные. Brush.Color, Pen.Color задают цвет заполнения и цвет граничной линии. Метод заполнения определяется значением свойства Brush.Style.

Тип линии задаѐтся значением свойства Pen.Style, а свойство Pen.Width задаѐт толщину линии. Если толщина линии равна 1, то, изменив свойство Pen.Style, можно выбрать другой тип линии.

Свойство пера Mode определяет режим наложения графической фигуры на экран или другую поверхность. Режим наложения действует не только на контур фигуры, но также на еѐ внутреннюю область, контролируемую кистью.

Компонент Image

Компонент Image служит для размещения на форме одного из поддерживаемых

Delphi изображений, хранимых во внешних файлах. Используются растровые изображения .bmp, .jpg, иконка .ico, метафайл .wmf.

Центральным свойством класса является Picture, которое задаѐт нужный тип изображения и служит для него контейнером. Отображаемая картинка хранится в свойстве Picture, доступном на этапе проектирования и на этапе выполнения.

Свойство AutoSize позволяет управлять автоматическим изменением размера изображения: если имеет значение true, то компонент изменяет свой размер в зависимости от размера изображения (размер компонента Image подгоняется под размер картинки).

При AutoSize равном false, размер компонента остаѐтся неизменным и, если изображение больше размера компонента, то выводится только часть картинки. По умолчанию свойство AutoSize имеет значение false.

Свойство Stretch разрешает/запрещает изменять размер изображения так, чтобы оно занимало всю клиентскую область компонента (только для файлов .bmp и .wmf), то есть позволяет подогнать размер картинки под размер компонента. Масштабирование целесообразно применять для метафайлов.

3.4.8.Формирование меню

Различают два типа меню: главное и контекстное (локальное, всплывающее).

Главное меню обычно располагают под заголовком формы. Выбор пункта главного меню вызывает появление на экране выпадающего меню. Выпадающее меню содержит команды или вложенные выпадающие меню. Уровень вложения не ограничен, но создавать очень сложные меню не рекомендуется, так как это затрудняет работу с приложением.

Всплывающее меню не привязано к конкретному месту формы или к главному меню.

Оно появляется по специальному требованию, обычно по щелчку правой кнопкой мыши.

Всплывающим меню удобно пользоваться для размещения команд, специфичных для отдельных элементов.

48

В Delphi главное меню реализовано компонентом MainMenu, а всплывающее –

PopupMenu. Подключение меню к форме выполняется через свойства формы MainMenu и PopupMenu. Компоненты, применяемые при создании меню, являются невизуальными. На этапе выполнения их значки не отображаются. Значки компонентов MainMenu и PopupMenu используется на этапе разработки для того, чтобы можно было задать значения свойств.

Дизайнер меню

Формирование пунктов меню выполняется в Дизайнере меню. Дизайнер меню вызывается из контекстного меню, связанного с компонентами MainMenu или PopupMenu,

командой Menu Designer (другой способ вызова - двойной щелчок на компонентах).

Помимо создания и модификации меню утилита Menu Designer позволяет загружать меню из ресурсов и сохранять меню в качестве шаблонов. Меню, сохранѐнные как шаблоны, могут использоваться несколькими приложениями. Создание и удаление пунктов меню выполняется в окне Дизайнера меню, а свойства задаются в Инспекторе объектов.

При первом вызове Дизайнера в окне появляется заготовка для единственного пункта меню, которую надо заполнить в Инспекторе объектов, то есть задать значения свойств. После этого можно перейти к формированию следующего пункта главного меню

(расположенного справа) или создать вложенное меню. Щелчок по пункту главного меню приводит к началу формирования вложенного меню: ниже заполненного пункта появляется пустая ячейка. По мере заполнения строк ниже появляется пустая ячейка,

завершающая список команд. После того, как все нужные команды вложенного меню записаны, можно приступать к созданию следующего пункта главного меню. Пустую ячейку удалять не следует, она видна только на этапе проектирования.

На любом этапе создания приложения меню можно отредактировать. Для этого следует войти в Дизайнер меню, установить курсор на нужном пункте и вызвать контекстное меню щелчком правой кнопки мыши. Контекстное меню позволяет вставить новый пункт (Insert), удалить существующий (Delete), создать выпадающее меню (Create Submenu). Кроме того, имеется несколько команд для работы с шаблонами меню. Все действия относятся к пункту меню, находящемуся в позиции курсора.

Заполнение пунктов меню

Пункты меню являются компонентами, принадлежащими к классу TMenuItem. Для пунктов меню определено свойство OnClick, которое возникает при щелчке мышью или при нажатии на клавишу Enter, если перед этим команда была выбрана.

49

Свойство Caption содержит текст пункта меню (заголовок). При записи этого свойства можно использовать символ & (амперсант) для формирования подчѐркнутого символа, например File, Open. Подчѐркнутый символ применяется совместно с клавишей

Alt для вызова пунктов меню с клавиатуры. Если свойству Caption присвоить значение "–"

(минус), то будет сформирована горизонтальная линия, которая используется для разделения групп команд.

Очень часто пункты меню являются переключателями. Если пункт меню работает как обычный переключатель, то он отмечается символом . Наличие такого символа у независимого переключателя говорит о том, что команда выполняется. Повторный выбор этого же пункта приводит к тому, что команда выключается (символ исчезает).

Включена команда или нет, определяется свойством Checked: если значение равно true, то пункт меню выбран и содержит метку.

Рядом с пунктами меню, которые относятся к зависимому переключателю, может стоять жирная точка. В этом случае несколько пунктов работают согласованно, как один переключатель с множеством состояний. Жирной точкой отмечается только один пункт из группы команд, образующих взаимоисключающие пункты-переключатели. Для всех пунктов группы необходимо установить одинаковое ненулевое значение свойства

GroupIndex и присвоить свойству RadioItem значение true. Для приведения в действие механизма переключения следует для всех пунктов группы определить обработчики события OnClick. Выбор любого пункта приводит к тому, что его свойство Checked

становится равным true. Некоторые режимы работы приложения могут быть недоступны пользователю в отдельные моменты времени. Пункты меню делают запрещѐнными с помощью свойства Enabled.

Как принято в Windows, для любого пункта меню можно задать комбинацию клавиш, которая позволит выполнить команду, не открывая меню. «Быстрые клавиши» выбираются в свойстве ShortCut. Следует помнить, что Delphi не контролирует выбранные комбинации, разработчик должен сам проследить за тем, чтобы использовались разные клавиши.

Локальное меню

Контекстное меню всплывает автоматически после щелчка правой кнопкой мыши,

если значение свойства Autopopup равно true. Место появления зависит от позиции курсора в момент щелчка и определяется свойством Alignment. С позицией курсора может совпадать левый (paLeft) или правый (paRight) верхний угол меню, либо середина верхнего края (paCenter).

50

Всплывающее меню заполняется пунктами, так же как и главное меню, в дизайнере меню. Часто в контекстное меню вводят пункты, которые дублируют команды главного меню. Если для команд главного меню обработчики событий уже написаны, то можно подключить их к соответствующим пунктам локального меню. Затем надо синхронизировать работу локального и главного меню.

Локальное меню может быть создано для любого оконного компонента. Чтобы связать щелчок правой кнопкой мыши на компоненте с раскрытием меню, в свойство

PopupMenu этого компонента надо записать имя меню.

3.4.9. Другие компоненты Компонент UpDown

Ввод целых чисел можно существенно упростить, если использовать управляющий компонент UpDown. Этот компонент состоит из двух кнопок с противоположно направленными стрелками, применяется совместно с каким-либо другим компонентом,

обычно в сочетании с Edit.

Чтобы связать UpDown с конкретным компонентом, надо имя этого компонента задать в свойстве Associate. Место появления кнопок со стрелками определяется свойством AlignButton, они могут располагаться слева (udLeft) или справа (udRight) от ассоциированного компонента.

Свойство Position содержит корректируемое числовое значение. Шаг изменения определяется свойством Increment. Максимальное и минимальное значения задаются свойствами Max и Min. Для того чтобы можно было изменять значение мышью и на клавиатуре, свойство ArrowKeys задают true.

Компонент Timer

Таймер позволяет задавать в приложении интервалы времени. Управление таймером осуществляется с помощью свойств Interval, Enabled и события OnTimer.

Свойство Interval задаѐт интервал времени в миллисекундах от момента включения таймера до события OnTimer. Минимальный интервал равен 55 мсек (примерно 1 тик),

интервалы кратны 55 мсек. Короткие интервалы времени (единицы и десятки миллисекунд) точно задать с помощью таймера не удаѐтся: реальные периоды срабатывания будут больше.

Свойство Enabled определяет, включѐн ли таймер (если true, то включѐн). Причѐм,

раз включѐнный таймер будет возбуждать событие OnTimer до тех пор, пока его свойство

Enabled не станет равным false.

Альтернативным способом отключения таймера является задание интервала срабатывания равным 0 при Enabled = true.