Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание и удаление объектов 
:(
    Опции темы
Бегемот
Дата 30.1.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



<- 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.
PM MAIL   Вверх
Werti
Дата 31.1.2005, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 22.5.2004

Репутация: нет
Всего: 1



Цитата(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() убивает объект а у тебя нуно перекинуть код в созданый дин объект то есть присвоить ему выполнение кода.
PM MAIL   Вверх
Vyacheslav
Дата 31.1.2005, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



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


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();
}









--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Бегемот
Дата 5.2.2005, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 12.5.2004
Где: Москва

Репутация: нет
Всего: 10



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

Код

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


удаляешь delete ом обычным и всего делов
PM MAIL WWW ICQ   Вверх
Nicky
Дата 10.2.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 18.12.2004
Где: Кишинёв

Репутация: 1
Всего: 1



Спосибо! Это один из самых оптимальных вариантов! smile
Но всёже ограничиваться только этим не стоит...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.