Начнем по порядку. Создавая очередную программу, пользователь компонует интерфейс, исходя из имеющихся у него подручных объектов, при этом он неизбежно сталкивается с необходимостью изменить то или иное его свойство. Как помнит наш читатель, свойства объектов на этапе разработки программы изменяются с использованием инспектора объектов. Этих свойств существует достаточно много. На них-то мы сейчас и остановимся.
Инспектор Объектов (рис. 1). В окне инспектора объектов имеются выпадающее меню и две вкладки. Выпадающее меню показывает нам, конфигурация какого объекта нам в настоящий момент представлена, а вкладки, собственно, эту конфигурацию помогают нам созерцать и изменять. Во вкладке Свойства (Properties) указано не что иное, как свойства формы проекта:). Рассмотрим некоторые основные свойства поподробнее:
Action - назначает для объекта действие;
ActiveControl - указывает на элемент формы, который имеет фокус;
Align - устанавливает положение объекта:
- AlNone - положение объекта определяется вручную пользователем;
- AlBottom (AlTop) - объект расположен внизу формы (если речь идет о форме проекта, то - внизу экрана). При этом высота объекта остается неизменной, а его ширина увеличивается до ширины формы (экрана);
- AlLeft (AlRight) - объект расположен в левой части формы (если речь идет о форме проекта, то - в левой части экрана). При этом ширина объекта остается неизменной, а его высота увеличивается до высоты формы (экрана);
- AlClient - объект занимает всю предоставленную площадь. Например, при установке данного свойства форме проекта, при запуске программы, окно будет растянуто на весь экран;
BiDiMode - это свойство используется для локализации приложения. Оно позволяет установить направление чтения текста в программе;
BorderStyle - свойство, отвечающее за тип формы. Включает в себя:
- bsNone - на форме полностью отсутствуют все системные элементы управления. Форма выглядит как прямоугольник без бортов и заголовка. При выполнении программы размер формы изменить нельзя;
- bsSingle - стандартное окно, но при этом отсутствует возможность изменения размеров формы. Набор системных кнопок зависит от свойства BorderIcon;
- bsDialog - стандартное диалоговое окно;
- bsToolWindow - панель инструментов. Похожа на стиль bsSingle, но при этом все системные элементы уменьшены;
- bsSizeToolWin - панель инструментов. Похожа на стиль bsSingle, но при этом все системные элементы уменьшены, возможно изменение размеров формы;
BorderIcons - группа свойств, отвечающих за видимость системных элементов - кнопок: свернуть, закрыть, развернуть, помощь и системное меню;
Caption - содержит текст названия формы проекта;
CurrentHelpFile - содержит имя файла контекстной помощи, используемого приложением;
HelpFile - задает имя файла помощи для приложения;
ShowHint - включает либо отключает показ всплывающих ярлыков подсказок;
Hint - содержит строку ярлыка подсказки;
Icon - указывает на значок приложения;
Cursor - устанавливает тип курсора, который будет установлен при наведении мыши на область объекта;
Visible - устанавливает такое свойство объекта, как видимость;
Enabled - указывает на состояние объекта. При значении False объект недоступен;
Font - группа свойств, характеризующих отображение текста, используемого объектом. С помощью этих свойств можно изменять цвет, размер, стиль, кодировку и шрифт текста;
Height - устанавливает высоту объекта в пикселях;
Width - устанавливает ширину объекта в пикселях;
Left - устанавливает отступ левого края объекта от левого края формы проекта в пикселях;
Top - устанавливает отступ верхнего края объекта от верхнего края формы проекта в пикселях;
Name - внутреннее имя объекта программы;
TabOrder - указывает направление перемещения фокуса при нажатии клавиши Tab (от начала к концу или от конца к началу, но при этом хочу заметить, что порядок перемещения фокуса можно изменять с помощью диалога TabOrder (Edit/TabOrder...);
TabStop - при установленном значении False фокус при нажатии клавиши Tab на данный объект не переводится (при этом фокус переходит к объекту, стоящему следующим в списке TabOrder).
Выше описаны свойства, которые присущи многим компонентам. Однако стоит отметить, что, помимо вышеупомянутых параметров, компоненты имеют и специфические свойства. Их мы будем рассматривать по мере изучения материала.
Во второй вкладке Действия (Events) указаны методы-обработчики событий. Познакомимся с ними поближе:
OnActivate - вызывается при передаче фокуса форме проекта;
OnDeactivate - вызывается при потере фокуса формой проекта;
OnClose - вызывается при закрытии формы. Предназначен для выполнения операций, позволяющих пользователю принять решение о закрытии формы либо продолжении работы;
OnCreate - вызывается при создании формы;
OnDestroy - вызывается при уничтожении формы;
OnHide - вызывается при исчезновении формы с экрана;
OnPaint - вызывается при перерисовке формы;
OnShow - вызывается при появлении формы на экране;
OnClick - вызывается при нажатии на объект;
OnMouseDown - вызывается при нажатии кнопки мыши.
К сведению: для создания обработчика событий достаточно дважды нажать мышкой на пустое поле, соответствующее названию метода.
Окно редактора кода. Как наш любознательный читатель мог уже заметить, окно редактора кода представлено тремя частями:
- панель модулей описания переменных и используемых модулей;
- панель кода программы;
- панель найденных ошибок программы (на этапе создания программы данное окно является невидимым, активизируется, если это необходимо, при компиляции программы).
Думаю, на этом с интерфейсом можно остановиться и перейти к конкретным проблемам программирования. Начать я бы хотел с раздела Delphi, который обратил на себя внимание через наших читателей. Итак, диалоги. Казалось бы, достаточно простой раздел. Однако меня с десяток человек спросили, каким образом можно произвести операции над файлом, который должен выбрать пользователь. Какие только варианты решения мне ни приходилось читать: и создавали дополнительную форму объекта, и пытались заставить пользователя от руки написать адрес файла, и предлагали воспользоваться компонентами Treeview, OutLine и им подобным. При этом читатели сами понимали, что они делают лишнюю работу и что существует более короткий и простой путь для решения проблемы. Как оказывается, внутреннее чувство наших читателей их не повело. Достаточно было воспользоваться компонентом OpenDialog (страница Dialogs). Данный компонент легко устанавливается на форму проекта в виде квадрата. При запуске программы он невидим. Квадрат лишь указывает нам на то, что компонент установлен и помогает нам обращаться к его свойствам при помощи инспектора объектов. Рассмотрим их поподробнее.
Итак, после установки компонента на форму проекта диалоговое окно можно активизировать с помощью функции Execute:Boolean. При этом, если пользователь выбрал файл или несколько файлов и нажал кнопку ОК, то функция возвращает True. Свойство компонента FileName содержит имя последнего файла из списка выбранных в диалоге. Свойство Files - список всех файлов, выбранных в диалоге. Свойство InitialDir задает каталог, к которому диалог обращается при открытии. Свойство Title содержит заголовок диалогового окна. Следует также отметить свойство Filter. С его помощью при выборе и сохранении файлов удобно осуществлять отбор файлов только с заданными расширениями. Например, для создания фильтра для исполняемых файлов свойство должно содержать следующую строку:
"Исполняемые файлы / *.EXE"
В одном фильтре можно отбирать файлы и с различными расширениями:
"Графические изображения / *.JPG; *.GIF; *.PNG"
Фильтр также можно создать в простом редакторе, который связан со свойством Filter в инспекторе объектов.
Очень интересные свойства и при этом одни из самых важных для диалоговых компонентов (OpenDialog, SaveDialog, OpenPictureDialog, SavePictureDialog) представлены в группе Options. Они рассмотрены в следующей таблице:
OfReadOnly Устанавливает значение флажка Open As Read Only (открыть только для чтения)
ofOvewWritePrompt Диалог выводит предупреждение, если выбирается уже используемый файл
OfHideReadOnly Устанавливает видимость флажка Open As Read Only (открыть только для чтения)
OfNoChangeDir После выбора файла и закрытия диалога устанавливается каталог, который был задан в диалоге до открытия
OfShowHelp Добавляет к диалогу кнопку помощи
OfNoValidate Отключает проверку имени файла
OfAllowMultiSelect Позволяет выбирать в диалоге несколько файлов
OfExtensionDifferent Устанавливается в True во время выполнения приложения, если расширение выбранного файла отличается от расширения по умолчанию
OfCreatePrompt Генерирует предупреждение в случае выбора несуществующего файла и предлагает создать его
OfShareAware Позволяет выбирать файлы, которые используются другими процессами
OfNoReadOnlyReturn Генерирует сообщение, если был выбран файл с атрибутом "только для чтения"
OfNoTestFileCreate Отключает проверку на существование выбранного файла и доступность сетевого диска
OfNoNetworkButton Удаляет из диалогового окна кнопку Network доступа к сетевым дискам
OfNoLongNames Диалог не отображает файлы с длинными именами
OfOldStyleDialog Представляет диалог в стиле windows 3.1x
OfNoDereferenceLinks Не различает файлы и ссылки на файлы (расширение LNK)
OfEnableSizing Позволяет изменять размеры диалога
Как и у многих других компонентов, у диалогов тоже существуют и свои методы-обработчики событий. Среди них наиболее интересными являются OnClose, OnFolderChange, OnSelectionChange, OnTypeChange (думаю, в пояснениях эти методы не нуждаются).
Исходя из всего вышесказанного, опишем процедуру (дабы увидеть все на конкретном примере), которая будет вызываться при нажатии на кнопку Button1, выполняющую запуск диалога OpenDialog1 и передающую путь к выбранному файлу в поле ввода Edit1:
procedure TForm1.Button1Click(Sender: TObject); begin opendialog1.execute; {запуск диалога с помощью функции execute} {во время активации диалога выполнение процедуры приостанавливается} edit1.text:=opendialog1.filename; {присваивание полю ввода Edit1 пути к файлу} end;
На этом раздел диалогов работы с файлами заканчивается. Всего вышеописанного вполне достаточно для создания полноценных приложений. Мной были специально опущены некоторые моменты, о которых я не счел нужным писать. Они редко используются в программировании, однако расширяют возможности работы с программой. При огромном вашем желании я могу написать о них персонально. Заявки - на e-mail:).
Следующей остановкой я выбрал сообщения. Согласитесь, сообщения играют далеко не последнюю роль в работе программы. С помощью сообщений программист может извещать об ошибках пользователя при задании исходных данных для работы программы, система сообщает о некорректной работе приложений, благодаря сообщениям программные продукты доводят до нашего сведения информацию о своей версии, о разработчиках и фирме-производителе, наконец, планировщики сообщают пользователю о запланированных встречах, событиях. Реализовать сообщения можно несколькими способами: с помощью процедуры ShowMessage, функции MessageDlg, создания дополнительного окна.
Процедура showmessage позволяет вывести пользователю простое сообщение. При этом появится дополнительное окно с названием проекта и кнопкой ОК. Выглядит все это следующим образом:
Синтаксис: ShowMessage(Msg: string);
Пример: ShowMessage("Все задачи выполнены успешно");
Функция messageDlg позволяет создавать сложные диалоговые запросы с использованием обратной связи. Имеет вид дополнительного окна, дополненного изображением. При этом возможно использовать диалоговые запросы. Название окна зависит от типа запроса.
Atype - внутренний параметр функции. Задает тип сообщения:
- mtWarning - сообщение о предупреждении;
- mtError - сообщение об ошибке;
- mtInformation - информационное сообщение;
- mtConfirmation - сообщение о подтверждении;
- mtCustom - сообщение не содержит в углу изображения. Название окна соответствует названию исполняемого файла (аналогично showmessage).
Abuttons - задает имена кнопок, которые будут отображаться на диалоговом запросе. Возможны значения: mbYes, mbNo, mbOK, mbCancel, mbHelp, mbAbort, mbRetry, mbIgnore, mbAll.
HelpCtx - содержит номер раздела, который будет показан пользователю, если он вызовет справку, когда диалог активизирован.
Пример:
MessageDlg("Продолжить выполнение программы', mtConfirmation, [mbYes, mbNo], 0);
Для того чтобы определить, какой вариант ответа выбрал пользователь, можно воспользоваться простой проверкой. Тогда исходный код будет иметь следующий вид:
If MessageDlg('Закончить выполнение задачи?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin MessageDlg('Выполнение задачи закончено.', mtInformation, [mbOk], 0); Close; end;
Создание сообщения с помощью дополнительного окна достаточно трудоемко. Этот способ используется для создания сложных запросов, когда одного только "Да" и "Нет" мало. Примером может служить ситуация, когда от пользователя необходимо получить код продолжения, в зависимости от которого приложение будет выполнять те или иные операции. Рассмотрением данного способа создания сообщений и использования дополнительных окон для вспомогательных задач мы займемся в следующей статье.