Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно удалять объект? [D5, Win2k]


Vladimir B. ©   (2002-06-04 09:44:00) 

Я создал класс MyPanel := class(TPanel);
с двумя кнопками: Start и Stop.
Объекты класса создаются Run-time в "неограниченном" количестве пользователем.
Кнопка Start выдает сообщение ("Hello!"), а Stop - удаляет "свою" панель, т.е. вызывает ее деструктор.

Вопрос №1: Как правильно написать деструктор, если конструктор такой:

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

MyPanel = class(TPanel)

private

ButtonStart: TButton;
ButtonStop: TButton;

procedure ButtonStartClick(Sender: TObject);
procedure ButtonStopClick(Sender: TObject);

public

constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

end;


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

procedure MyPanel.ButtonStopClick(Sender: TObject);

begin

Destroy;

end;


constructor MyPanel.Create(AOwner: TComponent);

begin

inherited Create(Owner); // Initialize inherited parts
Width := 286; // Change inherited properties
Height := 87;

ButtonStart := TButton.Create(self); // Initialize new fields
ButtonStart.Parent:=self;
ButtonStart.OnClick := ButtonStartClick;
ButtonStop := TButton.Create(self); // Initialize new fields
ButtonStop.OnClick := ButtonStopClick;
ButtonStop.Parent:=self;

//создали

ButtonStart.Left:=8;
ButtonStart.Top:=40;
ButtonStart.Width:= 57;
ButtonStart.Height:= 41;
ButtonStart.Caption:="Start";

ButtonStop.Left:=72;
ButtonStop.Top:=40;
ButtonStop.Width:= 57;
ButtonStop.Height:=41;
ButtonStop.Caption:="Stop";

end;

//Это мой деструктор. В чем ошибка?

destructor MyPanel.Destroy;

begin

ButtonStart.Free;
ButtonStop.Free;
inherited Destroy;

end;
//


Примечание: На форме есть кнопочка - каждый клик создает без проблем панель - одну под другой (этот код не привожу). Но удаляю некоторые с "Access violation..."

Вопрос №2: Как лучше организовать хранение этих экземпляров панелей, если надо будет программно обращаться к любой? Динамический массив или иначе?


Новеньки в Делфи   (2002-06-05 01:52:00) [1]

я такие вещи храню в массиве


MAxiMum   (2002-06-04 18:32:00) [2]

Конечно, у Вас будет ошибка. Вы удалаете объект в его собственном обработчике. После обработчика метод "пытается" вернуться на место где его вызвали, а его уже и нет, благодаря вызову деструктора.


Mz_______   (2002-06-04 10:30:00) [3]

Вопрос №2 - TList


Lord Warlock   (2002-06-04 09:53:00) [4]

По коду - Destroy нежелательно вызывать напрямую, лучше пользоваться Free.
на нажатие кнопки лучше всего посылать панели сообщение на уничтожение


MBo   (2002-06-04 09:51:00) [5]

при таком соэдании
TButton.Create(self);
не надо удалять в деструкторе


Наверх

Титульная страница Поиск, карта сайта Написать письмо