مشكل التعامل مع Generic Interface
#1
السلام عليكم ورحمة الله تعالى وبركاته

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

قمت بعمل وحدة جديدة تحتوي على 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 

السؤال : ماسبب الخطأ, وماهي خطوات حله؟
الرد
#2
غير
PHP كود :
TMyComparer<TPersonne> = class(TInterfacedObjectIComparer<TPersonne>) 

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

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

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

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


الملفات المرفقة
.zip   Comparer.zip (الحجم : 2.62 KB / التحميلات : 3)
[-] كل من 1 user says قال شكرا ل sofiane201 على المشاركة المفيدة
  • MasteranyOne
الرد
#3
بارك الله فيك اخي سفيان (تحية خالصة)
لقد حلت المشكلة

نعم كنت أريد ترتيب القائمة 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

لذلك يجب إتباع خطوات الأخ سفيان الموجودة في الملف الذي ارفقه.
[-] كل من 1 user says قال شكرا ل MasteranyOne على المشاركة المفيدة
  • sofiane201
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف