Отчет #73008 описывает несвоевременную финализцию энумератора являющегося интерфейсом при использовании в основном теле программы (в процедурах и функциях работает нормально), что в некоторых случаях может приводить к ошибкам доступа (Access violation).
Отчет #73009 описывает неадекватную инициализацию (а точнее ее отсутствие) интерфейсного поля advanced record в случае, когда последняя используется в качестве возвращаемого значения.
5 комментариев:
Извини, что не в тему, но мне интересно мнение профессионала по поводу одной идеи. Взгляни пожалуйста, если будет свободное время.
Вкратце, это предложениe для расширения VCL, которое, имхо Borland-у стоило бы реализовать уже давно. Но недавно я оформил suggestion, написал пост и оформил report в QC. Теперь ношусь с ним как дурень с писаной торбой. =)
О введении интерфейсов для всех базовых классов VCL.
Я не смог у тебя комментарий оставить :( Видимо дело в моей Опере... Пишу тут.
Вообще, унификация всего и вся, это конечно хорошо ;), но думаю, этого не произойдет, и тому есть несколько причин. Как только мы получили интерфейс от объекта, объект получил управляемое время жизни (!). А если автор на это не расчитывал (речь ведь идет не только о наследниках компонентов. Или нужно менять объектную модель)? Другая причина состоит в том, что, как-то нужно координироваться разработчикам библиотечных классов для обеспечения подобной унификации, что на мой взгляд просто не реально (мне [абстрактно] не интересно, чтоб мои контролы аля TKAButton легко заменили на TTAButton и перестали платить за новые версии).
Спасибо за ответ. =))
Я на самом деле сам не верю, что подобное 1-в-1 будет реализовано. Но может какие-то шаги в этом направлении всё-таки будут сделаны.
Я пока не могу сообразить, в каких случаях управляемое время жизни (!) вызовет проблемы.=(
А насчёт поддержки авторами компонент. Я думаю, что если бы интерфейс типа IButton поддерживался стандартными классами VCL, и реально использовался бы программистами, то разработчикам сторонних компоненнт пришлось бы реализовать поддержку у себя.
Кстати, подобная реализация, теоретически позволила бы и привлечь новых пользователей за счёт упрощения миграции.=)
>в каких случаях управляемое время жизни (!) вызовет проблемы
//
Procedure AnyProc(AObject : TObject);
Var
IntfList : IInterfaceList;
Begin
If AObject.GetInterface(IInterfaceList, IntfList) Then
// произошла смена управления временем жизни
WriteLn(IntToStr(IntfList.Count));
End;
//
Var
List : TInterfaceList;
...
List := TInterfaceList.Create;
Try
AnyProc(List);
// тут объекта уже нет
Finally
List.Free;
End;
Понял, спасибо. Постоянно сталкиваюсь сподобным, когда начинаю вводить поддержку интерфейсов в объекты. Только воспринимал как смешение объектных и интерфейсных типов, вот и не сообразил.
Отправить комментарий