Завершая данную главу, приведем некоторые дополнительные настройки, облегчающие разработку программных средств в интегрированной среде Delphi.
Для конфигурации средств подсказок и помощи Code Insight необходимо перейти на одноименную страницу в окне настроек редактора кода (Editor Option) меню Tools. Доступны следующие функции:
Code completion – подсказка в виде списка свойств, методов, событий, относящихся к данному компоненту (при отключении этой опции функция остается доступной при нажатии клавиш Ctrl+пробел);
Code parameters – подсказка параметров функций, процедур, методов;
Tooltip expression evaluation – оценка выражений во время останова программы или пошаговой отладки;
Tooltip symbol insight – подсказка определений идентификаторов, над которыми перемещается курсор мыши;
ползунок Delay устанавливает время задержки автоматического срабатывания средств подсказок и помощи.
Можно воспользоваться шаблонами типичных структур языка Object Pascal и определять собственные шаблоны.
Для использования готового шаблона необходимо в окне редактора кода нажать сочетание клавиш Ctrl+J и из появившегося списка шаблонов выбрать требуемый. Например, выбор стандартного шаблона fors добавит в окно редактора кода следующую заготовку – for := to do.
Для определения собственного шаблона (или редактирования стандартного) необходимо из меню Tools вызвать Editor Options, перейти на вкладку Source Options и нажать кнопку Edit Code Templates. Появляющееся после этих действий окно диалога показано на рис. 4.11. В нем для примера задана структура оператора for с уменьшающимся значением переменной цикла. В текст шаблона можно вставить вертикальную черту в том месте, где необходимо установить курсор при вводе данного шаблона в текст.
Настройка отладчика осуществляется командой Debugger Options ( ) меню Tools. Самая важная опция Integrated debugging, обеспечивающая активацию отладчика, расположена внизу и видна на любой странице. Отметим наиболее востребованные опции этого инструмента.
Allow function calls in new watches, страница General – разрешает вызов функций в выражениях, отображаемых в окне наблюдения.
Stop on Delphi Exceptions, страница Language Exceptions – выключение этой опции отменяет появление дополнительных окон сообщений об исключительных ситуациях, то есть в процессе отладки проектируемая программа ведет себя также, как и при обычном запуске.
Отметим, что отключение флага Stop on Delphi Exceptions отключает при отладке установку курсора выполняемой строки на фрагменте кода, сгенерировавшего ошибку. Таким образом, отладка приложения затрудняется.
Форма представляет собой окно приложения на этапе разработки. Как правило, прикладная программа или приложение, работающее в операционной среде Windows, имеет, по крайней мере, одно окно. Поэтому проект Delphi также должен содержать хотя бы одну форму. Формы обеспечивают визуальное проектирование интерфейса на этапе разработки и, при работе приложения, инициализацию и визуализацию разработанного интерфейса. Происходит это благодаря тому, что форма является своего рода контейнером, содержащим в себе другие элементы интерфейса.
Фрейм, как и форма, может содержать различные компоненты, но его основное назначение в том, чтобы обеспечить возможность разделения формы на несколько самостоятельных участков, облегчая тем самым процесс проектирования.
Хотя фрейм и форма входят в состав VCL и
являются стандартными компонентами
Delphi, но в палитре компонентов
их нет. Для создания новой формы (или
фрейма) используют команды меню File
– Form
(
)
и Frame
(
).
Как правило, этим элементам соответствуют
отдельные модули. После создания фрейма
с помощью команды из палитры компонентов
Frames
(
,
страница Standard)
его можно разместить на форме.
При создании нового приложения всегда автоматически создается форма, соответствующая главному окну приложения. Если в ПО присутствуют другие (вторичные) формы, то можно оставить предлагаемый Delphi по умолчанию механизм автоматического создания форм, а можно и выполнять эти действия программно, т.е. динамически создавать и уничтожать вторичные формы.
Все компоненты Delphi составляют определенную иерархию, т.е. являются потомками базовых, наиболее общих классов. Благодаря этому они обладают подобными по имени и по назначению свойствами, методами и событиями.
Свойства, соответственно, характеризуют конкретные параметры компонента как объекта проектирования. По типу значений они могут быть отнесены к числовым, ранжируемым и атрибутивным.
Числовые свойства принимают значения из некоторой числовой области. Для них правильной является постановка вопроса: "Во сколько раз (насколько) одно значение данного свойства больше (меньше) другого значения этого свойства?" Также различные объекты могут сравниваться между собой по значениям одноименного свойства.
Для ранжируемого свойства на множестве его значений можно установить, какое из них предпочтительнее, но в то же время нельзя сказать, во сколько раз (насколько) одно значение больше (меньше) другого. По существу, ранжируемые значения, даже если они выражаются числами, есть не что иное, как некоторый способ кодирования нечисловых свойств.
Для атрибутивного свойства на множестве его значений нельзя устанавливать отношение предпочтения. Например, атрибутивное свойство – цвет, значения – красный, синий, зеленый. Для любых двух значений атрибутивного свойства, даже если они выражены числами, нельзя говорить о том, что одно из значений предпочтительнее другого (во всяком случае, без глубокого специального рассмотрения), и тем более нельзя говорить о том, на сколько (во сколько раз) одно значение больше (меньше) другого. Иногда из атрибутивных свойств выделяют подкласс бинарных свойств, которые могут принимать лишь два значения: есть в наличии данное свойство или нет.
Важнейшими свойствами компонентов Delphi являются:
Align – определяет способ выравнивания компонента внутри родительского компонента (контейнера), т.е. определяет, остается ли компонент неизменным при изменении размеров контейнера (alNone) или он изменяется, занимая всю доступную площадь (alClient), ее верхнюю (alTop), нижнюю (alBottom), левую (alLeft) или правую (alRight) часть;
Anchors – определяет привязку данного компонента к родительскому при изменении размеров последнего: к верхней (akTop), к нижней (akBottom), к левой (akLeft) и к правой (akRight) границе контейнера. Например, если в множестве Anchors компонента А1 присутствуют привязки к противоположным сторонам контейнера, то при изменении родительского компонента происходит растяжение или сжатие (вплоть до полного уничтожения изображения компонента) А1, причем выдерживаются расстояния от сторон контейнера;
AutoSize – определяет, будет ли высота компонента автоматически адаптироваться к размеру его содержимого;
свойство Caption связывает с компонентом некоторую строку текста, поясняющую его назначение, чаще всего это надписи на кнопках, метках, тексты разделов меню и т.д.;
Cursor
определяет изображение курсора мыши
в области компонента: crAppStart
(
),
crArrow
(
),
crCross
(
),
crDefault
(курсор, принятый по умолчанию), crDrag
(
),
crHandPoint
(
),
crHelp
(
),
crHourGlass
(
),
crHSplit
(
),
crIBeam
(
),
crMultiDrag
(
),
crNo
(
),
crNoDrop
(
),
crSizeAll
(
),
crSizeNESW
(
),
crSizeNS
(
),
crSizeNWSE
(
),
crSizeWE
(
),
crSQLWait
(
),
crUpArrow
(
),
crVSplit
(
),
crNone
(изображение отсутствует), также возможно
сформировать собственное изображение
курсора;
свойство DragCursor отвечает за изображение курсора (принимаемые значения аналогичны предыдущему свойству) при перемещении его в области компонента в процессе перетаскивания мышью;
свойство Enabled определяет, реагирует ли компонент на события, связанные с мышью, клавиатурой и таймером, т.е. доступность компонента для пользователя (недоступный компонент отображается серым цветом);
атрибуты используемого компонентом шрифта определяются свойством Font, которое, в свою очередь, также является стандартным классом Delphi и имеет собственные свойства, такие, как Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и др.;
Height – определяет высоту компонента или формы в пикселях;
HelpContext – номер контекстно-зависимой встроенной справки по элементу интерфейса, для использования этого свойства разработчику необходимо спроектировать файл справки (обычно или в hlp- или в chm-форматах);
свойство Hint обеспечивает текст подсказки, появляющийся во всплывающем окне подсказки при задержке курсора над компонентом или в заданном месте окна, например, в строке состояния;
свойство Left определяет координату левого края в пикселях, для компонентов за начало отсчета берется левая граница клиентской области родителя;
Name – имя компонента;
Tag – это свойство системой не используется и равно нулю по умолчанию, разработчик ПО может определить и использовать его по своему усмотрению, помещая в него любую необходимую информацию, совместимую с типом integer;
Top – координата верхнего края компонента;
свойство Transparent определяет прозрачность фона компонента;
Visible – определяет видимость компонента;
Width – горизонтальный размер компонента.
Методы, во-первых, используются для чтения или записи свойств классов Delphi. Во-вторых, любой класс имеет два специальных метода:
Constructor – конструктор, обычно имеющий имя Create, предназначен для выделения памяти под объект и начальной инициализации свойств;
Destructor – деструктор, как правило, идентифицируемый именем Destroy, по назначению является обратным конструктору и служит для уничтожения объекта и освобождения занимаемой им памяти.
Из других методов, типичных для различных компонентов, стоит выделить:
Clear – очистка полей объекта, списков, удаление текстовых данных;
копирование данных из одного объекта в другой реализуется методом Assign, иногда для этих целей используют методы, начинающиеся с Copy<…>;
методы чтения и записи обычно называются SaveTo<устройство> и LoadFrom<устройство>, например, метод чтения из файла идентифицируется как LoadFromFile (заметим, что в некоторых случаях для аналогичных процедур используются методы Open и Close);
с помощью метода Add обычно создают новый объект (например, пункт меню, элемент списка, новую текстовую строку) и добавляют его в список объектов;
удаление элементов, соответственно, обычно реализовано методом Delete;
при необходимости полной перерисовке визуального компонента используются методы Invalidate (сообщает Windows о необходимости перерисовки после того, как будут обработаны другие важные сообщения) или Repaint (немедленная перерисовка изображения);
для предотвращения мерцания экрана, т.е. при необходимости временного отключения (включения) перерисовки элементов при изменении одного или нескольких визуальных компонентов используются методы EndUpdate (BeginUpdate);
метод BringToFront перемещает компонент в начало Z-последовательности;
метод ClassName возвращает имя типа объекта;
Hide – делает компонент невидимым, метод Show осуществляет обратную операцию;
SetFocus – передает компоненту фокус.
События являются основой событийного программирования и предназначены для формирования реакции компонента на действия пользователя, операционной системы, других прикладных программ. Как правило, основным программным кодом в Delphi является именно код обработчиков событий, в которых напрямую или с помощью методов изменяются свойства компонентов проектируемого ПО. Идентификаторы событий обычно начинаются с On<…>. Рассмотрим основные события, свойственные компонентам Delphi:
OnChange – событие наступает после изменения основных смысловых данных компонента, например, текста;
OnClick – событие соответствует щелчку мыши на компоненте и некоторым другим действиям пользователя;
OnClose – событие соответствует закрытию, например, окна диалога или формы;
OnContextPopup – событие наступает при щелчке правой кнопкой мыши на компоненте или при любом другом способе вызова контекстного всплывающего меню, обработчик события может использоваться для изменения меню, в частности, в зависимости от позиции курсора мыши;
OnDblClick – двойной щелчок мыши;
OnEnter – событие наступает в момент активизации элемента (получения фокуса), например, при выборе его с помощью мыши;
событие OnExit наступает в момент потери элементом фокуса;
событие OnKeyDown наступает при нажатии пользователем любой клавиши, включая функциональные и вспомогательные, такие, как Shift, Alt и Ctrl;
при нажатии пользователем символьных клавиш происходит событие OnKeyPress;
событие OnKeyUp наступает при отпускании пользователем любой клавиши;
обработка событий OnMouseDown и OnMouseUp используется для операций, требуемых при нажатии и отпускании пользователем какой-нибудь кнопки мыши;
при перемещении курсора мыши над компонентом генерируется событие OnMouseMove;
событие OnPaint наступает, когда приходит сообщение Windows о необходимости перерисовать испорченное изображение (может испортиться, например, из-за временного перекрытия изображения другим окном) визуального элемента интерфейса прикладной программы;
OnResize – наступает сразу после изменения размера компонента или формы;
OnShow – событие, наступающее при открывании диалогового окна или формы.
Конечно, в данном разделе были рассмотрены не все свойства, методы и события компонентов. Их полное и подробное описание можно найти в справочной литературе [1] или в контекстной справке интегрированной среды Delphi.