hamata00
12-05-2006, 07:11 PM
http://www.9o9i.com/uploads/5f64be0b4c.gif
في هذا الموضوع لن أخوض بشرح نظري ولكن سيكون التركيز في الشرح عن الأدوات التي سيتم استخدامها عمليا في الكود :
ما هي البرمجة باستخدام OOP أو البرمجة الهدفيه :
كلمة OOP اختصار من Object Oriented Programming وهي عبارة عن أسلوب برمجي تم ابتكاره على أساس مساعدة المبرمجين في ترتيب الشفرة المصدرية والاستفادة من إمكانية إعادة الترتيب والاستخدام في برامج أخرى.
كانت اكبر مشكلة يعاني منها المبرمجين وهي مشكلة التكرار الذي يصاحب البرنامج فمثلا لو أردنا أن نكتب برنامج ما وليكن مثلا أننا نريد أن نظهر نافذة ما في منتصف الشاشة مع الميلان قليلا ناحية اليسار :
سنحتاج في هذا إلى إنشاء الكود التالي :
CODE
Private Sub Command1_Click()
Dim H As Long, W As Long
H = ((Screen.Height - Form1.Height) / 2)
W = ((Screen.Width - (Form1.Width + 2145)) / 2)
Form1.Move W, H
Form1.Show vbModal
End Sub
في الكود السابق تم تعريف متغيرين من نوع Long وذلك لأخذ موقع النافذة بالنسبة للشاشة ولقسمة على الرقم 2 ليجعل ظهور النافذة في المنتصف.
نلاحظ أيضا استخدام الدالة Move التابعة للنافذة Form1 ووظيفة هذه لداله هوا تحريك النافذة على المستوى الأفقي والعمودي وهي تقوم بعمل الخصائص Top و Left . ولإستخدامها في هذه الحالة اسرع بكثير من الدوال Top و Left . في تنفيذ التحريك .
لاحظ لو حاولنا أن نظهر نافذة أخرى في البرنامج في نفس القياسات السابقة ستلاحظ أننا يجب أن نكتب الكود التالي :CODE
Private Sub Command1_Click()
Dim H As Long, W As Long
H = ((Screen.Height – Form2.Height) / 2)
W = ((Screen.Width - (Form2.Width + 2145)) / 2)
Form2.Move W, H
Form2.Show vbModal
End Subهذا الكود يقوم بوضع النافذة في المنتصف مائل لليسار لكن : تخيل لو أن عدد النوافذ لديك في البرنامج تفوق 16 نافذة إذا يجب علينا أن نكرر هذا الكود على مستوى 16 نافذة .
كانت هذه مشكلة كبيرة جدا وهي تكرار الشفرة لاحظ كيف تم تكرارها :
لم يتم تغير أي شي في الشفرة سوى اسم النافذة .
من هنا قام مهندسو البرمجيات بعمل حل لهذه المشكلة وهي استخدام الدوال ولإجراءات لحل هذه المشكلة :
تتمثل هذه الفكرة بما يلي :
الإجراء :
هوا عبارة عن كتله برمجية لها بداية ونهاية يتم استدعاء محتوياتها عددت مرات من أماكن مختلفة في البرنامج
وبالتالي فهي تساعد في أن تشارك في إعطاء العديد من المهام في البرنامج دون الحاجة لإعادة كتابه الكود أو الشفرة :
في لغة Visual Basic يتم التعريف عن الإجراء على النحو التالي :
CODE
[Private | Public | Protected | ] Sub Sub_Name ([Parameters])
End Sub
الأنواع [Private | Public | Protected | ] :
هما عبارة عن أدوات الحماية للإجراء . كيف :
قلت في الأعلى أن الإجراء والد اله هما عبارة عن كتله برمجية يمكن الوصول إليهما من أي مكان في البرنامج . ولكن هنا نوع الوصول قد يتم منعه . كيف :
كلمة Private :
تعني أن هذا الإجراء يمكن أن استخدمه في المكان الحالي الذي أنا فيه . فمثلا لو عرفت إجراء على النحو التالي :
CODE
Private Sub Sub_Name ()
End Sub
وكان هذا التعريف في النافذة Form1 :
كلمة Private تعني انه ممكن أن استخدم هذا الإجراء بعني استدعيه من داخل Form1 فقط ولا يمكن أن أستدعيه من Form أخر غير Form1 . مثلا :
لو كنت في Form2 وأردت أن أستخدمه كما يلي :
CODE
Form1.Sub_name
لاحظ عند وضع علامة Dot أي النقطة بعد كلمة Form1 لم يظهر اسم الإجراء Sub_name وذلك لأن كلمة Private قد منعت استدعاء هذا الإجراء من خارج Form1 وأنا في هذه الحالة قمت باستدعائه من Form2 .
طيب لو دعت الحاجة أن استخدم هذا الإجراء في Form2 كيف الحل :
أقوم بتغير كلمة Private إلى Public وهي بمعني يمكن من أي مكان في البرنامج أن استدعي هذا الإجراء وبالتالي يمكن أن أستدعيه من أي نافذة في البرنامج . وهوا يظهر في نافذة الإكمال التلقائي بمجر وضع Dot بعد Form1 .
الكلمة Protected : تعني لايمكن الوصول إلى الإجراء إلى داخل الفئات المشتقة أو Class المشتق او المورث من Class أخر ولا يمكن الوصول إليه عند الاستخدام . دعك من هذا الآن سوف أتحدث عنه عند البدء باستخدام الـ Classes في لغة Visual Basic .
يجب عليك أن تختار احد الثلاثة المذكورة إما Private أو Public أو Protected .
بعد ذكر نوع محدد الوصول إلى الإجراء نذكر كلمة Sub وهي تعني أن هذه الكتلة هي عبارة عن إجراء ثم بعد هذه الكلمة أسم الإجراء بعد ذلك الوسطاء أو Parameters التي تمرر للإجراء .
مثال :
اكتب التالي في النافذة Form1CODE
Private Sub SetName ()
End Sub
هذا الإجراء أسمه SetName و عند استدعائه نكتب التالي :
ضع زر أمر وضع به التالي :
CODE
Private Sub Command1_Click()
SetName
End Sub
عند الضغط على زر الأمر سوف يبحث مترجم البرنامج عن لإجراء اسمه SetName فإذا وجدته يتم تنفيذ ما بداخلة من كود برمجي , لنضع الكود التالي في الإجراء SetName ليصبح كما يلي :
CODE
Private Sub SetName ()
MsgBox "hi"
End Sub
الآن قم بالضغط على زر الأمر ماذا تلاحظ , ظهور رسالة تحمل نص Hi .
انتقل إلى النافذة Form2 وحاول أن تستدعي الإجراء . سوف تلاحظ أنه لا يمكنك الوصول إلى الإجراء لأنه هنا خاص بالنافذة Form1 لذلك غير محدد الوصول أو نوع حماية الإجراء من Private إلى Public . ثم حاول أن تستدعيه من Form2 .
ملاحظة مهمة :
تعتبر Form1 شبيهه بالمنزل تحتوى على عدد من الغرف فعند ما أود أن أصل إلى غرفه وأنا بداخل المنزل اذكر اسم الغرفة مباشره .أما لو كنت خارج المنزل وأريد أن أصل للغرفة فإنه يجب أن أذكر اسم المنزل ثم الغرفة .
فلو كنت في Form2 وأود أن أصل لأجزاء من النافذة Form1 يجب أن أذكر اسم النافذة Form1 وبعد ذلك اسم الإجراء أو الشئ الذي أريده .CODE
Form1.SetName
طيب ما هي آل Parameters أو الوسطاء :
نحن فعلا استفدنا من الإجراء ولكن ما ذا لو أردنا أن نغير الرسالة التي تظهر وهي نص Hi
هنا دعت الحاجة لإيجاد أسلوب أكثر مرونة لتعامل مع مثل هذه الحالة . وهو تعريف الإجراء بحيث يتم تمرير قيمة له من أي مكان في البرنامج ليتم استخدامها في الإجراء.
CODE
Private Sub SetName (txt As String)
MsgBox txt
End Sub
لاحظ أن الوسيط هوا عبارة عن متغير له اسم ونوع بيانات ولكن تعريفة بدون عبارة Dim . والوسيط هنا في الإجراء هوا المتغير txt ونوع البيانات التي سيأخذها هي بيانات نصية . لاحظ أبضا أني غيرت الرسالة التي ستظهر للمستخدم ووضعتها بقيمة المتغير . أما عند استخدام الإجراء مع الوسيط فيكون كما يلي :
من داخل Form1
CODE
SetName "My Name"من خارج الـ Form1
CODE
Form1. SetName "My Name"تم ذكر اسم الإجراء ثم بين علامة تنصيص تم وضع كلمة My Name وهي البيانات التي سيستقبلها المتغير txt في الإجراء يعني المتغير txt في الإجراء هوا أي نص ذكر بعد اسم الإجراء . وسيكون ناتج استدعاء الإجراء هوا ظهور رسالة بها نص My Name .لنأخذ المثال السابق ونلاحظ كيف سيتم الاستفادة من الإجراء : سيتم تغيره إلى التالي :CODE
Public Sub CenterForm(frm As Form)
Dim H As Long, W As Long
H = ((Screen.Height - frm.Height) / 2)
W = ((Screen.Width - (frm.Width + 2145)) / 2)
frm.Move W, H
frm.Show vbModal
End Sub
هذا عبارة عن إجراء كتلة Block لها بداية من Public Sub ونهاية عند End Sub . اسم الإجراء CenterForm يحتوى على وسيط واحد وهوا frm ولكن يجب النظر إلى نوع البيانات التي أخذها المتغير frm .
يجب أن نعرف انه من أنواع البيانات بيانات قياسية مثل integer , string ,long وغيرها وبيانات اخرى من نوع Object من هذه الأنواع Form,Picture,Command وغيرمن هذه الأنواع .
حيث أنه تم تعريف المتغير frm من نوع Form أي من نوع نافذه وبالتالي فإن القيمة التي يجب ان يستقبلها المتغير frm يجب أن تكون اسم نافذة . ويكون استدعاء الإجراء كما يلي :CODE
CenterForm Form5
من خارج الـ Form1
CODE
Form1. CenterForm Form5
وبالتالي سوف استدعي اسم هذا الإجراء 16 مرة في 16 أمر ليقوم بتوسيط النافذة الممررة وبتالي لن يكون هناك تكرار لهذا الكود في 16 أمر وإنما التكرار سيكون في اسم الإجراء فقط وبتالي اختصرت الوقت والجهد وقللت من حجم البرنامج أيضا أتحت فرصة التعديل بحث إذ أردت أن اعدل في الإجراء فإن ناتج التعديل سيسري على جميع النوافذ التي تستدعي الإجراء لا كما بدون استخدام الإجراء الذي سأضطر أن أغير في جميع النوافذ .
حاولت قدر الاستطاعة تبسيط هذا الدرس أتمتا للجميع الاستفادة منه وهوا موجه للمبتدئين :
سير الدرس سيكون حول الإجراءات Procedures و الدوال Functions و الخصائص Properties ثم الوحدات النمطية Module ثم الفئات Classes . والخوض في تفصيلها وكيفية التعامل معها حتى يتحول الدرس إلى دروس متقدمه وذلك بالتطبيق .
ملاحظة جميع هذه الدروس مرجعي الوحيد هوا ما يحتويه عقلي وتسلسل الدرس من تدفقات التعبير لدي لذا اعتذر لمن لم يفهم الشرح جيدا وأتمنا للجميع التوفيق وفي انتظار التعليقات . وللدرس بقية ؟
هذا الموضوع برعاية:0
1.hamata00
2.ahmed ksnv
ارجو الرد بعد التجربة
في هذا الموضوع لن أخوض بشرح نظري ولكن سيكون التركيز في الشرح عن الأدوات التي سيتم استخدامها عمليا في الكود :
ما هي البرمجة باستخدام OOP أو البرمجة الهدفيه :
كلمة OOP اختصار من Object Oriented Programming وهي عبارة عن أسلوب برمجي تم ابتكاره على أساس مساعدة المبرمجين في ترتيب الشفرة المصدرية والاستفادة من إمكانية إعادة الترتيب والاستخدام في برامج أخرى.
كانت اكبر مشكلة يعاني منها المبرمجين وهي مشكلة التكرار الذي يصاحب البرنامج فمثلا لو أردنا أن نكتب برنامج ما وليكن مثلا أننا نريد أن نظهر نافذة ما في منتصف الشاشة مع الميلان قليلا ناحية اليسار :
سنحتاج في هذا إلى إنشاء الكود التالي :
CODE
Private Sub Command1_Click()
Dim H As Long, W As Long
H = ((Screen.Height - Form1.Height) / 2)
W = ((Screen.Width - (Form1.Width + 2145)) / 2)
Form1.Move W, H
Form1.Show vbModal
End Sub
في الكود السابق تم تعريف متغيرين من نوع Long وذلك لأخذ موقع النافذة بالنسبة للشاشة ولقسمة على الرقم 2 ليجعل ظهور النافذة في المنتصف.
نلاحظ أيضا استخدام الدالة Move التابعة للنافذة Form1 ووظيفة هذه لداله هوا تحريك النافذة على المستوى الأفقي والعمودي وهي تقوم بعمل الخصائص Top و Left . ولإستخدامها في هذه الحالة اسرع بكثير من الدوال Top و Left . في تنفيذ التحريك .
لاحظ لو حاولنا أن نظهر نافذة أخرى في البرنامج في نفس القياسات السابقة ستلاحظ أننا يجب أن نكتب الكود التالي :CODE
Private Sub Command1_Click()
Dim H As Long, W As Long
H = ((Screen.Height – Form2.Height) / 2)
W = ((Screen.Width - (Form2.Width + 2145)) / 2)
Form2.Move W, H
Form2.Show vbModal
End Subهذا الكود يقوم بوضع النافذة في المنتصف مائل لليسار لكن : تخيل لو أن عدد النوافذ لديك في البرنامج تفوق 16 نافذة إذا يجب علينا أن نكرر هذا الكود على مستوى 16 نافذة .
كانت هذه مشكلة كبيرة جدا وهي تكرار الشفرة لاحظ كيف تم تكرارها :
لم يتم تغير أي شي في الشفرة سوى اسم النافذة .
من هنا قام مهندسو البرمجيات بعمل حل لهذه المشكلة وهي استخدام الدوال ولإجراءات لحل هذه المشكلة :
تتمثل هذه الفكرة بما يلي :
الإجراء :
هوا عبارة عن كتله برمجية لها بداية ونهاية يتم استدعاء محتوياتها عددت مرات من أماكن مختلفة في البرنامج
وبالتالي فهي تساعد في أن تشارك في إعطاء العديد من المهام في البرنامج دون الحاجة لإعادة كتابه الكود أو الشفرة :
في لغة Visual Basic يتم التعريف عن الإجراء على النحو التالي :
CODE
[Private | Public | Protected | ] Sub Sub_Name ([Parameters])
End Sub
الأنواع [Private | Public | Protected | ] :
هما عبارة عن أدوات الحماية للإجراء . كيف :
قلت في الأعلى أن الإجراء والد اله هما عبارة عن كتله برمجية يمكن الوصول إليهما من أي مكان في البرنامج . ولكن هنا نوع الوصول قد يتم منعه . كيف :
كلمة Private :
تعني أن هذا الإجراء يمكن أن استخدمه في المكان الحالي الذي أنا فيه . فمثلا لو عرفت إجراء على النحو التالي :
CODE
Private Sub Sub_Name ()
End Sub
وكان هذا التعريف في النافذة Form1 :
كلمة Private تعني انه ممكن أن استخدم هذا الإجراء بعني استدعيه من داخل Form1 فقط ولا يمكن أن أستدعيه من Form أخر غير Form1 . مثلا :
لو كنت في Form2 وأردت أن أستخدمه كما يلي :
CODE
Form1.Sub_name
لاحظ عند وضع علامة Dot أي النقطة بعد كلمة Form1 لم يظهر اسم الإجراء Sub_name وذلك لأن كلمة Private قد منعت استدعاء هذا الإجراء من خارج Form1 وأنا في هذه الحالة قمت باستدعائه من Form2 .
طيب لو دعت الحاجة أن استخدم هذا الإجراء في Form2 كيف الحل :
أقوم بتغير كلمة Private إلى Public وهي بمعني يمكن من أي مكان في البرنامج أن استدعي هذا الإجراء وبالتالي يمكن أن أستدعيه من أي نافذة في البرنامج . وهوا يظهر في نافذة الإكمال التلقائي بمجر وضع Dot بعد Form1 .
الكلمة Protected : تعني لايمكن الوصول إلى الإجراء إلى داخل الفئات المشتقة أو Class المشتق او المورث من Class أخر ولا يمكن الوصول إليه عند الاستخدام . دعك من هذا الآن سوف أتحدث عنه عند البدء باستخدام الـ Classes في لغة Visual Basic .
يجب عليك أن تختار احد الثلاثة المذكورة إما Private أو Public أو Protected .
بعد ذكر نوع محدد الوصول إلى الإجراء نذكر كلمة Sub وهي تعني أن هذه الكتلة هي عبارة عن إجراء ثم بعد هذه الكلمة أسم الإجراء بعد ذلك الوسطاء أو Parameters التي تمرر للإجراء .
مثال :
اكتب التالي في النافذة Form1CODE
Private Sub SetName ()
End Sub
هذا الإجراء أسمه SetName و عند استدعائه نكتب التالي :
ضع زر أمر وضع به التالي :
CODE
Private Sub Command1_Click()
SetName
End Sub
عند الضغط على زر الأمر سوف يبحث مترجم البرنامج عن لإجراء اسمه SetName فإذا وجدته يتم تنفيذ ما بداخلة من كود برمجي , لنضع الكود التالي في الإجراء SetName ليصبح كما يلي :
CODE
Private Sub SetName ()
MsgBox "hi"
End Sub
الآن قم بالضغط على زر الأمر ماذا تلاحظ , ظهور رسالة تحمل نص Hi .
انتقل إلى النافذة Form2 وحاول أن تستدعي الإجراء . سوف تلاحظ أنه لا يمكنك الوصول إلى الإجراء لأنه هنا خاص بالنافذة Form1 لذلك غير محدد الوصول أو نوع حماية الإجراء من Private إلى Public . ثم حاول أن تستدعيه من Form2 .
ملاحظة مهمة :
تعتبر Form1 شبيهه بالمنزل تحتوى على عدد من الغرف فعند ما أود أن أصل إلى غرفه وأنا بداخل المنزل اذكر اسم الغرفة مباشره .أما لو كنت خارج المنزل وأريد أن أصل للغرفة فإنه يجب أن أذكر اسم المنزل ثم الغرفة .
فلو كنت في Form2 وأود أن أصل لأجزاء من النافذة Form1 يجب أن أذكر اسم النافذة Form1 وبعد ذلك اسم الإجراء أو الشئ الذي أريده .CODE
Form1.SetName
طيب ما هي آل Parameters أو الوسطاء :
نحن فعلا استفدنا من الإجراء ولكن ما ذا لو أردنا أن نغير الرسالة التي تظهر وهي نص Hi
هنا دعت الحاجة لإيجاد أسلوب أكثر مرونة لتعامل مع مثل هذه الحالة . وهو تعريف الإجراء بحيث يتم تمرير قيمة له من أي مكان في البرنامج ليتم استخدامها في الإجراء.
CODE
Private Sub SetName (txt As String)
MsgBox txt
End Sub
لاحظ أن الوسيط هوا عبارة عن متغير له اسم ونوع بيانات ولكن تعريفة بدون عبارة Dim . والوسيط هنا في الإجراء هوا المتغير txt ونوع البيانات التي سيأخذها هي بيانات نصية . لاحظ أبضا أني غيرت الرسالة التي ستظهر للمستخدم ووضعتها بقيمة المتغير . أما عند استخدام الإجراء مع الوسيط فيكون كما يلي :
من داخل Form1
CODE
SetName "My Name"من خارج الـ Form1
CODE
Form1. SetName "My Name"تم ذكر اسم الإجراء ثم بين علامة تنصيص تم وضع كلمة My Name وهي البيانات التي سيستقبلها المتغير txt في الإجراء يعني المتغير txt في الإجراء هوا أي نص ذكر بعد اسم الإجراء . وسيكون ناتج استدعاء الإجراء هوا ظهور رسالة بها نص My Name .لنأخذ المثال السابق ونلاحظ كيف سيتم الاستفادة من الإجراء : سيتم تغيره إلى التالي :CODE
Public Sub CenterForm(frm As Form)
Dim H As Long, W As Long
H = ((Screen.Height - frm.Height) / 2)
W = ((Screen.Width - (frm.Width + 2145)) / 2)
frm.Move W, H
frm.Show vbModal
End Sub
هذا عبارة عن إجراء كتلة Block لها بداية من Public Sub ونهاية عند End Sub . اسم الإجراء CenterForm يحتوى على وسيط واحد وهوا frm ولكن يجب النظر إلى نوع البيانات التي أخذها المتغير frm .
يجب أن نعرف انه من أنواع البيانات بيانات قياسية مثل integer , string ,long وغيرها وبيانات اخرى من نوع Object من هذه الأنواع Form,Picture,Command وغيرمن هذه الأنواع .
حيث أنه تم تعريف المتغير frm من نوع Form أي من نوع نافذه وبالتالي فإن القيمة التي يجب ان يستقبلها المتغير frm يجب أن تكون اسم نافذة . ويكون استدعاء الإجراء كما يلي :CODE
CenterForm Form5
من خارج الـ Form1
CODE
Form1. CenterForm Form5
وبالتالي سوف استدعي اسم هذا الإجراء 16 مرة في 16 أمر ليقوم بتوسيط النافذة الممررة وبتالي لن يكون هناك تكرار لهذا الكود في 16 أمر وإنما التكرار سيكون في اسم الإجراء فقط وبتالي اختصرت الوقت والجهد وقللت من حجم البرنامج أيضا أتحت فرصة التعديل بحث إذ أردت أن اعدل في الإجراء فإن ناتج التعديل سيسري على جميع النوافذ التي تستدعي الإجراء لا كما بدون استخدام الإجراء الذي سأضطر أن أغير في جميع النوافذ .
حاولت قدر الاستطاعة تبسيط هذا الدرس أتمتا للجميع الاستفادة منه وهوا موجه للمبتدئين :
سير الدرس سيكون حول الإجراءات Procedures و الدوال Functions و الخصائص Properties ثم الوحدات النمطية Module ثم الفئات Classes . والخوض في تفصيلها وكيفية التعامل معها حتى يتحول الدرس إلى دروس متقدمه وذلك بالتطبيق .
ملاحظة جميع هذه الدروس مرجعي الوحيد هوا ما يحتويه عقلي وتسلسل الدرس من تدفقات التعبير لدي لذا اعتذر لمن لم يفهم الشرح جيدا وأتمنا للجميع التوفيق وفي انتظار التعليقات . وللدرس بقية ؟
هذا الموضوع برعاية:0
1.hamata00
2.ahmed ksnv
ارجو الرد بعد التجربة



