C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Рантайм создание объекта класса-потомка TForm
Tertium
Отправлено: 20.03.2004, 21:46


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



Такой возник вопрос. Создаю в конструкторе главной формы другую форму:
CODE

m_view=new TForm(this);//m_view объявлен как TForm*
m_view->Parent=this;
m_view->Show();
...


Всё ровно. Работает и вообще.
Однако добавляю новый класс, потомок TForm.
CODE

class CView : public TForm
{
__published: // IDE-managed Components
private: // User declarations

public:  // User declarations
 __fastcall CView(TComponent* Owner);
 __fastcall ~CView();
};


Потом вместо описанного выше пишу в конструкторе формы:
CODE

m_view=new CView(this);//m_view объявлен как CView*
m_view->Parent=this;
m_view->Show();
...


Вот хрен собачий! При создании главной формы в project1.cpp:
CODE

Application->CreateForm(__classid(TForm1), &Form1);


происходит экзепшн: EResNotFound: idite k takoi-to materi!

Ну почему обязательно ей нужен dfm?! Пробовал указать соотв. прагму — естессно, он послал меня к чёрту. Ну нет такого файла! Мне он не нужен, а ему зачем? Если он от TForm объекты плодит, а от прямого его потомка — почему бы и нет?
Люди, подскажите насколько именно у меня кривые руки? В каком витке ДНК ошибка? smile.gif Заранее всем благодарен smile.gif
Pirs
Отправлено: 21.03.2004, 00:20


Дежурный стрелочник

Группа: Участник
Сообщений: 39



У меня была такая же проблема. По моему это ошибочный путь — создавать потомков TForm и затем их динамически запускать.






Asher
Отправлено: 21.03.2004, 12:38


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.

а собственно создаваемый TForm1 у тебя как описан?
Tertium
Отправлено: 21.03.2004, 12:48


Машинист паровоза

Группа: Почетный участник
Сообщений: 192



TForm1 описан самим билдером ещё в дизайн-тайме.
CODE

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------

class TForm1 : public TForm
{
__published: // IDE-managed Components
 TStatusBar *StatusBar1;
private: // User declarations
public:  // User declarations
 __fastcall TForm1(TComponent* Owner);
};


//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


а причём здесь это?
Динамически мной создаётся не он, хотя ошибка возникает при его создании аплликейшном. Видимо, билдер при создании первой формы смотрит,чо там у нас остальными в проекте, чо-то там инициализит и типа того. Ну вобщем я сам уже разобрался. Я просто создаю вформу в дизайн-тайме (Правда класс переименовать её уже не могу, ну и х... с ним). Потом убиваю глобальную переменную, а в главной фороме делаю член — указатель на класс созданной форме. Билдер рабостно виляет хвостом. И dfm есть и вообще полный улёт.

Короче, всем спасибо.

Вернуться в Вопросы программирования в C++Builder