Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизСоздание формы по имени класса и передача параметров конструктору Найти похожие ветки
← →
мтк (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.063 c