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

السلسلة الذهبية في تعلم البرمجة

رائج
بدأه فواز الشمري في 29 نوفمبر 2005 · 59 رد · 15,981 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#26

شكر لوجودك اخي ياسر وأتمنا لك التوفيق

الدرس السادس :

تعرفنا في الدرس السابق عن الداعي لوجود الوحدات النمطية 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

بهذا القدر ينتهي الدرس السادس وسوف أواصل بعون الله في الدروس المتبقية فور توفر الوقت لإكمال الدروس.

وللسلسلة بقية .

#27

حمد الله علي السلامة اخي فواز اعانك الله علي وقتك ومنتظرين منك المزيد من الدروس الجميلة والشيقة

وفقك الله

#28

موضوع مميز اخي العزيز بارك الله فيك

مشكور كل الشكر اخي العزيز على هذا المجهود الطيب

تحياتي لك

,,,,,,,

A7med_prof

اقتباس

آسف الدخول متقطع هذه القتره

اقتباس

[يمين]

.[/يمين]

A7med_prof-4-2007.jpg

اخر مواضيعي 2007

االمثال مطبق على موقع بورصه سعودي

.

.

مواضيع مهمه ومطلوبه بكثره VB6

.

بــرامج ومشــاريع عربيه كامــله {HnHn} والمزيد في قسم برامج الاعضاء || ربط قواعد بيانات اكسس مع الفيجوال بيسك, مادة دراسية كاملة {بنت اليمن}|| المرجع الشامل لجمل SQL ا {GENIUS-IT} || كيفية التعامل مع مكتبة الـ DAO, في الوصول إلى قاعدة بيانات {رمضان} || مثال ريط Visaul Basic 6.0 مع SQL SERVER ا || العمليات التي تجرى على قاعدة البيانات, مثال كامل {بنت اليمن} || تصدير البيانات من الاكسل الي الاكسس بالفيجوال بيسك {HnHn} || البحث في قاعدة البيانات {MANSUR} || قواعد البيانات العلائقية وتقنيات الوصول إليها {عبد الله فتحي} || كيفية أظهار بيانات جدولين بواسطة التاريخ ,,,,,,,

.

أخي ربما سؤالك اجابته في أحدى هذه المواضيع فإن لم تجد قم بالبحث وان لم تجد اطرح سؤالك مع وضع عنوان مناسب بحيث ان يكون هذا العنوان دال على محتوى الموضوع فغير ذلك من أكبر الكبائر في المنتدى وسيؤدي الى غلق او حذف موضوعك .

.

</
#29

الاخ العزيز

جزاك الله كل الخير ودعواتى ان يجعله الله فى ميزان حسناتك

وللعلم اننى ارتاد منتديات كثيرة وموضوعات كثيره حيث اننى احاول ان اتعلم فيجوال

وبكل الصدق اجد ان ماقرأته فى كل المنتديات والمواضيع لم استفد منه مثل مااستفدت من موضوعك

بالتوفيق فى الدنيا والاخرة 000 وكل الحب والتقدير لشخصك الكريم

اخوك شعبان

#30

لماذا توقفت هذه الدروس الجميلة

#31

بارك الله فيك أخي الكريم و جعل هذا المجهود الطيب في ميزان حسناتك :rolleyes:

تم تعديل هذه المشاركة بواسطة COMFORT في 24 مارس 2006 في 18:29

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#32

لقد قمت بجمع الدرس الأول و تنظيمه

حتى يستفيد الجميع منه و يتم قرائته بتمعن دون الحاجة إلى الاتصال بالانترنت

خلال قرأته

ملاحظة : الدرس المرفق ملف Word قد يتغير تنسيقه

في بعض الاجهزة :( فأرفقت معه نفس نسخة كا Web Page

و قريباً إن شاء الله سوف أرفقه كا PDF

كما سأقوم بإرفاق باقي الدروس إن شاء الله

و لا تنسونا من خالص دعائكم :rolleyes:

First_Lesson.rar

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#33

مشكوووووورر

جازاك الله خيرا على هذا الموضوع

Mimo

040.gif

#34

إخواني الكرام انا موجوج معاكم ولن اوقف هذه السلسة ولكن والله مشاغل بس .

قريب سوف اكمل الدروس بعون الله .

#35

أخي COMFORT :

تنسيق الملف رائع , شكرا لك . جعلة الله لنا زكاة لما تعلمناه . وسوف اكمل السلسة في الأيام القادمة .

شكرا للجميع على التفاعل .فهوا عامل تحفيز كبير .

#36

واحنا منتظرينك أخي فواز واعانك الله علي مشاغلك

#37

إخواني في منتداي العزيز منتدى الفريق العربي للبرمجة ,بداية :

تحية لكل من شارك معي في هذا الموضوع , كذلك لكل من سأل واستفسر عن ما احتوته السلسة من معلومات .

بعون الله سوف أواصل ما بدأت الحديث عنه , بعد انقطاع دام لفترة لم يكن إلا لمشاغل , وعدم التفرغ. لأن شرح الدروس ليس بالأمر البسيط وهوا يحتاج إلى تسلسل علمي سهل ومبسط يفهم من قبل الجميع, فمحاولة توصيل المعلومات تحتاج إلى أسلوب دقيق نوعا ماُ. لذا أتمنى أن أوفق في توصيل هذه المعلومات لكم .

الدرس السابع :

بداية الأمر تعرفنا في الدروس السابقة وتنقلنا معا في بساتين هندسة البرمجيات . وعرفنا كيف تطور هذا العلم وأصبح الآن في متناول أي لغة برمجية .

تعرفنا في البداية على مشاكل البرمجة في السابق وعرفنا الحلول التي حاول مهندسو البرمجيات فيها للتغلب على هذه المشاكل.

من الحلول المقدمة كانت الإجراءات Procedures لمحاولة التخلص من التكرار وكذلك الدوال Functions . ثم تعرفنا أيضا على أسلوب بناء المتغيرات والتعامل معها وعرفنا أنواعها وكيفية تمريرها بين الـ Procedures و Functions .

تعرفنا بعد ذلك على الوحدات النمطية Module وعرفنا الفائدة من وجودها , وكلامي بالذات في لغة Visual Basic . وعرفنا أن الهدف الأساسي للـ Module هوا احتوائه على كتل برمجية (دوال , إجراءات , خصائص , قد تكون أحداث ) بحسب ما ترغب أن تشارك به جميع أجزاء البرنامج , فالوظيفة الهامة للـ Module هوا انه يمكن الوصول إلى محتوياته من أي Block أو جزء في البرنامج .

تعرفنا كذلك على الفرق الهام بين Forms والـ Module في الدروس السابقة . وتكلمت في الدروس عن عمر المتغيرات وعرفنا عمر المتغير إذا كانت من نوع Public ومتى تدمر أو يتم إلغاء الحجز لها في الذاكرة .

في الدرس هذا سوف أتحدث عن نوع بيانات مهم جدا وهوا هياكل البيانات Structure :

وودت الحديث عنه قبل الدخول في الـ Classes لأهميته وكثر استخدامه . ويستخدم أيضا بشكل كبير عند بناء كائنات Active X ذوات الامتداد OCX .

ما هوا الهيكل Structure:

هوا عبارة عن حاوية به مجموعة من المتغيرات كيف:

لو أريد مثلا أن أرسم نقطة ما على المحور السيني والصادي . فعندما أود تمثيل النقطة فأنه لا شك أني سوف أحتاج إلي متغيرين (X,Y) . بكل بساطة سوف اعرفن النقاط كما يلي

Dim X As Double,Y As Double

هنا عرفت النقاط من نوع Double .

ملاحظة :

لأحض أني كيف عرفت المتغيرات في نفس السطر ولكن حددت لكل متغير نوع البيانات الخاصة به أما إذا جمعتهم بنوع واحد كما يلي :

Dim X,Y As Double

في لغة Visual Basic6 يعتبر النوع الأخير Y هو Double أما X فيعتبر من نوع Variant .

المهم :

نعود لموضوعنا . المهندسين لاحظوا أن X و Y هوا عبارة عن نقطة يعني من عائلة النقاط . وهنا ظهرت فكرة انه يمكن أن أجمع المتغيرين وأعمل لهم عائلة أسميها بالاسم الذي يعجبني , فالاسم الذي يمكن أن أدعه المتغيران كعائلة سوف أسميه Points أي نقاط .

طيب الآن بعد أن تعرفنا على فكرة الهيكل Structure , سوف نتعرف على كيفية استخدامه في اللغة البرمجية

القاعدة العامة للهيكل كما يلي :

[Private | Public | ….]  Type name_of_struc

End Type

في البداية ما بين العلامتين [ ] يعتبر محددات الوصول وقد سبق وأن أشرت إليهم , وهما اختياري

بعد ذلك الكلمة المحجوزة Type وهي التي تحدد الهيكل name_of_struc وهوا الاسم الذي يمكنك أن تختاره للهيكل , والهيكل طالما انه حاوية إذا له نهاية وهي End Type .

كيف يمكن أن استخدم الهيكل : المثال التالي يوضح ذلك :

ضع وحدة نمطية Module في برنامج ثم ضع الكود التالي بها :

Public Type Center
     x As Double
     y As Double
End Type

لاحظ تعريف المتغيرات يجب أن يكون بدون الكلمة المعروفة Dim .

طبعا كما قلت أن الهياكل تعتبر نوع من أنواع البيانات. يعني كيف , لو رجعنا للقاعدة العامة لتعريف المتغيرات لوجدنا انه عند التعريف نضع كلمة Dim ثم اسم المتغير ثم العبارة As بعد ذلك نحدد نوع البيانات .

أعتقد الآن قد وصل القصد . وكما قلت سابقاً أن أنواع البيانات للمتغيرات هي قياسية أو غير قياسية . (راجع الدروس السابقة )

تعتبر الهياكل من أنواع البيانات الغير قياسية , ولا يمكن أن يتم استخدام الهيكل إلا إذا تم تعريف متغير يشير إلى هذا الهيكل .

لنتعرف عن معنى هذا الكلام بمثال :

في النافذة Form1 ضع الكود التالي في زر أمر .

Dim P As Points

لاحظ نوع البيانات ما هوا , من نوع هيكل طيب الآن عندما صنفنا المتغيرات القياسية قلنا أنها إما رقمية أو نصية والرقمية تنقسم إلى كذا وكذا , طيب الحين المتغير P ما نوعه طبعا نوعه Points طيب ما هي البيانات التي يمكن للمتغير P يأخذها . بالطبع محتويات الهيكل Points وماهي محتويات الهيكل Points من تعريف الهيكل نلاحظ أنه يأخذ متغيرين من نوع Double الأول X والثاني Y .

طيب كيف يمكن أن نستخدم هذا النوع من البيانات في برامجنا .

نذكر اسم المتغير الذي عرفناه من نوع الهيكل والذي في مثالنا P ثم بعد ذلك نضع علامة نقطة وسيضهر لنا المحرر قائمة بها المتغيرين X,Y. ونستخدمهم كما يلي :

Private Sub Form_Load()
Dim p As Points
 p.x = 50
 p.y = 80
End Sub

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

المثال الذي سوف أقوم بذكره , لنقوم مثلا برسم دائرة .

طيب الفكرة المتمثلة بالدائرة هي : أني أعرف مركز الدائرة وكذلك نصف قطر الدائرة . هذا الأهم .

لنقوم بتنفيذ إجراء يقوم بعملية الرسم .

سوف أقوم باستدعاء الإجراء وأمرر له فقط نصف القطر و نقطة مركز الدائرة .

نقطة مركز الدائرة على المحور الصادي والسيني لذلك سوف أقووم بتعريف متغير X ومتغير Y ليمثلوا نقاط مركز الدائرة , (يعنى فين بتظهر الدائرة على النافذة في اليمن في النص فين من هنا سوف أحدد) لنعرف هيكل لذلك كما يلي :

ضع صورة PictureBox في الـ Form1 و زر أمر Command Button :

ضيف Module إلى البرنامج وضع به الكود التالي :

Public Type Center
     x As Double
     y As Double
End Type

طيب بعد ذلك نعرف الإجراء بحيث أمرر للإجراء قيمة النقاط:

Public Sub Draw(ByRef c As Center, r As Long, pic As PictureBox)

End Sub

في الإجراء قمنا بتعريف متغير باسم c . نوع البيانات له من نوع الهيكل Centerأي أنه يحتوى على متغيرين

ثم هناك متغير أخر أسمة Pic سوف أتحدث عنة لاحقاً :

نضع الكود التالي في الإجراء ليصبح كما يلي :

Public Sub Draw(ByRef c As Center, r As Long, pic As PictureBox)
    
    Const Radian = ((22 / 7) / 180)
    
    Dim th As Long
    
    For th = 0 To 360
       c.x = c.x + r * Cos(Radian * th)
       c.y = c.y + r * Sin(Radian * th)
       
       pic.PSet (c.x, c.y)
       
    Next th
     
End Sub

هذا الكود مع الهيكل يتم وضعة في وحدة نمطية Module .

الكود التالي سوف نقوم بوضعه في النافذة (Form) في زر أمر. وهوا يستخدم لاستدعاء الإجراء:

Private Sub Command1_Click()
Dim p As Center
p.x = 1000
p.y = 1000

    Draw p, 15, Picture1
    
End Sub

طبعاُ عندما نضع الصورة Picture1 في الـ Form1 سوف نحتاجها لنرسم الدائرة عليها .

طيب الإشكالية .أنه لدينا الإجراء في Module يعني كيف بنصل للـ Form1 . لذلك سوف نمرر الكائن Picture1 إلى الإجراء .

كنت قد تكلمت في الدروس السابقة عن المتغيرات من نوع Object وعرفنا كيف يمكن أن اعرف متغير من نوعها وكذلك كيف يمكن أن أستخدمه.

ملاحظة :

يجب عند تمرير أي متغير إلى أي إجراء أو دالة يجب أن يكون المتغير في الإجراء (المتغير الذي سيستقبل القيمة ) من نفس نوع بيانات المتغير الممر .

ونلاحظ هنا أنه لدينا كائن وهوا الصورة كيف اعرف نوع البيانات لها .

عادة هناك Class أب لنسميه عائلة الصور كل المتغيرات تنتمي إلية التي من نوع كائن صورة . لذلك سوف اعرف متغير يأخذ جميع خصائص الصورة التي أود أن أمررها للإجراء , الـ Class أو عائلة الصور الأب اسمه PictureBox . من خلال كلامي قلت أن الصورة تنتمي للعائلة التي اسمها PictureBox طيب لو عرفت أنا متغير ينتمي لهذه العائلة , النتيجة تكون أن المتغير إلي عرفته يأخذ نفس خصائص الأداة الصورة Picture1 التي تضعها من صندوق الأدوات . يعني يصبحوا إخوان.

Dim Pic As PictureBox

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

شرح الكود :

في البداية عرفنا هيكل في Module وجعلناه من نوع Public حتى نستطيع أن نصل إلية من أي مكان في البرنامج يعني من أي نافذة . ومكونات هذا الهيكل هي متغيرين الأول يحمل مركز الدائرة على محور السينات والثاني هوا على المحور الصادي .

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

السطر :

Const Radian = ((22 / 7) / 180)

هذا السطر عبارة عن متغير ثابت والفكرة منه هوا أنه عند الرسم بالزوايا المثلية القيم الافتراضية للـ Sin و ال Cos هي بنظام الدرجات . Degree . والرسم الدائرة احتاج أحول الزوايا من النظام Degree إلى النظام Radian . كما نلاحظ لتحويل محيط الدائرة ((22 / 7) مقسوما على 180 يعطيني النظام Radian .

على فكرة هذا الموضوع مختص بالرسم بالكثير وما يعنيني هنا هوا فكرة الحل وليس ماهية الحل .

طيب الفكرة لرسم الدائرة : هي باستخدام الزوايا ألمثلثة . كما نعرف ذك عن طريق تمثيلها بخط الأعداد ولنبدأ من 0 – 30 – 60 – 90 – 120 – 150 وهكذا حتى نصل إلى 360 . لنكون دائرة .

لذلك . الزاوية لنسميها سيتا th :

Dim th As Long
    
  For th = 0 To 360
       c.x = c.x + r * Cos(Radian * th)
       c.y = c.y + r * Sin(Radian * th)
       
       pic.PSet (c.x, c.y)
       
    Next th

لاحظ أننا عملنا Loop من الصفر إلى 360 لذلك سوف يكون الدوران على شكل .......0123456 حتى 360 الأن لنحدد موقع الزاوية (نقطة الرسم) على المستوى الأفقي :

دائما الطرف الأيسر هوا الأخذ والأيمن هوا العاطي والترجمة عادة تتم من اليمين إلى اليسار في هذه الحالة .

c.x + r * cos(Radian * th) في هذا السطر سوف نحدد نقطة مركز الدائرة على المحور الأفقي وهي النقطة التي تم تمريرها للإجراء وقد قام الإجراء باستقبال الهيكل . ويستخدم c.x هذه النقطة بعد ذلك لنحدد قطر الدائرة وهوا المتمثل بالمتغير R (عند زيادة قيمة المتغير هذا نستطيع تكبير الدائرة , أي أنه البعد بين موقع النقطة على المحورين عن المركز ) نجمع نصف القطر مع المركز ونظرية في الزاوية .

خليني أدخلكم في مسائل رياضية :

شوفوا ياشباب : ليش حددنا المعادلة c.x + r * Cos(Radian * th) بعني هل هي حفظ . بالطبع لا لأنها جاية من استنتاج معادلات . وهذه المعادلة تستخدم للمحور الأفقي X . وكذلك الحال للـ Y

من تعريف الدائرة نلاحظ أنها عبارة عن مجموعة من النقاط متساوية البعد عن المركز . طيب كيف نستنج معادلة رسم هذه النقاط . نرسم المحورين X , Y ثم نرسم من النقطة (0,0) وتر باتجاه الأعلى على الأرقام الموجبة . ولنسميه فرضا R . فإن النقطة (Y,X) تستخرج بدلاله المعدلة التالية :

Sin th = المقابل / الوتر

النتاج يكون Y/R الذي هوا المقابل المحور Y على الوتر ألي هو فرضناه بـ R :

Sin (th) = Y/R = > 
Y = R * Sin (th) ----------1  'ضرب وسطين في طرفين 

Cos (th) =  X/R   المجاور على الوتر
X= R *  Cos(th) ……....2 'ضرب وسطين في طرفين

نضيف نقطة مركز الدائرة Yc,Xc للمعادلتين فتصبح :

	Y = YC  + R * Sin(th)  ------ 1
            X = Xc  +  R * Cos (th)  -----2

هذه هي المعادلة النهائية والتي سوف نرسم بها الدائرة :

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

نعود إلى الكود :

السطر :

       pic.PSet (c.x, c.y)

المتغير Pic كما قلت هوا من نوع كائن Picture وقد مررنا الكائن Picture1 إليه :

ملاحظة هامة جداً :

التمرير او تعريف المتغيرات التي من نوع Class أو Opject تعتبر من نوع مرجع حتى الهياكل Structure تمرر بالمرجع By References .

يعني أن أي تغير سوف يحدث على الـ Pic سوف يحدث على Picture1 ليش لأن التمرير بالمرجع , واعتقد أني قد تكلمت عن التمرير في الدروس السابقة لذلك قم بمراجعتها .

فأده السطر السابق هو :

الدالة Pset والتي تعني Point Set وهي دالة تستخدم لرسم نقطة عند X,Y . وهن النقاط الناتجة من المعادلة . وبالتالي سوف يتم رسم نقطة بجانب الأخرى حتى الوصول إلى دائرة مكتملة .

اشعر ان الموضوع قد طال فعلاً ولكن :

الفكرة هي في المثال كيف نمرر متغيرات من نوع Opject إلى إجراء , وهذا الدرس سيعتبر من مشهيات الدرس التالي وسوف نغوص من الآن في الـ Object .

وللسلسلة بقية .

B)

#38

الله ينور عليك أخي فواز

وانا نتتظر دروس الكلاس بفارغ الصبر

#39

الله ينور عليك أخي فواز

وانا نتتظر دروس الكلاس بفارغ الصبر

#40
yasserstars كتب:
الله ينور عليك أخي فواز

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#41

لازلنا منتظرين الدروس اخي فواز

#42

أخي الكريم فواز

جزاكم الله خيراً

الدرس غاية في الروعة والأهمية

والله العظيم استفدت كتييييييييييييييييييييير قوي قوي

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

أتمنى تكملة تلك الدروس الرائعة فأسلوبك من جد رائع رائع رائع

جعله الله لك صدقة جارية لك في الدنيا أمد الله في عمرك

وعند لقائك ربك

شكراً أخي

#43

لا اعرف لماذا لم يكمل الاخ فواز باقي دروسه فمنذ 28 مارس 2006 لم يضيف اي درس اخر

نرجو منه ان يعود مرة اخري وان يكمل دروس الكلاس لاننا نحتاجها ضروري جدا

#44

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

وشكراً للجميع

#45

أخي ياسر حياك الله اخي الكريم وكذلك الأخ العزيز asfora وكل القراء الأفاضل :

الحمد الله تخرجت من الجامعة قريب وكان شغلي الشاغل هذه السنة هي مشروع التخرج والذي عملت به على vb.net فأخذ مني الوقت الكبير ولم اتفرغ حتى لأوةر منتدى vb6 وتصدقو اني نسيته (ههههه) لنشغالي بالبحث عن كل ما هوا متعلق بـ vb.net .

لكن بعون الله سوف اواصل هذه السلسلة . كتى أنهيها تماما . وكذلك سوف احاول ترك امثلة ممتازة في كل درس حتى يستفاد من هذه السلسلة ولتكون ايضا مرجع مهم .

سوف اعود قريبا .

#46

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

تكن متزوجاً

وربنا ينفع بعلمك ويجعله في موازين حسناتك

أخوك أحمــــــــــــــــــــــد

#47

اهلا وسهلا بك احي فوز والف مليون مبروك علي نجاحك

ونحن في الانتظار

وفقك الله

#48

الله يبارك فيك اخي احمد أما الزواج ليسا ما تزوجت :D . وربنا يعين .

اخي ياسر اكرر شكري لك . ولله يبارك فيك .

-----------------------------

في بداية الموضوع أعتذر عن الانقطاع الطويل وذلك لانشغالي , ولكن بعون الله سوف أواصل هذه السلسلة من

الدروس التي أتمنى أن يستفيد منها الجميع . ولكن هي أمانة أحملها القارئ الفاضل بأن يدعو لي بالخير في الدنيا والآخرة . ولأنه لي فترة من الدروس لذا قد يكون أسلوب عرض الموضوع مختلف نوعا , مع محاولتي أن أبقى القارئ في وضع القصة حتى يشد أكثر لمتابعة الموضوع وليصل أيضا الموضوع بسهولة .

الدرس الثامن :

بعد التسلسل السابق للدروس , وما كان ذلك إلا للقدوم على درس هام جدا وهي كيفية الاستفادة من ملفات Dll

أو المكتبات .

لنتعرف معاً عن مفهوم الملفات أو المكتبات Dll :

عرفنا كيف تتطور عصر البرمجيات من خلال الإمكانيات التي أتاحها علماء هندسة البرمجيات . وعرفنا كيف استدعيت الحاجة لظهور الإجراءات Procedures والدوال Functionsو الوحدات النمطية Module وعرفنا تبعا لكل تقنية من هذه التقنيات البرمجية الحاجة لظهور الأخرى والمشاكل التي كانت تعاني منها .

ومع تطور البرمجيات مصاحبة للتطور في صناعة الحواسيب . وتكاثر الطلب على البرمجيات . بداء علم الحاسوب يغوص في مجالات دقيقة وبدأ يتفرع هذا العلم ليصبح أكثر تعقيدا ليلبي حاجات السوق الذي بدا يلجا للحاسوب ويعتمد علية اعتمادا كليا لتسير أعمالة .

هنا بدأ فرع الحاسوب في صناعة البرمجيات يتطور أيضا تبعاُ . وبخاصة مع ظهور شركات متخصصة في صناعة البرمجيات . (المحاسبية – الإدارية – شؤون مالية ) وغيرها من البرمجيات .

ولأني لا أفضل الخوض في التفاصيل النظرية ولكن أحببت أن أدع القارئ في فهم عميق لتسلسل هذه المعلومات وعلية سوف اقترب أكثر عن الحاجة التي أدت إلى ظهور تقنيات Dll .

ملاحظة : ( ألرجاء مراجعة الدروس السابقة حتى تتضح الفكرة أكثر )

عرفنا الداعي من أكبر مشكلة كان يعاني منها المبرمجين وهي تكرار الكتل البرمجية والتي أدت لظهور الوحدات البرمجية Module والتي حلت المشكلة من تكرار الكتلة البرمجية (الكود البرمجي ) وهي بذلك قامت بحل ولكن هذا الحل بطبيعة الحال له عيوب ما لم يكن المبرمج على خبرة عالية جدا في استخدام الوحدات النمطية Module , ليش . كما أشرت في الدرس السابق للوحدات النمطية , أنها أتت بحل كويس يتمثل هذا الحل بأن يتم كتابة الكود المتكرر أو الكتلة البرمجية المتكررة على مستوى النوافذ Form بحيث يمكن الوصول إليه مباشرة من أي نافذة هذا الكود يكون موجود في الـ Module :

تحدثت أيضا في الدروس السابقة عن عمر المتغيرات . متى يتم تدميرها في الذاكرة , وأشرت إلى المشاكل التي كانت تواجه علماء هندسة البرمجيات في متابعة تحسين الكود وكيفية الاستفادة بقدر الإمكان من الموارد المتاحة له مثل الذاكرة والمعالج واللحظات الزمنية التي يضل فيها البرنامج وما يحتويه في الحاسوب .

ومن هنا فإن فكرة الـ Module أو الوحدات النمطيه هذه هي أن ما بداخلها يمكن الوصول إليه في أي لحظة . ومن أي نافذة . طيب السؤال الذي يطرح نفسه متى يتم تحميل ما بداخل الـ Module للذاكرة ومتى يتم إنهائه أو تدميره .

عندما قام المهندسون بعمل هذه التقنية . في لغة Visual Basic . وضع كل ما بداخل الـ Module ككتل برمجية عامة أي أنه يتم تحميله في الذاكرة لحظة تشغيل البرنامج(تحميل البرنامج للذاكرة) الخاص بك ومتى ينتهي . لحظة إنهاء البرنامج.

فكر معي فين الخطأ في هذه التقنية :

الواضح من الأمر هوا بقاء المتغيرات وما يحتوية الـ Module من نوع Public في الذاكرة .

وبذلك فهناك بيانات قد تضل موجودة في الذاكرة حتى بدون أن تستفيد منها . كيف .

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

بذلك تدع الـ Module يضع في الذاكرة متغيرات وغيره ويشغل مساحات ليس لها أي داعي .

وبالفعل أنا أعيب في هذه التقنية وهي بقاء ما بداخل الكتل البرمجية قيد الاستخدام ما دام البرنامج يعمل .

طيب ما الحل :

ونحن نعرف الفائدة الرائعة التي يقدمها لنا الـ Module :

من ضمن فوائدة أيضا انه يمكن أن استخدمه كمستودع أضع به الدوال والإجراءات الخاصة بي . وتعرفنا عن سبب ذلك , والفائدة منها في أنه يمكن أن أنسخ فقط الـ Module وأضيفه في البرنامج الجديد والذي سوف أبدأ بتصميمه . وبذلك سوف أستخدم ما بداخلة بسهولة ويسر .

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

مشاكل الـ Module :

- بقاء المتغيرات في الذاكرة من نوع public حتى نهاية البرنامج .

- فكرة جمع الكتل البرمجية فيه ينقصه قليل من التنظيم والتطوير .

مع تطور الشركات البرمجية , ظهرت مشكلة عانى منها المبرمجون (المستخدمين لهذه التقنيات وليس صانعوها إلي هم مهندسو البرمجيات) . ما هي حاجاتهم . كل شوية طالعين لنا ويقولوا يا مهندسين البرمجيات شوفوا لنا حل

اجتمع المهندسين , ليحاولوا النظر في أمر تطوير التقنيات هذه , ألي هي ايش . كان في الشركات عند ما يطلب منها عمل برنامج ما وليكن مثلا برنامج محاسبي يجتمع الفريق الخاص بالعمل .

وبعد دراسة وتحليل النظام الخاص بالزبون يقوم المحلل للنظام ومدير التطوير بتقسيم العمل على الفريق يا محمد أنت عليك بناء قاعدة البينان و أنت يا سامي عليك أنت وعلى بناء المخازن . وأنت يا عمار عليك التقارير – وأنا وعبد الكريم سوف نقوم ببناء المرحلة المستندية (السند – اليومية – الأستاذ العام – ميزان المراجة – الميزانية المومية ) بعد كذا نجتمع كلنا لنعد شاشات سندات القبض والفواتير ----------- الخ من هذه العمليات )

طيب الشغلة شكلها كبيرة شوف صاحبنا كم مقسم الفريق وكم الأدوار أيضا . في مثل هذه الحالة سيكون العمل بنسبة كبيرة جدا على الـ Module في البرنامج . السبب لماذا .

لو سألنا سؤال . كيف يعمل كل واحد منهم على شكل مستقل عن صاحبة , هوا الأصل أن يعملوا مع بعض لتركيب البرنامج ولا كيف هذا بيعمل الـ Form وكيف يتم تركيبها في نموذج واحد .

طيب تكرار الكود بين الفريق كيف سيكون .

هذه المشكلة وغيرها من المشاكل دعت من مهندسين البرمجيات إلى أيجاد تقنيات أخرى مساعدة للمبرمجين لكي يكون العمل بين الفريق سهل ومرن وسريع في نفس الوقت . وعليه تفرع هذا العلم ليعتمد بعد ذلك على محلل الأنظمة . والذي سوف يراقب جودة الكود Code Optimized لكي يعمل بسرعة عالية ولكي يجنب أيضا ظهور مشاكل في البرنامج . وهنا ظهرت أساليب كثيرة جداُ للمساعدة في علاج هذه المشاكل .

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

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

رائعة جدا هي تقنية OOP أي Object Oriented Programming أي البرمجة ألهدفيه أو كما تسمى أيضا عربيا البرمجة الكائنية .

هذه التقنية ظهرت وأصبحت حاليا هي التقنية التي يتم تطويرها من قبل الشركات البرمجية (المؤلفة للغات ) وهي قياسية أي أن جميع اللغات البرمجية تستخدم هذه التقنية ولكن لكل لغة أسلوب معين في عرض هذه التقنية على المبرمج (ألي بيعمل برامج للسوق) . وتختلف الصيغ النحوية أي طريقة كتابتها من لغة لأخرى .

فجميع الأفكار المقدمة من علماء هندسة البرمجيات يتم تطبيقها في كثير من اللغات البرمجية .

طبعاُ للأسف الشديد لغة Visual Basic 6 تدعم مفاهيم فقط لهذه التقنية . أما الإصدار الأخير من اللغة إلي هوا Vb.net أصبح يعتمد اعتماد كلي على تقنية OOP . لذلك نرى الفرق قد تغير بين الإصدارين وهوا ناتج عن استخدم vb7 لهذه التقنيات بكامل مفهومها .

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

لذا فالدرس القادم هو عن الـ Classes في Visual Basic وكيف يمكن استخدامها .

تحياتي للجميع : منتظر التعليقات حول الدرس , تمنياتي للجميع لاستفادة وطلبي منهم الدعاء

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

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

B)

#49

ممتاز أخي فواز ... منتظرين دروس الكلاس على أحر من الجمر

بارك الله فيك ورزقك من علمه

#50

أحسنت اخي فواز وعودة حميدة للدروس الجميلة

وانت تعلم اننا كلنا منتظرين شرحك الجميل في دروس الكلاس

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