Главная страница
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
1-55140
r1val
2002-06-04 10:36
2002.06.17
Начал делать прогу...


14-55283
Suntechnic
2002-04-30 20:48
2002.06.17
Вот загадку прислали :)...


1-55161
ЗЛ
2002-06-04 14:50
2002.06.17
Есть StringGrid и у меня в зависимости от того какая команда в яч


14-55263
Дремучий
2002-05-11 23:05
2002.06.17
Почувствуй себя МАСТЕРОМ!


14-55271
Olgerd
2002-05-14 16:34
2002.06.17
Что за бред.