Как сделать несколько форм в delphi

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

не нужно объявлять переменную Form1, а при записи

The program includes a project file and two new unit files. First, the project file:

Once again, our program is called greeting. It uses three units: Forms, which is part of VCL; Unit1, which is associated with the application's main form (Form1); and Unit2, which is associated with another form (Form2).

The program makes a series of calls to an object named Application, which is an instance of the Vcl.Forms.TApplication class defined in the Forms unit. (Every project has an automatically generated Application object.) Two of these calls invoke a Vcl.Forms.TApplication method named CreateForm. The first call to CreateForm creates Form1, an instance of the TForm1 class defined in Unit1. The second call to CreateForm creates Form2, an instance of the TForm2 class defined in Unit2.
Unit1 looks like this:
Unit1 creates a class named TForm1 (derived from Vcl.Forms.TForm) and an instance of this class Form1. The TForm1 class includes a button -- Button1, an instance of Vcl.StdCtrls.TButton -- and a procedure named Button1Click that is called when the user presses Button1. Button1Click hides Form1 and displays Form2 (the call to Form2.ShowModal).

Note: In the previous example, Form2.ShowModal relies on the use of auto-created forms. While this is fine for example code, using auto-created forms is actively discouraged.
Form2 is defined in Unit2:

Unit2 creates a class named TForm2 and an instance of this class, Form2. The TForm2 class includes a button (CancelButton, an instance of Vcl.StdCtrls.TButton) and a label (Label1, an instance of Vcl.StdCtrls.TLabel). You can not see this from the source code, but Label1 displays a caption that reads Hello world! The caption is defined in Form2's form file, Unit2.dfm.

TForm2 declares and defines a method CancelButtonClick that will be invoked at run time whenever the user presses CancelButton. This procedure (along with Unit1's TForm1.Button1Click) is called an event handler because it responds to events that occur while the program is running. Event handlers are assigned to specific events by the form files for Form1 and Form2.

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

Форма – это важнейший визуальный компонент, который представляет собой видимое окно Windows. В системе Delphi форма является компонентом, который служит контейнером для всех других компонентов.

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

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

В Windows есть два основных типа приложений: однодокументные (SDI – однодокументный интерфейс), и многодокументные (MDI – многодокументный интерфейс). Однодокументные приложения состоят из одного или нескольких независимых друг от друга форм. Многодокументное приложение может работать одновременно с несколькими различными документами. В таких приложениях главное окно содержит дочерние окна, размещаемые в его пределах.

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

Ссылку на модуль другой формы можно устанавливать программно, а можно и автоматически. Для этого нужно выбрать команду File-Use Unit (Файл-Использовать модуль) и в диалоговом окне выбрать соответствующий подключаемый модуль.

Форма, как и любой другой компонент, имеет свойства (определяют ее внешний вид: размер, положение на экране, текст заголовка, вид рамки), методы и события.

Система Delphi при добавлении новой формы в проект автоматически создает один экземпляр класса: Application.CreateForm(TForm1,Form1).

Управлять видимостью форм на экране можно с помощью методов Show и Hide. Процедура Show отображает форму в немодальном режиме (ShowModal – модальный режим), при этом свойство Visible устанавливается в значение true, а сама форма переводится на передний план. Процедура Hide скрывает форму, устанавливая ее свойство Visible в значении False.

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

Уничтожение формы происходит с помощью методов Release, Free, Destroy.

Форма имеет уникальное имя, указанное в свойстве Name . Заголовок окна содержится в свойстве Caption . По заголовку окна пользователь узнает о функциональном назначении программы или текущего окна.

Кроме заголовка в верхней части окна находится иконка и кнопки управления состоянием. Чтобы сменить иконку в текущем окне необходимо в инспекторе объектов выбрать свойство Icon , в котором необходимо указать соответствующий файл-рисунок. Файл должен быть с расширением ICO.

Для того, чтобы сменить иконку в проекте, нужно войти в меню " Project " - " Options. ", на вкладке Application виден текущий рисунок файла проекта. Сменить его можно кнопкой " Load Icon. ".

Для просмотра и изменения значений свойств формы и ее компонентов используется окно Object Inspector . В верхней части окна Object Inspector указано имя объекта, значения свойств которого отображается в данный момент. В левой колонке вкладки Properties (Свойства) перечислены свойства объекта, а в правой — указаны их значения.

При создании формы в первую очередь следует изменить значение свойства Caption (Заголовок). Чтобы это сделать, нужно в окне Object Inspector щелкнуть мышью в строке Caption , в результате чего будет выделено текущее значение свойства, в строке появится курсор, и можно будет ввести другой текст.

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

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

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

При выборе некоторых свойств, например, Borderstyle , справа от текущего значения свойства появляется значок раскрывающегося списка.

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

На этом шаге мы рассмотрим создание MDI -приложений.

Термин MDI (Multiple Document Interface) дословно означает многодокументный интерфейс и описывает приложения, способные загрузить и использовать одновременно несколько документов или объектов. Примером такого приложения может служить диспетчер файлов (File Manager).

Обычно MDI -приложения состоят минимум из двух форм - родительской и дочерней . Свойство родительской формы FormStyle установлено равным fsMDIForm . Стиль дочерней формы - fsMDIChild .

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

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

Автоматическое создание форм

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

Первое - раздел интерфейса в файле модуля формы.

Вторым является место, в котором описывается переменная класса:

Здесь описана переменная Form1 , указывающая на экземпляр класса TForm1 и доступная из любого модуля. Обычно она используется во время работы программы для управления формой.

Третье место находится в исходном тексте проекта, доступ к которому можно получить с помощью меню View | Project Source . Этот код выглядит как:

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

Динамическое создание форм

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

Для создания нового экземпляра формы используйте конструктор Create класса формы. Приведенный ниже код создает новый экземпляр TForm1 во время работы программы и устанавливает его свойство Caption равным New Form :

Конструктор Create получает в качестве параметра-потомка объект типа TComponent , который будет владельцем формы. Обычно в качестве владельца выступает Application . Это делается для того, чтобы все формы были автоматически закрыты по окончанию работы приложения. Можно также в качестве параметра использовать значение Nil , создав, тем самым, форму без владельца. Однако в этом случае закрывать и уничтожать ее должен программист. В случае возникновения необрабатываемой ошибки такая форма останется в памяти.

Примечание . При разработке MDI -приложения метод Show не нужен, так как Delphi автоматически показывает все вновь созданные дочерние MDI -формы. В случае однодокументного приложения использование метода Show обязательно.

Даже при динамическом создании форм Delphi попытается "помочь" в создании экземпляра каждой формы. Чтобы отказаться от них, нужно в диалоговом окне Project Options (вызывается при выполнении пункта меню Project | Options ) удалить классы форм из списка Auto-create forms :


Рис.1. Окно Project | Options

Если требуется получить доступ к отдельному дочернему экземпляру класса, используйте свойство MDIChildren , описываемое в следующем разделе.

MDI-свойства TForm

Объект TForm имеет несколько свойств, специфичных для MDI -приложений. Перечислим их.

    property ActiveMDIChild: TForm; . Это свойство возвращает дочерний объект TForm , имеющий в текущее время фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму. Например, представим, что проект использует дочернюю форму, содержащую элемент ТМеmо , названный memDailyNotes . Имя класса этой дочерней формы - TfrmMDIChild . Родительская форма содержит кнопку Clear в панели инструментов, которая удаляет содержимое memDailyNotes в активной дочерней форме. Вот как это реализуется:

В первой строке проверяется, равен ли ActiveMDIChild значению Nil , так как в этом случае обращение к объекту вызовет исключительную ситуацию.

Примечание . Свойство ActiveMDIChild равно Nil в том случае, если нет открытых дочерних форм или свойство FormStyle не равно fsMDIForm .

Поскольку ActiveMDIChild возвращает объект TForm , компилятор не имеет доступа к memDailyNotes - объекту TfrmMDIChild . Вторая строка проверят соответствие типов, то есть действительно ли свойство ActiveMDIChild указывает на объект TfrmMDIChild . Третья строка выполняет преобразование типа и вызывает метод Clear компонента memDailyNotes .

Обычно это свойство используется при выполнении какого-либо действия над всеми открытыми дочерними формами. Вот код сворачивания всех дочерних форм при щелчке на кнопке с именем Button1 :

MDI-события и MDI-методы TForm

В MDI -приложении событие OnActivate запускается только при переключении между дочерними формами. Если фокус ввода передается из не MDI -формы в MDI -форму, генерируется событие OnActivate родительской формы, хотя ее свойство Active никогда и не устанавливается равным True . Эта странность на самом деле строго логична: ведь, если бы OnActivate генерировался только для дочерних форм, не было бы никакой возможности узнать о переходе фокуса ввода от другого приложения.

  • procedure ArrangeIcons; - выстраивает пиктограммы минимизированных дочерних форм в нижней части родительской формы;
  • procedure Cascade - располагает дочерние формы каскадом, так что видны все их заголовки;
  • procedure Next; procedure Previous; - переходит от одной дочерней формы к другой, как-будто нажаты клавиши Ctrl+Tab или Ctrl+Shift+Tab ;
  • procedure Tile; - выстраивает дочерние формы так, что они не перекрываются.

Пример MDI-приложения

  • Caption: Image Viewer;
  • FormStyle: fsMDIForm;
  • Name: frmMDIParent;
  • ShowHint: True.
  • Name: spbtnLoad;
  • Hint: Load;
  • Left: 8;
  • Top: 8.
  • Filter: Bitmaps (*.bmp)|*.bmp;
  • Name: opndlgLoad;
  • Options: [ofPathMustExist,ofFileMustExist].
  • FormStyle: fsMDIChild;
  • Name: frmMDIChild;
  • Position: poDefaultPosOnly.

  • выполним пункт меню Project | Options , и появится диалоговое окно Project Options , показанное на рисунке 1;
  • выберем форму frmMDIChild в списке Auto-create forms ;
  • щелкнем на кнопке ">" . Форма frmMDIChild при этом будет перенесена в список Available forms .

Создав интерфейс, перейдем к написанию исходного текста приложения.

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

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

Поскольку модуль ссылается на тип TfrmMDIChild , находящийся в модуле MDIChild , то после строки implementation следует добавить еще одну строку:

Теперь можно приступить к компиляции и запуску приложения. Однако по щелчку на кнопке Close дочерняя форма не закрывается, а сворачивается в пиктограмму. Чтобы заставить ее закрыться, следует в код обработчика OnClose класса TfrmMDIChild внести изменение свойства Action :

В Windows основной элемент пользовательского интерфейса - форма. В Delphi почти каждый проект имеет по крайней мере одно окно - главное окно приложения. Все окна в Delphi основаны на объекте TForm. В данной статье мы рассмотрим основные события, участвующие в "жизни формы".

Форма Delphi

Формы имеют свои свойства, события и методы, при помощи которых Вы можете управлять видом и поведением формы. Форма, это обычный компонент Delphi, но в отличие от других, её нет на панели компонентов. Обычно форма создаётся при создании нового проекта (File | New Application). Вновь созданная форма будет главной формой приложения.

Дополнительные формы в проекте создаются через File | New Form. Так же существуют и другие способы создания форм, но здесь мы не будем рассматривать их.

Как и любой другой компонент (объект) форма имеет свои методы и реагирует на события. Давайте рассмотрим некоторые из этих событий.

Рождение формы в Delphi

OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint .

OnCreate Событие OnCreate возникает при создании TForm и только один раз. При создании формы (у каторой свойство Visible установлено в True), события произойдут в следующем порядке: OnCreate, OnShow, OnActivate, OnPaint. В обработчике события OnCreate можно сделать какие-либо инициализационные действия, однако, любые объекты созданные в OnCreate будут уничтожены в событии OnDestroy.

OnShow Это событие генерируется, когда форма станет видимой. OnShow вызывается сразу перед тем, как форма станет видимой. Это событие случается, если установить свойство формы Visible в True, либо при вызове методов Show или ShowModal.

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

OnPaint, OnResize Эти события вызываются каждый раз, когда форма изначально создаётся. При этом OnPaint вызывается каждый раз, когда какому-нибудь элементу формы необходимо перерисоваться (это событие можно использовать, если необходимо при этом рисовать на форме что-то особенное).

Жизнь формы в Delphi

Когда форма создана и все её элементы ждут своих событий, чтобы обрабатывать их, жизнь формы продолжается до тех пор, пока кто-нибудь не нажмёт крестик в верхнем правом углу формы!

Уничтожение формы в Delphi

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

. OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy

OnCloseQuery Если мы попытаемся закрыть форму при помощи метода Close либо другим доступным способом (Alt+F4 либо через системное меню), то сгенерируется событие OnCloseQuery. Таким образом, это событие можно использовать, чтобы предотвратить закрытие формы. Обычно, событие OnCloseQuery используется для того, чтобы спросить пользователя - уверен ли он (возможно в приложении остались несохранённые данные).

Обработчик события OnCloseQuery содержит переменную CanClose, которая определяет, можно ли форме закрыться. Изначальное значение этой переменной True. Однако в обработчике OnCloseQuery можно установить возвращаемое значение CloseQuery в False, чтобы прервать выполнение метода Close.

  • caNone. Форме не разрешено закрыться. Всё равно, что мы установим CanClose в False в OnCloseQuery.
  • caHide. Вместо закрытия, форма будет скрыта.
  • caFree. Форма будет закрыта, и занятые ей ресурсы будут освобождены.
  • caMinimize. Вместо закрытия, форма будет минимизирована. Это значение устанавливается поумолчанию у дочерних форм MDI.

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

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

Случайная цитата

Неточно спланированная программа требует в три раза больше времени, чем предполагалось

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