شكر لوجودك اخي ياسر وأتمنا لك التوفيق
الدرس السادس :
تعرفنا في الدرس السابق عن الداعي لوجود الوحدات النمطية Module والأهمية من وجودها .
وعرفنا أنها تستخدم لمشاركة جميع ما تحتويه من كتل برمجيه إذا كانت من نوع Public على مستوى البرنامج ككل بحيث يمكن الوصول إليها من إي مكان في البرنامج .(من أكثر من نافذة أو Class أو غيرة )
لماذا استخدم Module على الرغم من إمكانية استخدام ما يحتويه على Forms :
الدرس السابق يجيب على هذا السؤال .
الأمر الأخر هوا عمل تقسيمات للدوال التي غالباً ما يتم استخدامها بكثرة في الأنظمة والبرامج التي تستخدمها كيف :
يمكنك وضع دوال أو إجراءات في Module وهذه الدوال المهمة والتي تستخدمها بكثرة , فلو كان لديك برنامج أخر وتريد استخدام دالة ما فبدل أن تقوم بإعادة كتابتها يمكنك فقط إرفاق Module الذي قمت بعملة في البرنامج السابق لك وإضافته إلى برنامجك الجديد وبالتالي سوف تقوم فقط باستدعاء الدالة بدون أن تقوم بإعادة برمجتها من جديد .
هذا يساعد في إنتاج البرامج بشكل سريع ودون تضيع للوقت في إعادة بناء الدوال وغيرها.
مثال :
سوف أذكر مثال مهم جداُ وهوا حماية البرنامج من النسخ :
الأخوة المبرمجين الذين لا يستخدمون الـ Class أي ملفات DLL في البرامج أو أي ملفات أخرى مساعدة للبرنامج يكون البرنامج سهل جدا نسخة ونقلة إلى جهاز أخر فقط ما علية إلى تحديد الملف التنفيذي وقاعدة البيانات ثم نسخة وبذلك برنامجك يمكن لشخص أخر استخدامه , أما إذا كان البرنامج مرفق به Dll ومحطوطة في مجلد النظام System أو غيرة فهي تسبب إرباك نوعا ما لمن يحاول نسخ برنامجك لماذا بسبب بسيط هوا عدم معرفته باسم الملفات التي وضعت في مجلد النظام والتابعة للبرنامج . هذا على سبيل المثال .
لكن على العموم حتى وإن كان كذلك فبرنامجك لا يزال معرض للنسخ وبسهولة أيضا بسبب بسيط أيضا وهوا إمكانية معرفة الملفات التي تم نسخها عن طريق الملف المرفق للـ Setup التابع لبرنامجك هذا الملف يتم تخزين الملفات التي يجب على Uninstall Setup أن يعرف ما هي الملفات التي يجب علية حذفها , فلو فتحت هذا الملف (أنت وشطارتك بعدين في نقل البرنامج ).
على العموم بغض النظر عن أسلوب الحماية المتبع سواء بتخزين ملفات أو عن طريق الـ Registry . أو غيره .
إلا أن أفضل طريقة للحماية هوا معرفة الرقم التسلسلي للـ Drive . (هذا الرقم لا يتكرر )
الرقم التسلسلي هوا عبارة عن رقم يعطى لكل قسم من أقسام الـ Hard . وبذلك يمكنك فحص هذا الرقم حتى في بداية تشغيل البرنامج ومن من ثم يمكنك عمل ألازم في معالجة البرنامج .
هناك دالة Api عن طريقها يمكن الحصول على معلومات أو خصائص الـ Drive هي تحت اسم
GetVolumeInformation
لأننا أكيد سوف نحتاج هذه الدالة في برامجنا لذلك سوف أضعها في Module مع أني لو وضعتها في النافذة frmLogin وهي نافذة اول نافذه في البرنامج فليست مشكلة لأني لن استدعيها إلا مرة واحدة ولكني سوف أضعها في Module حتى لو أردت استدعائها مرة أخرى في برنامج أخر سوف أرفق هذا الـ Module وآيا يحلو لك قم بعملة .
في حدث Form_Load وهي اول نافذة سيتم بدا البرنامج منها ضع الكود التالي :
Private Sub Form_Load() Dim Path As String Dim SerialNumber As Long Path = Mid(App.Path, 1, InStr(App.Path, "\")) SerialNumber = GetSerialNumber(Path) If SerialNumber = 0 Then MsgBox SerialNumber If SerialNumber <> "1028397051" Then MsgBox "ملفات البرنامج غير مكتملة الرجاء إعادة تثبيت البرنامج", vbCritical End End If Else MsgBox "خطأ في فحص إعدادات النظام" End End If End Sub
ملخص عن الشفرة المذكورة :
فكرة البرنامج تتمثل بتمرير اسم القرص الذي يعمل علية البرنامج حاليا وتمريره للدالة GetSerialNumber ولمعرفة القرص الموجود على البرنامج تم ذلك عن طريق السطر .
Path = Mid(App.Path, 1, InStr(App.Path, "\"))
الدالة App.Path تعيد المسار بالكامل إلى البرنامج كما مر معنا سابقا في الدروس لذلك قمت بقطع أول قسم من ما تعيده الدالة App.Path والمتمثل باسم القرص كان البحث عن موقع الخانة التي تحتوي العلامة / بعد ذلك الدالة Mid تبدأ بالقطع من الموقع الأول 1 بطول ما تعيده الدالة InStr (إلى موقع العلامة /) .
بعد ذلك تم وضع اسم القرص في المتغير Path .
بعد التمرير للدالة GetSerialNumber كما في السطر :
SerialNumber = GetSerialNumber(Path)
الدالة GetSerialNumber تعيد الرقم التسلسلي للقرص الحالي وإلا تعيد صفر .
لذلك قمت بعمل شرط لتحقق من ما تعيده الدالة فإن عادة صفر فإن الدالة لم تستطع الحصول على الرقم التسلسلي وبذلك فالدالة فشلت في المهمة أما أن كان العكس . فهنا يتم فحص ما قامت الدالة بإعادته مع الرقم الذي أريد للبرنامج أن يعمل علية (أي رقم القرص المصرح ) كما في السطر التالي :
If SerialNumber = 0 Then MsgBox SerialNumber If SerialNumber <> "1028397051" Then MsgBox "ملفات البرنامج غير مكتملة الرجاء إعادة تثبيت البرنامج", vbCritical End End If Else MsgBox "خطأ في فحص إعدادات النظام" End End If
يتمثل هذا الجزء من الشفرة فقط باستدعاء الدالة GetSerialNumber أما شفرة الدالة GetSerialNumber فهي في Module على النحو التالي :
Private Declare Function GetVolumeInformation Lib "kernel32.dll" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Integer, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long Public Function GetSerialNumber(DriveName As String) As Long Dim SerialNumber As Long, Result As Long Dim Buffer1 As String, Buffer2 As String Buffer1 = String(255, Chr(0)) Buffer2 = String(255, Chr(0)) Result = GetVolumeInformation(DriveName, Buffer1, Len(Buffer1), SerialNumber, 0, 0, Buffer2, Len(Buffer2)) GetSerialNumber = IIf(Result > 0, SerialNumber, 0) End Function
بهذا القدر ينتهي الدرس السادس وسوف أواصل بعون الله في الدروس المتبقية فور توفر الوقت لإكمال الدروس.
وللسلسلة بقية .
التخصص : نظم معلومات - جامعة سبأ - اليمن
من مواضيعي :
السلسلة الذهبية في تعلم البرمجة [شرح عن الإجراءات والدوال function وبناء الـ Classes] .


