Как передать имя класса Form в процедуру.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как передать имя класса Form в процедуру.

Сообщение wofs » 10.09.2017 15:59:28

Добрый вечер! Вновь нужна помощь.
Есть основной проект с формой Form1, а есть форма, созданная заранее (Form2) с контролами и т.п.

Задача - написать процедуру, которая будет создавать форму Form2.

Если я создаю форму так:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2:=TForm2.Create(self);
  Form2.Show;
end;           

То все само собой работает.

А если я хочу создать форму из процедуры, передав ей название нужной формы:
Код: Выделить всё
procedure TForm1.CreateForm(Form:TForm; AOwnerParent:TWinControl);
begin

  Form:=TForm.Create(AOwnerParent);
  Form.Show;

end;

Код: Выделить всё
CreateForm(Form2,self); 

То я получаю новую форму, но без контролов Form2.
Почему так происходит я знаю (или думаю, что знаю) - я создаю форму Form2 с нуля, не используя класс TForm2, который создал ранее для описания свойств и контролов Form2.
А теперь вопрос.
Как мне сказать процедуре, что я хочу создать Form2 именно TForm2, а не TForm. Это надо передать через переменную, так как потом я буду создавать Form3, Form4 и т.п.

Проект: https://yadi.sk/d/drqW3NOi3MkwXN
Последний раз редактировалось wofs 10.09.2017 16:08:31, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Как передать имя класса Form в процедуру.

Сообщение vitaly_l » 10.09.2017 16:08:26

wofs писал(а):Как мне сказать процедуре, что я хочу создать Form2 именно TForm2, а не TForm. Это надо передать параметром, так как потом я буду создавать Form3, Form4 и т.п.

Код: Выделить всё
var
Form2,Form3 ... : TForm2;
begin
Form2:=TForm2.Create(self);
Form3:=TForm2.Create(self);
Form4:=TForm2.Create(self);
Form5:=TForm2.Create(self);
Form6:=TForm2.Create(self);
Form7:=TForm2.Create(self);
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3063
Зарегистрирован: 31.01.2012 16:41:41

Re: Как передать имя класса Form в процедуру.

Сообщение wofs » 10.09.2017 16:10:25

vitaly_l писал(а):var
Form2,Form3 ... : TForm2;

Немного не то... Я имел ввиду посредством этой процедуры я буду создавать и другие, заранее спроектированные формы:
Код: Выделить всё
Form2 -> TForm2
Form3 -> TForm3
Form4 -> TForm4


То есть на момент написания процедуры я не знаю имена форм и классов. Их мне ей и надо сообщить через переменные.
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Как передать имя класса Form в процедуру.

Сообщение pupsik » 10.09.2017 17:04:51

wofs теоретически:
Код: Выделить всё
procedure TForm1.MakeForm(Form:TForm; AOwnerParent:TWinControl);
begin
  Form:= (form as TForm).Create(AOwnerParent);
  Form.Show;
end;

а практически нет возможности проверить.
pupsik
энтузиаст
 
Сообщения: 1008
Зарегистрирован: 20.08.2014 16:20:13

Re: Как передать имя класса Form в процедуру.

Сообщение olegy123 » 10.09.2017 17:10:05

Код: Выделить всё
  TForm1 = class(TForm)
...
  TClassForm=class of TForm1;

function createForm(a:TClassForm):TForm1;
begin
  result:=a.Create(nil);
  result.Show;
end;


Form:= createForm(TForm1);   


Добавлено спустя 2 минуты 55 секунд:
добавлю
TClassForm=class of TForm1;
TClassForm=class of TForm2;
TClassForm=class of TForm3;
TClassForm=class of TForm4;

Form1:= createForm(TForm1);
Form2:= createForm(TForm2);
Form3:= createForm(TForm3);
Form4:= createForm(TForm4);
olegy123
энтузиаст
 
Сообщения: 719
Зарегистрирован: 25.02.2016 12:10:20

Re: Как передать имя класса Form в процедуру.

Сообщение wofs » 10.09.2017 17:47:50

pupsik писал(а):wofs теоретически:

Спасибо за попытку помочь, но ошибка при выполнении:
Код: Выделить всё
The project project1 called the 'External: SIGSEGV' exception class.


olegy123 писал(а):TClassForm=class of TForm1;

А вот с этим уже можно работать! Спасибо!
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Как передать имя класса Form в процедуру.

Сообщение pupsik » 10.09.2017 18:39:53

wofs да это не попытка (по сути глупость своротил)....
Тут можно посмотреть ещё вариант.
pupsik
энтузиаст
 
Сообщения: 1008
Зарегистрирован: 20.08.2014 16:20:13

Re: Как передать имя класса Form в процедуру.

Сообщение wofs » 10.09.2017 20:57:38

pupsik писал(а):Тут можно посмотреть ещё вариант.

Интересный подход.

Подскажите, как переопределить событие родительского класса (TForm2 например)?
К примеру
Код: Выделить всё
onShow

А то я что-то запутался :(
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Как передать имя класса Form в процедуру.

Сообщение Лекс Айрин » 11.09.2017 09:16:15

wofs писал(а):Подскажите, как переопределить событие родительского класса (TForm2 например)?


Элементарно... тот же onForm это указатель на процедуру. Присваиваешь ему новое значение и все.

Код: Выделить всё

Procedure TagsAddItems (Sender: TObject);   // ну и тело, конечно, опишешь 


AddItems:=TButton.Create(FTools);
   AddItems.AnchorParallel(AkLeft, 0, FTools);              // эти три строчки выравнивание относительно окружающих элементов
   AddItems.AnchorParallel(akRight,0,FTools);              //
   AddItems.AnchorToNeighbour(AkTop,0,SymbolView);//
   AddItems.OnClick:=@TagsAddItems;   // собственно, переопределение процедуры. В данном случае, onClick
   AddItems.Caption:=rsAddTagToList;
   AddItems.Parent:=FTools; //здесь определяется родитель

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4089
Зарегистрирован: 19.02.2013 16:54:51

Re: Как передать имя класса Form в процедуру.

Сообщение wofs » 11.09.2017 09:22:11

Лекс Айрин писал(а):AddItems.OnClick:=@TagsAddItems; // собственно, переопределение процедуры. В данном случае, onClick

Что-то подобное я пытался сделать, не получилось. И я вроде нашел свою ошибку.
Пересмотрю еще раз на свежую голову, спасибо!
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Как передать имя класса Form в процедуру.

Сообщение Лекс Айрин » 11.09.2017 10:28:14

wofs, скорее всего, напутал где-то с параметрами.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4089
Зарегистрирован: 19.02.2013 16:54:51

Re: Как передать имя класса Form в процедуру.

Сообщение wofs » 11.09.2017 10:59:43

Лекс Айрин писал(а):wofs, скорее всего, напутал где-то с параметрами.

Именно - вопрос решен, спасибо за подсказку!
Аватара пользователя
wofs
постоялец
 
Сообщения: 165
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru