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

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

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

Предположим, что у Вас имеется несколько связанных форм в Вашем приложении (как, вероятно, все делают). Конечно, многие из этих форм создаются динамически во время выполнения (удалены из списка "Автосоздаваемых форм" в окне свойств проекта).

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

Или Вы могли бы сделать приложение владельцем формы MyForm и описать команду, подобно этой:

Теперь, что если Вы "не знаете" точно тип класса объекта формы? Что, если, мало того, строковая переменная имеет перенос имени класса формы, как TMyForm ? Вы не сможете использовать образцы кода, показанных выше. Application.CreateForm ожидает переменную типа TFormClass , а не строку.

Вы, вероятнее всего не сможете использовать TMyForm.Create(. ) !

Новый экземпляр формы из строки

Обратите внимание, что процедура Application.CreateForm() ожидает переменную типа TFormClass своим первым параметром. Если мы сможем передать типовую переменную TFormClass (из строки), мы сможем создавать форму по ее имени!

Пример

Создайте новый проект Delphi и назовите главную форму MainForm (TMainForm) . Добавьте три новых формы в проект и назовите их: FirstForm (TFirstForm) , SecondForm (TSecondForm) и ThirdForm (TThirdForm) .
Удалите их из автосозданных форм в свойствах проекта. Затем поместите ListBox на MainForm и добавьте в него три строки ( TFistForm, TSecondForm, TThirdForm ).

В событии OnCreate MainForm регистрируются классы:

Как только мы щелкаем кнопкой, мы находим имя выбранной формы и вызываем процедуру CreateFormFromName:

Если будет выбран первый пункт из списка, то переменная " s " будет содержать значение " TFirstForm ". Событие CreateFormFromName создаст экземпляр формы TFirstForm :

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

Как сделать, чтобы форма закрывалась при нажатии Esc?

Для начала необходимо установить свойство формы KeyPreview в True. А потом уже можно отлавливать "Esc":

procedure TForm1.FormCreate(Sender: TObject);

(Sender: TObject; var Key: Char);

Можно ли создать форму, которая получает дополнительные параметры в методе Сreate?

Просто замените конструктор Create класса Вашей формы.

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

TForm2 = class (TForm)

constructor CreateWithCaption(aOwner: TComponent; aCaption: string );

constructor TForm2.CreateWithCaption(aOwner: TComponent; aCaption: string );

procedure TForm1.Button1Click(Sender: TObject);

Unit2.Form2 := Unit2.TForm2.CreateWithCaption(Application, 'My Caption' );

Как создать и вызвать модальную форму?

В каком порядке происходят события при создании и показе окна?

При создании окна обработчики событий выполняются в следующем порядке:

Copyright © 1996 Epsylon Technologies

Взято из FAQ Epsylon Technologies

Как использовать форму из DLL

Unit1 in 'Unit1.pas' ;

Необходимо, чтобы дочерняя форма не активизировала родительское окно

Сделайте родительским окном рабочий стол.

procedure TForm2.CreateParams( VAR Params: TCreateParams);

Можно ли динамически менять какая форма считается главной в приложении во время работы программы?

Можно, но только во время загрузки приложения. Чтобы сделать это выберите "View->Project Source" и измените код инициализации приложения, так что порядок создания форм зависил от какого-то условия.

Примечание: Вам придется редактировать этот код, если Вы добавите в приложение новые формы.

Условие создания главной формы

Существует ли в Delphi возможность создавать главную форму по условию? Я хочу использовать условие IF (в зависимости от передаваемого параметра) для того, чтобы определить какая форма будет главной при старте приложения. Фактически "другую" форму НЕ нужно будет загружать.

Хитрость здесь заключается в том, что мы предоставляем компилятору весь необходимый для создания форм код, но не допускаем его выполнения (IF FALSE THEN), при этом компилятор не ругается, а мы тем временем (во время выполнения приложения) выбираем и создаем главную форму. Вот пример кода, измененный .DPR-файл, который при старте случайным образом выбирает из друх форм главную:

Как сделать окно системно-модальным?

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

Пишу вручную модуль:

В обработчике нажатия кнопки пишу:

При нажатии на кнопку выдает исключение:

автор
Resource TForm2 not found

Ну а такое создание "вручную" давно отменили?

Проблема действительно оказалось в этом (код из 7-й версии):

Для стандартного конструктора если тип формы не TForm (например, наследник), то вызывается функция InitInheritedComponent, которая и читает ресурсы.

Ну а как же - куча исходного кода задля "экономии" + вечный геморрой при необходимости всунуть дополнительный контрол. Теперь помимо поддержки кода, который обеспечивает бизнес логику еще нужно поддерживать код, который отвечает за ГУИ.

А dfm придумали для быстрой разработки оконных приложений, кидая батоны на форму. Не более.

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

3 ответа 3

Касаемо ошибки: "Resource TForm2 not found". Можно подключить пустой файл dfm к модулю формы и тогда форма будет нормально создаваться.

Dfm подключается через дерективу

PS: такой трюк еще полезен при наследовании форм без dfm

Дополнение

Еще можно использовать конструктор CreateNew


Все получилось! Нужно вместо стандартного конструктора Create использовать альтернативный конструктор CreateNew.

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

По сути, .dfm – это лишь подобие файла ресурсов, который хранит свойства формы. Во время компиляции/сборки эти свойства читаются и устанавливаются (читай: присваиваются).

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

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