Бабочки полет Будит тихую поляну В солнечных дельфийских лучах.
Вступительная часть
Дельфы – это древнегреческий город на берегу Коринфского залива. Город Дельфы связан с именем бога мудрости и покровителя искусств Аполлона. Этот город населяли жрицы, которые всех, кто к ним обращался, превращали в оракулов. Сейчас – это развалины древнего города, но имя города сохранено в самой современной системе для разработки программ. Система Delphi воплощает в себе лучшие достижения современной теории программирования. Она объединяет в себе множество полезных инструментов и готовых компонентов, из которых, как дом из кирпичиков, собираются проекты – ваши программы. Delphi – это визуальная среда разработки программ, это означает, что внешний вид каждой программы создается простым перемещением компонентов, как в конструкторе Лего, но чтобы вся конструкция ожила и заработала, необходимо написать программу ее поведения.
Объяснение нового материала
Давайте попробуем определить, что такое объект?
Например, карандаш. Какими свойствами он обладает? (Высота, толщина, название, надпись, цвет, цена и т.д.)
Например, журнал. Назовите его свойства.
Объект – шапка. Назовите его свойства.
Обратите внимание, что некоторые свойства повторяются, а некоторые – индивидуальны. Значит, каждый объект обладает своим набором свойств. Кроме свойств у объектов есть методы и события. Например, что может делать карандаш? (Рисовать, сломаться, упасть и т.д.) А что мы можем сделать с карандашом? (Наточить, бросить, подарить и т.д.)
Итак, сделаем вывод: каждый объект обладает своими свойствами, действовать на него можно с помощью методов и событий. Все это позволяет делать система объектно-ориентированного программирования Delphi.
Сейчас познакомимся со структурой главного окна системы Delphi (рисунок 1). (Объяснение лучше проводить с помощью демонстрации на проекторе)
Для открытия сохраненного проекта на следующем уроке открывайте файл Project1.dpr
Практическая часть
Наш первый проект будет называться “Светофор”. Сохраним его в папку с таким же именем. Все знают, что такое светофор, как он выглядит и для чего он нужен.
Наша задача: создать модель светофора, у которого при наведении мыши переключается свет, появляется всплывающая подсказка с названием цвета, а на табличке рядом со светофором появляется одна из надписей: СТОЙ, ЖДИ, ИДИ.
Определим объекты для проекта.
Наша форма должна принять примерно такой вид (рисунок 2):
Сохраним наш проект – Save All, запустим нашу программу на выполнение – RUN или зеленый треугольник на панели инструментов.
Что же мы видим? При наведении мыши на “глаза” светофора появляется всплывающая подсказка, цвет не переключается, на табличке тоже никакой реакции. Для этого придется писать программу – обработчик событий. Но вначале нужно решить: от каких событий зависит переключение цвета и появление надписи? Что вы должны для этого сделать?
Правильный ответ:наведение мыши на нужный “глаз” светофора.
Закроем работающий проект. Вернемся на форму. Выберем верхний Shape.
Щелкнем два раза по пустой белой строке рядом с этим событием и перед нами появляется окно кода программы. Delphi приглашает нас написать команды, которые необходимо выполнить при наведении мыши на Shape1.
Нам нужно, чтобы цвет Shape1 изменялся на красный, а в надписи появлялся текст – СТОЙ!
Между словами процедуры Begin и End пишем:
(Переведите на русский язык эти команды.)
По правилам Паскаля в конце каждого предложения ставим точку с запятой.
Сохраним проект. Запустим на выполнение. Проверяем.
Поздравляю вас! Программа начала работать!
Самостоятельная работа
Самостоятельно дописываем обработчики событий для второго и третьего круга.
Не забывайте сохранять проект и проверять результаты.
Теперь усложним задачу.
Пусть при наведении мыши включается только один цвет, а остальные выключаются, то есть становятся серыми.
Я довольно часто сталкивался с тем, что разработчики на Delphi (можно сказать традиционно) компилируют свои приложения «ручками», что далеко не production-решение, а со стороны выглядит кустарщиной и «делаем на-коленке», хотя продукты бывают весьма серьёзными и продаваемыми. Вероятно, это пошло ещё с тех пор, когда для автоматизации нужно было придумывать свои батнички, которые запускали компилятор командной строки dcc32 с нужными параметрами. Некоторые даже сделали свой «Публикатор» — Delphi-expert, который делает работу сервера сборок: компилирует (правда, открытый в IDE) проект, выставляя ему взятый из какой-то БД инкрементированный номер версии, записывает некий changelog и копирует это куда-то в сетевой каталог.
Я не буду вдаваться в исторический экскурс как было раньше. Я расскажу как есть/можно сейчас, и как это использовать для повышения эффективности своей работы.
Скрипты сборки MSBuild также используются для описания проектов, например, Visual Studio. Я коснусь некоторых деталей MSBuild, но я предлагаю читателю самостоятельно освоить его азы. Что нам это даёт? Это позволяет нам выполнить сборку Delphi-проекта из командной строки одной строчкой (что, в свою очередь, позволяет автоматизировать сборку проекта)
Если же читатель откроет командную строку в каталоге с проектом (hint: это можно быстро сделать, щёлкнув правой кнопкой мыши (ПКМ) на проекте в IDE — Show in Explorer, затем в Проводнике ПКМ — Открыть окно команд), то вышеприведённая команда не сработает:
т.к по умолчанию, пути к MSBuild-у в PATH нет. Так что добавим его туда:
в коде для контроля исполняемого файла добавим такое:
и убедимся, что conditional defines в настройках проекта для Release и Debug-конфигураций содержат RELEASE и DEBUG, соответственно
Так что нужно лишь задать свойство Config в нужное нам значение, и собираться будет нужная конфигурация:
но что это? тут нет условия (если не задано), и свойство задаётся всегда, сможем ли мы его переопределить? попробуем
DCC_Exeoutput задался и для каждой задачи MSBuild — это хорошо, но каждая конфигурация скомпилировала файл в один и тот же каталог. Тогда зададим подкаталоги соответственно конфигурации:
и теперь на выходе мы имеем два файла
Теперь представим, что у нас есть желание/необходимость временно задавать conditional define при сборке проекта (например, у нас есть демо-версия, в которой мы ограничиваем функциональность нашей программы, если задано переменная условной компиляции TRIAL )
В нашем демо-коде это выглядит так
Ага, т.е. если задать /p:DCC_Define=TRIAL,
Сработало, но как-то не так, куда-то делись DEBUG и RELEASE, а нам такого не надо, т.к. у нас там обычно куча полезных define-ов. А дело в том, что свойства заданные через командную строку имеют высший приоритет, и переопределяют значения в скриптах. Но выход есть. Определяем переменную окружения DCC_Define :
С компиляцией разобрались, теперь можно настраивать сервер сборок, который бы после каждого изменения в центральном репозитории (я ориентируюсь на Git, но для того же SVN это тоже применимо) собирал нам проект, дабы мы ничего не забыли добавить в исходники, и прогонял тесты, буде таковые у нас есть, и мы всегда будем готовы выпустить релиз или отдать на тестирование уже готовую сборку.
Однако ж, при таких частых сборках может стать проблема нумерации версий. Какая? Каждая новая сборка будет иметь ровно ту версию, которая прописана в свойствах проекта, а менять её с каждым коммитом — как-то рутинно и не «по-нашенски», к тому же, зависит от разработчика человека (а что такое «человеческий фактор» — не мне вам рассказывать).
Любознательный читатель наверняка уже догадывается как примерно такое использовать. Добавим в наш DelphiAutomatedBuild.dproj
(Условие «$(MSBuildToolsVersion) >= 4.0» необходимо для того, чтобы проект не падал с ошибкой при сборке в IDE, которая, как мы помним, использует MSBuild 3.5, который не поддерживает UsingTask)
Поставим в свойствах проекта «Include version information in project» и добавим вывод текущей версии (оставим это за скобками), и:
Заключение
Так мы научились автоматизированно собирать Delphi-приложения одной командой, что экономит нам время и нервы, в том числе, за счёт того, что позволяет переложить компиляцию и выпуск релизов на сервер сборок, и тем самым застраховаться от ситуаций, когда проект собирается только на машине разработчика. К тому же, позволяет автоматизировать простановку версии как каждой сборки (на каждый коммит), так и увеличение релизной версии при выпуске релиза.
В дальнейшем я ещё планирую рассказать
З.Ы. Буду рад ответить на любые вопросы, в том числе, в телеграме, как в личке, так и в чатах @Delphi_Lazarus и @DelphiCommunity
Лучшие практики Delphi для нового проекта в 2021 году и в будущем
Цель этого руководства — описать экосистему разработки Delphi. Это может быть полезно для тех, кто переходит на Delphi с другого языка программирования.
Delphi действительно прост в освоении — синтаксис языка программирования можно выучить за часы. Паскаль, от которого произошел язык Object Pascal в Delphi, долгое время был очень популярным языком в колледжах и образовании для обучения основным концепциям разработки программного обеспечения. Знание основ программирования — важная часть программирования. Но существует целая экосистема терминологии и методов. Это всегда ошеломляет человека, имеющего другой опыт в области технологий.
Другая проблема заключается в том, что доступно так много различных компонентов, примеров и библиотек Delphi, что может быть довольно сложно решить, какие из них лучше всего подходят для той или иной цели. Вы избалованы выбором, и иногда слишком большой выбор может вызвать головную боль.
Итак, чтобы попытаться облегчить эту небольшую кривую обучения, в этой статье собраны некоторые из самых популярных инструментов, библиотек и лучших практик в Delphi. Вы можете найти больше интересных демонстраций, советов и приемов в нашем блоге.
Как начать разработку на Delphi?
Как работать с программами Delphi в другом редакторе кода, например VS Code?
Чтобы использовать надстройку DelphiLSP VS Code, вам просто нужно иметь последнюю версию Embarcadero Delphi, установленную на вашем компьютере, и сгенерировать файл конфигурации LSP.
Как написать читаемый и поддерживаемый код на Delphi?
Как отформатировать исходный код Delphi?
Каждый разработчик пишет код в своем стиле. Поскольку компиляторы Embarcadero игнорируют любые пробелы, в которых вы можете написать один и тот же код сотнями различных способов, это может привести к нечитаемому исходному коду.
Мы можем предотвратить это, применив форматирование исходного кода по умолчанию или сгенерировав наш файл конфигурации форматирования.
При кодировании в редакторе кода вы можете применить команду контекстного меню «Форматировать исходный код» для форматирования исходного кода. Кроме того, вы можете определить свой собственный стиль форматирования и сохранить его в файле конфигурации. Затем другие члены команды также могут использовать тот же стиль форматирования, чтобы сделать исходный код удобным для сопровождения.
Ознакомьтесь с официальной документацией, чтобы узнать больше об этом.
Есть ли в Delphi менеджер пакетов?
Если вы занимались разработкой веб-приложений, вы знакомы с различными менеджерами пакетов. диспетчер пакетов экосистемы Delphi называется диспетчером пакетов GetIt, который поставляется с IDE. Кроме того, есть портал GetIt, где вы можете увидеть все доступные пакеты.
Как проводить модульное тестирование в Delphi?
Тестирование — неотъемлемая часть жизненного цикла разработки программного обеспечения. В Delphi вы можете проводить модульное тестирование с помощью тестовой среды с открытым исходным кодом DUnitX — она позволяет вам разрабатывать и выполнять тесты для Win32, Win64, macOS и Linux в приложениях Delphi.
Есть полная статья о модульном тестировании с DUnitX в Delphi:
Как я могу протестировать независимые модули в Delphi?
Один из приемов модульного тестирования — разделение зависимостей, но если ваш код зависит от базы данных или сетевого сокета, как вы его тестируете? Введите Mocks. Великолепный инструмент, позволяющий тестировать независимые блоки кода без зависимостей — Delphi-Mocks
Как создать полнофункциональное кроссплатформенное приложение с помощью Delphi?
Delphi FireMonkey обеспечивает многоплатформенную разработку с единой базой кода. Это означает, что вы можете настроить таргетинг на Android, iOS, macOS, Linux и Windows, написав одно приложение. Более того, FireMonkey предлагает широкий спектр функций, которые вы можете настроить так же, как вы, путем доступа к специфическим для платформы функциям через интерфейсы.
Как интегрировать веб-API RESTful в приложение Delphi?
Есть несколько способов интегрировать API в приложение Delphi. Самый простой способ — использовать компоненты клиента REST и отладчик REST. Компоненты клиента REST — это компоненты корпоративного уровня, которые обеспечивают простую и быструю интеграцию с любым веб-API.
В этом руководстве вы можете узнать, как интегрировать один из ведущих на рынке API новостей в приложение Delphi FireMonkey и создать приложение новостей!
Как ЛЕГКО создавать приложения на основе REST в Delphi?
Delphi поддерживает REST через инфраструктуру DataSnap, поддержку интеграции WebBroker и создание прокси-серверов JavaScript для методов, предоставляемых веб-службой.
Кроме того, вы можете использовать различные библиотеки и фреймворки с открытым исходным кодом для создания приложений RESTful. Это включает:
Часто причиной проблем является незнание языка должным образом. Более того, если вы не знакомы с библиотеками, фреймворками и инструментами в экосистеме, это может привести к чрезмерной инженерии — выполнять тяжелую работу самостоятельно, когда кто-то уже сделал все это раньше и имеет все ответы за вас.
Чтобы лучше понять экосистему Delphi и иметь возможность применять лучшие отраслевые практики, я хотел бы, чтобы вы изучили ее на реальных примерах. Эти примеры предоставляют вам понимание различных методов создания различных приложений с помощью Delphi.
Как насчет финального бонусного списка полезных ссылок Delphi?
Это лишь часть всего списка. Если вам есть чем поделиться, оставьте комментарий!
RAD Studio может воплотить ваши прекрасные идеи в реальность — на Windows, macOS, Linux, iOS и Android. Почему бы не скачать бесплатную пробную версию и не посмотреть, что она может для вас сделать?
Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder. Design. Code. Compile. Deploy. Start Free Trial Upgrade Today
Программирование на Delphi. Часть 1. Установка Delphi Community Edition (бесплатная версия)
Компания Embarcadero в 2018 году представила Delphi Community Edition — бесплатную версию легендарной среды разработки Delphi. Использовать её могут студенты, стартаперы, небольшие команды, некоммерческие организации. Условия использования: лицензия на использование продолжает действовать до тех пор, пока прибыль физического лица или компании от приложений Delphi не достигнет 5 000 долларов США, или штат команды разработчиков не превысит 5 человек.
С помощью Delphi Community Edition можно разрабатывать мультиплатформенные приложения на Windows, Android, iOS и macOS. В этой статье мы пошагово пройдём процесс установки среды и напишем тестовое приложение под Windows. Delphi всегда был инструментом для быстрого старта в разработке под Windows на языке Pascal, это мы сегодня и проверим.
Примерное время установки: около 40-60 минут.
1. Скачивание бесплатной версии Delphi
Для того, чтобы получить доступ к Delphi Community Edition, пройдите по этой ссылке https://www.embarcadero.com/ru/products/delphi/starter/free-download
Заполните форму, введенный пароль сохраните. В качестве компании я указал один из своих сайтов, телефон реальный, но мне никто пока что не звонил :). Главное: правильно укажите электронную почту.
На почту вам придёт письмо с ключом — его лучше сохранить. После отправки формы начнётся процесс загрузки. Если загрузка не начнётся, ссылка будет также в письме. Письмо вам необходимо — если оно не пришло, проверяйте спам. Если вообще не пришло, регистрируйтесь заново на другой ящик. Я регистрировался дважды на разные email — один на доменную почту, второй на Gmail. Оба раза всё было ок. Вот как выглядит письмо:
2. Установка Delphi Community Edition
Введите Serial number из письма в почте и нажмите Register.
Программа начнёт связываться с серверами Embarcadero и попытается зарегистрировать вашу копию. На одном компьютере у меня всё произошло мгновенно, на другом с третьей попытки. Судя по сообщениям, проблема была с серверами Embarcadero. Если всё получилось, переходите к следующему разделу статьи. Если нет, попробуйте сделать следующее. На скриншоте ниже кликните по ссылке «Trouble connection…»
Программирование на языке Delphi. Глава 7. Проект приложения
7.1. Проект
7.1.1. Понятие проекта
На основании сказанного можно изобразить процесс создания приложения в среде Delphi от постановки задачи до получения готового выполняемого файла (рисунок 7.1):
Рисунок 7.1. Процесс создания приложения в среде Delphi
Давайте рассмотрим назначение и внутреннее устройство файлов проекта. Это поможет вам легче ориентироваться в проекте.
7.1.2. Файлы описания форм
Если вы желаете взглянуть на содержимое DFM-файла, вызовите у формы контекстное меню щелчком правой кнопки мыши и выберите команду View as Text (рисунок 7.2).
Рисунок 7.2. Переход к текстовому представлению формы с помощью команды View as Text контекстного меню
В ответ среда Delphi вместо графического изображения формы покажет следующий текст в редакторе кода :
Несмотря на столь длинный текст описания, разобраться в нем совсем не сложно. Здесь на специальном языке задаются исходные значения для свойств формы Form1 и ее компонентов Button1, Button2, Edit1, Edit2, Label1, Label2. Большего знать не требуется, поскольку вы всегда будете использовать визуальные средства проектирования и работать с графическим представлением формы, а не с текстовым описанием. Раз так, давайте поспешим вернуться к графическому представлению, не внося в текст никаких изменений. Для этого вызовите контекстное меню редактора кода и выберите команду View as Form (рисунок 7.3).
Рисунок 7.3. Переход к графическому представлению формы с помощью команды View as Form контекстного меню
На экране снова появится графический образ формы. Если вы все-таки внесли корректировки в текст, то они отразятся на внешнем виде формы.
Файл описания формы (DFM-файл) нужен только на этапе проектирования. При сборке приложения описание формы из DFM-файла помещается в специальную область данных выполняемого файла (область ресурсов). Когда во время работы приложения происходит создание формы, ее описание извлекается из области ресурсов и используется для инициализации формы и ее компонентов. В результате форма отображается на экране так, как вы задали при проектировании.
7.1.3. Файлы программных модулей
Каждой форме в проекте соответствует свой программный модуль (unit), содержащий все относящиеся к форме объявления и методы обработки событий, написанные на языке Delphi. Программные модули размещаются в отдельных файлах с расширением PAS. Их количество может превышать количество форм. Почему? Потому, что в ряде случаев программные модули могут и не относиться к формам, а содержать вспомогательные процедуры, функции, классы и проч. Наша задача об идеальном весе очень простая, поэтому в ней имеется только один программный модуль, связанный с формой. Не поленитесь изучить его внимательно:
Дадим необходимые комментарии к тексту программного модуля. В самом начале после ключевого слова unit записывается имя модуля
Содержание интерфейсной секции модуля ( interface ) начинается с подключения стандартных модулей библиотеки VCL, в которых определены часто вызываемые подпрограммы и классы помещенных на форму компонентов.
Среда Delphi формирует список модулей без вашего участия и автоматически пополняет его, когда вы добавляете на форму новые компоненты. Тем не менее, список подключенных модулей можно изменять прямо в редакторе кода (вручную).
Помещенные на форму компоненты представлены полями формы. У нас на форме шесть компонентов, поэтому и полей в описании класса тоже шесть. Имена полей совпадают с именами компонентов, заданными в окне свойств.
После описания класса идет объявление собственно объекта формы:
На этом содержание интерфейсной секции модуля заканчивается и начинается раздел реализации ( implementation ). Сначала в нем подключается файл описания формы:
Пожалуйста, не подумайте, что эта директива подключает все файлы с расширением DFM. Подключается лишь один DFM-файл, в котором описана форма данного модуля. Имя DFM-файла получается заменой звездочки на имя модуля, в котором записана директива.
Далее следует реализация методов обработки событий. Пустые заготовки для них среда Delphi создает сама одновременно с добавлением заголовков в класс формы. Вы же наполняете их содержанием.
При внимательном изучении исходного текста модуля остается невыясненным один вопрос: как обеспечивается вызов методов Button1Click и Button2Click при нажатии на форме кнопок, ведь в тексте модуля отсутствует даже намек на это. Все очень просто. Загляните в DFM-файл. Кроме установки значений свойств вы найдете установку и обработчиков событий.
Мы достаточно глубоко погрузились во внутреннее устройство файлов описания форм и файлов программных модулей и, признаемся, сделали это намеренно, чтобы дать вам полное понимание вопроса, не заставляя принимать на веру далеко неочевидные вещи. А сейчас пора подняться на уровень проекта и посмотреть, что же объединяет все эти файлы.
7.1.4. Главный файл проекта
Подключаемый следом модуль Unit1 содержит определение формы. Название формы приводится в фигурных скобках. Директива in указывает на то, что модуль является необходимой частью проекта и существует в виде исходного текста на языке Delphi.
Директива <$R *.res>подключает к результирующему выполняемому файлу так называемые ресурсы, в данном случае значок приложения. Этот значок будет виден на Панели Задач.
Внимание! Никогда не изменяйте DPR-файл вручную. Оставьте эту работу для среды Delphi. Добавление и удаление модулей, а также управление созданием форм осуществляется с помощью команд и диалоговых окон среды.
7.1.5. Другие файлы проекта
Выше мы рассмотрели основные файлы проекта. Кроме них существует ряд дополнительных файлов:
В проект могут входить также логически автономные элементы: точечные рисунки (BMP-файлы), значки (ICO-файлы), файлы справки (HLP-файлы) и т.п., однако ими управляет сам программист.
Теперь можно уточнить рисунок, отражающий состав проекта (рисунок 7.4):
Рисунок 7.4.Состав проекта в среде Delphi
7.2. Управление проектом
7.2.1. Создание, сохранение и открытие проекта
Рисунок 7.5. Окно выбора проекта
С открытым проектом можно продолжить работу: исправить, компилировать, выполнить, и не забыть сохранить.
7.2.2. Окно управления проектом
Рисунок 7.6. Окно управления проектом
Управление проектом выполняется с помощью контекстного меню, которое вызывается щелчком правой кнопки мыши по элементу Project1 (рисунок 7.7).
Рисунок 7.7. Контекстное меню проекта
Назначение команд контекстного меню кратко описано в следующей таблице:
Команда
Описание
Add…
Добавляет существующий файл (модуль) в проект.
Remove File…
Удаляет файл (модуль) из проекта.
Save
Сохраняет проект на диск.
Options…
Вызывает диалоговое окно настройки проекта ( Project Options ).
Activate
Делает проект активным (при работе с группой проектов, см. параграф 7.2.3).
Close
Закрывает проект.
Remove Project
Удаляет проект из группы (см. параграф 7.2.3).
Build Sooner
Перемещает проект вверх по списку, определяющему очередность сборки проектов. Используется при работе с группой проектов (см. параграф 7.2.3).
Build Later
Перемещает проект вниз по списку, определяющему очередность сборки проектов. Используется при работе с группой проектов (см. параграф 7.2.3).
Compile All From Here
Компилирует измененные проекты по порядку, начиная с выделенного проекта. Используется при работе с группой проектов (см. параграф 7.2.3).
Build All From Here
Компилирует все проекты по порядку, начиная с выделенного проекта. Используется при работе с группой проектов (см. параграф 7.2.3).
Управление отдельным модулем выполняется с помощью контекстного меню, которое вызывается щелчком правой кнопки мыши по соответствующему элементу, например Unit1 (рисунок 7.8).
Рисунок 7.8. Контекстное меню модуля в окне управления проектом
Назначение основных команд контекстного меню кратко описано в следующей таблице:
Команда
Описание
Open
Открывает модуль. Если модуль содержит форму, то на экране появляется ее графическое представление. Иначе, на экране появляется редактор кода с исходным текстом программного модуля.
Remove From Project
Удаляет модуль из проекта.
Save
Сохраняет модуль на диск.
Save As…
Сохраняет модуль с новым именем.
Теперь вы всегда сможете узнать, из каких файлов состоит тот или иной проект, а управление им не составит для вас никакого труда.
7.2.3. Группы проектов
Рисунок 7.9. Контекстное меню группы проектов
Назначение команд контекстного меню кратко описано в следующей таблице:
Команда
Описание
Add New Project…
Создает новый проект и добавляет его в группу.
Add Existing Project…
Добавляет существующий проект в группу.
Save Project Group
Сохраняет файл, описывающий группу проектов.
Save Project Group As…
Сохраняет описание группы проектов в файле с другим именем.
View Project Group source
Показывает текстовый файл, описывающий группу проектов.
Когда в группу объединены несколько проектов, среда Delphi создает специальный текстовый файл с описанием этой группы. Файл имеет расширение BPG (от англ. Borland Project Group), а его имя запрашивается у пользователя. Для групп, состоящих из одного единственного проекта BPG-файл не создается.
7.2.4. Настройка параметров проекта
Диалоговое окно параметров проекта состоит из нескольких вкладок. Параметров очень много, поэтому мы рассмотрим только те, которые используются наиболее часто.
На вкладке Forms (рисунок 7.10) можно задать главную форму приложения ( Main form ) и в списке Auto-create forms указать формы, которые будут создаваться одновременно с главной формой.
Рисунок 7.10. Окно параметров проекта. Вкладка Forms
На вкладке Application (рисунок 7.11) можно задать название ( Title ) вашей программы. В среде Delphi дополнительно можно задать файл справки ( Help file ) и значок ( Icon ).
Рисунок 7.11. Вкладка Application в окне параметров проекта
Рисунок 7.12. Вкладка Compiler в окне параметров проекта
Рисунок 7.13. Вкладка Compiler Messages в окне параметров проекта
Рисунок 7.14. Вкладка Linker в окне параметров проекта
Рисунок 7.15. Вкладка Directories/Conditionals в окне параметров проекта
Рисунок 7.16. Вкладка Version Info в окне параметров проекта
Рисунок 7.17. Вкладка Packages в окне параметров проекта
Когда все параметры проекта установлены, можно приступать к его компиляции.
7.2.5. Компиляция и сборка проекта
Компиляция и сборка проекта могут выполняться на любой стадии разработки проекта. Под компиляцией понимается получение объектных модулей (DCU-файлов) из исходных текстов программных модулей (PAS-файлов). Под сборкой понимается получение выполняемого файла из объектных модулей. В среде Delphi компиляция и сборка проекта совмещены.
Для выполнения компиляции достаточно выполнить команду меню Project / Compile или нажать комбинацию клавиш Ctrl+F9. При этом компилируются все исходные модули, содержимое которых изменялось после последней компиляции. В результате для каждого программного модуля создается файл с расширением DCU (сокр. от Delphi Compiled Unit). Затем среда Delphi компилирует главный файл проекта и собирает (иногда говорят компонует) из DCU-модулей выполняемый файл, имя которого совпадает с именем проекта. К сведению профессионалов заметим, что смышленый компилятор среды Delphi выбрасывает из выполняемого файла весь неиспользуемый программный код, поэтому не стоит волноваться по поводу лишних объектов и подпрограмм, которые могут присутствовать в подключенных модулях.
7.2.6. Запуск готового приложения
Когда после многочисленных компиляций вы исправите все ошибки и получите-таки выполняемый файл, можно будет посмотреть на результат вашего самоотверженного труда. Для этого надо выполнить созданное приложение с помощью команды меню Run / Run или клавиши F9. Перед выполнением будет автоматически повторен процесс компиляции (если в проект вносились изменения) и после его успешного завершения приложение запустится на выполнение. В результате вы увидите на экране его главную форму.
7.3. Форма
7.3.1. Понятие формы
Форма имеет очень много свойств, и поначалу в них легко запутаться. Практика показывает, что путаница возникает из-за алфавитного порядка свойств в окне Object Inspector : близкие по смыслу свойства оказываются разбросанными по ячейкам списка. Чтобы у вас сложилось представление о возможностях формы, рассмотрим основные свойства формы в порядке их важности. Для этого нам понадобится новое приложение.
Рисунок 7.18. Форма на экране и ее описание в редакторе кода
7.3.2. Имя и заголовок формы
Рисунок 7.19. Программный идентификатор формы
На будущее заметим, что свойство Name есть в любом компоненте, и оно редактируется в окне свойств.
Рисунок 7.20. Заголовок формы
7.3.3. Стиль формы
Многие приложения, с которыми вы работаете, имеют пользовательский интерфейс MDI. Они состоят из основного окна, которое включает одно или несколько внутренних окон. Внутренние окна ограничены областью основного окна и не могут выходить за его границы. Для главной формы, соответствующей основному окну MDI-приложения, значение свойства FormStyle должно быть равно fsMDIForm. Для всех второстепенных форм, соответствующих внутренним окнам, значение свойства FormStyle равно fsMDIChild. Для окон диалога, выполняющихся в монопольном режиме, свойство FormStyle равно значению fsNormal, что дает возможность выносить их за пределы основной формы.
Если программа имеет пользовательский интерфейс SDI, то каждая форма существует в виде отдельного независимого окна. Одно из окон является главным, однако оно не содержит другие окна. В SDI-приложении значение свойства FormStyle равно fsNormal и для главной формы, и для второстепенных форм. В некоторых случаях допускается установка значения fsStayOnTop для того, чтобы форма всегда отображалось поверх других форм.
7.3.4. Размеры и местоположение формы на экране
Рисунок 7.21. Размеры и местоположение формы на экране
Кроме того, с помощью свойства Position можно организовать автоматическое размещение формы на экране, выбрав одно из следующих возможных значений:
При перемещении по экрану, форма может слегка прилипать к краям экрана, если края формы находятся в непосредственной близости от них. Это происходит в том случае, если свойство ScreenSnap содержит значение True. Расстояние формы до краев экрана, при котором форма прилипает, задается в свойстве SnapBuffer и измеряется в пикселях.
Если при проектировании вы измените значение свойства WindowState на wsMinimized или wsMaximized, то получите форму, которая при первом появлении будет автоматически либо свернута в панель задач, либо развернута на весь экран.
На компьютере с двумя и более мониторами существует возможность выбрать для формы монитор, на котором она отображается. Для этого следует установить свойство DefaultMonitor в одно из следующих значений:
Свойство DefaultMonitor учитывается лишь в том случае, если в программе существует главная форма.
7.3.5. Цвет рабочей области формы
Рисунок 7.22. Стандартоне диалоговое окно выбора цвета
7.3.6. Рамка формы
Рисунок 7.23. Рамка формы и ее контекстное меню
Команды меню управления не нуждаются в комментариях.
7.3.7. Значок формы
Если вы разрабатываете коммерческое приложение, а не тестовый пример, следует позаботиться о том, чтобы форма имела в своем левом верхнем углу выразительный значок. Для разработки значков существует множество средств, на которых мы не будем останавливаться. Когда значок готов и сохранен в файле, его нужно просто установить в качестве значения свойства Icon (рисунок 7.24).
Рисунок 7.24. Установка значка формы
Рисунок 7.25. Окно выбора значка для формы
Среда Delphi сразу же подставит выбранный значок в левый верхний угол формы (рисунок 7.26).
Рисунок 7.26. Новый значок формы
7.3.8. Невидимая форма
7.3.9. Прозрачная форма
Рисунок 7.27. Прозрачная форма
7.3.10. Полупрозрачная форма
Рисунок 7.28. Полупрозрачная форма
7.3.11. Недоступная форма
Как вы понимаете, все описанные выше свойства доступны не только в окне свойств, но и в редакторе кода, т.е. в тексте программы. При работе с формой на уровне исходного кода вы также получаете доступ к некоторым дополнительным свойствам, которые не видны в окне свойств. Они будут рассматриваться по мере надобности.
7.3.12. События формы
Итак, со свойствами мы разобрались и пора сказать пару слов о возникающих при работе с формой событиях. С вашего позволения мы опустим те события формы, которые происходят во всех видимых на экране компонентах (мы о них расскажем позже, когда будем рассматривать компоненты). Перечислим лишь характерные события форм:
7.4. Несколько форм в приложении
Часто одной формы для решения задачи бывает мало. Поэтому сейчас мы рассмотрим, как добавить в проект новую форму, выбрать главную форму приложения, переключаться между формами. Затем мы расскажем, как на этапе работы приложения решается вопрос показа форм на экране.
7.4.1. Добавление новой формы в проект
Рисунок 7.29. Две формы в проекте
7.4.2. Добавление новой формы из Хранилища Объектов
Рисунок 7.30. Окно создания новой формы или другого элемента проекта
Рисунок 7.31. Быстрое создание формы с «начинкой»
На вкладках Forms и Dialogs существует переключатель, указывающий, что нужно сделать с формой-заготовкой: копировать ( Copy ), наследовать ( Inherit ) или использовать ( Use ). Отличие между ними состоит в следующем:
Для нашего учебного примера двух форм достаточно, поэтому вернемся к уже созданным формам, нажав кнопку Cancel.
7.4.3. Переключение между формами во время проектирования
Рисунок 7.32. Окно для переключения на другую форму
7.4.4. Выбор главной формы приложения
Рисунок 7.33. Главная форма в проекте записана в поле Main form
7.4.5. Вызов формы из программы
Работая с несколькими формами, вы должны принимать во внимание, что после загрузки приложения отображается только главная форма. Остальные формы хотя и создаются вслед за ней автоматически, на экране сразу не показываются, а ждут пока их вызовут. Форму можно вызвать для работы двумя разными способами:
Рисунок 7.34. Окно для выбора подключаемого модуля
На экране не произойдет видимых изменений, но в секции implementation программного модуля Main добавится строка
Рисунок 7.35. Текст на кнопке записывается в свойстве Caption
Рисунок 7.36. Приложение с двумя формами на экране
Таким образом, при использовании метода Show пользователь может работать одновременно с несколькими формами, переключаясь между ними.
Рисунок 7.37. Вторая форма работает в монопольном режиме
7.5. Компоненты
7.5.1. Понятие компонента
Понятие компонента является фундаментальным для среды Delphi. Без компонентов все преимущества визуальной разработки приложений исчезают и говорить становится не о чем. Поэтому соберите все силы и внимательно прочитайте этот параграф, пытаясь усвоить не только технику использования компонентов, но и саму их суть.
Существует два взгляда на компоненты.
При анализе структуры компонента обнаруживается, что его природа троична и лучше всего описывается формулой:
Компонент = состояние (свойства) + поведение (методы) + обратная реакция (события).
7.5.2. Визуальные и невизуальные компоненты
Все компоненты делятся на две группы: визуальные и невизуальные компоненты (рисунок 7.38).
Рисунок 7.38. Визуальные и невизуальные компоненты
7.5.3. «Оконные» и «графические» компоненты
Рисунок 7.39. Компоненты, рисуемые оконной системой Windows и графической библиотекой Delphi
Общая классификация компонентов составлена, поэтому перейдем к обсуждению их свойств и событий. Очевидно, каждый компонент обладает специфичным набором свойств и событий и, казалось бы, изучать их следует в контексте изучения компонента. Так мы и будем поступать в будущем при рассмотрении отличительных свойств компонентов. Однако сейчас имеет смысл рассмотреть общие для большинства компонентов свойства и события.
7.5.4. Общие свойства визуальных компонентов
Визуальные компоненты имеют ряд общих свойств:
7.5.5. Общие события визуальных компонентов
Визуальные компоненты имеют ряд общих событий:
Для организации буксировки и стыковки, в визуальных компонентах существует еще несколько событий:
Подробно события буксировки и стыковки рассмотрены в главе 10.
7.6. Управление компонентами при проектировании
7.6.1. Помещение компонентов на форму и их удаление
Чтобы поместить на форму нужный компонент из палитры компонентов, выполните следующие действия:
Выбранный компонент окажется на форме и будет готов к настройке в окне свойств.
Часто требуется разместить на форме несколько компонентов одного и того же типа, например, кнопок. В этом случае действуйте следующим образом:
Если вы по каким-либо причинам решили убрать лишний компонент с формы, просто выберите его с помощью мыши и нажмите клавишу Del.
7.6.2. Выделение компонентов на форме
На стадии проектирования любой компонент может быть выделен на форме. Свойства выделенного компонента видны в окне свойств и доступны для редактирования. Чтобы выделить компонент, достаточно навести на него указатель и нажать кнопку мыши. Вокруг компонента тут же появятся так называемые «точки растяжки» (sizing handles) для изменения размеров компонента по ширине и высоте (рисунок 7.40).
Рисунок 7.40. Точки растяжки компонента
При проектировании сложных форм вы столкнетесь с ситуацией, когда сразу в нескольких компонентах нужно установить некоторое свойство в одно и то же значение. Например, в нескольких кнопках установить свойство Enabled в значение False. Быстрее всего это можно сделать, если выделить несколько компонентов, после чего перейти к окну свойств и изменить нужное свойство. Когда на форме выделено несколько компонентов, в окне свойств видны только их общие свойства.
Выделить несколько компонентов можно двумя способами:
Вы можете комбинировать оба способа для выделения лишь тех компонентов, которые вам нужны.
Когда на форме выделено несколько компонентов, в окне свойств отображаются лишь их общие свойства. Активизируйте нужное свойство и установите в нем нужное значение. Вы увидите, что эта установка отразится на всех выделенных компонентах (рисунок 7.41).
Рисунок 7.41. Установка свойства для группы компонентов
7.6.3. Перемещение и изменение размеров компонента
Для перемещения компонента на другое место:
Изменить размер компонента тоже просто:
Рисунок 7.42. Расстояние между узлами сетки по горизонтали и вертикали
Иногда после грубого размещения компонента на сетке необходимо подогнать его положение и размеры с точностью до точки экрана. Для этого не требуется отключать сетку или изменять ее шаг. Просто выберите компонент на форме и действуйте следующим образом:
7.6.4. Выравнивание компонентов на форме
Когда на форме много компонентов, ручное выравнивание становится весьма утомительным занятием. На этот случай в среде Delphi предусмотрены средства автоматизированного выравнивания компонентов. Алгоритм выравнивания следующий:
1. Выделите компоненты, которые собираетесь выравнять. Во всех четырех углах каждого выделенного компонента появятся небольшие квадратики-маркеры;
Рисунок 7.43. Диалоговое окно для выбора способа выравнивания группы компонентов на форме
Если компонентов на форме много и вам предстоит большая работа по их выравниванию, откройте окно Align (с помощью команды меню View / Alignment Palette ) и используйте его на втором шаге приведенного выше алгоритма (рисунок 7.44).
Рисунок 7.44. Вспомогательная панель кнопок для выравнивания группы компонентов на форме
7.6.5. Использование Буфера обмена
При работе с несколькими формами иногда встает задача копирования и перемещения компонентов с одной формы на другую. Обычное перетягивание здесь не помогает. Проблема легко решается с помощью Буфера обмена:
Добавим, что команды работы с Буфером обмена применяются не только для копирования и перемещения компонентов с одной формы на другую, но также для копирования и перемещения компонентов в пределах одной формы между разными компонентами-владельцами, например для перемещения кнопок с одной панели на другую. Необходимость использования Буфера обмена в этом случае вызвана тем, что компоненты твердо знают своего владельца (например, кнопки знают панель, на которой они расположены), поэтому обычная операция буксировки ни к чему не приводит.
7.7. Закулисные объекты приложения
Объект Application отсутствует в палитре компонентов, поэтому его свойства можно изменять только из программы. Кратко рассмотрим наиболее важные свойства этого объекта:
Рисунок 7.45. Окно параметров проекта
Каждая программа что-то выводит на экран, иначе она просто бесполезна. В среде Delphi экран трактуется как глобальный объект Screen класса TScreen, имеющий набор свойств. Многие из них жестко связаны с физическими характеристиками экрана (с «железом»), поэтому в большинстве случаев не доступны для записи. Обозначим самые важные свойства:
В качестве примера использования объекта Screen приведем фрагмент, устанавливающий указателю мыши вид песочных часов на время выполнения какой-либо длительной операции: