13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
1

Закрытие формы (динамической)

07.10.2012, 17:51. Показов 4206. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. В общем создал динамическую форму, создал в ней все нужные мне компоненты. Так же создал там и кнопку закрытия. Собственно вопрос, мне получается надо отследить нажатие этой самой кнопки, и если её нажали, то удалить эту динамич. форму. Кроме этого у меня как-то ничего не идет
C++
1
2
 if (NewButtonClick(this))
        delete(NewForm);
Этот код неполный, как его можно доработать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2012, 17:51
Ответы с готовыми решениями:

Закрытие формы
Всем привет. Работаю в CB6. Вопрос следующий. У меня приложение состоит из 130 форм....

закрытие формы
всем привет! я новичек в C++ Builder , подскажите как запретить закрытие формы или убрать значек...

Закрытие формы
Плз.. помогите.. я немного.. (ладно я очень) ламер в С++ билдере.. хочу сделать так , чтобы форма...

Закрытие формы
Возможно ли сделать красивое закрытие формы? например: как выключается телевизор( то есть все...

33
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 18:02 2
Цитата Сообщение от Frizar Посмотреть сообщение
мне получается надо отследить нажатие этой самой кнопки, и если её нажали, то удалить эту динамич. форму.
А обработчик клика на кнопке прописал? В нем и освобождай память.
1
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 18:24  [ТС] 3
Мммм....так кнопка создается динамически, как мне в ней обработчик написать? Это мне надо самому прописывать что-то вроде void __fastcall TForm1::Button1Click(TObject *Sender) ?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 18:42 4
Совершенно верно. Пишешь метод, а потом привязываешь его к кнопке:
C++
1
form->button->OnClick = &Button1Click;
1
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 18:57  [ТС] 5
Так, ну отсюда тогда вытекает вопрос, как правильно метод написать? Я написал так, но это вроде как полнейший бред:
C++
1
2
3
4
void __fastcall ButclClick(TObject *Sender);
{ NewForm->Butcl->OnClick =&ButClClick;
 delete(NewForm);
}
Динамическая форма называется NewForm, кнопка закрытия ButCl.
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 19:02 6
Вот это:
C++
1
 Butcl->OnClick =&ButClClick;
надо писать там, где динамически создается эта самая кнопка. В конструкторе класса этой формы это обычно делается.
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
07.10.2012, 19:03 7
Чот ты перемудрил.

C++
1
2
3
4
void __fastcall NewForm::FormClose(TObject *Sender, TCloseAction &Action)
{
 Action = caFree;
}
И все....
0
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 19:18  [ТС] 8
Цитата Сообщение от _Dimon_ Посмотреть сообщение

C++
1
2
3
4
void __fastcall NewForm::FormClose(TObject *Sender, TCloseAction &Action) // на это ругается
{
 Action = caFree;
}
Вставляю этот код и вылезает 2 ошибки:
[C++ Error] Unit1.cpp(417): E2090 Qualifier 'NewForm' is not a class or namespace name
[C++ Error] Unit1.cpp(417): E2040 Declaration terminated incorrectly

мб это связано как-то, что я создаю форму и компоненты через new ?
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
07.10.2012, 19:44 9
Как форму создаешь? Приведи код.
0
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 20:01  [ТС] 10
C++
1
TForm *NewForm; // объявляю в глобальных
C++
1
2
NewForm = new TForm(Application); // это в обработчике события ( на кнопке одной)
... // дальше я там всякие св-ва форме ставлю
Мне надо разобраться, чтобы форма по кнопке удалялась...
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 20:55 11
Вот простой примерчик:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TForm1
               : public TForm {
__published: // IDE-managed Components
private:     // User declarations
public:      // User declarations
    TForm *form;
    void __fastcall btn_click( TObject *sender ) {
        ( ( TButton * )sender )->Owner->Free( );
        form = NULL;
    }
    void __fastcall form_destroy( TObject *sender ) {
        ShowMessage( "form is being destroyed..." );
    }
    __fastcall TForm1( TComponent *Owner );
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
__fastcall TForm1::TForm1( TComponent *Owner )
               : TForm( Owner ) {
    form = new TForm( Application );
    form->Position = poScreenCenter;
    form->OnDestroy = &form_destroy;
 
    TButton *btn = new TButton( form );
    btn->Parent = form;
    btn->SetBounds( 10, 10, 100, 50 );
    btn->Caption = "close";
    btn->OnClick = &btn_click;
 
    form->Show( );
}
2
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 21:19  [ТС] 12
BRcr, спасибо! Переделал класс под себя, все с компилировалось, запустилось. Думал конец мучения, а нет При нажатии на кнопку закрытия, выскакивает ошибочка. Мб это как то связано с компилятором? У меня c++ builder 6 portable
Миниатюры
Закрытие формы (динамической)  
0
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 21:45  [ТС] 13
заменяю
C++
1
2
( ( TButton * )sender )->Owner->Free( );
        form = NULL;
на
C++
1
 delete(NewForm);
все равно та же ошибка с памятью...
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
07.10.2012, 22:13 14
Ну во-первых
delete NewForm;
0
13 / 13 / 3
Регистрация: 24.04.2011
Сообщений: 122
07.10.2012, 22:19  [ТС] 15
Это без разницы. В общем я нашел выход. Вместо delete: NewForm->Close() Только так вроде память не освобождается...
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
07.10.2012, 22:26 16
А чтоб освобождалась, допиши:
C++
1
2
3
4
5
6
//.h
void __fastcall form_close(TObject *Sender, TCloseAction &Action) {Action=caFree}
 
 
//.cpp
form->OnClose = &form_close;
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
07.10.2012, 22:26 17
Видать, <censored /> переделал. Отследи трассировщиком место возникновения ошибки. Наобум менять что-то туда-сюда как минимум неэффективно. На мой взгляд, после разрушения формы и всех ее компонентов у тебя где-то идет обращение по некорректной ссылке.
0
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
08.10.2012, 03:04 18
Я правильно понял, что кнопка удаления формы лежит на самой удаляемой форме? Удалить через delete может не получится т.к. вы хотите удалить экземпляр класса в его методе. Лучше послать сообщение винды на закрытие формы, тогда метод отработает до конца, а потом отработает сообщение.
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
08.10.2012, 15:13 19
Тоже вариант, но можно и без delete
C++
1
void __fastcall form_close(TObject *Sender, TCloseAction &Action) {Action=caFree}
Кстати, этот способ удобно применять к MDIChild формам, когда создаешь много
одинаковых формы, а потом х.з. как освободить память конкретного экземпляра класса.
0
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
08.10.2012, 15:26 20
Тоже вариант, но можно и без delete
А как вы еще освободите память от экземпляра класса (формы), пока вы работаете в методе этого самого экземпляра класса? Экземпляр класса нельзя удалять пока вы находитесь в его методе, т.к. могут быть ошибки. Поэтому конечно delete нельзя. Я вижу только 1 вариант послать сообщение винды на закрытие формы. Есть другие варианты освободить память?
0
08.10.2012, 15:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2012, 15:26
Помогаю со студенческими работами здесь

Закрытие формы
Хотелось бы что бы при закрытии кнопкой (Button5) форму (приложения), появлялось сообщение ЗАКРЫТЬ...

Обработчик разрушения динамической формы
- Здравствуйте Всем! Текст простой программы на BCB6 говорит сам за себя... Заголовок основной...

Обработка сообщений динамической формы
Создаю динамическую форму: void __fastcall TForm1::Button4Click(TObject *Sender) { TForm...

закрытие-открытие формы
можно ли после Form1-&gt;Close(); ее как нибудь открыть (нужен именно Сlose(), а не Hide();)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru