ShowModal ?
+++++++++==========++++++++++
Проблема такова:
ситуация -
Form1 = new TForm1(Application)
................
Form1->ShowModal();
................
Form1->Close();
delete Form1; // пока всё ОК
// и снова - - - - -
Form1 = new TForm1(Application)
................
Form1->ShowModal();
................
Form1->Close();
delete Form1;
// но второй delete выдёт - Error: (примерно) Variant array is not avaliable - что-то типа того
please - help me !!
Я предлагаю создание формы делать так:
Application->CreateForm(__classid(TForm2),
&Form2);
Уничтожение так:
delete Form2;
или
Form2->~TForm2();
Только имей в виду, что если ты без проверки на существование будешь уничтожать, программа вылетит.
вообще-то странно - вроде все правильно. ошибка должна вылетать если форма уничтожена до delete, хотя эта ошибка обычно просто из-за обращения в пустую область памяти и про вариант там ничего не должно быть. а в OnClose ты ее случайно не уничтожаешь?
и что мне делиты ставить перед закрытием формы в обоих случаях ??
просто если в OnClose написать Action = caFree, то при закрытии формы автоматически вызывается деструктор и память из под объекта освобождается и delete писать не надо...
а ошибка если точно говорить такая:
"Project noname.exe raised exception class TVariantError with message "Variant is not an array". Process stopped. Use Step or Run to continue."
__________
с ув. Данилов ЮВ
ошибка какая-то странная... но скорее всего именно из-за этого - нельзя использовать одновременно caFree и delete - они делают одно и тоже - удаляют объект и освобождают память. поэтому delete после закрытия формы обращается в пустое место - убери его.
а то мне просто кажется new всегда должен deletе'ом уничтожаться... :-?
_______________
Данилов ЮВ
TForm1 - та форма которую ты хочешь вызвать из MAIN
так вот делаешь следующеее
в Form1.cpp удаляешь TForm1* TForm1;
в Form1.h удаляешь extern PACKAGE TForm1* Form1;
в MAIN.cpp добавляешь
#include <memory>
#include <Form1.h>
и после объевления TMAIN* MAIN;
добавляшь using namespace std;
Теперь там где тебе необходимо вызвать свою форму
пишешь
const auto_ptr<TForm1> Form1(new TForm1(0));
Form1->ShowModal();
auto_ptr - это шаблон класса, который представляет собой эффективно управлять памятью для VCL объектов.
После закрытия формы или аварийного закрытия auto_ptr автоматически ее удалит.
Внутри Form1 ссылка на ее свойства осуществляется так TForm1::Resize();
Слушай, ты форму к проекту подключаешь правильно?
1. Папочка с плюсиком.
2. И добавить заголовочный файл (находится)
в Files.
Что касается caFree, его правильно вызывать так:
Form2->Action = (TBasicAction*)caFree;
Причём это абсолютный аналог delete
создавать и разрушать форму можно
// или так:
//------------------------------------------------------
Application->CreateForm(__classid(TForm2), &Form2);
Form2->ShowModal();
// Расскомментируй тут и программа будет вылетать.
// Form2->Close();
delete Form2;
//------------------------------------------------------
// или так:
//------------------------------------------------------
// Form2 = new TForm2(Application);
// Form2->ShowModal();
// delete Form2;
//------------------------------------------------------
Что же касается твоей ошибки, мне её смоделировать не удалось.
Кидаю тебе скрученный проект, (не знаю он
перешлётся или нет) посмотри на досуге.
[C++ Error] Edit1.cpp(87): E2315 'ShowModal' is not a member of 'TAboutBox', because the type is not yet defined
[C++ Error] Edit1.cpp(88): E2315 'Free' is not a member of 'TAboutBox', because the type is not yet defined
В чём проблемма не могу понять!?!
Всё вроде правильно, или я что-то ещё не сделал?
Такой вот текст программки:
void __fastcall TForm1::SpeedButton9Click(TObject *Sender)
{
Application->CreateForm(__classid(TAboutBox), &AboutBox);
AboutBox->ShowModal();
AboutBox->Free();
}
Цитата:
Originally posted by Кузнец
У меня тут проблемка. Решил попрограммить в билдере и в процессе изучения столкнулся со следующей проблеммой. Когда начинаю коппилировать - выскакивает ошибка:
[C++ Error] Edit1.cpp(87): E2315 'ShowModal' is not a member of 'TAboutBox', because the type is not yet defined
[C++ Error] Edit1.cpp(88): E2315 'Free' is not a member of 'TAboutBox', because the type is not yet defined
В чём проблемма не могу понять!?!
Всё вроде правильно, или я что-то ещё не сделал?
Такой вот текст программки:
void __fastcall TForm1::SpeedButton9Click(TObject *Sender)
{
Application->CreateForm(__classid(TAboutBox), &AboutBox);
AboutBox->ShowModal();
AboutBox->Free();
}
У меня тут проблемка. Решил попрограммить в билдере и в процессе изучения столкнулся со следующей проблеммой. Когда начинаю коппилировать - выскакивает ошибка:
[C++ Error] Edit1.cpp(87): E2315 'ShowModal' is not a member of 'TAboutBox', because the type is not yet defined
[C++ Error] Edit1.cpp(88): E2315 'Free' is not a member of 'TAboutBox', because the type is not yet defined
В чём проблемма не могу понять!?!
Всё вроде правильно, или я что-то ещё не сделал?
Такой вот текст программки:
void __fastcall TForm1::SpeedButton9Click(TObject *Sender)
{
Application->CreateForm(__classid(TAboutBox), &AboutBox);
AboutBox->ShowModal();
AboutBox->Free();
}
Хм. А класс - TAboutBox - он нормально определен и объявлен? Наследует от формы? Ты получаешь такое сообщение так как такой тип отсутствует - естественно ты не можешь обратится к его методам.
Цитата:
Originally posted by kot_
Хм. А класс - TAboutBox - он нормально определен и объявлен? Наследует от формы? Ты получаешь такое сообщение так как такой тип отсутствует - естественно ты не можешь обратится к его методам.
Хм. А класс - TAboutBox - он нормально определен и объявлен? Наследует от формы? Ты получаешь такое сообщение так как такой тип отсутствует - естественно ты не можешь обратится к его методам.
Да вот я и не знаю как именно это делается. Единственно, что я вставил - это строчку:
USEFORM("Unit1.cpp", AboutBox)
и всё. А что ещё нужно, я не знаю. Мне только надо одну прогу написать. А то PHP как-то неудобно использовать. Вот 2-й день пытаюсь программить в билдере. Заранее спасибо!
Цитата:
Originally posted by Кузнец
Да вот я и не знаю как именно это делается. Единственно, что я вставил - это строчку:
USEFORM("Unit1.cpp", AboutBox)
и всё. А что ещё нужно, я не знаю. Мне только надо одну прогу написать. А то PHP как-то неудобно использовать. Вот 2-й день пытаюсь программить в билдере. Заранее спасибо!
Да вот я и не знаю как именно это делается. Единственно, что я вставил - это строчку:
USEFORM("Unit1.cpp", AboutBox)
и всё. А что ещё нужно, я не знаю. Мне только надо одну прогу написать. А то PHP как-то неудобно использовать. Вот 2-й день пытаюсь программить в билдере. Заранее спасибо!
Для начала тебе нужно создать класс этой формы, для того чт бы его использовать. И не забыть подключить заголовочный файл.