Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Умная TForm

11
15 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
подскажите, как сделать динамическую форму таким образом что бы она сама следила за своим уничтожением ?
куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow
12K
15 октября 2007 года
__AleXX__
133 / / 02.04.2007
Использовать надо не умную форму, а умный указатель, например auto_ptr.
489
15 октября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: oxotnik333
подскажите, как сделать динамическую форму таким образом что бы она сама следила за своим уничтожением ?
куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow



Что значит сама следила за своим уничтожением?если имеется ввиду что бы при закрытии производила некоторые действия, то напиши деструктор формы.. __fastcall ~TForm#(); и соответственно его реализацию: __fastcall TForm#::~TForm#(){}.

ЗЫ: auto_ptr немного для других целей используется, и, если мне не изменяет память, для форм он не используется:-)

10K
15 октября 2007 года
FAngel
77 / / 13.09.2006
Извини, oxotnik333, ты писал:
Цитата:

куда прописать delete this;
пробовал в деструктор, говрит Stack Overflow


Я не совсем понимаю что тебе надо сделать и зачем использовать конструкцию типа delete this, но вот в чем проблема: писать delete this в конструкторе впринципе неправильно так, как конструктор вызывается только тогда, когда форма уничтожается, а delete какраз это и делает, то-есть он вызывает деструктор, который вызывает delete, который вызывает деструктор ...В общем происходит рекурсивный вызов деструктора, а отсюда и Stack Overflow. И мне почемуто кажется, что следить за удалением формы уже есть кому(ну раз вызывается деструктор, хотя могу и непонимать что ты делаеш и зачем ето тебе надо, тогда прошу прощения). Но в конструкторе писать delete this точно незя:(

309
16 октября 2007 года
el scorpio
1.1K / / 19.09.2006
Вообще не понял :(
В среде VCL все объекты, производные от TComponent удаляются "владельцем" автоматически при удалении владельца
 
Код:
// Создание объекта формы, владелец - объект Application
TMyForm *Form = new TMyForm (Application);
// или
Application->CreateForm(__classid(TForm1), &Form1);

Указатель Application обозначает глобальный объект приложения, который создаётся при запуске и удаляется после завершения. Соответственно, все окна будут удалены автоматически.

Удалять объект "из самого себя" не рекомендуется. Удалить таким образом сложный объект вообще нельзя - например, если повесить на форму кнопку "удалить", в обработчике OnClick которой прописать delete this, то получим ошибку доступа. Ведь после выполнения деструктора, программа продолжит выполнение кода с использованием уже удалённого объекта.
Форму (не главную) можно удалить только из кода другой формы. Главную форму удалять бессмысленно - ведь достаточно её просто закрыть, чтобы программа завершилась
92
16 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
имхо, это мания по поводу memory leak.... :-\
11
16 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
хм...
создаем динамически форму

TMyForm *MyForm = new TMyForm (this);
MyForm ->ShowModal();
затем что то делает в MyForm
в ней же есть возможность ее закрыть не возвращаясь в функцию которая ее вызвала, поэтому при закрытии надо удалить MyForm;

в общем то все решается на OnClose() Action=caFree;
276
16 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: oxotnik333
хм...
создаем динамически форму

TMyForm *MyForm = new TMyForm (this);
MyForm ->ShowModal();
затем что то делает в MyForm
в ней же есть возможность ее закрыть не возвращаясь в функцию которая ее вызвала, поэтому при закрытии надо удалить MyForm;

в общем то все решается на OnClose() Action=caFree;


Чтото я не пойму как модальную форму можно закрыть без возврата в функцию которая ее вызвала.
Но даже если и можно то зачем ее удалять при закрытии, тебе могут понадобится значения ее полей.
Да и вообще не культурно создавать в одном месте, а удалять в другом. Может потом боком вылезти.

11
16 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
void __fastcall TMyForm::ButtonClick(TObject *Sender)
{
Close();
}
не возвращает в вызвавшую ф-цию
276
16 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: oxotnik333
void __fastcall TMyForm::ButtonClick(TObject *Sender)
{
Close();
}
не возвращает в вызвавшую ф-цию


Интересно, не знал. Сори что надоедаю, ни делфи ни билдера нету под рукой. А куда перейдет управление после такой конструкции ???

11
16 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
прошу прощения, неправильно немного сказал

void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой
276
16 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: oxotnik333
прошу прощения, неправильно немного сказал

void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой


Жаль что негде билдер взять :(.
Мои мысли вслух:
SpeedButton1Click ето обработчик клика (или нет ?)
Он выполнится, и только потом выполнится Close();
Куда передет выполнение после завершения SpeedButton1Click

92
16 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата: oxotnik333
прошу прощения, неправильно немного сказал

void __fastcall TSmplForm::SpeedButton1Click(TObject *Sender)
{
MainForm->NewSampleClick(this);
Close();
}
вот такая конструкция не передает управление
т.е. управление на себя берет MainForm в которой до этого создалась TSmplForm.
отсюда весь и геморрой


ну дык и делай в этом обработчике (MainForm->NewSampleClick(this)) Close для TSmplForm. ведь ты Sender указываешь, вот и проверяй по нему, откуда клик пришёл.

276
16 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Тень Пса
ну дык и делай в этом обработчике (MainForm->NewSampleClick(this)) Close для TSmplForm. ведь ты Sender указываешь, вот и проверяй по нему, откуда клик пришёл.


Ето вообще сташно получается, создали форму в одном месте, уничтожыли в другом, а потом возвращаемся в метод уничтоженой формы и пробуем ее закрыть :) Жуть.
Помойму топикавтор сам себе проблему придумал, или создал плохой организацией структуры програмы.

92
16 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
что-то ты пугливый :) создали из MainForm и уничтожили в MainForm - что страшного? )
а возвращаться никто уже после Free или delete никуда не будет.

а насчет проблемы... да, какая-то она странная )) хоть бы по-человечески объяснил что вообще должно происходить, может и подскажут нормальное/другое решение.
276
16 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Тень Пса
что-то ты пугливый :) создали из MainForm и уничтожили в MainForm - что страшного? )


:) Да смотря на любой код у меня сразу возникают страхи по поводу того что мне когдато придется его переделывать. Параноя блин. :)

Цитата:
а возвращаться никто уже после Free или delete никуда не будет.


А вот тут я не понял. Возможно потому что мало с билдером роботал.
Но как я понимаю по завершении метода происходит чтото типа ret, и управление перейдет в вызывающий метод. Код етого метода единственен для всех екземпляров обекта и он всеровно есть в памяти. Ему передается this на екземпляр класса, а екземпляра то нету.
Или билдер такой умный что сможет проскочить стек вызовов методов и попадет в Application->Run() (ну или где там у него цыкл обработки сообщений, я точно не знаю).

92
16 октября 2007 года
Тень Пса
2.2K / / 19.10.2006
ну, если честно не знаю, но экспериментальным путём (за извращённость подхода не пинать, я после работы как никак ))) весь уставший и уже отдыхающий ;)):
Код:
TForm1 *Form1;
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();
}
создаётся форма Form1, она по кнопке Button1 создаёт свою копию (на самом деле без разницы, копию себя или нет), соотвессна Form1 устанавливаем как Owner для Form2 (копия).
в Form2 по кнопке Button2 обращение к Owner, и нажатие Button1 на Owner'e :))))) удаляется на ура! =) и никаких ошибок.
11
17 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
прошу прощения что вмешиваюсь...
я разобрался с проблемой о чем было сообщено в посте от 16.09.07 11:28
ежели так волнует вопрос куда передается управление после Клозе() можете поэксперементировать.
у меня однозначно не передается в ту ф-ю которая вызвала форму, иначе бы не создавал тему
276
17 октября 2007 года
Rebbit
1.1K / / 01.08.2005
сегодня вечером ставлю дома билдер. Самому интересно стало. :)
11
17 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
простите меня :)))
она возвращает в вызвавшую функцию, просто у меня лихо накручено было, и я не дождался возврата :)))
276
17 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: oxotnik333
простите меня :)))
она возвращает в вызвавшую функцию, просто у меня лихо накручено было, и я не дождался возврата :)))


Вот и чудненько, можна не инсталить.
А то я уже начал верить в сверхестественные возможности компонент VCL :)

Тень Пса Я невнимательно прочел ваш пост. Я думал что вы предлагаете удалять в NewSampleClick, а потом закрывать.
Но я всеровно несогласен с такой организацией роботы с компонентом.
Хорошо что работает, но удалять обект до завершения его методов на мой взгляд рисковано и неправильно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог