Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
3-55009
AndruhaM
2002-05-23 16:06
2002.06.17
Как организовать поиск


3-54974
Vitamin
2002-05-22 14:25
2002.06.17
Как передать результат запроса в Exel?


3-55047
Blondin
2002-05-24 14:12
2002.06.17
Подключение к Ораклу


4-55358
IGOREK
2002-04-10 18:21
2002.06.17
Какие есть еще пути реализации глобальных хуков?


14-55309
Malder
2002-05-14 19:28
2002.06.17
RFC 1459 по русски




   Наверх