IDCLGrid;
var
grid: IDCLGrid;
begin
grid:=TDCLGrid.Create(FIDCLMain, FNameSpace, Self, ParentControl, SurfType, Query, Data);
FGrids.Add(grid);
Result:=grid;
end;
Что будет с grid? Точнее не схлопнется ли объект совсем при выходе из метода?
Подсказка: I и T.
Ну так ты же ссылку отдаешь наружу
а почему схлопнется если ссылка на объект ушла дальше и в список?
Если ты ее там используешь, то все ок
Переменные типа интерфейса увеличивают счётчик ссылок на объект. Объект уничтожится, когда счётчик ссылок станет 0
Хорошо. Тогда как отловить ситуацию. Если два раза вызвать форму которая создаётся из другой формы и на ней (дочерней форме) создаётся класс у которого в наследниках TComponent и некий интерфейс. После вызовов, если закрыть родительскую форму, то деструктор компонента падает с недопустимым чтением откуда то из под земли.
Нельзя использовать наследник TComponent как интерфейс
Не как а совместно. Так: TDCLGrid=class(TWinControl, IDCLGrid)
Главное помни, что объект уничтожится родителем, а не когда счётчик ссылок уменьшится
или родителем, или владельцем, если это компонент
Да, явно не уничтожаю. Главное что бы не раньше.
Ну а owner или parent ты ему назначаешь?
А тут подробнее, у меня .Parent и .Create(PO); разные!
Тогда твой объект уничтожится с парентом
ну вот кто раньше уничтожается - потянет за собой все компоненты
Насколько я помню, то при присвоении парента меняется owner на парент
Потому и фокус про два раза.
вроде бы нет, глянул код, только если совсем внутри где-то
посмотрел, вроде не меняет
Обсуждают сегодня