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

Delphi

КОМПЬЮТЕРНЫЕ КУРСЫ «ПОИСК»

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

form2

Создайте консольный проект DynaForm и модуль DynaMemo.

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

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

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

В неординарном в некотором смысле примере DynaForm нет формы, определенной в ходе разработки, но имеется модуль с такой функцией;

Форма создается путем вызова метода CreateForm глобального объекта Application. Написать такое код сложнее, но он позволяет добиться большей гибкости, поскольку параметр может зависеть от внешних настроек.

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

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

Источник:Кэнту М. Delphi 7:Для профессионалов

Источник

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

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

Далее. Когда компонент создан, то есть место в памяти под него выделено, можно задавать значения параметрам этого объекта. Прежде всего, это ещё один компонент, так называемый «родитель». Компонент-родитель будет отвечать за отрисовку нашего динамически создаваемого компонента. Это значит, что новый компонент появится в границах компонента-родителя.

Если компонент-владелец имеет тип TComponent, то есть может быть любым компонентом, то компонент-родитель уже имеет тип TWinControl. То есть это должен быть «оконный» компонент, умеющий принимать и обрабатывать сообщения от системы Windows. Это необходимо, так как компонент должен находиться в некоторой иерархии компонентов, принимающих и передающих сообщения от системы Windows. Нашему динамическому компоненту сообщения будут передаваться через компонент-родитель.

А некоторые компоненты вообще не умеют принимать сообщения от системы, и в процессе работы в этом случае ими также будет управлять компонент-родитель, например, Форма или Панель, на которой они находятся.

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

Вот общая схема «конструирования» динамически создаваемого компонента:

var Component: TComponent; //Описать переменную для компонента

begin
Component:=TComponent.Create(Owner); //Задать владельца
Component.Parent:=Parent; //Задать родителя
end;

На этом создание компонента можно считать законченным, и он успешно появляется (или «не появляется», если он не визуальный!) в приложении. Остальные свойства будут присвоены ему по умолчанию самой системой Delphi.

Естественно, для визуальных компонентов значения таких свойств по умолчанию как положение на Форме, ширина, высота «свежесозданного» динамически компонента мало кого устроят. Нужные размеры и положение компонента также придётся задать программисту.

Давайте для примера динамически создадим многострочный редактор, компонент Memo. Пусть он появляется на Форме по нажатию кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var Memo: TMemo;
begin
Memo:=TMemo.Create(Form1);
Memo.Parent:=Form1;
Memo.Left:=50;
Memo.Top:=50;
Memo.Width:=250;
Memo.Height:=100;
Memo.Text:=’Мама я родился!’;
end;

DinCreMemo

Ребята, не забывайте присваивать (ассоциировать в Инспекторе Объектов) своим кнопкам предлагаемые здесь процедуры. А то потом в комментариях и появляются возгласы: «ничего не работает!»

Есть ещё свойство Name! По умолчанию Delphi присвоит ему типовое имя с присвоением очередного порядкового номера: Memo1. Программист при создании компонента также может присвоить свойству Name нужное значение, например:

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

А дело вот в чём. Посмотрите в свежесозданном проекте, ещё до добавления компонентов, на список перечисленных в операторе uses стандартных модулей:

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

Теперь возьмите в Палитре компонентов компонент Memo или ту же кнопку Button, положите на Форму и опять посмотрите на список модулей:

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

Подчёркиванием я выделил модуль, который автоматически добавил Delphi к списку необходимых модулей. Перед выполнением приложения компилятор просматривает установленные компоненты и добавляет в список uses модули, необходимые для работы этих компонентов. Так что даже если вы полностью сотрёте этот список ( оставьте только » uses Forms; «), Delphi его восстановит в том минимальном виде, который нужен для функционирования компонентов.

Также становится понятно, почему приложение, создающее Memo через нажате кнопки, сразу заработало. Для работы компонентов Button и Memo необходим один и тот же модуль StdCtrls, описывающий компоненты, расположенные на вкладке Standart. Поэтому, когда мы положили на Форму компонент Button, Delphi добавил этот модуль, что обеспечило работу также и Memo.

Теперь возникает вопрос, как можно создать приложение аналогичное первому, где компонент Memo создавался динамически по нажатию кнопки, но чтобы кнопка тоже была создана динамически!

Естественно, проще всего создать обработчик для динамически создаваемого компонента, воспользовавшись готовым компонентом из палитры. Создаём для него нужный обработчик, а затем этот компонент просто удаляем. А теперь достаточно присвоить имя созданного обработчика соответствующему свойству динамического компонента. Название этого свойства будет совпадать с названием соответствующего события в Инспекторе Объектов. Например, для события OnClick пишем так:

Естественно, имя обработчика может быть любым, просто в данном случае я воспользовался тем обработчиком, что создал Delphi для кнопки из палитры. Если оно вам не нравится, можно смело переименовать процедуру, только не забудьте изменить её название также и в описании типа Формы.

Вот и всё. Все ресурсы, выделенные для функционирования компонента, будут освобождены. Останется только созданная переменная, указывающая на уже несуществующий в памяти объект. Её тоже неплохо бы уничтожить. Это делается присвоением переменной значения nil. Есть процедура, выполняющая оба эти действия, уничтожение и объекта и переменной: FreeAndNil:

Источник

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

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

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

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

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

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

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

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

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

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

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

MDI-свойства TForm

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

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


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

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

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

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

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

Внешний вид работающего приложения изображен на рисунке 2.

Рис.2. Внешний вид приложения

Текст этого примера можно взять здесь.

Источник

BestProg

Создание новой формы и подключение ее к главной форме программы

Содержание

Условие задачи

Нужно к главной форме Form1 добавить новую форму Form2 в приложении.

В главной форме Form1 :

В новой форме Form2 :

01 02 00 004 01r

Рис. 1. Схема взаимодействия между формами

Выполнение

1. Запустить Embarcadero Delphi 2010. Создать проект по шаблону VCL Forms Application

Сохранить проект и главную форму с именем «MainForm» в некоторую папку. Автоматически главной форме присваивается имя Form1 (свойство Name в Object Inspector ).

2. Проектирование главной формы Form1

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

01 02 00 004 02

Рис. 2. Главная форма Form1

3. Добавление новой формы в проект

Новая форма в проект добавляется путем вызова последовательности комманд (рис. 3):

01 02 00 004 03

Рис. 3. Добавление новой формы в проект

В результате, на экране появится новая пустая форма (рис. 4). Получить доступ к свойствам и методам (процедурам и функциям) этой формы можно с помощью имени Form2 по умолчанию.

01 02 00 004 04

Рис. 4. Новосозданная форма с именем Form2

Сохранить новую форму в файле можно с помощью команды

Таким образом, имеем две формы с такими же именами в программе (свойство «Name» ):

4. Настройка вида новой формы

Для настройки корректного вида новой формы ( Form2 ) выполняем следующие действия.

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

01 02 00 004 05

Рис. 5. Вид дочерней формы после корректировки

5. Подключение формы 2 к модулю формы 1
6. Вызов дочерней формы из главной формы

Для вызова дочерней формы (Form2) программируем событие клика мышкой на кнопке « Show Form 2″.
Листинг программного кода этого события следующий.

7. Программирование событий в форме 2

В нашем случае программируем два события в модуле формы 2 ( Unit2.pas ):

Листинг программного кода обработки этих событий имеет вид.

Внешняя глобальная переменная ModalResult формы Form2 определяет поведение формы. Как только ModalResult становится равным ненулевому значению ( mrOk или mrNo ), то форма закрывается с соответствующим кодом возврата.

В результате вызова из главной формы функции

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

Теперь можно запустить программу на выполнение и протестировать ее.

Вывод

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

Источник

Delphi уроки: Динамически (программно) создаем новую форму.

Delphi уроки: Динамически (программно) создаем новую форму.

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

Для начала создаем новый проект и кидаем на форму кнопку (button). Теперь создадим еще одну форму, жмем: File => New => Form
Сделали. Тогда создаем обработчик событий (OnClick) на кнопке и в нем пишем:

Form2:= TForm2.Create(Application);
Form2.Caption:= ‘ Новое сообщение ‘;
form2.Show;

Запускаем проект и Delphi выдает нам вот такое окно, в котором нажимаем yes. ( Если окошко по каким либо причинам не появилось то после ключевого слова implementation допиши вот такую строчку)

create form

Запускаем еще, теперь при каждом щелчке по кнопке будет создаваться новая форма. А вот как это получилось у меня:

create form2

На сегодня все, Встретимся в следующем уроке.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • delphi динамическое создание форм
  • delphi вкладки на форме