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.cppCODE | __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.hCODE | class TMyEdit : public TEdit
{
public:
__fastcall TMyEdit( TComponent* Owner);
__fastcall ~TMyEdit( void );
};
....
TMyEdit *edit; |
|
|
Walker |
Отправлено: 16.03.2005, 15:52 |
|
Не зарегистрирован
|
Ситуация немного другая. Попробовал тоже, но контрол — от TCustoComboBox и ляпнул его на форму из палитры компонентов и закрыл окно. Показало значение Text -> NULL.. И я не знаю или лыжи не едут, или .... |
|
Bond |
Отправлено: 16.03.2005, 16:25 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 142
|
Мы обсуждаем работу деструктора или конкретной реализации конкретного класса?
Приведи свой код, тогда будем делать вводы/выводы
Отредактировано 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;
}
//--------------------------------------------------------------------------- |
А деструктор он и в африке деструктор
|
|
Guest |
Отправлено: 16.03.2005, 17:38 |
|
Не зарегистрирован
|
В общем пробема решена.
Дело было в том, что при удалении формы сначала удаляются все виндовые окна(виндузная часть контролов) на этой форме, а затем запускается процедура удаления VCL-ной части и соответственно все данные связанные с виндовыми контролами убиваются до вызова BeforeDestruction(), Notification(...)и дестркутора. Потому надо вешать свой обработчик оконных сообщений. Вот. |
|