Форум: "Компоненты";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
ВнизОшибка при удалении ActiveX контрола Найти похожие ветки
← →
AlexeyT © (2006-03-30 17:07) [0]Создаю ActiveX control в конструкторе (Name:= TName.Create(Self); Name.Parent:= Self;); все работает, но при освобождении контрола в деструкторе появляется ошибка:
"Control "Viewer" has no parent window.". Viewer - это экземпляр компонента, в котором создается контрол. Освобождаю контрол так:
destructor TATViewer.Destroy;
begin
if Assigned(FName) then
FName.Free; //здесь выдает ошибку
inherited Destroy;
end;
Что это за ошибка, почему все работает с другими контролами (не ActiveX), которые создаются и освобождаются так же?
Если это важно, контрол - Windows Media Player.
← →
Наиль © (2006-03-30 22:59) [1]
> (Name:= TName.Create(Self); Name.Parent:= Self;)
Self в Create обеспечивает автоматическое уничтожение FName при уничтожении твоего компонента. Если хочешь уничтожать сам, то нужно писать так: Name:= TName.Create(nil);
> if Assigned(FName) then
> FName.Free;
Assigned - лишнее, т.к. в Free производится эта же проверка.
> "Control "Viewer" has no parent window.".
Т.к. каждый контрол запрашивает собственый Handle через Parent, то в случае нарушения цепочки (отсутствует Parent), появляется эта ошибка. Выхода в таких случаях два:
1. Обеспечить наличие Parent"a и Parent"a у Parent"a и так далее.
2. Проверять HandleAllocated (если не ошибаюсь) перед выполнением операций способных вызвать такую ошибку.
---
Да поправят меня Боги!
← →
AlexeyT © (2006-03-31 10:02) [2]
> Self в Create обеспечивает автоматическое уничтожение FName
> при уничтожении твоего компонента. Если хочешь уничтожать
> сам, то нужно писать так: Name:= TName.Create(nil);
OK, спасибо за информацию. Переделаю.
Но я нашел еще другой выход: обнуление FName.Parent перед вызовом FName.Free. Тогда контрол "не обращается" к моему компоненту и ошибки нет.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.042 c