![]() |
|
مشكل التعامل مع 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لذلك يجب إتباع خطوات الأخ سفيان الموجودة في الملف الذي ارفقه. |