Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Динамическое создание формы

Автор: AlexPS 17.01.2005 5:54

Чуваки, а кто-нить знает, как во время выполнения проги, создать еще одну форму?
Как обратиться к этой форме, как создать элементы на этой форме???
Заранее всем пасибо!!!

Автор: volvo 17.01.2005 6:38

AlexPS
А кто мешает тебе сделать что-то типа такого:
Первый Unit

Код
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
 public
 end;
var Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMyForm;
end;
end.


Второй Unit
Код
unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
 TForm2 = class(TForm)
 private
 public
 end;
var Form2: TForm2;
procedure ShowMyForm;
implementation
{$R *.dfm}
procedure ShowMyForm;
begin
 Form2:=TForm2.Create(nil);
try
 Form2.ShowModal;
finally Form2.Free; end;
end;
end.


Только не забудь выключить автоматическое создание для Form2
Для элементов формы аналогично ...

Автор: AlexPS 17.01.2005 6:57

Это не совсем то, что мне надо. Тут я должен предварительно создать все формы, которые будут использоваться. А мне нужно, чтобы этих форм могло быть ОЧЕНЬ много, ну типа, чтобы мне их все вручную не создавать.
А может, я че не так понял..... unsure.gif

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

Автор: xds 17.01.2005 8:33

1) создаешь форму;
2) Project/Options/Forms: переносишь её из "Auto-create" в "Available";
3) в нужном месте подключаешь модуль с формой (uses) и создаешь её с помощью метода Application.CreateForm. В принципе, можно обойтись вызовом конструктора самой формы - создавать последнюю как любой другой объект.

Целиком автономную форму можно создать как объект класса TForm. Элементы на нее добавляются методом TForm.InsertControl.

Автор: P@sh@ 17.01.2005 14:44

Вот этот метод (обработчик нажатия кнопки) создает с нуля форму с надписью:

Код
procedure TForm1.Button1Click(Sender: TObject);
var frm: TForm;
   lbl: TLabel;
begin
 frm:=TForm.Create(Application);
 frm.BoundsRect:=Rect(100,100,500,300);
 lbl:=TLabel.Create(frm);
 lbl.Left:=50; lbl.Top:=50;
 lbl.Caption:='proba';
 lbl.Parent:=frm;  // или  frm.InsertControl(lbl); - одно и то же
 frm.Show;
end;

Автор: AlexPS 17.01.2005 23:53

Чуваки, я знал, что вы мне поможете, теперь все просто зашибись!!!
Пасибо!!!

Автор: AlexPS 21.01.2005 21:57

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

Код
var
mem:TMemo;
...
mem:=TMemo.Create(frm);
mem.Left:=2; Mem.Top:=2;
Mem.Height:=200; Mem.Width:=388;
Mem.ScrollBars:=SsVertical;
Mem.Parent:=frm;
...

А как бы мн в этот Memo добавить че-нить с главной формы.
Или, еще, например на этой форму есть кнопка, как обработать ее нажатие
Естественно, всем еще раз заранее пасибо большое. smile.gif

Автор: P@sh@ 24.01.2005 13:03

чтобы кнопки обрабатывать, напиши заранее обработчик события:

Код
type
 TForm1=class(TForm)
 ...
   procedure MyButtonClick(Sender: TObject);
 ...
 end;
 ...
implementation
 ...
procedure TForm1.MyButtonClick(Sender: TObject);
begin
 // ... обращение к вызвавшей обработчик кнопке:
 TButton(Sender).Caption:='Нажата';
end;

и назначь его кнопке при создании:
Код
 ...
 bt:=TButton.Create(frm);
 ...
 bt.OnClick:=MyButtonClick;
 ...


а в Memo как обычно пиши - Memo.Lines.Add('aaa');
только для этого придется переменную описать не в процедуре, а, например, в классе, чтоб ссылка не потерялась