Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2014, 00:22   #1
Armagedo
 
Регистрация: 17.07.2014
Сообщений: 5
По умолчанию Динамическая привязка событий и удаление объектов

Быть добру!

С формами и прочими контролами, кроме фоксовских, не работал.

Решил тут покрутить извилины на билдере, что оно да как.
Есть давно писаный для себя на С++ класс для работы с матрицами.
Захотелось потренироваться на кошках и всё это дело слегка "визуализировать" в меру собственных сил.

Начал с осторожных шагов и сходу застрял.

Есть главная форма (TmfTestForm *mfTestForm).
На ней кнопка (TButton *Button1).
По нажатию создаем динамически новую "вспомогательную" форму (TForm *matrixForm) и на ней editbox (TEdit *cellEdit).

Потом прячем главную форму и показываем вспомогательную matrixForm.

Тут и начали возникать вопросы.

Вопрос 1:
По закрытии вспомогательной формы нужно отобразить главную форму.
Объясните, почему к событию OnClose удается прикрутить функцию-обработчик (FormClose), только сделав её членом класса главной формы?

Пробовал отдельной функцией - ругается на невозможность приведения там чего-то к чему-то...
Пришлось закомментить до поры до времени (см. заголовочный)

Вопрос 2:
Раз создавал форму и контрол динамически, то, как мне казалось, нужно и поубивать явно при закрытии вспомогательной формы.
Для простоты эксперимента переменные-указатели объявлены глобальными (???), но...

При попытке освобождения через delete получаю критическую ошибку Access violation at address 00000000. Read ...

Что-то не могу найти зацепок почему...то ли их до этого уже поубивало...но что и когда....

Не в службу - гляньте да посоветуйте, что не так

ЗС

Код:
 Заголовочный

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <msxmldom.hpp>
#include <XMLDoc.hpp>
#include <xmldom.hpp>
#include <XMLIntf.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TmfTestForm : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:	// User declarations
public:		// User declarations
        __fastcall TmfTestForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
//void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
//---------------------------------------------------------------------------
extern PACKAGE TmfTestForm *mfTestForm;
//---------------------------------------------------------------------------


#endif
и

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TmfTestForm *mfTestForm;
TForm *matrixForm;
TEdit *cellEdit;

//---------------------------------------------------------------------------
__fastcall TmfTestForm::TmfTestForm(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------

void __fastcall TmfTestForm::Button1Click(TObject *Sender)
{
        mfTestForm->Visible = false;

        matrixForm = new TForm(Application);
        matrixForm->Left = 200;
        matrixForm->Top = 200;
        matrixForm->Height = 200;
        matrixForm->Width = 400;
        matrixForm->OnClose = mfTestForm->FormClose;

        cellEdit = new TEdit(matrixForm);
        cellEdit->Parent = matrixForm;
        cellEdit->Left = 15;
        cellEdit->Top = 15;
        cellEdit->Width = 40;
        cellEdit->Height = 20;
        cellEdit->Visible = true;

        matrixForm->Show();
}

//---------------------------------------------------------------------------
void __fastcall TmfTestForm::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete matrixForm;
        delete cellEdit;
        this->Visible = true;
}
Armagedo вне форума Ответить с цитированием
Старый 18.07.2014, 01:12   #2
Armagedo
 
Регистрация: 17.07.2014
Сообщений: 5
По умолчанию

Вопрос номер 2 СНИМАЮ

Индеец - что поделать.
Сначала "освобождаю" форму, а потом пытаюсь освободить контрол, для которого форма является "родительской".

Может деструктор ~TForm() сам освобождает память, "занятую" всеми контролами на этой форме?

Вообщем, махнул местами два делита - ошибка пропала.

Вопрос номер 1 - остался
Armagedo вне форума Ответить с цитированием
Старый 22.07.2014, 13:37   #3
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Обработчиком события может быть только функция класса. Там используется некоторая хитрость, связанная с неявной передачей параметра. Но никто не мешает использовать вызов внешней функции из обработчика события...
FataLL вне форума Ответить с цитированием
Старый 23.07.2014, 19:48   #4
koka123
 
Регистрация: 14.11.2013
Сообщений: 3
По умолчанию

void __fastcall TForm1::btn1Click(TObject *Sender)
{
std::auto_ptr<TForm2> newForm(new TForm2(Application));
this->Visible=false;
__try
{
newForm->ShowModal();
}
__finally
{
this->Visible=true;
}
}
//---------------------------------------------------------------------------
koka123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая привязка события к ListViewItem coNsept Общие вопросы .NET 1 26.03.2012 10:01
Привязка событий к графику medvednick Microsoft Office Excel 0 07.10.2011 01:42
Привязка объектов к DataGridView DeCo C# (си шарп) 0 19.08.2011 15:01
обработчик событий динамических объектов Vervolf Общие вопросы Delphi 2 17.01.2011 18:45
Привязка объектов(картинок) к странице Lynch Microsoft Office Word 2 18.11.2009 11:31