24.12.2014 Views

download

download

download

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!