![]() |
|
![]() ![]() ![]() |
|
act_naturally |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
Доброго дня!
Нахожусь в небольшом тупике. Есть приложение в котором у главного окна (MainForm) в процессе работы создаётся много дочерних форм. Все они разных типов, наследующих от TForm. По нажатию кнопки все открытые дочерние окна должны быть закрыты (с этим проблем нет MainForm->MDIChildren[i]->Close()) Но так же нужно создать окна этих же типов заново! То есть нужно перебирать открытые окна, закрывать каждое и открывать(создавать) такое же (так как необходимо, чтобы отработали заново конструктор и FormCreate()) Возможно ли решить проблему не влезая в классы дочерних окон и не создавая конструктор копирования? Приведёт ли к решению CreateWindow? пока что функция возвращает ошибку: незарегистрированное имя класса, которое я беру из MainForm->MDIChildren[i]->ClassName(). Спасибо!) |
|||
|
||||
Platov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Посмотрите как BCB создает окна при старте.
|
|||
|
||||
act_naturally |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
Спасибо за скорый ответ!
У меня есть только указатель на дочернее окно MainForm->MDIChildren[i] типа TForm*, каким образом выполнить конструктор нужного класса формы, ведь дети могут быть разнообразных классов? А FormCreate() у TForm - закрытый метод. Было бы здорово, но __classid(<тип>), увы, опять же принимает на вход тип. А я могу достать только имя типа в процессе выполнения.. Как достать id класса без конструкции __classid(<тип>) - пока не пойму. Ещё, конечно, смущает документация: "Do not call CreateForm in an application. C++Builder’s module manager calls CreateForm internally to register the applet objects with the applet application." ![]() |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
![]() |
||||||
|
|||||||
act_naturally |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
xvr,
СПАСИБО! Наконец-то дошло, что MainForm->MDIChildren[i]->ClassType() - можно использовать вместо всего выражения __classid(<тип>). Итак, теперь у меня такой код:
В итоге, сначала отрабатывает конструктор от TForm, а потом функция FormCreate от MDIChildren[i]->ClassType(). Как же добиться того, чтобы и конструктор отрабатывал от нужного класса!? Ведь в коде я ещё не знаю, какой у дочернего окна будет тип, поэтому и создаю указатель типа TForm и передаю этот указатель в функцию CreateForm. |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
||||
|
|||||
act_naturally |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
xvr,
ещё одна попытка (если, допустим, я заранее знаю, что тип будет TfrmMyList):
тогда:
Срабатывает только ShowMessage("TBaseForm"), то есть конструктор TfrmMyList не запускается :( В документации забавно написано: "void __fastcall CreateForm(System::TMetaClass* InstanceClass, void *Reference); Description: CreateForm creates a new form of the type specified by the FormClass parameter and assigns it to the variable given by the Reference parameter. The owner of the new form is the Application object. " При этом параметра FormClass в документации у функции не указано. Интуитивно, хотелось бы, чтобы создавалась форма типа InstanceClass, но, судя по примеру, хм, не понимаю, что, "судя по примеру"... Отрабатывает только родительский конструктор :( Это сообщение отредактировал(а) act_naturally - 5.10.2010, 15:30 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Попробуйте перегрузить и второй конструктор (с 2м целым параметром Dummy), IMHO именно он вызывается в CreateForm
![]() |
|||
|
||||
act_naturally |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
Моя ошибка! Надо было здесь в примере сразу указать, что в конструкторе TfrmMyList(TComponent* Owner) есть ещё второй параметр, со значением по умолчанию ( т.е.
Это-таки принципиально, и если убрать параметр по умолчанию, то, действительно, конструктор вызывается. Жаль. Получается, что решения пока что найти не могу, и каждый конструктор типа дочернего окна, заявленный как конструктор с несколькими параметрами, отрабатывать не будет. Спасибо за помощь! |
|||
|
||||
act_naturally |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 10.4.2007 Репутация: нет Всего: нет |
Понятно теперь, что общего решения нет из-за непредсказуемости аргументов в конструкторах дочерних форм.
Остаётся один путь - создавать новые дочерние формы перебором по всем возможным типам. ![]() ![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |