"مشكلة" دلفي: TForm. إنشاء () - لا شيء أو ذاتي أو تطبيق؟

عند إنشاء كائنات دلفي بشكل ديناميكي التي ترث من TControl ، مثل TForm (تمثل نموذج / نافذة في تطبيقات دلفي) ، يتوقع المنشئ "إنشاء" معلمة "المالك":

إنشاء منشئ (AOwner: TComponent) ؛

المعلمة AOwner هي مالك كائن TForm. يتحمل مالك النموذج مسؤولية تحرير النموذج - أي الذاكرة المخصصة بواسطة النموذج - عند الحاجة. يظهر النموذج في مصفوفة المكونات الخاصة بمالكه ويتم إتلافه تلقائيًا عندما يتم تدمير مالكه.

لديك ثلاثة خيارات لمعلمة AOwner: لا شيء, الذات، و تطبيق.

لفهم الإجابة ، تحتاج أولاً إلى معرفة معنى "لا شيء" و "ذاتي" و "تطبيق".

  • لا شيء يحدد أنه لا يوجد كائن يمتلك النموذج وبالتالي فإن المطور مسؤول عن تحرير النموذج الذي تم إنشاؤه (عن طريق استدعاء myForm. مجانًا عندما لا تكون بحاجة إلى النموذج)
  • الذات يحدد الكائن الذي يتم استدعاء الأسلوب به. على سبيل المثال ، إذا كنت تقوم بإنشاء مثيل جديد لنموذج TMyForm من داخل معالج OnClick للزر (حيث يتم وضع هذا الزر في MainForm) ، الذات يشير إلى "MainForm". وبالتالي ، عندما يتم تحرير MainForm ، فسيتم أيضًا تحرير MyForm.
  • تطبيق يحدد متغير نوع TApplication عام تم إنشاؤه عند تشغيل التطبيق الخاص بك. يقوم "التطبيق" بتغليف التطبيق الخاص بك بالإضافة إلى توفير العديد من الوظائف التي تحدث في خلفية البرنامج.
    instagram viewer

أمثلة:

  1. أشكال مشروط. عند إنشاء نموذج ليتم عرضه بطريقة مشروعة وتحريره عندما يغلق المستخدم النموذج ، استخدم "لا شيء" بصفته المالك:
    var myForm: TMyForm ؛ بدء myForm: = TMyForm. خلق(لا شيء); جرب myForm. ShowModal ؛ أخيرا myForm. مجانا؛ النهاية؛ النهاية؛
  2. أشكال غير مشروط. استخدم "التطبيق" كمالك:
    فار
    myForm: TMyForm ؛
    ...
    myForm: = TMyForm. إنشاء التطبيق) ؛

الآن ، عند إنهاء (إنهاء) التطبيق ، سيحرر كائن "التطبيق" مثيل "myForm".

لماذا ومتى يكون TMyForm. إنشاء (تطبيق) غير مستحسن؟ إذا كان النموذج نموذجًا مشروطًا وسيتم تدميره ، يجب عليك تمرير "صفر" للمالك.

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

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

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

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

في تطبيقات SDI، عندما يغلق المستخدم النموذج (بالنقر على الزر [x]) ، يظل النموذج موجودًا في الذاكرة - يتم إخفاؤه فقط. في تطبيقات MDI ، يؤدي إغلاق نموذج تابع لـ MDI إلى تقليله فقط.
ال OnClose يوفر الحدث عمل المعلمة (من نوع TCloseAction) التي يمكنك استخدامها لتحديد ما يحدث عندما يحاول المستخدم إغلاق النموذج. سيؤدي تعيين هذه المعلمة إلى "caFree" إلى تحرير النموذج.

الملاح نصائح دلفي:
»احصل على HTML الكامل من مكون TWebBrowser
«كيفية تحويل بكسل إلى مليمتر

instagram story viewer