Delphi сделать модальное окно

Обновлено: 28.03.2024

Основу Delphi составляет не только сам язык, но и RAD (Rapid Application Development) – среда быстрой разработки программ . Благодаря визуальному программированию, а также достаточно большой библиотеке визуальных компонентов, Delphi позволяет создавать программы наиболее быстро и эффективно, принимая на себя основную работу, и оставляя программисту творческий процесс. Разумеется, возможность быстрого создания профессиональных приложений для Windows делает Delphi – программистов востребованными во всех отраслях человеческой деятельности.

Первая программа

Традиционно при изучении программирования принято создавать первую программу, которая выводит текст "Hello, world!". Не будем отступать от традиции и создадим программу, которая выводит этот текст тремя разными способами. Но вначале познакомимся с самой средой программирования Delphi. Предполагается, что на этот момент Delphi 7 уже установлена на вашем ПК. Если это не так, то перед дальнейшим прочтением лекции установите Delphi 7. При загрузке Delphi 7 вы видите такую картину:

Рабочая среда Delphi 7

Рис. 1.1. Рабочая среда Delphi 7

Познакомьтесь – это Delphi. У нее есть много окон, панелей, компонентов. С большинством из них мы познакомимся со временем, а пока нам нужно обратить внимание на 5 окон:

  1. Главное окно Delphi. Здесь находится основное меню, различные панели инструментов и палитра компонентов, состоящая из множества вкладок.
  2. Конструктор формы. Здесь мы визуально видим, как будет выглядеть форма программы, здесь мы будем создавать интерфейс, перенося на форму различные компоненты, и расставляя их таким образом, чтобы интерфейс выглядел привлекательным. Нам часто придется переключаться между конструктором форм и редактором кода, делается это клавишей F12.
  3. Редактор кода. Здесь мы видим исходный код программы, который создан самой Delphi. Тут же мы будем вводить наш собственный код.
  4. Объектный инспектор. Он предназначен для управления объектами проекта и состоит из двух вкладок – Properties (Свойства) и Events (События).
  5. Дерево объектов. Здесь мы видим, какой именно объект в данный момент является текущим. Это окно будет особенно полезно, когда на форме появится множество компонентов.

Когда открывается Delphi, она автоматически создает и отображает новый проект (программу). На рисунке вы видите проект , который содержит только одну стандартную форму . Форма – это тоже объект, который представляет собой окно программы. Чтобы программа делала что-то полезное, нам придется вносить изменения в нее. Выведем текст "Hello, world!" первым способом. Для этого в инспекторе объектов найдите свойство Caption. В данный момент текущим является объект – форма , и свойство Caption формы отвечает за надпись на системной строке программы (синяя полоса вверху любого программного окна). По умолчанию, свойство Caption содержит надпись "Form1", также называется и сама форма. Измените эту надпись на "Hello, world!" (конечно, без кавычек). Уже в процессе ввода текста вы видите, что надпись в системной строке принимает новый вид. Мы ввели этот текст одним способом.

Теперь нам нужно сохранить проект . Проект – совокупность файлов разных форматов, из которых создается программа. Об этом мы подробней поговорим в одной из следующих лекций, а пока запомните правило – каждую программу (проект), которую вы создаете, нужно сохранять в отдельной папке. Если вы все проекты станете сохранять в одну папку, то очень скоро запутаетесь. Чтобы сохранить проект, выполним следующие действия:

    Выбираем команду меню "File – Save All" (сохранить все), либо нажимаем горячие клавиши , либо нажимаем одноименную кнопку на панели инструментов

Рис. 1.2. Кнопки Save (Сохранить) и Save All (Сохранить всё) на панели инструментов

Далее нам необходимо скомпилировать программу, то есть, перевести исходный код в выполняемый exe-файл. Для этого мы можем выбрать команду меню "Run - Run", либо нажать горячую клавишу F9, либо нажать кнопку "Run" на панели инструментов (на кнопке изображение зеленой стрелки, указывающей вправо). В результате, программа была не только скомпилирована, но и запущена. Если вы посмотрите на системную строку Delphi, то увидите надпись "Delphi 7 – hello [Running]", а окна инспектора объектов и дерева объектов исчезли. Это говорит о том, что программа находится в режиме выполнения. Выполняемая программа имеет точно такой же вид, как наша главная форма, только на форме отсутствует точечная сетка, предназначенная для облегчения дизайна. Окно полученной программы содержит все стандартные кнопки Windows – программы. Щелкнув по красному крестику в правой верхней части окна, закройте программу (но не Delphi), и вы увидите прежнюю форму.

Обратите внимание, что свойства в Объектном Инспекторе принадлежат выделенному в данный момент компоненту. Выделяются компоненты простым щелчком мыши. Имейте в виду, что щелкать нужно один раз. Двойной щелчок создаст обработчик события – процедуру. Если вы ошибочно создадите таким образом процедуру, то просто сохраните проект, ничего в нее не вписывая – при сохранении последние пустые процедуры автоматически удаляются. Удалять их вручную не рекомендуется.

Попробуем второй способ. Обратите внимание на Палитру компонентов . Текущей является вкладка Standard , и на ней находится множество значков – компонентов. Когда вы подводите указатель мыши к какому-либо компоненту, через некоторое время выскакивает подсказка с именем компонента. Нам нужен компонент Label , который представлен на вкладке в виде кнопки с изображением жирной буквы "А". Щелкните по этой кнопке, затем щелкните по свободному месту на форме, чтобы вставить компонент. Лучше, если вы расположите его ближе к левому верхнему краю формы. Компонент Label появился на форме. Этот компонент представляет собой обычную надпись. Сейчас он выделен, и содержит надпись по умолчанию, - "Label1". Теперь объектный инспектор показывает свойства этого компонента, а не формы. Label также имеет свойство Caption , которое вы можете изменить в Инспекторе объектов. Найдите это свойство, и вместо "Label1" впишите "Hello, world!". Текст в компоненте Label изменился. Если вам не нравится место, в котором оказался компонент, вы можете перетащить его мышью на другое место. Кроме того, точное местоположение компонента вы можете задать, если выделите его, и будете нажимать клавиши перемещения курсора, удерживая при этом клавишу . Теперь попробуйте еще одно свойство компонента Label – свойство Font (шрифт). Найдите это свойство в инспекторе объектов, и выделите его. Справа появится кнопочка с тремя точками, нажмите ее. Откроется стандартное окно выбора шрифта. Здесь вы можете выбрать имя шрифта, его размеры, начертание (например, жирный курсив) и цвет текста. Поэкспериментируйте с размером компонента, его положением и шрифтом. Почти все компоненты, с которыми нам придется иметь дело, имеют эти свойства, так что в дальнейшем вам будет легче осваивать новый компонент.

Снова сохраните проект и нажмите кнопку Run (или ). Убедитесь, что надпись появилась на форме, после чего закройте программу (но не Delphi) и вернитесь к форме.

Для начала нужно установить на форму кнопку. Этот компонент также находится на вкладке Standard палитры компонентов, и выглядит как кнопочка с надписью "ОК". При наведении на него указателя мыши выскакивает подсказка "Button". Щелкнув по компоненту, щелкните затем по тому месту на форме, где вы хотели бы видеть эту кнопку. Изменим надпись на кнопке. Убедитесь, что кнопка выделена, и найдите в инспекторе объектов ее свойство Caption. Замените надпись "Button1" на "Нажми меня!". Если надпись не умещается на кнопке, вы можете растянуть кнопку мышью, или использовать для этого клавиши управления курсором с нажатой кнопкой .

Далее нам нужно создать обработчик нажатия на кнопку. Обработчик представляет собой процедуру, в которой мы будем писать наш код. Этот код будет выполняться программой всякий раз, когда пользователь нажмет на эту кнопку. Чтобы создать этот обработчик, следует дважды нажать на кнопку на форме. Вы сразу попадаете в редактор кода и видите, что процедура уже создана, курсор мигает в том месте, где мы должны ввести свой код. Пока что не будем разбираться, что тут к чему, а просто впишем строку:

Полный текст процедуры получится такой:

Если у вас так и получилось, сохраните проект, откомпилируйте его и запустите на выполнение. При нажатии на кнопку будет появляться указанная надпись. Мы создали полноценную программу, выводящую надпись "Hello, world!" тремя различными способами, вписав при этом лишь одну строку исходного кода! Полученный файл hello.exe находится в указанной вами папке
C:\Program Files\Borland\Delphi7\Projects\01

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

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

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

Модальные формы часто называют диалоговыми формами (окнами), или диалоговыми панелями, хотя существуют и немодальные диалоговые окна. Для выполнения различных операций в Windows часто используются стандартные диалоговые формы, с которыми пользователь имеет дело при работе с приложениями. Такие формы называются общими, или стандартными диалоговыми окнами, для работы с ними Delphi предлагает специальные компоненты. Мы рассмотрим их в другой статье.

Типичным примером модальной диалоговой формы системы Delphi является диалоговое окно About Delphi (см. скриншот).

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

Метод ShowModal

Для отображения формы в модальном режиме служит метод ShowModal.

Выполнение вышеуказанной процедуры (путем выбора пункта меню mnuAbout), приводит к отображению формы fmAbout в модальном режиме. Пункт меню может иметь заголовок (например, О программе), задаваемый в свойстве Caption. Пользователь может продолжить работу с приложением, только закрыв эту модальную форму.

Многие формы можно отображать и в немодальном режиме, например, так:

Напомним, что метод Show является процедурой, т. е. не возвращает результат.

При закрытии модальной формы функция ShowModal возвращает значение свойства ModalResult типа TModalResult. Возможные значения этого свойства рассмотрим в следующих статьях.

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

В качестве примера рассмотрим, как происходит управление диалоговой формой в реальном приложении.

Как правило, управление кодом результата диалога выполняется не программно (через свойство ModalResult формы), а с помощью кнопок. Чаще всего диалоговая форма содержит кнопки подтверждения и отмены выполненных операций. Кнопка подтверждения диалога в зависимости от назначения может называться по-разному, например: ОК, Ввод, Открыть, Yes. Кнопка отмены диалога часто называется Отмена или Cancel.

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

Рассмотрим в качестве примера следующую процедуру:

В вышеуказанной процедуре устанавливаются значения свойств кнопки btnOK подтверждения и кнопки btnCancel отмены диалога fmDialog. При нажатии любой из них форма автоматически закрывается (без выполнения обработчиков события нажатия кнопок) и возвращает соответствующий результат.

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

При закрытии формы методом Close всегда возвращается значение mrCancel ее свойства ModalResult. Скрытие формы методом Hide не изменяет значение свойства ModalResult.

В принципе разработчик может самостоятельно создать любую модальную форму, однако стоит сказать, что для выполнения типовых действий Delphi предлагает ряд предопределенных диалоговых окон. Наиболее простые диалоговые окна реализуются с помощью специальных процедур и функций, в более общих случаях удобно использовать специальные компоненты — стандартные диалоговые окна. Кроме того, ряд диалоговых форм расположен на странице Dialogs в Хранилище объектов.

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

Процедура ShowMessage

Функция MessageDlg

  • mtWarning (окно содержит черный восклицательный знак в желтом треугольнике и заголовок Warning);
  • mtError (окно содержит белый косой крест в красном круге и заголовок Error);
  • mtInformation (окно содержит синюю букву «i» в белом круге и заголовок Information);
  • mtConfirmation (окно содержит синий знак «?» в белом круге и заголовок Confirmation);
  • mtCustom (окно не содержит картинки, в заголовке выводится название исполняемого файла приложения).

Параметр AButtons задает набор кнопок окна и может принимать любые комбинации следующих значений:

Для значения параметра AButtons имеются две константы — mbYesNoCancel и mbOKCancel, задающие предопределенные наборы кнопок:

  • mbYesNoCancel = [mbYes, mbNo, mbCancel];
  • mbOKCancel = [mbOK, mbCancel]

При нажатии любой из указанных кнопок (кроме кнопки Help) диалоговое окно закрывается, а результат (свойство ModalResult) возвращается функцией MessageDlg.

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

Пример использования функции MessageDlg:

При нажатии кнопки Button1 производится простейшая проверка даты. Код даты вводится в поле редактирования DateEdit1, размещенное в форме. Если длина даты меньше допустимой, выдается предупреждение с запросом на автоматическую коррекцию (см. скриншот). При утвердительном ответе пользователя в поле даты записывается текущая дата, при отрицательном — фокус передается полю ввода даты.

Функция MessageDlgPos

Функция MessageDlgPos(const Msg: String; AType: TMsgDlgType; AButtons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer) : Word отличается от функции MessageDlg наличием параметров Х и Y, управляющих положением окна на экране.

Функция InputBox

Функция InputBox(const ACaption, APrompt, ADefault: String): String отображает диалоговое окно для ввода строки текста. Окно выводится в центре экрана и содержит поле ввода с надписью, а также кнопки ОК и Cancel.

Параметр ACaption задает заголовок окна, а параметр APrompt содержит поясняющий текст к полю ввода. Параметр ADefault определяет строку, возвращаемую функцией при отказе пользователя от ввода информации (нажатие кнопки Cancel или клавиши ).

Пример использования функции InputBox:

Приведенная процедура отображает окно запроса на ввод фамилии пользователя (см. скриншот).

По умолчанию предлагается Иванов.

Функция InputQuery

Функция InputQuery (const ACaption, APrompt: String; var Value: String): Boolean отличается от функции InputBox тем, что вместо третьего параметра— строки по умолчанию— используется параметр Value, который в случае подтверждения ввода содержит введенную пользователем строку.

В качестве результата функция возвращает логическое значение, позволяющее определить, каким образом завершен диалог. Если нажата кнопка ОК, то функция возвращает значение True, если нажата кнопка Cancel или клавиша — значение False.

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

Кроме рассмотренных диалоговых окон, в Delphi имеется ряд других специализированных диалоговых окон, например диалоговое окно выбора каталога, вызываемое функцией Select Directory модуля FileCtrl.


В этом примере показывается модальное окно, и после этого переменной index присваивается значение ю. Так вот переменная index получит значение ю, но только после того, как модальное окно AboutForm закроется.

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

Теперь рассмотрим пример.

В этом случае создается немодальное окно, и выполнение кода не останавлива­ется на точке AboutForm. show в ожидании закрытия окна, а спокойно продолжается дальше. То есть будет показано дочернее окно и моментально переменной index будет присвоено значение 10.

Давайте создадим еще одну форму, как мы это уже делали при создании окна AboutForm. Сразу переименуем ее свойство Name в NonModaiForm. Можете что-нибудь написать на ней, например, установим одну кнопку, с помощью ко­торой можно будет закрыть это окно. Сохраните новую форму под именем NonModalUnit.pas.

Теперь вернемся в главную форму и допишем в раздел uses имя модуля NonModaiunit. После этого наша строка uses должна выглядеть так:

Если не хотите подключать эту форму вручную, то выберите из меню File (Файл) пункт Use Unit (Использовать модуль) и выберите в появившемся окне имя модуля для подключения.

Все. Модуль подключен. Теперь можно его использовать. Создадим обработчик события для пункта меню Сохранить и напишем в нем следующее:

Здесь мы отображаем форму NonModaiForm как немодальное окно. Это значит, что если вы запустите программу и выберете из меню пункт Сохранить, то увиди­те окно новой формы и сможете спокойно переключаться между главной формой и NonModaiForm без каких-либо проблем.

Впоследствии мы еще очень часто будем использовать оба типа окон и вы по­знакомитесь с их работой более подробно.


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

Диалоговое окно представляет собой не что иное, как специальную форму. Если вы хотите иметь диалоговое окно, размеры которого нельзя будет изменить, и которое не имеет пиктограммы в строке заголовка (рис. 12.20). вам достаточно будет присвоить свойству BorderStyle значение bsDialog.

Рис. 12.20. Диалоговое окно bsDialog


Чтобы создать диалоговое окно (такое, например, как диалоговое окно Project Options), размеры которого можно будет изменять, или которое будет иметь пиктограмму в строке заголовка, выполните следующие действия:

  1. Присвойте свойству biSystemMenu группы Borderlcons значение True.
  2. Присвойте свойству BorderStyle значение bsSizeable или bsSingle.
  3. При желании можете присвоить свойству Position значение poScreen-Center, чтобы расположить форму в центре экрана.

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

Теперь давайте создадим диалоговое окно, которое позволит пользователю изменять цвет главной формы. Добавьте компонент TLabel и два компонента TButton. и измените их примерно так. как показано на рис. 12.21.

Рис. 12.21. Простое диалоговое окно


Нам необходимо изменить свойство ModalResult кнопок ОК и Cancel. Присвойте свойству ModalResult кнопки ОК значение гглгОК, а свойству ModalResult кнопки Cancel — значение mrCancel. Свойство ModalResult позволяет сделать одновременно две вещи: закрыть диалоговое окно и уведомить вызывающий объект о том. что пользователь выбрал ОК. Cancel или что-то еще. Когда пользователь щелкает на кнопке с модифицированным свойством ModalResult. то значение этого свойства будет автоматически присвоено свойству ModalResult диалогового окна. Поэтому, чтобы узнать, на какой кнопке щелкнул пользователь, мы должны проверить свойство ModalResult диалогового окна.

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

Читайте также: