في أغلب الأحيان ، عند البرمجة في دلفي ، لن تحتاج إلى إنشاء عنصر ديناميكي. إذا قمت بإسقاط مكون في نموذج ما ، فإن دلفي يعالج إنشاء المكون تلقائيًا عند إنشاء النموذج. ستغطي هذه المقالة الطريقة الصحيحة لإنشاء مكونات برمجيًا في وقت التشغيل.
إنشاء مكون ديناميكي
هناك طريقتان لإنشاء المكونات بشكل حيوي. طريقة واحدة هي جعل نموذج (أو بعض TComponent الأخرى) مالك المكون الجديد. هذه ممارسة شائعة عند إنشاء مكونات مركبة حيث تقوم حاوية بصرية بإنشاء وتملك المكونات الفرعية. سيؤدي القيام بذلك إلى التأكد من إتلاف المكون المنشأ حديثًا عند إتلاف المكون المالك.
لإنشاء مثيل (كائن) للفصل الدراسي ، يمكنك استدعاء الأسلوب "إنشاء" الخاص به. إنشاء المنشئ هو طريقة الصف، على عكس جميع الطرق الأخرى التي ستواجهها في برمجة دلفي ، والتي هي طرق كائن.
على سبيل المثال ، يعلن TComponent المُنشئ إنشاء كالتالي:
إنشاء منشئ (AOwner: TComponent) ؛ افتراضية؛
خلق ديناميكي مع مالكي
إليك مثال على الإبداع الديناميكي ، حيث الذات هو سليل TComponent أو TComponent (على سبيل المثال ، مثيل لـ TForm):
مع TTimer. إنشاء (النفس) القيام به
ابدأ
الفاصل الزمني: = 1000 ؛
ممكن: = خطأ
OnTimer: = MyTimerEventHandler؛
النهاية؛
إنشاء ديناميكي مع دعوة صريحة إلى مجاني
الطريقة الثانية لإنشاء مكون هي الاستخدام لا شيء كمالك. لاحظ أنه إذا قمت بذلك ، يجب عليك أيضًا تحرير الكائن الذي تقوم بإنشائه بشكل صريح بمجرد عدم حاجتك إليه (أو ستنتج تسريب ذاكرة). إليك مثال على استخدام nil كمالك:
مع TTable. إنشاء (لا شيء) القيام به
محاولة
DataBaseName: = 'MyAlias'؛
اسم الجدول: = 'MyTable' ؛
افتح؛
تعديل؛
FieldByName ('مشغول'). AsBoolean: = صواب ؛
بريد؛
أخيرا
مجانا؛
النهاية؛
إنشاء ديناميكي ومراجع الكائن
من الممكن تحسين المثالين السابقين عن طريق تعيين نتيجة استدعاء إنشاء لمتغير محلي للطريقة أو الانتماء إلى الفئة. هذا غالبا ما يكون مرغوبا فيه عند الإشارة إلى مكون تحتاج إلى استخدامها في وقت لاحق ، أو متى نطاق المشاكل التي يحتمل أن تسببها كتل "مع" يجب تجنبها. إليك رمز إنشاء TTimer من الأعلى ، باستخدام متغير الحقل كمرجع إلى كائن TTimer الذي تم إنشاء مثيل له:
FTimer: = TTimer. خلق (الذات) ؛
مع FTimer القيام به
ابدأ
الفاصل الزمني: = 1000 ؛
ممكن: = خطأ
OnTimer: = MyInternalTimerEventHandler ؛
النهاية؛
في هذا المثال ، "FTimer" هو متغير حقل خاص للنموذج أو الحاوية المرئية (أو أيًا كان "Self"). عند الوصول إلى متغير FTimer من الأساليب في هذه الفئة ، من المستحسن التحقق لمعرفة ما إذا كان المرجع صالحًا قبل استخدامه. يتم ذلك باستخدام وظيفة Delphi Assigned:
إذا معين (FTimer) ثم FTimer. ممكن: = صحيح ؛
إنشاء ديناميكي ومراجع كائن دون مالكي
الاختلاف في هذا الأمر هو إنشاء المكون بدون مالك ، مع الحفاظ على المرجع للتدمير اللاحق. سيبدو رمز إنشاء TTimer كما يلي:
FTimer: = TTimer. إنشاء (لا شيء) ؛
مع FTimer القيام به
ابدأ
...
النهاية؛
وسيظهر رمز التدمير (من المفترض في المدمر للنموذج) شيئًا مثل هذا:
FTimer. مجانا؛
FTimer: = لا شيء ؛
(*
أو استخدم إجراء FreeAndNil (FTimer) ، الذي يحرر مرجع كائن ويستبدل المرجع بـ nil.
*)
يعد تعيين مرجع الكائن إلى nil أمرًا مهمًا عند تحرير الكائنات. يتحقق استدعاء Free First لمعرفة ما إذا كان مرجع الكائن لا شيء أو لا ، وإذا لم يكن كذلك ، فإنه يستدعي إتلاف كائن التدمير.
إنشاء ديناميكي ومراجع كائن محلي دون مالكي
إليك رمز إنشاء TTable من الأعلى ، باستخدام متغير محلي كمرجع إلى كائن TTable الذي تم إنشاء مثيل له:
localTable: = TTable. إنشاء (لا شيء) ؛
محاولة
مع localTable القيام به
ابدأ
DataBaseName: = 'MyAlias'؛
اسم الجدول: = 'MyTable' ؛
النهاية؛
...
// لاحقًا ، إذا كنا نريد تحديد النطاق بشكل صريح:
الجدول المحلي. افتح؛
الجدول المحلي. تعديل؛
الجدول المحلي. FieldByName ('مشغول'). AsBoolean: = صواب ؛
الجدول المحلي. بريد؛
أخيرا
الجدول المحلي. مجانا؛
localTable: = لا شيء ؛
النهاية؛
في المثال أعلاه ، "localTable" هو متغير محلي أعلن في نفس الطريقة التي تحتوي على هذا الرمز. لاحظ أنه بعد تحرير أي كائن ، بشكل عام ، من الجيد جدًا تعيين الإشارة إلى لا شيء.
كلمة للتحذير
هام: لا تخلط مكالمة إلى Free مع تمرير مالك صالح إلى المُنشئ. جميع التقنيات السابقة ستعمل وستكون صالحة ، ولكن ينبغي أن يلي لم يحدث في التعليمات البرمجية الخاصة بك:
مع TTable. خلق (النفس) القيام به
محاولة
...
أخيرا
مجانا؛
النهاية؛
يقدم مثال التعليمة البرمجية أعلاه نتائج أداء غير ضرورية ، ويؤثر على الذاكرة قليلاً ، ولديه القدرة على تقديم أخطاء يصعب العثور عليها. اكتشف لماذا.
ملاحظة: إذا كان للمكون الذي تم إنشاؤه ديناميكيًا مالك (تم تحديده بواسطة معلمة AOwner الخاصة بإنشاء المنشئ) ، فسيكون ذلك المالك مسؤولًا عن إتلاف المكون. بخلاف ذلك ، يجب عليك الاتصال مجانًا بـ Free عندما لا تحتاج إلى المكون.
المادة كتبت أصلا من قبل مارك ميلر
تم إنشاء برنامج اختبار في دلفي إلى وقت إنشاء ديناميكي من 1000 مكونات مع تعداد المكونات الأولية المختلفة. يظهر برنامج الاختبار في أسفل هذه الصفحة. يعرض الرسم البياني مجموعة من النتائج من برنامج الاختبار ، ومقارنة الوقت الذي يستغرقه إنشاء مكونات مع مالكيها وبدونها. لاحظ أن هذا ليس سوى جزء من الضربة. يمكن توقع تأخير أداء مماثل عند تدمير المكونات. وقت إنشاء المكونات بشكل حيوي مع المالكين هو 1200٪ إلى 107960٪ أبطأ من وقت الإنشاء مكونات بدون مالكي ، اعتمادًا على عدد المكونات في النموذج والمكون الحالي خلقت.
برنامج الاختبار
تحذير: لا يقوم برنامج الاختبار هذا بتتبع المكونات المجانية التي تم إنشاؤها دون مالكيها مجانًا. من خلال عدم تتبع هذه المكونات وتحريرها ، فإن الأوقات المقاسة لرمز الإنشاء الديناميكي تعكس بدقة الوقت الفعلي لإنشاء مكون ديناميكي.
تحميل شفرة المصدر
تحذير!
إذا كنت ترغب في إنشاء مثيل لمكون دلفي بشكل ديناميكي وتحريره بشكل صريح في وقت لاحق في وقت لاحق ، فاختبر دائمًا عدم وجود مالك. يمكن أن يؤدي الفشل في القيام بذلك إلى حدوث مخاطر غير ضرورية ، بالإضافة إلى مشاكل في الأداء وصيانة الكود. اقرأ المقال "تحذير بشأن إنشاء مكونات دلفي بشكل ديناميكي" لمعرفة المزيد ...