![]() |
|
أنماط المجموعات Collections - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي التقنية (https://delphi4arab.net/forum/forumdisplay.php?fid=6) +--- قسم : دلفي والتعامل مع المكونات و الاضافات (https://delphi4arab.net/forum/forumdisplay.php?fid=18) +--- الموضوع : أنماط المجموعات Collections (/showthread.php?tid=3970) |
أنماط المجموعات Collections - kachwahed - 08-03-2012 السلام عليكم ورحمة الله قد نحتاج في حالات كثيرة زمن التشغيل إلى استخدام سلسلة من الكائنات ديناميكا الجداول الثابتة Static Array أو الديناميكية قد تفي بالغرض في حالات ضيقة لكن لاستخدامات أوسع: الحذف، الترتيب، المقارنة، البحث، الدمج... ينبغي برمجة ذلك يدويا لنفكر لتوجه غرضي، البديل استخدام TList المعرف في المكتبة Classes.pas يمثل سلسلة من الكائنات TObject فهو بذلك نمط مرن وبالتالي باستخدام القولبة يمكنك توظيفه لأي كائن آخر لتستفيد من الخصائص التقليدية للسلاسل المتصلة Exchange, Expand, Extract, First, IndexOf, Insert, Last, Move ,Remove, Pack, Sort, Capacity, Count, Items وغيرها... طبعا دون إعادة كتابة الخوارزميات الجاهزة يكفي إعادة توريثها مثال TIntegerList مصغرة: PHP كود : typeعند استخدامه مع أصناف أخرى يستحسن عدم توريثه مباشرة وإلا قد تجبر مستخدمه على القولبة عند كل استخدام PHP كود : typeعند التعامل مع صنفيات أكثر أهمية (مثل المكونات) أو تحتاج إلى استخدامات متقدمة يمكنك الاستفادة من خدمات المكتبة Contnrs.pas المرفقة مع دلفي (إصدار >= 5 على الأقل) كود : TObjectList
TClassList
TComponentListباختصار: TCollection وTCollectionItem تصميم رائع يختصر الكثير من العمل يسمح هذان الصنفان بتجسيد العلاقة واحد إلى متعدد بين أصناف دلفي كيف ذلك؟ لنشاهد المثال الآتي: نرغب بإنشاء صنفين "عامل" TEmployee و"مجموعة عمال" TEmployees عامل واحد يمثل هنا غرض من TCollectionItem في حين تمثل مجموعة العمال بالصنف TCollection PHP كود : typeالآن، لن نستخدم الصنف TEmployee (إلا مرة واحدة عند الإنشاء) لن نتعامل مع "عامل" واحد بل سنقوم بإنشاء كائن من مجموعة العمال TEmployees ونخبره بالصنف الذي سنستخدمه كعنصر Item كود : [color=black][COLOR="Red"]TEmployees[/color].Create([color=Blue]TEmployee[/color])[/COLOR]مثال: PHP كود : varالصنف TCollection مشتق من الصنف TPersistent وبذلك تستفيد من كل ما يوفره من Assign، التدفقات Streaming، وOwnership إذا أضفنا TOwnedCollection... وسنختزل الكثير من الوقت مقارنة بما لو كتبنا ذلك من الصفر... صممت هذه الأنماط لأجل برمجة المكونات وهي مناسبة جدا لها: أنماط أخرى أسهل من هذه؟ TObjectList أسهل من حيث التعامل تنطلق من TList ولا تختلف عنها كثيرا لتضيف ميزة رائعة وهي تدمير تلقائي للأغراض المضافة (مع ضبط OwnsObjects = True وهي كذلك افتراضيا)، مثال: لنفترض الصنف TPerson له خاصية FullName ترفق له عند الإنشاء، نكتب: PHP كود : typeبقيت TClassList التي تمثل TList لتسيير صنف من الأصناف TClass = class of TObject أما TComponentList فتشتق من TObjectList لتضيف إمكانية التحديث التلقائي عند حذف العناصر وتحرير الذاكرة عند التدمير... كود الأمثلة السابقة في المرفق CollectionsExample.rar هذا مثال أأكد من خلاله أنه إذا عرفنا فقط كيف نستخدم ما بأيدينا من مكتبات دون اللجوء إلى المكونات الإضافية أو البحث في النت، لاختصرنا الكثير من الوقت والجهد مع تحقيق نتائج أفضل. أليس كذلك ![]() بالتوفيق. |