По умолчанию (то есть со всеми параметрами конфигурации IDE по умолчанию) автоматически создаются новые формы. Будет показана только основная форма, а второстепенные формы могут быть показаны с помощью:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
Form3.ShowModal;
end;
Это хорошая практика - отключить эту опцию автоматического создания. Перейдите в: Инструменты> (Среда) Параметры> (VCL) Конструктор> Параметры создания модуля и отключите / снимите флажок Автоматическое создание форм и модулей данных.
Вместо этого создавайте (уже разработанную) форму только тогда, когда это необходимо:
procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.Show;
end;
Это также показывает, что глобальные переменные для вторичных форм не нужны, и хорошей общей практикой является их удаление как можно скорее, чтобы предотвратить неправильное использование:
type
TForm2 = class(TForm)
end;
//var
// Form2: TForm2; << Always delete these global variable
implementation
Если вы не хотите настраивать такую вторичную форму с помощью конструктора форм, вам необходимо создать все элементы управления в коде во время выполнения. Следующее:
unit Unit2;
interface
uses
Classes, Forms, StdCtrls;
type
TForm2 = class(TForm)
private
FButton: TButton;
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;
implementation
{ TForm2 }
constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;
end.
Как видите, я использовал конструктор CreateNew
. Это необходимо для T(Custom)Form
производных:
Используйте CreateNew
вместо Create
для создания формы без использования связанного файла .DFM для ее инициализации. Всегда используйте CreateNew
, если TCustomForm
потомок не является TForm
объектом или потомком TForm
.
Для всех других контейнерных элементов управления (таких как TPanel
, TFrame
и т. Д.) Вы можете переопределить конструктор по умолчанию Create
.
Назовите эту форму следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(nil);
try
Form.ShowModal;
finally
Form.Free;
end;
end;
Or:
procedure TForm1.Button1Click(Sender: TObject);
begin
FForm := TForm2.CreateNew(Application);
FForm.Show;
end;
В этом последнем случае форма не освобождается, а скрывается при закрытии, поэтому вам нужно сохранить ссылку на нее в частном поле (FForm
) и освободить ее позже. Или вы можете сделать это автоматически:
unit Unit2;
interface
uses
Classes, Forms, StdCtrls;
type
TForm2 = class(TForm)
private
FButton: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
end;
implementation
{ TForm2 }
constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
inherited CreateNew(AOwner);
OnClose := FormClose;
FButton := TButton.Create(Self);
FButton.SetBounds(10, 10, 60, 24);
FButton.Caption := 'OK';
FButton.Parent := Self;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
end.
Теперь вы можете вызвать его, не сохраняя ссылку:
procedure TForm1.Button1Click(Sender: TObject);
begin
TForm2.CreateNew(Self).Show;
end;
Передаете ли вы, Self
, Application
или nil
в качестве владельца новой формы, зависит от того, когда вы хотите, чтобы она была автоматически уничтожена, если вы не освободите ее вручную или через событие OnClose
. С использованием
Self
: уничтожит новую форму при уничтожении вызывающей формы. Это особенно полезно, когда вызывающая форма не является основной.
Application
: уничтожит новую форму при завершении приложения. Это был бы мой предпочтительный выбор.
nil
: не уничтожит новую форму и приведет к утечке памяти при завершении работы приложения. Хотя в конечном итоге память будет высвобождена, когда Windows завершит процесс.
person
NGLN
schedule
19.04.2013
Dialogs.CreateMessageDialog
. - person NGLN   schedule 20.04.2013