как добавить форму в делфи

Как добавить форму в делфи

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

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

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

Если же мы перевели дополнительные Формы в разряд доступных, то перед каждым вызовом такой Формы необходимо делать проверку на существование Формы (оператором Assigned) таким образом:

if (not Assigned(Form2)) then // проверка существования Формы (если нет, то
Form2:=TForm2.Create(Self); // создание Формы)
Form2.Show; // (или Form2.ShowModal) показ Формы

Теперь разберёмся в разнице между обычными и модальными Формами. Обычные Формы позволяют свободно переходить между всеми Формами, находящимися в данный момент на экране. Модальная Форма в момент вызова блокирует переход между Формами проекта до тех пор, пока не будет закрыта, и работа возможна только в ней.

При попытке компилирования программы, содержащей вызов второй формы, Delphi выдаст такой запрос:

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи
означающий:
Форма 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;

В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда
CanClose:=True;
Например, если создать такой обработчик OnCloseQuery основной Формы программы:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;

то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows!

Источник

Unit delphi

Delphi 7. Занятие 2_5. Часть 1.

Подключения стандартного модуля — delphi unit uses

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

Например, преобразование целого числа в строку символов — функция «IntToStr()».

Код этой функции находится в модуле SysUtils, указанном в предложении uses.

unit Unit1;
interface
uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Buttons, ExtCtrls;

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

К счастью, имеется модуль «JPEG», подключение которого решает проблему:

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Menus, StdCtrls, Buttons, ExtCtrls, JPEG;

Для просмотра «.png» картинок надо скачать в интернете модуль TPNGImage и подключить его наподобие модуля JPEG.

Интерфейс главной формы проекта.

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

Разместим на ней все необходимые нам компоненты:

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

Во первых, это главное меню «TmainMemu». Далее, это панель, на которой расположим компонент «Tmemo». В нём будет размещено краткое справочное описание разрабатываемой нами программы.

Дополнительно используем две кнопки «BitBtn». Воспользуемся свойством «Kind» этого компонента. Для кнопки, расположенной на панели, установим значение «bkOK». Для второй установим «bkClose». Кнопка такого вида будет закрывать форму автоматически при её нажатии.

Сделаем так, чтобы панель «Panel1»не была видима при запуске программы. Для этого в инспекторе объектов установим свойство панели «Visible» в «false».

Если пользователь захочет посмотреть краткое описание программы, он должен выбрать пункт меню «О программе».

Main menu delphi

Создание главного меню формы.

Разместим на «Form1» компонент главное меню (MainMenu).

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

Для создания пунктов меню необходимо вызвать редактор, дважды щёлкнув по компоненту MainMenu1 или выбрать пункт «Items …» в окне ObjeсtInspector.

В открывшемся окне щелкаем по прямоугольнику и он окрашивается в голубой цвет:

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

В инспекторе объектов заполняем свойство «Caption» значением «Перейти» и нажимаем «Enter». Поле заполнится введённым значением.

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

Далее выделяем прямоугольник, расположенный справа и в «Caption» в инспекторе объектов вводим значением «О программе».

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

Появляется пункт подменю:

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

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

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

Здесь приведём обработчики обработчики «кликов» по пунктам меню.

Обработчики пунктов меню.

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

Обработчики задаём для пунктов подменю.

Для пункта «ко второй форме»:

procedure TForm1.N3Click(Sender: TObject);

form2.Show;

Обработчик второго пункта меню «завершить программу»:

procedure TForm1.N4Click(Sender: TObject);

close; //процедура завершения программы.

Второй пункт главного меню «о программе»

procedure TForm1.N5Click(Sender: TObject);

self.Panel1.Visible:=true; //панель становится видимой.

Обработчик «клика» кнопки «ok»:

procedure TForm1.BitBtn1Click(Sender: TObject);

self.Panel1.Visible:=false; // делаем панель снова невидимой.

обработчик события для кнопки «Close» писать не надо. При выборе такого типа кнопки её срабатывание происходит автоматически и программа будет закрыта.

Создание второй, третьей и так далее форм и модулей.

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

Создадим вторую форму. Для этого в пункте главного меню IDE выберем пункт «File» и в нём пункт «New» и далее в открывающемся подменю пункт «Form».

Будет создана вторая форма с именем «Form2» и соответствующий ей модуль «Unit2».

Но модуль не обязательно должен быть привязан к форме. Создадим самостоятельный модуль «Unit3». Для этого опять воспользуемся главным меню «File» > «New» > «Unit».

Связь модулей между собой.

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

Но попытка компиляции выдаст ошибку, так как в модуле «Unit1» ничего не известно о существовании «Unit2».

Аналогично добавляется ссылка на модуль «Unit3».

Предложение будет добавлено в секцию «implementation», а не в главное предложение «Uses» в секции «Interface» в связи со следующими соображениями.

Circular unit reference delphi — перекрёстные ссылки.

Существует проблема перекрёстных ссылок на модули.

Предположим, в модуле 2 есть данные, которые используются для работы процедур, расположенных в модуле 1.

Тогда в модуле 1 в предложении uses надо сделать ссылку на модуль 2. В принципе, это можно сделать в uses, расположенном в секции interface.

Всё будет нормально, пока не потребуется получить из модуля 2 доступ к данным, расположенным в модуле 1. Если сделать ссылку на модуль 1 в секции interface модуля 2, то в силу особенностей компилятора он выдаст ошибку «о недопустимости перекрёстных ссылок».

Решение этой проблемы весьма тривиально. Необходимо размещать ссылки на модули в секции implementation, что и происходит автоматически при использовании команды главного меню «File» > «Use Unit …».

Источник

Как добавить форму в делфи

Создание форм. Методы. События.

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

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

Главная форма отличается от других тем, что

1) именно этой форме передается управление в начале выполнения приложения;

2) закрытие пользователем главной формы означает завершение выполнения приложения;

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

Главной можно сделать любую форму из имеющихся в проекте.

Для этого следует в окне опций проекта ( Project | Options) на странице Forms в выпадающем списке Main forms выбрать необходимую форму.

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

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

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

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

Код будет примерно следующим:

Модальная форма приостанавливает выполнение вызвавшей ее процедуры до тех пор, пока пользователь не закроет эту форму.

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

Таким образом можно узнать, на каой кнопке щелкнул пользователь.

Методы Show и ShowModal можно применять только к невидимой в данный момент форме.

В случае сомнения следует проверить свойство Visible формы. Например,

if (not Form2.Visible) then Form2.ShowModal;

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

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

Если CanClose = True (установлено по умолчанию), то закрытие продолжается.

Если из ответа пользователя на запрос о закрытии формы следует, что закрывать не надо, следует выполнить присваивание CanClose := False ;

(по умолчанию для форм, не являющимися главными и дочерними в MDI ).

Вся хранящаяся в форме информация сохраняется.

Вся хранящаяся в форме информация сохраняется

К внешнему виду окон в Windows предъявляются определенные требования.

Delphi автоматически обеспечивает стандартный для Windows вид окон приложения.

Но разработчику необходимо продумать и установить многие характеристики окон.

Все характеристики окон обеспечиваются установкой и управлением свойствами формы.

Свойство BorderStyle определяет общий вид окна и операции с ним, которые разрешается выполнять пользователю. Это свой­ство может принимать следующие значения:

bsSizeabIe (по умолчанию) Обычный вид окна Windows с полосой заголовка, с возможностью для пользователя изменять размеры окна с помощью кнопок в полосе заголовка или с по­мощью мыши, потянув за какой-либо край окна.

bsDialog Неизменяемое по размерам окно. Типичное окно диалогов

bsSingle Окно, размер которого пользователь не может изме­нить, потянув курсором мыши край окна, но может менять кнопками в полосе заголовка

bsToolWindow To же, что bsSingle, но с полосой заголовка меньше­го размера

bsSizeToolWin To же, что bsSizeabIe, но с полосой заголовка мень­шего размера и с отсутствием в ней кнопок измене­ния размера

bsNone Без полосы заголовка. Окно не только не допускает изменения размера, но и не позволяет переместить его по экрану

Свойство Borderlcons определяет набор кнопок, которые име­ются в полосе заголовка. Множество кнопок задается элемента­ми:

bySistemMenu кнопка системного меню (для Windows 95/98 и NT это кнопка с крестиком, закрывающая окно)

by Minimize кнопка Свернуть, сворачивает окно до пиктограммы byMaximize кнопка Развернуть, разворачивает окно на весь экран

byHelp кнопка справки

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

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

Для основного окна приложения с неизменяемыми размерами наиболее подходящий стиль — BorderStyle = bsSingle с исключением из числа доступных кнопок кнопки Развернуть (Borderlcons.byMaximize = false). Это позволит пользователю сворачивать окно, восстанавливать, но не даст возможности развернуть окно на весь экран или изменить размер окна.

Для вторичных диалоговых окон наиболее подходящий стиль — BorderStyle = bsDialog. Можно также использовать BorderStyle = bsSingle, одновременно исключая из числа доступных кнопок кнопку Развернуть (задавая Borderlcons.byMaximize = false). Это позволит пользователю сворачивать диалоговое окно, если оно заслоняет на экране что-то нужное ему, восстанавливать окно, но не даст возможности развернуть окно на весь экран или изменить размер окна.

Избегайте, кок правило, стиля BorderStyle = bsNone. Невозможность переместить окно может создать пользователю трудности, если окно заслонит на экране что-то интересующее пользователя.

Свойство формы WindowState определяет вид, в котором окно первоначально предъявляется пользователю при выполнении приложения. Оно может принимать значения:

wsNormal нормальный вид окна (используется по умолчанию)

wsMinimized окно свернуто

wsMaximized окно развернуто на весь экран

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

poScreenCenter Окно располагается в центре экрана. Размер окна тот, который был спроектирован. В мультиэкранных приложениях, работающих одновременно с множеством мониторов (только начиная с Delphi 4) эта центральная позиция мо­жет быть несколько изменена, чтобы изображе­ние попало точно на один монитор, определяе­мый свойством DefaultMonitor

poDeskt о pCenter (предусмотрено начиная с Delphi 4) Окно располагается в центре экрана. Размер окна тот, который был спроектирован. Этот режим не приспосабливается к приложени­ям с множеством мониторов.

poDefault Местоположение и размер окна определяет Windows, учитывая размер и разрешение экрана. При последовательных показах окна его положение сдвигается немного вниз и вправо

poDefaultPosOnly Местоположение окна определяет Windows. При последовательных показах окна его положение сдвигается немного вниз и вправо. Размер окна — спроектированный

poDefanltSizeOnly Размер окна определяет Windows, учитывая раз­мер и разрешение экрана.

Положение окна — спроектированное

poMainFormCenter (предусмотрено начиная с Delphi 5)

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

Обычно целесообразно для главной формы приложения задавать значение Position равным poScreenCenter или poDetault. И только в сравнительно редких случаях, когда на экране при выполнении приложения должно определенным образом располагаться несколько окон, имеет смысл оставлять значение poDesigned, принимаемое по умолчанию.

Если выбранное значение свойства Position предусматривает выбор размера формы самим Windows по умолчанию, то на этот выбор влияют свойства PixelsPerInch и Scaled. По умолчанию первое из них задается равным количеству пикселей на дюйм в системе, второе установлено в false. Если задать другое число пикселей на дюйм, то свойство Scaled автоматически становится равным true. В этом случае при запуске приложения размер фор­мы будет изменяться в соответствии с пересчетом заданного числа пикселей на дюйм к реальному числу пикселей на дюйм в системе (но только при разрешающем это значении свойства Position).

Свойство AutoScroll определяет, будут ли на форме в процессе выполнения появляться автоматически полосы прокрутки в случае, если при выбранном пользователем размере окна не все ком­поненты помещаются в нем. Если значение AuntoScr о ll равно true, то будут. В противном случае при уменьшении размера окна пользователь теряет доступ к компонентам, не поместив­шимся в его поле.

fsNormal Окно обычного приложения. Это значение FormStyle принято по умолчанию

fsMDIForm Родительская форма приложения MDI, т.е. приложе­ния с дочерними окнами, используемого при работе с несколькими документами одновременно

fsMDIChild Дочерняя форма приложения MDI

Используйте стиль FormStyle — tsStayOnTop для отображения окон сообщений пользователю о каких-то аварийных ситуациях.

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

MStayOnTop.Checked := not MStayOnTop.Checked;

then Formi.FormStyle := fsStayOnTop

В этом коде подразумевается, что объект раздела меню, о ко­тором идет речь, назван MStayOnTop. Тогда при выборе пользо­вателем этого раздела меню в нем появится индикатор, а окно приобретет статус расположенного всегда поверх остальных. При повторном выборе этого раздела индикатор (птичка) ис­чезнет и окно приобретет обычный статус.

Источник

Как добавить форму в делфи

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

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи

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

Если же мы перевели дополнительные Формы в разряд доступных, то перед каждым вызовом такой Формы необходимо делать проверку на существование Формы (оператором Assigned) таким образом:

if (not Assigned(Form2)) then // проверка существования Формы (если нет, то
Form2:=TForm2.Create(Self); // создание Формы)
Form2.Show; // (или Form2.ShowModal) показ Формы

Теперь разберёмся в разнице между обычными и модальными Формами. Обычные Формы позволяют свободно переходить между всеми Формами, находящимися в данный момент на экране. Модальная Форма в момент вызова блокирует переход между Формами проекта до тех пор, пока не будет закрыта, и работа возможна только в ней.

При попытке компилирования программы, содержащей вызов второй формы, Delphi выдаст такой запрос:

как добавить форму в делфи. Смотреть фото как добавить форму в делфи. Смотреть картинку как добавить форму в делфи. Картинка про как добавить форму в делфи. Фото как добавить форму в делфи
означающий:
Форма 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;

В момент закрытия Формы часто в программе необходимо выполнить определённые операции. Делается это в обработчике события OnClose Формы. А теперь рассмотрим блокировку закрытия Формы. Если вдруг понадобится заставить пользователя выполнить определённые действия перед закрытием Формы (это касается как дополнительных форм, так и основной Формы программы), нужно воспользоваться обработчиком события OnCloseQuery. В этом обработчике определена переменная логического типа CanClose. Форма будет закрыта только в том случае, когда
CanClose:=True;
Например, если создать такой обработчик OnCloseQuery основной Формы программы:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=False;
end;

то пользователь просто не сможет закрыть программу иначе как через Диспетчер задач Windows!

Работа с файлами в Delphi В начало урока Создание подпрограмм в Delphi

Потом, для того, чтобы работать с дополнительной формой я пишу form2.show;

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

Form2:=TForm2.Create(Self);
(кстати, я довольствуюсь одной это строкой, поскольку моя программа организована так, что повторно нажать на кнопку вызова формы 2 не получится, я просто прячу форму 1 после вызова).

Вот. Значит, всё работает замечательно.

По моему замыслу при вызове формы 2 у меня должна ещё и открываться и форма 3 (то есть при нажатии кнопки с формы 1 вызывается две формы, а не одна). (Кстати, на самом деле не форма 3, а форма 5, просто я так написал, чтобы вам было легче читать и понять меня, это не суть важно, мы будем называть её формой 3).

Форма 3 является модальной, это тоже не то, о чём я хотел говорить.

Проблема была в следующем, программа, когда натыкалась на строку
Form3:=TForm3.Create(Self);

Возникала ошибка Access violation.
Я долго парился, в чём же тут дело, пробовал много вариантов, но ошибка не хотела уходить.

И тут я посмотрел на слово CREATE, и вспомнил, что у меня стоит обработчик события создания формы 3 (FormCreate). Я пошёл, закомментировал его тело с помощью комбинации //, то есть у меня этот обработчик после этого фактически перестал выполняться, ибо выполняться было нечему. После этого всё заработало.

Вопросы такие:
1. Обработчик события создания формы выполняется раньше её создания??
2. Что делать в том случае, если всё-таки мне необходимо выполнить комплекс каких-либо действий при создании формы с помощью обработчика FormCreate, а создаваемую форму я создаю посредством конструкции Form3:=TForm3.Create(Self);

Заранее спасибо за ответ.
Автор, добавлено 2.01.11, 17:32:48
Не совсем понятно, как у вас вызываются эти формы 2 и 3. Я попробовал. Кнопкой на первой форме создаю и вызываю обе. И при событии onCreate третьей формы пишу

Caption:=’Изменение заголовка’; // Не важно что

Почему-то всё отрабатывает, при нажатии на кнопку выскакивают обе дополнительные формы, третья с изменённым заголовком. Каким образом вы прячете первую форму, может, дело в этом? Я просто написал перед вызовом форм Form1.Visible:=False. Или всё же используете объекты третьей формы, которые пока не существуют.

Попробуйте вместо onCreate выполнять действия в onActivate третьей формы. Вадим Мошев, добавлено 2.01.11, 18:04:27
Сейчас объясню, как вызываю формы.
У меня есть форма 1. На ней стоит кнопка. При её нажатии у меня создаётся и показывается форма 2.

По моему замыслу, когда я с формы 1 вызываю 2 и 3-ю, пользователь программы сначала должен поработать с 3-й формой, причём во время работы с ней 2-я форма должна быть ему недоступна. И только когда работа с 3-й формой завершена, он начинает работать со второй. То есть, на момент работы с 3-й формой работа всей остальной программы должна быть заблокирована.

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

type
TForm2 = class(TForm)
private
< Private declarations >
procedure CreateParams(var Params: TCreateParams);
override;
.
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
ExStyle := ExStyle or WS_EX_APPWINDOW;
end; Мария, добавлено 27.06.11, 22:30:16
кажется, я не совсем правильно описала задачу
в моей программе есть 2 формы, при нажатии на кнопку на первой форме открывается вторая форма а первая скрывается,так вот, первая форма TForm1 = class(TForm), т.е. задана как главная форма, её я могу менять добавляя на неё всякие элементы
( кнопки, мемо и тд) и меняя их размер и положение, а вторую форму после создания я менять не могу, она вылезает в программе всегда в первоначальном виде, к ней у меня нет доступа, как исправить? помогите пожалуйста Автор, добавлено 27.06.11, 22:53:05
Так вы хотите делать это программно, т.е. из первой формы создавать во второй форме компоненты динамически?

Тогда нужно создавать компоненты как переменные, и для ссылки на них использовать не Form2 а Unit2. Вот пример создания компонента TMemo:

procedure TForm1.Button2Click(Sender: TObject);
begin
Unit2.Memo:=TMemo.Create(Self);
Unit2.Memo.Parent:=Form2;
Unit2.Memo.Top:=0;
Unit2.Memo.Left:=0;
Unit2.Memo.Visible:=True;
end;

Что мешает написать на второй форме то же самое:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

uses Unit21, Unit31;

<$R *.dfm>
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Hide;
form2.Show;
show;
finally
form2.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
Hide;
form3.Show;
show;
finally
form3.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TTitleForm, TitleForm);
TitleForm.ShowModal;
Application.Run;

С другими формами мне вообще непонятно. Кода нет, о чём гадать?

Павел, добавлено 17.01.12, 15:24:53
Всё, проблемы решились.Access violation at adress выходило из-за ошибки в TitleForm.FormCreate.А во втором случае неправильно был установлен фокус. Елена, добавлено 28.01.12, 20:30:24
не совсем по теме вопрос. подскажете.может быть какие задачи можно реализовать в делфи в качестве научной работы в 11 классе? чтобы не сверх сложно, но графику можно было применить:) Автор, добавлено 29.01.12, 10:07:05
Ой, я не в курсе, что в 11 классе научные работы выполняют! Вот одной студентке помогал домашнее задание делать: рассчитать функцию f=n!/n^n (n факториал делить на n в степени n). Но это без графики, одни расчёты. А с графикой можно придумать, например, сделать компьютерную модель чего-либо, чтобы как-то двигалось, менялось, взаимодействовало. Например, город. Несколько улиц. На перекрёстках светофоры. Работают с определёнными интервалами переключения. Сделать модель движения транспорта, и можно анализировать оптимальные интервалы в зависимости от количества машин в городе. (Машина на перекрёстке меняет направление движения случайным образом.) Это будет действительно научная работа. Сам придумал только что! Так что не взыщите, я же не препод. Аноним, добавлено 10.02.12, 16:03:48
можете помочь. как сделать, что бы при при нажатие на кнопку открывалась следущая форма, если в edit написан определенный текст? а то я уже кучу сайтов облазил и нигде найти не могу(
примерно так:
если edit1.text=’1337(например)’ то Form2.show Автор, добавлено 10.02.12, 19:49:41
Ну, всё вы уже сами написали. Создаём обработчик нажатия на кнопку и там пишем:

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

procedure TForm2.WMSysCommand;
begin
case Msg.CmdType of
SC_MINIMIZE:
begin

end;
SC_MAXIMIZE:
begin
form2.Top:=form1.Top+25;
form2.Height:=form1.Height-25;
end;
end;
inherited;
end;

1й пример срабатывает только 1й раз далее если форму сворачивать и разворачивать то он перестаёт работать. Второй просто не работает.

procedure TForm2.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
if Top СанЁк, добавлено 20.06.12, 02:52:21
Наконец то русским языком написано. Спасибо большое! Евгений, добавлено 27.03.13, 05:51:32
Здравствуйте подскажите пожалуйста у меня возникла проблема.
Я пытаюсь сделать в программе автозапуск с системой по CheckBox1 точнее сделал, но он работает только с главной формы, а у меня в программе настройки находятся на другой форме при этом автозапуск не работает подскажите как решить проблему? Автор, добавлено 27.03.13, 07:23:07
Я пытаюсь выделить инфу из вашего сообщения и. не могу. Ничего не понятно.

procedure TSetings1.CheckBox5Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.create;
reg.rootkey := hkey_current_user;
reg.lazywrite := false;
If CheckBox1.Checked then
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, true) then
begin
reg.WriteString(‘progrmma’, application.exename);
reg.CloseKey
end;
end
else
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, false) then
begin
if reg.ValueExists(‘progrmma’) then
reg.DeleteValue(‘progrmma’);
reg.CloseKey;
end;
end;
reg.free;
end;
Setings1 форма 3
Clock1 Главная форма программы
Программа компилируется, но автозапуск не происходит Евгений, добавлено 27.03.13, 11:52:34
Имя программа это Clockv210
Евгений, добавлено 27.03.13, 11:56:03
Извиняюсь с кодом напутал
Вот верный

procedure TSetings1.CheckBox5Click(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.create;
reg.rootkey := hkey_current_user;
reg.lazywrite := false;
If CheckBox1.Checked then
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, true) then
begin
reg.WriteString(‘Clockv210’, application.exename);
reg.CloseKey
end;
end
else
begin
If reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, false) then
begin
if reg.ValueExists(‘Clockv210’) then
reg.DeleteValue(‘Clockv210’);
reg.CloseKey;
end;
end;
reg.free;
end;
Setings1 форма 3
Clock1 Главная форма программы
Программа компилируется, но автозапуск не происходит Автор, добавлено 27.03.13, 12:45:23
Ну вот, сразу бы так.

procedure TForm1.Button1Click(Sender: TObject);
begin
TForm1.FormCloseQuery(TObject, True);
Close;
end;
end.
Пишет: Incompatible types:’TObject’ and ‘Class reference’ и указывает на TObject. Что нужно сделать, чтобы заработало? Автор, добавлено 24.04.13, 15:08:43
Так вообще делать нельзя. Процедура CloseQuery вызывается при закрытии Формы, её не нужно вызывать вручную. И просто в этой процедуре прописываете условие закрытия Формы, для этого приравниваете CanClose True или False. В вашем случае вводите глобальную переменную типа Boolean, нажатием кнопки меняете её значение, и пытаетесь закрыть Форму. А в процедуре CloseQuery анализируете вашу переменную, или просто приравниваете к ней CanClose:

var MyClose: Boolean=False;//глобальная переменная

procedure TForm1.Button1Click(Sender: TObject);
begin
MyClose:=not MyClose;
Close;
end;

Пытался сделать копию класса:
TMyForm = class(TForm)
Memo2: TMemo;
private
< Private declarations >
public
UserId: Integer;
< Public declarations >
end;

var
MyForm: TMyForm;
i: Integer;

//создаем форму, чтоб инициализировать счетчик
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

//нажимаем кнопку для создания новой формы и присвоения ей номера
procedure TForm1.ButtonClick(Sender: TObject);
begin
FormChat:=TMyForm.Create(Application);
FormChat.UserId:=i;
FormChat.Show;
Inc(i);
end;

Но почему-то выдает Resource TMyForm not found.

Подскажите, что я сделал не так, и что нужно сделать, чтоб эта форма была независимой от первой (в плане сворачивания в панель задач) и отдельной кнопкой на панели задач?

P.S.: Если я знаю Handle объекта, то можно ли обратиться к этому объекту по Handle?

Спасибо.
Павел, добавлено 11.11.13, 16:19:30
Возможно новых свойств в форме будет больше. Павел, добавлено 11.11.13, 16:33:33
к P.S.
Точнее не объекта, а процесса. Правильно ли я понял, что у всего, что создано в Application есть свой Handle? У формы, у Thread`а, у Socket`а. Автор, добавлено 11.11.13, 17:32:56
У каждого окна свой Handle. В данном случае имеется в виду, что окно это не только Форма.

Насчёт сокетов ничего сказать не могу, я далёк от этого. Павел, добавлено 12.11.13, 08:19:10
И снова я попытаюсь вернуться к моим баранам. 🙂
Я все-таки сделал так, чтоб на панели задач были отдельные кнопки для каждого окна.
Однако они не совсем отдельные, как могло бы показаться на первый взгляд.

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

Как мне от этого избавиться?
Буду премного благодарен за помощь. Павел, добавлено 12.11.13, 08:44:52
И снова это я. 🙂
А вопрос на этот раз такой: Как мне при создании n-ного количества форм через
var
FormChat: TForm;

обратиться ко всем созданным формам поочередно (неизвестно, сколько будет созданных форм)? FindComponent для самих форм не подходит, т.к. он только с визуальными компонентами внутри формы работает. Автор, добавлено 12.11.13, 13:42:58
1. Так как вы сделали, наверное никак. При сворачивании главной Формы другие свернутся. Значит, что? Первую Форму не нужно использовать! Начинайте сразу со второй, она и будет главная. Тогда при её сворачивании остальные останутся.

2. А по имени не пробовали, свойство Name. При создании форм задайте им имена, да? Павел, добавлено 12.11.13, 14:21:24
Спасибо за советы, но я на citforum`е попросил помощи по данным вопросам.
По поводу первого вопроса мне посоветовали то же самое.

По поводу второго есть такое решение (по перебору всех форм):
Сами формы перечислены в списке Screen.Forms

В частности пример:

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
s: string;
begin
for I := 0 to Screen.FormCount-1 do
begin
Memo1.Lines.Add(Screen.Forms[I].Name);
Screen.Forms[I].Height:=600;
end;
end;
(может кому и пригодится. )

Мне осталось только в динамически создаваемые формы научиться добавлять несколько свойств, чтоб можно было там хранить какие-либо идентификационные данные. Павел, добавлено 12.11.13, 14:23:41
Точнее на cyberforum`е. Автор, добавлено 12.11.13, 14:47:04
Ну задайте несколько переменных при конструировании формы, не пойму в чём проблема. Павел, добавлено 12.11.13, 15:05:51
Мне нужно, чтоб можно было обращаться к этим данным как-то так: 🙂
Screen.Forms[I].MyVar1:=num1;
if (Screen.Forms[I].MyVar2=num2) then
begin
что-то делать
end;

А еще я у вас на сайте видел, что есть такие типы переменных, как Point.
Можно ли их приспособить под формы?
Что-то вроде этого:
User32^[4]:=Screen.Forms[I];
и потом использовать:
User32^[4].Height:=600;
Чтоб таким образом сокращать имена форм и без перебора всех форм обращаться по поинтам?

Спасибо за терпение. 🙂 Автор, добавлено 12.11.13, 15:16:56
1. Вы что никогда к переменным других форм не обращались? Ну да, как-то так.

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

TFChat = class(TForm)
Memo2: TMemo;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
FChat: TFChat;
i: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FChat:=TFChat.CreateNew(Application);
FChat.Name:=’User’+IntToStr(i);
Form1.Memo1.Lines.Add(FChat.Name);
FChat.OnClose:=FChat.FormClose;

//создаю динамические объекты на динамической форме
FChat.Memo2:=TMemo.Create(FChat);
FChat.Memo2.Parent:=FChat;

FChat.Button2:=TButton.Create(FChat);
FChat.Button2.Parent:=FChat;
FChat.Button2.Top:=100;

procedure TFChat.FormCreate(Sender: TObject);
begin
Form1.Memo1.Lines.Add(‘FormCreate’+(Sender as TFChat).Name);
end;

Что мне надо написать, чтоб в форму с именем User0 в Memo2 добавилась строчка «bla-bla-bla»?
Пытался сделать так: User2.Memo2.Lines.Add(‘bla-bla-bla’); но не прокатило, т.к. User2 в программе четко нигде не описано.

Спасибо. Павел, добавлено 14.11.13, 17:28:41
Поправочка.
Что мне надо написать, чтоб в форму с именем User2 в Memo2 добавилась строчка «bla-bla-bla»?
Хотя цифра после User может быть любая. Вплоть до 1000. Автор, добавлено 14.11.13, 17:41:18
Я всё же когда-то создавал формы как элементы массива (динамического, конечно). Тогда нет необходимости добавлять их в секцию uses, а обращаться как к переменной.

Так-то вот просто добавьте новую форму в проект, и при попытке использовать её система добавит её в uses. Динамически сделать это наверное не удастся. Так что пока я вижу только способ с массивом, или другой переменной типа TForm.

В принципе, была у вас мысль с указателями, я сразу не понял, но если бы получилось, наверное, наилучший вариант. Автор, добавлено 14.11.13, 17:47:40
Всё, сегодня уже не могу отвечать. До завтра. Степан, добавлено 7.02.14, 19:41:12

procedure TForm1.N11Click(Sender: TObject);
begin
Form1.Hide;
Form2.Show;
end;

У меня на delfi7 пишет ошибку на строчке открытия новой формы Form2.Show; Можете сказать почему так? Автор, добавлено 7.02.14, 19:54:11
Какая ошибка?

Может, у вас эта форма ещё не существует, то есть метод Create ещё не работал. Так бывает, когда форма в свойствах приложения убрана из разряда автосоздаваемых. И это правильно. Но создавать эту форму нужно тогда так:

if (not Assigned(Form2)) then // проверка существования Формы (если нет, то
Form2:=TForm2.Create(Self); // создание Формы)
Form2.Show;

Кстати, всё это описано в тексте статьи.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *