دلفي - استكشاف المهارات:
{رقم 1}
الجمل لإنشاء نماذج مشروطة:
فئة PROcedure TMyForm.RunForm(AObj1, AObj2: TObject);
فار
vForm: تميفورم؛
يبدأ
vForm := TMyForm.Create(application);
مع vForm تفعل
يحاول
InitForm(AObj1, AObj2);
this.ShowModal;
أخيراً
حر؛
نهاية؛
نهاية؛
//*يوضح:
الوظائف المعلنة من خلال الفئة مشابهة للوظائف الثابتة في VC بيان الاستخدام: TMyForm.RunForm(vObj1, vObj2);
للحصول على معلومات محددة أخرى، يرجى الرجوع إلى: وصف الفصل في تعليمات دلفي.
والغرض من التأكيد على هذا المصطلح هو:
1. إذا تم استخدام هذا النموذج في أماكن متعددة، فيمكنك التأكد من استدعاء هذا الرمز بشكل موحد؛
2. إذا تم تعديل الوظيفة، على سبيل المثال: المعالجة بناءً على القيمة المرجعة لـ ShowModal، فقم بتعديل هذه الوظيفة فقط.
3. يتمتع البرنامج بتغليف جيد وسهل الصيانة والتسليم. *//
{رقم 2}//استخدام العلامة
الاستجابة لأحداث زر شريط أدوات النموذج
الإجراء TMyForm.RunOperate(ATag: Integer);
يبدأ
الحالة ATag of
1: MyButton.Color := clRed;
2: MyButton.Color := clGreen;
3: MyButton.Color := clBlack;
نهاية؛
نهاية؛
الإجراء TMyForm.ToolBtnClick(Sender: TObject);
يبدأ
RunOperate(TControl(Sender).Tag);
نهاية؛
إذا كنت في القائمة المنسدلة وتحتاج إلى أداء وظائف مماثلة،
الإجراء TMyForm.MenuItemClick(Sender: TObject);
يبدأ
RunOperate(TMenuItem(Sender).Tag);
نهاية؛
//*يوضح:
1. هيكل واضح
2. يتم تركيز المعلومات ذات الصلة، مما يسهل فحصها وتعديلها وصيانتها.
3. تحسين قدرة البرنامج على التكيف وقابلية التوسع؛ على سبيل المثال، إذا لم يتم تنفيذ المتطلبات في زر شريط الأدوات، ولكن تم تنفيذها في أزرار مختلفة، فسيكون من السهل تعديلها.
اقتراح: يتبع كل فئة سطر واحد فقط أو بضعة أسطر من التعليمات البرمجية، إذا كان هناك الكثير من التعليمات البرمجية، فاستخدم وظيفة العملية بدلاً من ذلك.
والأكثر إثارة للاهتمام هو أنني غالبًا ما أكتب على النحو التالي:
حالة btnMyButton.Visible of
{إظهار} صحيح: ...
{لا تظهر} خطأ: ...
نهاية؛ *//
{ No.3 }// مؤشر الحدث كمعلمة
// استخدم مؤشر الحدث لقراءة القوائم وما إلى ذلك.
يكتب
TDataSetEvent = الإجراء (DataSet: TDataSet; AIndex, ACount: Integer) للكائن؛
// الفئات المشتقة من TADOQuery
الإجراء TMyADOQuery.EnumRecord(AWhereStr: String; APro: TDataSetEvent);
يبدأ
يغلق؛
SQL.Clear؛
SQL.Add('اختر * من الجدول1');
إذا AWhereStr <> '' ثم
SQL.Add('Where' + AWhereStr);
يفتح؛
بينما لا تفعل ذلك
يبدأ
إذا تم تعيينه (APro) ثم APro (Self، RecNo، RecordCount)؛
التالي؛
نهاية؛
يغلق؛
نهاية؛
//*يوضح:
تأتي هذه الطريقة من وظيفة API في Window لتعداد كافة النوافذ الفرعية الحالية، EnumChildWindow
1. المبدأ: حاول فصل قراءة البيانات عن عرض البيانات ومعالجة البيانات وما إلى ذلك؛ مثل: MVC وما إلى ذلك كلها لهذا الغرض.
2. تم تحسين قابلية تطوير البرنامج إذا كنت تريد في الأصل عرض أو معالجة عمود معين من المعلومات في القائمة، ولكنك قمت بالتغيير لاحقًا إلى استخدام ComboBox، عند تعديل البرنامج، فلن تحتاج إلى قراءة جزء قراءة البيانات. ، ما عليك سوى تعديل عرض المعلومات، وما إلى ذلك. للحصول على مثال آخر، أنت مطالب الآن باستخدام شريط التقدم لعرض تقدم القراءة عند قراءة السجلات.
*//
{ رقم 4 } //مصفوفة ثابتة
{في رقم 2، تم تنفيذ المحتوى التالي
الإجراء TMyForm.RunOperate(ATag: Integer);
يبدأ
الحالة ATag of
1: MyButton.Color := clRed;
2: MyButton.Color := clGreen;
3: MyButton.Color := clBlack;
نهاية؛
نهاية؛
}
// إذًا سيكون من المثالي تنفيذه باستخدام مصفوفة.
الإجراء TMyForm.RunOperate(ATag: Integer);
ثابت
MyButtonColorMax := 3;
MyButtonColor: صفيف [1..MyButtonColorMax] من TColor = (clRed، clGreen، clBlack)؛
يبدأ
الحالة ATag of
1..MyButtonColorMax: MyButton.Color := MyButtonColor[ATag];
101:....
نهاية؛
نهاية؛
//*يوضح:
للاستخدام في وضع المصفوفة، لاحظ فقط أن الحد الأعلى أو الأدنى للمصفوفة يتم تنفيذه باستخدام الثوابت، ثم حاول استخدام هذا الثابت لقراءة حلقة المصفوفة في الاستخدامات المستقبلية.
*//
{رقم 5} تعمل آلية الرسالة على تقليل وظائف الفئة العامة
// كيفية تقليل تعريف الوظائف العامة في النموذج؛
{على سبيل المثال: إذا كنت تريد تنفيذ نموذج قائمة خصائص لعنصر تحكم النموذج الحالي، فعندما تحتاج إلى تحديث نموذج الخاصية؛ قم بتغيير قيمة خاصية معينة؛ وأضف خصائص جديدة، وما إلى ذلك؛ التي يجب التفاعل معها. إذا استخدمنا الوظائف العامة للفئة، فسنحتاج إلى تحديد العديد من الوظائف العامة. وفي الوقت نفسه، إذا كان تحويل نوع النموذج مطلوبًا، فلا يمكن استخدام الوظائف العامة إلا بعد التحويل إلى نوع النموذج المستهدف. لذلك، ستكون هناك مواقف تحتاج فيها الوحدتان إلى تضمين بعضهما البعض}
//حل:
TfrmMyForm = فئة(TForm)
FfrmProperty: TForm;
نهاية؛
...
FfrmProperty := TfrmProperty.MyCreate(Application, Self);
...
// عندما تحتاج نافذة الخاصية إلى التحديث
FfrmProperty.Perform(WD_REFRESHPROPERTYLIST, 0, 0);
TfrmProperty = فئة (TForm)
خاص
FMyForm: TForm؛
الإجراء WDREFRESHPROPERTYLIST(رسالة فار: رسالة TMessage WD_REFRESHPROPERTYLIST);
عام
منشئ MyCreate(Owner: TComponent; AForm: TForm);
نهاية؛
مُنشئ TfrmProperty.MyCreate(Owner: TComponent; AForm: TForm);
يبدأ
ورثت إنشاء (المالك)؛
FMyForm := AForm;
نهاية؛
//* بالنسبة لطريقة استخدام الرسائل، يمكن تقليل تعريف الوظائف العامة للنموذج. وفي الوقت نفسه، فإنه يحسن قابلية التوسع للبرنامج. إذا استخدمت النموذج الخاص به بدلاً من ذلك، فيمكن تحويله بسهولة، لأنه على الأكثر هو النموذج الخاص بك ولا يعالج الرسالة الحالية*)//
{رقم 6}استخدم قائمة التسجيل لإدارة وحدات التوسعة المحتملة
// المشروع: أنت مطالب بدعم طرق عرض المخرجات المتعددة لمجموعة البيانات
...سيتم تقديم الأمثلة لاحقا
//* يوضح:
1. "طرق الإخراج المتعددة" تعني أن طرق الإخراج قد يتم توسيعها بشكل متكرر في التطبيقات المستقبلية، لذلك يجب أخذ قابلية التوسع السهلة لطرق الإخراج في الاعتبار أثناء تصميم البرنامج.
2. بالرجوع إلى آلية تسجيل التحكم (RegisterComponents) في VCL، يمكنك العثور على عدد كبير من آليات التسجيل المستخدمة في VCL؛ والأكثر كلاسيكية هي تسجيل محرر خاصية التحكم.
*//
{رقم 7}استخدم إصدار برنامج التحكم المحدد مسبقًا
// إذا كنت تقوم ببرنامج منصة تطوير ثانوي، فيجب عليك إشراك التحكم في إصدار المنتج ومشكلات التحكم في إصدار المشروع
// يتم التحكم فيه عادةً باستخدام طرق محددة مسبقًا
// البيان بسيط نسبيا:
{$تعريف JOYYUAN97}
{$IFDEF JOYYUAN97} {ELSE} {ENDIF}
{$UNDEF JOYYUAN97}
*يوضح:
1. قم بتقسيم التعريف المسبق إلى عدة ملفات منفصلة.
2. في بداية كل وحدة ولكن بعد الوحدة، استخدم {$I ...} لتضمين الملف في الوحدة الحالية.
3. التحكم في ملفات الوحدة التي يمكن أن تحتويها الوحدة الحالية بناءً على شروط محددة مسبقًا
4. حاول فصل ملف محدد مسبقًا للمشروع. بعد تضمين كافة الملفات المحددة مسبقًا، قم بتضمين هذا الملف في هذا الملف، ويمكن إلغاء بعض الملفات المحددة مسبقًا وفقًا لاحتياجات المشروع.
*//
{رقم 8}استخدم مؤشرات الوظائف لتقليل تضمينات مشروع الوحدة
// غالبًا ما أعتقد أن تقليل تضمين الوحدات هو الخطوة الأولى في إنشاء الوحدات العامة، فكيف يمكن تقليل تضمين الوحدات قدر الإمكان
// أي أنه ينبغي بذل المزيد من الجهود حول كيفية تقليل اقتران وحدات البرنامج.
{وصف السيناريو:
TMyFormManager: فئة إدارة النموذج
TMyForm: الفئة الأساسية لنموذج البيانات
TMyFormaccess: فئة حفظ معلومات النموذج وقراءتها. احفظ معلومات النموذج في قاعدة بيانات أو أي نوع آخر من البنية
تحليل:
1. يجب تنفيذ فئة النموذج الأساسية (TMyForm) وفئة إدارة النموذج (TMyFormManager) في وحدة uManagers.
2. تحتاج وحدة فئة التنفيذ الخاصة بالنموذج (TMyImageForm) fMyImange إلى تضمين وحدة uManagers لوراثة النموذج وإدارة النموذج.
3. تحتاج وحدة فئة قراءة بيانات النموذج (TMyFormAccess) uMyAccess إلى تضمين الوحدة uManagers والوحدة fMyImange
سؤال:
إذا كنت أرغب في حفظ النموذج، فيجب أن يتم ذلك في حدث زر للنموذج. عندما يتعلق الأمر بوحدة النموذج، فإنها تحتاج إلى احتواء وحدة فئة الوصول إلى بيانات النموذج، وإذا تم وضعها في فئة النموذج الأساسية، فيجب أن تحتوي وحدة uManager على وحدة uMyAccess.
يشكل تضمين الخلية خطرًا عندما يتغير الوصول إلى البيانات، أي تنسيقات تخزين البيانات، بناءً على المتطلبات ويتطلب قابلية التوسع.
الحل: استخدم متغيرات مؤشر الوظيفة.
1. حدد متغير مؤشر الوظيفة في وحدة uManagers لحفظ معلومات البيانات.
2. قم بتعيين قيمة لمتغير مؤشر الوظيفة هذا عند تهيئة التطبيق.
3. عندما يكون من الضروري حفظ معلومات النموذج، حدد ما إذا كان المؤشر ليس فارغًا، ثم قم بتنفيذ الوظيفة لحفظ معلومات النموذج.
{رقم 9}الثوابت، افهم الثوابت، استخدم الثوابت
هناك العديد من الكتب التي تشرح أهمية التعريف الثابت، وكثيرًا ما أفكر في ذلك، لكن عندما أنظر إلى كود مصدر VCL، أدرك أنني تجاهلت استخدام الآخرين للثوابت.
1. تعريف الرسالة الذي نستخدمه غالبًا هو: الإعلان عن ثابت ثم استخدامه في الوقت المناسب.
يتم تعريفها واستخدامها بشكل شائع:
ثابت
WD_MyMessage = WM_User + 101;
يكتب
تميفورم = فئة(تفورم)
...
الإجراء WDMyMessage(var message: TMessage message WD_MyMessage {response message location});
نهاية؛
ومع ذلك، إذا قمت بإعادة كتابة عبارة {response message Position} على النحو التالي:
الإجراء WDMyMessage(var message: TMessage message WM_User + 101;
وبالمثل، يمكن أن يكون التجميع ناجحًا ويكون الاستخدام عاديًا. لذلك، تُستخدم التعريفات الثابتة بشكل شائع جدًا في معالجة أنظمة النوافذ والواجهات.
2. في دلفي، قمنا بتعريف متغيرات الألوان، clRed، clGreen، وما إلى ذلك، والتي هي أيضًا ثوابت محددة لتسهيل الاستخدام المستقبلي. من خلال هذه الملاحظة، وجدت أن تعريف الثوابت يجب أن يكون قابلاً لإعادة الاستخدام جزئيًا في المشروع، لذلك يمكن تعريف وحدة ثابتة قياسية بحيث يمكن إعادة استخدام الثوابت المحددة في كل مشروع.
{رقم 10}مصفوفة شائعة الاستخدام في دلفي
يوجد تطبيق كامل نسبيًا في دلفي لتعريف واستخدام المصفوفات من النوع TIdentMapEntryd.
TIdentMapEntry = السجل
القيمة: عدد صحيح؛
الاسم: سلسلة؛
نهاية؛
1. تعريف الصفيف: الصفيف [0..ArrMax] الخاص بـ TIdentMapEntry
يرجى الرجوع إلى: وحدة التحكم:
المؤشرات: الصفيف [0..21] من TIdentMapEntry = (
...
);
2. وظيفتان تقيمان بعضهما البعض: IntToIdent (ابحث عن الاسم من القيمة) وIdentToInt (ابحث عن القيمة من الاسم)؛
للحصول على تطبيقات محددة، يرجى الرجوع إلى: IdentToCursor وCursorToIdent.
3. التطبيق: أ. قم بتطبيق طريقة تعريف المجموعة الشجرية ووظيفة معالجة المصفوفة مباشرةً؛ ب. تعرف على كيفية الوصول إلى المصفوفات ومعالجتها. ج تعرف على تعريف وظيفة الوصول إلى المعلومات القياسية: الوظيفة IntToIdent(Int: Longint; var Ident: string; const Map: array of TIdentMapEntry): Boolean; يتم إرجاع المعلومات المحددة التي تم إرجاعها بواسطة المعلمات يتم تمريرها من خلال الدالة ويتم الحكم على قيمة الإرجاع المنطقية.
{رقم 11}من الحالات الخاصة إلى الاكتشافات الشائعة
لقد اكتشفت من خلال تتبع وظائف التعريف والتشغيل للمؤشرات:
1. كما هو مذكور في {رقم 10}، قم بتعميم التعريف والعمليات العامة للمؤشرات.
2. توفير وظائف للتحويل بين Int وIdent.
3. يوفر وظيفة لقراءة معلومات قائمة المصفوفة بشكل دوري: GetCursorValues؛ ومن بينها، يتم استخدام طريقة "مؤشر الحدث كمعلمة" المقدمة في {No.3} لقراءة معلومات القائمة.
ملحق {رقم 6}:
مثال:
الإجراء RegisterComponents(const Page: string;
ComponentClasses: مجموعة من TComponentClass)؛
يبدأ
إذا تم تعيينه (RegisterComponentsProc) بعد ذلك
تسجيل المكونات Proc (الصفحة، فئات المكونات)
آخر
رفع EComponentError.CreateRes(@SRegisterError);
نهاية؛
تفسير:
1. استخدم طريقة التسجيل لتسجيل أنواع الضوابط التي يمكن استخدامها، وما إلى ذلك.
3. بالنسبة إلى RegisterComponentsProc، يتم استخدام طريقة "استخدام مؤشرات الوظائف لتقليل تضمين مشاريع الوحدة" في {رقم 8} لتسهيل توسيع البرنامج في المستقبل، وترقيات الإصدار، وما إلى ذلك.
{رقم 11}حدد وظيفة عامة واحدة فقط
// وصف المشروع: نحتاج الآن إلى تنفيذ رسم CAD أو نظام Visio، الأمر الذي يتطلب قابلية تطوير جيدة وسهولة الصيانة؛
// ويتطلب اقترانًا منخفضًا، بحيث يمكن تعبئة أجزاء النظام أو النظام الموسع واستخدامها مباشرة في المشاريع المستقبلية.
تصميم:
1. قم بتصميم فئة مجردة للكائن الرسومي في هذه الفئة، قم بتعريف وظيفة مجردة CadPerform. تشير معلمات الوظيفة إلى الوظيفة TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
2. في فئة إدارة الرسومات، قم بتنفيذ إدارة قائمة كائنات الرسومات، وما يتم تخزينه في القائمة هو مؤشر الكائن المجرد.
3. عندما تريد التحكم في كائنات فئة معينة، ما عليك سوى استخدام وظيفة CanPerform، ثم تمرير الرسائل وفقًا لفئة العملية الحالية، وتمرير معلومات المعلمة المقابلة.
التنفيذ: TCad هي فئة التحكم من المستوى الأول الموروثة من الفئة المجردة
وظيفة TCad.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
يبدأ
رسالة حالة
My_Message1: النتيجة := MyMessage1(WParam, LParam);
My_Message2: النتيجة := MyMessage2(WParam, LParam);
نهاية؛
نهاية؛
بالنسبة إلى TPoint يرث من TCad، يتم تنفيذ وظيفة CadPerform على النحو التالي.
وظيفة TPoint.CadPerform(Msg: Cardinal; WParam, LParam: Longint): Longint;
يبدأ
رسالة حالة
My_Message1: النتيجة := MyMessage1(WParam, LParam); // تم حظر معالجة هذا النوع من العمليات في TCad
My_Message3: النتيجة := MyMessage3(WParam, LParam);
نتيجة أخرى:= ورثت CadPerform(Msg, WParam, LParam);
نهاية؛
نهاية؛
*يوضح:
نظرًا لأننا نقوم بتشغيل الكائنات الرسومية بشكل متكرر جدًا، فإننا نحدد وظيفة واجهة عامة ومفتوحة لتحقيق تغليف عالي للفئة وسهولة الصيانة وتوسيع البرنامج.
*//
{رقم 12}
فيما يلي متطلبات البرمجة الخاصة بي: (بعض المعلومات ليس لها قيود لغوية)
// يمكن العثور على جميع الحلول التالية تقريبًا بالطرق المذكورة أعلاه.
1. تقليل تعقيد البرنامج. أ. تقليل عدد الوظائف، واستخدام أساليب الحالة والعلامة، وتعلم كيفية تحديد الأداء ب. تقليل علاقات تداخل الوحدات، واستخدام أساليب تمرير الرسائل، وتقليل التضمين المتبادل لوحدات النموذج.
2. قلل
{رقم 13} استخدم البث لتنفيذ الإشعارات من فئات الإدارة إلى كائنات قائمة الإدارة
// بالنسبة لوصف المشروع {No.12}، عندما تتغير خصائص أو حالة التحكم في نموذج الرسم، غالبًا ما يكون من الضروري إخطار جميع الكائنات الرسومية وإجراء التغييرات المقابلة.
// إذا تم تحديد وظيفة بث واحدة فقط، فيمكن تحقيق إشعار الوالدين والطفل، مما سيؤدي أيضًا إلى تحسين قابلية إعادة الاستخدام وقابلية التوسع وسهولة الصيانة وما إلى ذلك للبرنامج وجعل بنية الفصل واضحة.
// على سبيل المثال: 1. في Visio وMapInfo، إذا تغير المقياس (نسبة التكبير/التصغير) للنموذج الحالي، فيجب إعادة رسم جميع الكائنات الرسومية المعروضة حاليًا باستخدام المقياس الجديد. 2. عند تغيير خط النموذج الافتراضي للنموذج الحالي، يجب أيضًا تغيير خطوط النص الخاصة بالكائنات الرسومية التي تستخدم خط النموذج افتراضيًا لعرض معلومات النص وفقًا لذلك.
// الحل، راجع آلية المعالجة في TWinControl التي تُعلم جميع عناصر التحكم الفرعية عند تغيير السمات أو الحالة:
الإجراء TWinControl.NotifyControls(Msg: Word);
فار
الرسالة: رسالة؛
يبدأ
message.Msg := Msg;
message.WParam := 0;
message.LParam := 0;
الرسالة. النتيجة := 0;
Broadcast(Message);// بث رسالة التغيير الحالية
نهاية؛
في:
الإجراء TWinControl.Broadcast(var message);
فار
أنا: عدد صحيح؛
يبدأ
لأنني := 0 إلى ControlCount - 1 do
يبدأ
Controls[I].WindowProc(TMessage(Message));
// التغيير إلى: باستخدام TMessage(Message) do Cads[I].CadPerform(msg, WParam, LParam);
إذا كانت TMessage(Message).النتيجة <> 0 ثم خروج؛
نهاية؛
نهاية؛
ومع ذلك، عندما نتعامل مع الكائنات الرسومية، قد نستدعي مباشرة الوظيفة العامة CanPerform الخاصة بـ Cads.
{لا. 14} قم بإنشاء الكائنات الخاصة بك ديناميكيًا عند الحاجة
على سبيل المثال: http://www.delphibbs.com/keylife/iblog_show.asp?xid=824
//************الخيار 2: إنشاء نموذج خاصية عند الحاجة
الاستخدامات
...
fProperty;
يكتب
TfrmMyMap = class
...
الإجراء OnfrmMyMapDestroy(Sender: TObject);
الإجراء OnMapGeoSelected(AGEo: TGeometry);
خاص
FfrmProperty: TfrmProperty;
الإجراء ShowPropertyForm(aVisible: Boolean);
عام
نهاية؛
إجراء TfrmMyMap.ShowPropertyForm(aVisible: Boolean);
يبدأ
إذا لم يتم تعيينه (FfrmProperty) ثم FfrmProperty := TfrmProperty.Create(Application);
FfrmProperty.Visible := aVisible;
نهاية؛
إجراء TfrmMyMap.OnfrmMyMapDestroy(Sender: TObject);
يبدأ
إذا تم تعيينه (FfrmProperty) ثم FfrmProperty.Free؛
نهاية؛
الإجراء TfrmMyMap.OnMapGeoSelected(AGEo: TGeometry);
يبدأ
إذا تم تعيينه (FfrmProperty) ثم FfrmProperty.MyRefresh(AGEo)؛
نهاية؛
وهنا يتم شرح:
1. قم بإنشاء الكائن الخاص بك FfrmProperty ديناميكيًا عند الحاجة
2. عند تحرير الكائن الحالي، حدد شرعية الكائن الخاص بك، ثم حرر الكائن الذي تم إنشاؤه ديناميكيًا.
{رقم 15}قم بإنشاء واجهة أو إنشاء هيكل
// وصف المشروع: عندما أقوم بتطوير عنصر تحكم في الجدول، إذا قمت بتعيين الخلية على Com، وإذا كان هناك الكثير من المعلومات في الجدول، فلا يمكن ضمان سرعة التحميل، بل إن هناك احتمال حدوث عطل. سبب استخدامي لـ Com هو أنه يمكن توسيع المعالجة والمعلومات الخاصة بكل خلية خارج نطاق التحكم في المستقبل.
الحل الخاص بي هو: إنشاء مثيل لكل عنصر تحكم مشتق من الخلية، وإنشاء العديد من كائنات البنية بشكل ديناميكي، سجل لتسجيل معلومات كل خلية، إذا كنت بحاجة إلى تشغيل الخلية، فقم بتعيين مؤشر كائن البنية لمكون الخلية، وستكون نتائج الاختبار مرضية للغاية.
لذلك، إذا كنت بحاجة إلى استخدام عدد كبير من مثيلات Com، فحاول إدارة مثيل واحد وصيانته، ويمكن إنشاء البيانات الموجودة فيه وإدارتها ديناميكيًا، مما سيكون له تأثير جيد من حيث السرعة.
بالإضافة إلى ذلك، حاول الإعلان عن مؤشر واجهة pMyInterface = ^IMyInterface، استخدم مؤشر الواجهة مباشرة عند تمرير المعلمات أو استخدامها، مما قد يؤدي إلى تقليل عدد استدعاءات وظيفة العد _AddInft، وما إلى ذلك، ويمكن أيضًا زيادة السرعة إذا كان العملية عادية.