C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Процесс удаления(free) компонета, Процесс удаления компонета
Walker
Отправлено: 16.03.2005, 14:54


Не зарегистрирован







Помогите pls, решить проблему:
Есть самописанный компонет лежащий на форме.
Надо перед удалением компонента(обычно это закрытие формы) сбросить некоторые данные из него наружу. При этом, данные должен сбрасывать сам компонент. Т.е. вопрос в том как перехватить управление в процессе удаления компонента перед тем как его данные будут разрушены.
Gedeon
Отправлено: 16.03.2005, 15:02


Ветеран

Группа: Модератор
Сообщений: 1742



Деструктор используйте, вот из хелпа
QUOTE

The destructor for a class is called to free members of an object before the object is itself destroyed. The destructor is a member function whose name is that of the class preceded by a tilde (~).
Walker
Отправлено: 16.03.2005, 15:06


Не зарегистрирован







К сожалению, в момент вызова деструктора данные компонента(например св-во Text) уже разрушены.(проверено экспериментально) т.е. нужен другой вариант.
Bond
Отправлено: 16.03.2005, 15:22


Станционный диспетчер

Группа: Участник
Сообщений: 142



Деструктор вызывается перед освобождением памяти, которую занимает объект
Все работает нормально
Unit1.cpp
CODE
__fastcall TMyEdit::TMyEdit( TComponent *AOwner )
       : TEdit( AOwner )
{
}
//---------------------------------------------------------------------------
__fastcall TMyEdit::~TMyEdit( void )
{
       MessageBox(
               NULL, Text.c_str(), "Value of property [Text]",
               MB_OK | MB_ICONINFORMATION
       );
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button3Click(TObject *Sender)
{
       if( edit )
       {
               RemoveControl( edit );
               edit->Free();
               edit = NULL;
       }
       else
       {
               edit = new TMyEdit( this );
               edit->Top = Button3->Top + Button3->Height + 10;
               edit->Left = Button3->Left;
               InsertControl( edit );
               edit->SetFocus();
       }
}
Unit1.h
CODE
class TMyEdit : public TEdit
{
       public:
       __fastcall TMyEdit( TComponent* Owner);
       __fastcall ~TMyEdit( void );
};
....
TMyEdit *edit;
Walker
Отправлено: 16.03.2005, 15:52


Не зарегистрирован







Ситуация немного другая. Попробовал тоже, но контрол — от TCustoComboBox и ляпнул его на форму из палитры компонентов и закрыл окно. Показало значение Text -> NULL.. И я не знаю или лыжи не едут, или .... wink.gif
Bond
Отправлено: 16.03.2005, 16:25


Станционный диспетчер

Группа: Участник
Сообщений: 142



Мы обсуждаем работу деструктора или конкретной реализации конкретного класса?
Приведи свой код, тогда будем делать вводы/выводы smile.gif


Отредактировано Bond — 16/03/2005, 15:29
Bond
Отправлено: 16.03.2005, 16:28


Станционный диспетчер

Группа: Участник
Сообщений: 142



свойство Text наследуется от TControl, как и для TEdit

Отредактировано Bond — 16/03/2005, 15:30
Gedeon
Отправлено: 16.03.2005, 17:25


Ветеран

Группа: Модератор
Сообщений: 1742



Тут немного иная ситуация, дело в том что свойство текст у кастомкомбобокса обьявлено в секции протектед, вот набросал Вам код где это поборол, его надо переобьявить в другом разделе, см. комментарий
н-файл
CODE

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TMyCombo : public TCustomComboBox
{
private: // User declarations
public:  // User declarations
__fastcall TMyCombo(TComponent* Owner);
   __fastcall ~TMyCombo();
   __property Text; // ********* от тут его распротектить ***************
};
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
  TMyCombo *MC;
virtual __fastcall ~TForm1();
public:  // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

срр-файл
CODE

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TMyCombo::TMyCombo(TComponent* Owner):TCustomComboBox(Owner){
}
//---------------------------------------------------------------------------
__fastcall TMyCombo::~TMyCombo()
{
MessageBox(NULL,this->Text.c_str(),"Text",MB_OK);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MC = new TMyCombo(this);
   MC->Parent = this;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MessageBox(NULL,MC->Text.c_str(),"Text",MB_OK);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
delete MC;
}
//---------------------------------------------------------------------------

А деструктор он и в африке деструктор smile.gif
Guest
Отправлено: 16.03.2005, 17:38


Не зарегистрирован







В общем пробема решена.
Дело было в том, что при удалении формы сначала удаляются все виндовые окна(виндузная часть контролов) на этой форме, а затем запускается процедура удаления VCL-ной части и соответственно все данные связанные с виндовыми контролами убиваются до вызова BeforeDestruction(), Notification(...)и дестркутора. Потому надо вешать свой обработчик оконных сообщений. Вот.

Вернуться в Вопросы программирования в C++Builder