Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.17;
Скачать: CL | DM;

Вниз

Как правильно удалять объект?   Найти похожие ветки 

 
Vladimir B.   (2002-06-04 09:44) [0]

Я создал класс 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: Как лучше организовать хранение этих экземпляров панелей, если надо будет программно обращаться к любой? Динамический массив или иначе?


 
MBo ©   (2002-06-04 09:51) [1]

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


 
Lord Warlock ©   (2002-06-04 09:53) [2]

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


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

Вопрос №2 - TList


 
MAxiMum ©   (2002-06-04 18:32) [4]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.06.17;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.014 c
14-55282
Из Санкт-Петербурга
2002-05-15 08:20
2002.06.17
Кто знает, сколько у нас в городе стоит Nokia 3410, и где купить?


14-55267
Fellomena
2002-05-13 18:51
2002.06.17
Поставка прог. продукта заказчику. Что использовать ISO, ГОСТ ?


1-55101
shelest
2002-06-06 09:59
2002.06.17
Дерево! Где взять пример?


7-55332
Taison
2002-03-14 03:59
2002.06.17
CD-ROM


14-55280
Дмитрий_Б
2002-05-14 17:21
2002.06.17
Удаленные записи ??