Я борюсь с интерфейсами в Delphi. Этот вопрос может быть тривиальным, но я новичок в Delphi, так что извините.
У меня есть TreeView с настраиваемыми узлами, которые содержат интерфейс к объекту (по сути, так же, как это предлагается здесь: Сохранение указателя интерфейса внутри древовидного представления узлы).
Проблема в том, что как только я удаляю узел (чтобы перерисовать древовидную структуру) и устанавливаю для переменной интерфейса значение nil (освобождение не работает с интерфейсами по какой-то причине, которую я не совсем понял), происходит самое странное:
В моем объекте, который содержит список, целое число и строковую переменную, строка и список будут установлены пустыми, а целое число останется прежним.
Я не могу это объяснить. Кто-нибудь знает обходной путь или возможную причину такого поведения? Кстати, я использую Delphi 10.2 Tokyo.
Вот мой довольно невзрачный метод уничтожения:
myNode.destroy;
begin
intf:= nil;// intf holds the interface to the object
end;
Изменить: это упрощенная версия моего кода:
Объект, о котором я говорю: (у меня есть несколько похожих классов, которые выглядят как obj, но немного отличаются, и я не знаю, какой из них будет храниться в интерфейсе, но все они используют эти переменные)
Obj = class(InterfacedObject, IMyinterface)
count: integer; //this remains the same
children: array of ChildObj; //this will be emptied
name: string; //this will be set to ''
procedure addChild;
procedure IMyInterface.add = addChild;
end;
Мой настроенный узел дерева:
MyNode = class(TTreeNode)
Intf: IMyinterface;
destructor destroy; override;
end;
Внутри моего класса управляет TreeView:
MyForm.ReloadTree;
begin
if myTreeView.Items.Count > 0 then
begin
myTreeView.Items.Clear;
end
for I:= 0 to RootObj.Count-1 do
begin
myTreeView.Items.AddChild(MyTreeview.Items[0], RootObj.Children[i].name);
(myTreeView.Items[0][i] as MyNode).Intf := Intf(RootObj.Children[i]);
//I will proceed iterating over all children and their children, doing
//the same process, a level higher in the treeView
//...
end;
end;
TTreeNode
(по крайней мере, в VCL). Это должно уменьшить количество ссылок на ваш интерфейсный объект и освободить его. - person Victoria   schedule 23.09.2017MyForm.ReloadTree; begin [...]
, которая даже не скомпилируется, не говоря уже о выполнении. - person MartynA   schedule 23.09.2017