سؤال

لدي فصل يعتمد على tinterfacedObject. أضفها إلى خاصية بيانات TtreeNode.

TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
public
end;

أقوم بإنشاء العديد من مثيلات هذا الكائن وافترضت أنه نظرًا لأنهم مرجعون ، يجب ألا أحتاج إلى تحريرها. سيكون ذلك مفيدًا.

ومع ذلك ، عند التحقق من ذلك ، قمت بتشغيل ReportMemoryLeaksonshutdown ووجدت أنه لم يتم إطلاق سراحهم بعد كل شيء.

يتم إنشاء هذه الكائنات في إطار يتم وضعه على النموذج الرئيسي. في شكل النموذج الرئيسي ، قمت بمسح العقد الشجرة بحيث يجب تحرير كل كائن.

ماذا يحدث؟

شكرا لك على مساعدتك!

هل كانت مفيدة؟

المحلول

TinterfacedObject نفسه لا يتم احتسابها ، فقط الواجهات هي. يمكنك تنفيذ واجهات باستخدام TinterFacedObject والتي توفر لك بشكل أساسي جهود تنفيذ أساليب العد المرجعية بنفسك. لسوء الحظ ، لن ينجح الأمر في حالتك: لا يعرف المترجم أنك تقوم بتعيين واجهات لخاصية ttreenode.data لأنه لم يتم الإعلان عنه كواجهة بل كمؤشر. لذلك ستحدث جميع أنواع الأشياء الغريبة:

MyInt := TFacilityTreeItem.Create; // ref count = 1
// Node.Data := MyInt; // won't compile
Node.Data := pointer(MyInt); // no interface assignment, ref count stays 1
...
end; // ref count reaches 0, your object gets freed

بمجرد أن تحاول الوصول إلى كائنك من خلال خاصية .Data ، ستحصل على انتهاك للوصول.

لذلك ، لا تهتم بالواجهات في هذه الحالة ، يمكنك تشغيلها ، لكنها ستكون جهد أكثر مما يستحق.

نصائح أخرى

يجب أن تعلن الحقل/المتغير كواجهة

IFacilityTreeItem = IInterface
end;

TFacilityTreeItem=class(TInterfacedObject, IFacilityTreeItem)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
end;

var
  Item: IFacilityTreeItem; // Variable as Interface
begin
  Item:= TFacilityTreeItem.Create;
...
end;

للوصول إلى الحقول الخاصة بك ، يجب أن تعلن الخصائص في واجهة IfacilityTreeItem ، مع Getters و Petters.

كما قال Dummzeuch, ، يمكنك الحصول على هذا للعمل مع واجهات ، ولكن الأمر يتطلب المزيد من التعليمات البرمجية لأن خاصية البيانات الخاصة بـ ttreenode هي مؤشر. لأي شخص يتساءل عن كيفية القيام بذلك ، هذا الرابط لديه مثال على كيفية القيام بذلك من أجل TlistItem (إنه نفس الشيء بالنسبة إلى ttreenode). قد تجد أيضًا أنه من المفيد قراءة القسم حول واجهات والقسم اللاحق حول المرجعية في تلك الصفحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top