مقدمة
في الأسابيع القليلة الماضية من العمل، أزعجتني مشكلة الصداع، أي أن عنصر تحكم ActiveX المكتوب في VB6 به العديد من المشكلات الغريبة في بيئة دلفي، وبعد العديد من التقلبات، قمت أخيرًا بالبحث في جميع المنتديات والمعلومات تقريبًا. ، وجد حلولًا للمشاكل التي تحدث في إصدارات دلفي المختلفة.
أحد الاستثناءات القاتلة التي لا يمكن تفسيرها في دلفي5
أولاً، دعونا نلقي نظرة على السلوك الغريب لعناصر تحكم ActiveX المكتوبة بلغة VB ضمن Delphi5.
على سبيل المثال: استخدمنا VB لكتابة عنصر تحكم UserTest (من أجل البساطة، نقوم بتصدير فئة واحدة فقط، عنصر تحكم المستخدم)، وخاصية TestName، وطريقة TestMethod. ثم قم بتجميعه في عنصر تحكم ActiveX، وتسجيله واستيراده إلى بيئة تطوير Delphi5 (إذا كان هناك أي شيء غير واضح حول الخطوات المذكورة أعلاه، فيرجى التحقق من المواد المرجعية المختلفة، ويجب أن تكون هناك إجابات قياسية)، حتى الآن، يبدو أن كل شيء طبيعي.
بعد ذلك، اعتدنا على سحب وإفلات عناصر التحكم في النموذج، وتغيير حجمها، وتعيين قيم للخصائص في نافذة الخصائص، أو الشيء نفسه في التعليمات البرمجية، وهو أمر عادي جدًا وسهل الاستخدام. ومع ذلك، هنا تأتي المشكلة. إذا قمت بتسمية TestMethod بحماس، فسوف تحصل على استثناء غريب "OleError800a01a9"، وبعد ذلك سيخرج البرنامج، ولسوء الحظ، لن تتمكن من تتبع هذا الاستثناء في دلفي سواء في VB أو في VB بالطبع، إذا كنت جيدًا في التجميع، يمكنك اتباع نافذة تصحيح أخطاء دلفي خطوة بخطوة...
عندما واجهت هذه المشكلة لأول مرة، كنت على وشك الغضب لأنه لم يكن لدى Microsoft ولا Borland أي تفسير للخطأ، ولا أي معلومات يمكن العثور عليها. اضطررت للذهاب إلى العديد من المنتديات التي كنت أتردد عليها، وبالطبع كان أهمها CSDN، وبحثت عن أسئلة مماثلة في إصدار VB وإصدار Delphi، ولسوء الحظ، لم تكن هناك سوى أسئلة مماثلة ولكن لم يكن هناك عميل كبير يستخدم هذا التطوير الأداة، بعد اختبار جميع أدوات التطوير وبيئات التطوير تقريبًا على Windows (بما في ذلك سطح المكتب والويب)، نسيت أمر دلفي.
في اليومين المتبقيين، كدت أن أتجول حول العالم، واتصلت بجميع أصدقائي وأسألهم عما إذا كان خبراء دلفي على علم بهذا الوضع، وأخيرًا، وجدت رابطًا من Google، ولسوء الحظ، نسيت الموقع الدقيق لهذا الرابط ، لكنني حصلت على طريقة سحرية تقريبًا (هذا ما يسميها المكتشف):
يمكن أن تحل هذه المشكلة طريقة التعديل اليدوي لملف مكتبة نوع الوكيل XXX_TLB.PAS (حيث يشير XXX إلى اسم فئة عنصر التحكم) الذي تم إنشاؤه بواسطة دلفي بعد استيراد عنصر تحكم VBActiveX. مثال:
هناك عنصر تحكم UserControl1 مكتوب بلغة VB بعد استيراده في دلفي، يتم إنشاء ملفين أحدهما، UserControl1_TLB.PAS، وهو الملف الذي نريد تعديله.
ابحث عن شيء مثل هذا في ملف
FintF:_UserControl1;
FunctionGetControlInterface:_UserControl1;
و
PROpertyControlInterface:_UserControl1readGetControlInterface;
this.GetControlInterface;
إلى جانب
الإجراء TUserControl1.CreateControl;
الإجراءDoCreate;
يبدأ
Finf:=IUnknown(OleObject)as_UserControl1;
نهاية؛
يبدأ
ifFinf=nilthenDoCreate;
نهاية؛
FunctionTUserControl1.GetControl1Interface:_UserControl1;
يبدأ
this.CreateControl;
النتيجة:=Finfl;
نهاية؛
يرجى ملاحظة: يجب استبدال كل _UserControl1 باللون الأحمر هنا بـ _UserControl1Disp. إذا لم ينجح التجميع، فيرجى استبدال كل _UserControl1 المذكور في تحذير التجميع بـ _UserControl1Disp، ولن يحدث الخطأ الفادح أعلاه عند استدعاء طريقة التحكم يحدث.
شكرًا على هذا الاكتشاف الرائع، لا يمكنني إلا أن أصفه على هذا النحو، وإلا فقد أظل عالقًا في هذه الدائرة، أو سأضطر إلى استخدام أداة أخرى لإعادة تطوير عنصر التحكم هذا (لا أستطيع تخيل حجم العمل الذي سيتطلبه هذا) ، أو قد يكون هناك مشكلات توافق أخرى).
دلفي 5 استثناء فادح لا يمكن تفسيره 2
ومع ذلك، لم تسمح لي دلفي بالرحيل بعد أن تحايلت على هذا القيد. وسرعان ما اكتشف العميل مشكلة مزعجة أخرى. في بيئة التطوير، يظهر استثناء في كل مرة يتم فيها إغلاق النموذج الذي يحتوي على عنصر التحكم في وقت التشغيل، ولكنه سيظهر لا يحدث ذلك في التطبيق المترجم، على الرغم من أنه لن يؤثر على استخدام المستخدمين النهائيين، إلا أنه يمثل مشكلة كبيرة للمطورين، ثم جربته باستخدام المثال أعلاه ووجدت أن هذا السؤال لم يحدث. (لقد أصابني الجنون في ذلك الوقت. ربما كان السبب في ذلك هو بعض الاستخدام غير المتوافق في التعليمات البرمجية. كان مخيفًا للغاية معرفة ما إذا كانت عشرات الآلاف من أسطر التعليمات البرمجية منتظمة في يوم واحد.) في نوبة من الغضب، قمت بحظر التحكم في كل التعليمات البرمجية، ولم يتبق سوى واجهة المستخدم نفسها، ثم حدث شيء غريب، لم أكتب أي كود، ولكن لا يزال هذا الخطأ يحدث عند تحميل عنصر التحكم الخاص بي، مما يجعلني سعيدًا ومتفاجئًا، والشيء السعيد هو أن هذه المشكلة لا علاقة لها بالكود الخاص بي، لذلك سيكون العثور عليها أسهل بكثير إن إسقاط بعض المعايير في عناصر التحكم VB يمكن أن يسبب مثل هذه الأخطاء الفظيعة في الواقع. وفي الساعتين التاليتين، واصلت حذف عناصر التحكم الموجودة على الواجهة لاختبار من تسبب في هذا الاستثناء القاتل.
وبعد ساعتين تنفست الصعداء ووجدت المشكلة الأساسية هي:
إذا كنت تستخدم عناصر تحكم الحاوية مثل Frame وPictureBox (والتي يمكن أن تحتوي على عناصر تحكم أخرى بداخلها) في عناصر تحكم مستخدم VB، فلن تتمكن من إضافة عناصر تحكم windowLess مثل Label وLine وImage إلى عناصر التحكم هذه (أي، لا توجد عناصر تحكم Window، يتم رسمها بواسطة VB في الوقت الفعلي أثناء وقت التشغيل)، وإلا فسوف تحصل على تقرير الخطأ كما هو مذكور أعلاه.
عناصر تحكم ActiveX المخفية في دلفي 6 و7
على وجه التحديد، بسبب التجربة الرهيبة في Delphi5، وجدت أنه لا يزال من الضروري اختبار ما إذا كانت نفس المشكلة موجودة في Delphi6 و7 (الإصدار السابق لم يعد ضروريًا نظرًا لوجود عدد قليل جدًا من المستخدمين، ولم يتم إصدار Delphi8 رسميًا بعد، لذا أنها غير متوفرة في الوقت الحاضر لا تعتبر). والنتيجة هي: ...بغض النظر عن عدد المرات التي أقوم فيها بتحميله، فلن أجد ذلك الرمز الصغير الذي طال انتظاره على شريط ActiveX. هذه النتيجة بالطبع مضحكة للغاية ولا أستطيع حتى تحميلها، ناهيك عما إذا كان الاختبار طبيعيًا أم لا.
وبالمثل، قمت بالبحث في العديد من المنتديات ومواقع الويب، ووجدت المزيد من الأشخاص الذين يطرحون أسئلة مماثلة في CSDN، لكن الإجابة كانت لا تزال صفرًا، وفي حالة من اليأس، اضطررت إلى ضبط الخيارات في كل من دلفي 6 و7...
بعد 3 ساعات و15 دقيقة و54 ثانية، وجدت السبب أو الحل لهذه المشكلة اللعينة (أرجوك سامحني على تسميتها بهذا الاسم، لم أستطع تحملها)، وهو في الواقع بسيط للغاية.
الآن يرجى متابعتي: انقر فوق قائمة الأدوات->خيارات البيئة->صفحة TypeLibrary، يجب أن نجد عنصرًا: IgnorespecialCoClassFlagsWhenImporting، حدده، ثم حدد عنصر CanCreate، لذا الآن، دعنا نحاول استيراد عنصر تحكم ActiveX الضعيف (يجب أن يكون لاحظ هنا أنه إذا قمت باستيراده مرة واحدة، فيرجى حذف الملفين اللذين تم إنشاؤهما، ملفات .dcr و.pas، وإلا فلن يتم تحديثه). إذا كنت لا تزال غير قادر على العثور على عنصر التحكم في عمود ActiveX هذه المرة، فيجب عليك الاتصال بشركة Microsoft أو Borland والسؤال عن الوقت الذي يمكنهم فيه الزواج، هاها!
(كما أن الأخطاء المذكورة أعلاه التي ظهرت في دلفي 5 لم يتم العثور عليها في دلفي 6 و 7)
بيئة الاختبار الخاصة بي هي:
WIN2K
تحديث دلفي51
تحديث دلفي62
دلفي7