Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

Пользователей: 13,368
новичок: Goosprin
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Компьютерный магазин на Turbo Pascal (База данных) + Пояснительная записка
Моделирование работы аэропорта на GPSS + Пояснительная записка
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка

Модальные формы
Помимо главной формы любое приложение Windows может содержать и другие формы, одной из которых является модальная форма.
Открытие форм как модальных используется в большинстве диалоговых окон. Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму. Модальная форма не позволяет также пользователю переключить фокус курсором мыши на другие формы данного приложения, пока форма не будет закрыта. Пользователь должен выполнить предложенные ему действия прежде, чем продолжить работу.
Модальной может быть сделана любая форма, если она делается видимой методом ShowModal. Если та же самая форма делается видимой методом Show, то она не будет модальной.
Методы Show и ShowModal можно применять только к невидимой в данный момент форме. Если нет уверенности, что форма в данный момент видима, то прежде чем применять эти методы, следует проверить свойство Visible формы. Например:
if (not Form2.Visible) then Form2.ShowModal;



При выполнении методов Show или ShowModal возникает событие формы onShow. Это событие возникает до того момента, как форма действительно станет видимой. Поэтому обработку события onShow можно использовать для настройки каких-либо компонентов открываемой формы. При этом в настройке можно использовать какую-то оперативную информацию, возникающую в процессе выполнения приложения.
Методом Hide форму в любой момент можно сделать невидимой. В этот момент в ней возникает событие onHide.
Необходимо помнить, что для выполнения методов CreateForm, Show, ShowModal, Hide и вообще для обмена любой информацией между формами модули соответствующих форм должны использовать друг друга. Например, если форма в модуле Unit1 должна управлять формой в модуле Unit2, то в оператор uses модуля Unit1 должно быть включено имя второго модуля Unit2. А если к тому же форма в модуле Unit2 должна пользова¬ться какой-то информацией, содержащейся в модуле Unit1, то в оператор uses модуля Unit2 должно быть включено имя первого модуля Unit1. В этом случае, если операторы uses в обоих модулях расположены в разделах interface, возникнут проблемы с недопустимыми круговыми ссылками и компилятор выдаст соответствующую ошибку. От недопустимых круговых ссылок можно избавиться, если разомкнуть их, поместив один или оба оператора uses в раздел implementation. Можно также не включать имена модулей приложения в операторы uses вручную, а использовать команду File | Use Unit, которая автоматизирует этот процесс и гарантирует отсутствие круговых ссылок.
Закрыть форму можно методом Close. При этом в закрывающейся форме возникает последовательность событий, которые можно обрабатывать. Их назначение — проверить возможность закрытия формы и указать, что именно подразумевается под закрытием формы. Проверка возможности закрытия формы необходима, например, для того, чтобы проанализировать, сохранил ли пользователь документ, с которым он работал в данной форме и который изменял. Если не сохранил, приложение должно спросить его о необходимости сохранения и, в зависимости от ответа пользователя, сохранить документ, закрыть приложение без сохранения или вообще отменить закрытие.
Поведение модальной формы определяется ее основным свойством ModalResult. Это свойство доступно только во время выполнения приложения. При открытии формы методом ShowModal сначала значение свойства ModalResult равно нулю. Как только при обработке каких-то событий на форме свойству ModalResult будет присвоено положительное значение от 1 до 8, модальная форма закроется. При этом значение ее свойства ModalResult можно будет прочитать как результат, возвращаемый методом ShowModal. Таким образом, программа, вызвавшая модальную форму, может узнать, что сделал пользователь, работая с этой формой, например, по какой кнопке он щелкнул. Требуемые значения ModalResult можно задавать в обработчиках соответствующих событий в компонентах модальной формы.
Во многих больших приложениях Windows при их запуске сначала на экране появляется форма-заставка, содержащая логотип приложения и сведения о программе и ее разработчиках. Назначение этой формы чаще всего заключается в том, чтобы обеспечить начальную загрузку и настройку программы. Тогда эта форма должна закрываться не раньше, чем закончатся эти операции. Но иногда эта форма носит чисто информационный характер. В этих случаях желательно, чтобы она немедленно закрывалась при любых действиях пользователя и даже закрывалась через какое-то время без каких-либо действий со стороны пользователя.
Помимо формы-заставки нередко в приложениях, особенно в тех, которые работают с базами данных, в начале работы приложения появляется форма с запросом пароля. При неверном пароле приложение закрывается, не позволяя пользователю работать с ним.
Формы-заставки и формы запроса пароля могут быть реализованы множеством различных способов. Один из них состоит в использовании модальных форм.
Рассмотрим последовательность действий при создании модальной формы-заставки.
1. Откройте в Delphi новое приложение (File | New Application). Пусть открывшаяся форма будет главной в приложении (вместо такой пустой формы можно взять любое разработанное ранее приложение и добавлять форму-заставку и форму запроса пароля в него). Назовите для определенности главную форму приложения FMain.
2. Добавьте в приложение новую форму (File | New Form). Пусть это будет форма-заставка с именем FL. Ее свойство BorderStyle надо сделать равным bsNone, чтобы в окне этой формы отсутствовала полоса заголовка. Можно поместить на форме какой-то рисунок (разместить компонент Image и вставить в его свойстве Picture желаемое изображение), различные надписи и т.п. В простейшем случае можно поместить в центре формы метку Label и сопроводить ее каким-либо текстом. Размер формы-заставки целесообразно задать небольшим, меньшим, чем обычные окна приложения. Свойство Position следует сделать равным poScreenCenter, чтобы форма появлялась в центре экрана.
3. Напишите обработчики событий, которые при любом действии пользователя закрывали бы форму FL. Щелкните на форме, чтобы в Инспекторе Объектов открылись относящиеся к ней страницы (если форма накрыта панелями или рисунками, то, щелкнув на них, нажимайте клавишу Esc до тех пор, пока в Инспекторе Объектов не откроются страницы, относящиеся к форме). Перейдите в Инспекторе Объектов на страницы событий, выберите событие onKeyDown и напишите для него обработчик, состоящий из одного оператора — Close. Аналогичный обработчик напишите для события onMouseDown. Если на форме имеются метки, компоненты Image и др., то выделите их все, задайте в событии onMouseDown ссылку на тот же обработчик, что и для формы, а в форме поставьте свойство KeyPreview в true, чтобы форма перехватывала все связанные с нажатием клавиш события компонентов.
Теперь форма будет закрываться при нажатии пользователем любой клавиши или кнопки мыши.
4. Можно сделать так, чтобы и при отсутствии каких-то действий со стороны пользователя форма закрывалась сама, через заданный интервал времени, например 5 секунд.
С этой целью добавьте на форму компонент Timer со страницы System. Это невизуальный компонент, который может отсчитывать интервалы времени. Интервал задается в свойстве компонента Interval в миллисекундах. Задайте его равным 5000. Единственное событие таймера — OnTimer, наступающее по истечении заданного интервала времени. Напишите в обработчике этого события все тот же единственный оператор Close.
Теперь при любом действии и даже бездействии пользователя форма-заставка будет закрываться. По умолчанию это означает сделать ее невидимой. Однако форма-заставка не нужна после того, как она будет предъявлена пользователю в начальный момент выполнения приложения. Хранить все время в памяти эту уже ненужную форму не имеет смысла. Поэтому в форме надо предусмотреть, чтобы закрытие формы означало бы ее удаление из памяти и одновременное освобождение памяти. Для этого в событие формы-заставки OnClose вставьте оператор:
Action:=caFree;



Этот оператор приводит к уничтожению объекта формы и освобождению занимаемой формой памяти.
5. Проверьте, имеет ли ее свойство Visible значение false. Это важно, поскольку только невидимую форму можно открыть методом ShowModal. В главной форме свойство Visible тоже должно иметь значение false. Сохраните проект, дав файлу модуля главной формы имя Umain, а файлу модуля формы-заставки имя FLog.
6. Чтобы сослаться в модуле Umain на модуль Flog, добавьте в оператор uses модуля Umain имя модуля FLog, или напишите оператор uses FLog в разделе implementation модуля Umain, или сделайте то же самое путем, выполнения команды File | Use Unit.
7. Напишите в модуле Umain обработчик события формы OnShow, состоящий из одного оператора:
FL.ShowModal;



Событие OnShow наступает до того, как форма действительно станет видимой. Поэтому во время обработки этого события главная форма приложения еще не видна. Оператор открывает форму FL как модальную, передает ей управление, и дальнейшее выполнение программы в модуле Umain останавливается до тех пор, пока модальная форма не будет закрыта. После закрытия модальной формы выполнение программы продолжится и главная форма станет видимой.
8. Сохраните проект, запустите приложение и проверьте его работу.
Рассмотрим процедуру разработки формы запроса пароля. Реальная форма такого типа должна предлагать пользователю ввести свое имя и пароль, сравнивать введенные значения с образцами, хранящимися где-то в системе, при неправильном пароле давать возможность пользователю поправиться. Если пользователь так и не может ввести правильный пароль, форма должна закрыть приложение, не допустив к нему пользователя. При правильном пароле после закрытия формы запроса должна открыться главная форма приложения.
Рассмотрим простой случай использования пароля, который непосредственно указывается в соответствующем операторе программы. При этом возможность исправления введенного пароля пользователю предоставляться не будет.
9. Добавьте к приложению новую форму. Назовите ее FPSW и сохраните ее модуль в файле с именем UPSW. Уменьшите размер формы до разумных пределов, поскольку она будет содержать всего одно окно редактирования. Установите свойство формы BorderStyle равным bsDialog, свойство Position - равным poScreenCenter. В свойстве Caption напишите «Введите пароль и нажмите Enter». Эта надпись будет служить приглашением пользователю.
10. Поместите в центре формы окно редактирования Edit, в котором пользователь будет вводить пароль. Очистите его свойство Text. В обработчике события OnKeyDown этого компонента запишите оператор:
if (key = VK_RETURN) then
begin
if FPSW.Edit1.Text = ‘aa’
then ModalResult := 6 else Close;
end;



Этот оператор выполняет следующее. Прежде всего, он анализирует нажатую клавишу. Если нажата клавиша Enter, то введенный текст сличается с паролем. В данном случае для упрощения непосредственно указан правильный пароль — символы 'аа'. Если введен правильный пароль, то свойству ModalResult присваивается некоторое условное число — 6 (можно было бы выбрать и любое другое допустимое число, кроме 0 и 2). Если пароль неправильный, то выполняется метод Close. В обоих случаях форма закрывается, так как задание отличного от нуля положительного значения ModalResult равносильно закрытию формы. Но при правильном пароле значение ModalResult будет равно 6, а при неправильном — 2. Это значение получается при выполнении метода Close или если пользователь нажмет кнопку системного меню в полосе заголовка окна.
11. Модуль главной формы Umain нужно дополнить операторами, показывающими пользователю форму пароля и анализирующими ответ ползователя. Для этого в модуле Umain в оператор uses нужно добавить ссылку на модуль UPSW, а в обработчике события OnShow после ранее введенного оператора FL.ShowModal добавить оператор:
if (FPSW.ShowModal <> 6) then Close else
begin
ShowMessage('Ваш пароль '’'+FPSW.Edit1.Text+'''');
FPSW.Free;
end;



Этот оператор анализирует значение свойства ModalResult формы запроса пароля. Значение этого свойства возвращает функция FPSW.ShowModal. Если результат не равен 6, то был введен неправильный пароль. Тогда главная форма, а с ней вместе и приложение закрываются методом Close. При правильном пароле можно продолжать работу приложения. Оператор ShowMessage введен для того, чтобы показать, как можно использовать свойство другой формы — в данном случае текст, введенный пользователем в качестве пароля. В реальном приложении по этому паролю можно было бы определить уровень доступа пользователя к конфиденциальной информации. Затем следует уничтожение формы запроса пароля методом Free. Это необходимо сделать, чтобы освободить память. Сама по себе эта форма в момент ее закрытия не уничтожается, поскольку по умолчанию закрыть форму — значит сделать ее невидимой. Уничтожать форму до этого момента было нельзя, так как при этом уничтожилась бы содержащаяся в ней информация — введенный пароль.
Описанный выше способ управления формой запроса пароля не является единственным. Он просто призван был показать, как можно обрабатывать величину ModalResult, возвращаемую методом ShowModal.
Опубликовал Kest December 22 2009 22:46:36 · 6 Комментариев · 20866 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Maximus May 13 2010 09:31:06
Очень кстати попалась мне на глаза эта статья. Спасибо за инфу про ModalResult.
подслеповатая бабуля December 23 2011 16:39:46
Статья можь и хорошая, но зачем же ты, сыночек, такой цвет и размер для текста выбрал?smiley
Dudergoff January 05 2012 21:44:56
Очень кстати пришлось. "Ликбез" по данной теме у себя ликвидировал.smiley
Dastan May 06 2012 15:02:27
Я нашел внутри статьи многие методы обращения к формам и их обработки. Хорошие идеи есть тут. Спасибо вам огромное.

ShowMessage('Ваш пароль '’'+FPSW.Edit1.Text+''''smiley;
Action:=caFree;


Айка November 15 2018 16:40:24
А что значит 6? почему именно 6?
Гость October 22 2021 15:29:48
Размер шрифта выбран по дебильному, мельче наверное не было... Читай сам такое.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Degisy Data Acces...
CodeGear RAD Stud...
Моделирование дви...
Pro-Download Sys...
Proeffectimage
PDA версия сайта
Работа с картотеками
PDJXPPack
GamesBase 3.0
Assistant
Паскаль и Дельфи....
Delphi World 6.0
Задача о 8ми ладьях
Программа предназ...
Дешифратор содерж...
Prolog Interprete...
База игр
Добавление к ссы...
WordReport
Измерение тактово...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97833
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Интерфейс подпроце...
Invalid FOR contro...
Бинарный поиск и п...
Яндекс учитывает с...
Основные функции ш...
Передача сообщений...
ВВЕДЕНИЕ. МЕСТО ИМ...
Инфраструктура моб...
Поиск в Рамблере
Язык С: алгоритмы ...
Прямой городской н...
Тогда мы придем к ...
Время выполнения S...
Структурные коммен...
Фреш казино
Логотип Матрикс
Чтобы сократить не...
3. Приведенный ниж...
Точная арифметика
АМ-MSK модулятор
Построение концепт...
Продолжительность ...
Интерфейсы и IDL
Тестирование
Игры. Игровые слот...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?