Delphi как сделать всплывающее окно

Обновлено: 14.05.2024

Да, приложение наше будет состоять из двух форм, одна главная TMainForm, и как говорилось форма всплывающего окна TPopupForm. Для хранения аватаров пользователей заведем на главной форме TImageList, в который добавим некоторый набор картинок. Список же пользователей будем хранить в экземпляре uList : TStringList (глобальная переменная), который непосредственно заполним при создании главной формы:

Для описания события определим структуру TPopupInfo, которая будет хранить следующую информацию: время возникновения, тип события (TEventType), некоторый идентификатор действия, текстовое описание события, имя пользователя, и иконка пользователя.

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

При регистрации нового окна в нашем классе, будем передавать его обработчик, добавлять его в список, после чего вызывать процедуру реорганизации. После закрытия окна, передав handle окна в процедуру, будем удалять окно из списка, и опять перестраивать окна.

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

Для управления нашими цветами окон и другими свойствами разместим на главной форме переключатель TypeCombo (TComboBox) для выбора настраиваемого окна, TButtonColor для выбора цвета окна, пару TEdit и TUpDown для настройки времени отображения и прозрачности. Используя данные элементы управления будем изменять соответствующие свойства в TPopupConfig.

Расширим процедуру создания главной формы, и помимо заполнения списка "контактов", создами наш класс настройки (глобальная переменная), а также заполним наш typeCombo и выполним сопутствующие действия

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

Какие действия следует выполнить в конструкторе: 1. вызвать родительский конструктор. 2. настроить цвет, прозрачность и время жизни, получив их у popupConfig 3. заполнить данные в Label'ах и установить иконку 4. зарегистрировать наше окно в popupConfig 5. запустить таймер времени жизни 6. очистить память которую занимала полученная структура TPopupInfo

При срабатывании таймера следует закрыть окно

В результате чего будет вызван обработчик события OnDestory в котором мы плавно скроем окно, и разрегистриурем его в нашем popupConfig'е

вот собственно и все. Кстати свойство visible формы установлено в false, а также в событие onClick можно также указать обработчик popupTimerTimer для закрытия окна по клику. Вот кажется и описал все что касатеся созданных всплывающих окон. На самом деле у данной реализации есть один недостаток, при подобной реализации затухания окна при закрытии, а именно использовании функции sleep, засыпает основной поток, т.е главная форма программы также перестает реагировать. Т.е необходимо чтобы вслывающие окна запускались в новом потоке. Напоследок, как обычно рисунок

Модальной называется форма, которая должна быть закрыта перед обращением к любой другой форме данного приложения. Если пользователь пытается перейти в другую форму, не закрыв текущую модальную форму, 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.

В Delphi 7 есть одиннадцать компонентов, находящихся на странице Dialogs Палитры компонентов (см. скриншот) и реализующих диалоговые окна общего назначения.


Эти диалоговые окна используются многими Windows-приложениями для выполнения таких операций, как открытие, сохранение и печать файлов, поэтому их часто называют стандартными. Например, текстовый процессор Microsoft Word использует большинство из перечисленных далее диалоговых окон. Более того, поскольку стандартные диалоговые окна определяются средой Windows, и мы пользуемся локализованной версией этой операционной системы, диалоговые окна оказываются русифицированными, несмотря на то что сама среда Delphi не локализована.

На странице Dialogs Палитры компонентов содержатся следующие компоненты, реализующие стандартные диалоговые окна:

  • openDialog (выбор открываемого файла);
  • saveDialog (выбор сохраняемого файла);
  • openPictureDialog (выбор открываемого графического файла);
  • savePictureDialog (выбор сохраняемого графического файла);
  • FontDialog (настройка параметров шрифта);
  • ColorDialog (выбор цвета);
  • PrintDialog (вывод на принтер);
  • PrinterSetupDialog (выбор принтера и настройка его параметров);
  • FindDialog (ввод строки текста для поиска);
  • ReplaceDialog (ввод строк текста для поиска и для замены);
  • PageSetupDialog (установка параметров страницы).

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

Метод Execute

Для вызова любого стандартного диалогового окна используется метод Execute — функция, возвращающая логическое значение. При закрытии диалога кнопкой ОК (либо Open или Save) функция Execute возвращает значение True, а при отмене диалога — значение False.

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

После закрытия стандартного диалогового окна оно возвращает через свои свойства значения, выбранные или установленные в процессе диалога. Например, при открытии файла возвращаемым значением является имя открываемого файла (OpenDialog1.FileName), а при выборе цвета—новый цвет (ColorDialog1.Color).

Возвращаясь к теме плавного закрытия окна (т.н. затухания) на примере варианта реализации всплывающих окон из прошлого примера, рассмотрим несколько способов реализовать эффект затухания. Итак суть проблемы такова, при появлении некоторого события в приложении, возникает всплывающее окно подсказка, реализованное в виде обычной формы TPopupForm = class (TForm). Возникающее событие может иметь несколько типов, например, ошибка или оповещение, и в зависимости от типа события, всплывающее окно может иметь собственные настройки отображения, к каковым относятся цвет, прозрачность, и время отображения. Для хранения настроек окон по типам события был предусмотрен класс TPopupConfig. При возникновении события создавалось окно, которое по истечении указанного в popupConfig времени закрывалось. Для более эффектного закрытия окна был реализован метод "затухания", вариации которого мы рассмотрим сейчас. При любой реализации метода затухания используется свойство AlphaBlendValue класса TForm. которое уменьшается до значения равного нулю, после чего форма закрывается. Вариант №1, изначально приведенный в прошлом примере, имел один существенный недостаток.

При срабатывании таймера закрытия (popupTimer) вызывался метод destroy формы, который в свою очередь вызывал событие onDestroy, в котором непосредственно реализовано затухание, приведенное выше. Поскольку форма всплывающего окна выполняется в главном потоке приложения, то использование функции sleep() приостанавливает также главный поток, что неприемлемо, поскольку также "замораживает" и главную форму приложения. рассмотрим вариант реализации №2. на форму всплывающего окна добавим таймер fadeTimer:TTimer, имеющий интервал 5ms, с изначальным значением enabled = false. При срабатывании таймера закрытия окна, таймер затухания приводится в активное состояние.

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

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

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