Умная TForm
куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow
куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow
Что значит сама следила за своим уничтожением?если имеется ввиду что бы при закрытии производила некоторые действия, то напиши деструктор формы.. __fastcall ~TForm#(); и соответственно его реализацию: __fastcall TForm#::~TForm#(){}.
ЗЫ: auto_ptr немного для других целей используется, и, если мне не изменяет память, для форм он не используется:-)
куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow
Я не совсем понимаю что тебе надо сделать и зачем использовать конструкцию типа delete this, но вот в чем проблема: писать delete this в конструкторе впринципе неправильно так, как конструктор вызывается только тогда, когда форма уничтожается, а delete какраз это и делает, то-есть он вызывает деструктор, который вызывает delete, который вызывает деструктор ...В общем происходит рекурсивный вызов деструктора, а отсюда и Stack Overflow. И мне почемуто кажется, что следить за удалением формы уже есть кому(ну раз вызывается деструктор, хотя могу и непонимать что ты делаеш и зачем ето тебе надо, тогда прошу прощения). Но в конструкторе писать delete this точно незя:(
В среде VCL все объекты, производные от TComponent удаляются "владельцем" автоматически при удалении владельца
TMyForm *Form = new TMyForm (Application);
// или
Application->CreateForm(__classid(TForm1), &Form1);
Указатель Application обозначает глобальный объект приложения, который создаётся при запуске и удаляется после завершения. Соответственно, все окна будут удалены автоматически.
Удалять объект "из самого себя" не рекомендуется. Удалить таким образом сложный объект вообще нельзя - например, если повесить на форму кнопку "удалить", в обработчике OnClick которой прописать delete this, то получим ошибку доступа. Ведь после выполнения деструктора, программа продолжит выполнение кода с использованием уже удалённого объекта.
Форму (не главную) можно удалить только из кода другой формы. Главную форму удалять бессмысленно - ведь достаточно её просто закрыть, чтобы программа завершилась
создаем динамически форму
TMyForm *MyForm = new TMyForm (this);
MyForm ->ShowModal();
затем что то делает в MyForm
в ней же есть возможность ее закрыть не возвращаясь в функцию которая ее вызвала, поэтому при закрытии надо удалить MyForm;
в общем то все решается на OnClose() Action=caFree;
создаем динамически форму
TMyForm *MyForm = new TMyForm (this);
MyForm ->ShowModal();
затем что то делает в MyForm
в ней же есть возможность ее закрыть не возвращаясь в функцию которая ее вызвала, поэтому при закрытии надо удалить MyForm;
в общем то все решается на OnClose() Action=caFree;
Чтото я не пойму как модальную форму можно закрыть без возврата в функцию которая ее вызвала.
Но даже если и можно то зачем ее удалять при закрытии, тебе могут понадобится значения ее полей.
Да и вообще не культурно создавать в одном месте, а удалять в другом. Может потом боком вылезти.
{
Close();
}
не возвращает в вызвавшую ф-цию
{
Close();
}
не возвращает в вызвавшую ф-цию
Интересно, не знал. Сори что надоедаю, ни делфи ни билдера нету под рукой. А куда перейдет управление после такой конструкции ???
void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой
void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой
Жаль что негде билдер взять :(.
Мои мысли вслух:
SpeedButton1Click ето обработчик клика (или нет ?)
Он выполнится, и только потом выполнится Close();
Куда передет выполнение после завершения SpeedButton1Click
void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой
ну дык и делай в этом обработчике (MainForm->NewSampleClick(this)) Close для TSmplForm. ведь ты Sender указываешь, вот и проверяй по нему, откуда клик пришёл.
Ето вообще сташно получается, создали форму в одном месте, уничтожыли в другом, а потом возвращаемся в метод уничтоженой формы и пробуем ее закрыть :) Жуть.
Помойму топикавтор сам себе проблему придумал, или создал плохой организацией структуры програмы.
а возвращаться никто уже после Free или delete никуда не будет.
а насчет проблемы... да, какая-то она странная )) хоть бы по-человечески объяснил что вообще должно происходить, может и подскажут нормальное/другое решение.
:) Да смотря на любой код у меня сразу возникают страхи по поводу того что мне когдато придется его переделывать. Параноя блин. :)
А вот тут я не понял. Возможно потому что мало с билдером роботал.
Но как я понимаю по завершении метода происходит чтото типа ret, и управление перейдет в вызывающий метод. Код етого метода единственен для всех екземпляров обекта и он всеровно есть в памяти. Ему передается this на екземпляр класса, а екземпляра то нету.
Или билдер такой умный что сможет проскочить стек вызовов методов и попадет в Application->Run() (ну или где там у него цыкл обработки сообщений, я точно не знаю).
TForm1 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Form2 = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Form2 == NULL)
{
Form2 = new TForm1(this);
Form2->Name = "testNew";
( (TButton*)(Form2->FindComponent("Button2")) )->OnClick = ButtonClick;
Form2->Left = Form1->Left + 50;
Form2->Top = Form1->Top + 50;
Form2->Show();
}
else
{
Form2->Hide();
delete Form2;
Form2 = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject* Sender)
{
((TButton*)( ((TButton*)Sender)->Owner->FindComponent("Button1") ))->Click();
}
в Form2 по кнопке Button2 обращение к Owner, и нажатие Button1 на Owner'e :))))) удаляется на ура! =) и никаких ошибок.
я разобрался с проблемой о чем было сообщено в посте от 16.09.07 11:28
ежели так волнует вопрос куда передается управление после Клозе() можете поэксперементировать.
у меня однозначно не передается в ту ф-ю которая вызвала форму, иначе бы не создавал тему
она возвращает в вызвавшую функцию, просто у меня лихо накручено было, и я не дождался возврата :)))
она возвращает в вызвавшую функцию, просто у меня лихо накручено было, и я не дождался возврата :)))
Вот и чудненько, можна не инсталить.
А то я уже начал верить в сверхестественные возможности компонент VCL :)
Тень Пса Я невнимательно прочел ваш пост. Я думал что вы предлагаете удалять в NewSampleClick, а потом закрывать.
Но я всеровно несогласен с такой организацией роботы с компонентом.
Хорошо что работает, но удалять обект до завершения его методов на мой взгляд рисковано и неправильно.