Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1329813740
Vasili Lubavin
2012-02-21 12:42
2013.03.22
Помогите с алгоритмом


15-1330351343
Тенерман
2012-02-27 18:02
2013.03.22
Данные -> TShiftState.


15-1351625625
Аббат Пиккола
2012-10-30 23:33
2013.03.22
Безопасность


15-1341568317
AV
2012-07-06 13:51
2013.03.22
Шкаф-кровать. Идея :)


6-1265872619
Den
2010-02-11 10:16
2013.03.22
No route to host





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский