Вопрос № 60145: Здравствуйте уважаемые эксперты!
Я разрабатываю свой компонент для Delphi7, в связи с этим у меня несколько вопросов:
1) Как созать свойство наследник от TCollection?
2) Компонент имеет несколько свойств наследников TWinControl, по логике...
Вопрос № 60.145
Здравствуйте уважаемые эксперты!
Я разрабатываю свой компонент для Delphi7, в связи с этим у меня несколько вопросов:
1) Как созать свойство наследник от TCollection?
2) Компонент имеет несколько свойств наследников TWinControl, по логике программы, при добавлении некоторых из них другие должны очищаться, как это коректно сделать?
3) В дополнении к вопросу №2, При удалении компонента с которыйм свя зан мой, Delphi вылетает с переполнением стека, как с этим можно боротся и победить?
Отправлен: 25.10.2006, 16:03
Вопрос задал: Monah (статус: 5-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Mexes
Здравствуйте, Monah!
1) А в чем, собственно, проблема? Создавайте свой класс-наследник TCollection (хотя я рекомендую создавать от TOwnedCollection - а иначе у меня были проблемы с отображением в Object Inspector вложенных коллекций), к нему делайте опубликованное свойство. Будет отображаться в инспекторе объектов, редактироваться привычным образом (окно со списоков, в котором представлены элементы коллекции). Ну и понадибится еще потомок TCollectionItem, которые Вы будете хранить в этой коллекции.
2) Что значит очищаться? Уничтожать связанные объекты при установке значения какого-то свойства? Почему бы тогда просто их не уничтожить методом Free? Не уверен, что я правильно понял твой вопрос...
3) Когда Вы свзяываете поле с компонентом, вызовите у последнего FreeNotification(self), где self - это разрабатываемый компонент. Он будет слать оповещение об уничтожении. Необходимо будет перекрыть обработчик этого оповещения - метод Notification. В частности, TControl для сброса на nil свойст PopupMenu и Action это делает так:
procedure TControl.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
if AComponent = PopupMenu then PopupMenu := nil
else if AComponent = Action then Action := nil;
end;
Аналогичным образом сбросите на nil свои поля.
Ответ отправил: Mexes (статус: 4-ый класс)
Ответ отправлен: 25.10.2006, 17:03