الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دورة تطبيقية لانشاء واستغلال الفئات في برامجنا

بدأه DreamNet في 6 مارس 2008 · 5 رد · 1,743 مشاهدة · في قسم قواعد البيانات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

كنت أفكر منذ مدة أن أضع بعض الدروس التطبيقية حول انشاء واستخدام الفئات في برامجنا وكنت أحاول كل مرة وضع خطة بسيطة يمكن أن يستوعبها الجميع بمختلف مستوياتهم

وفي الأخير وجدت قرض تعليمي كنت قد أخذت عليه وتعلمت منه أشياء كثيرة وقررت أن أتبع نفس المنهجية في طرح الموضوع

الأهداف :

  • شرح أهمية استعمال الفئات في برامجنا
  • إستعمال الفئات من أجل انتاج أدوات و مكتبات DLL واستغلالها في برامجنا
  • إنشاء أدوات وفئات بخصائص وأحداث
  • إنشاء وإستخدام فئات قواعد بيانات واستعمالها في تطبيقاتنا

قبل البدء دائما أردت التنبيه أن الدورة هي فقط تطبيقية وليست مقالة تختص بالتعريفات العامة لكن يمكننا أن نتعلم بعض المصطلحات منها (أرجو من الاخوة التصحيح اذا كان هناك خطأ في استعمال بعض المصطلحات)

ماذا نقصد بالفئات ؟

الفئات أو الClasses هي ببساطة ذلك النوع من الكود المستعمل داخل الفيجوال عبارة عن ملفات ذات امتداد cls شبيهة بالمويدول التي امتدادها bas لكن تختلف عنها في الاستعمال

فالفئات يمكننا استعمالها ككائن Object وكل فئة يمكنها تعريف كائن من نوع محدد

post-23361-1204815905_thumb.png

يمكننا تعريف الفئات كما في الصورة كالتصميم الذي ننشؤه لمنزل

ومن خلاله نستطيع أن نعرف كيف سيتم بناء منزل ما بموصفات مختلفة

يمكننا انشاء عدة منازل من خلال تصميم واحد وبخصائص مختلفة كلون الجدران والزجاج المستعمل مثلا

طبعا التصميم واحد لكن يمكننا اطلاق اسم على المنزل الأول واسم آخر على المنزل الثاني كأن نقول منزل فلان و منزل ...

هنا قمنا بانشاء Instance من الفئة (التصميم ) وقمنا بتحديد خصائص لها

مثال :

نفترض انه لدينا فئة اسمها House لانشاء منزل من الفئة ننشئ نسخة جديدة من الفئة لكي نتعامل معها ككائن له خصائص

				 Dim house1 As House
				 Set house1 = New House

الآن بعد أن أنشأنا نسخة من الفئة House يمكننا أن نغير خصائصها الموجودة في التصميم

house1.Color = vbRed

طبعا هنا يجب المراعة وجود الخاصية في التصميم

يمكننا أن ننشئ منزلا آخر ونغيير خصائصه بنفس الطريقة 772066-1225.gif

مما ورد فاننا نلاحظ أن أهمية الفئة أنه يمكننا بواسطتها انشاء عدة كائنات مشتقة منها وهذا يعني أنها توفر علينا اعادة كتابة الأكواد لكل كائن على حدى

كل فئة يتم انشائها داخل مشروعنا تتضمن في البدء شيئين أساسيين أو اجرائين مهمين

هما

  • إجراء Class_Initialize

  • إجراء Class_Terminate

يتم استدعاء الإجراء الأول عندء انشاء نسخة جديدة من الفئة

أما الإجراء الثاني فانه يستدعى عند انتهاء عمل النسخة أو الكائن المنشئ من الفئة

وعادة مايتم انهاء أو تفريغ الكائنات المستعملة آليا عند انهاء البرنامج

لكن ينصح بإنهاءه عن طريق الكود

مثال :

نضيف لمشروعنا Class وندعها بدون اعادة تسمية (افتراضيا سيكون اسمها Class1 )

نكتب هذا الكود داخل فئتنا

Private Sub Class_Initialize ()
			 MsgBox  "Object Created "
		   End Sub

			 Private Sub Class_Terminate ()
			 MsgBox  "Object Terminated "
		   End Sub

نعرف في قسم المتغيرات العامة متغيير منن الفئة التي قمنا بانشائها

نعرف في قسم المتغيرات العامة متغيير منن الفئة التي قمنا بانشائها

Private S  As  Class1

نحن هنا نريد التأكد مما قلناه سابقا

ننشئ زر لانشاء نسخة جديدة من الفئة Class1 لكي نتأكد أن الإجراء Class_Initialize يتم استدعؤه وقت الانشاء

Private Sub Command1_Click ()
	Set S  = New  Class1
   End Sub

ستلاحظ ظهور المسج بوكس الذي وضعناه في اجراء الانشاء

ولكي نقوم بتفريغ أو حذف الكائن المنشئ نستعمل الكود التالي

Private Sub Command2_Click()
	Set S  =  Nothing
   End Sub

#2

إنشاء الخصائص للفئة :

الخصائص تعرف عادة معلومات أو بيانات معينة للفئة , فمثلا فئة تعبر عن موظف مثلا يمكن أن تحوي كخصائص لها : الإسم , اللقب و العمر مثلا

هناك طريقتين لتعريف خصائص للفئة :

  • إما بتعريف متغير عام Public داخل كود الفئة
  • أو باستعمال إجراءات لتعريف الخصائص

1-بتعريف متغير عام Public داخل كود الفئة:

إذا كنا لا نريد تنفيذ أي اجراء عند اسناد قيمة للخاصية فانه يمكننا الاكتفاء بتعريف الخاصية كمتغير عام مثلا لو أردنا أن نعرف خاصية الاسم الأول نعرفها Public وليس Private

Public FirstName As String

2-إستعمال إجراءات لتعريف الخصائص:

هذه الطريقة تسمح لنا بالتحكم أكثر بالخاصية المنشئة للفئة فهي تسمح لنا :

  • تنفيذ اجراء عند قراءة أو كتابة الخاصية
  • تحديد الخاصية ضمن قيم معينة أو محددة
  • جعل الخاصية للقراءة فقط في بعض الأحيان

لاسناد قيم للخاصية نستعمل Set أو Let ولقرائة قيمة الخاصية نستعمل Get

نبدأ سويا لانشاء خاصية الاسم الأول مثلا لفئتنا

أولا نعرف المتغير الذي يقوم بتسجيل قيمة الخاصية في قسم التصريحات العامة داخل كود الفئة

Private mvarFirstName As String

الآن نمر إلى بناء هيكل الفئة لذلك نعرف إجراء الاسناد والقراءة وهنا الاجراء يكون عام طبعا لكي يتم الوصول إليه عند إنشاء كائن جديد انطلاقا من فئتنا

Public Property Let FirstName(passedName As String)
	 mvarFirstName = UCase(passedName)
 End Property

 Public Property Get FirstName() As String
	 FirstName = mvarFirstName
 End Property

هنا الخاصية المنشئة يمكننا قرائتها من الإجراء Get واسناد قيمة لها ضمن الإجراء Let

إذا أردنا انشاء خاصية للقراءة فقط فهذا يعني أن نحذف الإجراء المتعلق بكتابة الخاصية أي نحذف الإجراء Let

اذا كان نوع البيانات عبارة عن كائن Object فان عملية اسناد القيمة لا تتم ب Let لكن باستعمال Set

يمكنكم التطبيق بانشاء فئة داخل تطبيقنا وكتابة الخاصية الجديدة

post-23361-1204817038_thumb.jpg

كما في الصورة نلاحظ أننا نجد الخاصية FirstName للكائن المنشئ من فئتنا Class1

بنفس الطريقة يمكننا انشاء باقي الخصائص لفئتنا

#3

إستعمال الثوابت المسماة :

نطلق عادة على الثوابت المسماة الثوابت التي تكون ثابتة وقت التنفيذ ولا يتم تغيير قيمها

ويكون لها إسم معين يرمز إبى قيمتها وبذلك يمكننا استعمال الاسم كقيمة عددية نستعملها في بعض الأحيان في حصر بعض البرامترات لبعض الاجراءات أو الخصائص المنشئة

مثلا لو أردنا إنشاء صندوق نص تحمل الزر نعم و الزر لا يمكننا إستعمال الثابت vbYesNo بدلا من القيمة الإسمية له والمساوية ل4

كيفية إنشاء ثوابت مسماة:

لكي ننشئ ثوابتنا المسماة الخاصة نقوم بإنشاء تعداد نحصر فيه جميع القيم المتاحة داخله

المثال التالي يبين كيف يمكننا انشاء تعداد نسميه JobLevel يحمل ثلاثة قيم

Public Enum JobLevel
		 jExecutive = 1
		 jManagement = 2
		 jStaff = 3
	 End Enum

يمكننا وضع القيم المنشئة في متناول المستخدم للفئة بتعريفها كPublic

يمكن لمستخدمي فئتنا استعمال هذه الثوابت المسماة JobLevel مع تعريف دالة بسيطة تستعمل هذه الثوابت

مثلا نريد انشاء دالة للتحقق من نوع العمل ضمن اطار محدد من 1 إلى 3 باستعمال الثوابت المسماة المنشئة سابقا

Public Sub CheckExecutiveStatus(iLevel as JobLevel)
		 If iLevel = jExecutive Then
			 MsgBox "Statut Ok"
		 Else
			 MsgBox "Statut refused"
		 End If
	 End Sub

الدالة لها برامتر اسمه iLevel من النوع JobLevel

post-23361-1204817282_thumb.jpg

إستعمال التعداد كخصائص للفئة:

يمكننا استغلال الثوابت المسماة في التعداد لتعريف خاصية للفئة

نستعمل التعداد المنشئ سابقا JobLevel لحصر قيم خاصية نسميها ActiveJobLevel


Public Property Let ActiveJobLevel(jl As JobLevel)
mvarJobLevel = jl
End Property

Public Property Get ActiveJobLevel() As JobLevel
ActiveJobLevel= mvarJobLevel
End Property
   Private mvarJobLevel As JobLevel

post-23361-1204817292_thumb.jpg

كما نلاحظ فالخاصية المنشئة محصور قيمها في التعداد المنشئ وهذا يسهل علينا التعامل أكثر مع الخصائص المنشئة والتحكم في القيم المدخلة أيضا

#4

إنشاء الأحداث للفئة :

بفضل استعمال الأحداث يتم اخبارنا أنه تمت عملية ما داخل الفئة في وقت معين

الفيجوال يوفر لنا حدثين أساسيين كما ذكرنا سابقا Initialize و Terminate

يمكننا أيضا تعريف أحداث خاصة لفئتنا بعد تعريفها ثم استعمال الكود الذي يسببها أو يطلقها

تعريف الحدث:

يتم تعريف حدث للفئة المنشئة في قسم التصريحات العامة باستخدام الكلمة المحجوزة Event

الكود التالي يوضح كيفية تعريف حدث

Public Event Status(ByVal StatusText As String)

إطلاق الحدث :

يتم اطلاق الحدث من الفئة باستخدام RaiseEventمع ذكر كل البارمترات المستعملة في تعريفها

كمثال نريد اطلاق الحدث Status المعرف سابقا عند تحديث بيانات معينة مثلا تسجيل المستخدم فنكتب بالكود في المكان المناسب لذلك ونكتب كود اطلاق الحدث

RaiseEvent Status ("يتم تحديث البيانات والتسجيل...")

الآن لاستعمال الحدث في الكود نقوم بتعريف الكائن المشتق من فئتنا لاشتقاق الأحداث الموجودة بالفئة

Dim WithEvents s As Class1

بمجرد تعريفنا للكائن s سيظهر لنا الحدث Status المنشئ في الفئة

Dim WithEvents s As Class1

	 Private Sub s_Status(ByVal StatusText As String)

   End Sub

توليد أخطاء خاصة بالفئة :

يمكننا أن نقوم بانشاء فئة تولد لنا أخطاء خاصة لتمريرها للكود الذي يستعمل فئتنا ويمكن اعتبارها كحدث من الأحداث التي يتم اطلاقها لكن الفرق هنا أن هذه الأحداث تطلق فقط وقت حدوث خطأ داخل الفئة

من أجل التحكم في الأخطاء داخل الفئة المنشئة نقوم باستعمال الإجراء Raise للكائن Err

ERR.Raise Num, Source, Description, Help File ,Help Contexte ID

هنا علينا باختيار رقم يختلف عن الرقم vbObjectError

لكي يتم التأكد من عدم تعارض بين أرقام الخطأ المولدة من طرف الفئة والأرقام الموجودة في الفيجوال نفسه

لذلك نقوم باضافة رقم للثابت المذكور

Err.Raise vbObjectError + 1000, "CPlayer", "error Adding New Player"

#5

السلام عليكم ورحمة الله وبركاته

سنرى اليوم كيفية انتاج مكتبات DLL انطلاقا من الفئات التي سننشؤها وكيف نستخدمها داخل برنامجنا بطريقة مبسطة

ملاحظة : فقط أعتذر لكوني أستعمل النسخة الفرنسية للVB6 (يعني تعلموا معانا شوية فرنسي)

نختار مشروع جديد من النوع Activex DLL

post-23361-1211007471_thumb.jpg

سيتم اضافة كلاس جديدة فارغة للمشروع Class1

نقوم باضافة خصائص للفئة وقد رأينا ذلك في الجزء الأول

نطبق مثلا خاصية الاسم الأول كما رأينا ذلك سابقا

Private mvarFirstName As String
Public Property Let FirstName(passedName As String)
	mvarFirstName = UCase(passedName)
End Property

Public Property Get FirstName() As String
	FirstName = mvarFirstName
End Property

بالضغط على مفتاح F2 سنرى فئتنا Class1 تحتوي على الخاصية التي أضفناها

post-23361-1211007478_thumb.jpg

لكن الخاصية لا تحوي وصف في الأسفل أليس كذلك ؟

ولعمل وصف للخاصية نذهب إلى قائمة الأدوات Tools ونختار Procedure Attributes

post-23361-1211007483_thumb.jpg

نكتب مثلا : خاصية الإسم الأول

ستلاحظ التغيير بعدها

post-23361-1211007491_thumb.jpg

من الأحسن أن نقوم باعادة تسمية المشروع من Project1 إلى MyDLL بعدها يمكننا أن نقوم بترجمة المشروع إلى ملف DLL من قائمة File>Make MyDLL.dll

post-23361-1211007497_thumb.jpg

طبعا أكيد بالفرنسي مختلفة :D

مبروك أنشأنا مكتبتنا بنجاح

نكمل المرة القادمة ونرى كيف نستعمل هذه المكتبة (DLL ) مع برنامج آخر

بالتوفيق للجميع

تم تعديل هذه المشاركة بواسطة DreamNet في 17 مايو 2008 في 10:03

#6

نكمل الشطر الثاني والخاص بكيفية استعمال المكتبة المنشئة

ويمكن ذلك بطريقتين:

1-إضافة المرجع :

ننشئ مشروع Standard EXE ونقوم باضافة مرجع للمكتبة التي قمنا بانشائها

post-23361-1211007953_thumb.jpg

ستلاحظ عند استعراض الobject الموجودة في المشروع بعد اضافة المرجع (بالضغط على F2 ) أن الفئة Class1 موجودة

هذا يعني أننا يمكننا استعمالها

نصرح بمتغير يحمل اسم الفئة Class1 في قسم التصريحات العامة ليتسنى لنا استعماله وتجربته على زري أمر

Private ClassTest As Class1

في الزر الأول ننشئ نسخة من الفئة كما رأينا في الدروس الاولى

ونقوم باسناد قيمة للخاصية FirstName

Set ClassTest = New Class1
ClassTest.FirstName = "arabTeam"

في الزر الثاني نتأكد من قيمة الخاصية هل تم تسجيلها

MsgBox ClassTest.FirstName

اذا العملية نجحت واستطعنا تحويل فئتنا إلى ملف DLL واستعملناه بنجاح

2-الطريقة الثانية انشاء الفئة من الكائن المخصص لها :

في العادة يتم تسجيل مكتبات dl activex أو الocx في الريجيستري ويخصص id خاص لكل فئة يتم التعرف على كائناتها بواسطة هذا الid الذي يكون وحيد

لوقمنا بالبحث في الريجيستري عن مكتبتنا MyDLL سنجدها مسجلة بالشكل التالي:

post-23361-1211007943_thumb.jpg

للوصول إلى الكائن الذي يعرف فئتنا والموجود في ملف الdll يكفي استعمال الدالة CreateObject مع تحديد "myDLL.class1"

وبذلك نستطيع انشاء كائن يحمل مواصفات فئتنا المنشئة سابقا

طبعا في قسم التصريحات نعرف المتغير ClassTest ككائن

Private ClassTest As Object

في الزر الأول

Set ClassTest = CreateObject("myDLL.class1")
ClassTest.FirstName = "arabTeam"

عملية التحقق في الزر الثاني تكون نفسها

ستلاحظ هنا أن خصائص الفئة لن تكون مرئية عكس الطريقة الأولى التي قمنا فيها بادراج مرجع المكتبة

بالتوفيق للجميع

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…