Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Динамическое создание и удаление объектов


Автор: Бегемот 30.1.2005, 14:52
<- Borland C++ Builder ->
Есть форма Form1.
На ней кнопка Button1.
При нажатии на Button1 динамически создаю форму MyForm, а на MyForm динамически
создаю кнопку MyButton
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TForm *MyForm = new TForm(this);
 MyForm->Parent = this;
 TButton *MyButton = new TButton(this);
 MyButton->Parent = MyForm;
}

Подскажите, плз, как обработать событие OnClick для MyButton ,по которому произойдёт закрытие MyForm и освобождение выделенной памяти под объекты MyForm и MyButton.

Автор: Werti 31.1.2005, 01:15
Цитата(rewerew @ 30.1.2005, 14:52)
<- Borland C++ Builder ->
Есть форма Form1.
На ней кнопка Button1.
При нажатии на Button1 динамически создаю форму MyForm, а на MyForm динамически
создаю кнопку MyButton
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TForm *MyForm = new TForm(this);
 MyForm->Parent = this;
 TButton *MyButton = new TButton(this);
 MyButton->Parent = MyForm;
}

Подскажите, плз, как обработать событие OnClick для MyButton ,по которому произойдёт закрытие MyForm и освобождение выделенной памяти под объекты MyForm и MyButton.

->Free() убивает объект а у тебя нуно перекинуть код в созданый дин объект то есть присвоить ему выполнение кода.

Автор: Vyacheslav 31.1.2005, 11:04
Короче говоря поступаем в стиле "Сначала создаем трудности, а затем их героически преодолеваем
Ну да ладно. Это твои проблемы. Сам напросился
Код


void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TForm *MyForm = new TForm(this);
MyForm->Parent = this;
MyForm->Visible = true;
TButton *MyButton = new TButton(this);
MyButton->Parent = MyForm;
MyButton->OnClick = MyButtonClick;
}

void __fastcall TForm1::MyButtonClick(TObject *Sender)
{
     TButton* MyButton = dynamic_cast<TButton*>(Sender);
     if (MyButton)
     {
              if (MyButton->Parent) delete MyButton->Parent;
     }    
}

При этом кнопка останется жива до закрытия основной формы.
И возникает вопрос, ну нафига так варварски использовать VC
К тому же ты определенно поулучишь скорее всего Abstract Error

Почему просто не создать еще одну форму с кнопкой. Указать в опциях что эта форма создается динамически. Задать обрабочик OnClose для этой формы
Код

void __fastcall TMyForm::MyFormClose(TObject *Sender. TCloseAction &Action)
{
  Action = caFree;
}


И тихо и мирно написать одну строку

Код


void __fastcall TForm1::Button1Click(TObject *Sender)
{
 (new TMyForm(this)) ->Show();
// или (new TMyForm(this)) ->ShowModal();
}







Автор: Бегемот 5.2.2005, 01:00
Для чего вообще я напросился…
У меня в программе четыре формы. Одна форма, назовём её рабочей, должна быть постоянно отображена на экране, а с её закрытием происходит закрытие приложения. Остальные три формы (пусть будут дополнительными) вызываются по ходу выполнения программы и так же закрываются.(окно “О программе ” и т.п ). Так как потребность в дополнительных формах возникает редко, я решил подключить их динамически, а по мере их ненадобности высвобождать выделенную под них, и всё, что находится на них, память. Стоит ли вообще это делать? Оправдан ли такой способ? В чём плюсы и минусы? Напишите, пожалуйста! Или дайте ссылку.
И ещё…
Напиши, пожалуйста, где именно в опциях указать что эта форма создается динамически.
СПАСИБО.

Автор: Конструктор 6.2.2005, 22:21
Чтобы добиться того что тебе нужно вовсе не обязательно создавать все компоненты формы динамически, ты просто создаешь в Билдере форму как и любую другую, работаешь с ней как и с любой другой формой. В опциях проекта Project->Options->Forms оставляешь в списке автоматически создаваемых форм свою главную форму (auto create forms), а остальные убираешь оттуда. Когда тебе нужно создать форму пишешь

Код

Application->CreateForm(__classid(TИмяТвоейФормы), &ИмяТвоейФормы);
ИмяТвоейФормы->Visible = true;


удаляешь delete ом обычным и всего делов

Автор: Nicky 10.2.2005, 19:18
Спосибо! Это один из самых оптимальных вариантов! smile
Но всёже ограничиваться только этим не стоит...

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