مثير للإعجاب

إنشاء مكونات بشكل حيوي (في وقت التشغيل)

إنشاء مكونات بشكل حيوي (في وقت التشغيل)

في أغلب الأحيان ، عند البرمجة في دلفي ، لن تحتاج إلى إنشاء عنصر ديناميكي. إذا قمت بإسقاط مكون في نموذج ما ، فإن دلفي يعالج إنشاء المكون تلقائيًا عند إنشاء النموذج. ستغطي هذه المقالة الطريقة الصحيحة لإنشاء مكونات برمجيًا في وقت التشغيل.

إنشاء مكون ديناميكي

هناك طريقتان لإنشاء المكونات بشكل حيوي. طريقة واحدة هي جعل نموذج (أو بعض TComponent الأخرى) مالك المكون الجديد. هذه ممارسة شائعة عند إنشاء مكونات مركبة حيث تقوم حاوية بصرية بإنشاء وتملك المكونات الفرعية. سيؤدي القيام بذلك إلى التأكد من إتلاف المكون المنشأ حديثًا عند إتلاف المكون المالك.

لإنشاء مثيل (كائن) للفصل الدراسي ، يمكنك استدعاء الأسلوب "إنشاء" الخاص به. إنشئ المنشئ عبارة عن طريقة صفية ، على عكس كل الطرق الأخرى التي ستواجهها في برمجة دلفي ، والتي هي طرق كائن.

على سبيل المثال ، يعلن TComponent المُنشئ إنشاء كالتالي:

إنشاء منشئ (AOwner: TComponent) ؛ افتراضية؛

خلق ديناميكي مع مالكي
إليك مثال على الإبداع الديناميكي ، حيث الذات هو سليل TComponent أو TComponent (على سبيل المثال ، مثيل لـ TForm):

مع TTimer.Create (الذاتي) القيام به
ابدأ
الفاصل الزمني: = 1000 ؛
ممكن: = خطأ
OnTimer: = MyTimerEventHandler؛
النهاية؛

إنشاء ديناميكي مع دعوة صريحة إلى مجاني
الطريقة الثانية لإنشاء مكون هي الاستخدام صفر كمالك. لاحظ أنه إذا قمت بذلك ، يجب عليك أيضًا تحرير الكائن الذي تقوم بإنشائه بشكل صريح بمجرد عدم حاجتك إليه (أو ستنتج تسربًا للذاكرة). إليك مثال على استخدام nil كمالك:

مع TTable.Create (لا شيء) القيام به
محاولة
DataBaseName: = 'MyAlias'؛
اسم الجدول: = 'MyTable' ؛
افتح؛
تصحيح؛
FieldByName ('مشغول'). AsBoolean: = صواب ؛
بريد؛
أخيرا
حر؛
النهاية؛

إنشاء ديناميكي ومراجع الكائن
من الممكن تحسين المثالين السابقين عن طريق تعيين نتيجة استدعاء إنشاء لمتغير محلي للطريقة أو الانتماء إلى الفئة. غالبًا ما يكون هذا أمرًا مرغوبًا فيه عند الحاجة إلى استخدام الإشارات إلى المكون لاحقًا ، أو عند الحاجة إلى تجنب المشكلات التي قد تسببها كتل "مع". فيما يلي رمز إنشاء TTimer من أعلى ، باستخدام متغير الحقل كمرجع إلى كائن TTimer الذي تم إنشاء مثيل له:

FTimer: = TTimer.Create (Self) ؛
مع FTimer القيام به
ابدأ
الفاصل الزمني: = 1000 ؛
ممكن: = خطأ
OnTimer: = MyInternalTimerEventHandler؛
النهاية؛

في هذا المثال ، "FTimer" هو متغير حقل خاص للنموذج أو الحاوية المرئية (أو أيًا كان "Self"). عند الوصول إلى متغير FTimer من الأساليب في هذه الفئة ، من المستحسن التحقق لمعرفة ما إذا كان المرجع صالحًا قبل استخدامه. يتم ذلك باستخدام وظيفة Delphi Assigned:

إذا تم تعيينه (FTimer) ثم FTimer.Enabled: = True؛

إنشاء ديناميكي ومراجع كائن دون مالكي
الاختلاف في هذا الأمر هو إنشاء المكون بدون مالك ، مع الحفاظ على المرجع للتدمير اللاحق. سيبدو رمز إنشاء TTimer كما يلي:

FTimer: = TTimer.Create (لا شيء) ؛
مع FTimer القيام به
ابدأ

النهاية؛

وسيظهر رمز التدمير (من المفترض في المدمر للنموذج) شيئًا مثل هذا:

FTimer.Free.
FTimer: = لا شيء ؛
(*
أو استخدم إجراء FreeAndNil (FTimer) ، الذي يحرر مرجع كائن ويستبدل المرجع بـ nil.
*)

يعد تعيين مرجع الكائن إلى صفر أمرًا مهمًا عند تحرير الكائنات. يتحقق استدعاء Free First لمعرفة ما إذا كان مرجع الكائن لا شيء أو لا ، وإذا لم يكن كذلك ، فإنه يستدعي إتلاف كائن التدمير.

إنشاء ديناميكي ومراجع كائن محلي دون مالكي

إليك رمز إنشاء TTable من الأعلى ، باستخدام متغير محلي كمرجع إلى كائن TTable الذي تم إنشاء مثيل له:

localTable: = TTable.Create (لا شيء) ؛
محاولة
مع localTable القيام به
ابدأ
DataBaseName: = 'MyAlias'؛
اسم الجدول: = 'MyTable' ؛
النهاية؛

// لاحقًا ، إذا كنا نريد تحديد النطاق بشكل صريح:
localTable.Open.
localTable.Edit.
localTable.FieldByName ('مشغول'). AsBoolean: = True؛
localTable.Post.
أخيرا
localTable.Free.
localTable: = لا شيء ؛
النهاية؛

في المثال أعلاه ، "localTable" هو متغير محلي تم الإعلان عنه بنفس الطريقة التي تحتوي على هذا الرمز. لاحظ أنه بعد تحرير أي كائن ، بشكل عام ، من الجيد جدًا تعيين الإشارة إلى لا شيء.

كلمة للتحذير

هام: لا تخلط مكالمة إلى Free مع تمرير مالك صالح إلى المُنشئ. جميع التقنيات السابقة ستعمل وستكون صالحة ، لكن ينبغي اتباع ما يلي لم يحدث في التعليمات البرمجية الخاصة بك:

مع TTable.Create (النفس) القيام به
محاولة

أخيرا
حر؛
النهاية؛

يقدم مثال التعليمة البرمجية أعلاه نتائج أداء غير ضرورية ، ويؤثر على الذاكرة قليلاً ، ولديه القدرة على تقديم أخطاء يصعب العثور عليها. اكتشف لماذا.

ملاحظة: إذا كان للمكون الذي تم إنشاؤه ديناميكيًا مالك (تم تحديده بواسطة معلمة AOwner الخاصة بإنشاء المنشئ) ، فسيكون ذلك المالك مسؤولًا عن إتلاف المكون. خلاف ذلك ، يجب عليك الاتصال بشكل مجاني صراحة عندما لم تعد بحاجة إلى المكون.

المادة كتبت أصلا من قبل مارك ميلر

تم إنشاء برنامج اختبار في دلفي إلى وقت إنشاء ديناميكي من 1000 مكونات مع تعداد المكونات الأولية المختلفة. يظهر برنامج الاختبار في أسفل هذه الصفحة. يعرض الرسم البياني مجموعة من النتائج من برنامج الاختبار ، ومقارنة الوقت الذي يستغرقه إنشاء مكونات مع مالكيها وبدونها. لاحظ أن هذا ليس سوى جزء من الضربة. يمكن توقع تأخير أداء مماثل عند تدمير المكونات. يكون وقت إنشاء المكونات مع المالكين ديناميكيًا أبطأ من 1200٪ إلى 107960٪ من وقت إنشاء المكونات بدون المالكين ، اعتمادًا على عدد المكونات في النموذج والمكون الذي يتم إنشاؤه.

برنامج الاختبار

تحذير: لا يقوم برنامج الاختبار هذا بتعقب المكونات المجانية التي يتم إنشاؤها دون مالكيها مجانًا. من خلال عدم تتبع هذه المكونات وتحريرها ، فإن الأوقات المقاسة لرمز الإنشاء الديناميكي تعكس بدقة الوقت الفعلي لإنشاء مكون ديناميكي.

تحميل شفرة المصدر

تحذير!

إذا كنت ترغب في إنشاء مثيل لمكون دلفي بشكل ديناميكي وتحريره بشكل صريح في وقت لاحق في وقت لاحق ، فاختبر دائمًا عدم وجود مالك. يمكن أن يؤدي الفشل في القيام بذلك إلى حدوث مخاطر غير ضرورية ، بالإضافة إلى مشاكل في الأداء وصيانة الكود. اقرأ المقال "تحذير بشأن إنشاء مكونات دلفي بشكل ديناميكي" لمعرفة المزيد ...