Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.006 c
14-55311
Malder
2002-05-13 21:55
2002.06.17
Проблема с кодировками в Outlook


4-55347
AlexanderSK
2002-04-11 17:17
2002.06.17
Handle Dll


1-55056
Kudatsky
2002-06-05 12:46
2002.06.17
PickList в TDBGrid


8-55230
Al_va
2002-02-01 12:59
2002.06.17
Свойства ShockwaveFlash


4-55354
X3m
2002-04-15 08:53
2002.06.17
КАК показать/скрыть иконки на рабочем столе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский