تهدف هذه الوثيقة بشكل أساسي إلى تزويد مطوري دلفي بمعيار كتابة التعليمات البرمجية المصدر، بالإضافة إلى معيار تسمية البرامج والملفات، حتى يتمكنوا من الحصول على تنسيق ثابت يجب اتباعه عند البرمجة. بهذه الطريقة، يكتب كل مبرمج تعليمات برمجية يمكن للآخرين فهمها.
المسافة البادئة تعني مسافتين بين كل مستوى. لا تضع أحرف علامة التبويب في التعليمات البرمجية المصدر. وذلك لأن عرض حرف علامة التبويب يختلف باختلاف الإعدادات والأدوات المساعدة لإدارة التعليمات البرمجية (الطباعة، والتوثيق، والتحكم في الإصدار، وما إلى ذلك).
باستخدام قائمة الأدوات|البيئة، في الصفحة العامة لمربع الحوار خيارات البيئة، قم بإلغاء تحديد خانات الاختيار استخدام حرف علامة التبويب والتعبئة الاختيارية حتى لا يتم حفظ أحرف علامة التبويب.
تم ضبط الهوامش على 80 حرفًا. بشكل عام، كود المصدر لا يتجاوز الهامش بكتابة كلمة واحدة، لكن هذه القاعدة أكثر مرونة. كلما أمكن، يجب تغليف البيانات الأطول من سطر واحد بفواصل أو عوامل تشغيل. بعد فاصل الأسطر، يجب أن يكون هناك مسافة بادئة بواسطة حرفين.
يجب أن تكون عبارة البداية على سطر بمفردها. على سبيل المثال، السطر الأول أدناه غير صحيح، ولكن السطر الثاني صحيح:
for i:=0 to 10 do begin // خطأ، start و for موجودان على نفس السطر
for i:=0 to 10 do // نعم، ابدأ بسطر آخر
يبدأ
هناك حالة خاصة لهذه القاعدة عندما يكون start جزءًا من تعليمة else، على سبيل المثال:
إذا كان بعض البيان = ثم
يبدأ
.
نهاية
آخر تبدأ
بعض البيان الآخر؛
نهاية؛
ملحوظة: العبارة النهائية تكون دائمًا في سطر منفصل. عندما لا تكون begin جزءًا من عبارة else، يتم وضع مسافة بادئة لعبارة النهاية المقابلة بنفس المقدار الموجود في عبارة begin.
عادةً ما نستخدم التعليقات الجماعية من النوع "{...}". يتم استخدام التعليقات الجماعية السابقة من النوع "(*...*) للتعليق مؤقتًا على التعليمات البرمجية غير المستخدمة. بدءًا من دلفي 2، يتم دعم الخط "//". التعليقات، إذا قررت عدم دعم الإصدارات الأقل من Delphi 2.0، فيمكنك استخدام التعليق "//".
لا توجد مسافة بين قوس الفتح والحرف التالي. وبالمثل، لا توجد مسافة بين قوس الإغلاق والحرف السابق. يوضح المثال التالي المسافة البيضاء الصحيحة وغير الصحيحة.
CallPRoc(معلمة) // خطأ!
CallProc(Aparameter);//صحيح!
لا تقم بتضمين أقواس إضافية في البيانات. في الكود المصدري، يتم استخدام الأقواس فقط عند الحاجة إليها حقًا. توضح الأمثلة التالية الاستخدام الصحيح وغير الصحيح:
إذا (I=42) إذن // خطأ، الأقواس زائدة عن الحاجة
إذا كان (I=42) أو (J=42) إذن // صحيح، يجب استخدام الأقواس
الكلمات والكلمات الأساسية المحجوزة في لغة Object Pascal تكون دائمًا بأحرف صغيرة تمامًا. فيما يلي قائمة بالكلمات المحجوزة في دلفي 5:
و | صفيف | مثل | asm |
يبدأ | قضية | فصل | ثابت |
منشئ | المدمر | com.dispenterface | شعبة |
يفعل | وصولا الى | آخر | نهاية |
يستثني | صادرات | ملف | وضع اللمسات النهائية |
أخيراً | ل | وظيفة | انتقل إلى |
لو | تطبيق | في | ورثت |
التهيئة | مضمنة | واجهة | يكون |
ملصق | مكتبة | وزارة الدفاع | لا شيء |
لا | هدف | ل | أو |
خارج | معبأة | إجراء | برنامج |
ملكية | يرفع | سِجِلّ | يكرر |
سلسلة الموارد | تعيين | shl | shr |
خيط | ثم | Threadvar | ل |
يحاول | يكتب | وحدة | حتى |
الاستخدامات | فار | بينما | مع |
xor | خاص | محمي | عام |
نشرت | الآلي |
يجب أن تبدأ أسماء الإجراءات بحرف كبير وأن تكون متداخلة لزيادة إمكانية القراءة. فيما يلي طريقة غير صحيحة للكتابة:
هذا الإجراء هو اسم روتيني منسق بشكل سيئ؛
فقط قم بتغييره إلى هذا:
الإجراء ThisIsMuchMoreReadableRoutineName؛
كلما أمكن، ينبغي تجميع المعلمات من نفس النوع معًا:
الإجراء Foo(Param1,Param2,Param3:Imteger;Param4:string);
يعتمد ترتيب المعلمات الرسمية بشكل أساسي على قواعد استدعاء السجل. يجب أن تكون المعلمة الأكثر استخدامًا هي المعلمة الأولى، مرتبة من اليسار إلى اليمين حسب تكرار الاستخدام. معلمات الإدخال تسبق معلمات الإخراج. يجب وضع المعلمات ذات النطاق الكبير قبل المعلمات ذات النطاق الصغير. على سبيل المثال:
SomeProc(كوكب، قارة، بلد، دولة، مدينة).
بعضها استثناءات. على سبيل المثال، أثناء معالجة الحدث، غالبًا ما تكون معلمة المرسل من النوع TObject هي المعلمة الأولى التي سيتم تمريرها.
لمنع تعديل معلمات السجل أو المصفوفة أو السلسلة القصيرة أو نوع الواجهة بواسطة الإجراء، يجب وضع علامة Const على المعلمة الرسمية. بهذه الطريقة، سيقوم المترجم بإنشاء التعليمات البرمجية بأكثر الطرق فعالية، مما يضمن أن المعلمات التي تم تمريرها غير قابلة للتغيير.
إذا لم يكن من المتوقع تعديل الأنواع الأخرى من المعلمات بواسطة الإجراء، فيمكن أيضًا وضع علامة عليها Const. وعلى الرغم من أن هذا ليس له أي تأثير على الكفاءة، إلا أنه يمنح المتصل بالإجراء مزيدًا من المعلومات.
يتم استخدام المتغيرات المحلية داخل الإجراء، إذا لزم الأمر، يجب تهيئة المتغيرات فورًا عند دخول الإجراء. تتم تهيئة متغيرات نوع AnsiString المحلية تلقائيًا إلى سلسلة فارغة، وتتم تهيئة متغيرات نوع الواجهة المحلية ونوع dispinterface تلقائيًا إلى صفر، وتتم تهيئة متغيرات النوع Variant وOleVariant المحلية تلقائيًا إلى غير معين.
لا يُنصح عمومًا باستخدام المتغيرات العالمية. ومع ذلك، في بعض الأحيان هناك حاجة إليها. ومع ذلك، يجب أن تقتصر المتغيرات العالمية على البيئات التي تكون هناك حاجة إليها. على سبيل المثال، قد يكون المتغير الشامل عالميًا فقط بالنسبة لجزء التنفيذ من الوحدة.
يجب نقل البيانات الشاملة التي ستستخدمها العديد من الوحدات إلى وحدة مشتركة واستخدامها بواسطة جميع الكائنات. يمكن تهيئة البيانات العالمية مباشرة إلى قيمة عند الإعلان عنها. لاحظ أن جميع المتغيرات العامة تتم تهيئتها تلقائيًا بصفر، لذا لا تقم بتهيئة المتغيرات العامة إلى قيم فارغة مثل 0 أو nil أو Unsigned. لا تشغل المتغيرات العامة ذات التهيئة الصفرية أي مساحة في ملف .EXE. يتم تخزين البيانات التي تمت تهيئتها صفرًا في مقطع بيانات ظاهري، ويقوم مقطع البيانات الظاهري بتخصيص الذاكرة فقط عند بدء تشغيل التطبيق. تشغل البيانات العالمية التي تمت تهيئتها بدون الصفر مساحة في ملف .EXE.
معرفات النوع هي كلمات محجوزة ويجب أن تكون جميعها بأحرف صغيرة. غالبًا ما تكون أنواع Win32 API مكتوبة بأحرف كبيرة وتتبع القواعد الخاصة بأسماء أنواع معينة في Windows.pas أو وحدات API الأخرى. بالنسبة لأسماء المتغيرات الأخرى، يجب أن يكون الحرف الأول كبيرًا، ويجب أن تكون الأحرف الأخرى بحالة متناوبة. فيما يلي بعض الأمثلة:
فار
MyString: سلسلة // كلمات محجوزة
WindowsHandle: HWND; // نوع Win32 API
I: عدد صحيح؛ //معرف النوع المقدم في وحدة النظام
لا يُنصح باستخدام النوع الحقيقي لأنه مخصص فقط للتوافق مع كود باسكال الأقدم. عادةً، يجب استخدام Double لأرقام الفاصلة العائمة. يمكن تحسين Double بواسطة المعالج وهو تنسيق بيانات قياسي محدد بواسطة IEEE. يمكن استخدام التوسيع عند الحاجة إلى نطاق أكبر مما يوفره Double. يعد Extend نوعًا خاصًا بـ Intel ولا يدعمه Java. عندما يكون العدد الفعلي للبايتات لمتغير الفاصلة العائمة مهمًا (ربما باستخدام لغة مختلفة لكتابة ملف DLL)، يجب استخدام Single.
لا يُنصح عمومًا باستخدام Variant وOleVariant. ومع ذلك، فإن هذين النوعين ضروريان للبرمجة عندما يكون نوع البيانات معروفًا فقط في وقت التشغيل (غالبًا في تطبيقات COM وقاعدة البيانات). عند القيام ببرمجة COM مثل أتمتة عناصر تحكم ActiveX، يجب عليك استخدام OleVariant للبرمجة غير التابعة لـ COM، ويجب عليك استخدام Variant. وذلك لأن Variant يمكنه حفظ سلاسل دلفي الأصلية بشكل فعال، بينما يقوم OleVariant بتحويل جميع السلاسل إلى سلاسل OLE (على سبيل المثال، سلاسل WideChar) وليس لديه وظيفة عد مرجعية.
في عبارة if/then/else، يجب وضع حالة التنفيذ الأكثر احتمالية في عبارةthen، ويجب وضع الحالة الأقل احتمالًا في جملة else. لتجنب العديد من عبارات if، استخدم عبارات الحالة بدلاً من ذلك. إذا كان هناك أكثر من 5 مستويات، فلا تستخدم عبارات if. الرجاء استخدام طريقة أكثر وضوحًا بدلاً من ذلك. لا تستخدم أقواسًا إضافية في عبارات if.
إذا كانت هناك شروط متعددة ليتم اختبارها في عبارة if، فيجب ترتيبها من اليمين إلى اليسار حسب التعقيد الحسابي. يتيح ذلك للكود الاستفادة الكاملة من منطق تقدير الدائرة القصيرة للمترجم. على سبيل المثال، إذا كان Condition1 أسرع من Condition2 وكان Condition2 أسرع من Condition3، فيجب إنشاء عبارة if بشكل عام على النحو التالي:
إذا Condition1 وCondition2 وCondition3 ثم
إذا كان هناك احتمال كبير بأن الشرط 3 خطأ، باستخدام منطق تقدير الدائرة القصيرة، فيمكننا أيضًا وضع الشرط 3 في المقدمة:
إذا Condition3 وCondition1 وCondition2 ثم
يجب ترتيب الثوابت لكل حالة في بيان الحالة بالترتيب العددي أو الأبجدي. يجب أن يكون بيان الإجراء لكل موقف قصيرًا ولا يزيد عادةً عن 4 إلى 5 أسطر من التعليمات البرمجية. إذا كان الإجراء معقدًا جدًا، فيجب وضع الكود في إجراء أو وظيفة منفصلة. يتم استخدام جملة else في بيان الحالة فقط للحالات الافتراضية أو اكتشاف الأخطاء.
تتبع بيانات الحالة قواعد المسافة البادئة والتسمية العادية.
يوصى بعدم استخدام إجراء الخروج للخروج من الحلقة أثناء ذلك. إذا لزم الأمر، يجب استخدام شرط الحلقة للخروج من الحلقة. يجب أن تكون جميع التعليمات البرمجية التي تقوم بتهيئة الحلقة while موجودة قبل الإدخال while ولا يجب فصلها بعبارات غير ذات صلة. يجب تنفيذ أي عمل مساعد للشركة مباشرة بعد الدورة.
إذا تم تحديد عدد الحلقات، فيجب استخدام عبارة for بدلاً من عبارة while.
عبارة التكرار تشبه حلقة while وتتبع نفس القواعد.
يجب استخدام العبارة with بحذر. تجنب الإفراط في استخدام عبارات with، خاصة عند استخدام كائنات أو سجلات متعددة ضمن عبارة with. على سبيل المثال:
مع Record1، Record2 القيام به
يمكن لهذه المواقف أن تربك المبرمجين بسهولة وتجعل تصحيح الأخطاء أمرًا صعبًا.
تتبع عبارة with أيضًا قواعد هذا الفصل فيما يتعلق بالتسمية والمسافة البادئة.
تُستخدم معالجة الاستثناءات بشكل أساسي لتصحيح الأخطاء وحماية الموارد. وهذا يعني أنه أينما يتم تخصيص الموارد، يجب استخدام المحاولة... وأخيرًا لضمان تحرير الموارد. ومع ذلك، يتم إجراء استثناءات إذا تم تخصيص/تحرير الموارد في الجزء الأولي/الأخير من الوحدة أو في منشئ/مدمر الكائن.
حيثما أمكن، يجب أن يتطابق كل تخصيص للموارد مع بنية المحاولة...أخيرًا. على سبيل المثال، قد يتسبب التعليمة البرمجية التالية في حدوث خطأ:
SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
يحاول
{قم ببعض التعليمات البرمجية}
أخيراً
SomeClass1.Free;
SomeClass2.Free;
نهاية؛
الحل الآمن لتخصيص الموارد أعلاه هو:
SomeClass1 := TSomeClass.Create;
يحاول
SomeClass2 := TSomeClass.Create;
يحاول
{قم ببعض التعليمات البرمجية}
أخيراً
SomeClass2.Free;
نهاية؛
أخيراً
SomeClass1.Free;
نهاية؛
إذا كنت تريد تنفيذ بعض المهام عند حدوث استثناء، فيمكنك استخدام المحاولة...إلا. عادةً، ليست هناك حاجة لاستخدام "محاولة..." إلا لعرض رسالة خطأ ببساطة، لأن كائن التطبيق يمكنه القيام بذلك تلقائيًا بناءً على السياق. إذا كنت تريد تنشيط معالجة الاستثناء الافتراضي في الجملة، فيمكنك تشغيل الاستثناء مرة أخرى.
لا يُنصح باستخدام المحاولة...إلا مع عبارة else لأن هذا سيمنع كافة الاستثناءات، بما في ذلك الاستثناءات التي لست مستعدًا للتعامل معها.
يجب أن تكون أسماء الإجراءات والوظائف ذات معنى. من الأفضل أن يتم بادئة اسم عملية تنفيذ الإجراء بالفعل الذي يعبر عن الإجراء. على سبيل المثال:
الإجراء FormatHardDrive؛
يجب أن يكون اسم الإجراء الخاص بتعيين قيم معلمات الإدخال مسبوقًا بـ Set، على سبيل المثال:
الإجراء SetUserName؛
يجب أن يكون اسم إجراء الحصول على القيمة مسبوقًا بـ Get، على سبيل المثال:
الدالة GetUserName:string;
يجب أن يعبر اسم جميع المعلمات الرسمية عن الغرض منها. إذا كان ذلك مناسبًا، فمن المفضل أن يكون اسم المعلمة الرسمية مسبوقًا بالحرف a، على سبيل المثال:
الإجراء SomeProc(aUserName:string; aUserAge:integer);
تكون البادئة a ضرورية عندما يكون اسم المعلمة له نفس اسم سمة أو حقل فئة.
عندما تحتوي وحدتان على إجراءات بنفس الاسم، إذا تم استدعاء الإجراء، فسيتم استدعاء الإجراء الموجود لاحقًا في الوحدة التي تظهر لاحقًا في جملة الاستخدامات. لتجنب ذلك، قم بإضافة اسم الوحدة المطلوبة قبل اسم الطريقة، على سبيل المثال:
SysUtils.FindClose(SR);
أو Windows.FindClose(Handle);
يجب أن يعبر اسم المتغير عن الغرض منه. غالبًا ما تكون متغيرات التحكم في الحلقة عبارة عن أحرف مفردة، مثل I أو J أو K. يمكنك أيضًا استخدام اسم أكثر وضوحًا، مثل UserIndex. يجب أن تشير أسماء المتغيرات المنطقية بوضوح إلى معنى قيمتي True وFalse.
تتبع المتغيرات المحلية قواعد تسمية المتغيرات الأخرى.
تبدأ المتغيرات العامة بالحرف الكبير "G" وتتبع قواعد تسمية المتغيرات الأخرى.
يجب أن يمثل اسم نوع التعداد الغرض من التعداد. يجب أن يكون الحرف T مسبوقًا قبل الاسم للإشارة إلى أن هذا نوع بيانات. يجب أن تحتوي بادئة قائمة المعرفات الخاصة بنوع التعداد على 2-3 أحرف صغيرة لربطها ببعضها البعض. على سبيل المثال:
TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
اسم مثيل المتغير لنوع التعداد هو نفس النوع، ولكن بدون البادئة T. يمكنك أيضًا إعطاء المتغير اسمًا أكثر خصوصية، مثل: FavoriteSongTypel، FavoriteSongType2، إلخ.
يجب أن يعبر اسم نوع المصفوفة عن الغرض من المصفوفة. يجب أن تكون أسماء الأنواع مسبوقة بالحرف "T". إذا كنت تريد الإعلان عن مؤشر لنوع مصفوفة، فيجب عليك أن تسبقه بالحرف P وتعلن عنه قبل إعلان النوع. على سبيل المثال:
يكتب
PCycleArray = ^TCycleArray;
TCycleArray=array[1..100] من عدد صحيح؛
في الواقع، المثيل المتغير لنوع المصفوفة له نفس اسم النوع، ولكن بدون البادئة "T".
يجب أن يعبر اسم نوع السجل عن الغرض من السجل. يجب أن تكون أسماء الأنواع مسبوقة بالحرف T. إذا كنت تريد الإعلان عن مؤشر لنوع سجل، فيجب عليك أن تسبقه بالحرف P وتعلن عنه قبل إعلان النوع. على سبيل المثال:
يكتب
PEmployee = ^TEmployee;
TEmployee=سجل
اسم الموظف: سلسلة؛
معدل الموظف: مزدوج؛
نهاية؛
يجب أن يعبر اسم الفصل عن الغرض من الفصل. بشكل عام، يجب إضافة الحرف "T" قبل اسم الفئة، إذا كانت فئة واجهة، فيجب إضافة "I" قبل اسم الفئة مع "E". ويجب إضافة نوع مرجع الفئة (نوع مرجع الفئة) قبل اسم الفئة. أضف "فئة" بعد الاسم. على سبيل المثال:
يكتب
TCustomer = class(TObject);
ICustomer = الواجهة;
TCustomerClass = فئة TCustomer
ECustomerException = class(Exception);
عادةً ما يكون اسم مثيل الفئة هو نفس اسم الفئة، بدون البادئة "T".
فار
العميل: TCustomer؛
ملاحظة: لتسمية المكونات، راجع "أنواع المكونات".
تتبع تسمية الحقول نفس القواعد التي تتبعها المتغيرات، باستثناء إضافة البادئة F للإشارة إلى أن هذا حقل.
يجب أن تكون كافة الحقول خاصة. إذا كنت تريد الوصول إلى حقل خارج نطاق الفصل الدراسي، فيمكنك القيام بذلك بمساعدة سمات الفصل.
تتبع أساليب التسمية نفس القواعد مثل الإجراءات والوظائف.
يجب استخدام الأساليب الثابتة عندما لا ترغب في تجاوز الطريقة بواسطة الفئات المشتقة.
عندما تريد تجاوز أسلوب ما بواسطة فئات مشتقة، يجب عليك استخدام الأساليب الافتراضية. إذا كان سيتم استخدام طريقة الفصل بشكل مباشر أو غير مباشر بواسطة فئات مشتقة متعددة، فيجب استخدام الطرق الديناميكية (الديناميكية). على سبيل المثال، إذا كانت إحدى الفئات تحتوي على طريقة يتم تجاوزها بشكل متكرر وتحتوي على 100 فئة مشتقة، فيجب تعريف الطريقة على أنها ديناميكية، مما قد يقلل من حمل الذاكرة.
إذا كان الفصل سينشئ مثيلات، فلا تستخدم الأساليب المجردة. لا يمكن استخدام الأساليب المجردة إلا في الفئات الأساسية التي لا تنشئ مثيلات أبدًا.
يجب تحديد جميع طرق الوصول إلى الخاصية في الجزء الخاص أو المحمي من الفصل. تتبع طرق الوصول إلى الملكية نفس القواعد التي تتبعها الإجراءات والوظائف. يجب أن تكون الطرق المستخدمة للقراءة مسبوقة بـ "Get"، ويجب أن تكون الطرق المستخدمة للكتابة مسبوقة بـ "Set"، ولها معلمة تسمى Value ونوعها هو نفس نوع الخاصية. على سبيل المثال:
تسومكلاس = فئة (TObject)
خاص
fsomeField: عدد صحيح؛
محمي
وظيفة GetSomeField: عدد صحيح؛
الإجراء SetSomeField(Value: Integer);
عام
خاصية SomeField: عدد صحيح يقرأ GetSomeField ويكتب SetSomeField؛
نهاية؛
على الرغم من أن ذلك ليس مطلوبًا، فمن المستحسن استخدام أساليب الوصول للكتابة للوصول إلى الخصائص التي تمثل الحقول الخاصة.
تعمل الخصائص بمثابة أدوات وصول إلى الحقول الخاصة وتتبع نفس قواعد التسمية مثل الحقول، باستثناء عدم البادئة F. يجب أن تكون أسماء الخصائص أسماءً وليس أفعالًا. الخصائص هي البيانات والأساليب هي الإجراءات. يجب أن تكون أسماء خصائص المصفوفة بصيغة الجمع، بينما يجب أن تكون الخصائص العامة بصيغة المفرد.
تشبه تسمية المكونات تسمية الفئات، باستثناء أنه عندما تتعارض مع أسماء المكونات الأخرى، يمكنك إضافة بادئة مكونة من 3 أحرف لتعريف شركة أو فرد أو كيان آخر. على سبيل المثال، يمكن الإعلان عن مكون الساعة كما يلي:
TddgClock = فئة(TComponent)
لاحظ أن الأحرف الثلاثة للبادئة يجب أن تكون صغيرة.
يجب أن يكون اسم مثيل المكون قادرًا على وصف معناه الفعلي. يستخدم اصطلاح التسمية هنا اصطلاح تسمية البادئة المجرية المعدلة. سبب استخدام البادئة بدلاً من اللاحقة هو أنه من الأسهل البحث عن اسم المكون في Object Inspector و Code Explorer بدلاً من البحث عن نوع المكون. في هذا المعيار، يتكون اسم مثيل المكون من جزأين: البادئة ومعرف السمة.
بادئة المكون هي في الغالب اختصار لنوع المكون. راجع بادئات المكونات في الجدول أدناه:
اسم فئة المكون | بادئة المكون |
TActionList، TAction يمثل عنصر القائمة الخاص بالإجراء | يمثل |
TButton وTSpeedButton وTBitBtn وفئات الأزرار الأخرى | btn |
TCheckBox، TDBCheckBox وخانات الاختيار الأخرى | الفصل |
فئة زر الاختيار TRAdioButton | rdo |
شريط الأدوات TToolBar | السل |
جميع فئات القائمة الرئيسية لـ TMainMenu | مم |
جميع فئات عناصر القائمة في TMainMenuItem | mi |
جميع فئات القائمة المنبثقة في TPopupMenu | مساءً |
جميع فئات عناصر القائمة المنبثقة لـ TPopupMenuItem | pmi |
TLabel، TStaticText وفئات التصنيف الأخرى المستخدمة للعرض | lbl |
TPanel وفئات اللوحات الأخرى | nnl |
TPageControl وفئات التحكم في الصفحة الأخرى | pgc |
TEdit وTMaskEdit وفئات مربعات التحرير الأخرى ذات السطر الواحد | بتوقيت شرق الولايات المتحدة |
TMemo وTRichEdit وفئات مربعات التحرير الأخرى متعددة الأسطر | لعبة متعددة اللاعبين عبر الإنترنت |
TDrawGrid، TStringGrid وفئات الشبكة الأخرى | GRD |
TAnimate وفئات الرسوم المتحركة الأخرى | العاني |
TImageList وفئات قائمة الصور الأخرى | ايل |
TImage وفئات الصور الأخرى | img |
فئة الرسم البياني TChart | cht |
TComboBox، TDBComboBox وفئات مربعات القائمة المنسدلة الأخرى | com.cbo |
TListBox وTDBList وفئات مربعات القائمة الأخرى | lst |
TTreeView | تلفزيون |
TListView | المستوى |
THotKey | هونج كونج |
TSplitter وفئات المحددات الأخرى | spt |
جميع فئات مكونات الحوار مثل TOpenDialog | dlg |
جميع فئات جدول البيانات مثل TTable | tbl |
جميع مكونات استعلام SQL مثل TQuery | qry |
عناصر مجموعة بيانات العميل TClientDataSetAll | أقراص مدمجة |
TDataSource | س |
قاعدة البيانات | ديسيبل |
TSockConnection وTDCOMConnection وفئات مكونات الاتصال الأخرى | يخدع |
TQuickRep وTFastReport وفئات مكونات التقرير الأخرى | rpt |
TDDEClientConv وTDDEClientItem وفئات مكونات DDE الأخرى | dde |
جميع فئات التقويم مثل TMonthCalendar | كال |
TGroupBox وفئات التحكم الأخرى | grp |
كما هو موضح أعلاه، تأتي بادئة نوع المكون من تحليل خصائص النوع التي تصف المكون. عادةً، تصف القواعد التالية كيفية تحديد بادئة نوع المكون:
ملحوظة: بادئة المكون هي للإشارة إلى نوع المكون، سواء كان زرًا أو تسمية وما إلى ذلك، لذلك ليست هناك حاجة لإنشاء بادئة مكون لكل فئة مكون خاصة، على سبيل المثال، بادئة المكون TMyButton لا يزال btn.
اسم تعريف خاصية المكون هو وصف لهدف المكون. على سبيل المثال، يمكن تسمية مثيل مكون TButton المستخدم لإغلاق النموذج بـ btnClose. يمكن تسمية مثيل لمكون اسم التحرير بـ edName.
يجب أن يعبر اسم النموذج أو نوع الحوار عن الغرض من النموذج، مسبوقًا بـ "Tfrm" للنموذج أو "Tdlg" لمربع الحوار، متبوعًا باسم وصفي. على سبيل المثال، اسم نوع النموذج "حول" هو:
TfrmAbout = فئة(TForm)
اسم نوع النموذج الرئيسي هو:
TfrmMain = فئة (TForm)
اسم نوع نموذج تسجيل دخول العميل هو:
TfrmCustomerEntry = فئة (TForm)
اسم النوع لمربع حوار تسجيل الدخول هو:
TdlgLogin = فئة(TForm)
اسم مثيل النموذج هو نفس اسم النوع المقابل، ولكن بدون البادئة T. على سبيل المثال، اسم نوع النموذج والمثيل المذكورين سابقًا هو:
اكتب الاسم | اسم المثيل |
TfrmAbout | frmAbout |
TfrmMain | frmMain |
TfrmCustomerEntry | frmCustomerEntry |
TdlgLogin | com.dlgLogin |
ما لم تكن هناك أسباب خاصة، يتم إنشاء النموذج الرئيسي فقط تلقائيًا. يجب إزالة كافة النماذج الأخرى من القائمة التي تم إنشاؤها تلقائيًا في مربع الحوار Project Options. لمزيد من المعلومات، راجع الأقسام التالية.
يجب أن تحتوي كافة وحدات النموذج على وظائف إنشاء مثيل لإنشاء النموذج وإعداده وعرضه المشروط وإصداره. ستقوم هذه الوظيفة بإرجاع نتيجة الوضع التي تم إرجاعها بواسطة النموذج. تتبع المعلمات التي تم تمريرها إلى هذه الوظيفة قواعد تمرير المعلمات. سبب التغليف مثل هذا هو تسهيل إعادة استخدام الكود وصيانته.
يجب إزالة متغيرات النموذج من الوحدة وتعريفها كمتغيرات محلية في وظيفة إنشاء مثيل النموذج (لاحظ أن هذا يتطلب إزالة النموذج من القائمة التي تم إنشاؤها تلقائيًا في مربع الحوار خيارات المشروع. يرجى الاطلاع على المحتوى السابق.
على سبيل المثال، يوضح ملف الوحدة التالي وظيفة إنشاء مثيل GetUserData.
وحدة UserDataFrm;
واجهة
الاستخدامات
ويندوز، الرسائل، SysUtils، الطبقات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، ستدكترلس؛
يكتب
TfrmUserData = فئة (TForm)
edtUserName: TEdit;
edtUserID: TEdit;
خاص
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
وظيفة GetUserData(var aUserName: String;var aUserID: Integer): Word;
تطبيق
{$R *.DFM}
وظيفة GetUserData(var aUserName: String;var aUserID: Integer): Word;
فار
frmUserData: TfrmUserData;
يبدأ
frmUserData := TfrmUserData.Create(Application);
frmUserData.Caption:='الحصول على بيانات المستخدم';
النتيجة: = frmUserData.ShowModal؛
إذا كانت النتيجة = mrOK إذن
يبدأ
aUserName := frmUserData.edtUserName.Text;
aUserID := StrToInt(frmUserData.edtUserID.Text);
نهاية؛
أخيراً
frmUserData.Free;
نهاية؛
نهاية؛
نهاية.
إذا كانت بنية النموذج معقدة للغاية، فيجب تقسيمها إلى إطار نموذج رئيسي والعديد من إطارات النموذج الفرعي المضمنة في إطار النموذج الرئيسي. يحب:
TfrmMainFrame: TfrmInfoFrame،TfrmEditorFrame
الغرض الرئيسي من استخدام إطارات النماذج هو حل مشكلة إعادة استخدام الواجهة والتعليمات البرمجية، وتحسين تماسك رمز الوحدة (بعد التقسيم، يكون كل إطار نموذج وحدة مستقلة)، وبالتالي تحسين جودة هندسة البرمجيات. يجب عليك استخراج التعليمات البرمجية المتعلقة بالواجهة (قابلة لإعادة الاستخدام) والتعليمات البرمجية المتعلقة بالتطبيق (غير قابلة لإعادة الاستخدام).
يجب أن يعبر اسم نوع وحدة البيانات عن الغرض منه وأن يكون مسبوقًا بـ "Tdm" متبوعًا باسم وصفي. على سبيل المثال، اسم النوع لوحدة بيانات العميل هو:
TdmCustomer = فئة (TDataModule)
اسم النوع لوحدة بيانات الطلبات هو:
TdmOrder = فئة (TDataModule)
يجب أن يكون اسم مثيل وحدة البيانات هو نفس اسم النوع المقابل، ولكن بدون البادئة T. على سبيل المثال، نوع وحدة البيانات السابقة واسم المثيل كما يلي:
اكتب الاسم | اسم المثيل |
TdmCustomer | dmCustomer |
TdmOrder | dmOrder |
يوصى باستخدام معلومات رأس الملف المنظم في جميع الملفات المصدر وملفات المشروع وملفات الوحدة. يجب أن يحتوي رأس الملف على المعلومات التالية على الأقل:
{
حقوق الطبع والنشر @ السنة من قبل المؤلفين
}
يجب أن تكون أسماء ملفات المشروع وصفية. على سبيل المثال، اسم المشروع "The Delphi 5 Developer's Guide Bug Manager" هو DDGBugs.dpr، واسم برنامج معلومات النظام هو SysInfo.dpr.
يجب أن يعبر اسم ملف النموذج عن الغرض من النموذج وأن يكون له اللاحقة Frm. على سبيل المثال، اسم ملف النموذج حول هو AboutFrm.dfm، واسم ملف النموذج الرئيسي هو MainFrm.dfm.
يجب أن يعبر اسم ملف وحدة البيانات عن دور وحدة البيانات وأن يكون له لاحقة DM. على سبيل المثال، اسم ملف وحدة بيانات العملاء هو CustomersDM.dfm.
يجب أن يعبر اسم ملف وحدة البيانات عن بعد عن الغرض من وحدة البيانات عن بعد. أضف لاحقة RDM بعد الاسم. على سبيل المثال، يُسمى الملف الخاص بوحدة البيانات البعيدة للعملاء CustomersRDM.dfm.
يجب أن تكون أسماء الوحدات وصفية. على سبيل المثال، تسمى وحدة النموذج الرئيسية للتطبيق MaimFrm.pas.
يجب أن تحتوي جملة الاستخدامات في قسم الواجهة فقط على الوحدات التي يتطلبها هذا القسم. لا تقم بتضمين أسماء الوحدات التي يمكن إضافتها تلقائيًا بواسطة دلفي. يجب أن تحتوي بند الاستخدامات في جزء التنفيذ فقط على الوحدات اللازمة لهذا الجزء، ولا تحتوي على وحدات إضافية.
يجب أن يحتوي قسم الواجهة فقط على إعلانات الأنواع والمتغيرات والإجراءات والوظائف التي يجب الوصول إليها بواسطة الوحدات الخارجية. علاوة على ذلك، يجب أن تسبق هذه الإعلانات قسم التنفيذ.
يتضمن الجزء التنفيذي تنفيذ الأنواع والمتغيرات والإجراءات والوظائف الخاصة بهذه الوحدة.
لا تضع تعليمات برمجية تستغرق وقتًا طويلاً في قسم التهيئة. وإلا، فإنه سوف يتسبب في بدء تشغيل التطبيق ببطء شديد.
تأكد من تحرير كافة الموارد المخصصة في قسم التهيئة.
اسم ملف وحدة النموذج هو نفس اسم النموذج المقابل، فقط قم بتغيير البادئة إلى اللاحقة. على سبيل المثال، اسم الوحدة للنموذج "حول" هو AboutFrm.pas. اسم ملف الوحدة للنموذج الرئيسي هو MainFrm.pas.
اسم ملف وحدة وحدة البيانات هو نفس اسم وحدة البيانات المقابلة. على سبيل المثال، اسم وحدة وحدة البيانات هو CustomersDM.pas.
يجب أن يعبر اسم الوحدة العامة عن غرضها ويجب أن يكون مسبوقًا بـ "u". على سبيل المثال، اسم وحدة أدوات تصحيح الأخطاء العملية هو uDebugUtilities.pas، واسم الوحدة التي تحتوي على المتغيرات العامة هو uCustomerGlobals.pas.
لاحظ أن أسماء الوحدات يجب أن تكون فريدة داخل المشروع. لا يمكن أن يكون لأسماء الوحدات المشتركة نفس الاسم.
يجب وضع الخلايا المكونة في مسارات منفصلة للإشارة إلى أنها الخلايا التي تحدد المكون. ولا يتم وضعها بشكل عام في نفس مسار المشروع. يجب أن تعبر أسماء ملفات الوحدات عن محتوياتها.
ملاحظة، راجع "معايير التسمية لأنواع المكونات" لمزيد من المعلومات حول معايير تسمية المكونات.
يمكن أن تحتوي الخلية المكونة على مكون أساسي واحد فقط، وهو المكون الذي يظهر على لوحة المكونات. يمكن أيضًا تضمين مكونات أو كائنات مساعدة أخرى في نفس الوحدة.
يجب نقل عملية تسجيل المكونات من وحدة المكونات ووضعها في وحدة منفصلة. تُستخدم وحدة التسجيل هذه لتسجيل كافة المكونات، ومحرري الخصائص، ومحرري المكونات، والمعالجات، وما إلى ذلك.
يجب أن يتم تسجيل المكونات في حزمة التصميم. لذلك، يجب تضمين وحدات التسجيل في حزمة وقت التصميم بدلاً من حزمة وقت التشغيل. يوصى بتسمية وحدة التسجيل على النحو التالي:
xxxReg.pas
من بينها، يتم استخدام بادئة الحرف xxx لتحديد اسم حزمة المكون أو الشركة أو الفرد أو أي كيان آخر. على سبيل المثال، يتم تسمية وحدة التسجيل xxxReg.pas.
يجب أن تحتوي حزمة وقت التشغيل على الوحدات المطلوبة فقط. يجب وضع هذه العناصر الخاصة بمحرر الخاصية ومحرر المكونات في حزمة وقت التصميم. وينبغي أيضًا تضمين وحدات التسجيل في حزمة مرحلة التصميم.
تتبع تسمية الحزمة النمط التالي:
dcliiiDescvvCn.pkg - حزمة التصميم
iiiDescvvCn.pkg - حزمة وقت التشغيل
من بينها، iii يمثل بادئة مكونة من 2-3 أحرف، والتي تستخدم لتحديد الشركات أو الأفراد أو الأشياء الأخرى التي تحتاج إلى تحديد، وهو أمر اختياري؛ يمثل Desc وصفًا موجزًا لحزمة التحكم vv؛ package. يمكنك الاختيار وفقًا لاحتياجاتك؛ تشير البادئة "dcl" إلى حزمة وقت التصميم، بدون هذه البادئة تشير إلى حزمة وقت التشغيل؛ يشير الحرف "Cn" إلى نوع المترجم ورقم إصدار المترجم، مثل: دلفي5=D5، دلفي4=D4، CBuilder3=C3....
لاحظ أن lib أو std في اسم الحزمة يشيران إلى ما إذا كانت هذه حزمة وقت تصميم أم حزمة وقت تشغيل على التوالي. على سبيل المثال:
dclrbStdComPSD5.pkg — حزمة وقت تصميم دلفي 5
rbStdCompsD5.pkg — حزمة وقت تشغيل دلفي 5
على الرغم من أن معظم أدوات التنسيق التلقائي للتعليمات البرمجية يمكن أن تساعدك في إعادة ترتيب تنسيق البرنامج المصدر وتحديث الكتابة بالأحرف الكبيرة للكلمات والمعرفات المحجوزة، فمن الأفضل القيام بذلك قبل استخدام التحكم في الإصدار إذا كنت قد استخدمت التحكم في الإصدار بالفعل، فمن المستحسن ألا تفعل ذلك. لا تستخدم أدوات تنسيق التعليمات البرمجية التلقائية بسهولة، حتى لو كانت هناك مساحة أخرى، ستعتقد أداة التحكم في الإصدار أن السطر قد تم تعديله، مما يؤدي إلى تغييرات في إدارة البرنامج.