[CM]Jaxson |
Дата: Суббота, 13.10.2012, 18:40 | Сообщение # 1
|
٩(̾●̮̮̃̾•̃̾)۶
Сообщений: 801
Статус: Offline
|
Редкая программа обходится одной формой. Мы можем с лёгкостью создавать дополнительные формы Delphi, предоставляющие возможность, например, вести диалог с пользователем, принимать и выводить любую необходимую информацию. В этом уроке научимся создавать несколько форм Delphi дополнительно к основной.
Ввести новую форму в программу проще всего нажатием на кнопочку на главном окне Delphi. Также есть и соответствующая команда меню File -» New -» Form http://www.delphi-manual.ru/NewForm.JPG
орма создаётся вместе с новым модулем, описывающим её работу. Сразу же покажем, как удалить Форму из программы. Для этого также есть кнопочка, и команда меню Project -» Remove from project.... Так как Форма создаётся вместе с её модулем, то в появившемся окошке нужно выбрать модуль, который и будет удалён из проекта вместе с Формой: http://www.delphi-manual.ru/Remove1.JPG http://www.delphi-manual.ru/Remove2.JPG
Сразу возникает вопрос, а что будет, если попытаться удалить и модуль Unit1, что останется?. Выполните команду Project -» View Sourse. В редакторе кода появится новая вкладка, на которой будет отображён код Главного Окна программы (не Главной Формы, а именно Окна. В Windows ведь все объекты рассматриваются как окна.) Главное окно невидимо, но управляет всем проектом, и может работать вообще без Форм. Туда можно вставлять свой код, и писать нехилые программы, как в классическом Паскале.
Все новые формы автоматически заносятся в разряд автосоздаваемых, то есть в начале работы программы они будут автоматически создаваться сразу, одновременно с первой, главной Формой проекта. Нам не придётся этим заниматься в программе, но одновременное создание многих форм занимает ресурсы и время программы. Поэтому предлагаю сразу научиться создавать нужные формы только в нужный момент.
Во-первых, нужно отменить автосоздание форм. Выполните команду меню Project -» Options... В появившемся окошке отображаются Main form (главная Форма), Auto-create (автосоздаваемые) и Available (доступные) формы проекта. Нам нужно перевести Форму из разряда автосоздаваемых в разряд доступных Форм. Делается это нажатием кнопки " > " (обратная операция - нажатием кнопки " < "): http://www.delphi-manual.ru/Auto-create.JPG http://www.delphi-manual.ru/Available.JPG
Таким образом, главная Форма Form1 создаётся сама, а дополнительную форму Form2 мы создадим в программе при необходимости.
Если этого ничего мы не предприняли (что вполне допустимо при малом количестве дополнительных форм), то для появления новой Формы на экране достаточно написать:
Form2.Show; // в случае обычной Формы Form2.ShowModal; // в случае модальной Формы
Если же мы перевели дополнительные Формы в разряд доступных, то перед каждым вызовом такой Формы необходимо делать проверку на существование Формы (оператором Assigned) таким образом:
if (not Assigned(Form2)) then // проверка существования Формы (если нет, то Form2:=TForm2.Create(Self); // создание Формы) Form2.Show; // (или Form2.ShowModal) показ Формы
Теперь разберёмся в разнице между обычными и модальными Формами. Обычные Формы позволяют свободно переходить между всеми Формами, находящимися в данный момент на экране. Модальная Форма в момент вызова блокирует переход между Формами проекта до тех пор, пока не будет закрыта, и работа возможна только в ней.
При попытке компилирования программы, содержащей вызов второй формы, Delphi выдаст такой запрос: http://www.delphi-manual.ru/CreateForm2.JPG
означающий: Форма Form1 содержит вызов формы Form2, которая объявлена в модуле Unit2, но который отсутствует в списке используемых модулей. Вы хотите добавить его? Нужно разрешить, и в начале модуля перед директивой {$R *.dfm} будет добавлена фраза uses Unit2; В принципе, можно добавить её туда перед компиляцией "ручками", и тогда запроса не будет. Но смысл? Отвечаем "Yes" и снова жмём F9.
Первым делом введём в форму операцию её закрытия! Сделать это можно несколькими способами. Возьмём кнопку, напишем "Закрыть" и в обработчике OnClick напишем:
Form2.Close; // В принципе, достаточно просто Close;
Этот же оператор работает при вызове его из меню формы, если меню, конечно, туда ввести (компонент MainMenu на вкладке Standard), о чём в дальнейшем обязательно поговорим!
Теперь же необходимо рассмотреть способ закрытия Формы, который относится именно к модальным формам. Он используется диалоговыми окнами с вопросом, требующим подтверждения, и в других аналогичных случаях. На Форме нужно расположить несколько кнопок, нажатие которых предполагает соответствующий ответ: "Да", "Нет", "Отмена", и т.д. У каждой кнопки есть свойство ModalResult, среди значений которой mrYes, mrNo, mrCansel и другие (посмотрите!). Значение ModalResult выбранной кнопки передаётся свойству ModalResult Формы. Это свойство отсутствует в списке свойств Формы, которые можно увидеть в Инспекторе Объектов, но программно оно доступно (напишите " Form2 ", поставьте точку и поищите в появившемся списке!). Нажатие кнопки со значением свойства ModalResult, отличного от mrNone, приводит к закрытию Формы, даже если у кнопки отсутствует обработчик нажатия! Затем можно проанализировать свойство ModalResult Формы и выяснить, какой же ответ на поставленный вопрос дал пользователь:
procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; if Form2.ModalResult=mrYes then // Этот оператор будет доступен только после закрытия Form2 Form1.Caption:='Пользователь ответил положительно!'; end;
Как видно из этого примера, для доступа из одной Формы как к свойствам другой Формы, так и к свойствам её компонентов необходимо указывать имя Формы, к которой мы обращаемся. Мы также имеем доступ к данным, использующимся в модуле, описывающим её работу. Для этого необходимо указывать уже имя модуля. Например, для обращения к переменной X из модуля Unit2 пишем так: Unit2.X. Имеющейся возможности укрыть данные от использования в других модулях касаться пока не будем.
В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда CanClose:=True; Например, если создать такой обработчик OnCloseQuery основной Формы программы:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end;
то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows!
[ Skype ] [ Профиль ] [ Mods Pack ] [ VK ] [ Геймеры ] Помогаю новичкам, по всем вопросом комне в Skype/VK. VK ВЗЛОМАН, НЕ РАБОТАЙТЕ СОМНОЙ. МНЕ ВСЁ ВЗЛОМАЛИ СКАЙП И ВК. СКАЙП ВОССТОНОВИЛ.
|
|
|
|
Sedance |
Дата: Суббота, 20.07.2013, 19:26 | Сообщение # 2
|
Боец
Сообщений: 69
Статус: Offline
|
Ты Автор?
Код procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; тут ошибка
Приму в дар аккаунты на Samp-Rp 3+ Собейт в разработке.
СКАЙП ZLO.AC взломан не ведитесь на кидалово.
Сообщение отредактировал Sedance - Суббота, 20.07.2013, 19:27 |
|
|
|