Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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

 
мтк   (2012-05-30 16:03) [0]

Добрый день!

Есть форма "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);.

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


 
sniknik ©   (2012-05-30 16:40) [1]

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


 
Palladin ©   (2012-05-30 16:50) [2]

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


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


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


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

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


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

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


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


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


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


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

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


 
sniknik ©   (2012-05-30 17:14) [6]

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


 
Palladin ©   (2012-05-30 17:16) [7]

создавать свой реестр классов 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);


 
icWasya ©   (2012-05-31 09:30) [8]

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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.11 c
9-1193072476
lubass
2007-10-22 21:01
2013.03.22
Omega GDK 92


15-1338277495
Scott Storch
2012-05-29 11:44
2013.03.22
отображение имени файла


15-1346699148
Artem
2012-09-03 23:05
2013.03.22
Чем можно протестировать COM-соединение между Win95 и Win7?


15-1352912735
Artem
2012-11-14 21:05
2013.03.22
C mail.ru на yandex.ru можно пересылать программы?


15-1330893003
Юрий
2012-03-05 00:30
2013.03.22
С днем рождения ! 5 марта 2012 понедельник