delphi4arab منتديات دلفي للعرب
مشكل التعامل مع Generic Interface - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مشكل التعامل مع Generic Interface (/showthread.php?tid=10990)



مشكل التعامل مع Generic Interface - MasteranyOne - 01-08-2020

السلام عليكم ورحمة الله تعالى وبركاته

عيدكم مبارك وكل عام وانتم بخير

قمت بعمل وحدة جديدة تحتوي على class الهدف منها هو عمل implementation للـ Generic interface IComparer , حيث هذه الأخيرة معرفة في وحدة Generics.Defaults كما يلي :

كود :
IComparer<T> = interface     function Compare(const Left, Right: T): Integer;   end;

وهذه الوحدة التي أنشائتها :

كود :
unit uMyComparer; interface uses Generics.Defaults; type   TPersonne = record     ID : word;     Nom : String[30];     Age : byte;   end;   TMyComparer<TPersonne> = class(TInterfacedObject, IComparer<TPersonne>)     public       function Compare(const Left, Right: TPersonne): Integer;   end; implementation { TMyComparer<TPersonne> } function TMyComparer<TPersonne>.Compare(const Left, Right: TPersonne): Integer; begin   Result := left.ID - Right.ID; end; end.

المشكلة : توجد في السطر 
كود :
Result := left.ID - Right.ID

ومضمونها : انه لم يتم التعرف على الحقل ID 

السؤال : ماسبب الخطأ, وماهي خطوات حله؟


RE: مشكل التعامل مع Generic Interface - sofiane201 - 02-08-2020

غير
PHP كود :
TMyComparer<TPersonne> = class(TInterfacedObject, IComparer<TPersonne>) 

الى
PHP كود :
TMyComparer = class(TInterfacedObject, IComparer<TPersonne>) 

التوثيق يقول أنه من الافضل استخدام TComparer بدل استخدام IComparer

هل تريد الترتيب في TList<T>؟ اذا نعم, فالحل في تعليقك السابق

وتفقد المثال المرفق.


RE: مشكل التعامل مع Generic Interface - MasteranyOne - 02-08-2020

بارك الله فيك اخي سفيان (تحية خالصة)
لقد حلت المشكلة

نعم كنت أريد ترتيب القائمة TList وكنت اعلم الحل (الذي وضعته في الموضوع السابق الذي اشرت إليه), لكن لم اكن افقه في مفهوم interface فذهبت ودرسته تم عدت لأطبقه على IComparer فوجهت تلك المشكلة.


الحل الذي تطرقت له يجب أن يحقق الشرط التالي وإلا لن يشتغل :
           - يجب إنشاء كلاس جديدة مشتقة من الكلاس Generic TList, كما فعلت.

في حالة إستعمالها مباشرتا : 
كود :
TPersonList:= TList<TPerson>.Create; TPersonList.Sort(TPersonComparer.Create);

لن يشتغل البرنامج والسبب :

كود :
[dcc32 Error] uFrmMain.pas(149): E2250 There is no overloaded version of 'Sort' that can be called with these arguments

لذلك يجب إتباع خطوات الأخ سفيان الموجودة في الملف الذي ارفقه.