Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка при динамическом создании формы


Автор: ZufuS 16.12.2006, 01:41
Сначала я объявил компоненты глобально, а форме задал тип TForm и при использовании
Код

Coef := TForm.Create(self);

Всё было хорошо. Потом появилась нужда создать для них класс и переместить их туда.
Код

type
  TCoef = class(TForm)
  ...

а создание формы я изменил на
Код

Coef := TCoef.Create(self);

Когда происходит событие, содержащее эту операцию, появляется ошибка: Resource TCoef not found.
Если TCoef наследовать не от TForm, а от TForm1(объекту этого класса и принадлежит кнопка, вызывающая создание формы Coef), то ошибки не будет.

Автор: Alexeis 16.12.2006, 12:22
ZufuS, Для создания другой формы воспользуйтесь стандартными средствами среды, тогда у вас не возникнут проблемы такого плана.
1) меню File -> New -> Form появится новая форма. Сохраните ее в отдельный модуль
2) меню Project -> Options -> Forms -> Auto-create forms выделите вашу форму и нажмите на кнопку со стрелочкой вправо, тем самым вы запретите ее автосоздание и получите тотже эффект, что и хотели, но для этой формы создастся ресурс, без которого она не могла бы запускаться.  

Автор: ZufuS 16.12.2006, 12:35
Про это мне известно. Но я пишу не для себя программу, а курсовую. Преподавателю нужно чтобы она создавалась динамически.

Автор: Alexeis 16.12.2006, 14:56
Цитата(ZufuS @  16.12.2006,  12:35 Найти цитируемый пост)
Преподавателю нужно чтобы она создавалась динамически. 

  Все верно, она и будет создаваться динамически, я же показал как ее убрать из списка автосоздаваемых форм. После запуска программы ее не будет вообще в памяти, в нужное время пишете так как вы хотели и она создастся. Ее так же можно уничтожать в произвольный момент. Не переживайте, препод именно это и имел ввиду, потому что без своего собственного ресурса форма не создастся (т.е. каждой форме должен соответствовать свой *.dfm файл, который затем превращается в ресурс экзешника), такова уж задумка авторов VCL. Все остальное будет изврат. Не думаю, что преподаватель хочет научить вас чему-то плохому.

Автор: ZufuS 16.12.2006, 15:14
Ещё он писал при закрытии формы Form2.Free. Я пишу этот метод в кнопку с ModalResult'ом равным mrOk. И при её нажатии происходит ошибка в этой строке.

Автор: Savek 16.12.2006, 16:19
Form.Free если хочешь уничтожить дочернюю форму (лучше FreeAndNil()), а если хочешь чтобы форма уничтожалась при закрытии, то в OnClose формы нужно написать

Код

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
form2:=nil;
end;

Автор: Bitter 16.12.2006, 20:38
для того, чтобы создать вот это:

 TCoef = class(TForm)

...

Coef : TCoef;

нужно написать так:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 Application.CreateForm(TForm, Coef);
 Coef.Show;
end;


и всё будет чики-чики

Автор: Golden Hands 16.12.2006, 21:34
Код

Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
...

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin

  Action:=caFree;

end;

procedure TForm2.FormDestroy(Sender: TObject);
begin

  Form2:=nil;

end;



Автор: ZufuS 17.12.2006, 00:37
Действительно достаточно было убрать из списка форм, создаваемых автоматически. Вот только когда caFree или nil пишу в закрытии формы, при втором заходе в эту форму в приложении вылезает ошибка и ругается на строку Form2.ShowModal; (в задании сказано: форма для ввода коэффициентов создается как модальная и после выполнения операции ввода закрывается с освобождением памяти (на всякий случай))

Автор: ZufuS 19.12.2006, 01:50
Создаю новую форму. Убираю из списка форм, создаваемых автоматически. Для нажатия кнопки на первой форме пишу Form2.ShowModal. Когда ее нажимаю в приложении появляется ошибка. Чего не хватает?
--
всё, разобрался, всем спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)