اولا :- لازم تكون عندك قاعده بيانات جاهزه ومفتوحه وفيها الجدول اللي انت عايزه طبعا هتكون زي اللي في الدرس اللي عملناه المره اللي فاتت فياريت اللي معملش يعمل
ثانيا :- افتح مشروع جديد وحط فيه الحاجات اللي هقولهالك
1- 5 صندوق نص (text box)
2- 5 عنوان اسم (label) بالاسماء – * الاسم * العنوان * تليفون منزل * تليفون محمول * ايميل (طبعا اللي عايز يزود لازم يزود عمود في جدول القاعده)
3- 10 زراير باسماء * جديد * حفظ *مسح * بحث *اظهار الكل * امام * خلف * الاول * الاخير * خروج
4- اضف من قائمه الادوات الاداه التي تسمى data
زي الشكل ده :-
الخصائص :-
قبل ما نبداء نبرمج لازم نظبط الخصائص , وهي اللي هتحدد انا عايز اعمل ايه بالاداه اللي في ايدي ممكن اعمل على المستخدم نظام اجباري للتعامل مع البرنامج يعني مسبهالوش سبهلله لانه اكيد مليون في الميه هيفتكس حاجات في البرنامج تطلع رسائل خطاء فانا من خلال تحديدي لمسار شغل المستخدم على البرنامج باحمي البرنامج من اظهار الاخطاء
الكائن الخاصيه القيمه السبب
Text (x) enabled false تحديد حركه المستخدم حتى لايضيف مالا نريده ***
Command2 enabled false حتى لايضغط عليه المستخدم قبل ان يضغط زر جديد
DATA1 visible false وضعنا ازرار امام وخلف بدلا منها مع شكلها الغير لطيف
بعد اضافه الخصائص الى المشروع نبدا على بركه الله في تربيط قاعده البيانات بالداتا كنترول ثم نقوم بربط الكائنات الاخرى ايا كانت بالداتا كنترول التي قمنا بتوصيلها بقاعده البيانات
انظر الشكل :
تذكر :- قم بمسح مسار القاعده بالكامل (ماعدا قاعده البيانات بالطبع) حتى لاتحدث مشاكل في حال قمت بنقلها من جهاز لاخر
بعد ان قمنا بتحديد قاعده البيانات المطلوبه يجب ان نقوم بتحديد الجدول المراد فتحه من خلال الخاصيه RECORDSOURCE
قم بتحديد اسم الجدول TEL كما انشاناه في القاعده في السابق
احنا كده ربطنا القاعده بالداتا كنترول لكن ايه اللي يخلي صناديق النصوص تشوف ايه اللي جوه القاعده هنربط الصناديق دي بالداتا كنترول وده هيتم بخاصيتين : DATAFIELD و DATASOURCE
زي ما احنا شايفين:
وطبعا هنقوم بتغيير DATAFIELD في كل مره على حسب صندوق النص يعهني واحد للاسم والتاني العنوان والاخير الايميل اما DATASOURCE هتفضل ثابته
بعد ما ربطنا تعالو نبداء مع بعض نحط الكود:-
اولا الاكواد الاوليه:
زر جديد:-
كود:
Data1.Recordset.AddNew Command1.Enabled = False Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False Command5.Enabled = False Command6.Enabled = False Command7.Enabled = False Command8.Enabled = False Command9.Enabled = False Text1.Enabled = True Text2.Enabled = True Text3.Enabled = True Text4.Enabled = True Text5.Enabled = True
زر حفظ :-
كود:
Data1.Recordset.Update Command1.Enabled = True Command2.Enabled = False Command3.Enabled = True Command4.Enabled = True Command5.Enabled = True Command6.Enabled = True Command7.Enabled = True Command8.Enabled = True Command9.Enabled = True Text1.Enabled = False Text2.Enabled = False Text3.Enabled = False Text4.Enabled = False Text5.Enabled = False
زر مسح:-
كود:
Data1.Recordset.Delete
زر بحث:-
Dim X As String
كود:
X = InputBox("ÇÏÎá ÇáÇÓã", "ÇáÇÌäÏå") Data1.RecordSource = "SELECT * FROM TEL WHERE NAME = '" + X + "'" Data1.Refresh
زر اظهار الكل :- الدرس القادم
زر اول:-
Data1.Recordset.MoveFirst
زر اخر:-
Data1.Recordset.MoveLast
زر امام:-
Data1.Recordset.MovePrevious
زر خلف:-
Data1.Recordset.MoveNext
كبدايه ارجوا ضبط الخاصييه enabled الخاصه بالزر حفظ على الوضع false وذلك لقفلها امام المستخدم لانه لو فكرنا منطقيا لوجدنا هناك عيبا خطيرا فقد يقوم المستخدم بالضغط على حفظ قبل امر جديد فيؤدي الى ضهور رساله خطاء وخروج البرنامج خروجا غير لائق ببرنامج محترف (يمكنك تنفيذ البرنامج ومعرفه امكانيه حدوثه من عدمه كما يمكنك قراءه نص الخطاء ومعرفته)
بالنسبه لزر جديد:-
ماذا يحدث عندما تقوم بالضغط على هذاا الزر؟
يجب ان تسال نفسك هذا السؤال في كل مره تحاول فيها عمل اي برنامج وذلك تجنبا لاي اخطاء برمجيه او منطقيه
وفي حالتنا هذه يوجد خطاء برمجي وهو:-
اذا كتبت الكود الخاص بامر جديد كما تعلمنا في السابق وتركته على ما هو عيه فماذا يحدث؟ سوف تقوم الداتا كنترول باخبار قاعده البيانات بتجهيز حقل جديد لوضع بيان او عده بيانات جديده لكن لو لم تضغط هذا الزر وقام المستخدم بالكتابه الفوقيه على احدى البيانات فانها سوف تقوم تلقائيا بالتعديل في البيانات داخل قاعده اليانات (العيب الاساسي للداتا كنترول) ولذلك يجب اغلاق هذا الخطاء ويتم ذلك من خلال خاصيه (enable) لصناديق النصوص داخل الفورمه كي لايتمكن المستخدم من التعديل بها وحرصا على بيانات هذه القاعده
وسيكون الكود الجديد كالاتي:
ملهوظه يتم ضبط الخاصيه enable لجميع صناديق النص بالقيمه false في بدايه التحميل كي تكون هي الخاصيه الاساسيه لتلك الكائنات
ولكن اثناء سير البرنامج يجب على المستخدم ادخال النصوص فيها لذا يجب فتحها لكي تستقبل البيانات لذا نقوم بضبط الخاصيه enabled بالقيمه true كما ياتي:-
كود:
Data1.recordset.addnew Text1.enable-= true Text2.enable= true ………………..
الخ
بهذه الطريقه لن يتمكن المستخدم من ان يقوم بعمل اي تغير في اي بيان في قاعده البيانات بدون قصد فتكون قاعده البيانات في منا عن العبث
وكما نرى بالشكل قمت باغلاق الخاصيه enabled فاصبحت صناديق النص مغلقه امام المستخدم كي لايقوم بتعديلها:-
ليس هذا كل شئ هناك الازرار جديد وحفظ ومسح وبحث , ماذا يحدث اذا قام المستخدم بعد ضغط زر جديد بان قام بالضغط على مسح او بحث ثم اراد ان يقوم بعمليه اتعديل فالحفظ بالتاكيد سيكون هناك خطاء ورسائل تخبر المستخدم بخراب بيت البرنامج بينما المستخدم يعتقد ان البرنامج غير صالح للعمل بالاضافه الى اننا قمنا باغلاق الخاصيه enabled للزر حفظ في البدايه فكيف سيتمكن المستخدم من الضغط عليه اذا كان لايعمل؟
الحل اضافه سطزر جديده الى البرنامج كالاتي :
كود:
Command1.enabled= false ' حتى لايضغط على الزر مرتين Command2.enabled=true ' يمكن الزر حفظ من العمل Command3.enabled = false ' لاغلاق زر مسح Command4.enabled = false ' اغلاق زر بحث
سنقوم ايضا باضافه سطور لاغلاق الخاصيه enabled للازرار الاربعه الباقيه الامام والخلف والاخير والاول وكذلك يا حبذا لو قمت باغلاق زر خروج ايضا
هكذا اصبح الامر جديد جاهز للعمل , طبعا ستسالون ماذا يحدث الان ؟ ساقول بعد ان قام المستخدم بضغط زر جديد سيقوم بادخال البيانات الى البرنامج
وبعد ان ينتهي من الادخال سيقوم بضغط زر حفظ مالذي سيحدث في زر حفظ؟
زر حفظ:
يوجد امر واحد في زر حفظ والذي يقوم بادخال النصوص الى قاعده البيانات ( في الحقيقه هي تكون دخلت القاعده فعلا ولكن هذذا السطر اجراء روتيني فقط)
لكن كما قلنا نريد حمايه البيانتات وكذلك منع المستخدم من الحركات الاكروباتيه التي يقوم بها والتي من شانها افساد البرنامج اذن مالذي نضيفه هنا؟
طبعا بعد سطر
Data1.recordset.update
سنقوم باضافه السطور التي تلغي السطور في زر جديد
بالنسبه لصناديق النص نقوم باضافه سطور تغلق الصندوق فلا يتمكن المستخدم من ادخال النص بها كالاتي
Text1.enabled = false
Text2.enabled = false
……………………
الخ
مش ده وبس لازم نرجع الزراير اللي احنا فتحناها زي الاول
كود:
Command1.enabled = true Command2.enabled = false ' بنقفله لاننا مش محتاجينه وزي ماكان الاول قبل ما ندوس جديد
والباقي زي منتو عارفين
ده بالنسبه لموضوع المحافظه على البرنامج من عبث المستاخدم
لكن في طرق بتطلع البرناتمج بشكل شيك وفي نفس الوقت بتحمي قاعده البيانات من انها تكون فيها سطور فاضيه ازاي:
لو المستخدم مدخلش اي بيانات في الحقول هتتحفظ على قاعده البيانات في حقل فاضي وواخد مساحه على الفاضي حلها ايه؟ اننا نعمله تحديد للحقول اللي لازم تكون مليانه على الاقل لان ممكن البيانات تكون ناقصه في بيان او اتنين مش مهمين زي اجنده التليفون ممكن تكون فيها 5 نمر تليفون فلازم واحد يكون مليان على الاقل والباقي لا كمان الاسم لازم يكون محطوط والا مش هيكون هناك اي لازمه للي بنعمله بقى طيب ايه الحل ؟ اضيفو السطور دي واللي معموله بقاعده if
كود:
If text1.text = "" and text2.text = "" then Msgbox لايوجد بيانات في الحقول الاساسيه برجاء ادخل بيانات"" Exit sub End if
نقوم بوضع تللك السطور في بدايه الاجراء وذلك منعا لتنفيذ اي سطر ثم الخروج منه والذي يقوم بالخروج من الاجراء الفرعي بدون احداث اضرار
يعتبر زر جديد قد انتهى ولكن سنضيف اليه المزيد من القوه في دروس لاحقه
زر مسح :
قد لايكون المستخدم راغبا في مسح الشخص الذي يقوم بمسحه , ربما اخطاء او قام الشيطان بايعازه بذلك لوجود خلافات هنا ياتي دورنا لتنبيهه بان مايقوم به خطاء فلا يجب ان يستسلم لضعفه او غفلته لذا يجب عمل الاتي :
بقاعده if سنقوم بتنبيهه الى ما يحدث كالاتي:
كود:
dim x as string x = msgbox (""هل انت متاكد من انك تريد مسح البيانات ؟, vbyesno( if x= vbyes then data1.recordset.delet data1.refresh else exit sub end if
في السطور السابقه قمنا باخبار المستخدم بالتاكيد عليه قبل القيام بالمسح كي يككون متاكد بانه بصدد مايريد فعلا
هذا كل ما يتعلق بزر مسح حاليا في المستقبل سنقوم باضافه قوه اكبر له>ا الزر ولرساله التاكيد بالتحديد
زر بحث
لايوجد ما يستجد
زر امام
كان الكود على هذه الهيئه
Data1.recordset.movenext
ولكن ماذا لو وصل المؤشر الى نهايه القاعده ولم يجد شئ .؟ نعم رساله ايرور سيئه تظهر ولا نستطيع ايقافها لذا هناك الحل السحري لهذا القصور لانه لاشئ كامل الا الله سبحانه وتعالى لذا ابتكر المبرمجون سطرا اذا كتبناه يبقى البرنامج يعمل رغم وجود خطاء ولكنت ينصح بعدم استعماله بطكثره والا كانت عواقبه وخيمه هذا السطر هو
On error resume next
يقوم المبرمج هنا باخبار البرنام انه في حاله وقوع خطاء فقم بتنفيذ السطر التالي وقم باهمال السطر الذي يحوي الخطاء
قم باضافه السطر الى كل من الازرار امام خلف واول واخر
وشاهد النتيجه قبل وبعد في حاله خلو قاعده البياناتن من اي بيان وفي حاله امتلائها باي بيانات ولا حظ الفرق
هنحط في المشروع بتاعنا حاجه اسمها داتا بوند جريد ودي وظيفتها انها تعرض كل البياتنات من قاعده البيانات اللي عندنا
وهنعمل عليها بحث بطريقه لذيذه موت هتعجبكم كلكم انشاء الله
في البدايه هنضيف فورم جديد للمشروع (طبعا الكمل عارف ازاي يضيف فورم جديد) بعديها هنروح في الفورم الرئيسي بتاع المشروع ونحط زرار ونسميه عرض الكل
في شاشه الكود بتاع الزرار الجديد ده هنكتب الكود ده
كود:
Form1.hide Form2.show
طبعا نيجي على الفورم الجديد ونفتح components من قائمه project هندور على الكائن اللي اسمه
Microsoft data bound grid control
بعد ما نعلم عليها وندوس موافق هنلاقيها اتنقلت لصندوق الادوات هناخدها منه ونحطها على الفورمه التانيه ونحط معاها واحد داتا كنترول وواحد صندوق نص واتنين خيارات (option) ونعملها زي الشكل ده بالظبط:
بعد ما حطينا الاشكال هنبدا نربط الداتا كنترول بقاعده البيانات وبالجدول اللي جوه ونربط الدتا بوند جريد بالداتا كنترول وبس على كده هنحط الكود بتاعنا زي ما هنشوف دلوقتي
هنيجي على التكست بوكس ونكتب في الحدث change الكود ده
كود:
Dim x As String If Option1.Value = True Then x = Text1.Text+ "*" Data1.RecordSource = "select * from tel where name like '" + x+ "'" Data1.Refresh DBGrid1.Refresh elseIf Option2.Value = True Then x = Text1.Text+ "*" Data1.RecordSource = "select * from tel where h_phon like '" + x + "'" Data1.Refresh DBGrid1.Refresh End If
ا
لشرح:
طبعا اول عباره اللي هي (dim x as string) دي هنعمل مخزن حرفي في الذاكره ونحط في اي متغير يصادفنا في الاجراء سواء كان المستخدم هيختار انه يدور في حقل الا سم بس او في خانه الرقم بس واللي حاكمنا في الموضوع ده قاعده if اللي بتشوف المستخدم مختار اي واحده من الخيارات اللي قدامه وبيعمل بحث في قاعده البليانات اللي متربط معاها
هنيجي للجزئ الاول من الكلام ومناه لو المستخدم اختار الاختيار رقم 1 فروحي ياداتا كنترول دوري في القاعده بتاعتنا على الجدول tel ومنه طلعلينا من جدول name كل الاسماء اللي شبه x واللي دخله المستخدم , العباره المستخدمه زي ماكلنا عارفين جزئء من لغه الاستعلام بتاعه ميكروسوفت محطوت في الفيجوال بيسك علشان تسهل الاستعلام , اما المعامل الجديد اللي اضفناه النهارده فهو المعامل like واللي بيطلع من القاعده البيانات اللي فيها شبه من البيانات اللي دخلها المستخدم يعني لو بتعمل بحث على محمود ومحمد هتكتب في بعد المعامل كلمه ( محم) وهو هيجيبلك كل اللي اسمهم محمد واللي اسمهم محمود برضه اللي بيدور على ياسر وياسين هيكتب بعد المعامل (ياس) وهو هيجيب كل اللي زيه .
طبعا الشرح فوق بيجيب من القاعده من الجدول تيل من العمود بتاع الاسماء الجمله اللي بعدها بتجيب من العمودج بتاع ارقام التليفونات بس يعني لو انت فاكر الرقم بتاع واحد ومش فاكر اسمه ممكن تطلعها بسهوله من غير متتعب نفسك وتقعد تدور في الاسم والرقم والكلام الفاضي ده
في نقطه اخيره , في عباره استخدمناها هنا اللي هي ( x = text1.text + "*" ) العباره دي ممكن تثير المشاكل والتساؤل حولها الكل هيقول ايه فايدتها
هقول ان فايدتها بينحصر فقط لو اتكتب الاجراء كله في الحدث text1_change غير كده ملوش اي لازمه وهو بيعمل ا لاتي لما قلنا للبرنامج احجز متغير اسمه x قام حاجزه , رجعنا قلناله المخزن ده حط فيه قيمه اللي المستخدم هيكتبه جوه صندوق النص وكمل الكلمه بالباقي (*) وطبعا اللي اذكياء قالو ان الاجراء هيتنفذ كل مالامستخدم يدوس على حرف القيمه تتغير جوه المخزن ويروح يجيبها من جوه القاعده ويعرضها في الجدول وهكذا لحد ما تكمل بالكامل وتبقى تمام
في بقى اضافه اخيره على الموضوع العباره ( x= txt1.text + "*" ) دي بنستخدمها لما نكون عايزين نجيب اول حرف من الكلمه فقط يعني من الاخر هيجيب الاسماء اللي بتبداء بالحروف اللي كتبناها في صندوق النص اما لو كانت كلمه في نص البيان زي اسم ثلاثي وعايز اجيب كلمه من النص هكتب الاتي( x="*" + text1.text + "*" ) اما لو عايز اجيب اخر حرف في الكلمه اللي قدامي هكتب (x= "*" + text1.text ) طبعا اخر واحد دي ملهاش استخدامات كتير لكن اكيد في يوم من الايام هنحتاجها جربوها ولو على سبيل الفم بالشئ مش اكتر.