download
download
download
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
اعداد خالد الجديع kal_judaia@hotmail.com<br />
مقدمة عامة عن بيئة الدوت نت<br />
أولا :<br />
البيئة المتصلة<br />
: تعريفها •<br />
•<br />
البيئة المتصلة<br />
هي<br />
بمصدر البيانات طوال فترة التعامل مع البيانات.<br />
: عليها أمثلة<br />
البيئة التي يكون فيها المستخدم متصلا باستمرار<br />
أحد الأمثلة هي أن يكون هناك نظام شؤون موظفين يكون فيه المستفيد<br />
على اتصال مباشر بقواعد البيانات<br />
.<br />
: فوائدها •<br />
-١<br />
تحكم أقوى بالعمل الجماعي :<br />
لأن المستفيد في البيئة المتصلة حين يقوم بتحديث<br />
بيانات فإنه يتم إغلاق عملية التحديث لهذه البيانات حتى ينتهي هذا المستفيد من تحديث البيانات و<br />
تتم عملية إغلاق التحديث للمستفيدين الآخرين لكيلا يحدث تعارض في تحديث البيانات.<br />
عملية<br />
إغلاق السجلات هي عملية يستطيع مدير قواعد البيانات أو المطور التحكم بها فقد<br />
يكون إغلاق السجلات على مستوى الصف أو على مستوى الجدول أو قد يكون عند تحرير<br />
الحقول أو عند تحديثها فقط<br />
.<br />
-٢<br />
البيانات الأخيرة<br />
حداثة أكثر في البيانات :<br />
وذلك<br />
ما لم يكن هناك تحديث لها في فترة الاسترجاع،<br />
الاسترجاع أثناء فترة التحديث وهو ما سيتم شرحه لاحقا.<br />
• عيوبها :<br />
١- وجوب وجود شبكة اتصال دائم :<br />
أنك حين تسترجع البيانات فإن هذه البيانات هي<br />
مع العلم أنه يمكن منع<br />
نظرا لأن قناة الاتصال بقواعد البيانات مفتوحة<br />
فلا بد من وجود شبكة اتصال دائمة بقواعد البيانات وهو ما لا يتوفر في كل الأحيان.<br />
البيانات،<br />
٢- ضعف في التوسع و الامتداد<br />
:<br />
كل مستخدم في البيئة المتصلة له اتصال مع قواعد<br />
لا يمكن لأي مستخدمين أن يشتركا في نفس الاتصال مما يعني أنه مع زيادة عدد<br />
المستفيدين يجب علينا زيادة الاتصالات طردا وهو ما يجعل العملية شبه مستحيلة لحالة مثل<br />
موقع على الانترنت يرتاده مئات الألوف كل يوم.<br />
2
اعداد خالد الجديع kal_judaia@hotmail.com<br />
المنفصلة البيئة ثانيا :<br />
• تعريفها :<br />
•<br />
•<br />
يمكن تعريف هذه البيئة بأنها<br />
مصدر البيانات و تعديلها<br />
إلى مصدر البيانات.<br />
البيانات.<br />
أمثلة عليها :<br />
في<br />
بعيدا عن قواعد البيانات<br />
مجموعة من البيانات يتم نسخها<br />
ومن ثم<br />
من<br />
إرجاع هذه التعديلات<br />
هذه البيئة لا توجد قناة اتصال مفتوحة مع قواعد<br />
المواقع التجارية في الانترنت مثل موقع يبيع منتجات ما فإنك<br />
عند تصفح أحد المنتجات لا تقوم بإغلاق عملية الشراء عن أي متصفح<br />
فقد يتم شراء المنتج الذي تقوم بتصفحه من قبل متصفح آخر.<br />
فوائدها<br />
: يمكن ذكر فائدتين للبيئة المتصلة وهما<br />
١- إمكانية اشتراك أكثر من مستخدم بنفس الاتصال :<br />
:<br />
لذا آخر،<br />
نظرا لأن المستخدم يقوم بالاتصال ثم<br />
نسخ البيانات ثم قطع الاتصال فإن فترة وجود الاتصال مع المستخدم فترة ضئيلة جدا،<br />
يمكن أن يستفيد مستخدم آخر من نفس الاتصال بعد أن ينتهي منه المستخدم الأول.<br />
٢- أداء عالي و قابل للتوسع بشكل كبير مقارنة بالبيئة المتصلة :<br />
يحجز الاتصال فإن عدد المستخدمين حين يزيد فإننا قد<br />
أحواض الاتصال<br />
–<br />
كبيرة من الاتصالات.<br />
لذا<br />
نظرا لأن المستخدم لا<br />
نستخدم بعض التقنيات مثل تقنية<br />
سيأتي لها الكلام في فصل الاتصال بقواعد البيانات- وهو ما يوفر أعدادا<br />
عيوبها :<br />
-٢<br />
١- عدم حداثة البيانات : لو رجعنا إلى مثال المتصفح الذي يريد شراء<br />
منتج من الانترنت لوجدنا أن البيانات التي توجد عنده غير البيانات الحقيقة،<br />
بمعنى أن رصيد الكتب مثلا الموجود أمامه غير الرصيد الحقيقي لأنه قد قام عدة<br />
متصفحين بشراء نفس الكتاب أثناء تصفحه له.<br />
التضارب :<br />
إمكانية حدوث تضارب عند تحديث البيانات وهو ما يتطلب حل هذا<br />
وهو ما يتضح بالمثال فلو افترضنا أن هناك برنامجا لشؤون<br />
الموظفين و أنا أقوم بتحديث عمر الموظف و صادف أن كان هناك موظف<br />
•<br />
3
اعداد خالد الجديع kal_judaia@hotmail.com<br />
غيري يقوم بتحديث بيان العمر لنفس الموظف فإن<br />
تضاربا في التحديث يتطلب حلا وهو ما ستعرف كيف تقوم به.<br />
هذا الشيء سوف يحدث<br />
نظرا لأن البيئة غير متصلة فلا يوجد أي قفل على البيانات في قواعد البيانات،<br />
فالتضارب وارد بشكل كبير.<br />
لذا<br />
نماذج الوصول إلى قواعد البيانات :<br />
.A<br />
يوجد أربعة نماذج أساسية للوصول إلى قواعد البيانات، هذه النماذج لا تعتمد على بيئة أو لغة<br />
معينة إنما هي نماذج عامة.<br />
نموذج الطبقة الواحدة :<br />
١- مثال عليه<br />
:<br />
يحوي كل أجزاء النظام.<br />
:<br />
يمكن تمثيل هذا النموذج بمستفيد يعمل على جهاز واحد فيه برنامج<br />
٢-مزاياه نظرا لأن كل شيء في نفس المكان لا توجد أي صعوبات في الوصول<br />
إلى كل جزء من أجزاء النظام.<br />
٣-العيوب :<br />
عند تعديل أي جزء من النظام يجب إعادة توزيع التعديلات على كل<br />
مستفيد.<br />
ولعلنا عند ذكر طبقات النظام نعطي تقسيما أوليا لثلاث طبقات شهيرة :<br />
الطبقة<br />
طبقة واجهة المستفيد<br />
طبقة قواعد العمل<br />
طبقة الوصول للبيانات<br />
الشرح<br />
تحوي هذه الطبقة واجهة المستفيد مثل أزرار الأمر و مربعات النص<br />
وقد تحتوي هذه الطبقات على بعض التدقيقات التي لا تحتاج الوصول<br />
إلى قواعد البيانات مثل تدقيق أقصى طول لحقل ما أو تدقيق أن تاريخ<br />
الميلاد يمثل تاريخا صحيحا.<br />
تحتوي هذه الطبقة الوظائف التي تطبق قواعد العمل مثل الوظيفة التي<br />
تدقق استحقاق موظف ما لإجازة من عدمه.<br />
هذه الطبقة هي التي تقوم بالاتصال بقواعد البيانات و عمل التحديثات<br />
عليها.<br />
4
اعداد خالد الجديع kal_judaia@hotmail.com<br />
.B<br />
نموذج الطبقتين<br />
•<br />
فكرة النموذج :<br />
.I<br />
.II<br />
.III<br />
فكرة هذا النموذج تتمثل في أحد الخيارات الثلاثة :<br />
إما اجتماع طبقة واجهة المستفيد و طبقة قواعد العمل مع بعضيهما ومن ثم<br />
تكون الطبقة الثانية هي طبقة البيانات.<br />
أو اجتماع طبقة البيانات مع طبقة قواعد العمل.<br />
أو توزيع طبقة قواعد العمل بين طبقة واجهة المستفيد و طبقة البيانات.<br />
مثاله :<br />
المزايا :<br />
من أمثلة هذا النموذج ما يسمى بالخادم/المستفيد.<br />
يمكن القول بأن أبرز مميزات هذا النموذج هي<br />
الفصل<br />
الجزئي لوظائف<br />
•<br />
•<br />
النظام.<br />
• العيوب :<br />
١- صعوبة التوسع المستقبلي للخلط بين طبقتي قواعد البيانات و واجهة المستفيد وهو<br />
ما يسمى بالمستخدم المتضخم<br />
.“Fat Client”<br />
٢- صعوبة الصيانة المستقبلية وذلك عند تعديل أي جزء من أجزاء النظام فإن ذلك<br />
يتطلب إعادة توزيع النظام على كل المستخدمين وهو ما يكون مكلفا عندما يكثر<br />
عدد المستخدمين.<br />
٣- اختلاط<br />
أجزاء النظام بعضها ببعض مما يعني صعوبة<br />
لتبعثر قواعد العمل في أماكن مختلفة.<br />
C.نموذج الطبقات الثلاث :<br />
•<br />
فكرة النموذج :<br />
إجراء تعديلات على النظام<br />
يمكن تمثيل هذا النموذج بأنه النموذج الذي ينقسم إلى ثلاث<br />
: طبقات وهي<br />
طبقة واجهة المستفيد<br />
طبقة البيانات انظر الشكل (١-١)<br />
،<br />
.<br />
طبقة قواعد العمل،<br />
5
اعداد خالد الجديع kal_judaia@hotmail.com<br />
المزايا<br />
العيوب<br />
:<br />
سهولة الصيانة ولو كانت واجهة المستفيد Web لكانت تكلفة صيانة<br />
أجهزة المستفيد<br />
= صفر.<br />
:<br />
قد تبرز تكاليف جديدة مثل تكاليف خادم البيانات.<br />
•<br />
•<br />
-١ ١ : شكل<br />
نموذج الطبقات الثلاث<br />
طبقة طبقة واجهة ولجهة المستفيد المستفيد<br />
طبقة البيانات<br />
طبقة قواعد العمل<br />
.D<br />
•<br />
•<br />
نموذج الطبقات المتعددة<br />
فكرة النموذج :<br />
: المزايا<br />
•<br />
يمكن تمثيل هذا النموذج بأكثر من ثلاث طبقات حسب احتياج كل<br />
منشأة يمكن أن يكون هناك طبقة رابعة مثل طبقة للتعامل مع الأمن و إعطاء<br />
تصاريح الدخول للنظام وغير ذلك حسب الحاجة.<br />
تجعل من السهولة الامتداد و اتصال مجموعة من التطبيقات على أنظمة تشغيل مختلفة.<br />
: العيوب<br />
-١<br />
عيوب أمنية لاتصال عدة أجهزة ببعضها البعض.<br />
٢- صعوبة التطوير و التنفيذ وذلك لازدياد عدد الطبقات وهو ما ينشئ تعقيدا في التطوير و<br />
التنفيذ.<br />
6
اعداد خالد الجديع kal_judaia@hotmail.com<br />
بيئة الدوت نت<br />
WinForms) (CLR, FCL, ASP, انظر الشكل .(٢-١)<br />
.vs.net,office،win.net<br />
يمكن تقسيمها إلى ثلاثة عناصر :<br />
١- إطار العمل و يشمل<br />
٢- منتجات مثل<br />
٣- خدمات منتجة من قبل أي جهة.<br />
١- إطار العمل<br />
يعتبر إطار العمل قلب بيئة الدوت نت لذلك لابد من تهيئة إطار العمل في أي جهاز سوف<br />
يعمل عليه تطبيق صمم في بيئة الدوت نت. يمكن إنزال إطار العمل مجانا من موقع<br />
مايكروسوفت. يمكن تقسيم إطار العمل إلى قسمين أساسيين هما :<br />
Common Language Runtime<br />
Common Language Specification<br />
التشغيل المشترك للغات<br />
المواصفات المشتركة للغات<br />
.I<br />
.II<br />
شكل ٢-١ :<br />
إطار العمل في بيئة الدوت نت<br />
ASP.NET<br />
Windows Forms<br />
Web Services Web Forms Controls Drawing<br />
The The .NET Class Library<br />
ADO.NET IO XML Threading Security<br />
Common Language Runtime<br />
Type System Metadata Execution<br />
Windows API<br />
API<br />
COM+ Services<br />
7
اعداد خالد الجديع kal_judaia@hotmail.com<br />
.I<br />
التشغيل المشترك للغات<br />
(CLR)<br />
يمثل أحد الأجزاء الأساسية لنطاق العمل في الدوت نت ويمكن وصفه بأنه مكينة تنفيذ الكود<br />
بالإضافة إلى كونه يقدم خدمات تجعل التطوير أسهل. هذه الخدمات متوفرة لأي لغة تطور<br />
بناء على المواصفات المشتركة للغات CLS وهو ما يعني أن CLR يستطيع استضافة لغات<br />
البرمجة المختلفة. وقد تم إضافة أكثر من عشرين لغة إلى<br />
CLR<br />
VB,C#,C++,Delphi,COBOL<br />
ويجري تطوير الكثير من اللغات لتضاف إلى<br />
وهو ما يجعل بيئة الدوت نت بيئة غير معتمدة على لغة برمجة ما.<br />
يقدم عدد كبير من الفوائد للمطورين منها<br />
منها<br />
CLR<br />
:<br />
:<br />
(١<br />
(٢<br />
(٣<br />
(٤<br />
(٥<br />
الأمن.<br />
متابعة الكود<br />
– Debugging–<br />
تستطيع القفز أثناء المتابعة من كود إلى آخر حتى<br />
لو كانا مكتوبان بلغات مختلفة.<br />
دعم أقوى للإصدارات المتعددة وهو ما أنهى مشكلة ما يسمى ب<br />
إدارة الذاكرة و تجميع النفايات<br />
إدارة<br />
.DLL Hell<br />
.<br />
.Thread<br />
.II<br />
المواصفات المشتركة للغات<br />
CLS<br />
يعرف CLS معيارا قياسيا لأنواع البيانات لجميع لغات CLR وهو مايعني أن كل لغات<br />
CLS سوف يكون لها نفس الحجم للأنواع الصحيحة و الطويلة<br />
هذا المعيار يعني تعاونا أكثر بين اللغات<br />
-Integers,Long–<br />
،<br />
سوف يكون بإمكانك إرسال مرجع إلى فئة من<br />
كائن إلى آخر حتى لو كانا مكتوبين بلغات مختلفة. كل لغة لا تطبق هذه المعايير لن تستفيد<br />
من الخدمات التي تقدم من قبل .CLR يمكن تلخيص هذه المواصفات بالنقاط التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
أنواع بيانات قياسية.<br />
مصفوفات قياسية<br />
معالجة هيكلية للأخطاء.<br />
– كل فهارس المصفوفات لابد أن يبدأ من صفر-.<br />
٤- طرق الوصول إلى الأنظمة التطبيقية الخاصة بإطار العمل.<br />
8
اعداد خالد الجديع kal_judaia@hotmail.com<br />
مع العلم أن اللغات المستضافة في بيئة الدوت نت لها الحق في زيادة مميزات أخرى لكن هذه<br />
المميزات لن تستطيع الوصول إلى كائنات الدوت نت.<br />
الكود<br />
المدار و الكود غير<br />
المدار<br />
الكود المطور بلغة موافقة ل CLS يسمى كود مدار<br />
أما الكود الذي يعتمد على تقنية<br />
–Managed Code<br />
COM أو<br />
WIN32 API يسمى كود غير مدار<br />
لذا يمكن القول بأن فيجوال بيسك ٦ كود غير مدار بنسبة مائة بالمائة و على النقيض منه<br />
الكود في بيئة الدوت نت هو كود مدار بنسبة مائة بالمائة.<br />
المدار لن يستفيد من الخدمات المقدمة من قبل .CLR<br />
لذا يمكن القول بأن الكود غير<br />
اللغة الوسطية لميكروسوفت<br />
MSIL<br />
–<br />
عندما تقوم بإنتاج الكود<br />
-Compile–<br />
. -Native code<br />
a. لغة وسطية<br />
في بيئة الدوت نت فإنه لا يتم تأليفه إلى كود أولي<br />
يقوم مؤلف الدوت نت بإنشاء ملف يحوي التالي<br />
b. بيانات واصفة<br />
:<br />
:<br />
:Metadata<br />
.IL<br />
وتحوي معلومات مثل<br />
١- معلومات عن جميع الأنواع التي استخدمتها.<br />
٢- معلومات عن كل أنواع الدوال.<br />
٣- الدوال التي توجد لها مرجعية في كودك.<br />
وغيرها من البيانات التي يحتاجها CLR في البيئة التشغيلية انظر الشكل<br />
(٣-١)<br />
9
اعداد خالد الجديع kal_judaia@hotmail.com<br />
شكل -١ ٣ :<br />
أسلوب إنتاج الكود في بيئة الدوت نت<br />
الانتاج<br />
Source<br />
Code<br />
Language<br />
Compiler<br />
Code (IL)<br />
Assembly<br />
Metadata<br />
Native<br />
Code<br />
JIT<br />
Compiler<br />
استدعاء النظام لأول مرة عند<br />
التنفيذ<br />
نظرا لأن الملف المؤلف في بيئة الدوت نت يحتوي على الشيئين السابقين فإنه يعتبر ملفا<br />
موضحا لمحتواه لذا فلا يوجد أي حاجة بعد اليوم لمكتبات الأنواع<br />
إلى ملفات IDL كما لا توجد حاجة لتعريفات في الريجستري.<br />
Type Library ولا<br />
•<br />
المؤلف في الوقت المحدد JIT<br />
بالطبع فإن ملف IL لا يدوم كما هو لأن IL يعتبر ملف يعتمد على نظام التشغيل فإنه عند<br />
تشغيل هذا الملف يتم تأليفه إلى كود أولي. تتم عملية التأليف بواسطة أداة من أدوات نطاق<br />
العمل تسمى المؤلف في الوقت المحدد انظر الشكل السابق.<br />
أسماء الامتدادات<br />
NameSpaces<br />
يقسم إطار العمل في بيئة الدوت نت الوظائف إلى امتدادات منطقية. الهدف من هذا التقسيم هو<br />
ترتيب وتنظيم الوظائف<br />
،<br />
هذه الامتدادات موزعه على أشكال هرميه تسمى<br />
NameSpaces أو<br />
أسماء الامتدادات. على سبيل المثال، كلّ الوظائف التي تعمل مع نظام الملفات ّ ت ُجمع في المجموعة<br />
.(System.IO)<br />
10
اعداد خالد الجديع kal_judaia@hotmail.com<br />
طرق إضافة مرجع إلى فضاءات الأسماء<br />
يوجد هناك طريقتان أساسيتان لإضافة مرجع إلى فضاءات الأسماء ما وهما :<br />
١- إضافة عبارة Imports من محرر الكود مباشرة: عندما تقوم بإضافة مرجع إلى فضاءات<br />
أسماء ما عن طريق عبارة Imports فإنك تستطيع استخدام كل الوظائف في ذلك الفضاء الاسمي<br />
مباشرة ودون الحاجة إلى كتابة الاسم الكامل، و لعلنا نأخذ المثال التالي<br />
من الكود السابق نلاحظ ما يلي<br />
–<br />
أرجوا أن تهتم بالفكرة و ليس بالمحتوى-<br />
:<br />
.I<br />
.II<br />
.III<br />
في بداية الكود أضفنا مرجع إلى فضاء اسم<br />
System.Convert<br />
ثم قمنا بمكان آخر باستخدام الدالة ToInt32 و التي تنتمي إلى فضاء الاسم<br />
، System.Convert<br />
لذلك قمنا بكتابة اسم الدالة مباشرة.<br />
لو لم نضف مرجع إلى فضاء الاسم System.Convert لوجب عليك عند<br />
استخدام الدالة ToInt32 أن تكتب الاسم كاملا وهو :<br />
System.convert.ToInt32<br />
جملة.<br />
عند<br />
إضافة مرجع إلى<br />
فضاء الاسم ما لابد من وضع جملة الاستيراد في بداية الكود قبل أي<br />
11
اعداد خالد الجديع kal_judaia@hotmail.com<br />
٢-عن طريق مستكشف الحل<br />
مستكشف الحل<br />
:<br />
:<br />
.I<br />
انقر بزر الفأرة الأيمن على مجلد<br />
الحلول كما يظهر من الشكل (١-٤)<br />
اتبع الخطوات التالية لإضافة مرجع عن طريق<br />
Refrences<br />
الموجود في مستكشف<br />
-١ ٤ : شكل<br />
إضافة مرجع<br />
(٥-١)<br />
انقر على<br />
Add Refrence<br />
قم باختيار المرجع الذي تريد.<br />
ليظهر لك الشكل<br />
.II<br />
.III<br />
-١ ٦ : شكل<br />
اختيار المرجع<br />
الجدول التالي يوضح بعض الامتدادات في بيئة الدوت نت و فوائدها<br />
الشرح<br />
الامتداد<br />
System.Collections<br />
System.Data<br />
System.Drawing<br />
System.IO<br />
System.XML<br />
يقدم أنواع المجموعات مثل<br />
queues, linked lists, hash<br />
.sorted lists<br />
يقدم وظائف معالجة قواعد البيانات عند المستفيد.<br />
للوصول إلى الوظائف الخاصة بالرسومات.<br />
معالجة الملفات.<br />
للعمل مع ملفات إكس إم إل<br />
12
خالد الجديع kal_judaia@hotmail.com<br />
مقدمة لبناء تطبيقات الوندوز<br />
قبل أن تبدأ بالتطوير في بيئة الدوت نت عليك بتفحص بيئة التطوير. نعني ببيئة<br />
التطوير كل ما تتعامل معه أثناء تطويرك لبرنامج ما في بيئة الدوت نت. عندما تشغل<br />
بيئة الدوت نت فإن كل ما تراه أمامك هو بيئة التطوير. سوف نحاول جاهدين في هذا<br />
الفصل أن نتعرض لأهم ما تحتاجه أثناء تطوير نظام في بيئة الدوت نت. قد لا نشرح كل<br />
شيء في بيئة التطوير لكن لن نترك شيئا مهما تحتاجه باستمرار إلا و سنتعرض له إما<br />
بالتصريح أو بالتلميح.<br />
طريقة الدخول إلى<br />
Visual Studio.Net<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
انقر فوق زر Start الموجود على شريطا المهام في نظام التشغيل<br />
سوف تظهر لك قائمة اختر<br />
.Windows<br />
.Programs<br />
سوف تظهر لك قائمة فرعية فيها العديد من البرامج.<br />
انقر على القائمة<br />
انقر على<br />
Microsoft Visual Studio.Net<br />
Microsoft Visual Studio كما يظهر في الشكل (٢-١).<br />
٢-١: شكل<br />
تشغيل فيجوال ستوديو دوت نت<br />
15
خالد الجديع kal_judaia@hotmail.com<br />
بعد الدخول على<br />
تلاحظ في الشكل<br />
الصفحة الأولى<br />
برنامج فيجوال ستوديو دوت نت فإن أول ما سيواجهك هو الصفحة الأولى كما<br />
. ٢-٢<br />
-٢ ٢ : شكل<br />
الصفحة الأولى بعد دخول بيئة التطوير<br />
تتكون هذه الصفحة من جزأين هما :<br />
الجزء الأوسط<br />
:<br />
ويحوي نوعين من المعلومات وهي<br />
:<br />
.I<br />
المشاريع الأخيرة التي سبق و عملت عليها و تندرج تحت شريط<br />
كما Projects<br />
أنه يمكنك إنشاء مشروع جديد من هنا أو فتح مشروع سابق كما يظهر من الشكل<br />
.(٣-٢)<br />
-١<br />
٢-٣ شكل<br />
16
خالد الجديع kal_judaia@hotmail.com<br />
البحث في المشاريع: وهي طريقة سريعة للبحث عن مساعدة في جميع المشاريع<br />
المتوفرة لديك كعينة من قبل بيئة الدوت نت كما يظهر من شكل<br />
.(٤-٢)<br />
.II<br />
-٢ ٤ : شكل<br />
البحث في المشاريع<br />
الجزء الأيسر :<br />
تستطيع من<br />
خلاله<br />
زيارة موقع<br />
و ميكروسوفت<br />
الإطلاع على مجموعات<br />
-٢<br />
الأخبار و آخر التحديثات و العديد من الأشياء الأخرى.<br />
الملف الشخصي<br />
My Profile<br />
هو أحد خواص الصفحة الأولى و يمكنك من اختيار بعض الإعدادات التي سوف تستمر<br />
معك في كل المشاريع التي تنشئها في بيئة الدوت نت انظر الشكل<br />
تستطيع عمل أيا مما يلي<br />
.(٥-٢)<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
تغيير أسلوب عرض النماذج من الأسلوب الحديث في الدوت نت إلى أسلوب عرض<br />
النماذج في فيجوال بيسك ٦ إذا أردت أن لا تتغير طريقة عرض النماذج.<br />
حصر المساعدة في بيئة الدوت نت على خيار محدد مثل أن تختار حصر المساعدة في<br />
المواضيع المتعلقة بفيجوال بيسك أو بالمواضيع المتعلقة بلغة سي شارب انظر الشكل<br />
(٥-٢)<br />
فتح آخر مشروع عملت فيه آليا كلما فتحت بيئة الدوت نت.<br />
عرض مربع فتح مشروع أو إنشاء مشروع جديد كلما فتحت بيئة الدوت نت.<br />
17
خالد الجديع kal_judaia@hotmail.com<br />
٥-٢ : شكل<br />
الملف الشخصي<br />
ملاحظة :<br />
تعتبر<br />
اعدادات الملف الشخصي من<br />
الاعدادات الكمالية التي قد لا تحتاج أن ترجع لها<br />
طوال فترة التطوير في بيئة الدوت نت<br />
أنواع المشاريع في بيئة الدوت نت<br />
قبل إنشاء أول مشروع في بيئة الدوت نت يحسن بنا أن نرشدك إلى أنواع المشاريع التي يمكنك<br />
بنائها في بيئة الدوت نت.<br />
نوع المشروع<br />
الشرح<br />
يستخدم لإنشاء تطبيقات.<br />
طريقة لإنشاء مكونات دوت نت لاستخدامها في تطبيقات أخرى.<br />
WindowsApplication<br />
ClassLibrary<br />
لسطح<br />
المكتب مع العلم أنة<br />
لا يوجد لهذا النوع من التطبيقات واجهة<br />
مرئية يتعامل معها المستخدم.<br />
يحوي هذا النوع من التطبيقات<br />
وظائف يمكن استخدامها في باقي أنواع التطبيقات.<br />
تطبيقات تهدف لإنشاء أدوات يمكن استخدامها في تطبيقات وندوز.<br />
فهل فكرت يوما بطريقة بناء أداة مربع النص أو أداة القائمة. هذا<br />
Windows Control<br />
Library<br />
النوع من التطبيقات يمكنك من بناء أدوات ومن ثم استخدامها وقد<br />
18
خالد الجديع kal_judaia@hotmail.com<br />
تتمكن من بيعها إذا كانت أداة ذات قيمة.<br />
Web تطبيقات<br />
و هي التطبيقات التي تعمل من خلال المتصفح.<br />
وأصبح الآن من السهولة بمكان<br />
إنشاء<br />
تطبيقات ترتبط بقواعد<br />
البيانات وكتابة الكود بشكل مساو لسهولة كتابته في تطبيقات وندوز.<br />
خدمات<br />
Web من نوع<br />
.XML<br />
إلى أداء خدمة يكون ناتجها ملف<br />
العملات عبر<br />
الانترنت.<br />
ليعطيك النتيجة على شكل اكس ام ال.<br />
تطبيق مماثل لتطبيقات الدوس<br />
و يهدف هذا النوع من التطبيقات<br />
.XML<br />
مثل خدمة تحويل<br />
فأنت تستدعي هذا النوع من التطبيقات<br />
.DOS<br />
تطبيقات خدمات وندوز و تعمل قبل أن يسجل المستخدم الدخول إلى<br />
وندوز.<br />
وتستطيع إنشاء خدمات وندوز لأداء هدف ما بسهولة وهو<br />
ما كان متعذرا إلا على محترفي البرمجة.<br />
تطبيقات تهدف لإنشاء أدوات يمكن استخدامها في تطبيقات الوب<br />
كما هو الحال في أدوات وندوز<br />
.<br />
ASP.NET Web<br />
Application<br />
ASP.NET Web<br />
Service<br />
Consol Application<br />
Windows Service<br />
Web Control Library<br />
إنشاء مشروع جديد في بيئة الدوت نت<br />
أين تنشأ المشاريع في بيئة الدوت نت وكيف يتم ذلك ؟<br />
من الفرو قات الأساسية بين بيئتي فيجوال بيسك ٦ و بيئة الدوت نت أنه بمجرد ضغطك على زر<br />
موافق عند إنشاء مشروع جديد في بيئة الدوت نت فإن فيجوال ستوديو دوت نت يقوم بإنشاء كل<br />
الملفات و تخزينها في مجلد بالاسم الذي اخترته وفي المكان الذي اخترته.<br />
عند إنشاء مشروع جديد من نوع وندوز يقوم فيجوال ستوديو بإنشاء ما يسمى بالحل، وهو عبارة<br />
عن تطبيق يمكن أن يحوي أكثر من مشروع. داخل هذا الحل يقوم فيجوال ستوديو بإنشاء مشروع<br />
واحد كما يقوم بإنشاء نموذج داخل هذا المشروع.<br />
لإنشاء مشروع قم بالخطوات التالية<br />
:<br />
-١<br />
قم بفتح برنامج فيجوال ستوديو دوت نت.<br />
19
خالد الجديع kal_judaia@hotmail.com<br />
(٧-٢)<br />
من القائمة الرئيسية اختر<br />
File New Project كما هو واضح من الشكل<br />
-٢<br />
-٢ ٧ : شكل<br />
كيف تنشئ مشروع جديد<br />
-٣<br />
سوف يظهر لك الشكل (٢-٨) و الذي ينقسم إلى ثلاثة أجزاء<br />
:<br />
•<br />
•<br />
•<br />
الجزء الأيسر و تستطيع من خلاله تحديد اللغة التي سوف تكتب التطبيق فيها.<br />
الجزء الأيمن و الذي يحوي نوع التطبيق الذي تريد إنشائه<br />
الجزء السفلي و الذي تستطيع من خلاله تحديد اسم المشروع<br />
سوف يخزن فيه<br />
ومن ثم تحديد ما إذا أردت<br />
المفتوح إن وجد أو بدء مشروع جديد.<br />
الذي و المسار<br />
إضافة هذا المشروع إلى المشروع<br />
قم باختيار لغة فيجوال بيسك ثم قم باختيار Windows Application ثم اكتب اسم<br />
المشروع MyFirstApplication ثم انقر على زر موافق<br />
-٢ ٨ : شكل<br />
خيارات إنشاء مشروع جديد<br />
20
وفل<br />
خالد الجديع kal_judaia@hotmail.com<br />
ما الذي حدث ؟<br />
بمجرد ضغط على زر موافق قام فيجوال ستوديو بإنشاء حل مكون من مشروع واحد<br />
اسمه MyFirstAppl هذا المشروع يحتوي على نموذج واحد اسمه<br />
Form1.vb<br />
لاحظ أن امتداد النموذج هو vb وهذا الامتداد يتم إنشاؤه بناء على اللغة التي<br />
اخترت أن تكتب بها التطبيق.<br />
امتداد النماذج سوف يكون CS وهو اختصار<br />
قمت باختيار لغة #C لتكون لغة كتابة التطبيق فإن<br />
.C Sharp<br />
التعرف على مكونات فيجوال ستوديو دوت نت<br />
قبل أن نكمل كتابة أول برنامج يحسن بنا أن نتعرف على بعض المكونات في بيئة<br />
الدوت نت و التي سوف تساعدنا في إنشاء المشاريع في المستقبل إن شاء االله.<br />
نافذة مستكشف الحلول<br />
توجد في الجهة اليمنى في بيئة التطوير و تعتبر الأداة الأساسية للعمل مع الحلول و مع المشاريع<br />
شكل – انظر<br />
- (٩-٢)<br />
وهي أداة مماثلة لنافذة المشروع Project Window التي كانت في<br />
الإصدار السادس غير أنها تحمل إضافات أخرى مثل عرضها للمراجع التي يستخدمها المشروع.<br />
ويعرض متصفح المشاريع كل عناصر برنامجك من مشاريع ومكونات، وما يندرج تحت كل منها<br />
من أعضاء وعناصر، بحيث يمكنك بنقر أي منها مرتين أن تعرضه في مصمم النماذج لو كان<br />
من العناصر التي تعرض واجهة أو فتحه في محرر الكود لو كان ملف ًا نصيا فحسب.<br />
كما يمكنك أن ت ُظهر القائمة الموضعية بضغط زر الفأرة الأيمن فوق أي عنصر، حيث يمكنك<br />
اختيار الأمر "خصائص" ،Properties لتعرض نافذة الخصائص، لتعدل خصائص هذا العنصر<br />
.<br />
وإذا كان المشروع يحتوي على أكثر من نموذج، وتريد أن تجعل أحدها هو أول ما يظهر لك عند<br />
تشغيل البرنامج، فاضغط الأمر "اجعله كائن بدء التشغيل"<br />
الموضعية.<br />
Set As StartUp Object من القائمة<br />
من العناصر التي يمكن أن تجدها في هذه النافذة كل النماذج التي توجد في المشروع فلو<br />
نظرت إلى الشكل(٩-٢) لوجدت أنه لا يوجد لدينا إلا نموذج واحد وهو<br />
Form1.vb الذي<br />
21
خالد الجديع kal_judaia@hotmail.com<br />
قامت بيئة الدوت نت بإنشائه لنا.<br />
خصائصه.<br />
من خلال ايقونات صغيرة تظهر في<br />
عند اختيار أي عنصر في المستكشف تستطيع<br />
قائمة المستكشف.<br />
إظهار<br />
: ٩ شكل٢-<br />
مستكشف الحل<br />
إذا أردت الانتقال إلى أي عنصر في المستكشف يمكنك النقر المزدوج على هذا العنصر.<br />
على سبيل المثال لو كان لديك أكثر من نموذج في نفس المشروع فإنه يمكنك الانتقال من<br />
نموذج إلى آخر بالنقر المزدوج على النموذج الذي ترغب فيه وسوف يظهر أمامك. عند<br />
اختفاء نافذة مستكشف الحلول وتستطيع إظهارها من خلال Ctrl+Alt+L أو القائمة<br />
View Solution Explorer<br />
إضافة عنصر آخر إلى المشروع فإذا كنت تريد إضافة نموذج آخر إلى المشروع<br />
الذي أنشأته. قم بما يلي<br />
:<br />
١-انقر بزر الفأرة الأيمن على اسم المشروع – في مستكشف الحلول- لتظهر لك قائمة<br />
اختر Add سوف تظهر لك قائمة فرعية اختر Add New Item انظر شكل<br />
(١٠-٢)<br />
22
: ١٠ -٢ tmail.com<br />
خالد الجديع شكل إضافة عنصر kal_judaia@ho للمشروع<br />
٢- سوف يظهر لك الشكل (٢-١١) و الذي يحوي عدد من أنواع العناصر التي يمكن أن<br />
تضيفها إلى المشروع. فعلى سبيل المثال تستطيع إضافة نظام تطبيقي إلى المشروع و<br />
HTML إذا احتجت إلى ذلك. ما نريد أن نضيفه إلى مشروعنا هو نموذج من نوع<br />
ويندوز وهو ما يوجد باسم Window Form قم بالتظليل عليه. سوف تلاحظ في الأسفل<br />
مربع نص لاختيار اسم النموذج الذي تريد إضافته. تستطيع تغييره أو تركه كما هو.<br />
اضغط على زر<br />
Open<br />
١١-٢ : شكل<br />
أنواع العناصر التي يمكن إضافتها للمشروع<br />
23
خالد الجديع kal_judaia@hotmail.com<br />
ارجع إلى نافذة مستكشف الحلول لتلاحظ أنه قد أضيف نموذج آخر كما يظهر من<br />
الشكل<br />
.(١٢-٢)<br />
شكل<br />
فإذا أردت التنقل بين النموذجين يمكنك اختيار احد الطريقتين التاليتين<br />
:<br />
: ١٢ -٢<br />
التنقل بين النماذج<br />
.I<br />
.II<br />
النقر المزدوج على النموذج الذي تريد الانتقال إليه من خلال نافذة مستكشف<br />
الحلول.<br />
النقر مرة واحدة على النموذج ثم النقر على عناصر قائمة مستكشف الحلول وهي<br />
View Designer Form كما يظهر من الشكل(١٣-٢)<br />
٢- شكل<br />
بين النماذج<br />
: ١٣ طريقة أخرى للتنقل<br />
إذا أردت أن تحذف عنصرًا باستخدام<br />
يقوم بحذف ملف العنصر من الجهاز نهائيا<br />
،Exclude From Project<br />
، حيث<br />
فإن هذا الأمر لا<br />
تستطيع إعادته للمشروع من جديد. إذا<br />
أردت حذف الملف نهائيًا من المشروع والقرص الصلب استخدم الأمر "حذف"<br />
.Remove<br />
24
خالد الجديع kal_judaia@hotmail.com<br />
صندوق الأدوات<br />
يوجد في الجهة اليسرى في بيئة التطوير و هو المكان الذي يحوي الأدوات المستخدمة في<br />
بناء التطبيقات كما يظهر لك من الشكل<br />
. (١٤-٢)<br />
٢- شكل<br />
١٤:صندوق الأدوات<br />
يوجد ثلاثة طرق لإضافة أداة إلى نموذج ما وهى كما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
ملاحظة<br />
السحب و الإفلات<br />
محيط النموذج.<br />
:<br />
عن طريق النقر المزدوج<br />
:<br />
وهو ما سيضيفها إلى النموذج.<br />
النسخ<br />
و ذلك بسحب الأداة المراد و ضعها في النموذج ومن ثم إفلاتها في<br />
وذلك بالنقر المزدوج على الأداة – انتبه للملاحظة التالية<br />
–<br />
:<br />
:<br />
محرر الكود.<br />
وذلك بنسخ أداة موجودة مسبقا على النموذج ومن ثم لصقها على النموذج.<br />
لإضافة أداة إلى نموذج لابد أن يكون النموذج مفتوحا بشكله التصميمي و ليس بشكل<br />
من الإضافات الجديدة إلى بيئة الدوت نت فيما يختص بصندوق الأدوات هي أنك<br />
تستطيع إضافة مدخل جديد إلى صندوق الأدوات أو حذف أو تعديل و هي إضافة قوية للتحكم<br />
بتنظيم الأدوات انظر الشكل<br />
. (١٦-٢)<br />
25
خالد الجديع kal_judaia@hotmail.com<br />
ولإضافة شريط جديد -Tab– قم بالتالي<br />
:<br />
-١<br />
النقر بزر الفأرة الأيمن على صندوق الأدوات كما يظهر من الشكل<br />
القائمة التي تراها ثم اختر<br />
(٢-١٥) لتظهر لك<br />
Add Tab<br />
١٥-٢ : شكل<br />
إضافة شريط جديد إلى صندوق الأدوات<br />
(١٦-٢)<br />
سوف يفتح لك مكانا لكتابة اسم<br />
الشريط كما يظهر من الشكل<br />
) لاحظ أنني<br />
-٢<br />
(<br />
كتبت This Is New Tab<br />
شكل<br />
ال جديد<br />
: ١٦ -٢<br />
تسمية الشريط<br />
26
خالد الجديع kal_judaia@hotmail.com<br />
ويحتوي صندوق الأدوات على الأشرطة التالية:<br />
تقارير كريستال<br />
:Crystal Reports<br />
وبها الأدوات اللازمة لإنشاء و تصميم التقارير المختلفة. النسخة التي تأتي مع الدوت نت نسخة<br />
محدودة الامكانات.<br />
"قواعد البيانات"<br />
:Data<br />
وتحتوي على الأدوات التي تستخدمُ للاتصال بقواعد البيانات وقراءة وتحديث بياناتها.<br />
"نماذج الويندوز"<br />
:Windows Forms<br />
وتحتوي على الأدوات التي تستخدم مع نماذج الويندوز.<br />
Web Control تعطي<br />
"نماذج الإنترنت"<br />
وهذه الأدوات<br />
:Web Forms<br />
وتحتوي على الأدوات التي تستخدم مع نماذج الإنترنت<br />
سهولة في تصميم تطبيقات الانترنت.<br />
"أدوات :HTML<br />
وتحتوي على الأدوات التي تستخدم مع نماذج الإنترنت.<br />
27
خالد الجديع kal_judaia@hotmail.com<br />
كتابة البرنامج<br />
ملاحظة<br />
التالي<br />
تستطيع كتابة البرنامج من خلال محرر الكود (الشفرات).<br />
أ كيفية الوصول إلى محرر الكود :<br />
للوصول إلى محرر الكود قم بإضافة زر أمر من صندوق الأدوات ثم نفذ أي من الطرق<br />
: الثلاث التالية<br />
:<br />
للتعرف أكثر على هذه الأداة اقرأ الجزء الخاص بخصائص زر الأمر في الفصل<br />
للوصول إلى محرر الكود يوجد ثلاثة طرق<br />
:<br />
النقر المزدوج<br />
الكود.<br />
:<br />
:<br />
عند النقر المزدوج على أي أداة فإن ذلك سوف يقوم بنقلك إلى محرر<br />
من خلال مستكشف الحلول الأيقونة الأولى من مستكشف الحلول تنقلك إلى محرر<br />
الكود كما يظهر من الشكل (٢-١٧) و الأيقونة التي بجانبها تنقلك إلى وضع تصميم<br />
النموذج.<br />
-١<br />
-٢<br />
-٢ ١٧ : شكل<br />
مستكشف الحل<br />
الوصول إلى محرر الكود من خلال<br />
28
خالد الجديع kal_judaia@hotmail.com<br />
النقر بزر الفأرة الأيمن على أي أداة موجودة على النموذج ثم اختيار ViewCode كما<br />
يظهر من شكل<br />
(١٨-٢)<br />
-٣<br />
-٢ ١٨ : شكل<br />
الوصول إلى محرر الكود من النموذج<br />
بعد الانتقال إلى محرر الكود أنظر الشكل<br />
(٢-١٩) وهو ما يمثل واجهة محرر الكود.<br />
شكل<br />
للرجوع إلى<br />
واجهة تصميم<br />
النموذج<br />
١٩-٢<br />
الكود المنتج من<br />
قبل فيجوال<br />
ستوديو<br />
29
خالد الجديع kal_judaia@hotmail.com<br />
ب <br />
مميزات محرر الكود في بيئة الدوت نت :<br />
توجد عدة مميزات لمحرر الكود في بيئة الدوت نت يجدر بك معرفتها لأنها تسهل<br />
:<br />
العمل أثناء عملية البرمجة،<br />
سوف نتعرض<br />
لخمس ميزات<br />
منها<br />
نمط الاختيار المربع<br />
: ويمكنك من التظليل الدقيق لما تريد من كود،<br />
و يحصل عند<br />
.I<br />
(٢٠-٢)<br />
ضغط زر<br />
alt و تحريك الفأرة لأسفل انظر الشكل<br />
التحرير الذكي<br />
: حيث تقوم بيئة الدوت نت بترتيب الكود الذي تكتبه ترتيبا يسهل<br />
.II<br />
عرضه و<br />
قراءته مثل ترتيب جمل الشرط و جمل<br />
التكرار.<br />
لن تحتاج بعد اليوم إلى<br />
البحث عن جملة If وجملة Else if<br />
لوضعهما بوضع متوازي فسوف تقوم بيئة<br />
الدوت نت بعمل ذلك نيابة عنك.<br />
select case,if,do<br />
إكمال مثل الجمل إكمال :<br />
تركيب الجمل المشهورة مثل<br />
.III<br />
وغيرها.و لن تحتاج بعد اليوم إلى حفظ صيغة جملة Select Case<br />
If أو جملة<br />
فبمجرد ما تكتب جملة<br />
If ثم الشرط ثم تقوم<br />
بضغط زر<br />
Enter سوف تقوم الدوت<br />
نت بإكمال الجملة نيابة عنك.<br />
Edit Advance Word Wrapping<br />
تجزئ الجمل :<br />
من خلال<br />
.IV<br />
عند إعمال هذه المميزة سوف تقوم الدوت نت بتقسيم الأسطر الطويلة إلى سطرين أو<br />
أكثر لتسهل عملية قراءة الكود.<br />
: ترقيم الأسطر<br />
تتيح لك هذه الميزة الترقيم الآلي لأسطر الكود.<br />
Tool – Option – Text Editor - General – All Language – Line Numbers<br />
.V<br />
٢٠-٢ : شكل<br />
طريقة دقيقة لتظليل الكود<br />
30
خالد الجديع kal_judaia@hotmail.com<br />
الخصائص<br />
Properties<br />
تتميز كل أداة في بيئة الدوت نت بمجموعة من الخصائص.<br />
أنها<br />
ما<br />
يمكن أن<br />
يتميز به الكائن من مواصفات مثل الطول، العرض، اللون<br />
قد يتشابه بعضها بين أداتين مختلفتين وهو<br />
على<br />
الخصائص تعرف<br />
...الخ.<br />
ما يتكرر كثيرا و قد تتميز كل<br />
أكثر لا توجد إلا فيها. يوجد طريقتين لتعيين خاصية لأداة ما هما<br />
ملاحظة<br />
:<br />
-١<br />
-٢<br />
:<br />
إعطاء هذه الخاصية أثناء وقت التصميم.<br />
إعطاء هذه الخاصية أثناء وقت التشغيل.<br />
وهذه الخصائص<br />
أداة بخاصية أو<br />
يوجد فصل كامل يتكلم عن خصائص الأدوات و القيم التي تأخذها و شرح كل قيمة و<br />
مثال تطبيقي عليها. يجدر بك مراجعة هذا الفصل و التمرن عليه جيدا<br />
أ كيف تعين خصائص أداة<br />
توجد نافذة تسمى نافذة الخصائص انظر شكل<br />
(٢٢-٢) Window– -Propherty وتوجد<br />
عادة في الجهة اليمنى لبيئة التطوير، وهدف هذه النافذة هي تعيين خصائص الأدوات. يوجد<br />
عدة طرق للوصول إلى هذه النافذة<br />
:<br />
-١<br />
النقر بزر الفأرة الأيمن على أي أداة موجودة على النموذج ثم اختيار<br />
يظهر من الشكل<br />
Properties كما<br />
(٢١-٢)<br />
-٢ ٢١ : شكل<br />
الوصول إلى خصائص أداة ما<br />
31
خالد الجديع kal_judaia@hotmail.com<br />
الطريقة الثانية للوصول إلى نافذة الخصائص أن تقوم باختيار التالي من القائمة الرئيسية<br />
View Property Window<br />
-٢<br />
شكل ٢٢-٢ :<br />
قائمة الأدوات قائمة الأدوات<br />
خيارات عرض الخصائص<br />
خيارات عرض الخصائص<br />
أقسام نافذة الخصائص<br />
لاحظ وجود خصائص فرعية<br />
لخاصية الخط<br />
٣- الضغط على زر F4.<br />
ب طرق عرض ترتيب الخصائص<br />
:<br />
يوجد هناك طريقتين أساسيتين لعرض ترتيب الخصائص في نافذة الخصائص<br />
:<br />
.i<br />
.ii<br />
الترتيب الألف بائي<br />
:<br />
وهو ترتيب الخصائص حسب الحروف الأبجدية<br />
فعلى سبيل المثال سوف نجد أن خاصية Font تأتي قبل خاصية<br />
لأن حرف F يسبق حرف<br />
الترتيب التصنيفي<br />
Text<br />
.T<br />
:<br />
وفي هذا الترتيب يتم تصنيف الخصائص إلى<br />
مجموعات انظر الشكل (٢-٢٣) ومن ثم إدراجها تحت تلك<br />
المجموعات فعلى سبيل المثال مجموعة<br />
Backcolor و خاصية<br />
Appearance<br />
.Font<br />
تحوي خاصية<br />
32
خالد الجديع kal_judaia@hotmail.com<br />
-٢ ٢٣ : شكل<br />
للخصائص<br />
العرض التصنيفي<br />
: ج تطبيق<br />
-١<br />
-٢<br />
-٣<br />
قم بإضافة زر أمر<br />
انقر بزر الفأرة الأيمن عليه ثم اختر<br />
Properties<br />
اذهب إلى خاصية Text و اكتب محاولة تغيير<br />
الخصائص.<br />
٤- لاحظ كيف تغير النص المكتوب على زر الأمر<br />
33
خالد الجديع kal_judaia@hotmail.com<br />
الأحداث<br />
Events<br />
يمكن تعريفه بزمن حصوله حيث يحصل عند قيام المستخدم أو النظام بعمل ما تجاه أداة ما، مثل<br />
نقر بالفأرة على زر أمر، لتغيير محتوي صندوق النص. فلو أخذنا على سبيل المثال أداة زر<br />
الأمر لوجدنا أنه بمجرد نقر الفأرة على زر الأمر فإن حدث النقر سوف يعمل. فإذا أردت أن<br />
تظهر رسالة عند النقر على زر الأمر فإنك سوف تكتب الكود في حدث النقر الخاص بزر الأمر.<br />
كيف تصل إلى الحدث لكتابة الكود<br />
-١<br />
للوصول إلى الحدث الذي ينفذ عند النقر على زر الأمر. افعل ما يلي :<br />
أضف زر أمر إلى النموذج كما يظهر من الشكل<br />
(٢٤-٢)<br />
شكل ٢٤-٢ :<br />
الوصول إلى الحدث بالنقر المزدوج<br />
.(٢٥-٢)<br />
انقر مزدوجا على زر<br />
الأمر ليظهر لك الشكل<br />
يمكن<br />
القول الآن أنك داخل<br />
-٢<br />
الحدث فكل ما ستكتبه<br />
في هذا الإجراء سوف ينفذ عند النقر<br />
٢٥- ٢ : شكل<br />
بعد النقر المزدوج على زر الأمر تم الانتقال إلى حدث النقر الخاص بهذا الزر<br />
نت<br />
الدوت<br />
تقوم بيئة<br />
معلومات<br />
بانشاء<br />
الحدث<br />
34
خالد الجديع kal_judaia@hotmail.com<br />
شكل ٢٦-٢ :<br />
طريقة الوصول لحدث ما.<br />
اختر الحدث اختر الحدث<br />
اختر الأداة التي تريد الوصول<br />
لأحداثها<br />
تصغير او تكبير الكود<br />
تصغير او تكبير الكود<br />
يمكننا تقسيم هذه الشاشة إلى ثلاثة أقسام<br />
:<br />
.I<br />
.II<br />
: القسم الأول<br />
القسم هو الفئة<br />
من بدء عبارة<br />
Public Class Form1 إلى عبارة End Class هذا<br />
-Class–<br />
الخاص بالنموذج. حيث أن بيئة الدوت نت أصبحت<br />
مطابقة مائة بالمائة لمواصفات البرمجة الشيئية فإن النموذج الذي أنشأته هو عبارة<br />
عن فئة و كل ما يندرج تحته من أداوت سوف ترث الخصائص الخاصة بالنموذج<br />
ما لم تقم بتغييرها على مستوى الأداة نفسها. بالطبع فإن الفئة للنموذج سوف<br />
يحوي بداخلة كل تعريفات الأحداث و خصائصها و الأحداث الخاصة بها.<br />
يبدأ من كلمة : القسم الثاني<br />
End Sub إلى Private Sub Button1_Click<br />
وهذا هو الإجراء الذي أنشأته لك بيئة الدوت نت لتقوم بكتابة الكود داخلة ليعمل عند النقر على<br />
زر الأمر. تلاحظ أن السطر الأول طويل جدا، ولكي تتمكن من رؤيته على الشاشة كاملا دون أن<br />
تضطر لاستخدام المنزلق الأفقي<br />
،Horizontal ScrollBaar فإن<br />
VB.NET يمنحك الرمز<br />
" _"<br />
الذي هو عبارة عن مسافة وشرطة منخفضة ،Underscore والذي بإضافته لنهاية السطر، يعتبر<br />
VB.NET أن السطر لم ينتهِ بعد، وأن السطر الذي يليه هو مكمل له. وبهذا يمكنك أن تشطر<br />
الأسطر الطويلة إلى عدة أسطر، دون أن تتسبب في خطأ في قواعد اللغة<br />
.Syntax<br />
وهناك<br />
طريقة أخرى وهي تجزيء الجمل ارجع إلى مميزات محرر الكود لمعرفة هذه الطريقة وتعتبر<br />
هذه الطريقة أسهل من الطريقة الأولى.<br />
35
خالد الجديع kal_judaia@hotmail.com<br />
: ملاحظة<br />
عند النقر المزدوج على أية أداة في بيئة الدوت نت فإن بيئة الدوت نت سوف تقودك<br />
إلى محرر الكود و تضعك في الحدث الخاص بتلك الأداة<br />
III-القسم الثالث<br />
:<br />
ويوجد أمامه علامة زائد<br />
وهو عبارة<br />
Windows Form Designer generated code<br />
+<br />
لو ضغطت عليها لظهر لك حجم كبير من العبارات.<br />
هي ما يسمى بالكود المنتج من قبل بيئة الدوت نت ويحوي عدة أشياء منها<br />
شرحها<br />
العبارة<br />
:<br />
Inherits System.WinForms.Form<br />
Public Sub New()<br />
MyBase.New()<br />
'This call is required by<br />
the Windows Form Designer.<br />
InitializeComponent()<br />
'Add any initialization<br />
after the InitializeComponent()<br />
call<br />
End Sub<br />
لاكتساب المعالم الأساسية للنموذج من<br />
WinForms.Form ومعنى ذلك أن هذا<br />
النموذج<br />
Form1 قائم ومعتمد ومكتسب<br />
هذه المنطقة<br />
للخصائص الأساسية لWinForms.Form<br />
وبدون هذه الجملة لا يمكن أن يعمل النموذج.<br />
يتم تنفيذ هذا الإجراء عند بدء تحميل<br />
النموذج. وهو<br />
يحل محل<br />
Form_Intialize<br />
والتي كانت موجودة في الإصدار السابق من<br />
فيجوال بيسك.<br />
إذا أردت عمل شيء ما في<br />
بداية البرنامج فاكتبه في السطر الذي يلي دالة<br />
.InitializeComponent()<br />
Protected Overloads Overrides Sub<br />
Dispose(ByVal disposing As<br />
Boolean)<br />
If disposing Then<br />
If Not (components Is<br />
Nothing) Then<br />
components.Dispose()<br />
End If<br />
End If<br />
MyBase.Dispose(disposing)<br />
End Sub<br />
يتم تنفيذ هذا الإجراء عند<br />
إنهاء<br />
يقوم هذا الإجراء بإزالة كل<br />
بالبرنامج من الذاكرة.<br />
Form_Terminate<br />
Private Sub InitializeComponent()<br />
Me.Button1 = New<br />
System.Windows.Forms.Button()<br />
إلى نهاية هذا الإجراء<br />
End Sub<br />
في الإصدار السادس.<br />
البرنامج.<br />
ما يتعلق<br />
هذا الإجراء حل محل<br />
و<br />
هذا الإجراء مهم جدا وهو<br />
الذي كان موجودا<br />
إجراء يحفظ كل<br />
الخصائص التي غيرتها أثناء تصميم النموذج<br />
.لكن<br />
لا تحاول تعديل الخصائص من هنا<br />
.<br />
36
خالد الجديع kal_judaia@hotmail.com<br />
ومن فوائد هذا الإجراء أنه يمكنك تصميم<br />
نموذج بالطريقة التي تريدها ثم نسخ هذا<br />
الإجراء ووضعه في نماذج أخرى مثل نماذج<br />
. الإنترنت<br />
: ملاحظة<br />
دراية تامة بما تعمل.<br />
أنصح بعدم محاولة تعديل القسم الثالث و الذي يمثل الكود المنتج إلا إذا كنت على<br />
37
خالد الجديع kal_judaia@hotmail.com<br />
مقدمة<br />
لمعالجة الأخطاء<br />
عند اكتمال أي برنامج فإن هناك عدد من الأخطاء المتوقعة و غير المتوقعة قد تحث في النظام<br />
أثناء عمله.<br />
مهما بلغ احتراف المبرمج فإنه لن يستطيع أن يخلي برنامجه من الأخطاء.<br />
بالذكر هنا ذكر أنواع الأخطاء بصفة عامة، يمكن تقسيم أنواع الأخطاء إلى ثلاثة أقسام وهي<br />
من الجدير<br />
:<br />
-١<br />
عند<br />
الأخطاء البنائية :<br />
بصيغة تخالف قواعد لغة البرمجة.<br />
وهو النوع الشائع من الأخطاء ويحصل عند كتابة عبارة في الكود<br />
ويمكن التمثيل لهذا النوع من الأخطاء بمثالين<br />
:<br />
.a<br />
الخطأ الإملائي في كتابة دالة ما;<br />
كما يظهر من المثال التالي<br />
لاحظ الخطأ الإملائي في دالة ctype حيث لم نكتب حرف e في آخر الدالة.<br />
Dim a As String<br />
Dim b As Integer<br />
ctyp(a, b)<br />
.b<br />
فقدان جزء من الجمل المركبة مثل<br />
لاحظ الخطأ وهو نسيان جملة<br />
Dim a As Integer<br />
If a > 10 Then<br />
a = a + 10<br />
:<br />
end if و التي يفترض أن تأتي بعد نهاية جملة<br />
.If<br />
وجود خطأ بنائي فإن بيئة الدوت نت تظهر خطا متعرجا تحت العبارة التي يكمن فيها<br />
الخطأ وتظهر هذه الأخطاء في نافذة المهام عند محاولة إنتاج النظام.<br />
الأخطاء التشغيلية : ويحصل هذا الخطأ عند محاولة تنفيذ جملة من المستحيل تنفيذها.و<br />
لا يظهر هذا النوع من الأخطاء إلا بعد تنفيذ النظام.كما انه لا يمكن اكتشاف هذه<br />
الأخطاء عند إنتاج النظام ولعل أبرز الأمثلة على هذا النوع هو محاولة القسمة على<br />
صفر وهاك مثال آخر ماذا لو حاول البرنامج الاتصال بقاعدة البيانات لكن الخادم الذي<br />
توجد فيه قاعدة البيانات كان لا يعمل لسبب أو لآخر فإن هذا الخطأ هو خطأ تشغيلي<br />
بحت.و عند عدم معالجة هذا النوع من الأخطاء قد يتوقف البرنامج بعد حدوث الخطأ.<br />
-٢<br />
.Try Catch<br />
يتم<br />
معالجة هذا النوع من الأخطاء من خلال عبارة<br />
38
خالد الجديع kal_judaia@hotmail.com<br />
-٣<br />
الأخطاء المنطقية :<br />
تعتبر من الأخطاء التي يصعب إيجادها و يحدث عندما لا يؤدي<br />
النظام نتائجه كما ينبغي. انظر المثال التالي<br />
لاحظ أن هذا التكرار لن ينتهي.<br />
بنفسه.<br />
Dim a As Integer<br />
a = 5<br />
Do While a < 5<br />
a = a - 5<br />
Loop<br />
:<br />
يتم معالجة هذا النوع من الأخطاء بمراجعة الكود يدويا من قبل المبرمج و اكتشاف الخطأ<br />
39
خالد الجديع kal_judaia@hotmail.com<br />
الدرس الأول<br />
: الهدف<br />
سوف تكون بداية التعامل الحقيقي مع بيئة vb.net مما يكون له الدور في إزالة<br />
الحاجز النفسي ويمكنك من التعلم على أساسيات هذه البيئة البرمجية.<br />
"<br />
: . ماذا سينتج<br />
بعد نقر زر الأمر بالفأرة سوف تظهر لنا<br />
مرحبا بكم في برنامجي الأول<br />
"<br />
على أداة العنوان<br />
الأدوات :<br />
سوف يكون لدينا نموذج وعليه<br />
زر أمر وأداة عنوان<br />
الخطوة<br />
الشرح التفصيلي<br />
١- وضع الأداوت<br />
١- ضع زر أمر وأداة عنوان على النموذج<br />
Form1 كما هو موضح<br />
على النموذج (٢-٢٧).<br />
بالشكل<br />
٢٧-٢ : شكل<br />
أداة عنوان وزر أمر<br />
تجزئ الجمل Edit Advance Word Wrapping<br />
من خلال<br />
-٢<br />
40
خالد الجديع kal_judaia@hotmail.com<br />
:<br />
٣- تغيير<br />
خصائص بعض<br />
الأدوات<br />
غير خصائص الأدوات لتصبح مطابقة للجدول التالي<br />
اسم الأداة الخاصية القيمة<br />
CmdWelcome<br />
Name Button1<br />
Text<br />
Name Label1<br />
Text<br />
Text Form1<br />
RightToLeft<br />
مرحبا<br />
LblHello<br />
البرنامج الأول<br />
Yes<br />
٤- تغيير خاصية<br />
لأداة<br />
Text<br />
العنوان عند حدث<br />
النقر لزر الأمر .<br />
١- انقر مرتين متتاليتين بالفأرة على زر الأمر<br />
.cmdWelcome<br />
سوف تظهر لك محرر الكود وسوف يكون المؤشر بين السطرين<br />
التاليين<br />
٢- اكتب العبارة التالية بين السطرين السابقين<br />
"مرحبا بكم في برنامجي الأول " = lblHello.Text<br />
41
خالد الجديع kal_judaia@hotmail.com<br />
-٤<br />
تنفيذ البرنامج<br />
وملاحظة تغير أداة<br />
العنوان عند النقر<br />
على زر الأمر،<br />
و بمعنى آخر أن<br />
الحدث<br />
النقر-<br />
– Click<br />
تم تنفيذه<br />
عند النقر على زر<br />
الأمر.<br />
١- ارجع إلى شاشة التصميم وذلك بالنقر المزدوج على<br />
في المستكشف أو النقر على شريط<br />
شاشة محرر الكود.<br />
٢- لتشغيل البرنامج اضغط<br />
Form1.vb<br />
Form1.vb[Design]*<br />
F5<br />
أو اختر من القائمة<br />
في أعلى<br />
Debug<br />
.Start<br />
-٣<br />
الشكل<br />
ثم<br />
انقر على زر مرحبا ثم لاحظ تغير أداة العنوان انظر<br />
.(٢٨-٢)<br />
شكل<br />
: ٢٨-٢<br />
" ظهور<br />
"<br />
بعد النقر على زر الأمر مرحبا<br />
مرحبا بكم في برنامجي الأول<br />
42
خالد الجديع kal_judaia@hotmail.com<br />
أداة العنوان<br />
استخدامها<br />
تستخدم لعرض النصوص التي لا<br />
يرغب أن يحررها المستخدم.<br />
في العادة تستخدم<br />
عنوانا لأدوات أخرى.<br />
مثال<br />
عندما يكون عندك مربع نص لإدخال اسماء الطلاب استخدم أداة العنوان لتكون<br />
عنوانا لهذا المربع كما في الشكل(١-٥)<br />
شكل ٥- ١ استخدام أداة العنوان<br />
خصائص أداة العنوان<br />
خاصية الاسم<br />
: اسم للأداة مع ملاحظة أنه لايمكن أن توجد أداتين على نفس النافذة بنفس<br />
.١<br />
الاسم.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
هذه هو اسم أداة العنوان وهو ماتستخدمه إذا أردت<br />
الوصول للخصائص برمجيا.<br />
Name<br />
٦٦
خالد الجديع kal_judaia@hotmail.com<br />
المرساة أو المثبتة :<br />
هي خاصية جديدة تستخدم للمحافظة على مواقع الأدوات في النافذة<br />
.٢<br />
عند تغيير حجمها.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
(٢-٥<br />
جميع الجهات مثل :<br />
مثال<br />
إذا اخترنا الجهة اليمنى<br />
(شكل<br />
من هذه<br />
Anchor<br />
يمين أو يسار أو<br />
الخاصية<br />
فإن المسافة بين هذا الكائن و<br />
الكائن الحاوي<br />
يمين فوق أو<br />
من له<br />
الجهة اليمنى سوف تبقى كما هي سواء<br />
يسار أسفل<br />
صغرنا<br />
الكائن الحاوي أو كبرناه.<br />
في الشكل(٣-٥)<br />
لما اخترنا الجهة اليمنى من هذه الخاصية بقيت<br />
المسافة كما هي بين أداة العنوان –<br />
الكائن الحاوي- الأيمن<br />
وحد النموذج<br />
شكل ٢-٥كما ترى اخترنا الجهة اليمنى<br />
شكل ٥-٣ كما تلاحظ المسافة بين أداة العنوان و الحد الأيمن للنموذج لم تتغير<br />
٣. الحجم التلقائي<br />
: تستخدم عندما تكون غير متأكد من طول النص الذي سيعرض على أداة<br />
اجعلها العنوان.<br />
True لتمتد أداة العنوان مع النص طولا و قصرا وهي متوفرة أثناء التصميم<br />
Label1<br />
مثال والتنفيذ.<br />
لو أردت أن تغير قيمتها أثناء التنفيذ لأداة<br />
Label1.Autosize = True<br />
الخاصية<br />
القيمة<br />
الشرح<br />
يتغير الحجم بناء على النص طولا وقصرا.<br />
هي القيمة الإفتراضية. سوف يبقى حجم أداة العنوان<br />
True<br />
False<br />
Autosize<br />
(طولها وعرضها)<br />
ثابتا كما تم تحديده أثناء التصميم.<br />
٤. لون الخلفية :<br />
يمكن تغيير لون الخلفية للأداة أثناء التصميم والتنفيذ.<br />
٦٧
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
الشرح<br />
تمكنك هذه الخاصية من تغيير اللون الخلفي لأداة<br />
العنوان<br />
Backcolor<br />
Label1.BackColor = Color.Blue<br />
مثال لتغيير لون الخلفية لأداة عنوان<br />
٥. شكل الحد :<br />
تستخدم لتغيير شكل حدود الأداة،<br />
في العادة نستخدمها للتفريق بين أدوات العنوان<br />
المختلفة.<br />
مثل لو كان عندك على النافذة أدوات عنوان لعرض الأسعار و أداة عنوان لعرض<br />
المجموع<br />
فالأداة الأخيرة تأخذ<br />
غير الأدوات الأولى.<br />
وهي متوفرة أثناء التصميم والتنفيذ<br />
lblHello<br />
lblHello.BorderStyle = BorderStyle.Fixed3D<br />
مثال للتغيير أثناء التنفيذ لأداة اسمها<br />
الخاصية<br />
القيمة<br />
الشرح<br />
لتغيير حدود أداة العنوان أنظر شكل<br />
(٥-٤) عندما<br />
Fixed3D<br />
BorderStyle<br />
جعلنا قيمة الخاصية Fixed3D كما تلاحظ الحدود<br />
اصبحت ثلاثية أبعاد.<br />
لإظهار حد خطي.<br />
لإلغاء الحد.<br />
FixedSingle<br />
None<br />
شكل ٥-٤ عندما غيرنا قيمة الخاصية BorderStyle إلى Fixed3D<br />
٦٨
خالد الجديع kal_judaia@hotmail.com<br />
تستخدم هذه الخاصية للتحقق من أي أمر يريده المستخدم.<br />
وهي متوفرة أثناء<br />
.٦ التحقق :<br />
التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
عند اختيار<br />
True يتم ربط أداة العنوان مع أداة<br />
True<br />
CauseValidate<br />
أخرى للتحقق من شروط معينة ومن ثم سوف ينفذ<br />
الحدث<br />
.Validate<br />
لن يتم تنفيذ ماسبق.<br />
سيأتي لها مزيد تفصيل<br />
لاحقا.<br />
False<br />
٧. قائمة الزر الأيمن :<br />
هذه الخاصية تربط قائمة الزر الأيمن بأداة العنوان.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
اسم القائمة<br />
هذه الخاصية تربط القائمة بأداة العنوان.<br />
فعندما<br />
Contextmenu<br />
تضغط الزر الأيمن والمؤشر عند أداة العنوان سوف<br />
تظهر لك قائمة،<br />
هي نفس القائمة التي ربطت أداة<br />
العنوان بها.<br />
لتغيير نوع المؤشر عند مرورة فوق هذه الأداة.<br />
في العادة تستخدم حسب نوع<br />
.٨ المؤشر :<br />
المؤشر فمثلا مؤشر الساعة الرملية يخبر المستخدم بأن هناك عملية ما تحدث الآن.<br />
وهي متوفرة<br />
أثناء التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
نوع المؤشر<br />
الشرح<br />
تتيح لك هذه الخاصية تغيير نوع مؤشر الفأرة عند<br />
Curser<br />
مرورة فوق أداة العنوان.<br />
هناك قائمة من المؤشرات<br />
حاول تجربتها.<br />
Windows<br />
هل تذكر القائمة الشجرية لأسماء المجلدات في<br />
مستكشف النوافذ<br />
.٩ الحوض :<br />
انها ثابته<br />
ومالئة للجهة اليسرى.<br />
إذا أردت تثبيت أداة العنوان في أي جهة فيمكنك<br />
.Explorer<br />
.(٧-٥)<br />
(٦-٥)<br />
من خلال هذه الخاصية.<br />
فقط اختر الجهة<br />
انظر الشكلين<br />
و<br />
وهي متوفرة أثناء<br />
التصميم والتنفيذ.<br />
٦٩
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
الشرح<br />
.<br />
إذا أردت أن<br />
تملأ الأداة الجانب الأيمن<br />
فقط اختر<br />
Right<br />
Dock<br />
الجهةانظر الشكلين<br />
.(٧-٥) و (٦-٥)<br />
إذا أردت أن تملأ الأداة الجانب الأيسر.<br />
إذا أردت أن تملأ الأداة الجانب العلوي.<br />
إذا أردت أن تملأ الأداة الجانب السفلي.<br />
إذا أردت أن تملأ الأداة النافذة كلها.<br />
إذا لم ترغب باستخدام هذه الحاصية؟<br />
Left<br />
Top<br />
Bottom<br />
Fill<br />
Non<br />
شكل ٥-٦ لاحظ كيف اخترنا الجهة اليمنى ثم لاحظ شكل ٥-٧<br />
شكل ٥-٧ لاحظ كيف احتلت أداة العنوان الجهة اليمنى من النموذج<br />
تستخدم لمنع هذه الأداة من الإستجابة للأحداث.<br />
مثلا لو أردت منع المستخدم من<br />
.١٠ التمكين :<br />
نقر زر دخول حتى يدخل كلمة السر واسم المستخدم اجعل هذه .False<br />
الخاصية<br />
وهي متوفرة<br />
أثناء التصميم والتنفيذ.<br />
٧٠
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
الشرح<br />
تمكين هذه الأداة مما يجعلها تستجيب للأحداث.<br />
عدم تمكين هذه الأداة انظر الشكل<br />
(٥-٨) عندما<br />
True<br />
False<br />
Enabled<br />
اخترناFalse .<br />
شكل ٥-٨<br />
خاصية<br />
=False<br />
لاحظ كيف ت لون أداة العنوان بعد أن جعلنا<br />
Enabled<br />
١١. الخط : لتغيير خصائص الخط على هذه الأداة ويندرج تحت هذه الخاصية عدة خصائص<br />
فرعية ويمكن تغيير جميع هذه الخصائص أثناء التصميم أو التنفيذ.<br />
الخاصية<br />
الخاصية الفرعية<br />
القيمة<br />
الشرح<br />
يمكنك تحديد اسم الخط الذي تريده.<br />
FontName<br />
Font<br />
True إذا أردت أن يكون الخط سميك<br />
FontBold<br />
False إذا أردت الخط غير سميك<br />
رقم<br />
للتحكم بحجم الخط<br />
FontSize<br />
صحيح<br />
وضع سطر تحت الخط<br />
عدم وضع سطر تحت الخط<br />
True<br />
False<br />
FontStrikThru<br />
إذا أردت الخط مائل<br />
إذا أردت الخط غير مائل<br />
True<br />
False<br />
FontItalic<br />
٧١
خالد الجديع kal_judaia@hotmail.com<br />
١٢. لون الكتابة :<br />
تستخدم هذه الخاصية لتغيير لون الكتابة.<br />
وهي متوفرة أثناء التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
لتغيير لون الخط<br />
ForeColor<br />
تستخدم لتثبيت مكان وحجم الأداة في وقت التصميم. :<br />
مثال<br />
عند انتهائك من<br />
.١٣ الإغلاق :<br />
تصميم نافذة معينة ترغب في استخدام هذه الخاصية حتى لاتغير حجم أو مكان أداة أثناء التصميم.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
لن تستطيع تكبير ولا تصغير ولا تحريك أداة العنوان<br />
أثناء التصميم.<br />
تستطيع تكبير و تصغير و تحريك أداة العنوان أثناء<br />
التصميم.<br />
True<br />
False<br />
Locked<br />
١٤. اليمين والشمال :<br />
الخاصية<br />
القيمة<br />
الشرح<br />
عرض النموذج من اليمين إلى الشمال<br />
عرض النموذج من الشمال إلى اليمين<br />
Yes<br />
No<br />
RightToLeft<br />
١٥. الحجم : تستخدم هذه الخاصية للتحكم بحجم الأداة أثناء التصميم والتنفيذ ولها عدة خصائص<br />
فرعية.<br />
الخاصية<br />
الخاصية الفرعية<br />
القيمة<br />
الشرح<br />
يحدد طول هذه الأداة<br />
Heght<br />
Size<br />
يحدد عرض هذه الأداة<br />
Width<br />
vb.net<br />
١٦. الإنتقال بين الأدوات :<br />
تحدد هذه الخاصية ترتيب الإنتقال بين أدوات النافذة.<br />
يحدد<br />
ترتيب الإنتقال اثناء التصميم حسب إضافتك لهذه الأداة على النافذة ويمكنك تعديل هذا الترتيب<br />
كما تريد.<br />
متوفرة أثناء التصميم والتنفيذ.<br />
مع ملاحظة أن البدء في الترتيب يكون من الصفر.<br />
٧٢
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
الشرح<br />
Tab<br />
من<br />
١ إلى مجموع<br />
بعد تشغيل البرنامج إذا ضغطت زر<br />
TabIndex<br />
الأدوات التي على<br />
سوف ينتقل المؤشر من كائن إلى كائن<br />
آخر.<br />
النافذة ناقص واحد<br />
وسوف يكون<br />
الخاصية.<br />
ترتيب التنقل حسب هذه<br />
١ إلى<br />
ملاحظة : البدء في الترتيب يكون من الصفر.<br />
لذلك تلاحظ أن القيمة تتراوح<br />
من<br />
مجموع الأدوات التي على النافذة ناقص واحد .<br />
مثلا تكون أول أداة تريد زيارتها ترتيبها<br />
صفر والثانية واحد وهلم جرا.<br />
تمثل هذه الخاصية النص المكتوب داخل هذه الأداة .<br />
تستخدم أثناء التصميم والتنفيذ<br />
.١٧ النص :<br />
مثلا لو أردنا تغيير النص المكتوب على أداة العنوان والتي لها الاسم<br />
Label1 أثناء التشغيل<br />
،<br />
إلى مرحبا بكم .<br />
"مرحبا بكم " = Label1.Text<br />
الخاصية<br />
القيمة<br />
الشرح<br />
النص الذي تريد عرضه على أداة العنوان.<br />
Text<br />
١٨. محاذاة النص الأفقية :<br />
تتيح لك هذه الخاصية تنسيق النص داخل الأداة إما إلى اليمين أو إلى<br />
اليسار أو في الوسط.<br />
وهي متوفرة أثناء التصميم والتنفيذ.<br />
لتنسيق النص للوسط أثناء التشغيل<br />
Label1.Textalig = Label1.HorizontalAlignment.Center<br />
لأداة اسمها .Label1<br />
الخاصية<br />
القيمة<br />
الشرح<br />
تنسيق النص إلى اليمين.<br />
تنسيق النص إلى اليسار.<br />
تنسيق النص في الوسط.<br />
Right<br />
Left<br />
Center<br />
TextAlign<br />
٧٣
خالد الجديع kal_judaia@hotmail.com<br />
&<br />
١٩. الذاكرية أو الرابطة<br />
: تستخدم لتحديد ما إذا كانت هذه الأداة سوف تستجيب لعلامة<br />
الموجود في خاصية النص لنفس الأداة.<br />
إذا كانت قيمة هذه الخاصية<br />
True فإنه يتم الوصول<br />
إلى<br />
+ Alt<br />
الأداة<br />
الأداة التي تلي أداة العنوان في ترتيب خاصية<br />
Tab عن طريق<br />
الحرف المسبوق<br />
.<br />
Text<br />
بعلامة<br />
& في خاصية النص<br />
الخاصية<br />
القيمة<br />
الشرح<br />
&<br />
إذا اخترنا<br />
True سيكون الحرف المسبوق بعلامة<br />
True/False<br />
UseMnoneic<br />
مع زر<br />
Alt هو المفتاح للوصول للأداة التي<br />
تلي أداة<br />
العنوان في الترتيب.<br />
٧٤
خالد الجديع kal_judaia@hotmail.com<br />
أداة<br />
مربع النص<br />
استخدامها<br />
تستخدم لإدخال البيانات و عرضها كما<br />
تستخدم لتحرير النصوص<br />
.<br />
مثال<br />
عندما يكون عندك مربع نص لإدخال اسماء الطلاب استخدم مربع نص لكتابة<br />
أسماء الطلاب.<br />
الشكل(١-٦)<br />
شكل ٦-١ : أداة مربع النص<br />
خصائص مربع النص<br />
هناك خصائص لمربع النص الكلام فيها نفس الكلام عن خصائص أداة العنوان وهي<br />
:<br />
، CauseValidate ، Borderstyle ، Backcolor ، Autosize ، Anchor<br />
، Locked ، ForeColor ، Font ، Enabled ، Dock ، Curser ، Contextmenu<br />
TextAlign ، Text ، TabIndex ، Size<br />
وهناك بعض الخصائص التي لاتوجد في أداة العنوان وهي ماسنشرحه :<br />
الآن بإسهاب<br />
١- حالة الأحرف<br />
:CharacterCasing<br />
تتيح لك هذه الخاصية التحكم بحالة الأحرف التي<br />
تدخل إلى مربع النص فيمكنك تحويل كل حرف يدخله المستخدم إلى الحالة التي تريد<br />
أوتوماتيكيا كما تمكنك من تحويل حالة الأحرف المدخلة في مربع نص إلى الحالة التي<br />
تريد. مثلا أنت تريد أن تكون حالة جميع الأحرف التي يدخلها المستخدم كبيرة<br />
Capital<br />
يمكنك هذا بجعل قيمة هذه الخاصية Upper وبالتالي كلما أدخل المستخدم حرف تحول<br />
إلى حرف كبير. انظر شكل<br />
(٢-٦)<br />
في هذا الشكل الحروف تتحول تلقائيا من صغيرة<br />
إلى كبيرة، فلو أردنا تحويل حروف مربع النص الذي اسمه TxtUpper إلى حروف<br />
كبيرة أثناء التنفيذ سنكتب الكود التالي<br />
:<br />
٧٦
خالد الجديع kal_judaia@hotmail.com<br />
TxtUpper.CharcterCasing = CharcterCasing.Upper<br />
b<br />
ملاحظة :<br />
هذه الخاصية لحروف اللغة الإنجليزية فقط فعندما يدخل المستخدم<br />
تتحول إلى<br />
.Upper إذا كانت حالة الأحرف B<br />
الخاصية<br />
القيمة<br />
الشرح<br />
تحويل الحروف إلى كبيرة.<br />
تحويل الحروف إلى صغيرة.<br />
ابقاء حالة الحرف كما أدخلها المستخدم.<br />
Upper<br />
Lower<br />
Normal<br />
CharcterCasing<br />
شكل ٦-٢ لاحظ تحويل الحروف إلى كبيرة تلقائيا<br />
:<br />
-٢<br />
اخفاء التظليل<br />
عندما تظلل نصا موجود في مربع النص وتنتقل من هذا المربع وتريد أن<br />
يبقى التظليل حتى بعد انتقالك من مربع النص استخدم هذه الخاصية.انظر (٦-٣)<br />
الشكل<br />
الخاصية<br />
القيمة<br />
الشرح<br />
إبقاء النص مظلالا بعد الإنتقال من مربع النص<br />
إخفاء التظليل بعد الإنتقال من مربع النص<br />
True<br />
False<br />
HideSelection<br />
شكل ٦-٣ حاول أن تنقر خارج مربع النص ولاحظ بقاء التظليل<br />
-٣<br />
-٤<br />
٧٧
خالد الجديع kal_judaia@hotmail.com<br />
: (Lines)<br />
الأسطر ٣-<br />
عندما تريد كتابة نص طويل أثناء التصميم في مربع النص<br />
استخدم هذه الخاصية لكتابة النص الطويل.<br />
الموقع<br />
تمثل هذه الخاصية موقع مربع النص في<br />
الكائن الحاوي لمربع النص<br />
(انظر<br />
:<br />
-٤<br />
الملاحظة التالية (<br />
والموقع محدد بخانتي<br />
X و Y للزاوية اليسرى العلوية لمربع النص.<br />
حاول تغيير مربع النص ولاحظ تغير قيم X و Y<br />
ملاحظة :<br />
موقع مربع النص يكون بالنسبة للحاوي الذي يحوي المربع،<br />
هذا الحاوي قد يكون<br />
مربع تجميع أو نافذة أو غيره.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
موقع النقطة س للزاوية اليسرى العلوية.<br />
موقع النقطة ص للزاوية اليسرى العلوية.<br />
X<br />
Y<br />
Location<br />
٥- خاصية الحد الأقصى :<br />
هذه الخاصية تحدد عدد الأحرف التي<br />
يمكن إدخالها<br />
في مربع<br />
الخاصية<br />
النص،<br />
وهي متوفرة<br />
القيمة<br />
أثناء التصميم والتنفيذ.<br />
الشرح<br />
٠ لايوجد قيد على عدد الأحرف المدخلة أو المعروضة.<br />
MaxLength<br />
رقم صحيح<br />
هو الحد الأعلى لعدد الحروف المدخلة للأداة.<br />
٦- خاصية الأسطر المتعددة :<br />
ماذا لو أردت أن تكتب أو تعرض أكثر من سطر على<br />
أداة النص.<br />
استخدم هذه الخاصية.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
امكانية تعدد الأسطر في أداة النص.<br />
لايوجد إلا سطر واحد للكتابة.<br />
True<br />
False<br />
MultiLine<br />
٧٨
خالد الجديع kal_judaia@hotmail.com<br />
تستخدم هذه الخاصية لإظهار رمز معين بدلا من النص المكتوب. :<br />
مثال<br />
: PasswordChar-٧<br />
لو كان عندك شاشة ادخال الكلمة السرية فإنك لاتريد أن تظهر الحروف إنما تريد أن يظهر بدلا<br />
منها نجمة أو أي رمز<br />
الخاصية<br />
آخر.<br />
القيمة<br />
انظر الشكل (٦-٤)<br />
الشرح<br />
تظهر لك نجمة بدل الحرف.<br />
تظهر لك علامة استفهام بدل الحرف.<br />
*<br />
؟<br />
PasswordChar<br />
شكل ٦-٤ 0 لاحظ ظهور النجمة مع أنني أدخل حروف<br />
٨- القراءة فقط :<br />
تعديله.<br />
تستخدم هذه الخاصية إذا أردت عرض نص معين للمستخدم بدون أن تمكنه من<br />
الخاصية<br />
القيمة<br />
الشرح<br />
لن يتمكن المستخدم من تعديل النص المعروض أو<br />
الكتابة على مربع النص.<br />
سوف يتمكن المستخدم من تحرير النص والكتابة<br />
على مربع النص.<br />
True<br />
False<br />
ReadOnly<br />
.Tab<br />
هذه الخاصية<br />
تسمح<br />
بزيارة أو عدم زيارة<br />
مربع النص عند الضغط على زر<br />
-٩ التوقف :<br />
الخاصية<br />
القيمة<br />
الشرح<br />
زيارة مربع النص عند ضغط<br />
عدم زيارة مربع النص عند ضغط<br />
. Tab<br />
. Tab<br />
True<br />
False<br />
TabStop<br />
٧٩
خالد الجديع kal_judaia@hotmail.com<br />
ملاحظة :<br />
إذا كانت قيمة هذه الخاصية<br />
True فسوف تتم زيارة مربع النص حسب الترتيب<br />
لخاصية الإنتقال بين الأدوات( .(TabIndex<br />
إذا أردت اخفاء أداة ما اثناء التنفيذ يمكنك استخدام هذه الخاصية.<br />
وهذه الخاصية<br />
-١٠ الظهور :<br />
تعمل عند التصميم والتنفيذ.<br />
لإخفاء مربع النص<br />
txtName عند التنفيذ اكتب الكود التالي<br />
:<br />
TxtName.visible = False<br />
الخاصية<br />
القيمة<br />
الشرح<br />
اظهار الأداة.<br />
اخفاء الأداة.<br />
True<br />
False<br />
Visible<br />
١١- الإلتفاف التلقائي :<br />
تستخدم هذه الخاصية مع خاصية<br />
MultiLine لإلتفاف النص التلقائي<br />
بمعنى أن يبدأ النص سطرا جديدا تلقائيا إذا وصل إلى نهاية السطر الحالي .<br />
التصميم والتنفيذ.<br />
وهي متوفرة أثناء<br />
الخاصية<br />
القيمة<br />
الشرح<br />
التفاف تلقائي.<br />
لن يحصل التفاف تلقائي وسوف تستمر الكتابة على<br />
نفس السطر.<br />
True<br />
False<br />
WordWrap<br />
٨٠
خالد الجديع kal_judaia@hotmail.com<br />
تطبيقات عملية على مربع النص<br />
سوف نورد تطبيق على أغلب خصائص مربع النص و شرح لها من خلال الكود التالي<br />
مرحبا نص 'عرض<br />
مربع على بكم<br />
النص<br />
:<br />
"بكم مرحبا" = TextBox1.Text<br />
'<br />
يمكن سوف<br />
المستفيد<br />
زر ضغط من<br />
الرجوع<br />
جديد سطر فتح إلى يؤدي مما<br />
TextBox1.AcceptsReturn = True<br />
'<br />
قبول من يمكن سوف<br />
الانتقال<br />
مربع إلى<br />
تاب زر ضغط بعد النص<br />
TextBox1.AcceptsTab = True<br />
'<br />
جديد<br />
'<br />
دمج يتم سوف<br />
عبارة<br />
مرحبا<br />
مع أخرى مرة بكم<br />
العبارة<br />
في الأولى<br />
("أخرى مرة بكم مرحبا" & TextBox1.AppendText(vbCrLf<br />
تغيير لون الخلفية إلى أزرق<br />
TextBox1.BackColor = Color.Blue<br />
'<br />
أسود إلى النص لون تغيير<br />
TextBox1.ForeColor = Color.Black<br />
'<br />
جعل<br />
خلفية<br />
مربع<br />
النص<br />
الصورة<br />
سطر<br />
TextBox1.BackgroundImage =<br />
Image.FromFile("C:\MyTextBoxBackground.gif")<br />
'<br />
الحدود نمط تغيير<br />
TextBox1.BorderStyle = BorderStyle.FixedSingle<br />
'<br />
النص مسح<br />
مربع في الموجود<br />
النص<br />
TextBox1.Clear()<br />
'<br />
تغيير<br />
مؤشر<br />
الفأرة<br />
عند يد إلى<br />
مروره<br />
مربع على<br />
النص<br />
TextBox1.Cursor = Cursors.Hand<br />
'<br />
لمربع الخط تغيير<br />
النص<br />
TextBox1.Font = New Drawing.Font("Comic Sans MS", 12,<br />
FontStyle.Bold, GraphicsUnit.Pixel)<br />
'<br />
تعيين<br />
الحروف من عدد أقصى<br />
TextBox1.MaxLength = 3000<br />
'<br />
إرجاع<br />
إلى النص<br />
القيمة<br />
الافتراضية<br />
TextBox1.ResetText()<br />
'<br />
إضافة<br />
شريط<br />
مربع يمين إلى انزلاق<br />
النص<br />
TextBox1.ScrollBars = ScrollBars.Vertical<br />
بطول 12<br />
TextBox1.Select(0, 11)<br />
'<br />
'<br />
سوف<br />
سوف<br />
يتم<br />
يتم<br />
تظليل<br />
تظليل<br />
النص<br />
آل<br />
من<br />
النص<br />
البداية<br />
مربع في<br />
النص<br />
حرفا<br />
TextBox1.SelectAll()<br />
'<br />
تعريف<br />
متغير<br />
وتعيين<br />
قيمته<br />
تساوي<br />
النص<br />
المظلل<br />
Dim SelectedText As String = TextBox1.SelectedText<br />
'<br />
بدء<br />
التظليل<br />
حرف أول من<br />
TextBox1.SelectionStart = 0<br />
'<br />
النص طول<br />
المظلل<br />
TextBox1.SelectionLength = 11<br />
'<br />
مربع حجم تغيير<br />
النص<br />
TextBox1.Size = New Size(300, 400)<br />
'<br />
منتصف في النص عرض<br />
مربع<br />
النص<br />
TextBox1.TextAlign = HorizontalAlignment.Center<br />
'<br />
عرفنا<br />
متغير<br />
قيمته<br />
النص طول<br />
مربع في الموجود<br />
النص<br />
Dim i As Integer = TextBox1.TextLength<br />
'<br />
التراجع<br />
تحرير آخر عن<br />
لمربع<br />
النص<br />
TextBox1.Undo()<br />
'<br />
إخفاء<br />
مربع<br />
النص<br />
TextBox1.Visible = True<br />
'<br />
اختيار<br />
نسخه ثم النص آل<br />
TextBox1.SelectAll()<br />
٨١
خالد الجديع kal_judaia@hotmail.com<br />
TextBox1.Copy()<br />
TextBox1.SelectAll()<br />
TextBox1.Cut()<br />
اختيار<br />
قصه ثم النص آل<br />
'<br />
٨٢
خالد الجديع kal_judaia@hotmail.com<br />
زر الأمر<br />
– مثلا-<br />
استخدامه<br />
مثال<br />
يستخدم زر الأمر في العادة لتنفيذ عمليات معينة بعد النقر عليه.<br />
عندما يكون عندك مربع نص لإدخال اسماء الطلاب استخدم زر الأمر<br />
لحفظ هذه البيانات في قاعدة البيانات كما سوف تتعلم إن شاء االله.<br />
هناك خصائص لزر الأمر الكلام فيها نفس الكلام عن خصائص الأداوات السابقة وهي<br />
:<br />
، Dock ، Curser ، Contextmenu ، CauseValidate ، Backcolor ، Anchor<br />
، Text ، TabStop، TabIndex ، Size ، Locked ، ForeColor ، Font ، Enabled<br />
Visible ، TextAlign<br />
وهناك بعض الخصائص التي لاتوجد في مربع النص<br />
بإسهاب<br />
ولا في أداة العنوان وهي ماسنشرحه الآن<br />
:<br />
-١ الخلفية :<br />
تستخدم هذه الخاصية لعرض صورة في مربع النص انظر الشكل<br />
(١-٧)<br />
كما ذكرنا مسبقا لن نتطرق لجميع الخصائص لأن ذلك سيطول جدا وسيضيع الفائدة من هذا<br />
الكتاب إنما سوف نتكلم عن الخصائص التي تساعد في تحقيق هدف هذا الكتاب.<br />
شكل ٧-١ لاحظ الصورة على زر الأمر<br />
٨٤
خالد الجديع kal_judaia@hotmail.com<br />
:<br />
-٢<br />
نتيجة نافذة الحوارDialogResult<br />
هذه الخاصية تحتفظ بقيمة نتيجة نافذة الحوار،<br />
لنضرب لك مثالا حتى تتضح أكثر.<br />
لنفترض أن أمامك شاشة حوار فيها زري أمر<br />
(نعم<br />
Cancel للثاني.<br />
لا)<br />
وقيمة هذه الخاصية لهما<br />
Ok للأول و<br />
فإنك لو نقرت على أي<br />
/<br />
منهما فسوف تغلق نافذة الحوار بدون الحاجة لكتابة أي أمر لإغلاقها وكذلك سوف<br />
تستطيع معرفة أي زر اختاره المستخدم لأن هذه الخاصية سوف تحتفظ لك باختياره.<br />
ملاحظة :<br />
يجب أن تكون نافذة الحوار قد فتحت باستخدام الأمر<br />
ShowDialog لكي تصبح<br />
نافذة حوار.<br />
سوف نطبق هذه الخاصية تفصيليا في الفصل القادم فلا تقلق إذا لم تستوعبها.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
إذا لم ترغب في استخدام هذه الخاصية.<br />
قيمة لهذه الخاصية.<br />
قيمة لهذه الخاصية.<br />
None<br />
Ok<br />
Cancel<br />
DialogResult<br />
النمط ٣-<br />
:FlatStyle تستخدم هذه الخاصية لتغيير شكل زر الأمر عندما تمرر الفأرة<br />
عليه أو تضغط عليه بالفأرة انظر الشكل<br />
1.12 هناك ثلاثة قيم لهذه الخاصية.<br />
في الشكل<br />
1.12 يمكنك ملاحظة الزر قبل المرور عليه بالفأرة وبعد المرور عليه بالفأرة لتعرف<br />
الفرق<br />
مع ملاحظة أن الجهة اليسرى قبل مرور الفأرة والجهة اليمنى بعد مرورها.<br />
هذه<br />
الخاصية متوفرة أثناء التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
هو الشكل الثاالث في شكل<br />
.(٢-٧)<br />
هو الشكل الثاني في شكل(٢-٧).<br />
الشكل الأول في شكل(٢-٧).<br />
Flat<br />
PopUP<br />
Standard<br />
FlatStyle<br />
شكل ٧-٢ لاحظ الفرق عند تمرير الفأرة في هذه الخاصية<br />
٨٥
خالد الجديع kal_judaia@hotmail.com<br />
مربع الإختيار<br />
استخدامه<br />
يستخدم مربع الإختيار لتحديد أو عرض أحد الإختيارات مثل<br />
(نعم/لا) (صح/خطأ)<br />
فيظهر في الأداة علامة عند الإختيار و تختفي هذه العلامة عند عدم الإختيار<br />
وقد يكون هناك قيمة ثالثة وهي علامة مظللة تعني عدم تحديد الإختيار.<br />
مثال<br />
عندما تتصل بالإنترنت تأتيك نافذة فيها مربع خيار يسألك هل تريد حفظ الكلمة<br />
السرية عند الدخول في المرة القادمة.<br />
هناك خصائص لمربع الإختيار الكلام فيها نفس الكلام عن خصائص الأداوات السابقة وهي :<br />
،<br />
Contextmenu<br />
،<br />
CauseValidate<br />
،Background،<br />
Backcolor<br />
،<br />
Anchor<br />
، Size<br />
، Locked<br />
، ForeColor<br />
، Font<br />
،<br />
FlatStyle، Enabled<br />
، Dock<br />
، Curser<br />
Visible<br />
، TextAlign<br />
، Text<br />
، TabStop، TabIndex<br />
وهناك بعض الخصائص التي لاتوجد في الأدوات السابقة وهي ماسنشرحها الآن بإسهاب :<br />
.<br />
١- شكل أو نمط<br />
الظهور:<br />
تستخدم هذه الخاصية للتحكم في شكل مربع الإختيار<br />
هناك<br />
شكلان رئيسان حسب قيمة هذه الخاصية.<br />
وهي متوفرة عند التصميم والتنفيذ<br />
الخاصية<br />
القيمة<br />
الشرح<br />
هو الشكل العادي كما في الشكل<br />
يأخذ شكل زر الأمر انظر شكل<br />
.(١-٨)<br />
.(١-٨)<br />
Normal<br />
Button<br />
Appearance<br />
سكل ٨-١ لاحظ الفرق بين الشكلين<br />
٨٧
خالد الجديع kal_judaia@hotmail.com<br />
الإختيار التلقائي :<br />
تستخدم لتغيير حالة مربع الإختيار تلقائيا عند النقر.<br />
وهي متوفرة عند<br />
-٢<br />
التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
اختيار تلقائي عند النقر بمعن أنك سوف ترى علامة<br />
عند النقر.<br />
لن تتم عملية الإختيار مهما نقرت على مربع<br />
الإختيار.<br />
True<br />
False<br />
AutoCheck<br />
.<br />
:<br />
-٣<br />
تنسيق الإختيار<br />
تستخدم هذه الخاصية لتنسيق المربع الذي في مربع الإختيار<br />
انظر<br />
TopCenter (أعلى متوسط) .<br />
الشكل(٢-٨)<br />
عندما اخترنا القيمة<br />
وهي متوفرة عند<br />
التصميم والتنفيذ.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
جميع<br />
الإتجاهات<br />
عند اختيارك لتنسيق ما سوف يظهر ذلك<br />
CheckAlign<br />
.<br />
كما ترى في الشكل<br />
التنسيق في مربع الإختيار<br />
(٣-٨)<br />
شكل ٨-٢ كما تلاحظ كيف جاء المربع في<br />
الوسط<br />
شكل ٨-٣ لاحظ عندما اخترنا التنسيق الوسط العلوي كيف<br />
أثر ذلك في شكل ٨-٢<br />
٨٨
خالد الجديع kal_judaia@hotmail.com<br />
()<br />
: الإختيار -٤<br />
نستفيد من هذه الخاصية معرفة ما إذا كان المستخدم قد اختار<br />
يختر. وهي متوفرة عند التصميم والتنفيذ.<br />
الخاصية القيمة الشرح<br />
أو لم<br />
True Checked<br />
False<br />
قام المستخدم بالإختيار.<br />
لم يقم المستخدم بالإختيار.<br />
٥- حالة الإختيار :<br />
الخاصية<br />
نستفيد من هذه الخاصية معرفة حالة الإختيار.<br />
القيمة الشرح<br />
Unchecked<br />
Checked<br />
Indeterminate<br />
لم يقم المستخدم بالإختيار.<br />
قام المستخدم بالإختيار.<br />
غير محدد يعني لم يوافق ولم يرفض.<br />
CheckState<br />
ThreeStateحتىتتمكن = True من<br />
: ملاحظة<br />
CheckState<br />
لابد أن تكون خاصية<br />
استخدام خاصية<br />
-٦<br />
الحالات الثلاث<br />
:<br />
تمكنك هذه الخاصية من وضع حالة ثالثة في مربع الإختيار توجد في<br />
الغالب عندما لايستطيع المستخدم الإختيار لأي ظرف ما<br />
عن الإختيار أو غيرها) انظر الشكل<br />
الخاصية القيمة الشرح<br />
)<br />
.(٤-٨)<br />
True ThreeState<br />
False<br />
ثلاث حالات لمربع الإختيار.<br />
حالتان فقط إما أو بدونها.<br />
مثل عدم المعرفة أو التحفظ<br />
شكل ٨-٤ لاحظ الحالات الثلاث<br />
٨٩
خالد الجديع kal_judaia@hotmail.com<br />
زر الإختيار Button) (Radio<br />
استخدامه<br />
مثال<br />
تستخدم أداة زر الإختيار لإعطاء الفرصة للمستخدم لإختيار واحد من عدة<br />
اختيارات. يمكن تجميع أداة زر الإختيار في مجموعات ضمن اطار واحد وعند<br />
اختيار المستخدم لأحدها يلغي النظام اختيار بقية أزرار الإختيار في نفس<br />
المجموعة.<br />
الشكل(٥-٨) يوضح لك المثال.<br />
خصائص زر الإختيار : الكلام فيها نفس الكلام عن خصائص مربع الإختيار بلا فرق وهي<br />
:<br />
،Background، Backcolor ، AutoCheck ، Appearance ،Anchor<br />
، Dock ، Curser ، Contextmenu ، Checked ، CheckAlign ، CauseValidate<br />
، TabIndex ، Size ، Locked ، ForeColor ، Font ، FlatStyle، Enabled<br />
Visible ، TextAlign ، Text ،TabStop<br />
ملاحظة :<br />
إن هناك خصائص في مربع الإختيار لاتوجد في زر الإختيار مثل<br />
ThreeState<br />
قد لايظهر لك الفرق واضحا بين مربع الإختيار و زر الإختيار والتفريق بينهما مهم جدا<br />
لأنه يؤثر على استخدامهما. الفرق بينهما هو أن المستخدم عندما يختار زر أمر ما فإن النظام<br />
يلغي الإختيار عن جميع الأزرار في نفس المجموعة لكن مربع الإختيار يسمح لك بالإختيار<br />
المتعدد انظر الشكل<br />
(٥-٨)<br />
شكل ٨-٥<br />
لاحظ الفرق بين مربع الإختيار و زر الإختيار<br />
٩٠
خالد الجديع kal_judaia@hotmail.com<br />
الدرس الثاني<br />
التدرب أكثر للتعامل مع فيجوال بيسك<br />
برنامج الألوان<br />
الهدف<br />
سوف نقوم في التدريب التالي للتدرب أكثر على فيجوال بيسك وسوف يكون<br />
التركيز على التعود أكثر في التعامل مع الأدوات والخصائص والأحداث.<br />
الأدوات<br />
نموذج وسوف نضيف إليه ثلاث أزرار اختيار<br />
-RadioButton–<br />
وثلاث أزرار<br />
أمر وأداة عنوان ومربع تجميع لجمع الأزرار الثلاثة في إطار واحد. انظر<br />
شكل(٦-٨)<br />
الناتج<br />
ستكون العملية كالتالي<br />
.<br />
ماكتبته من مربع النص إلى أداة العنوان<br />
.<br />
سوف تكتب في مربع النص ثم تنقر زر مرحبا ثم سينتقل<br />
عند الضغط على أي من أزرار الراديو<br />
يتغير لون النص الذي على أداة العنوان عند الضغط على زر حول البرنامج<br />
تظهر لك رسالة<br />
"<br />
هذا هو البرنامج الثاني"<br />
ملاحظة مهمة جدا<br />
لأنها لاتعمل في<br />
:<br />
عند البدء في البرمجة لاتحاول استخدام الخاصية الإفتراضية لأي كائن<br />
. vb.net<br />
رسالة في مربع النص لنفترض أن اسمه<br />
مثال في الإصدار السابق من<br />
فيجوال بيسك إذا أردت أن تظهر<br />
txtName برمجيا يمكنك كتابة العبارة التالية<br />
" مرحبا " = txtName.text<br />
كذلك يمكنك عدم كتابة اسم الخاصية لأنها الخاصية الإفتراضية فتستطيع كتابة العبارة بصورة<br />
مكافئة كما يلي<br />
لاحظ بدون الخاصية<br />
الخاصية<br />
مرحبا<br />
TxtName =<br />
"<br />
Text<br />
.<br />
أما في<br />
vb.net فلايمكن ذلك بل لابد من كتابة العبارة كاملة مع<br />
٩١
خالد الجديع kal_judaia@hotmail.com<br />
الخطوة<br />
الشرح التفصيلي<br />
ضع أداة العنوان ثم مربع النص ثم ثلاثة أزرار أمر ثم ضع مربع<br />
التجميع ثم ضع ثلاثة أزرار اختيار فوقه لكي تكون مجموعة واحدة.<br />
-١<br />
وضع الأداوت<br />
على النموذج.<br />
شكل ٨-٤ التصميم المبدئي لنموذج الألوان<br />
٢- تغيير خصائص<br />
بعض الأدوات<br />
(أثناء التصميم).<br />
غير خصائص الأدوات لتصبح مطابقة للجدول التالي<br />
انظر الشكل<br />
.(٦-٨)<br />
اسم الأداة الخاصية القيمة<br />
Text Form1<br />
RightToLeft<br />
Name RadioButton1<br />
Text<br />
“البرنامج<br />
الأول"<br />
Right<br />
rdbBlue<br />
RadioButton2<br />
RadioButton3<br />
GroupBox1<br />
Label1<br />
Text1<br />
أزرق<br />
rdbRed<br />
أحمر<br />
rdbGreen<br />
أخضر<br />
GrbColors<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
ألوان<br />
LblColor<br />
txtColor<br />
٩٢
خالد الجديع kal_judaia@hotmail.com<br />
cmdMove<br />
نقل النص<br />
cmdExit<br />
خروج<br />
CmeAbout<br />
حول البرنامج<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Button1<br />
Button2<br />
Button3<br />
.I<br />
-٣<br />
لون الكتابة<br />
تغيير خاصية<br />
)<br />
( ForColor<br />
لأداة<br />
العنوان عند النقر<br />
على أي من أزرار<br />
الأختيار ثم لاحظ أن<br />
تغيير اللون يتم عند<br />
الحدث<br />
التنفيذ)<br />
انقر مزدوج على زر الإختيار الأزرق. واكتب التالي<br />
lblColor.ForeColor = color.Blue<br />
في هذه العبارة نلاحظ أننا نغير قيمة خاصية لون الخط لأداة<br />
العنوان إلى أزرق. لو أردت تغيير اللون الخلفي بدل لون الخط ضع<br />
BackColor بدلا من<br />
.ForeColor<br />
.II<br />
ارجع إلى شاشة التصميم<br />
انقر مزدوج على زر الإختيار الأحمر واكتب التالي<br />
lblColor.ForeColor = color.red<br />
.III انقر مزدوج على زر الإختيار الأخضر واكتب التالي<br />
lblColor.ForeColor = color.Green<br />
. (أثناء<br />
-٤<br />
نقل مايكتبه<br />
المستخدم من أداة<br />
النص إلى أداة<br />
العنوان وذلك بنقل<br />
قيمة خاصية<br />
Text<br />
في أداة النص<br />
ووضعها في<br />
خاصية<br />
Text لأداة<br />
العنوان لاحظ أن<br />
انقر مزدوج على زر الأمر "نقل النص" واكتب التالي<br />
lblcolor.Text = txtColor.Text<br />
في هذه العبارة تلاحظ أننا نأخذ قيمة الخاصية txtColor.Text<br />
ونضعها في<br />
افترض أن<br />
أهلا وسهلا<br />
بعد تنفيذ<br />
lblcolor.Text<br />
txtColor.Text<br />
lblcolor.Text = txtColor.Text<br />
=<br />
lblcolor.Text<br />
أهلا وسهلا.<br />
سوف تصبح قيمة<br />
٩٣
خالد الجديع kal_judaia@hotmail.com<br />
عملية النقل سوف<br />
تتم عند النقر على<br />
زر cmdMove<br />
أي عند حدث النقر<br />
لهذه الأداة.<br />
٥- عرض رسالة<br />
عن البرنامج<br />
باستخدام الدالة<br />
MessageBox.Show<br />
مع شرح مبسط لهذه<br />
الدالة. لاحظ أن<br />
عرض الرسالة<br />
سوف يتم عند النقر<br />
على زر الأمر<br />
انقر مزدوج على زر الأمر cmdAbout وأكتب التالي<br />
,"ألوان" ,"الألوان برنامج هو هذا")MessageBox.Show<br />
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)<br />
هذه العبارة سوف تظهر لنا رسالة مكتوب عليها هذا هو برنامج<br />
الألوان.<br />
كما تلاحظ الأمر هو<br />
MessageBox.Show<br />
هذه هي دالة ولها ثلاثة عوامل تحتاج إليها<br />
نوع الرسالة<br />
عنوان الرسالة<br />
يعني صندوق الرسالة<br />
.<br />
MessageBox.Show (<br />
.<br />
، الرسالة<br />
، )<br />
الرسالة :<br />
نوع الرسالة :<br />
وتكتب فيها الرسالة التي تريد اظهارها.<br />
وسوف تظهر لك قائمة أنواع كثيرة تختار مايناسبك.<br />
.cmdAbout<br />
.<br />
مثلا هناك رسائل تحذيريه ورسائل تأكيديه<br />
ورسائل معلوماتيه<br />
ونحن في هذا المثال اخترنا Information<br />
وهي المعلوماتيه<br />
وأنصحك بتغيير نوع الرسالة عدة مرات لتعرف الفرق بينها.<br />
-٦<br />
انهاء البرنامج<br />
عند النقر على زر<br />
٦- انقر مزدوج على زر الأمر خروج واكتب العبارة التالية<br />
هذه العبارة سوف تنهي البرنامج كاملا.<br />
End<br />
.cmdExit<br />
٩٤
خالد الجديع kal_judaia@hotmail.com<br />
تنفيذ البرنامج<br />
نفذ البرنامج حسب الخطوات التالية<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
أكتب في مربع النص أهلا وسهلا بكم.<br />
انقر مره واحدة على زر الأمر نقل النص ثم لاحظ انتقال النص الى أداة العنوان.<br />
انقر زر الإختيار أزرق مرة واحدة ثم لاحظ تغير لون النص في أداة العنوان.<br />
أنقر زر حول البرنامج لتظهر لك الرسالة<br />
يجب أن يكون الشكل مطابقا للشكل<br />
انقر زر خروج لأنهاء البرنامج.<br />
:<br />
.(٧-٨)<br />
هذا هو برنامج الألوان.<br />
شكل ٨-٧ بعد اتمام الخطوات من ١ إلى ٤<br />
٩٥
خالد الجديع kal_judaia@hotmail.com<br />
أداة القائمة Box) (List<br />
استخدامه<br />
تستخدم أداة القائمة لعرض مجموعة من العناصر (بيانات) للمستخدم على شكل<br />
قائمة بحيث يتمكن من اختيار عنصر أو أكثر إن كان ذلك مسموحا انظر الشكل<br />
(١-٩)<br />
مثال<br />
إذا أردت عرض قائمة أسماء المدن أو الإدارات أو غيرها من القوائم.<br />
شكل ٩-١ لاحظ الشكل العام للقائمة<br />
خصائص زر الإختيار : الكلام فيها نفس الكلام عن خصائص مربع الإختيار بلا فرق وهي<br />
:<br />
، Contextmenu ، CauseValidate ، BorderStyle،Backcolor ،Anchor<br />
، Size ، Locked ، Location،ForeColor ، Font ، Enabled ، Dock ، Curser<br />
Visible ، TabStop، TabIndex<br />
وهناك بعض الخصائص التي لاتوجد في الأدوات السابقة وهي ماسنشرحه الآن<br />
١- عرض العمود<br />
ملاحظة<br />
الخاصية<br />
الخاصية.<br />
بالتفصيل :<br />
:<br />
.<br />
:<br />
يستطيع المستخدم تحديد عرض الأعمدة في القائمة من خلال هذه<br />
لابد أن تكون خاصية MultiColumn = True حتى تتمكن من استخدام هذه<br />
٩٧
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
صفر<br />
عدد صحيح<br />
الشرح<br />
النظام سوف يحدد عرض الأعمدة.<br />
عرض العمود في القائمة متعددة الأعمدة.<br />
ColumnWidht<br />
٢-مصدر البيانات (DataSource) :<br />
تستخدم هذه الخاصية لتحديد مصدر العناصر التي<br />
سوف تعرض في القائمة.<br />
.<br />
مثال لمصدر البيانات :<br />
جدول أسماء الإدارات من قاعدة بيانات<br />
٣-المعروض :(DisplayMember)<br />
إذا استخدمت خاصية مصدر البيانات وحددت<br />
جدول الإدارات ليكون هو مصدر البيانات لهذه القائمة فلا بد<br />
أن<br />
تحدد أي حقل من هذا<br />
الجدول تريد أن يظهر للمستخدم )<br />
مثلا قد تريد عرض اسماء الإدارات)<br />
هذا الحقل الذي<br />
تريد عرضه للمستخدم هو قيمة<br />
هذه الخاصية.<br />
ماذا عن أرقام الإدارات كيف تحصل<br />
عليه ؟ يمكنك ذلك عن طريق الخاصية<br />
VauleMember(القيمة).<br />
.<br />
٤-شكل الظهور :<br />
تحديد شكل القائمة هل ستتركه للنظام أم تريد أن تتحكم به<br />
هذه<br />
الخاصية هي التي تحدد هذا الأمر.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
النظام سوف يحدد شكل عرض العناصر<br />
(ارتفاعها).<br />
المستخدم سوف يحدد شكل عرض<br />
Normal<br />
OwnerDrawFixed<br />
DrawMode<br />
العناصر<br />
(ارتفاعها)<br />
مع<br />
ملاحظةأن<br />
الإرتفاع سوف يكون هو نفسه لجميع<br />
العناصر وذلك من خلال الخاصية<br />
.Height<br />
OwnerDrawVariable المستخدم هو الذي يحدد شكل عرض<br />
العناصر مع ملاحظة أنك<br />
تستطيع اعطاء<br />
ارتفاعات مختلفة للعناصر.<br />
٩٨
خالد الجديع kal_judaia@hotmail.com<br />
-٥<br />
ملاحظة<br />
ارتفاع العنصر<br />
العنصر في القائمة<br />
: (ItemHeight)<br />
.<br />
:<br />
تستخدم هذه الخاصية لتحديد ارتفاع<br />
إذا أردت أن تستخدم هذه الخاصية فلابد أن تكون قيمة خاصية شكل الظهور<br />
إحدى القيمتين التاليتين إما<br />
. OwnerDrawVariable أو OwnerDrawFixed<br />
قيمة Normal فإن النظام هو الذي يتحكم بالإرتفاع لذلك لن تستفيد من هذه الخاصية.<br />
عندنا هنا قيمتان لهذه الخاصية تبعا لقيمة خاصية شكل الظهور<br />
:<br />
.I<br />
.II<br />
أما<br />
إن كانت قيمة خاصية شكل الظهور OwnerDrawFixed فسوف تكون قيمة<br />
هذه الخاصية ارتفاع العنصر في القائمة وأنت خبير في أن إرتفاع العناصر<br />
سوف يكون موحدا في هذه الحاله<br />
.<br />
إن كانت قيمة خاصية شكل الظهور<br />
OwnerDrawVariable<br />
العناصر ٦-<br />
فسوف تكون<br />
قيمة هذه الخاصية هي ارتفاع آخر عنصر تمت إضافته. في الفصول التطبيقية<br />
سوف تتمرن جيدا على استخدام هذه الخاصية.<br />
: (Items)<br />
تعبر هذه الخاصية عن العناصر الموجودة في القائمة<br />
فكل عنصر بها هو أحد عناصر القائمة. إذا أردت أن تحمل العناصر أثناء<br />
التصميم فيمكنك ذلك من خلال هذه الخاصية انقر الزر الذي عليه ثلاث نقاط<br />
ليظهر لك الشكل (٩-٢) اكتب العناصر واضغط زر الرجوع بعد كتابة كل<br />
عنصر لتستطيع كتابة عنصر آخر في سطر جديد ثم انقر زر Ok لتظهر لك<br />
القائمة بعناصرها كما في الشكل<br />
.(١-٩)<br />
كانت تلك طريقة تعبئة القائمة أثناء التصميم كذلك تستطيع تعبئتها بعد تنفيذ البرنامج من<br />
قاعدة بيانات أو من مصدر آخر وهو ماسنشرحه في الفصل القادم<br />
.<br />
شكل ٩-٢ طريقة تعبئة القائمة أثناء التصميم.<br />
٩٩
خالد الجديع kal_judaia@hotmail.com<br />
:<br />
-٧<br />
تعدد الأعمدة<br />
تستخدم هذه الخاصية لتحديد ما إذا كانت هذه القائمة سوف تعرض<br />
أكثر من عمود.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
امكانية عرض عدة أعمدة.<br />
عمود واحد فقط.<br />
True<br />
False<br />
MultiColumn<br />
ColumnWidth لتحديد<br />
ملاحظة :<br />
إذا كانت قيمة هذه الخاصية<br />
True استخدم خاصية<br />
عرض العمود.<br />
:<br />
-٨<br />
الظهور الدائم لشريط التمرير<br />
تستخدم هذه الخاصية لإظهار شريط التمرير دائما<br />
بغض النظر عن عدد العناصر في القائمة.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
امكانية عرض عدة أعمدة.<br />
عمود واحد فقط.<br />
True<br />
False<br />
ScrollAlwaysVisible<br />
٩- طريقة الإختيار :<br />
تستخدم هذه الخاصية لتحديد ما إذا كان<br />
المستخدم يستطيع إختيار<br />
عنصر أو أكثر أو لايستطيع إختيار أي عنصر.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
لايستطيع المستخدم اختيار أي عنصر من<br />
القائمة<br />
يستطيع اختيار عنصر واحد فقط<br />
يستطيع اختيار أكثر من عنصر انظر<br />
None<br />
One<br />
MultiSimple<br />
SelectionMode<br />
(٩-٣) شكل<br />
يستطيع اختيار أكثر من عنصر<br />
انظر<br />
MultiExtended<br />
شكل (٩-٣)<br />
MultiExtended (الإختيار<br />
ملاحظة :<br />
الفرق بين<br />
MultiSimple (الإختيار البسيط)<br />
و<br />
Shift و<br />
المطور)<br />
أن الإختيار المطور يمكنك من استخدام زر<br />
Ctrl لإختيار متعدد بعكس<br />
الإختيار البسيط الذي يتوجب عليك النقر على كل عنصر لإختياره.<br />
١٠٠
خالد الجديع kal_judaia@hotmail.com<br />
شكل ٩-٣ الإختيار المتعدد<br />
:<br />
الترتيب ١٠-<br />
تستخدم للترتيب التلقائي للعناصر.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
ترتيب حسب حروف الهجاء.<br />
ترتيب حسب تحميل العناصر في القائمة.<br />
True<br />
False<br />
Sorted<br />
٣<br />
:ValueMember<br />
القيمة ١١-<br />
ارجع الخاصية<br />
١٠١
خالد الجديع kal_judaia@hotmail.com<br />
الأداة المركبة(Box (Combo<br />
استخدامها<br />
تستخدم هذه الأداة لعدة<br />
أغرض منها أنه يمكن استخدامها<br />
كأداة نص أو قائمة<br />
مثال<br />
منسدلة أو قائمة عادية مثل أداة القائمة السابقة.<br />
إذا أردت عرض قائمة أسماء المدن أو الإدارات أو غيرها من القوائم.<br />
إدارات جديدة يمكنك ذلك عن طريق هذه الخاصية.<br />
أو إضافة<br />
ملاحظة :<br />
في الغالب تستخدم القائمة عندما يكون عدد العناصر<br />
التي ستعرض قليل<br />
بينما<br />
تستخدم القائمة المنسدلة إذا كان عدد العناصر ضخما.<br />
خصائص الأداة المركبة :<br />
الكلام فيها نفس الكلام عن خصائص أداة القائمة مع زيادة<br />
الخصائص التالية وهي :<br />
-١<br />
العدد الأقصى للعناصر:<br />
أكبر عدد ممكن من العناصر يمكن عرضه عند انسدال<br />
(٤-٩)<br />
القائمة.<br />
انظر الشكل<br />
مع ملاحظة أنك تستطيع الوصول لباقي العناصر<br />
بواسطة أشرطة التمرير.<br />
Style =<br />
Style = DropDown<br />
ملاحظة :<br />
لابد أن تكون خاصية<br />
أو<br />
DropDownList حتى تتمكن من استخدام هذه الخاصية.<br />
الخاصية<br />
القيمة<br />
عدد صحيح<br />
الشرح<br />
عدد العناصر عند انسدال القائمة.<br />
MaxDropDownItems<br />
شكل ٩-0٤ عندما جعلنا قيمة العدد الأقصى من العناصر المنسدلة = ٢<br />
١٠٢
خالد الجديع kal_judaia@hotmail.com<br />
(٥-٩)<br />
:<br />
-٢<br />
النمط أو الشكل<br />
تستخدم للتحكم بشكل وأداء الأداة المركبة.انظر شكل<br />
لمعرفة الفرق بين القيم الثلاث لهذه الخاصية.<br />
الخاصية<br />
القيمة<br />
الشرح<br />
تكون فيه الأداة المركبة مشابهه لمربع<br />
النص.<br />
قائمة منسدلة يستطيع المستخدم كتابة نص<br />
Simple<br />
DropDown<br />
Style<br />
في مكان التحرير.<br />
أشبه ماتكون بأداة القائمة<br />
. المستخدم ليس<br />
DropDownList<br />
لديه إلا خيار الإختيار من القائمة.<br />
شكل ٩-٥ يظهر لك الفرق بين القيم الثلاث لخاصية النمط<br />
١٠٣
خالد الجديع kal_judaia@hotmail.com<br />
قائمة مربع الخيار (CheckedListBox)<br />
استخدامها<br />
تعتبر هذه الأداة امتدادا لأداة القائمة. تستخدم بالضبط كما تستخدم أداة القائمة لكن<br />
كل عنصر من هذه الأداة يبدوا كأنه مربع نص انظر الشكل<br />
(٦-٩)<br />
مثال<br />
إذا أردت أن تعرض قائمة الطلاب وتريد أن يظهر أمام الطالب الناجح علامة <br />
وأما الطالب غير الناجح فلا يظهر بجانبه علامة. انظر الشكل<br />
(٦-٩)<br />
: ملاحظة<br />
يوجد اختلافات في بعض الخصائص بين أداة القائمة وأداة قائمة مربع الإختيار تبعا<br />
لإضافة مربع الإختيار<br />
شكل ٩-٦ : قائمة مربع الخيار<br />
خصائص قائمة مربع الخيار :<br />
الخصائص التالية وهي<br />
الكلام فيها نفس الكلام عن خصائص أداة القائمة مع زيادة<br />
:<br />
أهم خاصية يمكن ذكرها هنا هي خاصية العدد الأقصى للعناصر : أكبر عدد<br />
ممكن من العناصر يمكن عرضه عند انسدال القائمة. انظر الشكل<br />
ملاحظة أنك تستطيع الوصول لباقي العناصر بواسطة أشرطة التمرير.<br />
ملاحظة<br />
(٩-٧) مع<br />
:<br />
لابد أن تكون خاصية<br />
Style = أو Style = DropDown<br />
DropDownList حتى تتمكن من استخدام هذه الخاصية.<br />
١٠٤
خالد الجديع kal_judaia@hotmail.com<br />
الخاصية<br />
القيمة<br />
عدد صحيح<br />
الشرح<br />
عدد العناصر عند انسدال القائمة.<br />
MaxDropDownItems<br />
شكل: ٩-٧ عندما جعلنا قيمة العدد الأقصى من العناصر المنسدلة = ٢<br />
١٠٥
خالد الجديع kal_judaia@hotmail.com<br />
الدرس الثالث<br />
بداية حقيقية لكتابة البرامج<br />
برنامج قائمة الأسماء<br />
الهدف<br />
في<br />
سوف نقوم في التدريب التالي بداية التعامل مع القوائم وهي من الأدوات المهمة<br />
vb.net كذلك<br />
القدرة على بدء التفكير برمجيا.<br />
سوف تتدرب أكثر على كتابة عبارات برمجية مما يعطيك<br />
-ListBox–<br />
الأدوات<br />
نموذج وسوف نضيف إليه مربع قائمة<br />
و أربع أزرار أمر وأداة<br />
عنوان وأداة نص (٩-٨)<br />
انظر شكل<br />
الناتج<br />
ستكون العملية كالتالي<br />
تضغط زر الرجوع<br />
.<br />
سوف تكتب اسم في أداة النص ثم تنقر زر اضافة أو<br />
-Enter –<br />
ثم سينتقل ماكتبته من مربع النص إلى القائمة<br />
.<br />
عند الضغط على أي اسم من القائمة سوف يظهر في مربع النص ليمكنك من<br />
تعديله إذا أردت ثم ضغط زر تعديل ليعيده إلى القائمة بعد التعديل. لحذف أي اسم<br />
اختر الإسم من القائمة ثم انقر على زر حذف ستظهر لك رسالة تأكيدية اختر<br />
Yes للحذف أو No لإلغاء أمر الحذف. للخروج انقر على زر خروج. انظر<br />
(٩-١٠) و (٩-٩) الشكلين<br />
١٠٦
خالد الجديع kal_judaia@hotmail.com<br />
الخطوة<br />
١- وضع الأدوات<br />
وتعديل الخصائص<br />
المطلوبة أثناء<br />
التصميم<br />
الشرح التفصيلي<br />
غير خصائص الأدوات لتصبح مطابقة للجدول التالي انظر<br />
(٩-٨) الشكل<br />
اسم الأداة الخاصية القيمة<br />
LblName<br />
الاسم<br />
txtName<br />
cmdAdd<br />
اضافة<br />
cmdUpdate<br />
تعديل<br />
CmdDelete<br />
حذف<br />
CmdExit<br />
Name Label1<br />
Text<br />
Name Text1<br />
Text<br />
Name Button1<br />
Text<br />
Name Button2<br />
Text<br />
Name Button3<br />
Text<br />
Name Button4<br />
Text<br />
Name ListBox<br />
RightToLeft Form1<br />
AcceptButton<br />
BackColor<br />
خروج<br />
LstName<br />
Right<br />
cmdAdd<br />
Moccasin<br />
شكل ٩-٨: بدء التعامل مع القوائم<br />
-٢<br />
نحن نريد الآن<br />
إضافة مايكتبه<br />
البدء في البرنامج<br />
١٠٧
س ا<br />
خالد الجديع kal_judaia@hotmail.com<br />
المستخدم في مربع<br />
الأمر إلى أداة القائمة<br />
ليصبح عنصرا من<br />
عناصرها. لكي نفعل<br />
ذلك لابد من أربع<br />
خطوات وهي أولا<br />
التأكد من أن<br />
المستخدم كتب شيئا<br />
:<br />
:<br />
في مربع النص. ثانيا<br />
عملية الإضافة.<br />
ثالثا : مسح ماهو<br />
موجود في مربع<br />
النص لإضافة عنصر<br />
: آخر. أخيرا<br />
على مربع النص<br />
استعداد للكتابة.<br />
التركيز<br />
انقر مزدوج على زر اضافة.<br />
النص.<br />
في<br />
واكتب التالي :<br />
If txtname.Text "" Then<br />
lstname.Items.Add(txtname.Text)<br />
End If<br />
txtname.ResetText()<br />
txtname.Focus()<br />
السطر الأول نتأكد من أن المستخدم أدخل اسم في مربع<br />
فنتأكد عن طريق الخاصية<br />
مايدخل في مربع النص فإذا كانت<br />
شيء.<br />
في<br />
السطر الثاني نستخدم الدالة<br />
أن تعطي هذه الدالة ماتريد اضافته.<br />
Text<br />
""<br />
لأنها هي التي تحوي<br />
فيعني أن المستخدم لم يدخل<br />
Add للإضافة للقائمة.<br />
بالطبع لابد<br />
في مثالنا هذا نحن نريد اضافة<br />
الاسم الذي يدخله المستخدم في مربع النص لذلك أعطينا هذه الدالة<br />
الاسم الذي أدخله المستخدم وهو موجود في الخاصية<br />
في<br />
السطر الثالث استخدمنا الدالة<br />
Text<br />
ResetText والتي تزيل الاسم<br />
الموجود في مربع النص لكي نتمكن من ادخال اسم<br />
آخر<br />
Focus<br />
في<br />
السطر الرابع<br />
تخدمنا الدالة<br />
لكي يعود المؤشر إلى<br />
مربع النص لنتمكن من كتابة اسم<br />
السطر الأخير نغلق جملة الشرط<br />
آخر<br />
If<br />
٣- اظهار العنصر<br />
الذي يختاره المستخدم<br />
من القائمة في مربع<br />
النص<br />
انقر مزدوج على القائمة واكتب التالي<br />
txtname.Text = lstname.SelectedItem.ToString<br />
في العبارة<br />
نعرض السابقة<br />
المستخدم. لأننا نكتب هذه العبارة عند الحدث<br />
في مربع النص العنصر الذي اختاره<br />
SelectedIndexChanged فإن قيمة مربع النص تتغير كلما<br />
غير المستخدم الاسم الذي يختاره.<br />
فلو نقر المستخدم على الاسم محمد ظهر لنا في مربع النص محمد<br />
ثم نقر على خالد ظهر لنا خالد.<br />
SelectedIndexChanged<br />
ملاحظه :<br />
الحدث<br />
يتم تنفيذه كلما<br />
١٠٨
خالد الجديع kal_judaia@hotmail.com<br />
انتقل المستخدم من عنصر إلى<br />
أي طريقة كانت.<br />
آخر سواء بالفأرة أو الأسهم أو<br />
٤- تعديل أحد عناصر<br />
القائمة يتم بأربع<br />
التأكد : خطوات. أولا<br />
من أن المستخدم<br />
اختار عنصرا من<br />
القائمة لتعديلة. ثانيا<br />
حذف العنصر من<br />
القائمة. ثالثا وضع<br />
العنصر الجديد بدلا<br />
منه. أخيرا<br />
:<br />
مسح :<br />
ماهو موجود في<br />
مربع النص<br />
انقر مزدوج على زر التعديل واكتب التالي<br />
If lstname.SelectedIndex -1 Then<br />
lstname.Items.Remove(lstname.SelectedIndex)<br />
lstname.Items.Add(txtname.Text)<br />
txtname.ResetText()<br />
End If<br />
في العبارة الأولى نتأكد من أن هناك اسم مختار في القائمة.<br />
تذكر من الفصل الأول أن قيمة<br />
يختر المستخدم أي عنصر.<br />
في العبارة الثانية نستخدم الدالة<br />
القائمة.<br />
SelectedIndex<br />
Remove<br />
تكون<br />
كما<br />
–١ إذا لم<br />
لحذف عنصر من<br />
من البديهي أن هذه الدالة تطلب رقم العنصر الذي نريد<br />
حذفه. وأنت تعلم أن<br />
العبارة<br />
lstname.SelectedIndex<br />
تعطينا رقم العنصر الحالي<br />
أي الذي نقر عليه المستخدم لذلك فنحن نرسله إلى هذه الدالة.<br />
في العبارة الثالثة تنظيف مربع النص وهي<br />
txtname.ResetText()<br />
Dim s As String<br />
s = txtname.Text & "<br />
"<br />
٥- حذف عنصر من<br />
القائمة. خطوتان<br />
لإتمام هذه العملية.<br />
أولا التأكد من أن<br />
المستخدم يريد حذف<br />
العنصر من القائمة.<br />
: ثانيا<br />
عملية الحذف.<br />
هل أنت متأكد من حذف<br />
حذف" "تحذير<br />
If MessageBox.Show(s ، : MessageBox.YesNo<br />
،<br />
+ MessageBox.IconQuestion) _<br />
= DialogResult.Yes Then<br />
lstname.Items.Remove(lstname.SelectedIndex)<br />
End If<br />
١٠٩
خالد الجديع kal_judaia@hotmail.com<br />
في العبارة الأولى نعرف متغير لحفظ الرسالة التحذيرية قبل حذف<br />
الاسم.<br />
في العبارة الثانية نحفظ الاسم الحالي الموجود في مربع النص بالإضافة<br />
إلى الجملة التحذيرية. مثال لو اختار المستخدم من القائمة اسم أحمد<br />
فإنه سيظهر في مربع النص. فإذا نقر المستخدم على زر حذف فستكون<br />
العباره هل أنت متأكد من حذف أحمد. كما تعرف أن قيمة الخاصية<br />
Text هي قيمة نصية بمعنى أنه نص ولهذا السبب استخدمنا الإشارة<br />
وهي لإضافة نص إلى نص<br />
&<br />
.<br />
العبارة الثالثة سوف تظهر للمستخدم رسالة تأكيدية للحذف فإذا ضغط<br />
زر Yesفسوف يتم الحذف.<br />
العبارة الرابعة سبق توضيحها وسوف تقوم بعملية الحذف.<br />
خاصية : ملاحظة<br />
AcceptButton<br />
cmdAdd<br />
في النموذج معناها أن هذا الزر الذي هو<br />
سيكون هو الزر الإفتراضي بمعنى عندما أضغط زر الرجوع في لوحة<br />
المفاتيح -Enter– كأني نقرت هذا الزر<br />
-cmdAdd– بالفأرة.<br />
وهذا يفيد عندما يكون<br />
هناك حاجة لسرعة التعامل مثل أن تكون البيانات كثيرة فلا أحتاج كل مره أن أنقر زر<br />
الإضافة بالفأرة مما يسبب البطء. فقط اجعل الزر الذي تريد هو<br />
AcceptButton ولن<br />
تحتاج للفأرة. في مثالنا هذا فقط اكتب الاسم واضغط زر الرجوع وسوف يضيفه للقائمة.<br />
تنفيذ البرنامج<br />
نفذ البرنامج حسب الخطوات التالية :<br />
-١<br />
أكتب في مربع النص أحمد ثم انقر اضافة أو اضغط زر الرجوع.<br />
٢-أكتب في مربع النص خالد ثم انقر اضافة أو اضغط زر الرجوع.<br />
٣-أكتب في مربع النص مساعد ثم انقر اضافة أو اضغط زر الرجوع.<br />
٤-أكتب في مربع النص دخيل ثم انقر اضافة أو اضغط زر الرجوع.<br />
حتى الآن لاحظ أن الاسماء التي كتبتها اضيفت إلى القائمة انظر الشكل<br />
.(٩-٩)<br />
١١٠
خالد الجديع kal_judaia@hotmail.com<br />
٥-اختر أحد الاسماء من القائمة ولاحظ أنه يظهر في مربع النص.<br />
٦-اختر اسم ثاني وذلك بالنقر عليه ثم لاحظ أن مربع النص يتغير.<br />
٧-غير هذا الاسم في مربع النص ثم انقر زر تعديل ولاحظ انه يتغير في<br />
القائمة.<br />
٨-انقر زر حذف ستظهر لك الرسالة كما في شكل<br />
٩-انقر زر خروج لأنهاء البرنامج.<br />
.(١٠-٩)<br />
شكل ٩-١٠ حذف اسم من القائ مة<br />
شكل ٩-٩ اضافة اسماء إلى القائمة<br />
١١١
خالد الجديع kal_judaia@hotmail.com<br />
الدرس الرابع<br />
التعامل مع ثلاثة أنواع من القوائم<br />
برنامج نتائج امتحان الطلاب<br />
الهدف<br />
سوف نقوم في التدريب التالي بالتعامل مع ثلاثة أنواع من القوائم وهي مربع<br />
القائمة والأداة المركبة و قائمة مربع الخيار. وهي من الأدوات المهمة في<br />
خصوصا لمن يريد التعامل مع قواعد البيانات.<br />
vb.net<br />
الأدوات<br />
مربع قائمة<br />
نموذج وسوف نضيف إليه -ListBox–<br />
الخيار و أربع أزرار أمر<br />
وسبع أداوات عنوان وأداة نص. انظر<br />
و أداة مركبة و قائمة مربع<br />
شكل (٩-<br />
(١١<br />
الناتج<br />
ستكون العملية كالتالي<br />
تضغط زر الرجوع<br />
ذات العلامة<br />
.<br />
سوف تكتب اسم في أداة النص ثم تنقر زر إضافة أو<br />
-Enter –<br />
.<br />
ثم سينتقل ما كتبته من مربع النص إلى القائمة<br />
لحذف أي اسم اختر الإسم من القائمة ثم انقر على زر حذف<br />
ستظهر لك رسالة تأكيدية اختر Yes للحذف أو No لإلغاء أمر الحذف. عند<br />
الإنتها من كتابة الأسماء انقر على اسم الطالب الناجح مرة واحد مما يؤدي إلى<br />
تظليل هذا الإسم انقر على المربع الذي بجوار الاسم لكي تظهر عليه علامة . <br />
ضع هذه العلامة امام الطلاب الناجحين. في النهاية انقر زر توزيع لكي ينقل<br />
الطلاب الناجحين إلى مربع القائمة والطلاب غير الناجحين إلى الأداة المركبة<br />
ويظهر لك على أدوات العنوان عدد الطلاب الكلي وعدد الناجحين وعدد<br />
الراسبين. للخروج انقر على زر خروج. انظر الشكل<br />
(١٢-٩)<br />
١١٢
خالد الجديع kal_judaia@hotmail.com<br />
الخطوة<br />
الشرح التفصيلي<br />
١- وضع<br />
الأداوت على<br />
النموذج<br />
ضع الأدوات كما هو موضح في شكل (٩-١١) وجدول الخصائص<br />
شكل ٩-١١ : ثلاثة أنواع من القوائم<br />
(١١-٩)<br />
٢- تعديل<br />
الخصائص<br />
المطلوبة أثناء<br />
التصميم<br />
غير خصائص الأدوات لتصبح مطابقة للجدول التالي انظر الشكل<br />
اسم الأداة الخاصية القيمة<br />
LblName<br />
الاسم<br />
lblSuccess<br />
عدد الناجحين<br />
lblFail<br />
عدد الراسبين<br />
lblAll<br />
عدد الطلاب<br />
Label5<br />
جميع الطلاب<br />
Label6<br />
الناجحون<br />
Label7<br />
Name Label1<br />
Text<br />
Name Label2<br />
Text<br />
Name Label3<br />
Text<br />
Name Label4<br />
Text<br />
Name Label5<br />
Text<br />
Name Label6<br />
Text<br />
Name Label7<br />
Text<br />
Name<br />
Text1<br />
Text<br />
Name Button1<br />
الراسبون<br />
txtName<br />
cmdAdd<br />
١١٣
خالد الجديع kal_judaia@hotmail.com<br />
اضافة<br />
cmdUpdate<br />
حذف<br />
CmdMove<br />
توزيع<br />
CmdExit<br />
خروج<br />
LstSuccess<br />
cboFail<br />
chsAll<br />
Right<br />
cmdAdd<br />
Moccasin<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Name<br />
Name<br />
RightToLeft<br />
AcceptButton<br />
BackColor<br />
Button2<br />
Button3<br />
Button4<br />
ListBox1<br />
ComboBox1<br />
CheckedListBox<br />
Form1<br />
.I<br />
٣- إضافة<br />
عنصر إلى<br />
قائمة مربع<br />
الخيار. ويقال<br />
فيه مثل ما<br />
قيل في إضافة<br />
عنصر إلى<br />
القائمة<br />
انقر مزدوج على زر إضافة.<br />
واكتب التالي<br />
If txtName.Text "" Then<br />
chsAll.Items.Add(txtName.Text)<br />
txtName.Focus()<br />
txtName.ResetText()<br />
Else<br />
MessageBox.Show(<br />
، "تنبيه<br />
"، "يجب كتابة اسم في مربع النص "<br />
MessageBox.OK)<br />
End If<br />
.II<br />
بعد التأكد من أن المستخدم أدخل اسما في مربع النص. نستخدم الدالة<br />
Add للإضافة للقائمة. بالطبع لابد أن تعطي هذه الدالة ما تريد إضافته. في مثالنا هذا<br />
نحن نريد إضافة الاسم الذي يدخله المستخدم في مربع النص لذلك أعطينا هذه الدالة<br />
الاسم الذي أدخله المستخدم وهو موجود في الخاصية<br />
Text<br />
chsAll.Items.Add(txtname.Text)<br />
١١٤
خالد الجديع kal_judaia@hotmail.com<br />
تحت<br />
.III<br />
If<br />
في حالة أن المستخدم لم يدخل اسم في مربع النص لن يتم تنفيذ مايندرج<br />
وسينفذ بدلا منه مابعد Else لذلك سوف تظهر رسالة للمستخدم تخبره أنه<br />
يجب أن يكتب اسم في مربع النص.<br />
٤- حذف<br />
.I<br />
عنصر<br />
القائمة<br />
من<br />
انقر مزدوج على زر حذف واكتب التالي<br />
Dim s As String<br />
If chsAll.SelectedIndex -1 Then<br />
s = " & chsAll.SelectedItem.ToString<br />
"هل أنت متأكد من حذف<br />
حذف" "تحذير<br />
If MessageBox.Show(s _ ، : ،<br />
MessageBox.YesNo + MessageBox.IconQuestion) _<br />
= DialogResult.Yes Then<br />
chsAll.Items.Remove(chsAll.SelectedIndex)<br />
End If<br />
End If<br />
.II<br />
.III<br />
نعرف متغير<br />
s من نوع نص لكي يحفظ نص<br />
بالإضافة إلى العنصر الذي يريد المستخدم حذفه.<br />
نتأكد من<br />
التحذير من الحذف<br />
أن هناك اسم مختار في القائمة وذلك بالتأكد من قيمة الخاصية<br />
chsAll.SelectedIndex فإذا كانت قيمتها<br />
١-<br />
.IV<br />
يختر شيئا.<br />
يتم في العبارة التالية دمج العنصر الذي اختاره المستخدم<br />
نص<br />
– مع الرسالة التحذيرية كما يلي<br />
:<br />
عرفنا أن المستخدم لم<br />
-بعد تحويله إلى<br />
s = " أنت متأكد من حذف "هل & chsAll.SelectedItem.ToString<br />
ومن ثم اظهار الرسالة للمستخدم<br />
.V<br />
يتم حذف العنصر من المجموعة وذلك باستخدام الدالة<br />
Remove وهذه<br />
الدالة تطلب رقم العنصر الذي نريد حذفه وكما ترى فقد أعطيناها<br />
chsAll.SelectedIndex وهو رقم العنصر المختار<br />
– المظلل-.<br />
١١٥
خالد الجديع kal_judaia@hotmail.com<br />
.I<br />
٥- توزيع<br />
الطلاب إلى<br />
ناجحين<br />
وراسبين.<br />
فالمربع الذي<br />
أمامه علامة<br />
X سوف<br />
يكون ناجحا<br />
وسيذهب إلى<br />
القائمة.<br />
انقر مزدوج على زر الأمر توزيع<br />
Dim i As Integer<br />
Dim intSuccess As Integer<br />
Dim intFail As Integer<br />
Dim intAll As Integer<br />
cboFail.Items.Clear()<br />
lstSuccess.Items.Clear()<br />
For i = 0 To (chsAll.Items.Count – 1)<br />
If chsAll.GetItemChecked(i) = True Then<br />
lstSuccess.Items.Add(chsall.Items(i))<br />
intSuccess = intSuccess + 1<br />
intAll = intAll + 1<br />
Else<br />
cboFail.Items.Add(chsall.Items(i))<br />
intFail = intFail + 1<br />
intAll = intAll + 1<br />
End If<br />
Next<br />
lblSuccess.Text = lblSuccess.Text & " = " & intSuccess<br />
lblFail.Text = lblFail.Text & " = " & intFail<br />
lblAll.Text = lblAll.Text & " = " & intAll<br />
I<br />
عرفنا أربعة متغيرات،<br />
أول هذه المتغيرات<br />
و الهدف منه أن يكون عداد<br />
.II<br />
في التكرار. intFail و intSuccess و intAll<br />
لنحتفظ<br />
بعدد الراسبين<br />
والناجحين<br />
والعدد الكلي للطلاب.<br />
.III نحذف جميع العناصر الموجودة في القائمة والأداة المركبة وذلك فيما لو<br />
كان هناك عناصر مسبقا.<br />
ويكون حذف جميع العناصر عن طريق<br />
.<br />
الخاصية clear<br />
.IV تبدأ عملية التكرار للتأكد من حالة العناصر فكل عنصر قد وضع امام<br />
مربعه<br />
فهو ناجح والعنصر الذي بخلاف ذلك راسب.<br />
لاحظ أن عداد<br />
التكرار ينتهي إلى<br />
– 1 chsAll.Items.Count يعني لو كان العدد الكلي<br />
للعناصر ستة فنهاية التكرار خمسة لكن لو لاحظت بدايته فهي من صفر<br />
معنى ذلك أنه ستكرر ست مرات.<br />
V. سوف يمكننا التكرار من المرور على جميع العناصر عنصر عنصر<br />
للتأكد من قيمتها<br />
If chsAll.GetItemChecked(i) = True Then<br />
لاحظ أن خاصية chsAll.GetItemChecked(i) هي التي تخبرنا هل العنصر<br />
True<br />
أمامه<br />
أو لا.<br />
فإذا كانت قيمة هذه الخاصية<br />
فهذا يدل أن أمامها علامة.<br />
١١٦
خالد الجديع kal_judaia@hotmail.com<br />
تنفيذ البرنامج<br />
طبعا تلاحظ أننا نمر على جميع العناصر لأن قيمة<br />
للعنصر الأخير.<br />
.VI<br />
I تزيد كل مره حتى نصل<br />
تتم عملية اضافة العناصر ذات العلامة إلى القائمة والتي ليس أمامها<br />
علامة إلى الأداة المركبة.<br />
كما تلاحظ إن كان أمام العنصر علامة أضفنا واحد إلى قيمة<br />
يكن أمامه علامة أضفنا واحد إلى قيمة<br />
قيمة<br />
intAll ثم نعرضها على أدوات العنوان.<br />
نفذ البرنامج حسب الخطوات التالية :<br />
intSuccess<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
وإن لم<br />
intFail وفي كلتا الحالتين نضيف واحد إلى<br />
أكتب في مربع النص خالد ثم انقر اضافة أو اضغط زر الرجوع.<br />
أكتب في مربع النص محمد ثم انقر اضافة أو اضغط زر الرجوع.<br />
أكتب في مربع النص أحمد ثم انقر اضافة أو اضغط زر الرجوع.<br />
أكتب في مربع النص عبدالرحمن ثم انقر اضافة أو اضغط زر الرجوع.<br />
أكتب في مربع النص عبداالله ثم انقر اضافة أو اضغط زر الرجوع.<br />
أكتب في مربع النص عمرثم انقر اضافة أو اضغط زر الرجوع<br />
حتى الآن لاحظ أن الاسماء التي كتبتها تضاف إلى القائمة إما بضغط زر الرجوع أو<br />
النقر على اضافة<br />
-٧<br />
-٨<br />
-٩<br />
-١٠<br />
انقر مره واحده على اسم محمد ولاحظ أنه تظلل.<br />
انقر على المربع الذي على يمين محمد ولاحظ ظهور العلامة .<br />
كرر الخطوتين السابقتين بالنسبة لعبدالرحمن وعمر.<br />
يجب أن يظهر لك شكل<br />
. (١٢-٩)<br />
-١١<br />
شكل ١٢-٩ :<br />
انقر زر خروج لأنهاء البرنامج.<br />
استخدام القائم الثلاث<br />
١١٧
خالد الجديع kal_judaia@hotmail.com<br />
-١<br />
التعامل بشكل جيد مع النموذج<br />
لقد حصل تغير في طريقة التعامل مع النموذج بين الاصدار السادس و الدوت نت. سوف نحاول<br />
أن نتكلم عن أبرز مايهم المستفيد عند تعامله مع النموذج من خلال أمثلة تقرب الفكرة.<br />
كيفية فتح نموذج : قم بإضافة نموذج إلى المشروع ليكن اسمه<br />
ثاني و ليكن اسمه<br />
Form1 ثم<br />
.Form2<br />
أضف نموذج<br />
ارجع إلى النموذج الأول و أضف زر أمر إلى النموذج.<br />
انقر مزدوجا على زر الأمر لتنتقل إلى الكود الخاص بحدث النقر الخاص بالنموذج و<br />
اكتب الكود التالي<br />
:<br />
Private Sub Button1_Click(ByVal Sender As Object, ByVal e As EventArgs)<br />
Handles Button1.Click<br />
Dim frm2 As New Form2()<br />
frm2.Show()<br />
End Sub<br />
في الكود السابق قمنا بما يلي<br />
:<br />
.I<br />
تعريف متغير من نوع<br />
.Form2<br />
.II<br />
عرض نموذج<br />
.Form2<br />
.III<br />
حاول تشغيل المثال و انقر على زر الأمر ولاحظ أنه يفتح نموذج عند كل نقره..<br />
٢-منع عرض النموذج أكثر من مره :<br />
عرض لك نفس النموذج،<br />
المستخدم على زر الأمر. الكود التالي يوضح لك الفكرة<br />
:<br />
لاحظت في المثال السابق أنه كلما نقرت على زر الأمر<br />
ماذا لو أردت أن يتم عرض النموذج مره واحدة فقط مهما نقر<br />
Private frm2 As Form2<br />
Private Sub Button1_Click(ByVal Sender As Object, ByVal e As<br />
EventArgs) Handles Button1.Click<br />
If IsNothing(frm2) = False Then<br />
If frm2.IsDisposed = False Then<br />
Else<br />
frm2 = New Form2()<br />
frm2.Show()<br />
End If<br />
Else<br />
frm2 = New Form2()<br />
frm2.Show()<br />
End If<br />
End Sub
خالد الجديع kal_judaia@hotmail.com<br />
في الكود السابق قمنا بالخطوات التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
عرفنا متغير من نوع<br />
،Form2<br />
فقط تعريف بدون إنشاء نسخة منه<br />
قمنا بالتأكد من أن نموذج٢ غير موجود اطلاقا من خلال عبارة<br />
ثم تأكدنا من أنه مهلك من خلال عبارة<br />
.Instance<br />
.Isnothing<br />
.Isdisposed<br />
بعد ذلك إذا انتفت الشروط السابقة نقوم بعرضه.<br />
-٣<br />
إرسال المتغيرات بين النماذج<br />
قد تريد أن تعين قيمة لمتغير في نموذج و تسترجعها في نموذج آخر. يوجد عدة طرق لإرسال<br />
متغير بين نموذجين منها تعريف المتغير على أنه متغير عام في Module ومنها الطريقة التالية<br />
التي سنوضحها من خلال الكود التالي<br />
:<br />
:<br />
هذا الكود يجب أن يكون في Form1 وهو تعريف للمتغير و يجب أن يكون على مستوى النموذج<br />
Public PassingVar As String<br />
الكود التالي يكون في نموذج Form2 لإعطاء قيمة للمتغير الذي عرفناه في نموذج١:<br />
Dim myForm As Form1<br />
myForm.myVar = "<br />
"<br />
هذه القيمة تم تعيينها في نموذج٢<br />
-٤<br />
تغيير موقع النموذج في الشاشة<br />
لتغيير موقع النموذج في الشاشة استخدم خاصية<br />
النموذج.<br />
DesktopLocation<br />
وهي أحد خصائص<br />
فإذا أردت نقل النموذج إلى الجزء العلوي الشمالي من الشاشة استخدم المثال التالي<br />
:<br />
Me.DesktopLocation = New Point(0, 0)
خالد الجديع kal_judaia@hotmail.com<br />
إنشاء القوائم<br />
يعتبر استخدام القوائم معيارا اساسيا في كثير من الأنظمة. من أهم فوائد القوائم هي تنظيم و<br />
تسهيل الوصول إلى وظائف النظام المختلفة. توفر لنا بيئة الدوت نت طريقة سهلة جدا لإنشاء<br />
النظام. في بيئة الدوت نت انتقلت القوائم لتصبح أداة مثل الأدوات الأخرى تستطيع إضافتها من<br />
مربع الأدوات عن طريق السحب و الافلات كما ترى من الشكل<br />
.(١-١١)<br />
شكل ١-١١ :<br />
أداة القوائم<br />
تتكون القائمة من عدة قوائم فرعية كل واحد من هذه القوائم الفرعية يمكن أن ينفذ أمرا ما مثل<br />
استدعاء نموذج آخر. سوف نقوم بتصميم قائمة كما يظهر لك من الشكل(٢-١١).<br />
شكل ٢-١١ :<br />
تصميم القوائم في بيئة الدوت نت<br />
لتصميم القوائم اتبع الخطوات التالية<br />
:<br />
-١<br />
أضف أداة القوائم و ذلك بسحبها و افلاتها في النموذج أو بالنقر المزدوج عليها ليظهر لك<br />
(١١-٣) الشكل<br />
شكل ١١-٣: بعد إضافة أداة القائم للنموذج
خالد الجديع kal_judaia@hotmail.com<br />
انقر<br />
المربع الصغير الذي ظهر لك مرة واحدة واكتب كلمة ملف كما يظهر من<br />
الشكل(٤-١١)<br />
-٢<br />
شكل ١١-٤ : طريقة إضافة قائمة رئيسية أو فرعية<br />
سوف يظهر لك مربعان آخران أحدهما على اليمين و الآخر إلى أسفل. يمثل هذا<br />
المربعان مكانان لكتابة اسم القائمة الأخرى. قم بالنقر على القائمة اليمنى واكتب مساعدة<br />
كما ترى من الشكل(٥-١١).<br />
-٣<br />
شكل ١١-٥ : ظهور قائمة فرعية و أخرى رئيسية عند إضافة قائمة رئيسية<br />
-٤<br />
-٥<br />
أكمل بقية القوائم ثم ضع قائمة فرعية للمساعدة تظهر عنوان البرنامج.<br />
اذهب إلى القائمة الفرعية لقائمة ملف و انقر مزدوجا عليها لكي تنتقل إلى الحدث الخاص<br />
بنقرها ثم اكتب الكود التالي<br />
Dim frm2 As New Form2()<br />
frm2.Show()<br />
:<br />
لاحظ أن هذا الكود يفترض أن هناك نموذجا آخر اسمه<br />
القائمة الفرعية فتح نموذج٢ ثم انقر عليها ليتم فتح هذا النموذج.<br />
. Form2<br />
شغل النظام ثم اختر
خالد الجديع kal_judaia@hotmail.com<br />
أداة التوقيت<br />
Timer<br />
تستخدم أداة التوقيت لتنفيذ عمل ما كل فترة زمنية أو عند وقت معين.<br />
تعمل نسخ احتياطي للملفات كل يوم فإن أداة التوقيت ستكون خيار جيد.<br />
الأداة هي خاصية<br />
Interval و<br />
فإذا أردت مثلا أن<br />
أهم خصائص هذه<br />
تمثل الفترة بالملي ثانية (Millisecond) لدقات الوقت.<br />
بكتابة الكود الذي تريد تنفيذه كل فترة من الزمن داخل الحدث<br />
الأداة.<br />
لبدء المؤقت استخدم الطريقة<br />
هذه الأداة فاستخدم الطريقة<br />
برنامج الساعة<br />
أداة عنوان<br />
.Stop<br />
Start وهي أحد طرق أداة التوقيت،<br />
في هذا البرنامج سوف نقوم ببناء برنامج يمثل ساعة.<br />
و أداة توقيت،<br />
قم<br />
Tick() و هو أهم أحداث هذه<br />
أما إذا أردت إيقاف<br />
سوف يكون لدينا زر أمر و<br />
عند النقر على زر الأمر سوف يتم تشغيل أداة التوقيت و التي<br />
ستقوم بعرض الساعة على أداة العنوان. أضف الأدوات التي تظهر في الشكل<br />
شكل ١١-٦ : تصميم برنامج الساعة<br />
(٦-١١)<br />
أعط الأدوات الخصائص التالية<br />
:<br />
-١<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdStartStop<br />
تشغيل الساعة<br />
lblClock<br />
Timer1<br />
1000<br />
برنامج الساعة<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Interval<br />
Text<br />
Button1<br />
Label1<br />
Timer<br />
Timer<br />
Form
خالد الجديع kal_judaia@hotmail.com<br />
لاحظ أن قيمة خاصية Interval هي<br />
١٠٠٠ ملي ثانية و يساوي ثانية واحدة وهو ما<br />
يعني أن الكود داخل الحدث Tick سيتم<br />
تنفيذه كل ثانية.<br />
-٢<br />
قم بالنقر المزدوج على زر الأمر و أضف الكود التالي<br />
يقوم هذا الكود بتشغيل أو إيقاف أداة التوقيت،<br />
If Not Timer1.Enabled Then<br />
Timer1.Start()<br />
End If<br />
"الساعة إيقاف" = Button1.Text<br />
Else<br />
Timer1.Stop()<br />
:<br />
"الساعة تشغيل" = Button1.Text<br />
لاحظ أنه يقوم بالتأكد من تشغيل أداة التوقيت<br />
Stop<br />
Start<br />
أو إيقافها من خلال الخاصية Enabled<br />
ثم يستخدم الطريقة<br />
للتشغيل و<br />
للإيقاف.<br />
٣-ارجع إلى شاشة مصمم النماذج ثم انقر مزدوجا على أداة التوقيت،<br />
سوف تنتقل إلى الحدث<br />
Tick وهو أحد أحداث هذه الأداة. اكتب الكود التالي<br />
Label1.Text = الساعة" = " & TimeString<br />
:<br />
في هذا الكود نقوم بعرض الوقت الحالي على أداة العنوان،<br />
و نظرا لأن<br />
الحدث<br />
Tick يتم<br />
تنفيذه كل ثانية فإنه سوف يتم عرض الساعة على أداة العنوان كل ثانية مما يعني أنك سوف<br />
تشاهد ساعة كما يظهر من الشكل(٧-١١)<br />
شكل ١١-٧ : تنفيذ برنامج الساعة
خالد الجديع kal_judaia@hotmail.com<br />
أداة الوقت و التاريخ<br />
DateTimePicker<br />
تستخدم هذه الأداة لعرض الوقت بشكل جميل على شكل تقويم آما تقوم بحفظ التاريخ الذي تم<br />
اختياره من قبل المستخدم. أهم خصائص هذه الأداة هي<br />
:<br />
الخاصية<br />
الشرح<br />
أقل قيمة يمكن اختيارها من التقويم.<br />
أآبر قيمة يمكن اختيارها من التقويم.<br />
إذا أردت عرض مربع اختيار في الأداة.<br />
التاريخ الذي تم اختيار.<br />
MinDate<br />
MaxDate<br />
ShowCheckBox<br />
Value<br />
: الكود التالي<br />
أضف زر أمر و أداة الوقت و التاريخ.<br />
أنقر مزدوجا على زر الأمر ثم اكتب<br />
DateTimePicker1.MinDate = New DateTime(1985, 6, 20)<br />
DateTimePicker1.MaxDate = DateTime.Today<br />
DateTimePicker1.ShowCheckBox = True<br />
MessageBox.Show(DateTimePicker1.Value)<br />
لاحظ أننا عينا قيمة دنيا و عليا لأداة الوقت و التاريخ فلو حاولت اختيار أي تاريخ يتجاوز<br />
هاتين القيمتين فلن تسمح لك الأداة انظر شكل<br />
.(٨-١١)<br />
شكل ٨-١١ :<br />
أداة الوقت و التاريخ
خالد الجديع kal_judaia@hotmail.com<br />
أدوات الحوار العامة<br />
تقدم لنا بيئة الدوت نت ست أدوات للحوار العام وهي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
أداة الحوار لفتح الملفات.<br />
أداة الحوار لتغيير الخط.<br />
أداة الحوار لتغيير اللون.<br />
أداة الحوار لحفظ الملفات.<br />
أداة الحوار لإعداد الصفحة.<br />
أداة الحوار للطباعة.<br />
تتشابه بعض هذه الأدوات فيما بينها بطريقة التعامل معها فبمجرد أن تتعامل مع واحدة من هذه<br />
الأدوات حتى يصبح التعامل مع باقي الأدوات مجرد وقت. سوف نتعرض لأول ثلاث أدوات<br />
ونترك الثلاث الباقية لك.<br />
أداة الحوار لفتح الملفات<br />
تقوم هذه الأداة بعرض مربع الحوار الخاص بفتح الملفات كما تحوي هذه الأداة على مجموعة من<br />
الخصائص و الطرق جعلت التعامل معها سهلا، يذكر أنه حصل تطور كبير بين هذه الأداة في<br />
الاصدار السادس و في بيئة الدوت نت.<br />
Picturebox كما<br />
:<br />
في هذا المثال قم بإضافة أداة الحوار لفتح الملفات و أداة صورة<br />
يظهر من الخصائص التالية<br />
اسم الأداة الخاصية<br />
القيمة<br />
cmdOpenPicture<br />
Name Button1<br />
Text<br />
Name Picturebox<br />
Name OpenFileDialog<br />
فتح صورة<br />
pb<br />
ofd
خالد الجديع kal_judaia@hotmail.com<br />
انقر مزدوجا على زر الأمر ثم أضف الكود التالي :<br />
With ofd<br />
End With<br />
.CheckFileExists = True<br />
.ShowReadOnly = False<br />
.Filter = "All Files|*.*|Bitmap Files (*)|*.bmp;*.jpg"<br />
.FilterIndex = 1<br />
If .ShowDialog = DialogResult.OK Then<br />
pb.Image = Image.FromFile(.FileName)<br />
End If<br />
في الكود السابق قمنا بالخطوات التالية<br />
:<br />
-١<br />
-٢<br />
استخدم عبارة With حتى لانعيد كتابة اسم أداة الحوار كل مرة.<br />
استخدمنا خاصية التأكد من وجود الملف قبل فتحه<br />
.<br />
-٣<br />
-٤<br />
منعنا إظهار الملفات التي للقراءة.<br />
حددنا أنواع الملفات التي ستظهر في مربع الحوار وهي<br />
Jpg وكل الملفات في حالة اختيار<br />
الملفات التي من نوع<br />
Bmp و<br />
.All Files<br />
-٥<br />
إذا اختار المستفيد<br />
أداة الصورة.<br />
Ok من مربع الحوار سوف نقوم بعرض الصورة التي اختارها على<br />
انظر الشكل(٩-١١) بعد التشغيل و النقر على زر فتح الصورة<br />
التالية:<br />
الملف مثل<br />
تتم عملية<br />
ترشيح نوع الملفات التي تريد<br />
الاسم الذي تريد أن يظهر وهو في حالتنا<br />
في<br />
Bmp ثم تبدأ ترشيح آخر بنفس الطريقة.<br />
شكل ١١-٩ : اختيار ملف من نافذة الحوار<br />
File Of Type لمربع الحوار بالطريقة<br />
File Name ثم علامة |<br />
ثم نوع . ثم * ثم
خالد الجديع kal_judaia@hotmail.com<br />
أداة الحوار لتغيير الخط<br />
تستخدم هذه الأداة لتغيير الخط المكتوب على أداة ما، فإذا أردت تغيير الخط الموجود على<br />
مربع نص أو زر أمر فاستعمل هذه الأداة لتغيير الخط وذلك بتعيين خاصية الخط في الأداة<br />
التي تريد أن تغيير خطها إلى الخط الذي تم اختياره في أداة حوار الخط. أنت خبير بأنك<br />
عندما تغير خط النموذج فإن ذلك يؤدي إلى تغيير خط كل الأدوات على هذا النموذج.<br />
قم بإضافة أداة عنوان و زر أمر و أداة حوار الخط ثم انقر مزدوجا على مربع<br />
النص و اكتب الكود التالي<br />
With FontDialog1<br />
.ShowApply = True<br />
If .ShowDialog = DialogResult.OK Then<br />
Button1.Font = .Font<br />
Label1.Font = .Font<br />
End If<br />
End With<br />
:<br />
في الكود السابق قمنا بما يلي<br />
:<br />
-١<br />
-٢<br />
تفعيل خاصية ShowApply مما يؤدي إلى إظهار Apply في مربع حوار الخط.<br />
التأكد أن المستفيد نقر زر<br />
.Ok<br />
-٣<br />
تغيير خط أداة العنوان و زر الأمر بالخط الذي اختاره المستفيد<br />
شكل١٠-١١ : اختيار مواصفات الخط
خالد الجديع kal_judaia@hotmail.com<br />
أداة الحوار لتغيير اللون<br />
لا تختلف أداة حوار الألوان عن قرينتها السابقة أداة حوار الخط. تستخدم هذه الأداة لتغيير<br />
خاصية اللون لأداة ما، فعلى سبيل المثال أداة مربع النص يوجد لها خاصيتين تتعلقان<br />
بالألوان، الأولى هي خاصية ForColor و الثانية هي خاصية<br />
خلال أداة حوار الألوان تغيير أيا من هاتين الخاصيتين.<br />
.BackColor<br />
تستطيع من<br />
:<br />
اسم الأداة<br />
قم بإضافة الأدوات التالية و أعطها الخصائص كما في الجدول<br />
الخاصية القيمة<br />
cmdChangeColor<br />
Name<br />
Text<br />
Name<br />
Name<br />
تغيير الألوان<br />
Label1<br />
ColorDialog1<br />
Button1<br />
Label1<br />
ColorDialog<br />
انقر مزدوجا على زر الأمر و اكتب الكود التالي<br />
الشكل(١١-١١):<br />
ثم نفذ البرنامج وانقر زر الأمر لترى<br />
With ColorDialog1<br />
.SolidColorOnly = True<br />
If .ShowDialog = DialogResult.OK Then<br />
Button1.BackColor = .Color<br />
Label1.ForeColor = .color<br />
End If<br />
End With<br />
شكل ١١-١١ : اختيار مواصفات اللون
خالد الجديع kal_judaia@hotmail.com<br />
تقييد مدخلات المستفيد<br />
يمكن تعريف عملية تدقيق البيانات بأنها التحقق من صحة المستفيد و مطابقة هذه المدخلات<br />
لقواعد و إجراءات العمل. لذا يجدر بنا أن نتكلم عن أقسام تدقيق البيانات<br />
:<br />
-١<br />
تدقيق البيانات بما لا يتطلب الرجوع إلى قاعدة البيانات<br />
التدقيق بالتدقيق النموذجي للبيانات<br />
:<br />
،-Front End Validation–<br />
يمكن تسمية هذا النوع من<br />
في هذا النوع من<br />
التدقيق لا تحتاج الوصول إلى قاعدة البيانات لمعرفة دقة و صحة البيانات التي يقوم<br />
المستفيد بإدخالها. ومن أمثلة هذا النوع<br />
:<br />
•<br />
•<br />
التأكد من عدم إدخال قيمة سالبة لحقل لا يقبل إلا قيمة موجبة.<br />
التأكد من عدم تجاوز الطول المحدد لحقل ما.<br />
لاحظ أن كلا المثالين السابقين لا يتطلب أي رجوع إلى قاعدة البيانات لذا يتم بناء هذا<br />
النوع من التدقيق في واجهات المستفيد.<br />
-٢<br />
تدقيق البيانات الذي يوجب الرجوع إلى قاعدة البيانات<br />
التدقيق بالتدقيق الخلفي للبيانات<br />
:<br />
،-Back End Validation–<br />
يمكن تسمية هذا النوع من<br />
في هذا النوع من التدقيق<br />
يتوجب الرجوع إلى قواعد البيانات و التأكد من مدخلات المستفيد قبل تنفيذ العملية<br />
المطلوبة حتى لا يتم مخالفة قواعد و إجراءات العمل.<br />
من الأمثلة على هذا النوع<br />
:<br />
•<br />
•<br />
عند إدخال إجازة جديدة لموظف يجب التأكد من أن هذا الموظف لم يستنفذ رصيده<br />
من الأجازات،<br />
لا يمكن عمل هذا التدقيق إلا بعد الرجوع إلى قواعد البيانات ثم<br />
حساب الأجازات التي سبق أن أخذها الموظف.<br />
مثال آخر ماذا لو أردنا أن نصرف مادة من مستودع<br />
قبل صرفها.<br />
،<br />
يجب التأكد من رصيد المادة<br />
في المثالين السابقين لابد من الرجوع إلى قواعد البيانات لتطبيق تلك التدقيقات.<br />
120
و أ<br />
خالد الجديع kal_judaia@hotmail.com<br />
إرشادات لتدقيق مدخلات المستفيد<br />
التدقيق النموذجي للبيانات<br />
توجد بعض الإرشادات العامة عند التدقيق النموذجي للبيانات وهي<br />
:<br />
•<br />
•<br />
•<br />
•<br />
امنع المستفيد من<br />
ذلك.<br />
إدخال بيانات غير صحيحة إن أمكن مثل استخدام القوائم كلما أمكن<br />
أرشد المستفيد أثناء عملية إدخال البيانات إلى اسم الحقل الذي يحمل الخطأ معيدا إليه<br />
المؤشر.<br />
امنح المرونة للمستفيد على<br />
يعتمد على آخر.<br />
إدخال البيانات بالترتيب الذي يريده هو ما لم يكن هناك حقل<br />
خذ بعين الاعتبار كل أنواع التدقيق و قواعد العمل أثناء عملية تحليل و تصميم النظام.<br />
التدقيق الذاتي للأدوات<br />
بما أننا في النوع الأول من أنواع التدقيق وهو التدقيق النموذجي فإن جزء من تطبيق هذا النوع<br />
يعتمد على الأدوات المستخدمة في النموذج،<br />
التدقيق.<br />
يمكن تعريف<br />
التدقيق الذاتي<br />
للأدوات بأنه<br />
الجدول التالي يوضح بعض الأمثلة على التدقيق الذاتي للأدوات :<br />
الكائن<br />
أسلوب التدقيق<br />
مربع النص تحديد أو تعديل البيانات المدخلة .<br />
مربع الاختيار حصر القيم باختيار عدمه .<br />
زر الاختيار اختيار قيمة واحدة .<br />
القائمة تقدم مجموعة من البيانات الصحيحة .<br />
أداة التاريخ حصر المدخلات بالتاريخ .<br />
بعض الأدوات في بيئة الدوت نت تساعدك في إجراء<br />
التدقيق الذي يتوفر لكل أداة من خلال خصائصها.<br />
121
خالد الجديع kal_judaia@hotmail.com<br />
التدقيق الذاتي في مربع النص<br />
يمكن إجراء التطبيق الذاتي في مربع النص باستخدام مجموعة الخصائص وهي<br />
:<br />
: PasswordChar<br />
-١<br />
تمكنك هذه الخاصية<br />
من<br />
الكلمات المدخلة إلى مربع النص كما يتضح من الشكل(١-١٠).<br />
شكل ١٠-1 : استخدام خاصية PasswordChar<br />
تغيير شكل المدخلات إلى رموز تحجب<br />
: MaxLength -٢<br />
تستخدم لإعطاء حد أقصى لعدد الحروف المدخلة إلى مربع النص. عند<br />
محاولة تخطي العدد الأقصى فإن مربع النص لن يسمح لك بالكتابة وسوف تسمع نغمة<br />
بيب إن حاولت الزيادة على الحد الأقصى.<br />
: ReadOnly -٣<br />
تستخدم هذه الخاصية لمنع المستفيد من إدخال أي نص إلى مربع النص<br />
قم بإعمال هذه الخاصية. في هذه الحالة يستطيع المستفيد رؤية ما هو مكتوب في مربع<br />
النص لكن لن يستطيع تغيير النص.<br />
: CharcterCasing -٤<br />
تستخدم للتحويل الآلي بين حالات الحروف – صغير أو كبير<br />
– قد<br />
يكون من المفيد استخدامها في الكلمة السرية إذا كانت كلمة السر عبارة عن حروف<br />
صغيرة.<br />
كيف تستخدم كائن مزود الأخطاء<br />
يستخدم كائن مزود الأخطاء ErrorProvider لتنبيه المستفيد إلى الأخطاء وطرق إصلاحها.<br />
يتميز عن مربع الرسالة بأنه لا يفتح نافذة أخرى للمستفيد كما أنه يظل موجودا أمام عين<br />
المستفيد حتى يصلح الخطأ وهو مالا يتوفر في مربع الرسالة. إذا أضفت أداة واحدة من مزود<br />
الأخطاء فإنها تكفيك لكل التدقيقات في النموذج. أهم طريقة لهذه الأداة هي<br />
و التي تستخدم لبيان الأخطاء.<br />
SetError<br />
122
خالد الجديع kal_judaia@hotmail.com<br />
كما يظهر من الشكل<br />
قم بإضافة نموذج وأضف فيه الأدوات حسب الخصائص الموجودة في الجدول<br />
و<br />
(٢-١٠)<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdValidate<br />
تدقيق البيانات<br />
Textbox1<br />
Label1<br />
er<br />
frmErrorTest<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Name<br />
Button1<br />
Textbox<br />
Label1<br />
ErrorProvider<br />
Form<br />
شكل ١٠-٣ : ظهور رسالة تنبيه من مزود الأخطاء<br />
شكل : ٢-١٠<br />
قم بكتابة الكود التالي داخل حدث النقر الخاص بزر الأمر :<br />
If Trim(TextBox1.Text) = "" Then<br />
("قيمة إدخال يرجى" er.SetError(TextBox1,<br />
Else<br />
er.SetError(TextBox1, "")<br />
End If<br />
في الكود السابق نقوم بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
نتأكد هل أدخل المستفيد نصا في مربع النص أم لا.<br />
نقوم بإظهار رسالة خطأ من خلال مزود الأخطاء و الذي اسمه .er رسالة الخطأ سوف<br />
تظهر عند مرور الفأرة على مزود الخطأ كما ترى من الشكل (١٠-٣).<br />
إذا أدخل المستفيد نصا نقوم بإزالة رسالة الخطأ.<br />
123
خالد الجديع kal_judaia@hotmail.com<br />
تدقيق البيانات بجملة واحدة<br />
إذا أردت القيام بإجبار المستفيد بإدخال بيانات في كل الأدوات من نوع مربع نص بدون أن<br />
تتأكد من كل أداة على حدة فإليك هذا المثال الذي يوفر لك الوقت و الجهد<br />
:<br />
Dim ControlVar As Control<br />
For Each ControlVar In Me.Controls<br />
If TypeOf ControlVar Is TextBox Then<br />
If Trim(ControlVar.Text) = "" Then<br />
("يرجى إدخال البيانات" erReq.SetError(ControlVar,<br />
Else<br />
erReq.SetError(ControlVar, "")<br />
End If<br />
End If<br />
Next<br />
في الكود السابق قمنا بما يلي :<br />
عرفنا متغير من .<br />
نوع أداة<br />
-١<br />
٢- قمنا بالمرور على كل الأدوات داخل النموذج من خلال تكرار فإذا كان نوع الأداة مربع<br />
نص نقوم بالتأكد هل يوجد فيها نص أم لا،<br />
فإذا لم يكن بها نص نقوم بإظهار رسالة خطأ<br />
من خلال مزود الأخطاء.<br />
124
خالد الجديع kal_judaia@hotmail.com<br />
المتغيرات و الثوابت في بيئة الدوت نت<br />
يمكن تعريف المتغير بأنه ما يمكن أن يحمل قيما متنوعة أثناء عمل النظام و من ثم يسهل تعريف<br />
الثابت بأنه ما يحمل قيمة واحدة تسند إليه عند تعريفه ولا يمكن تغيير هذه القيمة بعد ذلك. تختلف<br />
طريقة تعريف المتغيرات عن طريقة تعريف الثوابت في بيئة الدوت نت. كل متغير في بيئة<br />
الدوت نت له مجال، بعد تعدي هذا المجال يفقد المتغير قيمته لذا من الضروري معرفة مجال<br />
المتغير أو ما يسمى بفترة حياة المتغيرات.<br />
تعريف المتغير في بيئة الدوت نت<br />
يمكنك تعريف المتغير الجديد في بيئة Visual Basic .NET باستخدام عبارة . Dim<br />
كما يلي :<br />
Dim Variable as DataType<br />
هناك أربعة أجزاء لعبارة تعريف المتغيرات :<br />
-٢<br />
-٣<br />
-٤<br />
١- Dim و تمثل مجال المتغير وسوف نتكلم عن مجالات المتغيرات بالتفصيل.<br />
Variable تمثل اسم تقوم أنت بإعطائه للمتغير.<br />
As وهي كلمة محجوزة لا يمكنك تغييرها.<br />
DataType و يمثل نوع المتغير سواء حروف أو أرقام أو تاريخ أو غيره.<br />
Address،<br />
على سبيل المثال ,الجملة التالية تقوم بتعريف متغيران Phone<br />
Dim Phone As Integer<br />
Dim Address<br />
44
خالد الجديع kal_judaia@hotmail.com<br />
في السطر<br />
متغير وهو<br />
الأول قمنا بتعريف متغير اسمه<br />
Address لكننا لم نذكر نوعه<br />
غير مثاليا في الظروف الاعتيادية لعدة أسباب<br />
:<br />
-١<br />
-٢<br />
-٣<br />
عدم القدرة على تمييز نوع المتغير.<br />
قد تحصل أخطاء غير مقصودة مثل<br />
ما قد يسبب خللا في أداء النظام.<br />
Phone من نوع رقم صحيح ثم<br />
–سيأتي لاحقا أنواع المتغيرات-<br />
استخدام غير مثالي للذاكرة مما يسبب بطأ في تنفيذ النظام.<br />
عند عدم تحديد نوع المتغير فإن نوع المتغير يمث ّل نوع كائن<br />
لاحظ أننا عرفنا<br />
وهو ما يعتبر حلا<br />
إسناد متغير من نوع إلى متغير من نوع آخر وهو<br />
، Object<br />
هذا النوع<br />
يمكن أن يمث ّل أي نوع من أنواع البيانات في بيئة الدوت نت .سواء نوع الحروف (String)<br />
أو الأعداد الصحيحة (Integer) أو أي أنواع أخرى.<br />
عندما تستخدم المتغير من غير ذكر نوعه فإن النوع المناسب يتحدد في وقت تنفيذ البرنامج<br />
(run-time).<br />
يمثل الجدول التالي بعض أنواع البيانات في بيئة الدوت نت و الحجم التخزيني لكل نوع و<br />
القيم المسموح بها لكل نوع.<br />
القيم المسموح بها<br />
المساحة التخزينية نوع البيانات<br />
صحيحة (True) خاطئة(False) Boolean 4 bytes<br />
يمثل عدد بين ٠ و ) ٢٥٥ ( byte Byte 1<br />
قيم موجبة فقط<br />
يمثل حرف واحد فقط Char 2 bytes<br />
قيم تبدأ من ١-١-١ م إلى ٣١-ديسمبر-٩٩٩٩ DateTime 8 bytes<br />
Decimal 12 bytes ٠<br />
يمثل الأرقام العشرية ) ١٦<br />
(79,228,162,514,264,337,593,543,950,335<br />
byte-وهي من<br />
الى موجب أو سالب<br />
من - 2,147,483,648 إلى Int32 4 bytes 2,147,483,647<br />
من 9,223,372,036,854,775,808- إلى Int64 8 bytes 9,223,372,036,854,775,807<br />
أي نوع يمكن أن يخزن داخل هذا النوع Object 4 bytes<br />
من - 32,768 إلى Int16 2 bytes 32,767<br />
يمثل قيمة حرفية تتسع إلى ٢ بليون حرف<br />
String 10 bytes + (2<br />
(طول السلسلة *<br />
45
خالد الجديع kal_judaia@hotmail.com<br />
لاحظ ظهور بعض الأنواع الجديدة في بيئة الدوت نت مثل int32<br />
لمحة عن بعض أنواع البيانات<br />
سوف نرى ثلاثة من أنواع البيانات و ماذا حدث لها في بيئة الدوت نت.<br />
int16 و<br />
الأعداد الصحيحة Integer<br />
Int32 و int16 و int64 و<br />
Dim Phone As Integer<br />
Dim Phone As Int32<br />
كما سبق و رأيت يوجد عدة أنواع من الأعداد الصحيحة فهناك<br />
غيرها من الأنواع. التعريفان التاليان يعتبران متساويان<br />
عند تعريفك لمتغير على أنه من نوع Integer فإنه سوف يتم ترجمته إلى<br />
.int32<br />
و .Int64 int16<br />
وهو ما يعني أن النوع<br />
لاحظ أن عمليات Int32 أسرع بكثير من عمليات<br />
int32 في بيئة الدوت نت يعتبر أكثر أنواع الأعداد الصحيحة فعالية. عند تحويلك لنظام كتب<br />
بلغة الإصدار السادس إلى بيئة الدوت نت قم بتغيير كل أنواع<br />
نظام أكثر فعالية.<br />
إلى Int32 Long<br />
لتحصل على<br />
السلاسل String<br />
تم استبدال كل الدوال التي تتعامل مع السلاسل و التي كانت موجودة بالاصدار السادس مثل<br />
Left,Right,Mid<br />
الخاص بالتعامل مع السلاسل الحرفية.<br />
النوع المتعدد<br />
بوظائف جديدة تندرج تحت الفئة<br />
. System.Class<br />
Variant<br />
كان هذا النوع يخدم في بيئة الدوت نت كنوع بيانات عام<br />
.<br />
ارجع إلى الفصل<br />
في بيئة الدوت نت لم يعد هذا النوع<br />
موجودا فقد تم استبداله بنوع Object ليؤدي نفس المهام و ليخدم كنوع بيانات عام<br />
46
خالد الجديع kal_judaia@hotmail.com<br />
فترة حياة المتغير :<br />
يمكن تعريف فترة حياة المتغير بأنها الفترة التي يظل فيها المتغير محتفظا بقيمته.<br />
من المهم جدا أن تحدد لكل متغير فترة حياته حتى يتسنى لك تعريفه في المجال المناسب له<br />
ولعلنا نذكر مثالين لمشكلتين تحصلان عند عدم الدقة في تحديد مجال المتغير<br />
:<br />
-٢<br />
١- ضياع قيم المتغيرات مما يؤدي إلى عدم أداء النظام للمهام المطلوبة منه، فعلى سبيل<br />
المثال لو عرفت متغيرا على أنه متغير على مستوى الاجراء و أردت أن تستخدمه في<br />
مكان ما خارج المتغير فإنك لن تجد قيمة هذا المتغير.<br />
تضييع موارد الذاكرة<br />
:<br />
قد تأتي فكرة إلى شخص ما بتعريف كل المتغيرات تعريفا عاما<br />
على مستوى النظام حتى يتخلص من التفكير بمجال كل متغير، هذه الفكرة مريحة لكنها<br />
ضارة لأن المتغيرات العامة تستهلك موارد من الذاكرة.<br />
يوجد خمسة أنواع من الفترات<br />
:<br />
١- الفترة التي تبدأ عند بدء تشغيل الحل وتنتهي بنهايته و هي المتغيرات العامة.<br />
٢- فترة تبدأ عند تشغيل مشروع ما و تشمل كل ما يندرج تحت هذا المشروع من أنظمة<br />
تطبيقية و نماذج و غيرها.<br />
٣- فترة تبدأ عند تشغيل نموذج و هي المتغيرات العامة على مستوى النموذج أو من نوع<br />
Static في<br />
-٤<br />
إجراء ما داخل النموذج.<br />
فترة تبدأ عند تنفيذ الإجراء و تنتهي قيم المتغير بانتهاء تنفيذ الإجراء وهي المتغيرات<br />
المحلية داخل الإجراء.<br />
٥- فترة تبدأ عند تنفيذ مقطع من كود و تنتهي بنهايته و هي المتغيرات المحلية على<br />
مستوى هذا المقطع.<br />
-١<br />
مجال المتغيرات<br />
بعد تحديد الفترة التي تريد أن يبقى فيها المتغير محتفظا بقيمته تأتي مرحلة تحديد مجال هذا<br />
المتغير في بيئة الدوت نت.<br />
المتغيرات العامة تعرف بكلمة Public و تكون عامة لكل المشاريع داخل الحل.<br />
47
خالد الجديع kal_judaia@hotmail.com<br />
المتغيرات العامة داخل المشروع فقط يمكن تعريفها من خلال كلمة Friend و تكون<br />
عامة لكل النماذج و الاجراءات داخل المشروع.<br />
المتغيرات الخاصة بالنموذج أو بالنظام التطبيقي و يتم تعريفها من خلال كلمة<br />
لا حظ أنه لا يمكن استخدام هذه الكلمة داخل اجراء ما.<br />
. Private<br />
المتغيرات المحلية في الاجراءات يمكن تعريفها من خلال كلمة Dim لاحظ أن قيم هذه<br />
المتغيرات تنتهي بنهاية الاجراء. يمكن تمديد حياة متغير داخل اجراء و ذلك بتعريفه<br />
.Static بكلمة<br />
-٢<br />
-٣<br />
-٤<br />
مثال على مجال المتغير<br />
في هذا المثال يوجد نوعين من المجالات<br />
Variable Scope<br />
Sub Test1()<br />
مجال الاجراء ' Integer Dim L As<br />
If L = 5 Then<br />
مجال المقطع ' Integer Dim B As<br />
B = L<br />
End If<br />
End Sub<br />
:<br />
.I<br />
.II<br />
المتغير L هو متغير معرف لمجال الاجراء كاملا.<br />
المتغير B هو متغير لمقطع جملة<br />
If لأن حياته تنتهي بنهاية هذه الجملة.<br />
.If لو حاولت معرفة قيمة B فإنك لن تستطيع بعد الجملة<br />
طرق متعددة لتعريف المتغيرات<br />
أضافت بيئة الدوت نت طرقا جديدة سهلت تعريف المتغير،<br />
لنأخذ هذه الطرق على شكل أمثلة.<br />
Dim myVar As Integer = 9<br />
-١<br />
عرف و أسند القيمة في نفس السطر :<br />
Dim I, J As Integer<br />
Dim L As Integer, M As Integer<br />
Dim N As Integer, X As Double<br />
٢- تعريف عدة متغيرات :<br />
48
خالد الجديع kal_judaia@hotmail.com<br />
لاحظ في السطر الأول كيف عرفنا متغيير من نوع<br />
Integer بدون الحاجة إلى إعادة كلمة<br />
ثم لاحظ في السطر الثاني طريقة أخرى لنفس التعريف.<br />
أما في السطر الثالث فعرفنا<br />
.Dim<br />
متغيرات متعددة من أكثر من نوع في نفس السطر.<br />
تقوم هذه الجملة<br />
التي في السطر الأول<br />
في<br />
الإصدار السادس بتعريف متغير من نوع<br />
و آخر من نوع Integer<br />
لكنها في الدوت نت تعرف كلا المتغيرين من نوع<br />
Variant<br />
.Integer<br />
تعريف متغيرات للقراءة فقط :<br />
و هو مالم يكن موجود في الاصدار السادس و إليك هذا<br />
-٣<br />
ReadOnly x As Integer<br />
المثال :<br />
عند تعريف متغير للقراءة لا<br />
يمكن تعريفه محليا داخل اجراء بل يلزم تعريفه على مستوى<br />
النموذج .<br />
ضوابط تسمية المتغيرات<br />
تعرف بيئة الدوت نت مجموعة من الشروط لتسمية المتغيرات التي يجب التقيد بها و إلا فإن بيئة<br />
:<br />
الدوت نت سوف لن تقبل تعريف المتغير المخالف لهذه الضوابط،<br />
وهذه الضوابط هي<br />
أن تبدأ<br />
١- أسماء المتغيرات بحرف أبجدي.<br />
٢٥٥ حرف.<br />
أن يكون طول اسم المتغير بين<br />
حرف و احد و<br />
-٢<br />
لا يسمح أن يكون اسم المتغير كلمة محجوزة من قبل بيئة الدوت نت.<br />
أن يتكون اسم المتغير من حروف ويمكن أن تدخل بعض الأرقام في التسمية و كذلك<br />
-٣<br />
-٤<br />
الشرطة السفلية،<br />
اسم المتغير<br />
أما غير ذلك من الرموز فغير مسموح دخولها في الاسم.<br />
سبب المخالفة<br />
اسم محجوز في بيئة الدوت نت<br />
& علامة غير مسموح باستخدامها<br />
غير مسموح أن يبدأ الاسم برقم<br />
المسافة غير مسموح بأن تدخل في اسم المتغير<br />
Class<br />
Phone&Number<br />
18Width<br />
First Name<br />
تعيين قيم للمتغيرات<br />
49
خالد الجديع kal_judaia@hotmail.com<br />
الصيغة العامة لتعيين قيمة لمتغير ما هي الصيغة التالية<br />
تلاحظ أننا بدأنا باسم المتغير ثم وضعنا علامة<br />
:<br />
Var=Value<br />
=<br />
ثم وضعنا قيمة المتغير هذه القيمة قد تكون قيمة<br />
أنت تقوم باعطائها للمتغير أو قد تكون خاصية أحد الأدوات في بيئة الدوت نت.<br />
سوف نأخذ ثلاثة<br />
أمثلة لترى كيف تقوم بتعيين قيم لها.<br />
Dim NumberOfStudent as integer<br />
NumberOfStudent =15<br />
:<br />
المثال الأول<br />
في المثال السابق قمنا بما يلي<br />
.<br />
في السطر الأول عرفنا متغير من<br />
نوع عدد صحيح<br />
-١<br />
٢- في السطر الثاني عينا قيمة لهذا المتغير وهي ١٥.<br />
Dim Name as String<br />
Name=”Khalid”<br />
:<br />
المثال الثاني<br />
في المثال السابق قمنا بما يلي<br />
١- عرفنا متغير من نوع سلسلة حرفية.<br />
قمنا بتعيين قيمة<br />
Khalid لهذا المتغير.<br />
لاحظ أنه عند تعيين قيم السلاسل الحرفية لابد من<br />
-٢<br />
وضع قيمها بين علامتي تنصيص.<br />
Dim Result as Boolean<br />
Result=True<br />
:<br />
.Boolean<br />
المثال الثالث<br />
في المثال السابق قمنا بما يلي<br />
١- عرفنا متغير من نوع<br />
-٢<br />
قمنا بإسناد قيمة صح لهذا المتغير لأنها أحد القيمتين المسموحتين له.<br />
تعيين قيمة متغير لآخر أو لخاصية أداة<br />
50
خالد الجديع kal_judaia@hotmail.com<br />
يمكن أن تسند قيمة متغير إلى متغير آخر كما يوضح ذلك المثال التالي<br />
في المثال السابق قمنا بما يلي<br />
Dim a As Integer = 5<br />
Dim b As Integer<br />
b = a<br />
:<br />
-١<br />
عرفنا متغير<br />
a من نوع Integer و عينا له قيمة<br />
.٥<br />
-٢<br />
عرفنا متغير<br />
b من نوع<br />
.Integer<br />
-٣<br />
قمنا بتعيين قيمة للمتغير<br />
b وهي قيمة المتغير<br />
a وهي .٥<br />
أن تسند قيمة خاصية أداة ما لمتغير كما يوضح ذلك المثال التالي<br />
في المثال السابق قمنا بما يلي<br />
Dim a As String<br />
a = TextBox1.Text<br />
:<br />
-١<br />
عرفنا متغير<br />
a من نوع<br />
.Integer<br />
-٢<br />
قمنا بتعيين قيمة للمتغير<br />
.TextBox1<br />
استخدام خيارExplicit<br />
a وهي ما<br />
تحتويه خاصية<br />
مر بك في السابق أنه لابد من تعريف أي متغير قبل استخدامه،<br />
Text وهي أحد خصائص الأداة<br />
لكن ماذا إذا رغبت بكسر هذه<br />
القاعدة لظرف من الظروف. تقوم بيئة الدوت نت بمنحك خيار Explicit و الذي يحدد ما إذا كان<br />
تعريف المتغيرات ضروريا أو لا.<br />
هي<br />
يحمل<br />
On بمعنى أنه يجب عليك تعريف المتغيرات،<br />
بتغييرها إلى<br />
سطر.<br />
Off كما يتضح<br />
شكل<br />
من الشكل(١-٣).<br />
Explicit قيمتين هما<br />
لاحظ<br />
.Off و On<br />
: ١ -٣<br />
استخدام عبارة<br />
Option Explicit<br />
القيمة الافتراضية<br />
في حال رغبت بعدم تعريف المتغيرات<br />
أن جملة التغيير لابد أن تكون في<br />
قم<br />
أول<br />
51
خالد الجديع kal_judaia@hotmail.com<br />
الثوابت<br />
Constants<br />
هذا نوع من مخازن الذاكرة، توضع فيه قيمة، تماما كالمتغيرات، ولكن هذه القيمة لا يمكن<br />
تغييرها بعد ذلك، وهذه طريقة تعريفها:<br />
توجد عدة فوائد لتعريف الثوابت<br />
Const MyConst = 3<br />
:<br />
-١<br />
-٢<br />
يعتبر التعامل مع الثوابت أسرع في التنفيذ من المتغيرات.<br />
سهولة تغيير الثوابت، حيث لو افترضنا أنك تستعمل<br />
MyConst<br />
بشكل كبير في النظام<br />
و أردت لسبب ما تغيير قيمته فإنك لن تتعب في ذلك حيث يمكنك تغيير هذه القيمة مرة<br />
واحدة.<br />
52
خالد الجديع<br />
kal_judaia@hotmail.com<br />
التعامل مع السلاسل و النصوص<br />
يمكن تعريف السلاسل الحرفية بأنها مجموعة من الحروف أو الأرقام أو خليط منهما<br />
.<br />
أومن أي نوع آخر من الرموز لكن بشرط أن يتم تعريفه بأنه من نوع String<br />
خذ المثال التالي على سلاسل حرفية معرفة في بيئة الدوت نت.<br />
Dim Name As String<br />
Dim HouseNumber As String<br />
"أحمد" = Name<br />
HouseNumber = "12345"<br />
في البداية عرفنا سلسلتين حرفيتين الأولى Name و الثانية HouseNumber ثم عينا<br />
.HouseNumber<br />
قيمة أحمد إلى السلسلة<br />
Name و قيمة<br />
١٢٣٤٥ إلى السلسلة<br />
عند تعريف السلاسل لابد من وضعها بين علامتي تنصيص كما مر في المثال.<br />
تقدم بيئة الدوت نت مجموعة كبيرة من الدوال التي تسهل عليك التعامل مع السلاسل<br />
الحرفية و النصوص.<br />
تصور أن لديك نص و تريد أن تقتطع جزء منه أو تبحث فيه عن نص ما،<br />
إلى غير ذلك من العمليات التي لا<br />
تنتهي فهل ستكتب برنامجا خاصا لتلك المهام أم ماذا ستفعل.<br />
حاصل القول أن هناك عدد كبيرا من الدوال سوف تسهل عليك البرمجة بشكل لم يسبق له مثيل.<br />
مقارنة السلاسل<br />
إذا أردت مقارنة سلسلتين لتكتشف هل هما متساويتان في المحتوى أم لا استخدم الدالة<br />
Dim str1 As String = "B"<br />
Dim str2 As String = "A"<br />
. Compare<br />
الدالة<br />
على سبيل المثال<br />
:<br />
str1<br />
أكبر الدالة str2 لأن محتوى السلسلة الأولى B<br />
بينما محتوى السلسلة الثانية A وكما<br />
تعرف فإن الحرف B يأتي بعد الحرف A لذلك سوف تكون نتيجة المقارنة ١.<br />
في الجانب المقابل<br />
Dim str1 As String = "AA"<br />
Dim str2 As String = "AA"<br />
. str2<br />
: المثال التالي<br />
أما في المثال السابق فإن السلسلة<br />
str1 تساوي السلسلة<br />
54
خالد الجديع<br />
kal_judaia@hotmail.com<br />
المثال التالي يوضيح كيفية مقارنة سلسلتين :<br />
قم بتعريف سلسلتين وعين لهما نفس القيمة كما يظهر في المثال التالي.<br />
عرف متغير من نوع<br />
استخدم الدالة<br />
.Integer<br />
Compare لمقارنة السلسلتين ثم ارجع نتيجة المقارنة إلى المتغير<br />
اعرض نتيجة المقارنة على أداة عنوان.<br />
.res<br />
Dim str1 As String = "AA"<br />
Dim str2 As String = "AA"<br />
Dim res As Integer<br />
res= String.Compare(str1, str2)<br />
Label1.Text = المقارنة" ":نتيجة + res.ToString()<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
لمعرفة نتيجة المقارنة ارجع إلى الجدول التالي :<br />
النتيجة<br />
المعنى<br />
أقل من صفر<br />
صفر<br />
أكبر من صفر<br />
السلسلة الأولى أقل من الثانية<br />
السلسلتان متساويتان<br />
السلسلة الأولى أكبر من الثانية<br />
دمج سلسلتين<br />
ماذا لو كان هناك سلسلتين و أردت أن تدمج السلسلتين بمعنى أن تنتج سلسلة أخرى تحوي السلسة<br />
الأولى متبوعة بالسلسلة الثانية.<br />
لنأخذ المثال التالي الذي يوضح كيفية دمج سلسلتين<br />
Dim FirstName As String = "Khalid"<br />
Dim LastName As String = "AL-Jduaia"<br />
:<br />
في هذا المثال لاحظ أننا بهدف تكوين اسم كامل فسوف نقوم بدمج السلسلتين<br />
FirstName و<br />
.LastName<br />
كل ما<br />
بإرجاع نتيجة دمج السلسلتين.<br />
نحتاجه هو خطوة واحدة فقط وهي استخدام الدالة<br />
. Concat<br />
والتي تقوم<br />
55
خالد الجديع<br />
kal_judaia@hotmail.com<br />
Label1.Text = String.Concat(FirstName, LastName)<br />
بعد دمج السلسلة الأولى مع السلسلة الثانية قمنا بعرض نتيجة الدمج على أداة عنوان.<br />
بعد دمج سلسلتين تظل قيمهما بدون أي تغير مالم تقم بذلك.<br />
إضافة حروف إلى سلسلة<br />
ماذا لو أردت أن تضيف بعض الحروف أو الأرقام أو الرموز إلى سلسلة ما. لا نقصد بعملية<br />
الإضافة العملية الحسابية لكن نقصد عملية إدراج لحروف أخرى لتكون ضمن السلسلة.<br />
لإضافة حروف إلى سلسلة قم باستخدام الدالة<br />
.Insert<br />
:Insert<br />
Dim str1 As String = “Saat”<br />
Dim strRes As String<br />
strRes = str1.Insert(2, "lam")<br />
Label1.Text = strRes.ToString()<br />
المثال التالي يوضح كيفية استخدام الدالة<br />
في المثال السابق قمنا بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
عرفنا سلسلة و عينا لها القيمة<br />
هو<br />
.saat<br />
عرفنا سلسلة أخرى ولم نسند لها أي قيمة.<br />
في السطر الثالث قمنا بتنفيذ الدالة Insert و التي تقوم بإضافة المقطع lam إلى السلسلة<br />
str1 بدأ من الحرف الثاني ثم أرجعنا ناتج الإضافة إلى السلسلة strRes ليصبح الناتج<br />
.Salamat<br />
تذكر أن الفهرس في الدوت نت يبدأ من صفر لذلك يعتبر الحرف الثاني في السلسلة<br />
saat التي تراها كبيرة.<br />
56
خالد الجديع<br />
kal_judaia@hotmail.com<br />
حذف حروف من سلسلة<br />
لحذف حرف أو أكثر من السلسلة استخدم الدالة Remove و التي تقوم بحذف حرف أو أكثر<br />
بدأ من مكان ما تقوم أنت بتحديده. كما سبق لك أن تعلمت فإن العد يبدأ من الصفر.<br />
: Remove<br />
Dim s As String = "salamat"<br />
Label1.Text = s.Remove(5, 2)<br />
المثال التالي يوضح كيفية استخدام الدالة<br />
الشرح<br />
في السطر الأول قمنا بتعريف سلسلة s و عينا لها قيمة وهي<br />
.salamat<br />
في السطر الثاني استخدمنا الدالة Remove لحذف حرفين من السلسلة بدأ من الحرف<br />
الخامس. لذا يمكن القول بأن هناك معاملان للدالة<br />
: Remove<br />
.I<br />
.II<br />
المعامل الأول للدالة Remove يمثل مكان بدأ الحذف في السلسلة.<br />
و المعامل الثاني هو عدد الأحرف التي تريد حذفها.<br />
بعد تنفيذ عملية الحذف قمنا بعرض النتيجة على أداة عنوان، نتيجة الحذف هي .salam<br />
-١<br />
-٢<br />
-٣<br />
عند حذف أحرف من سلسلة ما أو إضافة أحرف لها فإن محتواها يتغير حسب نتائج الحذف<br />
والإضافة.<br />
استرجاع جزء من سلسلة<br />
في كثير من الأحيان تحتاج إلى استرجاع جزء من سلسلة ما، تتوفر في بيئة الدوت نت دالتين<br />
لأداء هذه العملية<br />
:<br />
١-الدالة الأولى تقوم باسترجاع جزء من سلسلة بدأ من مكان ما حتى نهاية السلسلة، في هذه<br />
الحالة يوجد معامل واحد لهذه الدالة وهو مكان بدأ الاسترجاع.<br />
Dim s As String = "salamat"<br />
Label1.Text = s.Substring(5)<br />
المثال التالي يوضح كيفية استخدام الدالة : Substring<br />
57
خالد الجديع<br />
kal_judaia@hotmail.com<br />
الشرح<br />
.I<br />
في السطر الأول قمنا بتعريف سلسلة و عينا لها قيمة<br />
.salamat<br />
.II<br />
في السطر الثاني قمنا باسترجاع جزء من السلسلة<br />
السلسلة ثم عرضنا النتيجة في أداة عنوان و هي حرفي<br />
s بدأ من الحرف الخامس حتى نهاية<br />
.at<br />
٢-الدالة الثانية تقوم باسترجاع جزء من سلسلة بدأ من مكان ما و انتهاء بمكان ما. في هذه الحالة<br />
يوجد معاملان لهذه الدالة الأول يمثل مكان بدء الاسترجاع و الثاني يمثل عدد الأحرف التي تود<br />
استرجاعها. لنأخذ المثال التالي لكي تتضح الفكرة.<br />
الشرح<br />
Dim s As String = "salamat"<br />
Label1.Text = s.Substring(3, 2)<br />
:<br />
-١<br />
في السطر الأول قمنا بتعريف سلسلة و عينا لها قيمة<br />
.salamat<br />
-٢<br />
في السطر الثاني قمنا بتنفيذ الدالة substring لكي نسترجع حرفين بدأ من الحرف الثالث<br />
في السلسلة<br />
.am ثم قمنا بعرض النتيجة على أداة عنوان وهي حرفي s<br />
عند استرجاع جزء من سلسلة ما فإن المحتوى الأصلي للسلسلة لا يتغير.<br />
بحث و استبدال جزء من سلسلة<br />
إذا أردت أن تبحث عن حرف ما – أو جزء من سلسلة- داخل سلسلة ثم تستبدله بحرف آخر فإن<br />
هناك دالة<br />
Replace و<br />
التي توفر لك جهدا كبيرا.<br />
الشرح<br />
المثال التالي يوضح كيفية استخدام الدالة<br />
: Replace<br />
Dim str1 As String = "ppp"<br />
Label1.Text = str1.Replace("p", "k")<br />
:<br />
-١<br />
عرفنا سلسلة حرفية و عينا لها قيمة<br />
.ppp<br />
-٢<br />
قمنا بتطبيق الدالة<br />
ثم تقوم باستبداله بحرف<br />
تكون<br />
Replace على السلسلة و التي سوف تقوم بالبحث عن كل حرف<br />
p<br />
.k<br />
.kkk<br />
بعد ذلك قمنا بعرض النتيجة على أداة عنوان و التي سوف<br />
58
ىإل<br />
خالد الجديع<br />
kal_judaia@hotmail.com<br />
تحويل حالة الحروف إلى صغيرة و كبيرة<br />
وهو ما ينطبق على حروف اللغة الإنجليزية.<br />
الحالة الكبيرة، و العكس وهما :<br />
توجد دالتان لتحويل الحروف من الحالة الصغيرة<br />
الدالة<br />
الشرح<br />
تقوم بتحويل حالة حروف سلسلة إلى صغيرة<br />
تقوم بتحويل حالة حروف سلسلة إلى كبيرة<br />
.ToLower()<br />
ToUpper()<br />
Dim aStr As String = "ahmed"<br />
Dim bStr As String = "OMAR"<br />
Label1.Text = aStr.ToUpper()<br />
Label2.Text = bStr.ToLower()<br />
المثال التالي سوف يرسخ مفهوم الدالتين .<br />
: الشرح<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
قمنا بتعريف سلسلتين الأولى عينا لها قيمة ahmed و الثانية عينا لها قيمة OMAR<br />
استخدمنا الدالة ToUpper لتحويل حالة حروف كلمة ahmed إلى حالة كبيرة<br />
استخدمنا الدالة<br />
شكل<br />
ToLower<br />
لتحويل حالة حروف كلمة<br />
OMAR<br />
قمنا بعرض النتائج على أداتي عنوان كما يظهر من الشكل(١-٤)<br />
: ١ -٤<br />
تحويل حالة الحروف من<br />
صغيرة إلى كبيرة و العكس<br />
إلى حالة صغيرة.<br />
59
خالد الجديع<br />
kal_judaia@hotmail.com<br />
إزالة المسافات و الحروف غير المرغوب فيها<br />
في بعض الأحيان تريد إزالة المسافات التي توجد في بداية كل سلسلة أو في نهايتها أو فيهما معا.<br />
و لنضرب لذلك مثالا<br />
:<br />
افترض أن هناك مستفيدا يدخل أسماء أشخاص في مربع نص و تريد أن<br />
تتأكد من أنه أدخل شيئا في مربع النص، في هذه الحالة لو ضغط على زر مسافة فإنك لن تدري<br />
هل الذي أدخله اسم أم مسافة ما لم تقم بإزالة المسافات القبلية و البعدية لكل سلسلة.<br />
Dim str As String = " ahmed "<br />
Label1.Text = str.Trim()<br />
لنأخذ المثال التالي :<br />
الشرح<br />
في السطر الأول قمنا بتعريف سلسلة str و عينا لها القيمة<br />
أحمد تبدأ بمسافة و تنتهي بمسافة.<br />
ahmed<br />
لكن لاحظ أن القيمة<br />
لإزالة المسافة القبلية و البعدية قمنا باستخدام الدالة Trim و من ثم عرضنا النتيجة على<br />
أداة عنوان و النتيجة هي كلمة أحمد بدون مسافات قبلية أو بعدية.<br />
-١<br />
-٢<br />
تبطين سلسلة بمسافة برمز من اليمين أو الشمال<br />
نقصد بتبطين سلسلة بمسافة من اليمين أو الشمال أن تضاف إليها مسافات من جهتين هما<br />
:<br />
-١<br />
تبطين من الجهة اليمنى<br />
:<br />
سلسلة ما بمسافة أو برمز آخر.<br />
في هذه الحالة نستخدم الدالة<br />
PadLeft<br />
و التي تقوم بتبطين<br />
المثال التالي يوضح كيفية تبطين سلسلة :<br />
Dim str1 As String = "MyString"<br />
Label1.Text = str1.PadLeft(10)<br />
الشرح<br />
عرفنا سلسلة و عينا لها القيمة<br />
. MyString<br />
قمنا باستدعاء الدالة PadLeft و اعطائها معامل ١٠ يمثل هذا المعامل الطول الكلي<br />
للسلسلة الناتجة. فإذا كانت السلسلة الأصلية MyString لها طول ٨ فإن الطول للسلسلة<br />
-١<br />
-٢<br />
60
خالد الجديع<br />
kal_judaia@hotmail.com<br />
"MyString<br />
"<br />
سيكون<br />
١٠ و ستكون النتيجة كالتالي<br />
لا حظ أنه تم اضافة مسافتين إلى<br />
الجهة اليمنى.<br />
: ملاحظة<br />
لماذا مسافتين ؟ لاحظ أن المعامل=١٠ و أن طول السلسلة=٨<br />
١٠-٨=٢ فكأننا نقول أضف مسافتين للسلسلة من جهة اليمين.<br />
إذا كان المعامل أقل من طول السلسلة فلن يتم إضافة أي شيء .<br />
تبطين من الجهة اليسرى<br />
دالة أخرى هي<br />
:<br />
ما قيل في التبطين من الجهة اليمنى يقال هنا<br />
إلا أننا نستخدم<br />
.PadRight<br />
-٢<br />
المثال التالي يوضح كيفية تبطين سلسلة من الجهة اليمنى<br />
: :<br />
Dim str1 As String = "MyString"<br />
Label1.Text = str1.PadRight(10)<br />
الشرح<br />
-١<br />
عرفنا سلسلة و عينا لها القيمة<br />
. MyString<br />
٢-قمنا باستدعاء الدالة PadRight و اعطائها معامل ١٠ يمثل هذا المعامل الطول الكلي<br />
للسلسلة الناتجة. فإذا كانت السلسلة الأصلية MyString لها طول ٨ فإن الطول للسلسلة<br />
سيكون ١٠ و ستكون النتيجة كالتالي<br />
اليسرى.<br />
" MyString"<br />
لا حظ أنه تم<br />
إضافة مسافتين إلى الجهة<br />
61
خالد الجديع<br />
kal_judaia@hotmail.com<br />
الدالة<br />
البحث في<br />
السلاسل<br />
إن من العمليات الأساسية و المتكررة دائما هي البحث في سلسلة ما. تستطيع البحث داخل<br />
سلسلة من خلال الدالة<br />
indexOf و<br />
التي سوف تقوم بإرجاع موقع أول نتيجة بحث إيجابية.<br />
يوجد ستة طرق للبحث داخل سلسلة كلها متوفرة من خلال هذه الدالة وهي:<br />
IndexOf( _<br />
ByVal value As Char _<br />
) As Integer<br />
IndexOf( _<br />
ByVal value As String _<br />
) As Integer<br />
IndexOf( _<br />
ByVal value As Char, _<br />
ByVal startIndex As Integer _<br />
) As Integer<br />
IndexOf( _<br />
ByVal value As String, _<br />
ByVal startIndex As Integer _<br />
) As Integer<br />
IndexOf( _<br />
ByVal value As Char, _<br />
ByVal startIndex As Integer, _<br />
ByVal count As Integer _<br />
) As Integer<br />
IndexOf( _<br />
ByVal value As String, _<br />
ByVal startIndex As Integer, _<br />
ByVal count As Integer _<br />
) As Integer<br />
الشرح<br />
لدينا معامل واحد وهو الحرف الذي تريد<br />
البحث عنه ولدينا قيمة مرجعة هي نتيجة<br />
البحث.<br />
لدينا معامل واحد هو السلسلة التي نريد البحث<br />
عنها داخل السلسلة الحالية. ولدينا قيمة مرجعة<br />
هي نتيجة البحث.<br />
لدينا معاملان هما الحرف الذي نريد البحث<br />
عنه و مكان بدء البحث. ولدينا قيمة مرجعة<br />
هي نتيجة البحث.<br />
لدينا معاملان هما السلسلة<br />
عنها و مكان بدء البحث.<br />
هي نتيجة البحث.<br />
التي نريد البحث<br />
ولدينا قيمة مرجعة<br />
لدينا ثلاثة معاملات هي الحرف الذي نريد<br />
البحث عنه و مكان بدء البحث و عدد الحروف<br />
التي نريد أن تتم عليها عملية البحث. ولدينا<br />
قيمة مرجعة هي نتيجة البحث.<br />
لدينا ثلاثة معاملات هي السلسلة التي نريد<br />
البحث عنها و مكان بدء البحث و عدد الحروف<br />
التي نريد أن تتم عليها عملية البحث. ولدينا<br />
قيمة مرجعة هي نتيجة البحث.<br />
62
خالد الجديع<br />
kal_judaia@hotmail.com<br />
١- البحث عن حرف<br />
لنأخذ الأمثلة التالية و التي من خلالها تتضح الفكرة.<br />
Dim str As String = "salamat"<br />
Label1.Text = str.IndexOf("a”)<br />
الطريقة<br />
-I<br />
عرفنا سلسلة و عينا لها قيمة<br />
salamat<br />
II-بحثنا عن حرف a داخل السلسلة ثم أرجعنا النتيجة إلى أداة عنوان،<br />
هي ١ و الذي يمثل رقم موقع حرف a داخل السلسلة.<br />
و النتيجة<br />
Dim str As String = "salamat"<br />
Label1.Text = str.IndexOf("a”,4)<br />
٢-البحث عن حرف بدأ من مكان ما.<br />
: الطريقة<br />
I-عرفنا سلسلة و عينا لها قيمة<br />
.salamat<br />
II-بحثنا عن حرف a داخل السلسلة بدأ من الموقع الرابع ثم أرجعنا<br />
النتيجة إلى أداة عنوان، و النتيجة هي ٥ و الذي يمثل رقم موقع حرف a داخل السلسلة بدأ<br />
من الموقع الرابع.<br />
٣-البحث عن حرف مع تحديد مكان بدأ البحث و مكان انتهائه<br />
Dim str As String = "salamat"<br />
Label1.Text = str.IndexOf("m”,3,2)<br />
٢ مما<br />
: الطريقة<br />
I-عرفنا سلسلة و عينا لها قيمة<br />
.salamat<br />
II-بحثنا عن حرف m داخل السلسلة بدأ من الموقع الثالث بطول<br />
يعني أن البحث سوف يتوقف في الموقع الخامس، ثم أرجعنا النتيجة إلى أداة عنوان، و<br />
النتيجة هي ٤ و الذي يمثل رقم موقع حرف m داخل السلسلة بدأ من الموقع الثالث.<br />
63
خالد الجديع<br />
kal_judaia@hotmail.com<br />
الجدول التالي يوضح معنى نتائج البحث<br />
القيمة<br />
الشرح<br />
نتيجة البحث سلبية<br />
١-<br />
أي عدد صحيح من صفر أو أكبر<br />
موقع أول نتيجة إيجابية<br />
البحث يعتمد على حالة الأحرف.<br />
فلو أدخلت حرف<br />
n للبحث عنه داخل سلسلة و كان<br />
الموجود N<br />
فإن النتيجة سلبية.<br />
64
خالد الجديع<br />
kal_judaia@hotmail.com<br />
مثال تدريبي شامل لكل أنواع التعامل مع السلاسل<br />
: الهدف<br />
يهدف هذا التدريب إلى تعليمك جميع أنواع التعامل السابقة مع السلاسل مما يكون له الأثر الإيجابي في<br />
تسهيل البرمجة في بيئة الدوت نت.<br />
الأدوات المستخدمة :<br />
مربع مجموعات،<br />
ستة أزرار اختيار،<br />
مربع نص واحد،<br />
خمسة أداوات<br />
(٢-٤)<br />
عنوان،<br />
زر أمر انظر شكل<br />
نظرة على تصميم النموذج<br />
-٤ ٢ : شكل<br />
تصميم النموذج<br />
ماذا سيحدث: سوف يكون لدينا ستة أزرار أمر كل منها يمثل نوع من أنواع العمليات على<br />
السلاسل كما سيكون لدينا زر أمر ينفذ العملية بناء على زر الأمر الذي تم اختياره. كما تلاحظ<br />
من تصميم النموذج يوجد أداة عنوان مكتوب عليها<br />
، salamat<br />
هذه الأداة ستكون محور<br />
العمليات، كما سيكون هناك مربع نص تدخل فيه القيمة بناء على العملية المختارة ثم ستظهر<br />
النتيجة في أداة عنوان. لنأخذ المثال التالي على إحدى العمليات<br />
:<br />
-١<br />
-٢<br />
-٣<br />
اختر نوع العملية مقارنة سلسلتين من أزرار الاختيار.<br />
قم بإدخال السلسلة التي تريد أن تقارنها بالسلسلة المكتوبة على أداة العنوان<br />
.salamat<br />
اضغط زر الأمر لتظهر لك النتيجة على أداة العنوان التي كتب بجانبها نتيجة العملية.<br />
65
خالد الجديع kal_judaia@hotmail.com<br />
الخطوات<br />
قم بإنشاء نموذج ثم ضع فيه الأدوات التالية مع ضبط خصائص الأدوات كما هو وارد<br />
في الجدول :<br />
-١<br />
اسم الأداة<br />
الخاصية<br />
ا لقيمة<br />
WorkWithString<br />
التعامل مع السلاسل الحرفية<br />
True<br />
Simplified Arabic<br />
rdoAdd<br />
إضافة إلى سلسلة<br />
rdoSub<br />
استرجاع حروف من سلسلة<br />
rdoCon<br />
دمج سلسلتين<br />
rdoComp<br />
مقارنة سلسلتين<br />
rdoSmall<br />
تحويل حالة الحروف إلى صغيرة<br />
rdoCap<br />
تحويل حالة الحروف إلى آبيرة<br />
rdoSearch<br />
البحث في سلسلة<br />
rdoRemove<br />
ح ذف من سلسلة<br />
Button1<br />
تنفيذ العملية<br />
Label2<br />
اجراء العمليات على السلسلة<br />
lblSal<br />
salamat<br />
Label3<br />
المدخل<br />
txtInput<br />
Label5<br />
نتيجة العملية<br />
lblRes<br />
Label4<br />
Name<br />
Text<br />
RightToLeft<br />
Font<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Form<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
RadioButton<br />
Button<br />
Label<br />
Label<br />
Label<br />
TextBox<br />
Label<br />
Label<br />
66
خالد الجديع kal_judaia@hotmail.com<br />
قم بتصميم النموذج كما هو موضح في الخصائص و شكل التصميم السابق<br />
انقر مزدوجا على زر الأمر لتنتقل إلى حدث النقر الخاص بزر الأمر و اكتب الكود<br />
التالي :<br />
-٢<br />
-٣<br />
تستطيع نسخ هذا التدريب من القرص المرفق مع الكتاب<br />
If rdoAdd.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = lblSal.Text().Insert(2, txtInput.Text)<br />
End If<br />
End If<br />
If rdoSub.Checked Then<br />
If txtInput.Text.Trim "" And IsNumeric(txtInput.Text) Then<br />
lblRes.Text = lblSal.Text.Substring(txtInput.Text)<br />
End If<br />
End If<br />
If rdoCon.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = String.Concat(lblSal.Text, txtInput.Text)<br />
End If<br />
End If<br />
If rdoComp.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = String.Compare(lblSal.Text, txtInput.Text)<br />
End If<br />
End If<br />
If rdoSmall.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = txtInput.Text.ToLower<br />
End If<br />
End If<br />
If rdoCap.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = txtInput.Text.ToUpper<br />
End If<br />
End If<br />
If rdoSearch.Checked Then<br />
If txtInput.Text.Trim "" Then<br />
lblRes.Text = lblSal.Text.IndexOf(txtInput.Text)<br />
End If<br />
End If<br />
If rdoRemove.Checked Then<br />
If txtInput.Text.Trim "" And IsNumeric(txtInput.Text) Then<br />
lblRes.Text = lblSal.Text.Remove(txtInput.Text, 1)<br />
End If<br />
End If<br />
67
خالد الجديع<br />
kal_judaia@hotmail.com<br />
تعليمات<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
بناء على زر الاختيار الذي تم اختياره يقوم هذا الكود بتنفيذ العملية.<br />
لاحظ أننا هنا طبقنا جميع العمليات الأساسية.<br />
تستطيع نقل جمل الشرط المتعلقة بالتأكد من أن هناك مدخل في مربع النص إلى بداية<br />
الإجراء لكي تكون شاملة للجميع.<br />
لرؤية النظام بعد التشغيل انظر الشكل (٤-٣) ولاحظ أننا اخترنا زر الاختيار المتعلق<br />
بالبحث في سلسلة ثم أدخلنا حرف m ثم ضغطنا زر الأمر فظهر لنا رقم ٤ في أداة<br />
العنوان وهو ما يمثل موقع حرف m.<br />
-٤ ٣ : شكل<br />
نظام التعامل مع السلاسل<br />
68
خالد الجديع kal_judaia@hotmail.com<br />
ما هي ADO.NET ؟<br />
مقدمة عن<br />
ADO.NET<br />
يمكن تعريفها بأنها مجموعة من الفئات–CLASSES- للتعامل مع مصادر البيانات. فإذا<br />
أردت الاتصال بقاعدة بيانات ما<br />
-<br />
و التعامل مع بيانات موجودة فيها أو إضافة بيانات جديدة<br />
لها- مثل أوراكل أو أكسيس من خلال بيئة الدوت نت فسوف تقوم بذلك من خلال<br />
.ADO.NET<br />
تم تصميم ADO.NET في الأساس للعمل مع قواعد البيانات لكن تعمل مع<br />
غيرها من مصادر البيانات، لذا يمكن القول بأن ADO.NET يمكن أن تتعامل مع الأنواع<br />
التالية من مخازن البيانات<br />
١- المخازن غير المتناسقة<br />
:<br />
:<br />
-٢<br />
المخازن المتناسقة غير المتدرجة<br />
وهي البيانات التي لا يوجد لها ترتيب محدد مثل ملف نصي.<br />
: (CSV)<br />
.ActiveDirectory ،Excel<br />
٣- المخازن<br />
.XML ملفات<br />
٤- مخازن قواعد البيانات<br />
وهي البيانات المفصولة بفاصلة مثل ملفات<br />
الهرمية :وهي ملفات تخزن فيها البيانات بأسلوب هرمي، لعل من أبرز الأمثلة<br />
المترابطة :<br />
مثل أوراكل،<br />
.MySQL ،SQLServer<br />
موقع ADO.NET من بيئة الدوت :<br />
تعتبر<br />
ADO.NET<br />
المزايا مثل تجميع المهملات<br />
جزء من إطار العمل -Framework– وهو مايجعلها تشاركه بعض<br />
- garbage collection-<br />
و دعم متعدد للغاتmulti-language -design<br />
و التصميم الشيئي<br />
OO -<br />
.<br />
مر في الفصل المتعلق بالمقدمة عن بيئة<br />
الدوت نت تعريف البيئة المتصلة و البيئة غير المتصلة و يمكننا أن نقول بأن<br />
ADO.NET<br />
مصممة للعمل مع البيئة المتصلة و البيئة غير المتصلة. وحيث إن ADO تعتبر جزء من<br />
إطار العمل فهي مقسمة إلى امتدادات منطقية<br />
،<br />
و قد تم بناء<br />
ADO<br />
System.data<br />
كما يجدر التنويه أن هناك جزء من<br />
System.xml انظر الشكل التالي .<br />
ADO<br />
في الإمتداد<br />
يقع في امتداد آخر هو<br />
System.Data<br />
.SqlTypes<br />
.SqlClient<br />
.Common<br />
.OleDb<br />
126
خالد الجديع kal_judaia@hotmail.com<br />
الفرق بين ADO.NET و :ADO<br />
حصل هناك تطور ضخم من الإصدار السابق في ADO إلى الإصدار الحالي<br />
ولا نبالغ إذا قلنا إن<br />
وإليك بعض<br />
ADO.NET تعتبر تقنية جديدة و ليست<br />
الفروق بين الإصدارين.<br />
ADO.NET<br />
إصدارا جديدا لسالفتها .ADO<br />
وجه المقارنة ADO.NET ADO<br />
دعم xml غير موجود دعم قوي<br />
نظرا لأن<br />
تدعم<br />
DATASET<br />
XML<br />
نقل البيانات من خلال الجدار<br />
الناري<br />
التوسع<br />
تمثيل البيانات في الذاكرة<br />
العلاقات بين عدة جداول<br />
المرور على البيانات<br />
هناك عائق لنقل ADO من<br />
خلال الجدار الناري.<br />
يوجد مشكلة في التوسع لأن<br />
الاتصال بقواعد البيانات يتم<br />
حفظه لمدة طويلة.<br />
Recordset تحوي على جدول<br />
واحد في نفس الوقت.<br />
تتطلب ربط الجداول قبل<br />
إحضارها من قواعد البيانات.<br />
يتم المرور على البيانات بشكل<br />
فلا يوجد<br />
مشكلة في نقل البيانات من<br />
خلال الجدار الناري.<br />
البيئة غير المتصلة تساعد<br />
على الاشتراك في الاتصال<br />
ومن ثم إمكانية توسع كبيرة.<br />
DataSet تحوي عدد غير<br />
محدد من الجداول في نفس<br />
الوقت<br />
تمكن من عمل العلاقات بعد<br />
إحضارها من قاعدة البيانات<br />
من خلال<br />
.DataRelation<br />
تسلسلي داخل<br />
يتم المرور على البيانات<br />
.Recordset بشكل غير تسلسلي.<br />
مهيأة من خلال<br />
Dataset و<br />
.DataAdaptor<br />
لا يوجد دعم جيد .<br />
البيئة غير المتصلة<br />
127
ل<br />
خالد الجديع kal_judaia@hotmail.com<br />
النموذج الشيئي ل : ADO.NET<br />
يتكون النموذج الشيئي<br />
-ObjectModel–<br />
-١<br />
-٢<br />
مجموعة البيانات<br />
مزودات البيانات<br />
.Dataset<br />
.net DataProvider Classes<br />
ADO.NET من جزأين هما<br />
مجموعة البيانات : Dataset<br />
وهي عبارة عن مجموعة من الأنظمة البرمجية التي تسمح بأن تخزن فيها البيانات كما تسمح<br />
بإدارة هذه البيانات. يجب أن نلاحظ أن<br />
Dataset لا<br />
تعتمد على مصدر بيانات معين مما<br />
يوفر إمكانية استخدامها مع أي مصدر بيانات وسوف يأتي فصل كامل خاص بمجموعة<br />
البيانات.<br />
مزودات البيانات .net DataProvider Classes :<br />
وهي مجموعة من الفئات تدعم مصدر بيانات محدد لذلك يجب كتابة هذه المزودات خصيصا لهذا<br />
المصدر و بالتالي لن تعمل هذه المزودات مع مصدر آخر. و توفر هذه المزودات القدرة على<br />
الإتصال بقواعد البيانات و استعادة البيانات منها و تحديثها. يوجد العديد من هذه المزودات مثل<br />
.Sql Server .net Data Provider<br />
انظر الشكل(١-١٢)<br />
.<br />
شكل ١-١٢ :<br />
النموذج الشيئي ل ADO.NET<br />
Managed Provider<br />
Connection<br />
DataAdapter<br />
Command<br />
DataReader<br />
DataSet<br />
Connection<br />
DataTables<br />
Clients / Grids / Forms<br />
128
خالد الجديع kal_judaia@hotmail.com<br />
تقوم ADO.NET باستخدام مزودات البيانات للاتصال بمصادر البيانات و من ثم استرجاع و<br />
تعديل البيانات لذلك تمثل هذه المزودات طبقة خفيفة بين ما تكتبه من شفرات و مصادر البيانات.<br />
أنواع مزودات البيانات :<br />
يوجد نوعين من مزودات للبيانات وهي<br />
:<br />
: Oledb<br />
١-مزود وهو نوع عام للاتصال بمصادر البيانات المختلفة، تستطيع من خلال<br />
الاتصال بقاعدة بيانات أوراكل أو MySQL أو أكسس.<br />
٢- مزود البيانات المدار<br />
oledb<br />
: -Managed Data Provider–<br />
وهو المزود الذي تم بنائه خصيصا<br />
للعمل مع قاعدة بيانات محددة. هذا النوع من المزودات يسمى مزود أصلي<br />
Native –<br />
-Provider لأنه يقوم بفعالية بالتعامل مع قاعدة البيانات التي بني من أجلها. و هذا النوع لا<br />
يمكن أن يعمل مع قاعدة بيانات غير التي بني من أجلها. انظر الشكل(٢-١٢)<br />
شكل ٢-١٢ :<br />
الاتصال يقواعد البيانات من خلال مزودات البيانات<br />
الخاص بك الكود<br />
OLE DB .NET<br />
Data Provider<br />
SQL Client .NET<br />
Data Provider<br />
ODBC .NET<br />
Data Provider<br />
MySQL Client .NET<br />
Data Provider<br />
OLE DB<br />
Provider<br />
ODBC<br />
Driver<br />
بيانات مخزن<br />
SQL Server<br />
/ MSDE<br />
بيانات مخزن<br />
MySQL 4.0<br />
ملاحظة : في حالة اختيار مزود بيانات أصلي فإن الاتصال سيكون مباشرا بين الكود الذي<br />
تكتبه و بين قاعدة البيانات بينما توجد طبقة عندما تستخدم النوع العام<br />
عند تهيئة بيئة الدوت نت على حاسبك فإنه يوجد معها مزودا بيانات هما :<br />
. ODBC أو ،Oledb<br />
-١<br />
-٢<br />
المزود العام<br />
.Oledb<br />
مزود بيانات أصلي يعمل مع<br />
.SQLServer<br />
129
خالد الجديع kal_judaia@hotmail.com<br />
إذا رغبت بإضافة مزود بيانات أوراكل قم بإنزاله بالمجان من موقع مايكروسوفت<br />
بتهيئته لتتم عملية إضافته إلى باقي المزودات الموجودة.<br />
ثم قم ومن<br />
٢٠٠٣<br />
ملاحظة :<br />
سوف يكون مزود البيانات الخاص بأوراكل متوفرا في نسخة<br />
من فيجوال<br />
ستوديو دوت نت .<br />
:<br />
تندرج مزودات البيانات تحت<br />
فضاءات الأسماء التالية<br />
System.Data.SqlClient<br />
System.Data.OleDb<br />
المزود الأول هو المزود الأصلي ل<br />
SQLServer أما المزود الثاني فهو المزود العام.<br />
مكونات مزود البيانات :<br />
تتكون مزودات البيانات من أربعة -Classes–<br />
فئات<br />
تبدأ أول ثلاثة أحرف منها باسم المزود<br />
وهي :<br />
-١ كائن الاتصال -Connection– :<br />
الفئة المخصصة للاتصال بقواعد البيانات يندرج<br />
تحت<br />
System.Data.OleDb.OleDbConnection<br />
System.Data.SqlClient.SqlConnection<br />
فضاءات الأسماء التالية :<br />
Stored<br />
:<br />
-٢ كائن الأمر -Command– :<br />
الفئة المخصصة<br />
لتنفيذ أمر ما مثل<br />
تنفيذ<br />
ومثل تنفيذ عملية اضافة بيانات، تحت فضاءات الأسماء التالية<br />
:<br />
System.Data.OleDb.OleDbCommand<br />
System.Data.SqlClient.SqlCommand<br />
Procedure<br />
كائن قارئ البيانات<br />
تستخدم للقراءة فقط و البيانات يمكن قراءتها<br />
إلى<br />
: -DataReader–<br />
-٣<br />
. تحت<br />
الأمام و لا يمكن الرجوع<br />
للخلف،<br />
تستخدم للإستعلام وتعتبر ذات أداء عالي جدا<br />
فضاءات الأسماء التالية<br />
:<br />
130
خالد الجديع kal_judaia@hotmail.com<br />
System.Data.OleDb.OleDbDataReader<br />
System.Data.SqlClient.SqlDataReader<br />
-٤<br />
–<br />
مهيئ البيانات -DataAdaptor– :<br />
هو الكائن الذي يقوم بتعبئة مجموعة البيانات<br />
-٥<br />
-Dataset وكذلك يقوم بتنفيذ التعديلات التي أجريت على مجموعة البيانات وعكسها<br />
على قواعد البيانات. . يندرج تحت فضاءات الأسماء التالية<br />
System.Data.OleDb.OleDbDataAdapter<br />
System.Data.SqlClient.SqlDataAdapter<br />
:<br />
131
خالد الجديع kal_judaia@hotmail.com<br />
الاتصال بقواعد البيانات<br />
لقراءة أو كتابة بيانات على قاعدة بيانات ما لابد في البداية من إنشاء الاتصال بقواعد البيانات،<br />
وهو ما يتم من خلال كائن الاتصال<br />
.-Connection–<br />
وكما مر بك سالفا فإنه بناء على اختيارك<br />
لمزود البيانات سوف تقوم باستخدام كائن الاتصال الخاص بذلك المزود. ونريد هنا أن نذكرك بأن<br />
كائن الاتصال يوجد في الامتداد التالي<br />
System.Data.OleDb<br />
سوف نقوم بالتعامل في جميع الأمثلة مع مزود البيانات العام Oledb نظرا لأننا سوف<br />
نستخدم قاعدة بيانات مايكروسوفت أكسس وهو مايتوفر في معظم الأجهزة.<br />
للاتصال بقاعدة بيانات ما لابد من اعطاء كائن البيانات معلومات كافية عن قاعدة البيانات التي<br />
تريد أن تتصل بها مثل مكان قاعدة البيانات و اسم قاعدة البيانات و كلمة المرور و الكلمة السرية<br />
للدخول لقاعدة البيانات إن وجد. استخدم خاصية سلسلة الاتصال<br />
لاعطاء هذه المعلومات.<br />
-Connection String–<br />
133
خالد الجديع kal_judaia@hotmail.com<br />
سلسلة الاتصال بقواعد البيانات<br />
: - ConnectionString–<br />
ما هي<br />
I. سلسلة الاتصال<br />
تعتبر سلسلة الاتصال أحد خصائص كائن الاتصال،<br />
ويمكن تعريفها بأنها عبارة عن عدد من<br />
العوامل<br />
-Parameters– الضرورية للاتصال بقواعد البيانات<br />
تختلف بعض هذه العوامل بناء<br />
:<br />
على<br />
مزود البيانات<br />
. يشمل الجدول التالي أهم العوامل في سلسلة الاتصال<br />
العامل<br />
الشرح<br />
هذه الخاصية هي اسم مزود ole<br />
لهذا الاتصال<br />
،وتستخدم فقط عندما<br />
Provider<br />
تقوم باستخدام مزود البيانات .OLE DB<br />
اسم خادم البيانات.<br />
اسم قاعدة البيانات.<br />
يحدد فيما إذا كان الاتصال متكامل الثقة مع ويندوز.<br />
ويمثل الوقت الذي تتم فيه محاولة الاتصال بقاعدة البيانات فإن لم يتم<br />
DataSource<br />
Intial Catalog<br />
Integrated Security<br />
ConnectionTimeout<br />
–<br />
الاتصال خلال هذا الوقت –<br />
بالثانية<br />
تم ارجاع خطأ وتم افشال<br />
الاتصال علما بأن الوقت الافتراضي هو<br />
١٥ ثانية.<br />
UserID/Password كلمة العبور لقاعدة البيانات واسم المستخدم.<br />
و إليك هذا الجدول الذي يعطي أمثلة على أسماء مزودي ole الشائعين.<br />
اسم مزود<br />
قاعدة البيانات<br />
Microsoft Access<br />
Microsoft SQL Server<br />
Oracle<br />
Ole<br />
Microsoft.Jet.OLEDB.4.0<br />
SQLOLEDB.1<br />
MSDAORA.1<br />
134
خالد الجديع kal_judaia@hotmail.com<br />
.II أمثلة على سلسلة الاتصال :<br />
سلسلة<br />
للاتصال بقاعدة بيانات<br />
SQLServer<br />
Provider=sqloledb;Data Source=SQL Server DB;Initial<br />
Catalog=Northwind;User ID=UserName;Password=password<br />
-١<br />
سلسلة للاتصال بقاعدة بيانات أوراكل<br />
Provider=MSDAORA;Data Source=Oracle DB;User<br />
ID=UserName;Password=password<br />
-٢<br />
سلسلة للاتصال بقاعدة بيانات مايكروسوفت أكسس<br />
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Mydb\db1.mdb;<br />
-٣<br />
إذا كان موقع قاعدة البيانات في نفس الفهرس<br />
-Directory– الذي تقع فيه الصفحة التي<br />
تتصل بقاعدة البيانات فإنك لاتحتاج إلى كتابة الموقع كاملا و إنما يكفي اسم قاعدة البيانات.<br />
.III طريقة سهلة لبناء سلسلة الاتصال<br />
قد تواجه أحيانا مشكلة في كتابة سلسلة الاتصال لأنه من الصعب تذكر كيفية كتابتها بدون أخطاء<br />
و بدون نسيان حرف أو فاصلة. يوجد طريقة سهلة لإنشاء سلسلة الاتصال. قم بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
قم بإنشاء ملف نصي TextFile واعطه اسم<br />
غير امتداده من<br />
.MyConnString.txt<br />
.(Universal Data Link (اختصار UDL إلى txt<br />
انقر مزدوج على الملف ليظهر لك الشكل(١-١٣)<br />
اختر شريط مزود البيانات Provider ثم اختر المزود الخاص بأكسس وهو<br />
اختر شريط<br />
Microsoft.Jet.OLEDB.4<br />
. Connection<br />
قم باختيار قاعدة البيانات التي تريد أن تبني لها سلسلة اتصال.<br />
135
خالد الجديع kal_judaia@hotmail.com<br />
١-١٣ : شكل<br />
اختيار مزود البيانات<br />
.NotePad<br />
٧-اضغط على زر موافق.<br />
٨-اذهب إلى الملف<br />
MyConnString.udl<br />
وافتحه بواسطة<br />
الشكل(٢-١٣)، ابتداء من كلمة Provider يمثل سلسلة الاتصال.<br />
ليظهر لك<br />
٢-١٣ : شكل<br />
لاحظ أنه تم بناء سلسلة الاتصال<br />
فتح و اغلاق الاتصال بقواعد البيانات<br />
لفتح الاتصال بقواعد البيانات استخدم الطريقة Open وهي أحد طرق كائن الاتصال.<br />
الاتصال استخدم الطريقة<br />
و لإغلاق<br />
Close أو<br />
Dispose وسوف يأتي الفرق بين الطريقتين.<br />
136
خالد الجديع kal_judaia@hotmail.com<br />
و لنأخذ المثال التالي<br />
Dim con As New OleDb.OleDbConnection()<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _<br />
"C:\TelDir.mdb;Persist Security Info=False"<br />
con.Open()<br />
. . . . .<br />
con.Close<br />
:<br />
في الكود السابق قمنا بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
في السطر الأول أعلنا عن كائن اتصال Con من نوع<br />
.oledb<br />
في السطر الثاني قمنا بتعريف سلسلة الاتصال وهي كما تلاحظ سلسلة<br />
بيانات خاصة بمايكروسوفت أكسس.<br />
في السطر الثالث قمنا بفتح الاتصال.<br />
النقاط كناية عن عمليات نقوم بها على قاعدة البيانات.<br />
أخيرا أغلقنا الاتصال من خلال الطريقة<br />
الاتصال بقاعدة<br />
.Close<br />
طرق فتح و إغلاق الاتصال<br />
توجد هناك طريقتان لفتح و إغلاق الاتصال بقواعد البيانات<br />
:<br />
-١<br />
فتح وإغلاق الاتصال ظاهريا<br />
:<br />
ونعني به أن تقوم باستخدام وظيفة فتح وإغلاق الاتصال<br />
بشكل ظاهر في الكود. و تعتبر هذه الطريقة طريقة مفضلة للأسباب التالية<br />
:<br />
.I<br />
.II<br />
: ملاحظة<br />
سهولة قراءة الكود. حيث يظهر بشكل واضح مكان فتح و إغلاق الاتصال<br />
تساعد على متابعة الأخطاء<br />
في هذه الطريقة، ولأنك تقوم بفتح و إغلاق الاتصال بنفسك يتوجب عليك إغلاق<br />
الاتصال كلما انتهيت منه للأسباب التالية<br />
:<br />
.a<br />
.b<br />
أكثر قواعد البيانات لها عدد محدود من الاتصالات.<br />
ترك الاتصال مفتوحا يستهلك موارد كبيرة جدا.<br />
للتأكد من حالة الاتصال هل هو مفتوح أو مغلق استخدم خاصية<br />
State كما في المثال التالي<br />
137
خالد الجديع kal_judaia@hotmail.com<br />
if (ConnectionObject.State = ConnectionState.Open)<br />
فتح و إغلاق الاتصال باطنيا<br />
:<br />
وهو أن يقوم مهيء البيانات بفتح الاتصال عند تنفيذ<br />
عملية ما، ثم يقوم بإغلاق الاتصال عند انتهائه من العملية. في هذه الحالة لا تقوم<br />
باستخدام وظيفتي فتح و إغلاق الاتصال بل يقوم مهيء البيانات بذلك وذلك عندما تستخدم<br />
إحدى الدالتين التاليتين<br />
،Fill<br />
البيانات لتستخدمه أو تقوم بفتح اتصال ثم إغلاقه.<br />
Update تقوم الدالة بالتأكد من وجود اتصال مفتوح بقاعدة<br />
-٢<br />
عمليتا فتح و اغلاق الاتصال ظاهريا و باطنيا تعتمد على نوع البيئة التي تستخدمها، هل<br />
هي بيئة متصلة أو غير متصلة. الفتح الظاهري خاص بالبيئة المتصلة و الفتح الباطني خاص<br />
بالبيئة غير المتصلة.<br />
معالجة استثناءات الاتصال بقواعد البيانات<br />
عند الاتصال بقواعد البيانات قد تظهر بعض الاستثناءات التشغيلية، بعضها متوقع و البعض<br />
الآخر غير متوقع. تتم معالجة الأخطاء التشغيلية من خلال عبارة<br />
.Try Catch<br />
يمكن تعريف<br />
الاستثناء -Exception– بأنه إما خطأ أو أداء غير متوقع إما من البرنامج نفسه أو من بيئة<br />
تشغيل البرنامج. ظهر أسلوب جديد لمعالجة الاستثناءات في الدوت نت مع العلم أنه لم يكن<br />
موجودا في الاصدار السابق من فيجوال بيسك و الذي كان يعالج الأخطاء من خلال عبارة<br />
.Onerror<br />
لا تنصح ميكروسوفت باستخدام Onerror في بيئة الدوت نت لأنه يحوي عدد<br />
محدود من المعلومات عن الأخطاء أما في الطريقة الجديدة في الدوت نت فيمكن معرفة<br />
معلومات كثيرة مثل رقم السطر الذي حدث به الخطأ و اسم الدالة التي حصل بها الخطأ و<br />
اسم خادم البيانات وهو ما لم يكن متوفرا في السابق.<br />
138
خالد الجديع kal_judaia@hotmail.com<br />
المعالجة الهيكلية للاستثناءات في بيئة الدوت نت<br />
هي عبارة عن شفرات تكتب لتحديد<br />
لها الاستجابة و الأخطاء<br />
أثناء عمل البرنامج حسب<br />
السياق التالي :<br />
Try<br />
Catch<br />
Finally<br />
End Try<br />
يمكن شرح سياق معالجة الاستثناءات من خلال النقاط التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
تكتب ما تريد أن تنفذه من كود في عبارة<br />
.Try<br />
عند حدوث خطأ يقوم سياق Catch بمعالجة الخطأ. أما عند عدم حدوث خطأ فلا ينفذ<br />
محتوى عبارة<br />
عبارة<br />
.Catch<br />
Finally<br />
إذا لم تحتج لها.<br />
يتم تنفيذها في كل الأحوال وهي عبارة اختياريه تستطيع عدم استخدامها<br />
المثال التالي يوضح استخدام هيكلية الاستثناء في بيئة الدوت نت.<br />
Dim con As New OleDb.OleDbConnection()<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="<br />
& _<br />
"C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
con.Open()<br />
Catch Exp As OleDb.OleDbException<br />
Label1.Text = Exp.Message<br />
Finally<br />
con.Close()<br />
End Try<br />
يمكن تلخيص المثال بالخطوات التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
في السطر الأول قمنا بتعريف اتصال بقاعدة البيانات.<br />
في السطر الثاني قمنا بتعريف سلسلة الاتصال.<br />
بدأ سياق معالجة الاستثناءات.<br />
139
خالد الجديع kal_judaia@hotmail.com<br />
فتح الاتصال من خلال طريقة<br />
.Open<br />
إن حصل أي خطأ في فتح الاتصال سوف ينتقل السياق إلى عبارة<br />
.Catch<br />
في عبارة Catch قمنا بتعريف متغير من نوع استثناء خاص ب Oledb ثم عرضنا<br />
الرسالة التي توضح الاستثناء على أداة عنوان.<br />
في كل الأحوال سواء حصل استثناء أم لم يحصل سيتم إغلاق الاتصال بقاعدة البيانات.<br />
-٤<br />
-٥<br />
-٦<br />
-٧<br />
طبق ما سبق من خلال التدريب التالي :<br />
•<br />
•<br />
•<br />
قم بتغيير اسم قاعدة البيانات.<br />
حاول الاتصال بقاعدة البيانات باستخدام سلسلة الاتصال السابقة.<br />
يجب أن يكون هناك خطأ قم بمعالجته مظهرا رسالة على عنوان.<br />
أوعية الاتصال :<br />
.I<br />
في كل مرة يتم فيها الاتصال بقاعدة البيانات يتم استهلاك حجم كبير من موارد الأجهزة<br />
الخادمة لذا تقتضي الحكمة إبقاء مجموعة من الاتصالات مجهزة في أوعية اتصالات مما<br />
يساعد على زيادة كفاءة النظام.<br />
: تعريفها<br />
يمكن تعريف أوعية الاتصال بأنها عبارة عن عملية إبقاء مجموعة من الاتصالات مفتوحة و<br />
مجموعة في مكان ما ليتم بعد ذلك إعادة استخدامها<br />
.<br />
.II<br />
شروط استخدامها :<br />
يوجد هناك شرطان أساسيان لاستخدام أوعية الاتصال<br />
:<br />
-١<br />
أن لا تختلف سلسلة الاتصال : وهو ما يعني تطابق سلسلة الاتصال تطابقا تاما حتى<br />
أسم المستخدم في سلسلة الاتصال لابد أن يتطابق<br />
.<br />
٢- توظيف خاصية وعاء الاتصال : مع العلم أن القيمة الافتراضية هي أن وعاء الاتصال<br />
موظف.<br />
عند تخلف أحد الشرطين السابقين لا يتم استخدام نفس الاتصال بل تقوم بيئة التشغيل بإنشاء<br />
اتصال جديد ومن ثم يتم وضعه في وعاء جديد إن تم طلب ذلك.<br />
140
خالد الجديع kal_judaia@hotmail.com<br />
: مميزاتها .III<br />
يوجد ميزتان هامتان تجعلنا نفكر في استخدام أوعية الاتصال وهما<br />
:<br />
-١<br />
-٢<br />
أداء أعلى للأنظمة : حيث أن فتح إتصال جديد لكل مستخدم يشكل عبأ على خادم<br />
البيانات كما أنه يأخذ وقتا لإتمام فتح الاتصال.<br />
القدرة على التوسع بكفاءة<br />
إذا لم يتم استخدام أوعية الاتصال بشكل صحيح قد تؤثر على اداء النظام. وذلك أن التوسع<br />
في إكثار الاتصالات في حوض الاتصال يستهلك موارد خادم البيانات.<br />
تتضح أهمية استخدام أوعية الاتصال في تطبيقات الانترنت و التطبيقات التي يعمل عليها<br />
مستخدمين كثر. يذكر أن عملية تجميع الاتصالات تتم في خادم البيانات<br />
١- عند<br />
إغلاق الاتصال بقواعد البيانات<br />
Close يتم<br />
٢- عند<br />
إتلاف الاتصال<br />
Dispose يتم<br />
٣- عند حدوث أحد الأمرين التاليين يتم إلغاء وعاء الاتصالات:<br />
•<br />
حذف آخر اتصال من وعاء<br />
.<br />
•<br />
عند مرور وقت معين.<br />
٤- الاتصال الحالي المشغول لا يمكن استخدامه.<br />
٥-القيمة الافتراضية هي استخدام وعاء الاتصالات.<br />
٦- عند ترك الاتصال مفتوحا لا يتم إعادته إلى وعاء الاتصالات.<br />
٧- لا<br />
ترحيل الاتصال إلى وعاء الاتصالات.<br />
إلغاء الاتصال من الذاكرة ولا يتم إرجاعه إلى وعاء الاتصالات.<br />
يتم استخدام وعاء الاتصال في حالة اختلاف اسم المستفيد في سلسلة الاتصال.<br />
٨- القيم الافتراضية للخاصيتين<br />
Min و Max هما ٠ و<br />
١٠٠ على التوالي.<br />
٩- إذا تم شغل كل الاتصالات في الوعاء مع مستخدمين و جاء في نفس الوقت طلب اتصال من قبل مستخدم<br />
ما فإنه يتم إرسال طلب اتصال و يتم وضع هذا الطلب في الانتظار حتى يتم إغلاق اتصال ما وفي حالة مرور الوقت<br />
Timeout<br />
وعدم تلبية الطلب فإنه يتم الرجوع بخطأ<br />
.<br />
العامل<br />
العوامل المستخدمة في سلسلة الاتصال وتخص<br />
الشرح<br />
وعاء الاتصالات<br />
141
خالد الجديع kal_judaia@hotmail.com<br />
الوقت بالثانية لمدة بقاء الاتصال في وعاء الاتصالات قبل تدميره.<br />
العدد الأقصى من الاتصالات في وعاء الاتصالات.<br />
العدد الأقل من الاتصالات في وعاء الاتصال.<br />
Connection Lifetime<br />
Max Pool Size<br />
Min Pool Size<br />
142
خالد الجديع kal_judaia@hotmail.com<br />
البيئة المتصلة في ADO.NET<br />
مر بنا في باب البيئة المتصلة و البيئة الغير متصلة، أنه في البيئة المتصلة توجد قناة اتصال<br />
مفتوحة مع قواعد البيانات حتى تتم عملية الانتهاء من هدف الاتصال بقاعدة البيانات ومن ثم يتم<br />
اغلاق الاتصال. تمثل هذه البيئة في ADO.NET بكائن الأمر و كائن قارئ البيانات. يمكن<br />
تخيل عمل البيئة المتصلة من خلال الشكل(١-١٤) .<br />
شكل ١-١٤ :<br />
نموذج البيئة المتصلة في بيئة الدوت نت<br />
في البيئة المتصلة العمل<br />
البيانات قواعد<br />
Connection<br />
Command<br />
DataReader<br />
طريقة عمل البيئة المتصلة<br />
:<br />
-١<br />
-٢<br />
يتم إنشاء اتصال بقاعدة البيانات.<br />
يتم تحديد العملية المراد إجراءها.<br />
٣-يتم قراءة البيانات إن احتيج إلى ذلك.<br />
٤- يتم إغلاق الاتصال بقاعدة البيانات.<br />
لعلك تلاحظ أننا نستخدم ثلاث كائنات :هي كائن الاتصال،<br />
كائن الأمر و كائن قارئ البيانات.<br />
143
خالد الجديع kal_judaia@hotmail.com<br />
كائن الأمر<br />
: Command<br />
: تعريفه .I<br />
يمكن تعريف الكائن<br />
Command من خلال تقسيم محتواه<br />
١- إما أن يحوي جملة لغة استفسار بنائية<br />
:<br />
٢- أو يحوي استدعاء إجراء مخزن في قواعد البيانات<br />
.-Stored Procedure-<br />
.-SQL Statement -<br />
ومن ثم تستطيع تنفيذ هذا المحتوى من خلال بعض الوظائف في هذا الكائن و إرجاع النتيجة إلى<br />
كائن قارئ البيانات<br />
.DataReader<br />
.II<br />
طريقة الوصول إليه<br />
:<br />
يمكن الوصول لكائن الأمر من خلال<br />
فضاء الاسم التالي<br />
:<br />
System.Data.OleDb.OleDbCommand<br />
System.Data.SqlClient.SqlCommand<br />
:<br />
.III<br />
: خصائصه<br />
توجد عدة خصائص لكائن الأمر تمكننا من التعامل معه وهي<br />
الخاصية القيمة الشرح<br />
Name<br />
Connection<br />
كائن الاتصال المستخدم<br />
يمثل اسم كائن الأمر و الذي سوف تتعامل معه<br />
في الكود<br />
اسم الاتصال الذي سوف يقوم باستخدامه كائن<br />
الأمر<br />
تنفيذ لغة استفسار بنائية<br />
Text CommandType<br />
StoredProcedur تنفيذ إجراء موجود في قاعدة البيانات<br />
TableDirect التعامل مع جدول واحد<br />
144
خالد الجديع kal_judaia@hotmail.com<br />
١- عبارة لغة الاستفسار البنائية التي سوف<br />
على اعتمادا<br />
الخاصية<br />
CommandText<br />
يتم تنفيذها سواء لاسترجاع أو تحديث<br />
بيانات<br />
٢- اسم الإجراء الموجود في قاعدة البيانات<br />
السابقةCommandType<br />
سوف يكون لدينا واحد من<br />
ثلاث مدخلات<br />
و الذي نريد تنفيذه.<br />
٣- اسم الجدول الذي نريد التعامل معه<br />
القيمة المدخلة في خاصية Command Text<br />
تعتمد على القيمة التي تم اختيارها في<br />
الخاصية .CommandType<br />
.IV طرق كائن الأمر :<br />
سوف نتطرق لأهم ثلاثة طرق في كائن الأمر وهي :<br />
الطريقة<br />
الهدف منها<br />
تنفيذ استعلام مما يؤدي إلى<br />
إرجاع<br />
أكثر من صف من قاعدة<br />
ExecuteReader<br />
البيانات وهو ما<br />
يتطلب<br />
استرجاع هذه النتيجة<br />
بواسطة كائن قارئ<br />
البيانات.<br />
تنفيذ أمر يقوم بتحديث قواعد البيانات أو تكوين قواعد البيانات و<br />
النتيجة التي ترجع هي عدد الصفوف المتأثرة بالأمر.<br />
تنفيذ أمر يسترجع قيمة واحدة فقط من قواعد البيانات.<br />
ExecuteNonQuery<br />
ExecuteScalar<br />
• تنفيذ الأمر الذي يرجع قيمة واحدة<br />
يجدر القول هنا بأن هذه من أوجه تفوق ADO.NET على<br />
لتنفيذ الأوامر التي ترجع قيمة واحدة.<br />
ADO حيث خصصت دالة<br />
من أمثلة الأوامر التي لا<br />
ترجع إلا قيمة واحدة :<br />
١- مجموع مشتريات اليوم.<br />
٢- متوسط المشتريات هذا الشهر.<br />
145
خالد الجديع kal_judaia@hotmail.com<br />
٣- عدد المنتجات التي توجد داخل المستودع.<br />
فيما لو أعادت جملة<br />
SQL<br />
من الصف الأول و العامود الأول وهو ما يظهر أن<br />
تعيد كل القيم.<br />
أكثر من قيمة فسوف يتم إهمال كل القيم ماعدا القيمة الأولى<br />
ADO.NET<br />
أقوى من<br />
ADO التي<br />
:<br />
انظر إلى المثال التالي<br />
لاستخدام كائن الأمر لاسترجاع قيمة واحدة من قاعدة البيانات<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select count(*) from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
con.Open()<br />
Dim cmd As New OleDb.OleDbCommand(sql, con)<br />
Label1.Text = cmd.ExecuteScalar().ToString<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
: الشرح<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
-٧<br />
عرفنا اتصال بقاعدة البيانات في السطر الأول.<br />
في السطر الثاني عرفنا جملة الاستعلام.<br />
في السطر الثالث عرفنا سلسلة الاتصال.<br />
محاولة فتح الاتصال ثم إنشاء كائن الأمر مع إعطائه جملة الاستعلام و الاتصال الذي<br />
سيقوم باستخدامه.<br />
قمنا بتنفيذ الطريقة<br />
ExecuteScalar<br />
قمنا بعرض النتيجة على أداة عنوان كما في الشكل(٢-١٤).<br />
في حالة حصول خطأ سيتم إظهاره في أداة عنوان.<br />
شكل ٢-١٤ :<br />
استرجاع قيمة واحدة من قاعدة البيانات.<br />
لتنفيذ الأمر و التي سوف تعيد لنا نتيجة العملية.<br />
146
خالد الجديع kal_judaia@hotmail.com<br />
انسخ قاعدة البيانات الموجودة مع القرص المرفق وضعها في \:c مباشرة كما ترى ذلك<br />
واضحا من سلسلة الاتصال، ثم طبق المثال، ضع الكود السابق داخل حدث النقر في زر أمر<br />
كما يظهر من الشكل<br />
(٢-١٤)<br />
• تنفيذ الأمر الذي يمكن أن يرجع عدة صفوف<br />
يقوم قارئ البيانات بقراءة البيانات إلى الأمام وهو كما تلاحظ من اسمه مخصص لقراءة<br />
البيانات.عند تنفيذ كائن الأمر الذي يرجع عدة صفوف يمكنك استخدام قارئ البيانات للمرور<br />
على هذه الصفوف.لاسترجاع عدة صفوف استخدم الوظيفة<br />
.ExecuteReader<br />
عند قراءة البيانات باستخدام قارئ البيانات فإن الاتصال يبقى مفتوحا حتى تقوم بإغلاقه، لذا<br />
يجب عليك إغلاق الاتصال حالما تقوم بالانتهاء من قراءة البيانات. يمكن الوصول لكائن<br />
قارئ البيانات من خلال فضاء الاسم التالي :<br />
System.Data.OleDb.OleDbDataReader<br />
System.Data.SqlClient.SqlDataReader<br />
:<br />
خصائص و وظائف قارئ البيانات<br />
يمكن أن نستعرض أبرز خصائص قارئ البيانات من خلال الجدول التالي<br />
خاصية-وظيفة<br />
الهدف منها<br />
False<br />
قراءة الصف التالي، ترجع<br />
True إذا وجد الصف أو<br />
إذا لم يوجد<br />
Read<br />
ترجع قيمة<br />
العامود<br />
إما باستخدام اسم محدد أو رقمه<br />
Item<br />
تستخدم لاسترجاع قيمة الصف كاملا وقد تكون أكثر فعالية من استرجاع<br />
قيمة العامود لوحده<br />
هل تحتوي قيمة<br />
Null<br />
إغلاق قارئ البيانات وهو لا يقوم بإغلاق الاتصال<br />
GetValues<br />
isDBnull<br />
close<br />
147
خالد الجديع kal_judaia@hotmail.com<br />
sql<br />
RecordsAffected<br />
عدد السجلات المتأثرة بجملة<br />
كيف تستخدم قارئ البيانات لمعالجة الصفوف<br />
سوف نستعرض مثالا يوضح لنا كيفية استخدام كائن الأمر و كائن قارئ البيانات لاسترجاع<br />
مجموعة من الصفوف من قاعدة البيانات<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim rdName As OleDb.OleDbDataReader<br />
Dim sql As String = "select * from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
con.Open()<br />
Dim cmd As New OleDb.OleDbCommand(sql, con)<br />
rdName = cmd.ExecuteReader()<br />
Do While rdName.Read()<br />
ListBox1.Items.Add(rdName.GetString(1))<br />
Loop<br />
rdName.Close()<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
:<br />
False من<br />
لكي تستخدم قارئ البيانات لمعالجة مجموعة من الصفوف قم بالخطوات التالية<br />
١- إضافة كائن الأمر و إعطائه الخصائص المناسبة<br />
٢- الإعلان عن قارئ البيانات<br />
٣- فتح الاتصال بقاعدة البيانات<br />
الوظيفة<br />
٤- استدعاء الوظيفة<br />
:<br />
ExecuteReader<br />
٥- استدعاء الوظيفة Read و المرور على الصفوف حتى ترجع لك قيمة<br />
.Read<br />
-٦<br />
إغلاق قارئ البيانات<br />
148
خالد الجديع kal_judaia@hotmail.com<br />
:<br />
لتنفيذ المثال السابق<br />
اسم الأداة<br />
أضف الأدوات التالية<br />
الخاصية<br />
القيمة<br />
cmdExecute<br />
استرجاع بيانات الموظفين<br />
Label1<br />
ListBox1<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
RightToLeft<br />
Button1<br />
Label1<br />
أداة عنوان<br />
تنفيذ أمر يسترجع عدة صفوف<br />
Yes<br />
Form1<br />
لإغلاق الاتصال بعد استخدامه آليا استخدم العامل الذي يؤدي ذلك كما في العبارة التالية<br />
rdName = cmd.ExecuteReader(CommandBehavior.CloseConnection)<br />
:<br />
•<br />
تنفيذ الأمر الذي لا يرجع أي قيمة<br />
يمكن تلخيص الحالات التي يتم فيها تنفيذ الأمر الذي لا يرجع قيمة بما يلي<br />
149
خالد الجديع kal_judaia@hotmail.com<br />
إنشاء و إدارة هياكل قواعد البيانات<br />
إعطاء أو حظر صلاحية لمستخدم ما.<br />
إضافة و تعديل و حذف بيانات من جداول في قاعدة البيانات<br />
-١<br />
-٢<br />
-٣<br />
إنشاء و إدارة هياكل قواعد البيانات DDL<br />
هي اللغة المستخدمة في إنشاء و إدارة هياكل قواعد البيانات.<br />
يمكن التمثيل لهياكل قواعد البيانات بالأمثلة التالية :<br />
•<br />
•<br />
١- الجداول<br />
-٢ View المستعرضات<br />
-٣ المحفزات Trigger<br />
من جمل تعريف هياكل البيانات :<br />
الجملة<br />
الهدف منها<br />
تستخدم لإنشاء كائن في قاعدة البيانات مثل الجدول<br />
تستخدم لتغيير صفات كائن في قاعدة البيانات<br />
تستخدم كائن من قاعدة البيانات<br />
Create<br />
ALTER<br />
DROP<br />
لغة التحكم بالبيانات DCL<br />
هي اللغة التي تمكنك من<br />
إعطاء أو حظر صلاحية لمستخدم ما.<br />
من جمل لغة التحكم بالبيانات :<br />
الجملة<br />
الهدف منها<br />
تستخدم لمنح صلاحية لمستخدم على كائن في قاعدة البيانات<br />
حظر الصلاحية لمستخدم ما<br />
Grant<br />
DENY<br />
كيف تنفذ جملتي DDL و DCL<br />
150
خالد الجديع kal_judaia@hotmail.com<br />
يتم تنفيذ لغتي التحكم بالبيانات و تعريف البيانات باستخدام الوظيفة<br />
ExecuteNonQuery و<br />
التي تعتبر احد الوظائف التابعة لكائن الأمر. تقوم هذه الوظيفة بإرجاع عدد الصفوف المتأثرة<br />
بالعملية.<br />
خطوات تنفيذ DDL و DCL<br />
لكي تستوعب طريقة تنفيذ جمل إنشاء و إدارة قواعد البيانات انظر إلى المثال التالي<br />
:<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "create table MyNewTable (t5 varchar(10))"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
con.Open()<br />
Dim cmd As New OleDb.OleDbCommand(sql, con)<br />
Label1.Text = cmd.ExecuteNonQuery().ToString<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
من المثال قمنا بما يلي :<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
إنشاء كائني الاتصال و الأمر كما تعلمت سابقا<br />
فتح الاتصال بقاعدة البيانات<br />
تحديد الجملة التي تريد تنفيذها<br />
استدعاء وظيفة<br />
ExceuteNonQuery<br />
إغلاق الاتصال بقاعدة البيانات<br />
•<br />
سوف تكون نتيجة عملية إنشاء قواعد البيانات صفر إذا نجحت العملية و<br />
تنجح.<br />
جمل تعديل البيانات DML<br />
غير ذلك إذا لم<br />
جمل تعديل البيانات كما تدل عليها الترجمة الحرفية وهي الجمل التي تمكنك من اضافة و<br />
تعديل و حذف بيانات من جداول في قاعدة البيانات<br />
جمل لغة تعديل البيانات هي :<br />
الجملة<br />
الهدف منها<br />
151
خالد الجديع kal_judaia@hotmail.com<br />
وهي الجملة التي تستخدم لإضافة بيانات إلى جدول في قاعدة<br />
البيانات<br />
وهي الجملة التي تستخدم لتحديث بيانات سبق ادخالها<br />
حذف صف أو أكثر من قاعدة البيانات<br />
INSERT<br />
UPDATE<br />
DELETE<br />
كيف تنفذ DML<br />
يتم تنفيذ لغة تعديل البيانات باستخدام الوظيفة ExecuteNonQuery و التي تعتبر احد<br />
الوظائف التابعة لكائن الأمر.تقوم هذه الوظيفة بإرجاع عدد صحيح يمثل عدد الصفوف<br />
المتأثرة بالعملية.<br />
لكي تستوعب طريقة تنفيذ جمل لغة تعديل البيانات انظر إلى المثال التالي<br />
:<br />
-١<br />
أنشئ نموذجا و ضع فيه الكائنات التالية و غير خصائصها كما يلي<br />
:<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdExecute<br />
إضافة سجل الموظف<br />
Label1<br />
Label2<br />
اسم الموظف بالعربي<br />
Label٣<br />
اسم الموظف بالإنجليزي<br />
Textbox1<br />
Textbox1<br />
Yes<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
RightToLeft<br />
Button1<br />
Label1<br />
Label2<br />
Label٣<br />
مربع نص<br />
TextBox2<br />
Form1<br />
2-اكتب الكود التالي في حدث النقر لزر الأمر<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "insert into person (name,ename) values " & _<br />
"('" & TextBox1.Text & "','" & TextBox2.Text & "')"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source" & _<br />
152
خالد الجديع kal_judaia@hotmail.com<br />
"=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
con.Open()<br />
Dim cmd As New OleDb.OleDbCommand(sql, con)<br />
Label1.Text = cmd.ExecuteNonQuery().ToString<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
لفهم المثال السابق :<br />
اتبع ما يلي<br />
•<br />
١- أنشئ كائني الاتصال و الأمر كما تعلمت سابقا<br />
٢- افتح الاتصال بقاعدة البيانات<br />
٣- قم باستدعاء وظيفة ExceuteNonQuery<br />
٤- أغلق الاتصال بقاعدة البيانات<br />
٥- انظر الشكل النهائي بعد التنفيذ حيث رجع لنا<br />
قيمة<br />
١ وهو يمثل<br />
عدد السجلات<br />
المتأثرة<br />
153
خالد الجديع kal_judaia@hotmail.com<br />
استخدام العملية الواحدة<br />
ما هي العملية الواحدة<br />
يمكن تعريف<br />
منها شيء على<br />
العملية الواحدة بأنها مجموعة من العمليات التي إما أن تنفذ بالكامل أو لا<br />
الإطلاق.<br />
إذا نجحت<br />
كل هذه العمليات فإنه سوف يتم الالتزام<br />
ينفذ<br />
-Commit–<br />
بكل العمليات في قاعدة البيانات أما إذا فشلت أي من العمليات فإنه سوف يتم التراجع عن كل<br />
عمليات التحديث في قاعدة البيانات<br />
يعتبر<br />
البيانات.<br />
. – RollBack –<br />
استخدام العملية الواحدة مهم جدا حتى لا يحدث خلل في البيانات الموجودة في قاعدة<br />
أمثلة عملية على استخدام العملية الواحدة<br />
إليك هذا المثال من الواقع<br />
:<br />
١- عند<br />
إضافة فاتورة إلى قاعدة البيانات فإن الفاتورة تتكون من جزأين هما المعلومات<br />
الأساسية للفاتورة مثل رقم الفاتورة و<br />
و الكميات، في البداية لابد من<br />
المعلومات الأساسية ثم<br />
إضافة<br />
إضافة التفاصيل<br />
تاريخها و الجزء الثاني هو تفاصيل الفاتورة مثل<br />
المعلومات الأساسية ثم استرجاع الرقم<br />
الأساسي<br />
الأصناف<br />
من جدول<br />
الواحد تلو الآخر. عند فشل إضافة التفاصيل يتوجب<br />
التراجع عن الإضافات السابقة و إلا نتج عن ذلك فاتورة غير مكتملة البيانات.<br />
٢- عند الخصم من<br />
الحساب الأول و<br />
الإضافة إلى حساب آخر في نفس الوقت فإنه عند<br />
نجاح عملية الخصم من الحساب الأول و فشل عملية الإضافة إلى الحساب الثاني فإن العملية كلها<br />
تعتبر عملية فاشلة يجب التراجع عنها و إلا أصبح هناك خلل في البيانات.<br />
أنواع العملية الواحدة<br />
•<br />
: عملية محلية<br />
•<br />
في هذه الحالة تستهدف العملية الواحدة قاعدة<br />
النوع سهل التطبيق ومدعوم من قبل جميع مزودي البيانات.<br />
: عملية موزعة<br />
بيانات واحدة لا غير.<br />
هذا<br />
في هذه الحالة تستهدف العملية الواحدة أكثر من قاعدة بيانات و يجب أن<br />
تنجح كل العمليات التي تنتمي للعملية الواحدة أو يتم التراجع عنها كلها.<br />
154
خالد الجديع kal_judaia@hotmail.com<br />
إضافة<br />
ريال ١٠٠<br />
إضافة<br />
My<br />
My<br />
Component<br />
خصم<br />
ريال<br />
ريال<br />
ريال ١٠٠<br />
خصم<br />
الدائن الدائن حساب<br />
المدين المدين حساب<br />
حساب<br />
الواحدة العملية<br />
كيف تدير العملية الواحدة باستخدام ADO.NET<br />
•<br />
هذه الخطوات توضح لك كيفية تنفيذ العملية الواحدة،<br />
اتبع الخطوات التالية<br />
:<br />
BeginTransaction<br />
-١<br />
وهي أحد الوظائف التابعة للكائن<br />
قم باستدعاء الوظيفة<br />
Connection<br />
٢- عرف متغيرا من نوع Oletransaction واجعل قيمته تساوي الوظيفة التي عرفتها<br />
في الخطوة رقم<br />
الخطوة رقم<br />
فقم باستدعاء<br />
١<br />
٣- اشر في كائن الأمر<br />
٢<br />
٤- نفذ جميع الأوامر<br />
.<br />
Rollback<br />
من خلال خاصية<br />
إذا نجحت العملية قم باستدعاء<br />
Transaction إلى المتغير الذي عرفته في<br />
Commit أما إذا لم تنجح العملية<br />
انظر إلى المثال التالي لاستخدام العملية الواحدة :<br />
Dim con As New OleDb.OleDbConnection()<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data<br />
Source=C:\TelDir.mdb;Persist Security Info=False"<br />
con.Open()<br />
Dim cmd As New OleDb.OleDbCommand()<br />
Dim trans As OleDb.OleDbTransaction = con.BeginTransaction<br />
cmd.Connection = con<br />
cmd.Transaction = trans<br />
Dim sql1 As String = "insert into person (name,ename) values ('" &<br />
TextBox1.Text & "','" & TextBox2.Text & "')"<br />
Dim sql2 As String = "insert into Teltype (name,ename) values ('" &<br />
TextBox3.Text & "','" & TextBox4.Text & "')"<br />
Try<br />
cmd.CommandText = sql1<br />
cmd.ExecuteNonQuery()<br />
cmd.CommandText = sql2<br />
cmd.ExecuteNonQuery()<br />
155
خالد الجديع kal_judaia@hotmail.com<br />
trans.Commit()<br />
Catch e1 As OleDb.OleDbException<br />
trans.Rollback()<br />
Label1.Text = e1.Message<br />
End Try<br />
في المثال السابق الكود الموجود بخط عريض هو الكود الذي يقوم بإدارة العملية الواحدة،<br />
لاحظ<br />
أننا نقوم بعمليتي إضافة على قواعد البيانات فإذا نجحت الأولى ثم فشلت الثانية فإنه سوف يتم<br />
التراجع عن عملية الإضافة الأولى،<br />
وهو ما يضمن بقاء قاعدة البيانات دقيقة.<br />
درجات العزل<br />
ما هي درجات العزل<br />
يمكن تعريف<br />
درجات العزل بأنها أداء<br />
إقفال عملية للاتصال.<br />
بالطبع يتوجب عليك اختيار<br />
درجة العزل المناسبة عند تضارب أكثر من عملية على نفس البيانات.<br />
مثال في الدوت نت يوضح كيفية استخدام العزل<br />
:<br />
HRMTran=HRMCon.BeginTransaction(isolationLevel.Serialzable<br />
أمثلة لمشاكل العمل الجماعي<br />
يمكن<br />
إعطاء أشهر مثالين لمشاكل العمل الجماعي<br />
Dirty Read القراءة الملوثة : و تحصل عندما تقوم عملية ما بقراءة بيانات يتم<br />
-١<br />
تحديثها من قبل عملية أخرى لكن لم تتم<br />
إلزام<br />
-Commit– التحديثات على قواعد البيانات.<br />
بالطبع<br />
لأن القراءة التي تتم في هذا الوقت قد لا تعطي معلومات دقيقة عن البيانات.<br />
Phantom Read القراءة الخيالية : وتحدث عندما تقوم عملية ما بقراءة بيانات يتم<br />
-٢<br />
حذفها من قبل عملية أخرى لكن لم تتم عملية<br />
إلزام التحديثات على قواعد البيانات.<br />
156
خالد الجديع kal_judaia@hotmail.com<br />
ارشادات لاختيار درجة العزل<br />
يوفر لنا الكائن OLEDBTransaction خاصية تسمى IsolationLevel و تقوم باختيار<br />
قيمة هذه الخاصية عندما تبدأ عملية واحدة<br />
الشرح<br />
القيمة<br />
BeginTransaction<br />
وهو العزل الذي يسمح بقراءة كل البيانات غير<br />
الملزمة في قواعد البيانات فلذلك سوف تحصل<br />
.Phantom Read و Dirty Read<br />
ReadUncommitted<br />
Serializable<br />
Readcommitted<br />
في هذه الحالة يتم عزل جميع العمليات عن بعضها<br />
فلا تحصل<br />
سوف يتم<br />
Phantom Read و لا Dirty Read<br />
منع<br />
Dirty Read<br />
وهو ما يعني أن<br />
العملية لن تقرأ إلا البيانات التي تم إلزام تحديثها في<br />
قواعد البيانات لكن لن يتم منع<br />
وهذه هي القيمة الافتراضية<br />
Phantom Read<br />
157
خالد الجديع kal_judaia@hotmail.com<br />
العمل مع مجموعة البيانات<br />
DATASET<br />
في الفصل الذي تكلمنا فيه عن البيئة غير المتصلة قمنا بتعريفها كما يلي<br />
:<br />
مجموعة من البيانات<br />
يتم نسخها و تعديلها من مصدر البيانات ومن ثم إرجاع هذه التعديلات إلى مصدر البيانات. لذلك<br />
تعتبر البيئة غير المتصلة هي البيئة المثالية عندما يكون أداء النظام هو المحك.<br />
تزودنا ADO.NET بمجموعة من الكائنات للعمل في البيئة غير المتصلة. يوجد كائنان<br />
أساسيان للعمل في البيئة غير المتصلة و هما<br />
:<br />
-١<br />
مجموعة البيانات<br />
: Dataset<br />
هي عبارة عن قاعدة بيانات صغيرة موجودة في الذاكرة<br />
تمكنك من إنشاء جداول و ربط هذه الجداول بعلاقات كما يتوفر فيها مجموعة من<br />
الوظائف المساعدة على تسهيل التعامل مع هذه البيانات. ومع أن مجموعة البيانات<br />
تعتبر خيارا ممتازا في كثير من الحالات إلا أنها قد لا تكون حلا مثاليا في حالات أخرى مثل<br />
أن تريد قراءة بيانات من قاعدة البيانات فقط.<br />
DataSet<br />
Relations<br />
DataRelation<br />
DataRelation<br />
Tables<br />
DataTable<br />
DataRow(s)<br />
DataColumn<br />
Constraint(s)<br />
DataTable<br />
DataTable<br />
DataView<br />
DataViewManager<br />
حسب ما يظهر من الشكل يمكن تقسيم مجموعة البيانات إلى<br />
:<br />
.a<br />
.b<br />
جدول بيانات<br />
: DataTable<br />
عبارة عن تمثيل لجدول إما أن تقوم ببناء هيكله أو<br />
تأخذه من مصدر بيانات. يمكن أن تحتوي مجموعة البيانات على عدد غير<br />
محدود من الجداول.<br />
أعمدة<br />
: DataColumn<br />
عبارة عن تمثيل لعامود داخل جدول هذا العامود له<br />
نوع و اسم وطول و غير ذلك من مواصفات الأعمدة كما يوجد في قواعد<br />
البيانات.<br />
159
خالد الجديع kal_judaia@hotmail.com<br />
: DataRow صفوف .c<br />
.d<br />
.e<br />
.f<br />
القيود<br />
: DataConstarint<br />
وهي صفوف البيانات.<br />
قيود توضع على الأعمدة مثل<br />
Constraint قيد عدم التكرار أو قيد عدم قابلية قيمة<br />
العلاقات<br />
Unique<br />
.Null<br />
: DataRelation<br />
إنشاء علاقات بين هذه الجداول.<br />
المستعرضات : DataView<br />
خلال هذا الكائن.<br />
ملاحظات عامة هامة حول مجموعة البيانات<br />
بعد إنشاء الجداول تستطيع من خلال هذا الكائن<br />
تستطيع إنشاء مستعرض على جدول أو أكثر من<br />
يمكن أن تحتوي مجموعة البيانات عدد غير محدود من الجداول.<br />
أقرب ما يمكن تشبيها ب<br />
تتصل بقواعد البيانات من خلال<br />
DataAdaptor<br />
RecordSet<br />
تستطيع إضافة الجداول إلى مجموعة البيانات الواحدة من مصادر متنوعة<br />
MySQL,Oracle.. ثم ربطها مع بعض<br />
مجموعة البيانات ليس لها مزود بيانات محدد بل هي عامة لجميع مزودي البيانات<br />
مجموعة البيانات متسلسلة<br />
: Serializable<br />
تحول إلى اكس ام ال و العكس<br />
•<br />
•<br />
•<br />
•<br />
•<br />
•<br />
٢- مهيء البيانات<br />
: Data Adaptor<br />
يقوم هذا الكائن باستخدام ثلاثة كائنات باطنيا وهي قارئ<br />
البيانات و كائن الأمر و كائن الاتصال. يقوم بفتح الاتصال بمصدر البيانات عن طريق كائن<br />
الاتصال ثم استخدام كائن الأمر لتنفيذ عملية ما ثم قارئ البيانات لقراءة البيانات و تعبئتها في<br />
مجموعة البيانات<br />
160
خالد الجديع kal_judaia@hotmail.com<br />
دورة الحياة في مجموعة البيانات<br />
تصور دورة الحياة في مجموعة البيانات يساعد على فهمها فهما دقيقا ومن ثم يسهل التعامل معها.<br />
يمكن تقسيم مراحل التعامل مع<br />
مجموعة البيانات إلى الخطوات<br />
: التالي<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
تعبئة مجموعة البيانات بواسطة مهيء البيانات.<br />
ربط الجداول بعلاقات إن كان هناك احتياج.<br />
التعامل مع البيانات.<br />
التأثير على قواعد<br />
البيانات بواسطة مهئ البيانات.<br />
DataSet<br />
Original<br />
DataStore<br />
البيانات عن استخراج<br />
طريق<br />
Adaptor<br />
Table1<br />
Table2<br />
العلاقات انشاء<br />
على قواعد التأثير<br />
البيانات<br />
DataSet<br />
Table1<br />
مع البيانات التعامل<br />
DataSet<br />
Table1<br />
Table2<br />
Table2<br />
يوجد هناك طريقتان للتعامل مع مجموعة البيانات<br />
:<br />
-١<br />
-٢<br />
إنشاء هيكل البيانات<br />
برمجيا :<br />
أن تقوم بإنشاء مجموعة البيانات و إنشاء الجداول و<br />
الأعمدة و العلاقات بنفسك ومن ثم إضافتها إلى مجموعة البيانات.<br />
بناء مجموعة البيانات من هيكل قاعدة البيانات<br />
:<br />
البيانات و تبني مجموعة البيانات بناء على هذا الهيكل.<br />
أن تحضر هيكل البيانات من قواعد<br />
161
خالد الجديع kal_judaia@hotmail.com<br />
إنشاء هيكل البيانات<br />
برمجيا<br />
تعتبر هذه الطريقة قليلة الاستخدام لأن أغلب التطبيقات تقوم<br />
بملء مجموعة البيانات من قاعدة<br />
بيانات وهو<br />
ما يعني<br />
إحضار هيكل البيانات.<br />
سوف تساعدك هذه الطريقة على فهم قريب لمجموعة<br />
:<br />
البيانات .<br />
سوف ننشئ هيكل البيانات لمجموعة البيانات في الخطوات التالية<br />
١- الخطوة الأولى هي إنشاء مجموعة البيانات.<br />
لإنشاء مجموعة بيانات برمجيا قم بكتابة<br />
Dim dsTelDir As New DataSet()<br />
.dsTelDir<br />
الأمر التالي :<br />
يقوم الأمر السابق بإنشاء مجموعة بيانات اسمها<br />
٢- الخطوة الثانية<br />
إنشاء جدول ثم إضافته إلى مجموعة البيانات التي سبق إنشائها.<br />
لإنشاء<br />
جدول و إضافته إلى مجموعة البيانات قم بما يلي:<br />
Dim dtPerson As DataTable = dsTelDir.Tables.Add()<br />
في العبارة السابقة قمنا بإضافة جدول إلى مجموعة البيانات التي<br />
أنشأناها حديثا ثم أسندنا هذا<br />
. dtPerson عند<br />
الجدول إلى جدول<br />
أنشأناه و اسمه<br />
إضافة جدول إلى مجموعة بيانات و عدم<br />
تسميته فإنه يأخذ اسم TableX<br />
و العدد اكس هو تصاعدي حسب عدد الجداول الموجودة في<br />
مجموعة البيانات.<br />
الخطوة الثالثة هي إضافة<br />
عامود إلى جدول داخل مجموعة البيانات.<br />
الأمر التالي يقوم<br />
-٣<br />
بإنشاء<br />
عامود ومن ثم إضافته إلى جدول<br />
Dim colName As DataColumn = dtPerson.Columns.Add("Name", GetType(System.String))<br />
colName.AllowDBNull = False<br />
colName.Unique = True<br />
:<br />
في الخطوة السابقة قمنا بما يلي :<br />
.String<br />
عامود إضافة<br />
–حقل- وعينا له اسم<br />
Name و نوع<br />
.a<br />
وضعنا قيد منع Null<br />
إدخال قيم<br />
.b<br />
في السطر الثالث<br />
استخدمنا قيد وحيد<br />
Unique لمنع تكرار نفس القيمة.<br />
.c<br />
سوف نحاول تطبيق كل الخطوات السابقة من خلال المثال التالي<br />
:<br />
Dim dsTelDir As New DataSet()<br />
Dim dtPerson As DataTable = dsTelDir.Tables.Add()<br />
Dim colName As DataColumn = dtPerson.Columns.Add("Name",<br />
GetType(System.String))<br />
162
خالد الجديع kal_judaia@hotmail.com<br />
colName.AllowDBNull = False<br />
colName.Unique = True<br />
MessageBox.Show(dtPerson.TableName)<br />
MessageBox.Show(dsTelDir.Tables.Count.ToString())<br />
في هذا المثال طبقنا كل الخطوات السابقة ثم أظهرنا رسالتان :<br />
١- الرسالة الأولى نقوم بعرض اسم الجدول.<br />
الرسالة<br />
٢- الثانية نقوم فيها بعرض عدد الجداول في مجموعة البيانات.<br />
إنشاء قيد المفتاح الرئيسي<br />
تحوي الجداول في قواعد البيانات على<br />
عامود أو أكثر لا يمكن أن<br />
تتكرر قيمته في<br />
:<br />
أي صف من صفوف الجدول.<br />
من أمثلة المفتاح الرئيسي<br />
رقم الموظف في جدول الموظفين<br />
رمز الصنف في جدول الأصناف<br />
-١<br />
-٢<br />
المثال التالي يوضح كيفية إنشاء قيد المفتاح الرئيسي<br />
:<br />
Dim myTable As DataTable = New DataTable()<br />
Dim myColumn As DataColumn<br />
myColumn = New DataColumn()<br />
myColumn.DataType = System.Type.GetType("System.String")<br />
myColumn.ColumnName = "FirstName"<br />
myTable.Columns.Add(myColumn)<br />
myTable.PrimaryKey = New DataColumn() {myTable.Columns("FirstName")}<br />
يمكن شرح المثال السابق بالخطوات التالية<br />
:<br />
أنشأنا جدول ثم أنشأنا<br />
عامود.<br />
-١<br />
حددنا نوع البيانات و اسم<br />
العامود<br />
-٢<br />
قمنا بإضافة<br />
٣- العامود إلى الجدول<br />
قمنا بتحديد المفتاح الرئيسي من خلال العبارة<br />
:<br />
myTable.PrimaryKey = New DataColumn() {myTable.Columns("FirstName")}<br />
-٤<br />
إنشاء عبارات رياضية<br />
قد تحتاج أن<br />
تعرض حقل<br />
يكون<br />
نتيجة حسابات لحقول أخرى،<br />
مثل أن يكون الحقل الأول يمثل<br />
درجة الاختبار الأول و الحقل الثاني يمثل درجة<br />
الاختبار الثاني ثم هناك حقل يمثل مجموع<br />
163
خالد الجديع kal_judaia@hotmail.com<br />
الدرجات. هذا الحقل يمثل بعامود يأخذ قيمه من الحسابات و لا يكون له عامود مماثل في<br />
قواعد البيانات غالبا. يمكن إضافته باستخدام خاصية Expression وهي أحد خصائص<br />
الكائن<br />
.DataColumn<br />
لننظر إلى المثال التالي الذي سوف يبرز الفكرة<br />
:<br />
Dim ColUnitPrice As New DataColumn("Price", GetType(System.Decimal))<br />
Dim ColQuantity As New DataColumn("Quantity", GetType(System.Decimal))<br />
Dim TotalCost As New DataColumn("Total", GetType(System.Decimal))<br />
Dim mytable As New DataTable()<br />
TotalCost.Expression = "Price * Quantity"<br />
mytable.Columns.Add(ColUnitPrice)<br />
mytable.Columns.Add(ColQuantity)<br />
mytable.Columns.Add(TotalCost)<br />
Dim myRow As DataRow<br />
myRow = mytable.NewRow()<br />
myRow("Price") = 5<br />
myRow("Quantity") = 1<br />
mytable.Rows.Add(myRow)<br />
Label2.Text = mytable.Rows(0).Item(2)<br />
يمكن توضيح المثال السابق بالخطوات التالية :<br />
-١<br />
تعريف ثلاثة أعمد وهي<br />
TotalCost و ColQuantity و ColUnitPrice<br />
-٢<br />
-٣<br />
تعريف جدول<br />
قمنا بتعريف<br />
العامود TotalCost بأنه عبارة رياضية و عينا له قيمة<br />
Quantity وهو حاصل ضرب<br />
العامودين الآخرين.<br />
Price *<br />
-٤<br />
-٥<br />
-٦<br />
أضفنا الأعمدة إلى الجدول<br />
قمنا بتعريف صف جديد<br />
عينا لهذا الصف قيمة وهي صف جديد من الجدول الذي يحوي ثلاثة حقول و بالتالي فإن<br />
هذا الصف سوف يتكون من ثلاث قيم هي<br />
٥ و<br />
أضفنا قيمة ٧-<br />
٥ للسعر و<br />
١ للكمية.<br />
-٨<br />
-٩<br />
قمنا بإضافة هذا الصف للجدول<br />
قمنا بعرض العنصر الثالث<br />
لأنه تم حسابها بناء على المعادلة التي أنشأناها.<br />
١ ونتيجة ضربهما.<br />
–مجموع التكلفة- على أداة عنوان و سوف تكون قيمته<br />
٥<br />
164
خالد الجديع kal_judaia@hotmail.com<br />
بناء مجموعة البيانات من هيكل قاعدة البيانات<br />
لبناء مجموعة بيانات بناء على قاعدة بيانات يوجد هناك طريقتان<br />
:<br />
-١<br />
-٢<br />
استخدام واجهة تطوير الدوت نت.<br />
بناء ذلك برمجيا.<br />
استخدام واجهة تطوير الدوت نت<br />
تعتبر هذه الطريقة من الطرق السريعة للوصول إلى قواعد البيانات ومن ثم بناء واجهات<br />
تتعامل مع قواعد البيانات. استخدام مساعد إنشاء النماذج يعتبر طريقة جيدة لما يسمى<br />
بالنمذجة<br />
.-Prototype–<br />
في البداية لابد من إنشاء مجموعة البيانات ويتم كالتالي<br />
:<br />
-١<br />
قم بإنشاء الاتصال بقاعدة البيانات .TelDir من خلال نافذة مستكشف الخادم كما يظهر<br />
في الشكل<br />
-٢<br />
قم بنقر زر الفأرة الأيمن على<br />
Data Connection<br />
ثم اختر<br />
.Add Connection<br />
سيظهر لك الشكل اختر خانة مزود البيانات Provider ثم اختر المزود الخاص بأكسس وهو<br />
Microsoft.Jet.OLEDB.4<br />
قاعدة البيانات<br />
اختر خانة<br />
Connection<br />
TelDir<br />
ثم اختر<br />
165
خالد الجديع kal_judaia@hotmail.com<br />
-٣<br />
أنشء مهيء البيانات (والذي يوجد في خانة<br />
Data<br />
في مربع الأدوات كما يظهر من<br />
الشكل) وذلك بإضافته إلى النموذج.سوف تظهر لك رسالة ترحيب<br />
انقر التالي.<br />
-٤<br />
سوف تظهر لك شاشة اختيار الاتصال الذي تريد استخدامه قم باختيار<br />
إنشائه كما يظهر من الشكل. ثم انقر على التالي.<br />
الاتصال الذي<br />
تم<br />
سوف تظهر لك شاشة تطلب منك اختيار طريقة الوصول إلى قواعد البيانات. في حالة<br />
مايكروسوفت أكسس لا يوجد إلا الاختيار الأول كما يظهر من الشكل، انقر التالي،<br />
-٤<br />
166
خالد الجديع kal_judaia@hotmail.com<br />
-٥<br />
سوف تظهر لك شاشة تسألك عن جملة<br />
SQL التي<br />
QueryBuilder<br />
تريد تنفيذها. انقر على زر<br />
لإنشاء الجملة بطريقة سهلة. سوف تظهر لك قائمة بالجداول الموجودة<br />
في قاعدة البيانات. قم باختيار الجدول Person ثم انقر موافق. سوف تظهر<br />
لك حقول هذا الجدول كما ترى في الشكل اختر Name،ID ثم انقر موافق.<br />
سوف ترجع إلى الشاشة الأولى انقر التالي.<br />
-٦<br />
سوف يظهر لك الشكل و الذي يخبرك بأنه تم إنتاج جميع أنواع جمل<br />
الاستفسار البنائية للجدول الذي اخترت انقر على زر إنهاء. لاحظ أنه تم<br />
إنشاء كائني اتصال و مهيء بيانات.<br />
167
خالد الجديع kal_judaia@hotmail.com<br />
-٧<br />
اختر<br />
لإنشاء مجموعة البيانات قم بالنقر<br />
بالزر الأيمن على مهيء البيانات ليظهر لك الشكل.<br />
ثم<br />
Generate Data Set<br />
-٨<br />
سوف يظهر لك الشكل و الذي يطلب منك أن تزوده باسم مجموعة البيانات.<br />
dsPerson كما يظهر لك من الشكل. قم بإزالة علامة الاختيار عن<br />
قم تسميتها<br />
Add This<br />
Dataset to The Designer<br />
ملف dsPerson.xsd إلى مستكشف الحلول.<br />
انقر على زر موافق سوف تلاحظ أنه تم إضافة<br />
-٩<br />
لتحميل البيانات من قاعدة البيانات إلى مجموعة البيانات أضف زر أمر على النموذج و<br />
أضف شبكة بيانات Datagrid من مربع الأدوات ثم أضف الكود التالي داخل حدث<br />
168
خالد الجديع kal_judaia@hotmail.com<br />
النقر لزر أمر<br />
Dim ds As New DataSet()<br />
Me.OleDbConnection1.Open()<br />
Try<br />
Me.OleDbDataAdapter1.Fill(ds)<br />
DataGrid1.DataSource = ds.Tables(0)<br />
Catch Ex As OleDb.OleDbException<br />
MessageBox.Show(Ex.Message)<br />
End Try<br />
Me.OleDbConnection1.Close()<br />
في الكود السابق قم بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
عرفنا مجموعة بيانات<br />
قمنا بفتح الاتصال الذي سبق وأن أنشأناه<br />
قمنا بملء مجموعة البيانات بواسطة مهيء البيانات الذي سبق إنشائه.<br />
أرجعنا الجدول رقم صفر –الجدول الأول- إلى Datagrid ليتم عرضه<br />
بناء<br />
مجموعة البيانات برمجيا<br />
169
خالد الجديع kal_judaia@hotmail.com<br />
تعتبر هذه الطريقة الأكثر شيوعا عند استخدام مجموعة البيانات. يمكن ملئ مجموعة البيانات<br />
دون أن تحتاج إلى بناء هيكل البيانات لأن هيكل البيانات بتم تكوينه بعد استرجاع البيانات من<br />
قاعدة البيانات. قم بإضافة الأدوات التالية و أعطها الخصائص التالية<br />
:<br />
اسم الأداة<br />
Button1<br />
الخاصية<br />
Name<br />
Text<br />
القيمة<br />
cmdFillGrid<br />
Name<br />
Text<br />
Name<br />
Text<br />
Label1<br />
إحضار معلومات الأشخاص<br />
Label1<br />
DataGrid1<br />
RightToLeft<br />
dataGrid<br />
Form1<br />
مجموعة البيانات برمجيا<br />
Yes<br />
قم بإضافة الكود التالي في حدث النقر الخاص بزر الأمر<br />
:<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim dsperson As New DataSet()<br />
Dim sql As String = "select id,name from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim da As New OleDb.OleDbDataAdapter(sql, con)<br />
da.Fill(dsperson, "Person")<br />
DataGrid1.DataSource = dsperson.Tables("Person")<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
من الكود السابق يمكن توضيح النقاط التالية :<br />
-١<br />
-٢<br />
عرفنا اتصال بقاعدة البيانات ثم عرفنا مجموعة بيانات ثم عرفنا جملة sql التي نريد<br />
أن نسترجعها، ثم عرفنا سلسلة الاتصال.<br />
قمنا بتعريف مهيء البيانات و أعطيناه عاملان هما<br />
:<br />
-٣<br />
لاسترجاع البيانات و جملة sql التي نريد أن ينفذها.<br />
ملئ مجموعة البيانات بنتيجة جملة الاستفسار<br />
.sql<br />
-٤<br />
قمنا بإرجاع جدول الأشخاص إلى<br />
الاتصال الذي سيستخدمه<br />
Datagrid ليتم عرضه كما يظهر لك من الشكل.<br />
لاحظ أننا لم نقم بفتح الاتصال بقاعدة البيانات لأن مهيء البيانات يقوم بذلك.<br />
170
خالد الجديع kal_judaia@hotmail.com<br />
تطوير واجهة النظام<br />
تعتبر شبكة البيانات من أهم أدوات عرض البيانات و التعامل معها. لذلك سوف نقوم الآن<br />
باستكشاف كيف يمكن أن نطور شكل عرضها و كيفية تعامل مجموعة البيانات معها. لو نظرنا<br />
إلى المثال السابق لوجدنا أنه قد ظهر لنا عنوان عامود رقم الموظف كما جاء من قاعدة البيانات<br />
ماذا لو أردت أن تغير هذا الاسم ليكون باللغة العربية فيظهر رقم الموظف بدلا من id و يظهر<br />
اسم الموظف بدلا من<br />
.Name<br />
تستطيع أن تنشيء تصميم لجداول في شبكة البيانات ومن ثم تجعل هذه الجداول هي واجهات تلك<br />
البيانات التي في مجموعة البيانات. قم بالخطوات التالية لكي تنشأ مظهر لجدول<br />
الموجود في مجموعة البيانات<br />
Person<br />
: da<br />
-١<br />
اذهب إلى خصائص شبكة البيانات لتجد الخاصية<br />
.TableStylas<br />
المجاور لها. ستظهر لك نافذة تحرير مجموعة أنماط الجداول<br />
واضغط زر الانتقال<br />
-٢<br />
اضغط زر الإضافة .Add سيضاف الكائن<br />
للمجموعة. سوف يكون هذا الجدول هو واجهة<br />
البيانات.<br />
DataGridTableStyle1<br />
Person<br />
الموجود من ضمن مجموعة<br />
171
خالد الجديع kal_judaia@hotmail.com<br />
اختر خاصية MappingName قم بكتابة Person وهو اسم الجدول في مجموعة<br />
البيانات و الذي سوف يعرض من خلال هذا الشكل..<br />
-٣<br />
-٤<br />
هذه الخطوة سوف تقوم بربط أعمدة الجدول الموجود في مجموعة البيانات هنا<br />
لنتمكن من إعطائها خصائص كما نريد. انقر على النقاط الثلاثة المقابلة لهذه الخاصية ليظهر<br />
لك الشكل. اضغط زر الإضافة Add ليتم إضافة<br />
، GridColumnStyle<br />
اذهب إلى<br />
الخاصية MappingName و اكتب id ليتم ربط هذا الكائن بالعامود id الموجود في<br />
الجدول Person اذهب إلى خاصية HeaderText و اكتب رقم الموظف، هذا هو ما<br />
سيظهر عنوانا لعامود رقم الموظف في شبكة البيانات. أضف كائنا آخر و اذهب إلى<br />
MappingName و اكتب name.اذهب إلى خاصية HeaderText و اكتب اسم الموظف.<br />
Ok ثم اضغط<br />
Ok ثم شغل البرنامج ليظهر لك الشكل<br />
ربط جدولين ثم عرضهما على شبكة البيانات<br />
ماذا لو أردت أن تعرض الموظفين ثم بعد اختيار واحد منهما تقوم بعرض أرقام هاتفه كما يظهر<br />
. من الشكل<br />
لاحظ كيف تم عرض اختيار أرقام الموظف ثم عرضها بشكل رأس و تفاصيل.<br />
172
خالد الجديع kal_judaia@hotmail.com<br />
قم بتغيير الكود في المثال السابق ليكون كما يلي<br />
:<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim Myds As New DataSet()<br />
Dim sql(1) As String<br />
sql(0) = "select id,name from person"<br />
sql(1) = "select ID,Number,person from Phone"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql(0), con)<br />
Dim daPhone As New OleDb.OleDbDataAdapter(sql(1), con)<br />
daPerson.Fill(Myds, "Person")<br />
daPhone.Fill(Myds, "Phone")<br />
_ & ","الموظف هاتف أرقام")Myds.Relations.Add<br />
"Myds.Tables("Person").Columns(0), Myds.Tables("Phone").Columns(2), True)<br />
DataGrid1.DataSource = Myds<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
لتوضيح الكود التالي افهم الخطوات التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
تم تعريف اتصال ثم تعريف مجموعة بيانات.<br />
تم تعريف مصفوفة مكونة من صفين كل واحد منهما يمثل جملة استعلام، الأول من<br />
جدول الموظفين و الثاني من جدول أرقام الهاتف.<br />
قمنا بتعريف مهيئتي بيانات الأولى لتنفيذ الاستعلام الخاص بالموظفين ثم وضع نتيجته في<br />
جدول اسمه Person في مجموعة البيانات، مهيئة البيانات الثانية سوف تنفذ الاستعلام<br />
الثاني و الذي يقوم باسترجاع رقم الموظف و أرقام هواتفه ثم وضعنا النتيجة في جدول<br />
اسمه Phone داخل مجموعة البيانات<br />
..Myds<br />
173
خالد الجديع kal_judaia@hotmail.com<br />
هذه الخطوة هي الأهم حيث قمنا بربط الجدولين ببعضهما البعض من خلال العامود<br />
الأول في جدول الموظفين و الذي يمثل رقم الموظف و العامود الثاني في جدول<br />
Phone و الذي يمثل كذلك رقم الموظف.<br />
قمنا بعرض نتيجة مجموعة البيانات كاملة على شبكة البيانات.<br />
-٤<br />
-٥<br />
البحث في مجموعة البيانات<br />
يمكنك البحث في مجموعة البيانات من خلال تطبيق جملة استفسار على جدول موجود في<br />
:<br />
مجموعة البيانات.<br />
إن أفضل طريقة للفهم<br />
هي المثال<br />
في المثال التالي نقوم بالبحث عن الصف الذي يحوي اسم الموظف عبداالله ثم عرض<br />
رقم أول موظف في نتيجة البحث:<br />
Dim SearchRow() As DataRow =<br />
("'عبداالله'=Myds.Tables("Person").Select("name<br />
MessageBox.Show(SearchRow(0).Item(0))<br />
ماذا لو أردت أن ترتب نتيجة البحث حسب حقل ما تصاعديا أو تنازليا ؟<br />
في المثال التالي نقوم بالبحث عن الصف الذي يحوي اسم الموظف عبداالله ثم ترتيب<br />
نتيجة البحث حسب الرقم من الأعلى إلى الأدنى<br />
Dim SearchRow() As DataRow =<br />
,"'عبداالله'=Myds.Tables("Person").Select("name "id DESC")<br />
MessageBox.Show(SearchRow(0).Item(0))<br />
:<br />
لاحظ أننا أضفنا عاملا ثانيا لدالة البحث وهو ما نريد أن نرتب النتيجة بناء عليه وهو رقم<br />
الموظف ثم أتبعناه بخيار الترتيب DESC وهو ما يرتب النتيجة من الأعلى إلى الأدنى<br />
استخدام المستعرضات<br />
تتعدد استخدامات المستعرضات لكن أحد استخداماتها الشائعة هي ترشيح عرض الصفوف لذلك<br />
تعتبر المستعرضات أحد طرق البحث في مجموعة البيانات.<br />
174
خالد الجديع kal_judaia@hotmail.com<br />
من عملية البحث<br />
:<br />
في المثال التالي سنقوم بإنشاء مستعرض ومن ثم البحث فيه وترتيب الصفوف الناتجة<br />
Dim DV As New DataView(Myds.Tables("Person"))<br />
"'عبداالله'=name" DV.RowFilter =<br />
DV.Sort = "ename"<br />
في المثال السابق قمنا بإنشاء مستعرض للصفوف التي تحتوي اسم عبداالله ثم رتبنا الصفوف في<br />
المستعرض بناء على الاسم الأخير.<br />
برنامج البحث في مجموعة البيانات<br />
سوف نبني برنامجا يطبق الأفكار السابقة، فكرة هذا البرنامج هو أن يكون هناك زري اختيار<br />
أحدهما للبحث في مجموعة البيانات التي في الذاكرة و الثاني لاسترجاع البيانات من قواعد<br />
البيانات ومن ثم البحث فيها. سنقوم بعرض النتيجة على شبكة بيانات.<br />
قم بتصميم الشاشة حسب الشكل و حسب الخصائص الموجودة في الجدول<br />
:<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdSearch<br />
Name<br />
Button1<br />
175
خالد الجديع kal_judaia@hotmail.com<br />
بحث<br />
Label1<br />
btnNewData<br />
البحث بنسخة محدثة<br />
rdoDSSearch<br />
البحث في مجموعة البيانات<br />
DataGrid1<br />
البحث عن الموظفين<br />
Yes<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
RightToLeft<br />
Label1<br />
RadioButton1<br />
RadioButton1<br />
dataGrid<br />
Form1<br />
قم بإضافة الكود التالي<br />
Public Class SearchProj<br />
Inherits System.Windows.Forms.Form<br />
Dim Myds As New DataSet()<br />
Private Sub cmdSearch_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles cmdSearch.Click<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select id,name,ename from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security<br />
Info=False"<br />
If rdoNewData.Checked Then<br />
Myds.Clear()<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
End If<br />
If Myds.Tables.Count = 0 Then Exit Sub<br />
Dim DV As New DataView(Myds.Tables("Person"))<br />
DV.RowFilter = "name Like '" & txtEmpName.Text & "*'"<br />
DV.Sort = "ename"<br />
DataGrid1.DataMember = ""<br />
DataGrid1.DataSource = Nothing<br />
DataGrid1.DataSource = DV<br />
End Sub<br />
End Class<br />
الذي يخص موضوعنا من هذا الكود هو الموجود بخط عريض :<br />
نتأكد من أن مجموعة البيانات تحوي على جدول واحد على الأقل<br />
نعرف المستعرض على أنه مستعرض لجدول الأشخاص<br />
-١<br />
-٢<br />
176
خالد الجديع kal_judaia@hotmail.com<br />
عرفنا المرشح، لاحظ وجود النجمة وهو ما يعني أننا نريد البحث عن أول جزء يدخله<br />
المستخدم ثم نحضر كل ما يطابق هذا الجزء بغض النظر عن باقي الاسم<br />
قمنا بالترتيب حسب الاسم الأخير<br />
فرغنا شبكة البيانات من أي بيانات<br />
أعدنا عرض البيانات على شبكة البيانات، انظر الشكل النهائي بعد التنفيذ<br />
-٣<br />
-٤<br />
-٥<br />
-٦<br />
177
خالد الجديع kal_judaia@hotmail.com<br />
ربط البيانات<br />
Data Binding<br />
تستطيع من خلال تقنية ربط البيانات ربط أداة بحقل في قاعدة البيانات يقوم فيه الحقل بعرض<br />
بيانات ذلك الحقل ومن ثم تستطيع التنقل بين البيانات إلى الأول و الأخير و التالي و السابق و في<br />
حالة تعديل البيانات يمكنك عكس هذه التعديلات على قواعد البيانات. كل هذه العملية لاتحتاج إلى<br />
جهد كبير بل بضعة أسطر من الكود للتم عملية الربط و التنقل بين السجلات.<br />
: مثال<br />
في هذا المثال سنقوم بعرض بيانات الموظف من خلال ربط أداة مربع النص<br />
باسم الموظف و التنقل إلى الموظفين. انظر الشكل و قم بتصميمه حسب الخصائص التالية<br />
:<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdNext<br />
التالي<br />
cmdPerv<br />
السابق<br />
cmdFirst<br />
الأول<br />
cmdLast<br />
الأخير<br />
btnFetch<br />
إحضار البيانات<br />
Label1<br />
Label1<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Button1<br />
Button٢<br />
Button٣<br />
Button٤<br />
Button٥<br />
Label1<br />
Label٢<br />
176
خالد الجديع kal_judaia@hotmail.com<br />
اسم الموظف<br />
lblCurrent<br />
رقم السجل<br />
ListBox1<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
RightToLeft<br />
Label٣<br />
أداة عنوان<br />
تنفيذ أمر يسترجع عدة صفوف<br />
Yes<br />
Form1<br />
ملاحظة :<br />
قم بتطبيق خاصية تجزيء الجمل حتى يتسنى عرض الأسطر الطويلة في أسطر<br />
مقطعة ومقروءة كما يلي<br />
Edit Advance Word Wrap<br />
Public Class DataBinding<br />
Inherits System.Windows.Forms.Form<br />
Dim WithEvents bmb As BindingManagerBase<br />
Dim Myds As New DataSet()<br />
سوف نعرض الكود كاملا ثم نقوم بشرحه :<br />
Private Sub btnFetch_Click(ByVal sender As System.Object, ByVal e<br />
As System.EventArgs) Handles btnFetch.Click<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String<br />
sql = "select id,name from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
txtEmpName.DataBindings.Add("Text", Myds, "Person.name")<br />
bmb = Me.BindingContext(Myds, "Person")<br />
bmb.Position = bmb.Count<br />
bmb.Position = 0<br />
End Sub<br />
Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles btnNext.Click<br />
bmb.Position += 1<br />
End Sub<br />
Private Sub cmdPrev_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles cmdPrev.Click<br />
bmb.Position -= 1<br />
End Sub<br />
Private Sub cmdLast_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles cmdLast.Click<br />
177
خالد الجديع kal_judaia@hotmail.com<br />
bmb.Position = bmb.Count - 1<br />
End Sub<br />
Private Sub cmdFirst_Click(ByVal sender As System.Object, ByVal e<br />
As System.EventArgs) Handles cmdFirst.Click<br />
bmb.Position = 0<br />
End Sub<br />
Private Sub bmb_PositionChanged(ByVal sender As Object, ByVal e As<br />
System.EventArgs) Handles bmb.PositionChanged<br />
lblCurrent.text = String.Format("{0} of {1}", bmb.Position + 1,<br />
bmb.Count)<br />
End Sub<br />
End Class<br />
يمكننا شرح المثال السابق من خلال النقاط التالية<br />
١-عرفنا متغير على مستوى النموذج<br />
Dim WithEvents bmb As BindingManagerBase<br />
:<br />
بمكن وصف هذا المتغير بأنه الكائن الذي يقوم بتنسيق العلاقة بين كائنات الربط و مجموعة<br />
البيانات. فعلى سبيل المثال عند الانتقال من سجل إلى آخر فإن هذا الكائن يقوم باعلام كائنات<br />
الربط بأن رقم السجل الحالي قد تغير و أنه يتوجب تغيير القيمة المعروضة على الأدوات إلى<br />
القيمة الجديدة التي تم الإنتقال إليها.<br />
٢- في السطر الثاني قمنا بتعريف مجموعة البيانات التي ستحوي بيانات الموظفين.<br />
٣- في حدث النقر الخاص بزر الأمر btnFetch قمنا بإحضار البيانات و وضعها في<br />
مجموعة بيانات.<br />
الجديد في الموضوع هنا هو الجمل التالية<br />
:<br />
txtEmpName.DataBindings.Add("Text", Myds, "Person.name")<br />
bmb = Me.BindingContext(Myds, "Person")<br />
bmb.Position = bmb.Count<br />
bmb.Position = 0<br />
في الجملة الأولى قمنا بربط مربع النص<br />
الموجود في مجموعة البيانات<br />
Person.name بالحقل txtEmpName<br />
.Myds<br />
لاحظ أننا قمنا بربط الخاصية<br />
. Text<br />
المربوطة تعتمد على الأداة فمثلا لو كانت أداة مربط اختيار سوف نقوم بربط الخاصية<br />
. Checked<br />
-٤<br />
و الخاصية<br />
في الجملة الثانية نقوم بتحديد اطار الربط لأن النموذج قد يحوي أكثر من اطار<br />
واحد فعلى سبيل المثال قد تقوم بربط بعض الأدوات بجدول الموظفين و بعضها بجدول أرقام<br />
الهاتف. أما في السطرين الثالث و الرابع فنحن نقوم بعملية انعاش لأزرار الأمر.<br />
في الأحداث الخاصة بالتنقل بين السجلات تلاحظ أننا نقوم بالتنقل بين السجلات من<br />
خلال خاصية<br />
.Postion<br />
178
خالد الجديع kal_judaia@hotmail.com<br />
الحدث bmb_PositionChanged يتم تنفيذه كلما تغيير موقع السجلات فنقوم<br />
بهذه الحالة بعرض رقم السجل الحالي و رقم مجموع السجلات.<br />
قم بتشغيل البرنامج ليظهر لك الشكل<br />
-٥<br />
-٦<br />
ربط بيانات رأس بتفاصيل<br />
انشاء نموذج يربط بيانات رئيسية ببيانات فرعية يعتبر تحصيل حاصل بفضل الطريقة القوية<br />
بربط البيانات. ماعليك إلا أن تضيف شبكة البيانات و التي ستظهر البيانات الفرعية، فعلى سبيل<br />
المثال ماذا او أردت أن تنتقل من موظف إلى آخر و بمجرد انتقالك يتم عرض أرقام هاتفه في<br />
شبكة البيانات.<br />
قم بتصميم الشكل التالي حسب الخصائص الموضحة في المثال السابق مع إضافة<br />
شبكة بيانات كما يظهر لك<br />
:<br />
في الحقيقة الكود في هذا المثال هو نفس الكود في المثال السابق مع زيادة لا تذكر،<br />
الكود الآن وسوف نجعل الزيادة بخط عريض حتى تلاحضها.<br />
سوف نعرض<br />
Dim con As New OleDb.OleDbConnection()<br />
179
خالد الجديع kal_judaia@hotmail.com<br />
Dim Myds As New DataSet()<br />
Dim sql As String<br />
sql = "select id,name from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Dim daPhone As New OleDb.OleDbDataAdapter("select & _<br />
ID,Num,person from Phone", con)<br />
daPhone.Fill(Myds, "Phone")<br />
Myds.Relations.Add("PersonPhone",Myds.Tables("Person").Columns(0), & _<br />
Myds.Tables("Phone").Columns(2), True)<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
Myds.WriteXml("da.xml")<br />
txtEmpName.DataBindings.Add("Text", Myds, "Person.name")<br />
DataGrid1.DataSource = Myds<br />
DataGrid1.DataMember = "Person.PersonPhone"<br />
bmb = Me.BindingContext(Myds, "Person")<br />
bmb.Position = bmb.Count<br />
bmb.Position = 0<br />
.Phone<br />
Person برقم<br />
الإضافات هي كما يلي :<br />
عرفنا مهيء بيانات لإحضار أرقام الهاتف.<br />
قمنا بتعبئة البيانات في مجموعة البيانات Myds و اسمينا الجدول<br />
قمنا بإنشاء علاقة بين الجدولين و ذلك بربط رقم الموظف في الجدول<br />
الموظف في الجدول Phone و اسمينا العلاقة PersonPhone<br />
قمنا بعرض البيانات على شبكة البيانات و ذلك بتعيين مجموعة البيانات إلى شبكة<br />
البيانات مع ملاحظة أننا اسندنا إلى الخاصية datamember قيمة تمثل اسم العلاقة التي<br />
أنشأنها بين الجدولين وهي Person.PersonPhone لاحظ أننا ابتدأنا باسم الجدول<br />
الرئيسي ثم اسم العلاقة<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
٥- قم بتنفيذ البرنامج ليظهر لك الشكل<br />
180
خالد الجديع kal_judaia@hotmail.com<br />
181
خالد الجديع kal_judaia@hotmail.com<br />
تحديث البيانات في البيئة المنفصلة<br />
مر بك في الباب الخاص بالبيئة المنفصلة بأن تعريف البيئة المنفصلة هي مجموعة بيانات يتم<br />
نسخها من قاعدة البيانات ثم قطع الاتصال بقاعدة البيانات و إجراء العمليات على هذه البيانات<br />
إضافة و حذفا و تعديلا ثم إرجاع كل ما تم من عمليات إلى قاعدة البيانات. و كما مر بك سابقا<br />
فإن من عيوب هذه البيئة إمكانية حدوث تضارب في تعديل البيانات وهو مايتطلب حل هذه<br />
المشاكل. عرفت في الفصل الخاص بمجموعة البيانات كيفية استرجاع مجموعة بيانات و عرضها<br />
على نموذج، ما تبقى هو الجزء الخاص بتعديل مجموعة البيانات و من ثم ارجاع هذه التعديلات<br />
إلى قواعد البيانات و حل أي مشكلة تنتج عند تعديل البيانات.<br />
قبول و رفض التعديلات<br />
نظرا لأن مجموعة البيانات يعتبر مخزن بيانات موجود في ذاكرة المستفيد من البيانات، أي أن<br />
هذه البيانات مفصولة عن قاعدة البيانات فإن كل تعديل يتم على مجموعة البيانات لا يتم عكسه<br />
مباشرة على قواعد البيانات. من هنا ظهر أن هناك مجموعة من الأخطاء سوف تظهر عند<br />
محاولة تحديث قواعد البيانات وهو ما يتطلب البحث عن هذه الأخطاء وعرضها للمستخدم لكي<br />
يتم تعديلها. من أمثلة هذه الأخطاء<br />
:<br />
-١<br />
-٢<br />
مخالفة قواعد العمل أو القيود المفروضة على الحقول<br />
:<br />
هذه القواعد أو القيود لا تنتقل<br />
إلى مجموعة البيانات بل تظل موجودة في قاعدة البيانات، ماذا لو كان هناك قيد على أحد<br />
الحقول يمنع أن يتكرر هذا الحقل أو يفرض قيمة موجبة لهذا الحقل، إن محاولة تعديل<br />
قواعد البيانات في هذه الحالة سوف يسبب مشكلة يجب عرضها على المستفيد.<br />
ماذا لو أراد مستفيد تعديل قيمة لحقل قام بحذفها مستفيد آخر.<br />
إضافة صف إلى مجموعة بيانات<br />
سوف نرى كيفية إضافة صف إلى جدول في مجموعة البيانات، ما أحب أن أنبه عليه هو أن<br />
إضافة صف إلى مجموعة بيانات لا يعني إضافته إلى قاعدة البيانات بل يعني أنك أضفته إلى<br />
مجموعة البيانات الموجودة في الذاكرة و تم وضع علامة عليه لتميزه بأنه صف تم إضافته، فلو<br />
توقف الجهاز عن العمل لسبب ما و ضاع ما في الذاكرة فإن كل الإضافات التي قمت بها قد<br />
ذهبت أدراج الريح لأنه لم يتم تحديث قواعد البيانات بها.<br />
182
خالد الجديع kal_judaia@hotmail.com<br />
تتم إضافة صف إلى مجموعة بيانات كما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
استخدم الطريقة NewRow و التي تنتمي إلى كائن الجدول لإنشاء صف جديد<br />
عين قيم كل حقل من حقول في هذا الصف<br />
قم بتمرير الصف و إضافته إلى مجموعة صفوف الجدول<br />
قبل إضافة أي قيمة إلى الجدول يتوجب عليك التأكد من عدم مخالفتها لقواعد العمل،<br />
المثال إذا كان المدخل لا يقبل القيم السالبة تأكد من أن القيمة المدخلة موجبة.<br />
أمثلة متنوعة لإضافة صفوف<br />
فعلى سبيل<br />
:<br />
لتطبيق كل الخطوات الثلاث السابقة إليك هذا المثال<br />
:<br />
Dim dtPerson As DataTable = Myds.Tables(0)<br />
Dim dr As DataRow = dtPerson.NewRow()<br />
"عبدالله" = dr("name")<br />
dr("ename") = "Abduallah"<br />
dtPerson.Rows.Add(dr)<br />
MessageBox.Show(Myds.Tables(0).Rows.Count)<br />
يمكن شرح المثال السابق بالخطوات التالية<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
أنشأنا صف جديد من نوع صف بيانات و عينا له قيمة صف فارغ من جدول الأشخاص.<br />
عينا قيم كل حقل في هذا الصف.<br />
أضفنا الصف كاملا إلى جدول الأشخاص<br />
أظهرنا رسالة قبل عملية الإضافة و بعدها لتظهر عدد الصفوف في الجدول<br />
البيانات.<br />
لاحظ أننا لم نعين قيمة لرقم الموظف لكونه رقما تسلسليا يتم إنشائه بواسطة قواعد<br />
يكفيك هذه الصيغة و التي سوف تعمل بنفس الطريقة في المثال السابق:<br />
Myds.Tables("Person").Rows.Add(New Object() {Nothing, ({"Abduallah","عبدالله"<br />
قمنا بوضع قيمة<br />
Nothing لرقم الموظف حتى يتم تعيينه من قبل قاعدة البيانات.<br />
183
خالد الجديع kal_judaia@hotmail.com<br />
تحديث صفوف في مجموعة البيانات<br />
كما مر بك في إضافة صفوف إلى مجموعة البيانات فإن الصفوف التي يتم تعديلها هنا لا يتم<br />
تعديلها في قواعد البيانات إنما يتم تعديلها في مجموعة البيانات في الذاكرة.<br />
الأخير:<br />
إليك هذا المثال الذي سنقوم فيه بتعديل اسم الشخص العربي و اسمه الإنجليزي للصف<br />
Dim dtPerson As DataTable = Myds.Tables(0)<br />
Dim dr As DataRow = dtPerson.Rows(dtPerson.Rows.Count - 1)<br />
"عبدالله" = dr("name")<br />
dr("ename") = "Abduallah"<br />
في المثال التالي سنقوم بتعديل الاسم الإنجليزي لكل الأشخاص لكي تصبح قيمه فارغة<br />
Dim dtPerson As DataTable = Myds.Tables(0)<br />
Dim dr As DataRow<br />
For Each dr In dtPerson.Rows<br />
dr("ename") = ""<br />
Next<br />
حذف الصفوف من مجموعة البيانات<br />
يوجد طريقتان لحذف صف من مجموعة البيانات<br />
:<br />
-١<br />
استخدام الطريقة Delete و التي تعتبر أحد طرق الصف في مجموعة البيانات، المثال<br />
التالي يوضح كيف يتم حذف صف من مجموعة بيانات<br />
Myds.Tables(0).Rows(1).Delete()<br />
:<br />
تقوم الطريقة Delete بوضع علامة على الصف تدل على أنه تم حذفه.<br />
-٢<br />
استخدام الطريقة<br />
يوضح ذلك المثال التالي<br />
:<br />
Remove و التي تقوم بإلغاء هذا الصف من مجموعة البيانات، كما<br />
Dim dr As DataRow = Myds.Tables(0).Rows(1)<br />
Myds.Tables(0).Rows.Remove(dr)<br />
تم حذف الصف من مجموعة البيانات لكن لم يتم حذفه من قاعدة البيانات.<br />
184
خالد الجديع kal_judaia@hotmail.com<br />
قبول أو رفض التعديلات<br />
سبق و أن بينا لك أن كل ما تقوم به من عمليات على مجموعة البيانات لا يتم عكسه على قواعد<br />
البيانات بل يتم وضع علامة على الصف المتأثر بالعملية،<br />
فلو قمت بإضافة صف إلى مجموعة<br />
البيانات فسوف يتم وضع علامة عليه تدل على أنه صف تم إضافته إلى مجموعة البيانات،<br />
وهذا<br />
الكلام ينطبق على كل صف تقوم بحذفه أو تعديله في مجموعة البيانات.<br />
هذه العلامة يتم وضعها<br />
لكل صف من خلال خاصية .Rowstate<br />
تمثل قيمة هذه الخاصية حالة الصف،<br />
و إليك الحالات<br />
المحتملة لكل صف :<br />
الحالة<br />
الوصف<br />
تمت إضافة هذا الصف إلى مجموعة البيانات.<br />
تمّ حذف هذا الصف من مجموعة البيانات.<br />
تمّ إنشاء هذا الصف ولكن ّه لم يحفظ في مجموعة البيانات إلى الآن.<br />
تمّ تعديل هذا الصف في مجموعة البيانات.<br />
لم يتمّ تغيير محتويات الصف.<br />
Added<br />
Deleted<br />
Detached<br />
Modified<br />
Unchanged<br />
من المقدمة السابقة نستطيع استنتاج أننا نستطيع استخلاص البيانات التي قام المستفيد بتحديثها في<br />
مجموعة البيانات فبدلا من إرسال كلّ صفوف المجموعة إلى قاعدة البيانات، يمكنك أن ت ُرسل فقط<br />
الصفوف المعدّلة والمضافة والمحذوفة<br />
إلى قاعدة البيانات وهو ما يوفر الكثير من الموارد لخادم<br />
البيانات و لشبكة الاتصال.<br />
المثال التالي يوضح كيف نعرف حالة صف ما من خلال خاصية<br />
:Rowstate<br />
Dim dtPerson As DataTable = Myds.Tables(0)<br />
Dim dr As DataRow = dtPerson.NewRow()<br />
MessageBox.Show(dr.RowState)<br />
"عبدالله" = dr("name")<br />
dr("ename") = "Abduallah"<br />
dtPerson.Rows.Add(dr)<br />
MessageBox.Show(dr.RowState)<br />
في المثال السابق قمنا بعرض حالة الصف بعد إنشائه لكن قبل حفظه في مجموعة البيانات.<br />
قمنا بعرض حالته بعد حفظه في مجموعة البيانات.<br />
ثم<br />
185
خالد الجديع kal_judaia@hotmail.com<br />
تحديث قواعد البيانات<br />
سوف نقوم باستعراض أكثر من طريقة لتحديث قواعد البيانات لتلاحظ الفرق بينها فيما يتعلق<br />
بالأداء و استهلاك موارد النظام يمكن القول بأن هناك وسيلتان لتحديث قواعد البيانات<br />
:<br />
-١<br />
ارسال كل مجموعة البيانات إلى قواعد البيانات<br />
:<br />
وهذه الطريقة غير فعالة وتستهلك<br />
موارد كبيرة من الشبكة و خادم البيانات. المثال التالي يوضح هذه الفكرة<br />
:<br />
المثال التالي يوضح إرسال كل مجموعة البيانات إلى قاعدة البيانات<br />
:<br />
Dim Myds As New DataSet()<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select id,name,ename from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Myds.Tables("Person").Rows.Add(New Object() {Nothing,<br />
"Abdulallah"}) ,"عبداالله"<br />
Dim ComBuilder As New OleDb.OleDbCommandBuilder(daPerson)<br />
daPerson.InsertCommand = ComBuilder.GetInsertCommand<br />
daPerson.Update(Myds, "Person")<br />
Catch e1 As OleDb.OleDbException<br />
MessageBox.Show(e1.Message)<br />
End Try<br />
في المثال السابق قمنا بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
عرفنا مجموعة بيانات و اتصال ثم أعلنا عن الاستعلام ثم عينا قيمة لسلسلة الاتصال.<br />
عرفنا مهيء البيانات ثم استرجعنا البيانات و عبئنا مجموعة البيانات.<br />
أضفنا صف إلى مجموعة البيانات، حتى هذه اللحظة لم يتم تحديث قواعد البيانات.<br />
قمنا بتعريف الأمر الذي سيقوم بتحديث قواعد البيانات، نظرا لأن مهيء البيانات لا يمكنه<br />
أن يحدث قواعد البيانات لأنه لا يحوي جملة الإضافة إلى قواعد البيانات فقد أنشأنا جملة<br />
الإضافة إلى قواعد البيانات في مهيء البيانات من خلال كائن باني الأمر<br />
.CommandBuilder<br />
-٥<br />
تم تحديث قواعد البيانات من خلال الطريقة<br />
Update وهي أحد طرق مهيء البيانات.<br />
186
خالد الجديع kal_judaia@hotmail.com<br />
في المثال السابق أضفنا إلى مجموعة البيانات صفا واحد لذلك قمنا باستخدام وظيفة الإضافة<br />
الخاصة بباني الأمر،<br />
والتحديث كما يلي<br />
عند حذف أو تحديث صفوف في مجموعة البيانات استخدم وظائف الحذف<br />
daPerson.DeleteCommand = ComBuilder.GetDeleteCommand<br />
daPerson.UpdateCommand = ComBuilder.GetUpdateCommand<br />
إرسال السجلات المحدثة في مجموعة البيانات<br />
:<br />
تعتبر هذه الطريقة أفضل من الطريقة<br />
الأولى حيث تقوم هذه الطريقة بارسال السجلات التي تم تحديثها فقط.<br />
-٢<br />
: قاعدة البيانات<br />
المثال التالي يوضح إرسال الصفوف المتأثرة بالتحديثات في مجموعة البيانات إلى<br />
Dim Myds As New DataSet()<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select id,name,ename from person"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security<br />
Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Myds.Tables("Person").Rows.Add(New Object() {Nothing,<br />
"Harith"}) ,"حارث"<br />
If Myds.HasChanges Then<br />
Dim AffectedDS As DataSet = Myds.GetChanges<br />
Dim ComBuilder As New<br />
OleDb.OleDbCommandBuilder(daPerson)<br />
daPerson.InsertCommand = ComBuilder.GetInsertCommand<br />
daPerson.Update(AffectedDS, "Person")<br />
End If<br />
Catch e1 As OleDb.OleDbException<br />
MessageBox.Show(e1.Message)<br />
End Try<br />
الفارق بين الطريقة الأولى وهذه الطريقة<br />
:<br />
-١<br />
-٢<br />
-٣<br />
قمنا باستخدام الطريقة<br />
مجموعة البيانات أم لا.<br />
Haschanges لنرى هل تم تحديث أي صف من صفوف<br />
بعد ذلك قمنا بتعريف مجموعة بيانات لكي تحوي الصفوف التي تم تحديثها فقط وهو<br />
صف واحد فقط. استطعنا استرجاع الصفوف التي تم تحديثها<br />
Getchanges والتي ستقوم باسترجاع الصفوف التي تم تحديثها فقط.<br />
قمنا بإرسال الصفوف المحدثة فقط ليتم تحديث قواعد البيانات.<br />
باستخدام الطريقة<br />
187
خالد الجديع kal_judaia@hotmail.com<br />
حل التعارض في تحديث البيانات<br />
فيما سبق من الأمثلة كنا نفترض أن المستخدم هو الوحيد الذي يقوم بتحديث قواعد البيانات،<br />
لكن هذا الافتراض في الواقع قد لا يكون صحيحا. عند العمل الجماعي على قواعد البيانات<br />
سوف تحصل تضاربات عند محاولة تحديث نفس البيانات من قبل أكثر من مستخدم وهو ما<br />
يتطلب إيجاد حل لهذه التضاربات، أنت غني عن التعريف أننا حين نعمل مع مجموعة<br />
البيانات فنحن نعمل في البيئة المنفصلة. ماذا لو أن مستخدما استرجع بيانات الموظف خالد و<br />
قام موظف آخر باسترجاع نفس البيانات، ثم قام الموظف الأول بتعديل اسم خالد في مجموعة<br />
البيانات إلى علي وبعد ذلك قام بتحديث قاعدة البيانات في نفس الوقت قام الموظف الآخر<br />
بتعديل اسم خالد إلى محمد، هنا سوف يحصل تضارب في التعديل.<br />
عندما يجد أمر التحديث أنه حصل تعارض في التحديث فإنه يتوقف عن تحديث باقي<br />
الصفوف و ينتقل إلى سياق الاستثناء، لذلك من المهم جدا أن تضع عملية تحديث البيانات في<br />
سياق استثناء. في أغلب الأحيان ترغب أن تتم عملية تحديث البيانات وعند حصول تعارض<br />
في تحديث صف ما يتم الانتقال إلى الصف الذي يليه حتى يتم الانتهاء من تحديث كل صفوف<br />
الجدول في مجموعة البيانات، هذا ما تستطيع عمله من خلال استخدام الخاصية<br />
ContinueUpdateOnError وهي أحد خواص مهيء البيانات.<br />
المثال التالي يوضح كيفية استخدام خاصية<br />
في المثال السابق منا بما يلي<br />
: ContinueUpdateOnError<br />
daPerson.ContinueUpdateOnError = Tru<br />
daPerson.Update(Myds, "Person")<br />
If Myds.HasChanges Then<br />
End If<br />
:<br />
-١<br />
-٢<br />
-٣<br />
إعمال خاصية ContinueUpdateOnError و التي سوف تمكن من الانتقال إلى<br />
الصف التالي في حالة حدوث تعارض في تحديث البيانات.<br />
قمنا بتحديث قاعدة البيانات<br />
وضعنا الشرط الذي سوف يبين لنا هل حدث تعارض أم لا، إذا تحقق هذا الشرط فقد<br />
حدث تعارض وهو ما يتطلب منا حل هذا التعارض.<br />
188
خالد الجديع kal_judaia@hotmail.com<br />
عرض الصفوف التي لم يتم تحديثها<br />
عند حدوث تعارض في تحديث البيانات يتوجب عليك عرض هذه الصفوف التي لم يتم تحديثها<br />
في قاعدة البيانات مع إيضاح لسبب عدم التحديث حتى يستطيع المستفيد اتخاذ قرار ما.<br />
المثال التالي يوضح كيفية عرض الصفوف المتعارضة :<br />
قم بإضافة نموذج جديد ثم أضف زري أمر على هذا النموذج،<br />
التالي<br />
كما يتضح من الجدول<br />
cmdGetData<br />
:<br />
-١<br />
اسم الأداة الخاصية القيمة<br />
احضار البيانات و تحديث صف<br />
cmdUpdate<br />
محاولة تحديث البيانات<br />
ResolveConfilct<br />
Name Button1<br />
Text<br />
Name Button1<br />
Text<br />
Name Form<br />
هذا هو الكود للبرنامج كاملا :<br />
Public Class ResolveConfilct<br />
Inherits System.Windows.Forms.Form<br />
Dim Myds As New DataSet()<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select id,name,ename from person"<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
Dim dtPerson As DataTable<br />
Dim dr As DataRow<br />
Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e<br />
As System.EventArgs) Handles cmdUpdate.Click<br />
Try<br />
If Myds.HasChanges Then<br />
Dim AffectedDS As DataSet = Myds.GetChanges<br />
Dim ComBuilder As New OleDb.OleDbCommandBuilder(daPerson)<br />
daPerson.ContinueUpdateOnError = True<br />
daPerson.UpdateCommand = ComBuilder.GetUpdateCommand<br />
daPerson.Update(AffectedDS, "Person")<br />
Dim ConflictRow As DataRow<br />
Dim ConfilctRowCount As Integer =<br />
AffectedDS.Tables("Person").GetChanges.Rows.Count<br />
For Each ConflictRow In AffectedDS.Tables("Person").Rows<br />
If ConflictRow.RowState = DataRowState.Modified Then<br />
تحديث تعارض" ConflictRow(1), & "الصف تحديث في خطأ حدث MessageBox.Show("<br />
("تعارض" ,"البيانات<br />
End If<br />
Next<br />
End If<br />
Catch e1 As OleDb.OleDbException<br />
MessageBox.Show(e1.Message)<br />
189
خالد الجديع kal_judaia@hotmail.com<br />
End Try<br />
Private Sub cmdGetData_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles cmdGetData.Click<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security<br />
Info=False"<br />
daPerson.Fill(Myds, "Person")<br />
dtPerson = Myds.Tables(0)<br />
dr = dtPerson.Rows(dtPerson.Rows.Count - 1)<br />
"عبدالله" = dr("name")<br />
dr("ename") = "Abduallah"<br />
End Sub<br />
سوف نشرح الآن الكود الذي بخط عريض لأن باقي الكود سبق شرحه<br />
:<br />
-١<br />
-٢<br />
-٣<br />
عرفنا متغيرا من نوع صف لكي نستخدمه في أخذ قيمة الصفوف التي حدث فيها تعارض<br />
عرفنا متغيرا من نوع رقم صحيح ثم استرجعنا عدد الصفوف التي حدث لها تعارض<br />
في التحديث.<br />
عملنا تكرار لاستخراج كل الصفوف التي حدث لها تعارض ومن ثم سوف يتم عرض<br />
هذا التعارض للمستفيد في رسالة.<br />
190
خالد الجديع kal_judaia@hotmail.com<br />
XML و ADO.NET<br />
مقدمة عن XML<br />
يمكن تعريف XML بأنه معيار لوصف المعلومات الرقمية. يتم تمثيل المعلومات داخل ملفات<br />
XML بشكل هرمي مما يسهل عملية قراءتها و البحث فيها. تجدر الإشارة إلى أن هناك فارقا<br />
كبيرا بين ملفات<br />
.XML وملفات HTML<br />
تستخدم ملفات<br />
HTML<br />
لتوضيح كيفية عرض<br />
البيانات على المتصفح لكنها في نفس الوقت لا تمتلك أي معلومة عن المحتوى الذي يتم عرضه.<br />
على النقيض من ذلك تستخدم ملفات XML لعرض البيانات كما أنها تحوي معلومات عن<br />
البيانات المعروضة. تم تصميم XML لنقل المعلومات خلال الانترنت بالإضافة إلى الهيكل<br />
الخاص بها XSD والذي يبين محتواها لمتلقي البيانات. كما أن هناك فارقا آخر وهو أن<br />
XML<br />
تمكن المستفيد من بناء الهيكل الذي يريد فإن HTML تحوي عددا محدودا من العلامات المهيئة<br />
للإستخدام. تعتبر XML تقنية مدعومة بشكل كبير في بيئة الدوت نت، يوجد فئات خاصة ب<br />
XML مرتبطة ب .ADO.NET من أهم ما يميز XML أنها ملفات نصية و هو ما يجعل نقل<br />
هذه الملفات بين أنظمة التشغيل و التطبيقات أمرا يسيرا.<br />
نظرة على ملف<br />
XML<br />
يمثل المثال التالي نموذجا لملف<br />
<br />
<br />
<br />
1<br />
خالد<br />
<br />
<br />
2<br />
احمد<br />
<br />
<br />
<br />
XML<br />
قمنا بإنتاج هذا الملف من خلال مجموعة البيانات وهو ما ستراه لاحقا، يحوي هذا الملف على<br />
صفين، كما ترى فإن هذا الملف سهل الفهم فالبيانات معروضة بشكل هرمي واضح. يوجد<br />
موظفان الأول اسمه خالد و الثاني اسمه أحمد،<br />
لاحظ وجود كلمة<br />
name قبل الاسم وكلمة<br />
الرقم. هاتان الكلمتان تمثلان اسما الحقل في مجموعة البيانات. أما كلمة Person فتمثل اسم<br />
الجدول.<br />
id قبل<br />
192
خالد الجديع kal_judaia@hotmail.com<br />
مجموعة البيانات و XML<br />
توفر لنا مجموعة البيانات مجموعة من الطرق للتعامل مع ملفات XML كما يلي :<br />
-١<br />
-٢<br />
تستطيع كتابة ما تحتويه من بيانات في ملف<br />
.XML<br />
تستطيع قراءة ملف XML ومن ثم تعبئته في مجموعة بيانات.<br />
كتابة محتوى مجموعة بيانات في XML<br />
الطريقة الأساسية في مجموعة البيانات لكتابة ملف<br />
استخدام هذه الطريقة سوف نأخذ المثال التالي<br />
.WriteXML هي XML<br />
:<br />
لتوضيح كيفية<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim Myds As New DataSet()<br />
Dim sql As String = "select id,name from person where id=1"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Myds.WriteXml("dsPerson.xml")<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
في المثال السابق قمنا بما يلي<br />
:<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
أعلنا عن اتصال و مجموعة بيانات<br />
في السطر الثالث عرفنا جملة الاستعلام والتي يجب أن ترجع لنا موظفا واحد<br />
نفذنا الاستعلام ثم وضعنا نتيجة الاستعلام في مجموعة البيانات<br />
قمنا باستخدام الطريقة<br />
اسمه<br />
WriteXml لكتابة محتوى مجموعة البيانات في ملف<br />
XML<br />
، dsPerson.xml<br />
-٥<br />
المشروع.<br />
سوف يتم انشاء الملف في المجلد<br />
هذا هو محتوى ملف XML الناتج من الكود السابق.<br />
Bin و الذي يقع داخل مجلد<br />
<br />
<br />
<br />
1<br />
خالد<br />
<br />
<br />
193
خالد الجديع kal_judaia@hotmail.com<br />
قراءة ملف XML<br />
لقراءة ملف<br />
XML و من ثم كتابته في مجموعة بيانات استخدم الطريقة<br />
في المثال السابق قمنا بما يلي<br />
.ReadXml<br />
Myds.WriteXml("dsPerson.XML")<br />
Dim ds As New DataSet()<br />
ds.ReadXml("dsPerson.XML")<br />
:<br />
كتابة ملف ١-<br />
XML<br />
-٢<br />
-٣<br />
عرفنا مجموعة بيانات جديدة<br />
قمنا بقراءة محتوى الملف إلى هذه المجموعة<br />
استرجاع محتوى مجموعة البيانات على شكل XML<br />
لاسترجاع مجموعة البيانات على شكل XML قم باستخدام الطريقة<br />
.Getxml<br />
بعرض مجموعة البيانات على شكل xml في مربع نص. كما تلاحظ عرض ملف<br />
بيئة الدوت نت شيء يسير جدا فمجرد أن تعين ملف<br />
فإن ذلك كفيل بعرض هذا الملف.<br />
المثال التالي يقوم<br />
XML في<br />
XML لخاصية<br />
Text الخاصة بمربع النص<br />
TextBox1.Text = Myds.GetXml<br />
في المثال السابق نفترض أنه تم إنشاء مجموعة بيانات ثم ملئها من جدول الأشخاص بعد ذلك<br />
استخدمنا الطريقة GetXml و التي تقوم باسترجاع محتوى مجموعة البيانات على شكل<br />
ثم عرضنا ذلك على مربع نص.<br />
XML<br />
استرجاع هيكل XML لمجموعة بيانات<br />
إذا اردت استرجاع هيكل<br />
XML لمجموعة بيانات استخدم الوظيفة<br />
.GetXmlSchema<br />
كما يلي<br />
TextBox1.Text = Myds. GetXmlSchema<br />
194
خالد الجديع kal_judaia@hotmail.com<br />
برنامج التعامل مع<br />
XML<br />
لتطبيق<br />
كل الطرق السابقة<br />
قم بانشاء نموذج كما يظهر من الشكل<br />
:<br />
:<br />
ضع الأدوات مع<br />
إعطائها الخصائص التالية<br />
اسم الأداة<br />
الخاصية<br />
القيمة<br />
cmdWritexml<br />
كتابة ملف<br />
XML<br />
cmdGetXml<br />
عرض مجموعة البيانات بشكل<br />
xml<br />
cmdReadXml<br />
قراءة ملف<br />
XML<br />
cmdGetSchema<br />
استرجاع هيكل<br />
xml لمجموعة<br />
Label1<br />
TextBox1<br />
True<br />
Both<br />
التعامل مع تقنية<br />
XML<br />
Yes<br />
بيانات<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
Text<br />
Name<br />
MultiLine<br />
Scrollbars<br />
Text<br />
RightToLeft<br />
Button1<br />
Button1<br />
Button1<br />
Button1<br />
Label1<br />
TextBox<br />
Form1<br />
195
خالد الجديع kal_judaia@hotmail.com<br />
قم<br />
بكتابة الكود التالي<br />
Public Class WriteXml<br />
Inherits System.Windows.Forms.Form<br />
Dim Myds As New DataSet()<br />
Private Sub cmdWritexml_Click(ByVal sender As System.Object, ByVal e As<br />
System.EventArgs) Handles cmdWritexml.Click<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String = "select id,name from person where id=1"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Try<br />
Dim daPerson As New OleDb.OleDbDataAdapter(sql, con)<br />
daPerson.Fill(Myds, "Person")<br />
Myds.WriteXml("dsPerson.xml")<br />
Catch e1 As OleDb.OleDbException<br />
Label1.Text = e1.Message<br />
End Try<br />
End Sub<br />
Private Sub cmdReadXml_Click(ByVal sender As System.Object, ByVal e<br />
As System.EventArgs) Handles cmdReadXml.Click<br />
Myds.WriteXml("dsPerson")<br />
Dim ds As New DataSet()<br />
ds.ReadXml("dsPerson")<br />
End Sub<br />
Private Sub cmdGetXml_Click(ByVal sender As System.Object, ByVal e<br />
As System.EventArgs) Handles cmdGetXml.Click<br />
TextBox1.Text = Myds.GetXml<br />
End Sub<br />
Private Sub cmdGetSchema_Click(ByVal sender As System.Object, ByVal<br />
e As System.EventArgs) Handles cmdGetSchema.Click<br />
TextBox1.Text = Myds.GetXmlSchema<br />
End Sub<br />
End Class<br />
يمكن تلخيص أهم ما يقوم به الكود من خلال النقاط التالية :<br />
لاحظ أنه يوجد أربعة اجراءات كل واحد منها خاص بحدث النقر لزر أمر من الأزرار<br />
.XML<br />
التي سبق إنشاؤها.<br />
كل واحد من الإجراءات يقوم بتطبيق طريقة من طرق التعامل مع<br />
الإجراء<br />
cmdWritexml_Click يقوم بكتابة محتوى مجموعة البيانات في ملف<br />
Myds في<br />
.XML<br />
الاجراء<br />
cmdReadXml_Click يقوم بكتابة محتوى مجموعة البيانات<br />
ملف XML ثم يقوم بإنشاء مجموعة بيانات أخرى وقراءة ملف XML إلى مجموعة<br />
البيانات.<br />
الاجراء<br />
cmdGetXml_Click يقوم بقراءة محتوى مجموعة البيانات على شكل<br />
XML ثم عرضها على مربع نص. انظر الشكل<br />
-١<br />
-٢<br />
-٣<br />
-٤<br />
-٥<br />
196
خالد الجديع kal_judaia@hotmail.com<br />
الاجراء cmdGetSchema_Click يقوم بقراءة محتوى مجموعة البيانات على<br />
شكل هيكل XML ثم عرض هذا الهيكل على مربع نص. انظر الشكل<br />
-٦<br />
197
خالد الجديع kal_judaia@hotmail.com<br />
إنشاء التقارير<br />
تعلمنا فيما سبق من فصول كيفية التعامل مع البيانات لكن بقي شيء واحد ومهم وهو كيفية<br />
عرض و طباعة التقارير. لعرض التقارير توجد هناك طريقتان أساسيتان وهما<br />
:<br />
-١<br />
-٢<br />
إنشاء التقارير خارج بيئة الدوت نت ثم استدعائها و إرسال العوامل المناسبة لإخراج<br />
التقرير : فعلى سبيل المثال لو كنت محترفا في بناء التقارير باستخدام مصمم التقارير في<br />
مايكروسوفت أكسس فإن<br />
من بيئة الدوت نت.<br />
باستطاعتك بناء التقرير الذي تريد ومن ثم استدعاء هذا التقرير<br />
انشاء التقارير من خلال كائنات كريستال ريبورت و التي توجد مع بيئة الدوت نت.<br />
سوف يكون محور حديثنا عن الطريقة الثانية.<br />
تقدم تقارير كريستال قوة ممتازة في بيئة الدوت نت لتصميم التقارير. يوجد مصمم كريستال<br />
للتقارير و الذي يمكنك من انشاء تقرير جديد أو تحديث تقرير سبق انشاؤه. بعد إنشائك للتقرير<br />
تستطيع استخدامه في تطبيقك سواء كان هذا التطبيق تطبيق مكتبي أو تطبيق يعمل على الانترنت.<br />
انشاء تقرير بواسطة كريستال ريبورت<br />
لإنشاء تقرير بواسطة كريستال ريبورت اتبع الخطوات التالية<br />
:<br />
-١<br />
-٢<br />
ابدأ مشروع جديد في بيئة الدوت نت و سمه<br />
.CrystalDemo<br />
أضف ملف كريستال جديد من خلال مستكشف الحلول وذلك بنقر زر الفأرة الأيمن على<br />
المشروع ومن ثم اختيار Add ليظهر لك الشكل. قم بتسمية هذا الملف ب<br />
.FirstReport<br />
199
خالد الجديع kal_judaia@hotmail.com<br />
-٣<br />
سوف تظهر لك شاشة نوع التقرير<br />
التي تراها في الشكل ثم انقر<br />
الذي تريد بنائه اختر نفس الاختيارات<br />
Ok<br />
-٤<br />
اختر<br />
سوف يظهر لك الشكل و الذي<br />
يطلب مصدر البيانات التي تريد<br />
أن تنشأ التقرير منها.<br />
OLE DB ADO<br />
كما يظهر<br />
200
خالد الجديع kal_judaia@hotmail.com<br />
لكي تظهر لك شاشة تحديد مزود البيانات كما يظهر من الشكل<br />
،<br />
اختر مزود البيانات<br />
الخالص بمايكروسوفت أكسس اختره ثم انقر Next وحدد موقع قاعدة البيانات و اختر<br />
.Ok<br />
-٤<br />
سوف تظهر كل الجداول،<br />
الأشخاص إلى الجهة اليمنى.<br />
اختر جدول الأشخاص ثم انقر التالي سوف ينتقل جدول<br />
-٥<br />
201
خالد الجديع kal_judaia@hotmail.com<br />
سوف تظهر لك حقول الجدول، هنا تقوم باختيار الحقول التي تريد أن تظهر في التقرير،<br />
اختر كل الحقول كما يظهر من الشكل<br />
-٦<br />
-٧<br />
انقر التالي لتظهر لك شاشة خيارات التجميع في التقرير<br />
:<br />
,<br />
تعتبر هذه الخطوة اختيارية<br />
ويمكنك من خلالها اختيار الحقل الذي تريد اجراء التجميع به. انقر التالي.<br />
202
خالد الجديع kal_judaia@hotmail.com<br />
سوف تظهر لك شاشة الترشيح<br />
:<br />
تعتبر هذه الشاشة اختيارية و تستطيع من خلالها ترشيح<br />
البيانات التي ستخرج في التقرير من خلال وضع شرط ما على أي من الحقول، في<br />
تقريرنا هذا سنقوم بعرض كافة البيانات لذلك انقر التالي<br />
-٨<br />
شاشة تنسيق التقرير<br />
:<br />
تمكنك هذه الشاشة من تحديد تنسيق التقرير، يوجد عدة أنواع<br />
تستطيع استعراضها ومن ثم اختيار التنسيق الذي تراه مناسبا،<br />
القياسي كما يظهر من الشكل<br />
:<br />
سوف نختار التنسيق<br />
-٩<br />
203
خالد الجديع kal_judaia@hotmail.com<br />
:<br />
انقر زر<br />
Finish ليظهر لك التقرير كما ترى من الشكل<br />
-١٠<br />
-١١<br />
هذا هو التقرير الذي أشأته من خلال الخطوات العشر الماضية.<br />
تلاحظ يتكون من عدة أجزاء<br />
– و الكلام ينطبق على أي تقرير<br />
: -<br />
•<br />
رأس التقرير<br />
: ReportHeader<br />
معلومات لا تتكرر أثناء عرض التقرير.<br />
بالكليشه و فيه يكون شعار المنشأة و اسمها<br />
.<br />
•<br />
رأس الصفحة<br />
: Page Header<br />
•<br />
هذا التقرير وكما<br />
سيظهر هذا القسم في أعلى التقرير و يحوي<br />
عادة ما يكون رأس التقرير ما يسمى<br />
كذلك يحوي معلومات لا تتكرر على مستوى<br />
الصفحة، في الغالب يحوي اسماء الحقول المعروضة في التقرير.<br />
: التفاصيل<br />
•<br />
: تذييل التقرير<br />
•<br />
ملخصات التقرير<br />
: تذييل الصفحة<br />
-٢<br />
يحوي البيانات التي نريد عرضها في التقرير<br />
يظهر في آخر صفحة من التقرير يحوي معلومات مثل المجاميع و<br />
يحوي معلومات تظهر في آخر كل صفحة،<br />
عادة ما تكون هذه<br />
المعلومات مثل رقم الصفحة وعدد الصفحات و التاريخ.<br />
١٢-الخطوة الأخيرة هي عرض التقرير. لعرض التقرير قم بالخطوات التالية :<br />
١- نظرا لأننا سوف نعرض التقرير من خلال نموذج لذا قم بإضافة نموذج إلى<br />
المشروع<br />
أضف الأداة<br />
CrystalReportViewer<br />
204
خالد الجديع kal_judaia@hotmail.com<br />
وهي موجودة في صندوق الأدوات<br />
-٣<br />
-٤<br />
كبر هذه الأداة لتحتل النموذج كاملا<br />
اذهب إلى الخاصية<br />
ReportSource<br />
و ابحث عن التقرير الذي أنشأته قبل قليل وهو<br />
FirstReport.rpt<br />
٥- قم بتشغيل النموذج ليظهر لك الشكل التالي<br />
205
خالد الجديع kal_judaia@hotmail.com<br />
بناء تقرير اعتمادا على مجموعة بيانات<br />
بفضل التعاون بين بيئة الدوت نت و كريستال ريبورت فإنه بإمكانك أن تبني تقرير بناء على<br />
مجموعة بيانات. توجد هناك العديد من الفوائد لاستخدام هذه الطريقة منها أنه بمجرد أن تكتيب<br />
الخبرة في التعامل مع مجموعة البيانات فإنك لن تحتاج إلى التعمق في برمجة التقارير. فعلى<br />
سبيل المثال تستطيع ترشيح مجموعة البيانات ثم عرض نتيجة الترشيح على تقرير بدون أن<br />
تضطر إلى استخدام عوامل في الكريستال ريبورت. أحد الطرق لبناء التقرير من مجموعة بيانات<br />
هي أن تصمم التقرير و تحدد الجدول الذي سيكون مصدرا لهذا التقرير و تقف عند هذه النقطة،<br />
بعد ذلك تقوم أثناء التنفيذ بتعيين مجموعة البيانات التي ستعرض بياناتها على التقرير<br />
لنأخذ المثال التالي على كيفية بناء تقرير من مجموعة بيانات :<br />
قم بإضافة تقرير و أعطه اسم<br />
crPerson كما يظهر من الشكل.<br />
-١<br />
٢- اختر نفس الاختيارات الموجودة في الشكل<br />
206
خالد الجديع kal_judaia@hotmail.com<br />
سوف يظهر لك عدة خيارات في الجهة اليسر، هذه الخيارات تمثل مصدر البيانات التي<br />
تريد أن تعرض التقرير منها، اختر<br />
Access/Excel ثم Create New Connection<br />
ثم أضف اتصالا بقاعدة البيانات بعد ذلك ستظهر كل الجداول في قاعدة البيانات اختر<br />
جدول الأشخاص كما يظهر من الشكل. ثم انقر<br />
Finish<br />
-٣<br />
207
خالد الجديع kal_judaia@hotmail.com<br />
سوف يظهر لك الشكل و هو التقرير الذي نتج<br />
من الخطوات السابقة.<br />
-٤<br />
-٥<br />
قم بإضافة الحقلين الذي سيظهر في التقرير وهما ID و<br />
.Name<br />
واحد التفاصيل ومن ثم ستتم إضافتهما آليا في الرأس كما يظهر من الشكل.<br />
سوف تظيفهما مرة<br />
غير كلمة Name<br />
و ID الموجودة في رأس التقرير لتكون رقم الموظف و اسم<br />
الموظف<br />
208
خالد الجديع kal_judaia@hotmail.com<br />
أنشئ نموذج جديد و أضف إليه زر أمر و مربع نص و مستعرض تقارير<br />
CrystalReportViewer<br />
قم بجعل مصدر التقرير -ReportSource– لمستعرض التقارير هو التقرير الذي قمت<br />
-٦<br />
بإنشائه قبل قليل وه .crPerson<br />
انقر مزدوج على زر الأمر و أضف الكود التالي :<br />
Dim con As New OleDb.OleDbConnection()<br />
Dim sql As String<br />
sql = "select id,name from person where name Like '" &<br />
txtEmpName.Text & "%'"<br />
con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _<br />
"Data Source=C:\TelDir.mdb;Persist Security Info=False"<br />
Dim myds As New DataSet()<br />
myds.Clear()<br />
Try<br />
Dim Adapter As New OleDb.OleDbDataAdapter(sql, con)<br />
Adapter.Fill(myDs, "Person")<br />
If myds.Tables("Person").Rows.Count >= 1 Then<br />
MessageBox.Show(myds.Tables("Person").Rows.Count)<br />
Dim rpt As New crPerson()<br />
rpt.SetDataSource(myds)<br />
CrystalReportViewer1.Zoom(20%)<br />
CrystalReportViewer1.ReportSource = rpt<br />
CrystalReportViewer1.RefreshReport()<br />
End If<br />
Catch err As System.Exception<br />
MsgBox(err.Message)<br />
End Try<br />
:<br />
-٧<br />
الشرح<br />
١- سوف يقوم المستخدم بإدخال اسم أو جزء منه في مربع النص وعند النقر على زر الأمر<br />
سوف يتم البحث عن هذا الاسم في مجموعة البيانات ثم عرض التقرير بناء على<br />
مجموعة البيانات. انظر الشكل<br />
209