Создание формы во время выполнения
От: lsv  
Дата: 20.04.05 06:20
Оценка:
Создаю форму во время выполнения программы, вот код:
class TMyForm : public TForm
{
public:
  virtual __fastcall TMyForm();
};
__fastcall TMyForm::TMyForm() : TForm(Application)
{
}
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
TMyForm *Form;

  Form = new TMyForm();  // Здесь вылетает ошибка
  delete Form;
}

В момент создания формы вылетает ошибка "Project Test.exe raised exception class EResNotFound with message 'Resource TMyForm not found'. Process stopped. Use Step or Run to continue."
Чего я еще не сделал?
Re: Создание формы во время выполнения
От: Владик Россия  
Дата: 20.04.05 06:47
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Чего я еще не сделал?


Не создал dfm с TMyForm.
Как все запущенно...
Re[2]: Создание формы во время выполнения
От: lsv  
Дата: 20.04.05 06:56
Оценка:
Здравствуйте, Владик, Вы писали:
В>Не создал dfm с TMyForm.

Я не создавал форму в дизайн режиме, поэтому у меня нет такого файла. Мне нужно просто создать форму.
Re[3]: Создание формы во время выполнения
От: Владик Россия  
Дата: 20.04.05 07:01
Оценка: +1
Здравствуйте, lsv, Вы писали:

lsv>Я не создавал форму в дизайн режиме, поэтому у меня нет такого файла. Мне нужно просто создать форму.


Форма (TForm) подразумевает наличие dfm. Без вариантов. Возможно можно ей подсунуть какой-нибудь TStream* из которого она будет сериализоваться, но проще забабахать пустой dfm, чем ковыряться в потрохах VCL, честное слово.
Как все запущенно...
Re[4]: Создание формы во время выполнения
От: lsv  
Дата: 20.04.05 07:13
Оценка:
Здравствуйте, Владик, Вы писали:
В>Форма (TForm) подразумевает наличие dfm. Без вариантов. Возможно можно ей подсунуть какой-нибудь TStream* из которого она будет сериализоваться, но проще забабахать пустой dfm, чем ковыряться в потрохах VCL, честное слово.

Было бы интересно узнать, а как это сделать?
Re[4]: Создание формы во время выполнения
От: ak_miass Россия  
Дата: 20.04.05 08:27
Оценка:
Здравствуйте, Владик, Вы писали:


В>Форма (TForm) подразумевает наличие dfm. Без вариантов.

Как раз именно TForm и не подразумевает (см. ниже).


В>проще забабахать пустой dfm, чем ковыряться в потрохах VCL, честное слово.

А чё там ковыряться то? Вот:


constructor TCustomForm.Create(AOwner: TComponent);
begin
  GlobalNameSpace.BeginWrite;
  try
    CreateNew(AOwner);
    if (ClassType <> TForm {т.е. для TForm сработает}) and not (csDesigning in ComponentState) then
    begin
      Include(FFormState, fsCreating);
      try
        if not InitInheritedComponent(Self, TForm) then
          raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);//Вот тут и вылетает
      finally
        Exclude(FFormState, fsCreating);
      end;
      if OldCreateOrder then DoCreate;
    end;
  finally
    GlobalNameSpace.EndWrite;
  end;
end;


Сам только что проверял, вот так работает:

TForm *F = new TForm(Application);
F->Show();


И ещё. Если интересно, можно заглянуть в Dialogs.pas, там как раз формы без всяких DFM создаются.
Re[5]: Создание формы во время выполнения
От: lsv  
Дата: 20.04.05 09:12
Оценка:
Здравствуйте, ak_miass, Вы писали:

_>Здравствуйте, Владик, Вы писали:

_>Сам только что проверял, вот так работает:
_>
_>TForm *F = new TForm(Application);
F->>Show();
_>

_>И ещё. Если интересно, можно заглянуть в Dialogs.pas, там как раз формы без всяких DFM создаются.

Данный случай работает, это-то понятно. Но мне нужно сделать свой класс, унаследованный от TForm.
Мне это нужно для того, чтобы вставить обработку сообщения, пример:
  BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(MY_MSG, TMessage, SendFun);
  END_MESSAGE_MAP(TForm);

Попытка решить эту задачу и привела к этой проблеме.
Re[6]: Создание формы во время выполнения
От: ak_miass Россия  
Дата: 20.04.05 09:24
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Данный случай работает, это-то понятно. Но мне нужно сделать свой класс, унаследованный от TForm.


Там в Dialogs.pas в функции по моему ShowMessage у них создаётся экземпляр наследника от TForm, т.е. не только TForm можно. (подробно не смотрел)
Re[4]: Создание формы во время выполнения
От: Demiurg  
Дата: 20.04.05 09:29
Оценка: +1
Здравствуйте, Владик, Вы писали:

lsv>>Я не создавал форму в дизайн режиме, поэтому у меня нет такого файла. Мне нужно просто создать форму.


В>Форма (TForm) подразумевает наличие dfm. Без вариантов. Возможно можно ей подсунуть какой-нибудь TStream* из которого она будет сериализоваться, но проще забабахать пустой dfm, чем ковыряться в потрохах VCL, честное слово.


Ну да?? Интересно, я, оказывается, иногда делал невозможное!
... << RSDN@Home 1.1.4 beta 4 358, 1994 — Titanik>>
Re[6]: Создание формы во время выполнения
От: ak_miass Россия  
Дата: 20.04.05 09:33
Оценка:
Здравствуйте, lsv, Вы писали:

И ещё, если нужно только ловить сообщения, то можно просто подменить свойство WindowProc, не забыв естественно вызывать старый метод.

Сам так иногда делаю, когда лень наследовать какой нибудь компонент.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.