![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание формы по имени класса и передача параметров конструктору
мтк © (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]> как можно передать параметры конструктору в приведённом примере?
в передаче параметров тут ошибки нет. ошибка в определении конструктора (подсказка - это та часть которой здесь нет).