Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание формы по имени класса и передача параметров конструктору


мтк ©   (2012-05-30 16:03:00) 

Добрый день!

Есть форма "Form1", у неё есть конструктор:

constructor Create(AOwner: TComponent; Par1: Boolean = False);
...
constructor TForm1.Create(AOwner: TComponent; Par1: Boolean);
Begin
 Inherited Create(AOwner);
...
End;


Из другой формы Form2 создаю первую:
((TFormClass(FindClass(frmName))).Create(Self)).Show;
Форма создаётся и работает.

Но мне надо ещё передать параметры конструктору. Если пишу так:
((TForm1(FindClass(frmName))).Create(Self, True)).Show;

Появляется ошибка AV на Inherited Create(AOwner);.

Помогите, пожалуйста, как можно передать параметры конструктору в приведённом примере?


мтк   (2012-05-31 12:17:00) [1]

sniknik, понял )), спасибо.

Сделал первым и вторым способом, всё отлично работает.

sniknik, Palladin и icWasya всем большое спасибо!


icWasya   (2012-05-31 09:30:00) [2]

>Palladin ©   (30.05.12 17:16) [7]
>... а общего родителя для твоих форм с эти особенным конструктором Create(AOwner: TComponent; Par1: Boolean); ...
И не забыть, что этот новый конструктор должен быть виртуальным.
Кроме того, что бы не путаться, конструктор назовите как-нибудь по другому.


Palladin   (2012-05-30 17:16:00) [3]

создавать свой реестр классов TForm1Class = class of TForm1
ну по сути не TForm1, а общего родителя для твоих форм с эти особенным конструктором Create(AOwner: TComponent; Par1: Boolean);

procedure myRegister(const frmName: String; frmClass: TForm1Class);
begin
 какойтоStringList.AddObject(frmName, TObject(frmClass));
end;

function myFind(const frmName: String): TForm1Class;
var
 n: Integer;
begin
 n := какойтоStringList.indexOf(frmName);
 if n = -1 then
   Result := nil
 else
   Result := TForm1Class(какойтоStringList.Items.Object[n]);
end;

myRegister('myForm', TForm1);
...

aFrmClass := myFind('myForm');
if aFrmClass = nil then
 raise Exception.Create('myForm class not registered');
theFrm := aFrmClass.Create(Owner, Par1);


sniknik   (2012-05-30 17:14:00) [4]

p.s. о чем тебе говорит компилятор, подсказка в нем?... и что для тебя значит слово override например? (хрень на которую можно забить? похоже)


sniknik   (2012-05-30 17:11:00) [5]

> убрал и другую часть. Оставил только:
???
- машина не едет!
- у вас ошибка в двигателе. бензина нет...
- убрал двигатель. результат тот же.


мтк   (2012-05-30 17:04:00) [6]


> TForm1(FindClass(frmName)) так писать нельзя, фактически
> тебе возвращается class of TPersistent , а ты насильно его
> приводишь к TForm1


а как тогда можно добраться до конструктора?


мтк   (2012-05-30 17:01:00) [7]


> в передаче параметров тут ошибки нет. ошибка в определении
> конструктора (подсказка - это та часть которой здесь нет).


убрал и другую часть. Оставил только:

constructor TForm1.Create(AOwner: TComponent; Par1: Boolean);
Begin
Inherited Create(AOwner);
End;


процедуры create и show тоже пустые.

Результат остался тот же :(


Palladin   (2012-05-30 16:50:00) [8]

TForm1(FindClass(frmName)) так писать нельзя, фактически тебе возвращается class of TPersistent , а ты насильно его приводишь к TForm1


sniknik   (2012-05-30 16:40:00) [9]

> как можно передать параметры конструктору в приведённом примере?
в передаче параметров тут ошибки нет. ошибка в определении конструктора (подсказка - это та часть которой здесь нет).


Наверх

Титульная страница Поиск, карта сайта Написать письмо