Форум: "Основная";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
ВнизКак правильно удалять объект? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c