الرئيسية

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

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

ولكن لماذا هذا الكتاب ...؟

الساحة تمتلئ بكتب المبرمجين المحترفين، فلماذا أصدر كتاباً ان لم يكن يقدم شيئاً جديداً او فكرة جديدة ...!!!!

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

الا وهو الكود المرتب والمنسق وبأحسن ما يكون، ليساعد القارئ في فهم وتتبع الكود بشكل جيد والمدعوم بالصور كلما دعت الحاجة .

ولأفعل ذلك اكتب الكود بالفيجوال وبعدها أقوم بنسخه الى برنامج الطباعة Word ومن هناك أعاود نسخه إلى برنامج إعداد صفحات الهتمل وهو الفرونت بيج FrontPage وهذا فقط لأعطيك كود منسق الألوان تماماً كما هو بالفيجوال حتى لا تشعر انك في بيئة مختلفة أثناء تصفحك للكتاب وقراءتك منه.

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

الان ومع هذه الإصدارة شعرت ببعض الرضا عنها، لأنها صارت مفيدة وجديرة بان يضعها المبرمج في مكتبته.

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

وبخاصة الأفكار بأخر الكتاب حيث تبين انها تحوي الكثير من الأخطاء التي لم أكن اقصدها، كما زدت كمية الصور التي تبين وتزيد من دقة الشرح.

كما فتحت أقساماً جديدة.

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

كما توجد العديد من الشائعات على ان مايكروسوفت تولي اهتمامها وكل التطويرات القادمة لتخص بها الـ #C ليبقى الـ VB كلغة ثانوية، واذا لاحظت ان كل الأدوات القوية والمهام القوية تجدها منتجة بالـ #C وكذلك المبرمجين المحترفين يفضلون الـ #C أما الـ VB فقد أصبح مستقبلها غامضاً.

كما توجد صفحة هنا بالكتاب تناقش أهم الفروقات بين الـ VB وكذلك الـ C#

مقدمة

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

كما إنني لا أضع نفسي من محترفي هذه اللغة وعليه فلا تتوقعوا مني شرحاً لكل شئ، ولكن حتماً ستجد ما تبحث عنه.

عن الكاتب

أنا مسلم وجنسيتي عربية ومن قبيلة تسمى الزنتان و أسكن في ليبيا ومواليد سنة 1971.

البريد الالكتروني : Framwork2@yahoo.com

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

البرامج التي استخدمتها في إعداد هذا الكتاب

Visual Studio.NET 2005

Snag IT الإصدارة 9

Microsoft FrontPage 2003

Microsoft Word 2007

WinCHM pro 3.526

Visual Basic6

PhotoShop Cs8

كما عندي ملاحظة وهي عليك دائماً ان تحصل على الإصدارة الأخيرة من الكتاب والتخلص من الإصدارة القديمة، لان الكتاب اذا لم يزد شيئاً فهو لن ينقص شيئاً .

كما تتم معالجة الأخطاء التي يتم التفطن لها مع كل إصدارة جديدة .

وأكون جداً شاكرا لكل من يراسلني بخصوص ملاحظة ما او تصحيح خطاء ما او طلب إدراج شئ ما وما إلى ذلك .

كما يعمل هذا الكتاب على إعدادات العرض 1024\768 بشكل جيد ويعطي مجال رؤية واسع.

ولازلت مع الفيجوال 2005 ولا زلت من أنصاره فحقيقة جربت الفيجوال 2008 كما جربت الفيجوال 2010 ولكنني لم ارتح لهما.

او بالأحرى جهازي ربما هو الذي لم يرتح لهما .

الانتقال إلى الفهرس


الرئيسية

الأسطورة القديمة

بين اليقظة والحلم

ألمـ ذلك الكتاب لا ريب فيه ـهدى

للمتقين

السلام عليكم ورحمة الله وبركاته.

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

أعلام سوداء ....!

مما لا شك فيه إنها راية الإسلام واللون الأسود لون الفرح والسرور.

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

وكانت هذه هي راية الإسلام إشارة إلى الظلام ولا اله إلا الله محمد رسول الله بلون ابيض تشع منها.

لا أله إلا الله محمد رسول الله

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

ويبدوا إننا لسنا وحدنا الكسولين الذين ينتظرون رجلاً ليحقق لهم أحلامهم، حتى الأمم الأخرى تنتظر منقذها.

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

ولكن اذا نسوا ذلك وعملوا بمفردهم ربما وقتها نراه بينهم، وحتى وان لم يظهر فعلوا هم ما كان سيفعله.

ويقول العلماء انه شخص مهدي الى الحق في حكمه على الأمور وقضاءه وما الى ذلك.

يعني وكأنهم يشيرون إلى ان اغلب التشريعات هذه الأيام ليست صحيحة وتنتظر هذا الرجل المبارك ليصلحها.

من منا لا يعلم ما الذي سيفعله هذا الشخص ان ظهر للوجود.

كلنا نعلم ما الذي سيفعله .

هل سترى مدارس وكليات تختلط بالرجال والنساء ...؟

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

هل سيترك بعض الدول تتاجر بالخمور ولحم الخنزير ...؟

هل سيترك الناس يرتادون الكباريهات والبارات ....؟

هل سيترك النساء تظهر للآخرين مكشوفة الرأس في الشارع والإذاعة وغيرها ....؟

هل سيسمح بالاتجار في التبغ ويسمح بالتدخين ...؟

هل سيسمح للناس بترك الصلاة او بعدم الصوم ودفع الزكاة ....؟

هل سيلجاء إلى الأمم المتحدة اذا قامت أمريكا بالاعتداء على قطر عربي او إسلامي ...؟

والكثير والكثير من الأسئلة التي نعلم انه لن سمح بها.

كلنا نعلم انه لن يسمح بها أبدا.

في الحقيقة الواقع صعب جداً.

صعب وبعيد عن التطبيق والتصديق في أن معاً.

ان اقتياد هذه الأمة إلى الواقع وهو الإسلام الصحيح أشبه بالدخول في حالة شفاء قاتلة.

مثل مدمن الهيروين تماماً يمكن علاجه بطريقتين.

الطريقة الأولى على مراحل وباستعمال بعض العقاقير.

والطريقة الثانية بالتوقف المفاجئ.

ولكن الطريقة الثانية لها مخاطرها لأنها قد تؤدي إلى الموت، ولكن نتائجها سريعة وفعالة.

والعرب وهم رمز الإسلام اليوم مثل مدمن الهيروين تماماً.

فقد توغلوا في عالم أخر غير عالم ومحيط الإسلام.

لن يستطيع الكثيرون تقبل الحياة الصحيحة بلا أغاني وبلا فجور وسفور الخ ....

حتى ان البعض يعتقد ان هذا هو الإسلام والأخر هو التخلف .

لو قلت له ان الغناء حرام لاستغرب أيما استغراب.

لو قلت له ان التصوير حرام لاستغرب أيما استغراب.

لو قلت له بين الإنسان وبين الكفر ترك الصلاة لقال لك انك تكفيري .

لو حاسبت وقاضيت امراءة مرت بالشارع لابسة سروال او بنطال او لا اعرف ما يمكن تسميته.

لقامت النساء والجمعيات واللجان تقول بالحرية الشخصية وألا اضطهاد وصداع أيما صداع.

ولو جمعت الزكاة بالقوة لرأيت عربات مكتوب عليها UN تحوط منزلك.

لو قلت ان الغرب خطر ولا يجب ان نتصافح معه او نرتبط معه لقالوا انه إرهابي.

ولا اعرف ما مشكلتها كلمة إرهابي ....!

هل هي سيئة ...؟

الله سبحانه وتعالى يقول ( وأعدوا لهم ما استطعتم من قوة ورباط الخيل ترهبون به عدوا الله وعدوكم )

أجل الله سبحانه وتعالى قال لنا أرهبوهم .

فليقولوا إننا إرهابيين.

أجل نحن إرهابيين.

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

أنه كلام كذب.

الغرب ليس مسالماً أبدا.

أنظر كم دولة دهموها بخيولهم التي تتحرك بالزيت.

أنظر الى السموم التي يبثونها في سماءنا ولا أحد يتحرك ساكناً.

لنا الحق في بقاء سماءنا نظيفة.

ولنا الحق في منعهم من بث قنواتهم في سماءنا.

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

ان قنواتهم قنابل وصواريخ يتم رميها ليس على المنازل فحسب بل يتم رميها على دول وقارات كاملة.

أنها أسلحة دمار شامل.

وحرب إبادة.

ويقولون يجب إعطاءهم الأمان ونبقى على صلح معهم طالما لا يحاربوننا ....!!!!

هؤلاء هم الخونة الحقيقيون.

لا نهم لا يرون المنكر منكراً.

ومن لا ينكر منكراً فقد وافقه.

من يستحل شرب الخمر لن يقول لك ان الغرب خطر بتسريبه للخمور في العالم العربي طالما كان هو يشرب الخمر ويريد الخمر.

لن يقول.

شخص لا يشرب الخمر سيتصدى للخمر ويمنع تداوله.

بالله عليكم دول تدعي الإسلام وتبيع الخمور ....!!!!

او تربي الخنازير ..!!!

هاههههههههههههههههههههههههههههههههههههههه

أشك في ان عمر ابن العاص قد مر عليهم أيام فتوحاته .

خنازير يا وجوه الخير....!!!

فضحهم فيروس اصغر من رأس دبوس.

وظهروا على التلفزيون وهم يحرقون الخنازير ويعدمونها.

بعضهم قال بلا حياء ولا خجل أني اربي القليل واكل منها انا وعيالي.

بكل جراءة ووقاحة على شاشة التلفزيون.

انا متأكد أنه لا يعلم أنه حرام.

لم يسمع بأحد يخبره بذلك.

بعضهم راح يبرر بعذر أقبح من ذنب قائلاً إنني أبيعها للفنادق التي تطهوها للغربيين.

لا حول ولا قوة الا بالله.

يعني اذا كان الكفار لعنهم الله يأكلون الخنازير ببلدانهم نتركهم نحن هنا بأرضنا يأكلون الخنازير ...!!!!!!!!!!!!!!!!!!

ونربيها لهم ...!!!

والأدهى نستورد لهم الخمر ونسقيها لهم.

على أرضنا هنا.

صدقوني هناك أشخاص يبيعون كل شئ حتى كرامتكم كعرب ومسلمين.

هذه الأشياء نجسة ومحرمة ولا يسمح التداول بها على ارض الإسلام بتاتاً.

ان الوطن العربي او الوطن الإسلامي مثله مثل منزلك الصغير لا فرق .

تصور معي انك أعددت وليمة لبعض الغربيين في منزلك .

هل لا نهم غربيين حقيرين لا يساوون ثمن زجاجة الخمر التي يشربونها ويشربون الخمور تجلب لهم خمراً في منزلك ليشربونه.

وهل تأمن على عيالك ومالك وجيرانك من مجموعة سكارى.

والرسول صلى الله عليه وسلم يقول ( لعن عاصره وحامله وشاربه ومجالسه )

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

لعنة صنعه ولعنه حمله ولعنة المجالسة أحيانا ولعنة الشرب ربما.

من يأمن على الناس وعلى الوطن بأي مكان من هؤلاء الغربيين السكارى.

هناك من باع الوطن من زمن بعيد.

لا مفر .

أما هم وأما نحن.

ليس هناك اعدل من هذا الرأي والقرار.

لنتقاتل ومن يكسب يسطر على كل الأرض وليفعل ما يشاء بعدها .

هذا هو ما نحتاجه.

مواجهة مصير، وحرب فصل.

لماذا اللف والدوران...!

أنظروا لحال العرب اليوم.

قتل بكل مكان وجثت بالآلاف.

الرسول صلى الله عليه وسلم يقول ( أذا كثر الزنا كثر القتل )

وخير دليل على هذا ما يحدث بلبنان والعراق وهذه الأراضي.

وزنا بالمئات قتل بالمئات.

يبدوا ان زواج المتعة الجماعي للشيعة يفعل فعله على أكمل وجه.

المشكلة ليست في الصراع على السلطة ولا تناحر الأحزاب ولا مجموعات متطرفة وإرهابية.

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

وانظروا الى الجفاف الذي غزا العالم العربي .

الرسول صلى الله عليه وسلم يقول ( أذا بخس الميزان قل القطر )

لا طبقة أوزون ولا ترانوسفير ولا بطيخة

المشكلة لا يوجد عدل بعالمنا .

بخس الميزان، فبخس الأوزون.

الميزان هو العدل، ولا يوجد عدل اذا لا يوجد مطر.

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

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

هذه هي المشاكل ببساطة، ومسبباتها.

وكل مشكلة ستجد لها سبباً كما أوردنا سابقاً.

حقيقة كلنا نحب ان نرى ظهوره لأسباب معينة.

وهو ان نرى الإسلام قوياً من جديد، اذا كان مقدراً صلاح الإسلام بظهوره فماذا نفعل ...؟

ليظهر اذا والأمر لله.

البعض يريد الأموال والخير الوفير الذي يهبه للناس .

لا أعلم لماذا هؤلاء الناس متكاسلين ...؟

تم من هو الأكثر كرماً ومالاً المهدي المنتظر أم الله سبحانه وتعالى.

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

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

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

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

وهو بحاجة الى الناس قبل ان يكونوا هم بحاجته.

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

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

فهذا إعجاز.

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

لا اعتقد ان هناك شئ من هذا سيحدث ...؟

لا تقلق يجب ان تتابع معي خطوة بخطوة.

تقول السنة ان أسمه محمد او هو أحمد .

لا تنتظر شخصاً يحمل هذا الاسم.

فالأسماء لا تعني شيئاً ولا تغير من حقائق الأشياء.

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

فأي شخص كانت به هذه الصفات هو محمد وأحمد ومحمود وغير ذلك لا يغير من الأمر شئ.

فمن الممكن ان تجد شخصاً أسمه محمد وهو كافر وفاجر وتجد شخصاً أسمه أمية تقي وورع.

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

مستحيل كيف لشجرة ان تنبث ثماراً وهي من حديد.

وأبوه هو عبدالله كان من كان، ولا اعتقد ان هناك أحد ليس له أب، والدك هو عبدا لله أي عبد لله وكلنا عبيد الله.

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

وورد أنه أجلى الجبهة أي شخص صادق.

وورد أنه اقني الأنف وهي تعني انه ( أنف محدودب ) في إشارة الى تشبهه بالصقر في صفاته وخصاله.

يعني هو ليس شخص يطير ... !

وإنما شخص حر بالدرجة الأولى .

لا تستعبده عادة او مادة او أي شئ .

وبالتأكيد شجاع.

هذا هو القول الصائب والرأي السديد.

وورد انه لا يعلم حقيقة حاله وإنما الناس هم من يتعرفوا عليه.

( مجنون يتكلم وعاقل يسمع )

يا جماعة أعطونا أخبارا نفهمها ومنطقية تستسيغها عقولنا.

لا يعلم حقيقة حاله ...!!!!!!!!!!!

أين كان او ما الذي صدمه فافقده ذاكرته ...؟

ومن لا يعرف حقيقة حاله فهو لا يعرف حقيقة ما يدور حوله.

وكيف سيصلح ما حوله ان كان لا يعلم ما يحدث حوله.

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

ان تقول لي انه لا يرغب في تولي أمور المسلمين وأمارتهم فهذا كلام أتقبله.

أما أنه لا يعلم حقيقة حاله فهذا أمر مشكوك فيه.

شخص يطارده جيش ويخسف الله به الأرض وكل الروايات والأحداث .

وهو بالتأكيد يعلم عنها ( أي أخبار السنة بظهور مهدي ) إلا إذا ما كان قد هبط من السماء فلا ادري .

هذا شئ أخر.

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

وهو تقي وورع وصادق وبه صفات الصقور.

ويظهر من جهة الشرق.

تماماً من المكان الذي أشرق منه الإسلام.

المقصود ليس من مكة.

وإنما المقصود بالشرق في أشارة الى الظهور المشرق.

فالشرق هو مكان شروق الشمس وبزوغ الفجر.

والضؤ الذي ينبعث ليبدد الظلام ويضئ العالم.

هذا هو المقصود.

وليس ظهوراً مظلماً ظالماً مضللاً .

تم بالله عليكم ان كان المقصود هو الشرق أي من ناحية الشرق فكيف يخرج من هناك وبعض البلدان العربية شرقها بحر متلاطم الأمواج.

الا ان كان سيظهر حوتاً او قرشاً فهذا شئ أخر ربما فهذا الشئ الوحيد الذي سيخرج .

تم ان المغرب العربي شرقه أسيا، وأسيا شرقها بحر.

ولهذا لا يمكن ان يكون الشرق هو دلالة على مكان واتجاه، وإنما هو كما أوردت لكم سابقاً.

ألان أصبح الأمر منطقياً بدل ان كان إعجازا لا يتقبله العقل ومبهماً.

وقالوا ان يسمى المهدي ( من الهداية ) لان الله سبحانه وتعالى يهديه ويسدد خطواته وأعماله وأحكامه وما الى ذلك .

ولا خطاء بذلك، فلكي تتحول هذه الأمة فستتحول بقدرة القادر وبأحكام وبخطوات مسددة ألاهياً.

وورد انه سيظهر مع مجموعة من الأشخاص او الجنود وهم يركبون خيولاً ويحملون أعلاماً سوداء.

ودعوني أتوقف قليلاً عند مصطلح خيول.

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

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

وأيضاً ان الأساطير والأمور الغيبية دائماً تكون مشفرة ومبهمة .

هذا رأي .

والرأي الأخر هو ربما فعلاً تكون خيلاً.

وان كان ذلك فعلاً فليس له الا تفسير واحد، وهو الاستعداد للتعود على هذا الوضع باكراًُ.

لان هناك ما سيدمر كل التقنية وكل العلوم.

فمما لا شك فيه انه ورد أيضا ان حروباً ستقوم وسيشهد الناس أهوالاً لا حصر لها.

وله تسعة وزراء هم مستشاريه وقادة حربه.

( أمرهم شورى بينهم ) .

وشاورهم في الأمر .

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

اذا كما كنت أقول من قبل يبدوا إننا أمام حرب فصل و حرب تقرير مصير.

ستأكل الأخضر واليابس .

ونار ستلتهم كل شئ ، لا بترول ولا دولار ولا سيارات ولا طائرات.

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

وسيكون الفضل كل الفضل في هذا إلى الأسلحة النووية.

ويبدو ان إيران تتقدم سريعاً معتزمة إشعال أول الفتيل.

وسيحتاج العالم بعدها إلى الوقت، مع الهدوء التام، والسلام التام أخيراً.

لا دخان، ولا غازات، ولا حروب.

وستنتعش الأرض من جديد.

أمطار ومراعي وحياة برية عريضة وبحيرات وأنهار.

خيام وخيل وأبل وأغنام وسيوف.

حياة بسيطة وعالم جميل نتمنى ان يتحقق سريعاً.

هذا رأي أخر أقرب للصواب.

وظهر الكثير من الناس الذين راحوا يقولون أنهم هذا الرجل المهدي.

ولو نظرت بالانترنت ستجد حكايات وقصص غريبة.

وبعد كلامي هذا ستسمعون قصص وحكايات اغرب من قبل.

ويبدوا ان العرب لا زالوا في ظلالهم القديم ولا زالت أعينهم تتجه نحو الغرب.

ويبحثون عن منقذهم من جهة الغرب.

في رئيس الولايات المتحدة الجديد كما كان القديم .

كل رئيس جديد يقولون هذا هو الذي سيحقق مطالبهم.

ما رأيت شيئاً أغبى من هذا .

فكلنا نعرف ان كرسي الرئيس ذلك لا يجلس عليه ولن يجلس عليه الا شخص يريده الإسرائيليين .

لا زالوا يتوهمون ان الغرب لديهم نظام ديمقراطي وانتخابات نزيهة وكل تلك الخزعبلات التي يروج لها الغربيين .

يا وجوه الخير لن يأتيكم من الغربيين الا كل بلاء وعناء .

راجعوا التاريخ.

نحن أخرجناهم من الظلمات بيوم من الأيام.

وهم من أدخلونا إلى الظلمات حتى يومنا هذا.

وهذه الظلمات التي أدخلونا لها هي الأعلام السوداء التي سيحملها رجال قريباً.

سيحملونها كما يحمل رجال الإنقاذ الحجارة من فوق أناس انهار عليهم منزلهم.

وسيخرجون الناس من تحتها.

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

للأسف حتى علمائنا ما عادوا يفرقون بين الدرهم والدينار.

وان سألتهم ما هذا الشئ لقال بعضهم انه ليل وقال الآخرون انه النهار .

ولا يتفقون فيما بينهم حتى على فتوى مزمار إحلال هي ام حرام .

وهذا موضوع مهم جداً .

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

ويقول فلان انها كذا.

وفلان احتج بالحديث الفلاني .

وقال فلان برأيه الشخصي كذا.

اذا كان العلماء متفرقين فكيف نلوم الرؤساء في تفرقتهم.

كان الأفضل لهؤلاء العلماء الاجتماع على رأي واحد فيما بينهم يخرجون به إلى الناس ولو كان ما اجتمعوا عليه ليس هو الصواب.

كل شخص يفتي من جهة .

وكل دولة لها مفتيها ، بل ان كل شخص له مفتيه .

يقول لك احدهم انا لا اسمع الا الشيخ الفلاني .

وأخر يقول لك ان امضي واعمل بكلام الشيخ الفلاني .

و لأعطيكم مثالاً .

ذات مرة سألوا شيخاً ما رأيك بمن ينشد الأناشيد الدينية مع معازف ( أي موسيقى ) .

فقال : لا هي حرام.

فقالوا له اذا ما رأيك بالشيخ فلان أنه يفعل ذلك ...؟

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

أنظروا إلى التناقض وعندما يكون الكلام والحديث مناقضاً لبعضه لا يدخل عقلك ولا تستسيغه بتاتاً .

هو من جهة يفتي بفتوة ومن جهة أخرى يناصر شخصاً آخر عليها او يوافق من حكم بعكسها.

وأيضاً تجد الكثيرين يفتون الناس في سرعة .

ما رأيك يا شيخ في المسألة الفلانية ....؟

فيقول بلا تردد إنها حلال طيب زلال أشربوه .

أو يقوم هي منكر وحرام فاتركوه.

وأين هم من السلف الأولون الذين كانوا يتفكرون بالمسألة اليوم واليومين .

أو يقولون لا نعلم شيئاً عن هذا الأمر.

من قالها بأيامنا هذه ....؟

من....؟

ما رأيت أحداً قال لا اعلم عن هذه المسألة شيئاً.

دائماً هم يعرفون .

ويعلمون كل شئ .

اذا لماذا يختلفون فيما بينهم .

الاختلاف دليل على عدم المعرفة .

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

الأمام الشافعي رحمه الله تتلمذ على يدي الإمام مالك رحمه الله .

لماذا قال وخالف أمامه ومعلمه .

ولو جئنا الى هذه المسألة على سبيل المثال .

وهي مسألة قضاء يوم رمضان لمن فطره غير متعمد .

قال الأمام الشافعي رحمه الله لا حاجة الى قضاءه مستدلاً بحديث شريف .

وقال الإمام مالك رحمه الله يجب القضاء قائلا برأيه لو ان كل إفطار ترك بلا قضاء لاستهان الناس بالشهر وما الى ذلك .

واللوم هنا على سبيل المثال على من يقع .

على الشافعي رحمه الله الذي شق المسلمين ولو كان على صواب .

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

طبعاً انا مع الإمام الشافعي تماماً فيما ذهب أليه من رأي وهو إتباع الكتاب والسنة .

ومن لن يحافظ على حرمة الشهر ويستهين به .

فسوف يستهين به حتى ولو لزمه قضاء كل يوم افطره .

طبعاً هذا اذا قال الإمام مالك أصلا بوجوب القضاء .

اقصد هناك أمور ونقل لا نعرف له أساساً .

مثل قول المالكية هنا بالمغرب العربي إننا لا نقوم بالرفع في الصلاة لان الأمام مالك ما كان يرفع بالصلاة .

من الذي قال ان الأمام مالك ما كان يرفع في الصلاة .

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

وحتى وان قال الأمام مالك ذلك رحمه الله من الأجدر بالإتباع الأمام مالك ام الرسول صلى الله عليه وسلم .....!!!!

أي شئ تبتت صحته بالأحاديث والسنة انتهى أمره .

لا تقل لي الأمام مالك ولا الشافعي ولا غيره رحمهم الله كلهم .

والصحيح هو إلغاء هذه المذاهب كلها .

لا يوجد مذهب شافعي ولا حنبلي ولا مالكي ولا غيره .

تماماً مثلما لا يوجد لا سني ولا صوفي ولا سلفي ولا غير سلفي

ما هو هذا يلي نحنا فالحين فيه بس .

كل شئ فيه اختلاف وتفرقة نحن أول من يعمله .

فيه كتاب وسنة وبس .

ولا داعي لبلبلة الأمور على الناس .

وأخيراً لا أقول لكم إلا إنني أظهر المهدي لكم ومن بينكم .

يقولون هناك من ينتظر الأمور لتحصل وهناك من يصنعها.

وأنا ألان اصنعها .

وكل هذا الحديث هو لتصحيح رؤية وصنع فكرة.

وقالوا أقوى شئ بهذه الدنيا هو الفكرة، وليس هناك ما هو أقوى منها .

لذلك لقد دمرت كل الحواجز التي من الممكن ان تقف بطريقك .

وما بقى لك الا ان تؤمن وتعمل .

ومن امن بشئ حققه ولو كان مستحيلاً .

واحذر ان تفعل ما فعله الآخرون .

يخرجون قائلين إنهم المهدي المنتظر .

وعندما يعجزون عن فعل شئ ، يبدءون بذبح الناس وتفجير منازلهم .

ما قال الإسلام بهذا أبداً .

ولكن هناك طريق واحدة صحيحة .

اذا كنت هو الشخص المطلوب فستجدها .

ونصيحتي لك دائماً لا تقل للناس انا المهدي المنتظر.

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

هذا اذا كان من تتعامل معهم عقلاء .

أما اذا كانوا مجانين مثلك تماماً فستجد نفسك وراء القضبان.

وإنما جد طريقة لتنقذ بها العالم العربي والإسلامي .

وبعدها سيقول لك الناس يا أمامنا المهدي ويتبعونك .

وستكون أشقى شخص بينهم حينها.

وقد تقول لي كيف أجد طريقة عظيمة كهذه .

وعندها أعاود قولي ( جد الفكرة )

فالفكرة أقوى شئ بهذا العالم .

وها انت ترى إنني وجدت فكرة حطمت كل الحواجز .

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

وإنما فتحت مساراً لمن يريد ان يعبر ويحاول فقط .

لك ولغيرك .

وتذكر ان الإيمان بأي شئ يحققه.

وتذكر دائماً اذا أردت ان تظهر

فأظهر من الشرق

وقبل ان تفعل تخلص من كل الرغبات والإطماع الدنيوية .

وليس لك إلا هدف واحد فقط .

إنقاذ أهلك ووطنك ودينك من الشرق إلى الغرب .

والخروج بهم من الظلمات إلى النور .

ورد الطغاة و الجبابرة والمتكبرين ونصرة المظلومين والضعفاء والمستضعفين .

والتسلح بالعلم و العمل واستشارة العلماء والمتعلمين .

ولن تجد كل شئ مواتياً وكل شئ ناجحاً .

ولكن حاول المرة تلو المرة ، فالنجاح لا يأتي إلا من تجارب الفشل .

وليس لك الحق بقتل او بمقاضاة او محاسبة اي شخص الا بعد ان يقول لك الناس احكم بيننا يا مهدينا المنتظر .

وقتها الكل سيثق بما تقول .

ولا تتخذ الكافرين أولياء من دون المسلمين .

ولا تثق بهم ولا تعمل معهم بأي شكل من الأشكال .

بمعنى أخر لا تتعامل مع الغرب أبداً .

اذاً أنت تحتاج الى الفكرة .

أنها ليست مستحيلة ولا أومن بالمستحيلات .

وعلى الأقل هي شئ يمكن ان تجده بداخل رأسك وليست شئ يجب ان تبحث عنه ببلاد الواق واق .

وهي شئ قد يهب عليك من هنا او هناك كما كما ورقة جاءت بها لك الريح .

من أنار العالم بالكهرباء وقع على فكرة .

ولم يحارب ولم يقاتل او يقتل او يسافر ليجدها وإنما بحث عنها بالمكان المناسب وفي الزمن المناسب .

وأخيرا اذا نجحت وكنت الشخص المطلوب .

والرجل المختار .

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

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

فاتركوا له ثلاث خيول بلا سلام او أي كلام .

والسلام عليكم ورحمة الله وبركاته


Intoduction المقدمة | Important Lessons دروس مهمة | Integrated Development Environment | Commands() الأوامر | Components() الأدوات
About Me Begin Operators Var Function&Sub Properties&Events | Files Macros Snippets Registry Windows API Work with System C#&VB Deferince KeyWords Xml File | Form Designer Menu ToolBox Solution TollBox Project Designer Setup Project Debug Error Some Windows | Me AddHandler Do Error For Each For If EndIf Like MouseButton Multi-Threading My Now Select Case Using With EndWith Array | TextBox ComboBox ContextMenuStrip DataGridView Drive&Dir&List ErrorProvider HelpProvider ImageList ListBox ListView MenuStrip NotifyIcon NumericUpDown Dialogs PictureBox ProgressBar PropertyGrid Radio&CheckBox RichTextBox TabControl Timer ToolTip TreeView WebBrowser DateTimePicker MaskedTextBox PrintPreview
High Lessons دروس متقدمة |  | Microsoft Office برامج مايكروسوفت
UserControl Enum NameSpace & Class Darwing ComClass |  | MsAgnit Microsoft Word Access Database
Other أيضاً | Database() قواعد البيانات
System 64 WebSite Glossary From MSDN Idea | Ado.net DataSours Adodb SQL Server Crystal Report DataWizard WizardHelp

Alzentan 2009 @ The way to Visual Basic 2005


الرئيسية

Visual Basic .NET keywords | الكلمات المحجوزة في الفجوال ستوديو الكلمات المحجوزة هي كلمات يستخدمها الفجوال في الترجمة ولا يجوز استخدامها ، الا بحالة واحدة نتطرق لها في الدروس القادمة.
الكلمة المحجوزة | ملخص
AddHandler | Visual Basic .NET Statement
AddressOf | Visual Basic .NET Statement
Alias | Used in the Declare statement
And | Boolean operator
AndAlso | Boolean operator
Ansi | Used in the Declare statement
Append | Used as a symbolic constant in the FileOpen function
As | Used in variable declaration (Dim, Friend, etc.)
Assembly | Assembly-level attribute specifier
Auto | Used in the Declare statement
Binary | Used in the Option Compare statement
Boolean | Used in variable declaration (intrinsic data type)
ByRef | Used in argument lists
Byte | Used in variable declaration (intrinsic data type)
ByVal | Used in argument lists
Call | Visual Basic .NET statement
Case | Used in the Select Case construct
Catch | Visual Basic .NET statement
CBool | Data-conversion function
CByte | Data-conversion function
CChar | Data-conversion function
CDate | Data-conversion function
CDec | Data-conversion function
CDbl | Data-conversion function
Char | Used in variable declaration (intrinsic data type)
CInt | Data-conversion function
Class | Visual Basic .NET statement
CLng | Data-conversion function
CObj | Data-conversion function
Compare | Used in the Option Compare statement
CShort | Data-conversion function
CSng | Data-conversion function
CStr | Data-conversion function
CType | Data-conversion function
Date | Used in variable declaration (intrinsic data type)
Decimal | Used in variable declaration (intrinsic data type)
Declare | Visual Basic .NET statement
Default | Used in the Property statement
Delegate | Visual Basic .NET statement
Dim | Variable declaration statement
Do | Visual Basic .NET statement
Double | Used in variable declaration (intrinsic data type)
Each | Used in the For Each...Next construct
Else | Used in the If...Else...ElseIf...End If construct
ElseIf | Used in the If...Else...ElseIf...End If construct
End | Used to terminate a variety of statements
EndIf | Used in the If...Else...ElseIf...End If construct
Enum | Visual Basic .NET statement
Erase | Visual Basic .NET statement
Error | Used in the Error and On Error compatibility statements
Event | Visual Basic .NET statement
Explicit | Used in the Option Explicit statement
False | Boolean literal
For | Used in the For...Next and For Each...Next constructs
Finally | Visual Basic .NET statement
For | Visual Basic .NET statement
Friend | Statement and access modifier
Function | Visual Basic .NET statement
Get | Used in the Property construct
GetType | Visual Basic .NET operator
GoTo | Visual Basic .NET statement, used with the On Error statement
Handles | Defines an event handler in a procedure declaration
If | Visual Basic .NET statement
Implements | Visual Basic .NET statement
Imports | Visual Basic .NET statement
In | Used in the For Each...Next construct
Inherits | Visual Basic .NET statement
Input | Used in the FileOpen function
Integer | Used in variable declaration (intrinsic data type)
Interface | Visual Basic .NET statement
Is | Object comparison operator
Let | Reserved but unused in Visual Basic .NET
Lib | Used in the Declare statement
Like | Visual Basic .NET operator
Lock | Function name
Long | Used in variable declaration (intrinsic data type)
Loop | Used in a Do loop
Me | Statement referring to the current object instance
Mid | String-manipulation statement and function
Mod | Visual Basic .NET operator
Module | Visual Basic .NET statement
MustInherit | Used in the Class construct
MustOverride | Used in the Sub and Function statements
MyBase | Statement referring to an object's base class
MyClass | Statement referring to the current object instance
Namespace | Visual Basic .NET statement
New | Object-creation keyword, constructor name
Next | Used in the For...Next and For Each...Next constructs
Not | Visual Basic .NET operator
Nothing | Used to clear an object reference
NotInheritable | Used in the Class construct
NotOverridable | Used in the Sub, Property, and Function statements
Object | Used in variable declaration (intrinsic data type)
Off | Used in Option statements
On | Used in Option statements
Option | Used in Option statements
Optional | Used in the Declare, Function, Property, and Sub statements
Or | Boolean operator
OrElse | Boolean operator
Output | Used in the FileOpen function
Overloads | Used in the Sub and Function statements
Overridable | Used in the Sub and Function statements
Overrides | Used in the Sub, Property, and Function statements
ParamArray | Used in the Declare, Function, Property, and Sub statements
Preserve | Used with the ReDim statement
Private | Statement and access modifier
Property | Visual Basic .NET statement
Protected | Statement and access modifier
Public | Statement and access modifier
RaiseEvent | Visual Basic .NET statement
Random | Used in the FileOpen function
Read | Used in the FileOpen function
ReadOnly | Used in the Property statement
ReDim | Visual Basic .NET statement
Rem | Visual Basic .NET statement
RemoveHandler | Visual Basic .NET statement
Resume | Used in the On Error and Resume statements
Return | Visual Basic .NET statement
Seek | File-access statement and function
Select | Used in the Select Case construct
Set | Used in the Property statement
Shadows | Visual Basic .NET statement
Shared | Used in the Sub and Function statements
Short | Used in variable declaration (intrinsic data type)
Single | Used in variable declaration (intrinsic data type)
Static | Variable declaration statement
Step | Used in the For...Next construct
Stop | Visual Basic .NET statement
String | Used in variable declaration (intrinsic data type)
Structure | Visual Basic .NET statement
Sub | Visual Basic .NET statement
SyncLock | Visual Basic .NET statement
Text | Used in the Option Compare statement
Then | Used in the If...Then...Else...EndIf construct
Throw | Visual Basic .NET statement
To | Used in the For...Next and Select Case constructs
True | Boolean literal
Try | Visual Basic .NET statement
TypeOf | Used in variations of the If...Then...EndIf construct
Unicode | Used in the Declare statement
Until | Used in the For...Next construct
Variant | Reserved but unused in Visual Basic .NET
When | Used with the Try...Catch...Finally construct
While | Used with the Do...Loop and While...End While constructs
With | Visual Basic .NET statement
WithEvents | Used in variable declaration (Dim, Public, etc.)
WriteOnly | Used in the Property statement
XOr | Visual Basic .NET operator


الرئيسية

الاختلافات الجوهرية بين السي شارب والفيجوال

Differences Between Microsoft Visual Basic .NET and Microsoft Visual C# .NET

المقدمة

بسبب الاختلافات الماضية بين اللغات مثل الفيجوال بيسك والسي والسي ++ والذي كانت تتفوق فيه لغة برمجة على أخرى.

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

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

مع ان سهولة الاستخدام شئ نسبي من شخص الى أخر، فمثلاً بالنسبة لي أنا هذا الإجراء في الفيجوال:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

وهذا هو في السي شارب :

private void Form1_Load(object sender, EventArgs e)

        {

        }

ويذكرني او تذكرني عبارة End Sub بعبارة End Begin في الدلفي.

لا يحبذ البعض العلامات المختصرة مثل ان نكتب:

A +=1 بدلاً من A=A+1

او ان ننهي السطر البرمجي بعلامة مثل ;

مع ان هذه الحركات الصغيرة أعطت مرونة كبيرة للغة في كثير من الأحيان.

حقيقة اللغتان مختلفتان ، والسي شارب اقرب ما تكون الى لغة السي او السي ++ او الجافا .

حساسية الأحرف :

الأسماء المعرفة في الفيجوال ليست حساسة للأحرف الصغيرة والكبيرة ولكن السي شارب كذلك.

مثلاً اذا حاولت ان تكتب شيئاً مثل :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ko As Integer

        Dim Ko As Integer

End Sub

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

أما بالنسبة للسي شارب فلا مشكلة بذلك :

private void Form1_Load(object sender, EventArgs e)

        {

            int er;

            int Er;

        }

الإعلان عن المتغيرات :

في الفيجوال بيسك :

        Dim i, j As Integer

        Dim i As Integer = 7

        Dim i(6) As Integer

        OR

        Dim i() As Integer = New Integer(6) {}

        Dim con As SqlConnection

        Dim x As New Y("ABC")

        OR

        Dim x As Y = New Y("ABC")

في السي شارب :

            int i, j;

            int i = 7;

            int[] i = new int[6];

            SqlConnection con;

            Y x = new Y("ABC");

المتغيرات في الفيجوال بيسك معلنة قبل النوع أما بالسي شارب فيتم الإعلان عن النوع قبل المتغير.

أنواع البيانات :

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

على سبيل المثال العدد الصحيح في الفيجوال بيسك Int أما في السي شارب Int32

وعلى كل حال يمكن استخدام Int32 في كلا اللغتين .

والجدول التالي يوضح لنا ذلك بشكل اكثر وضوحاً :

Visual Basic .NET | Visual C# .NET | .NET Framework
Boolean | bool | System.Boolean
Byte | byte | System.Byte
Short | short | System.Int16
Integer | int | System.Int32
Long | long | System.Int64
Single | float | System.Single
Double | double | System.Double
Decimal | decimal | System.Decimal
Date | System.DateTime | System.DateTime
String | string | System.String
Char | char | System.Char
Object | object | System.Object
n/a | sbyte | System.Sbyte
n/a | ushort | System.UInt16
n/a | uint | System.UInt32
n/a | ulong | System.UInt64

نهاية السطر البرمجي :

السطر البرمجي في الفيجوال بيسك ينتهي بنهاية السطر كما بالشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     MsgBox(My.Computer.Info.OSFullName)

End Sub

كما يمكنك استخدام (:) لوضع اسطر برمجية متعددة في سطر واحد وتعتبر هذه العلامة بداية لسطر برمجي جديد أنظر للشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

               MsgBox(My.Computer.Info.OSFullName) : Me.Text = My.Computer.Info.OSFullName

End Sub

كما يمكن إخبار المترجم ان مجموعة من الأسطر ما هي الا سطر برمجي واحد بواسطة العلامة ( _ ) كما بالشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

أما في السي شارب فكل سطر برمجي ينتهي بالعلامة ( ; ) أنظر للشكل التالي :

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace WindowsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            int er;

        }

    }

}

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

وطبعاً هذه العلامة قامت بكل الأعمال التي كان يقوم بها الفيجوال بعلامتين.

هذا مثال أخر للفيجوال بيسك :

        A = 5

        B = 7 : C = 8

        MySub(Arg1, _

              Arg2, _

              Arg3)

وهذ مثال للسي شارب :

          A = 5;

          B = 7; C = 8;

          MySub(Arg1,

                Arg2,

                Arg3);

إحاطة كتل البيانات :

فيما يخص الفيجوال بيسك :

  If A = 5 Then

  End If

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

   Select Case VariableName

            Case 1

            Case 2

            Case Else

    End Select

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

أما فيما يخص السي شارب :

            if (a == 5)

            {

            }

      private void Form1_Load(object sender, EventArgs e)

        {

        }

            int caseSwitch = 1;

            switch (caseSwitch)

            {

                case 1:

                    Console.WriteLine("Case 1");

                    break;

                case 2:

                    Console.WriteLine("Case 2");

                    break;

                default:

                    Console.WriteLine("Default case");

                    break;

            }

الفيجوال سي شارب يقوم بحصر كتل البيانات بين قوسين

استعمال ( ) وكذلك [ ]

تستعمل الفيجوال بيسك ( ) في تحديد المصفوفات وتعريف بارامترات الدوال او الإجراءات.

أما السي شارب فتستخدم [ ]

أمثلة للفيجوال بيسك :

        Dim a() As Long

        Dim a(3, 5) As Integer

        Dim a() As Long = {3, 4, 5}

        X = A(5)

        MySub(A, B, C)

        Y = MyDataSet.Tables("Author").Rows(5).Columns("AuthorID")

أمثلة للسي شارب:

        int[] x = new int[5];

        int[] x = new int[5] {1, 2, 3, 4, 5};

        MySub(A, B, C);

        Y = MyDataSet.Tables["Author"].Rows[5].Columns["AuthorID"]

العمليات :

يوجد اختلاف كبير في العلامات او الطريقة التي تتم بها العمليات من جمع وطرح وغيرها في كلا اللغتين.

وهذا الجدول يبين لنا الاختلافات بينهما :

Operator | Visual Basic .NET | Visual C# .NET
Additive |  |
Addition | + | +
Subtraction | - | -
Multiplicative |  |
Multiplication | * | *
Division | / | /
Integer division | \ | / (depending on the operands)
Modulus (division returning only the remainder) | Mod | %
Exponentiation | ^ | n/a
Assignment |  |
Assignment | = += -= *= /* | = += -= *= /*
Integer division | \= | /= (depending on the operands)
Concatenate | &= | +=
Modulus | n/a | %=
Left shift | n/a | <<=
Right shift | n/a | >>=
Bitwise AND | n/a | &=
XOR | n/a | ^=
OR | n/a | |=
Relational and equality |  |
Less than | < | <
Less than or equal to | <= | <=
Greater than | > | >
Greater than or equal to | >= | >=
Equal | = | ==
Not equal | <> | !=
Compare two object reference variables | Is | ==
Compare object reference type | TypeOf x Is Class1 | x is Class1
Compare strings | = | == or String.Equals()
Concatenate strings | & | +
Shortcircuited Boolean AND | AndAlso | &&
Shortcircuited Boolean OR | OrElse | ||
Shift |  |
Left shift | n/a | <<
Right shift | n/a | >>
Scope resolution |  |
Scope resolution | . | ., base
Postfix |  |
Type cast | Cint, CDbl, …, CType | (type)
Member selection | . | .
Postfix increment | n/a | ++
Postfix decrement | n/a | --
Unary |  |
Indirection | n/a | * (unsafe mode only)
Address of | AddressOf | & (unsafe mode only)
Logical NOT | Not | !
One's complement | Not | ~
Prefix increment | n/a | ++
Prefix decrement | n/a | --
Size of type | n/a | sizeof
Bitwise |  |
Bitwise NOT | Not | ~
Bitwise AND | And | &
Bitwise XOR | Xor | ^
Bitwise OR | Or | |
Logical |  |
Logical AND, OR | And | &&
Logical OR | Or | ||
Conditional |  |
Conditional | IIf | ?:
Pointer to member |  |
Pointer to member | n/a | . (Unsafe mode only)

لاحظ ان هناك الكثير من الخيارات n/a في أشارة الى ان هذا ليس مدعوماً في الفيجوال بيسك .

تمرير البارامترات .

في الفيجوال بيسك بواسطة القيمة :

    Public Sub ABC(ByVal y As Long)

    End Sub

   ABC(x)

   ABC((x))

بواسطة المرجع :

    Public Sub ABC(ByRef y As Long)

    End Sub

    ABC(x)

في الفجوال سي شارب وبواسطة القيمة :

      void ABC(int x)

           {

           }

      ABC(i);

وبواسطة المرجع

     void ABC(ref int x)

         {

          }

      ABC(ref i);

هنا مثال على كيفية تعريف كائنات الاتصال :

الفيجوال بيسك

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim connection As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Select * from t1", connection)

        Try

           connection.Open()

     Dim dr As OleDbDataReader = cmd.ExecuteReader()

        Do While dr.Read()

             ListBox1.Items.Add(dr.Item("itemname").ToString)

        Loop

         dr.Close()

        Finally

            connection.Close()

        End Try

السي شارب

        String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

        OleDbConnection connection = new OleDbConnection(ConString);

        OleDbCommand command = new OleDbCommand("Select * from t1", connection);

               try

               {

                  connection.Open();

               OleDbDataReader dr= command.ExecuteReader();

                    while (dr.Read()) {

                        this.listBox1.Items.Add(dr["itemname"] );

                    }

               }

               finally

               {

                   connection.Close();

               }

كود متقارب كثيراً .

أما في استيراد مجالات الأسماء فانظر للشكل التالي :

الفجوال بيسك

  Imports System

  Imports System.Collections.Generic

  Imports System.ComponentModel

  Imports System.Data

  Imports System.Drawing

  Imports System.Text

  Imports System.Windows.Forms

  Imports System.Data.OleDb

السي شارب

  using System;

  using System.Collections.Generic;

  using System.ComponentModel;

  using System.Data;

  using System.Drawing;

  using System.Text;

  using System.Windows.Forms;

  using System.Data.OleDb;

التراكيب :

  Enum day

        Monday

        Tuesday

        Wednesday

        Thursday

        Friday

        Saturday

        Sunday

  End Enum

  enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

الإجراءات

  Function GetNumber() As Integer

        MsgBox("VB")

        Return 10

  End Function

     int GetNumber()

        {

            MessageBox.Show("C#");

            return 10;

        }

الوراثة :

 Imports System.Windows.Forms

  Public Class Class1

    Inherits Button

  End Class

 using System.Windows.Forms;

    class Class1: Button

    {

    }


المصفوفات Array

يمكنك اخبار الفجوال نت بانك تعرف هذا المتغير كمصفوفة بعدة طرق وأشكال أنظر التالي:

Dim Value(6) As Integer

فيكون الشكل لهذه المصفوفة كالتالي:

أذا قلنا التالي:

Value(3)=12

أما الشكل لمثل هذه المصفوفة

 Dim Scoreboard(0 To 1, 0 To 6) As Short

أذا قلنا التالي:

 Scoreboard(0,2)=6

فالشكل والمكان سيكون كالتالي:

وهذه صورة أخرى:

  Dim myvalue(5, 3) As Integer

عندما تريد ان تضع قيماً بداخل المصفوفة الاولى فيمكنك ذلك بالطريقة التالية:

Public Class Form1

    Dim myvalue(5) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myvalue(0) = 11

        myvalue(1) = 4

        myvalue(2) = 13

        myvalue(3) = 44

        myvalue(4) = 123

    End Sub

End Class

كما يمكنك تعبئتها بواسطة Loop في برنامجك كالتالي:

 Public Class Form1

    Dim mycounter As Integer

    Dim myvalue(5) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        For mycounter = 0 To myvalue.Length - 1

            myvalue(mycounter) = mycounter

        Next

    End Sub

End Class

لاحظ اننا عرفنا متغير من النوع integer وهو mycounter لاستخدامه في العد، اما العبارة For فهي ستبدأ من الصفر الى myvalue.Length - 1 و Length تعود برقم يمثل مجال المصفوفة وسوف تعود برقم 6 كما عرفناها ولكنني انقصت منها 1 لانه يتم احتساب الصفر أيضاً.

وبعدها أسندت للمصفوفة على الترتيب القيمة الصاعدة بداخل المتغير mycounter

ولكن كيف يمكن التعامل مع المصفوفة من النوع الثاني..؟

Public Class Form1

    Dim myvalue(5, 3) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myvalue(0, 0) = 1

        myvalue(0, 1) = 2

        myvalue(0, 2) = 3

        myvalue(0, 3) = 4

        myvalue(1, 0) = 5

        myvalue(1, 1) = 6

        myvalue(1, 2) = 7

        myvalue(1, 3) = 8

        myvalue(2, 0) = 9

        myvalue(2, 1) = 10

        myvalue(2, 2) = 11

        myvalue(2, 3) = 12

        myvalue(3, 0) = 13

        myvalue(3, 1) = 14

        myvalue(3, 2) = 15

        myvalue(3, 3) = 16

        myvalue(4, 0) = 17

        myvalue(4, 1) = 18

        myvalue(4, 2) = 19

        myvalue(4, 3) = 20

        myvalue(5, 0) = 21

        myvalue(5, 1) = 22

        myvalue(5, 2) = 23

        myvalue(5, 3) = 24

    End Sub

End Class

أنظر هنا قد تم تعبئة المصفوفة.

طبعاً يمكنك استخدام المصفوفة لأي نوع تريد أنظر للمثال الثالي:

 Public Class Form1

    Dim myvalue(5) As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myvalue(0) = "Visual"

        myvalue(1) = "Windows"

        myvalue(2) = "File"

        myvalue(3) = "Copy"

        myvalue(4) = "Edit"

        myvalue(5) = "Cut"

    End Sub

End Class

الامر واضح تماماً وسهل وبسيط جداً.

كما يمكنك وضع قيم بالمصفوفة وقت تعريفها كما بالشكل التالي:

 Dim myvalue() As String = {"Visual", "Windows", "File", "Copy"}

أو كما بالشكل التالي:

Dim myvalue(,) As Integer = {{1, 2}, {3, 4}, {5, 6}}

ولكن ماذا أذا اردت ان تقوم بتغيير أبعاد هذه المصفوفات، عندها عليك استخدام العبارة Redim كما بالشكل التالي:

Public Class Form1

    Dim myvalue(5) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ReDim myvalue(0)

        myvalue(0) = 1

    End Sub

End Class

لقد عرفت مصفوفة من خمس اعمدة ان صح التعبير تم في الـ Form_load أستخدمت Redim لاعادة تعريفها بعمود واحد فقط ولو حاولت ان تضيف عليها فستحصل على رسالة خطاء.

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

اذا اردت ان تعرف ابعاد المصفوفة فيمكنك استخدام الامر الثالي:

 Public Class Form1

    Dim myvalue1(5) As Integer

    Dim myvalue2(5, 5, 6) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(myvalue1.Rank)

        MsgBox(myvalue2.Rank)

    End Sub

End Class

حيث بالرسالة الأولى ستحصل على الرقم 1 وبالرسالة الثانية ستحصل على الرقم ثلاثة

كما يمكنك تحديد القيمة المعطاة اي الرقم المحدد في تعريف المصفوفة انظر التالي:

 Public Class Form1

    Dim myvalue1(5) As Integer

    Dim myvalue2(5, 5, 6) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(UBound(myvalue1))

        MsgBox((myvalue2.GetUpperBound(2)))

    End Sub

End Class

ستحصل على الرقم 5 بالرسالة الاولى، وستحصل على الرقم 6 بالرسالة الثانية، ولاحظ اننا حددنا رقم الخانة المراد قراءة قيمتها وهي 2 أي انها 0-1-2 لانها تحتوي على ثلاث خانات.

كيف يمكن عرض ما بداخل المصفوفة...؟

كما استخدما Msgbox يمكنك استخدام أي اداة لنفرض Textbox أنظر الى الشكل التالي:

 Public Class Form1

    Dim myvalue1(5) As Integer

    Dim myvalue2(5, 5, 6) As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TextBox1.Text = myvalue1(3)

        TextBox2.Text = myvalue2(3, 2, 5)

    End Sub

End Class

او العكس يمكنك ان تضع بالمصفوفة قيم من الاداة Textbox او اي أداة أخرى لا فرق.

ايضا من الممكن استخدام مصفوفة ادوات انظر الشكل التالي:

Dim myvalue1(5) As Control

هذه مصفوفة من الممكن ان تحمل العديد من الـ Controls فيها مثل الازرار او ادوات النص او القوائم وغيرها، ولكن كيف يمكننا ان نستفيذ من ذلك....؟

أنشئ مشروعاً جديداً وضع عليه الاداة Panel وكذلك زر Button وكذلك ListBox فيكون الشكل كالتالي:

الان أنقر على الزر واكتب في الحدث هذا الكود:

Public Class Form1

    Dim myvalue1(5) As Button

    Dim myvalue2() As String = {"File", "Edit", "Tools", "Option", "Help"}

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        For value As Integer = 0 To 4

            Dim MControl As New Button

            MControl.Name = "Button" & value

            MControl.Text = myvalue2(value)

            myvalue1(value) = MControl

        Next

End Sub

End Class

كما تشاهد بقسم التصاريح العامة لدينا مصفوفتنان احدهما خاصة بالكنترول Button اي مصفوفة من ادوات الزر والثانية من نوع String أي نصية ولاحظ اننا اسندنا لها القيم مباشرة لحظة الاعلان.

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

عرفنا بداخل هذا التكرار متغير MControl على انه زر تم اعطيناه اسماً برمجياً ليمكننا التعامل معه بشكل عادي جداً ولاحظ اننا لن نحصل على اسم مكرر ابدا لان قيمة الـ Value سوف تكون بحالة تصاعد في القيمة والتي ربطناها الى العبارة النصية Button ولذلك سنحصل على الاسماء كالتالي:

Button0

Button1

Button2

Button3

Button4

وبالتأكيد توقفنا على الرقم أربعة لان تكرارنا يتوقف عن الدورة الرابعة او بعد اكتمال الدورة الرابعة.

ثانياً جاء دور اسناد نص للزر والا فأنه لن يكون له نص يدل عليه وهنا استخدمنا المصفوفة الثانية وهي تحمل قيم نصية، وحتى اضع بكل الازرار النصوص المختلفة بالصفوفة استخدمنا القيمة المتغيرة و الصاعدة من نوع Integer وهي Value فنحصل على الكلمات التالية بالتتالي:

"File", "Edit", "Tools", "Option", "Help"

والان جاء الدور المهم وهو وضع كل هذه الكنترول وبشكل ازرار في المصفوفة ويتم هذا من خلال السطر البرمجي التالي

myvalue1(value) = MControl

Mynalue1 هي المصفوفة واسندنا الى كل عنوان فيها زرا عن طريق المتغير والذي يمثل ذلك الزر وهو هنا MControl

اذا شغلت البرنامج ونقرت على الزر تكون قد حصلت على خمس ازرار بمصفوفتك.

ولكن ما الفائدة من كل هذا وكيف نستفيد بشكل عملي من ذلك....!

حسناً الان جاء دور استخراج هذه الازرار الى ارض الواقع ولذلك سنتسخدم الامر Each For للقيام بذلك كما بالشكل التالي:

Try

   For Each c As Button In myvalue1

                c.Dock = DockStyle.Top

                c.FlatStyle = FlatStyle.Flat

                c.FlatAppearance.BorderSize = 0

                c.TextAlign = ContentAlignment.BottomLeft

                c.FlatAppearance.MouseOverBackColor = Color.Blue

                Me.ListBox1.Items.Add(c.Text)

                Me.Panel1.Controls.Add(c)

   Next

Catch ex As Exception

End Try

هذا التكرار بالعبارة Each For والتي تحمل معها متغير عرفناه على انه كنترول من نوع زر وهو هنا بأسم C فنحن وكأننا نقول بهذه العبارة التالي:

لكل او من اجل كل الازرار الموجودة في المصفوفة Myvalue1

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

بعدها قمنا بالتعديل في بعض الخصائص لكل زر نصل له كالتالي:

1- محاذاته الى الاعلى بالنسبة الى الاداة الحاضنة او الحاملة له.

2- تغيير هيئته الى القيمة Flat فيكون شكله مفلطح

3-الغاء الاطار او جعل حجمه يساوي صفر

4- محاذاة النص الى جهة اليسار

5- تغيير لون خلفيتة الى اللون الازرق عند مرور الفأرة فوقه وهنا لم نستخدم حدث معين وانما استخدمنا خاصية جاهزة

وبعدها قمنا بملئ الاداة ListBox1 بأسم كل زر نصل اليه.

وبعدها نقوم باضافة الزر الى الاداة Panel1

وهذا كل شئ شغل البرنامج لتحصل على التالي:

هل ترى ذلك، تحصلنا على قائمة جميلة هنا.

وكذلك يمكنك رؤية الاسماء بالاداة ListBox1 الى جهة اليمين.

حسناً حتى الان لا يمكنك الاستفادة من هذه القائمة بشكل عملي لانك لاتملك احداثاُ لهذه الازرار تستجيب لك.

وهنا علينا ان نبرمج لها احداثاً ومع ان هذا ليس موضوعنا ولكن انظر بالشكل التالي:

Try

   For Each c As Button In myvalue1

                c.Dock = DockStyle.Top

                c.FlatStyle = FlatStyle.Flat

                c.FlatAppearance.BorderSize = 0

                c.TextAlign = ContentAlignment.BottomLeft

                c.FlatAppearance.MouseOverBackColor = Color.Blue

                AddHandler c.Click, AddressOf myButton_mov

                Me.ListBox1.Items.Add(c.Text)

                Me.Panel1.Controls.Add(c)

   Next

Catch ex As Exception

End Try

ان السطر المضلل هنا هو الذي اضفناه الان الى الكود السابق فالـ AddHandeler وكذلك Addressof تقومان باضافة حدث لكل زر نصل اليه.

فالاولى تحدد نوعية الحدث والثانية تمسك بالعنوان ،والعنوان من الممكن ان يكون اي اسم تريده انت وطبعا لابد من ان ننشئ اجراء بنفس الاسم ليتم الانتقال اليه لحظة النقر على الزر أنظر التالي:

Private Sub myButton_mov(ByVal sender As System.Object, ByVal e As System.EventArgs

       MsgBox(sender.ToString)

End Sub

لاحظ انك بحاجة الى جعل الاجراء يتوافق مع كل الوسائط المطلوبة او البارمترات المطلوبة لكل حدث كما بالشكل التالي.

ByVal sender As System.Object, ByVal e As System.EventArgs

فهذه البارمترات هنا المطلوبة لحدث النقر للزر.

والان عند النقر على اي زر سيتم اظهار ذلك برسالة تحدد نوعية الكنترول واسمه ونصه كما بالشكل التالي:

طبعاً يمكنك هنا التعامل مع كل زر على حدة من خلال أسمه او نصه ولك ما شئت كما بالمثال التالي:

If sender.name = "Button1" Then

            MsgBox(sender.ToString)

End If

هنا انا اختبر كل الكنترول التي تزور هذا المكان نتيجة نقرنا عليها ومن خلال اسمها افل شيئاً معيناً وهنا انا اظهر رسالة فقط بحالة كان زائرنا اسمه Button1

اما اذا اردت الفرز عن طريق النص فيمكنك بالشكل التالي:

If sender.text = "File" Then

            MsgBox(sender.ToString)

End If

الامر واضح انني اقتنص الزر الذي يحمل عنوان File .

ولكل الازرار انت تحتاج الى شئ كهذا.

If sender.text = "File" Then

            MsgBox(sender.text)

        ElseIf sender.text = "Edit" Then

            MsgBox(sender.text)

        ElseIf sender.text = "Tools" Then

            MsgBox(sender.text)

        ElseIf sender.text = "Option" Then

            MsgBox(sender.text)

        ElseIf sender.text = "Help" Then

            MsgBox(sender.text)

End If

حسناً موضوع خارج موضوعنا ماذا اذا اردت ان تقوم بالغاء احد هذه الازرار.

في حدث النقر للاداة ListBox1 اكتب التالي:

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

        myvalue1(Val(ListBox1.SelectedIndex)).Dispose()

End Sub

نحن هنا نعلم باننا نملك اسماء هذه الازرار في الاداة ListBox1 وهي مفهرسة فيها تماما بالارقام المفهرسة بها في المصفوفة اذا نحن لا نحتاج الا الى تدمير اي زر عن طريق العبار Dispose بمعلومية رقم فهرسه ونتحصل على ذلك من خلال الخاصية SelectedIndex جرب المثال هذا وسترى ان الازرار تختفي من القائمة كما تم تدميرها من مصفوفتنا ايضاً.


أول برنامج وأول خطوة

اذا كنت مبتدئاً ولم تتعامل مع الفيجوال أستوديو من قبل فهذا الدرس هو لك، حسناً دعنا ألان نبدا تنفيذ أول برنامج لك.

شغل الفيجوال نت تم أختر File وبعدها New Project

ومن النافذة الجديدة أختر Windows Application تم أنقر Ok

الان أنتقل الى النافذة الجانبية على اليسار بعنوان Toolbox وأنقر عليها ومنها أختر الاداة Button وكذاك Textbox

كما هو واضح من الصورة الاداتين المطلوبتين ، وسيكون شكل البرنامج كما بالشكل التالي:

الان أنقر على الزر مرتبن للانتقال الى الحدث Click الخاص به واكتب فيه التالي

TextBox1.Text = My.Computer.Info.OSFullName

ونحن بهذا نخبر البرنامج بان يقوم بوضع أسم واصدارة نظام التشغيل في الاداة Textbox

والان شغل البرنامج عن طريق النقر على السهم الصغير فوق وباللون الاخضر وهذه صورة له بشريط الازرار :

أو أنقر على المفتاح F5 من لوحة المفاتيح.

أذا صارت الامور على ما يرام فستحصل على النتيجة التالي:

عظيم الان قد صرت مبرمجاً.

ولا تعتقد انني ابالغ، انت الان برمجت شيئاً وصار هذا الملف التنفيذي برنامجاً، وعليه فأنت مبرمج.

ولكن المبرمجين يختلفون ففيهم المحترف والمبتدئ والهاوي.

وغير ذلك، المهم ان تصمم على اكمال الطريق نحو الاحتراف.

ولكن أين هو الملف التنفيذي...؟

أذا انتقلت الى المجلد الذي خزنت فيه مشروعك ستجد فيه مجلد بأسم Debug كما بالشكل التالي :

هناك سجد الملف التنفيذي كما بالشكل التالي :

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

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

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

فعندما تكمل عمل البرنامج، من القائمة Debug أختر الامر Rebuild كما بالشكل :

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

وأنما بالمجلد Release المجلد المجاور للمجلد Debug كما تلاحظ بهذه الصورة :

وأريد ان أشير أيضاً الى ان أي ملفات DLL تجدها هنا فهذا يعني ان البرنامج يحتاج أليها وعليك أرفاقها مع الملف التنفيذي.

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

مثلاً:

أذا استخدمت أحد ملفات OCX المبنية على الثقنية COM القديمة فالفجوال لن يستطيع التعامل معها مباشرة وسيقوم بانشاء ملفات DLL تعمل عمل الوسيط بين ملف OCX والبرنامج وستجد أنها تحمل نفس أسم الاداة مع أضافة العبارة التالية في بدايتها AxInterop.

وتقريباً ستكون ملفين أو ثلاث لكل أداة تستخدمها، هذه الملفات عليك بارفاقها مع الملف التنفيذي أنظر للشكل التالي:

حيث استخدم هنا مكتبة Microsoft Agent Objects وكذلك Microsoft Excel

والان أضف زراً جديداً واكتب فيه الامر التالي

End

شغل البرنامج وأنقر على الزر وعندها سوف يتم إغلاق البرنامج، فوظيفته هي إنهاء البرنامج.

والان أضف زراً جديدا.

تم من القائمة Project أختر Add new Item تم من النافذة حدد الخيار Windows Forms تم أنقر على الزر Add كما بالشكل :

لاحظ باسفل النافذة أمام العنون Name حيث يمكنك تغيير أسم النموذج الى ما تريد وأسمه هنا Form2 .

عندها سيتم أضافة نموذج جديد الى المشروع.

الان أنقل الى النموذج الاول ويمكنك ذلك من خلال التبويب العلوي حيث سيمكنك مشاهدة أسماء النماذج كما بالشكل التالي :

أنقر على الزر الجديد مرتين او نقرتين لتنتقل الى الزر Click الخاص به وأكتب فيه التالي :

Form2.Show()

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

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

فمثلاً عندما تكتب اسم الاداة TextBox1 والتي اضفناها وتكتب بعدها نقطة ستحصل على قائمة طويلة بكل الخصائص التي تتبع هذه الاداة كما بالشكل التالي :

وبالمثال الأول اخترنا الخاصية Text وهي تعني النص الذي سيظهر في الأداة كما بالشكل التالي:

TextBox1.Text =

ويجب إسناد القيم الى الخصائص عن طريق علامة = حيث يمكننا وضع أي نص نريد كما بالشكل التالي:

TextBox1.Text = "أكتب أي نص تريد هنا"

ولاحظ ان النص يجب ان يكتب بين علامتي تنصيص.

أي القيم النصية يجب ان تكتب بين علامتي تنصيص أما القيم الرقمية فلا حاجة الى ذلك.

طبعاً هناك العديد من الخصائص فمثلاً هناك الخاصية Forecolor والمسئولة عن تغيير لون النص كما بالشكل التالي:

TextBox1.ForeColor = Color.Azure

ولاحظ علامة = التي تتبعنا بكل عملية اسناد للقيم.

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

طبعاً لمعرفة المزيد حول الخصائص عليك بمراجعة الدروس الخاصة بالخصائص.

ولكن أريد ان أريك بعض الإيقونات التي يستخدمها الفيجوال لترمز الى الأشياء.

وهي من الأمور المهمة والتي يجب ان تحفظها أنظر للجدول التالي :

الرمز | معناه | نوعه
 | فئة او كلاسس Class | Class
 | تركيب | Enum
 | مجال أسماء او فضاء | Name Space
 | أجراء او دالة | Function & Sub
 | خاصية | Property
 | حدث | Event
 | حقل | Feild
 | تركيب من نوع Structure | Structure
 | تابث | Conset

طبعاً هذا يساعدك على فهم ما الذي تتعامل معه بمجرد النظر لإيقونته، أنظر للشكل التالي :

على سبيل المثال فقط هذا الشكل يحتوي على خصائص وإجراءات.

السطر البرمجي في الفيجوال بيسك ينتهي بنهاية السطر كما بالشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     MsgBox(My.Computer.Info.OSFullName)

End Sub

كما يمكنك استخدام (:) لوضع اسطر برمجية متعددة في سطر واحد وتعتبر هذه العلامة بداية لسطر برمجي جديد أنظر للشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

               MsgBox(My.Computer.Info.OSFullName) : Me.Text = My.Computer.Info.OSFullName

End Sub

كما يمكن إخبار المترجم ان مجموعة من الأسطر ما هي الا سطر برمجي واحد بواسطة العلامة ( _ ) كما بالشكل التالي :

Private Sub Form1_Load(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

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

تصور معي انك تبرمج مشروعاً به العديد من النوافذ.

وهذه النوافذ متغيرة الأحجام، بل وبعضها تزدحم عليه الأدوات بشكل كبير.

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

او القيام بوضع العديد من الأدوات جنباً الى جنب بشكل مربك ومشوش.

ما الحل أذاً.

حسناً أنشئ مشروعاً جديداً كما بالسابق تم من القائمة Project أختر Add new Item تم من النافذة حدد الخيار User Control تم أنقر الزر Add كما بالشكل :

لاحظ ان الاداة المطلوبة تظهر بالاسفل الى ناحية اليسار.

الان يمكنك رؤية هذه الاداة، لا تجعلها ترهبك أنها أداة Form عادية ولكنها من غير شريط العناوين وازرار التحكم المألوفة.

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

أسحبها من احد المقابط السفلية حتى تحصل على عشرة أضعاف حجمها الاول، أو من نافذة الخصائص الى يمينك حدد الخاصية Height وغيرها كما بالشكل :

وبعدها أضف أليها بعض الازرار والادوات وما تريد.

والان أنتقل الى النموذج الخاص بنا وضع عليه الاداة Panel وأجعلها تملاء مكاناً كبيراً من النموذج وأجعل الخاصية AutoScroll بتساوي True تم أضف زراً واكتب في الحدث Click الخاص به التالي:

Dim k As New UserControl1

Me.Panel1.Controls.Add(k)

والان شغل البرنامج وانقر على الزر.

هل رأيت ذلك ....؟

هذا ما أتحدث عنه، يمكنك الان أضافة حتى 100 أداة User Control وأستعراضها كلها في نموذج واحد بدل أرباك المستخدم بالعديد من هذه النماذج.

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

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

وطبعاً يمكنك التنسيق وترتيب المشروع حتى يكون بشكل ومظهر جذاب ومناسب.

على سبيل المثال يمكنك استخدام صورة كخلفية الى النموذج، وبدل الازرار تستخدم الاداة LinkLabel أنظر الشكل التالي:

هل ترى هذا...؟

أنها مجرد صورة وضعتها كخلفية للنموذج عن طريق الخاصية Background Image وبالمساحة التي الى اليمين وضعت الاداة Panel وطبعا أجعل الخاصية Back Color لها كخلفية شفافة حتى تظهر ما وراءها من الصورة ومن الالوان Web أختر أول لون وهو Transparent وهو اللون الشفاف كما بالشكل التالي :

وبالمساحة التي على اليسار وضعت الأدوات Link Label والتي تقوم بجلب الأدوات User control المطلوب وقت الحاجة.

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

طبعاً هذه الفكرة عن كيفية تنسيق النموذج والحصول على المظهر الاحترافي والعمل الاحترافي.

واذا أردت ان تلغي الأداة User Control من الأداة Panel فعندها عليك باستخدام الأمر التالي:

Me.Panel1.Controls.Item(0).Dispose()

عن طريق الخاصية Controls والخاصية الفرعية Item والتي حددناها بصفر وهي تشير الى الأداة User Control الموجودة في الأداة Panel قمنا بإنهاء هذه الأداة بواسطة Dispose

طبعاً حديثنا عن هذه الطريقة سيكون متقدماً بعض الشئ الان، ولكن لا استطيع الا ان اشرح لك قليلاً.

ان الأداة User Control عندما أضفناها الى الأداة Panel تم فهرستها بالرقم صفر ولو حدث وأضفت واحدة أخرى بدون ان تلغي الأولى فسوف يتم فهرستها بالرقم 1 وهكذا.

وتفيدك هذه الطريقة في إضافة أداتي User Control الى الـ Panel وإظهار واحدة امام الأخرى أي التبديل بينهم، عن طريق إخفاءها او عن طريق الخاصية Send To Back

كما يمكنك استخدام الخاصية Clear كما بالشكل التالي:

Me.Panel1.Controls.Clear()

وهذا الأمر سيقوم بمسح كل شئ فيها، ولكنه لن يقوم بمسح الأداة User Control من الذاكرة

لذلك لا تستخدمه الا في حال عرفت لماذا تستخدمه.

والان أرجوا ان تكون قد فهمت المغزى من المثال الأخير.

أجل، تعلم البرمجة ليست احتراف الشفرات فقط.

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

فحاول ان تجعل هذين الشقين يتطوران معك جنباً الى جنب وبخط متوازي.

قد تصنع برنامجاً يؤدي مهام ما على أحسن ما يرام، ولكنه ليس برنامجاً يشد المستخدم ويتحدث عنه الى الآخرين وتحصل دعاية كبيرة الى مبرمجه.

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

أما بالحديث كثيراً عن الشفرات وبدون رؤية ما يمكنهم عمله من نوافذ ومشاريع جميلة ورائعة من شأنه ان يحبط من عزيمتهم وينفرهم من الشرح.

ومع أنني أتحدث ان هذا الشرح للمبتدئين الا أنه خطوات كبيرة واحترافية في جانب التصميم، وعليك ان تعي ذلك جيداً.

سأعطي مثالاً أكثر وضوحاً أنظر للشكل التالي :

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

والى ناحية اليمين وضعت بعض من أدوات LinkLabel كما تشاهد والان يجب ان نظيف أداة Panel ونجعل خلفيتها شفافة أنظر للشكل التالي:

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

وكما تعلمت سابقاً نفذ ذلك تم أنشئ اداة User Control جديدة وضع عليها بعض الأدوات كما بالشكل التالي :

مثلاً لنفرض اننا بحاجة الى أشياء مثل هذه.

تم في الحدث الخاص بالأداة Linklabel والتي عنوانها إضافة سجل جديد أكتب التالي :

  Dim k As New UserControl1

  Me.Panel1.Controls.Add(k)

وهذه ستكون النتيجة :

كما تشاهد تم عرض الأداة في الـ Panel ويمكنك عرض كل الأدوات الأخرى بنفس الطريقة.

هناك دروس خاصة عن الأداة UserControl ودروس عن الأحداث والخصائص .

اذا أردت ان تطبق هذا الدرس فيجب ان تقرءا هذه الدروس الثلاثة.

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


بعض الاوامر الشائعة الاستخدام Co

Com Class

يمكنك ان تنشئ مكتبات بالفجوال نت تستخدمها مع الفجوال بيسك 6 او دلفي او ماشابه.

انشئ مشروعاً من نوع Class Library تم من القائمة Project أختر Add Items تم أختر Com Class فتحصل على الشكل التالي:

الان يمكنك كتابة ماتشاء من الاجراءات والدوال التي تريدها .

وهذا مثال عن اجراءات استخدمتها انا كتجربة فقط أنظر الشكل التالي :

Imports System.Windows.Forms

Imports Microsoft.VisualBasic

Imports System.Drawing

Imports System.IO

<ComClass(HelpTools.ClassId, HelpTools.InterfaceId, HelpTools.EventsId)> _

Public Class HelpTools

    Public Enum ASD

        qqq

        eee

        rrr

        uuu

    End Enum

    Dim k As New NotifyIcon

#Region "COM GUIDs"

    ' These  GUIDs provide the COM identity for this class

    ' and its COM interfaces. If you change them, existing

    ' clients will no longer be able to access the class.

    Public Const ClassId As String = "aed98b94-a45a-4134-9a39-a8949dc34983"

    Public Const InterfaceId As String = "40cd1d3d-c49d-47db-8648-af9b48587356"

    Public Const EventsId As String = "2c96610a-2809-4b47-8d11-fa9db56af026"

#End Region

    Public Sub New()

        MyBase.New()

    End Sub

    Public Sub PlaySound(ByVal FullPath As String)

        My.Computer.Audio.Play(FullPath)

    End Sub

    Public Sub ShowForm(ByVal ert As ASD)

    End Sub

    Public Sub ShowForm()

        Dim k As New Form1

        k.ShowDialog()

    End Sub

    Public Function readFile(ByVal FullPath As String)

        Dim fileContents As String

        fileContents = My.Computer.FileSystem.ReadAllText(FullPath)

        readFile = fileContents

    End Function

    Public Sub ShowMsg(ByVal Title As String, ByVal Message As String, ByVal Micon As String)

        Dim o As New Drawing.Icon(Micon)

        k.Icon = o

        k.Visible = True

        k.ShowBalloonTip(100, Title, Message, ToolTipIcon.Info)

    End Sub

    Public Function Opendialog()

        Dim k As New OpenFileDialog

        k.ShowDialog()

        Opendialog = k.FileName

    End Function

    Public Function Savedialog()

        Dim k As New SaveFileDialog

        k.ShowDialog()

        Savedialog = k.FileName

    End Function

    Public Function Fontdialog()

        Dim k As New FontDialog

        k.ShowDialog()

        Fontdialog = k.Font

    End Function

    Public Function loadImage(ByVal FullPath As String)

    End Function

    Public Function GetProgramFilessDir()

        GetProgramFilessDir = My.Computer.FileSystem.SpecialDirectories.ProgramFiles

    End Function

    Public Function GetMyDocumentsDir()

        GetMyDocumentsDir = My.Computer.FileSystem.SpecialDirectories.MyDocuments

    End Function

    Public Function GetMyPicturesDir()

        GetMyPicturesDir = My.Computer.FileSystem.SpecialDirectories.MyPictures

    End Function

    Public Function GetProgramsDir()

        GetProgramsDir = My.Computer.FileSystem.SpecialDirectories.Programs

    End Function

    Public Function GetcolorDialog() As Color

        Dim k As New ColorDialog

        k.ShowDialog()

        GetcolorDialog = k.Color

    End Function

    Public Sub GetprintDialog()

        Dim k As New PrintDialog

        k.ShowDialog()

    End Sub

    Public Sub GetPageSetupDialog()

        Dim k As New PageSetupDialog

        k.ShowDialog()

    End Sub

    Public Function GetFolderBrowserDialog()

        Dim k As New FolderBrowserDialog

        k.ShowDialog()

        GetFolderBrowserDialog = k.SelectedPath

    End Function

    Public Function GetClipboardText() As String

        GetClipboardText = My.Computer.Clipboard.GetText()

    End Function

    Public Function GetClipboardImage() As Image

        GetClipboardImage = My.Computer.Clipboard.GetImage

    End Function

    Public Function LookContainsText()

        LookContainsText = My.Computer.Clipboard.ContainsText

    End Function

    Public Function LookContainsImage()

        LookContainsImage = My.Computer.Clipboard.ContainsImage

    End Function

    Public Function NetworkIsAvailable()

        NetworkIsAvailable = My.Computer.Network.IsAvailable

    End Function

    Public Sub InternetUploadFile(ByVal SourcFileName As String, ByVal UrlAddress As String)

        My.Computer.Network.UploadFile(SourcFileName, UrlAddress)

    End Sub

    Public Sub InternetDownloadFile(ByVal urlAddress As String, ByVal FileName As String)

        My.Computer.Network.DownloadFile(urlAddress, FileName)

    End Sub

    Public Function ScreenWorkingArea()

        ScreenWorkingArea = My.Computer.Screen.WorkingArea.Width & "-" & My.Computer.Screen.WorkingArea.Height

    End Function

    Public Function ClockTickCount()

        ClockTickCount = My.Computer.Clock.TickCount

    End Function

    Public Function ClockGmtTime() As Date

        ClockGmtTime = My.Computer.Clock.GmtTime

    End Function

    Public Function FileExists(ByVal FullPath As String)

        FileExists = My.Computer.FileSystem.FileExists(FullPath)

    End Function

    Public Function DirectoryExists(ByVal FullPath As String)

        DirectoryExists = My.Computer.FileSystem.DirectoryExists(FullPath)

    End Function

    Public Function ReadAllBytes(ByVal FullPath As String)

        ReadAllBytes = My.Computer.FileSystem.ReadAllBytes(FullPath)

    End Function

    Public Sub RenameFile(ByVal FullPath As String, ByVal NewName As String)

        My.Computer.FileSystem.RenameFile(FullPath, NewName)

    End Sub

    Public Sub MoveFile(ByVal SourceFileName As String, ByVal DestinationFilName As String)

        My.Computer.FileSystem.MoveFile(SourceFileName, DestinationFilName)

    End Sub

    Public Sub MoveDirectory(ByVal SourceDirName As String, ByVal DestinationDirName As String)

        My.Computer.FileSystem.MoveDirectory(SourceDirName, DestinationDirName)

    End Sub

    Public Sub DeleteFile(ByVal FullPath As String)

        My.Computer.FileSystem.DeleteFile(FullPath)

    End Sub

    Public Sub DeleteDirectory(ByVal FullPath As String)

        My.Computer.FileSystem.DeleteDirectory(FullPath, FileIO.DeleteDirectoryOption.DeleteAllContents)

    End Sub

    Public Sub CreateDirectory(ByVal FullPath As String)

        My.Computer.FileSystem.CreateDirectory(FullPath)

    End Sub

    Public Sub CopyFile(ByVal SourceFileName As String, ByVal DestinationFilName As String)

        My.Computer.FileSystem.CopyFile(SourceFileName, DestinationFilName)

    End Sub

End Class

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

كما يمكن اضافة الكثير ايضاً غير هذا.

طبعاً بعد ان تكتب هذا او تنسخه وتقوم بلصقه من القائمة Build عليك باختيار الخيار Rebuild ليتم إنشاء المكتبة.

والتي ستجدها بالمجلد Release .

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

أنشئ مشروعاً جديداً في الفجال بيسك 6 تم من القائمة Project أختر الامر Reference لتحصل على النافذة التالية :

الان من الزر Browse... ستحصل على نافذة فتح الملف كما بالشكل التالي:

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

طبعاً الاسم هنا حسب تعريفك انت لاسم المشروع .

لاحظ انك لن تستطيع التعامل مع ملف Dll وستجد بجانبه ملفاً أخر حدده وانقر الزر Open

وانتهى كل شئ.

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

  Dim k As New VbStudio2005.HelpTools

فمثلاً كان عندي أجراء يقوم بتشغيل ملف صوتي.

من الفجوال بيسك 6 يمكننا مناداته كما بالشكل التالي :

Private Sub Command1_Click()

        k.PlaySound("c:\note.wav")

End Sub

الامر بسيط جداً .

هل تعلم ما كان يجب عليك فعله لتشغل ملف صوتي في الفجوال بيسك 6 من النوع او ذا الاحقة WAV أنظر للشكل التالي :

Private Const SND_APPLICATION = &H80         '  look for application specific association

    Private Const SND_ALIAS = &H10000     '  name is a WIN.INI [sounds] entry

    Private Const SND_ALIAS_ID = &H110000    '  name is a WIN.INI [sounds] entry identifier

    Private Const SND_ASYNC = &H1         '  play asynchronously

    Private Const SND_FILENAME = &H20000     '  name is a file name

    Private Const SND_LOOP = &H8         '  loop the sound until next sndPlaySound

    Private Const SND_MEMORY = &H4         '  lpszSoundName points to a memory file

    Private Const SND_NODEFAULT = &H2         '  silence not default, if sound not found

    Private Const SND_NOSTOP = &H10        '  don't stop any currently playing sound

    Private Const SND_NOWAIT = &H2000      '  don't wait if the driver is busy

    Private Const SND_PURGE = &H40               '  purge non-static events for task

    Private Const SND_RESOURCE = &H40004     '  name is a resource name or atom

    Private Const SND_SYNC = &H0         '  play synchronously (default)

    Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long

    Public Sub PlayWaveSound(ByVal Path As String)

    PlaySound Path, ByVal 0&, SND_FILENAME Or SND_ASYNC

    End Sub

كان لابد من استخدام دوال الـ API او احدى الكنترول الخاصة بذلك.

على العموم من الممكن ان توفر عنك مكتبات تعتمد على الفرامورك الكثير من الجهد والوقت.


بعض الاوامر الشائعة الاستخدام Co

الأمر | AddHandler
وظيفته | يمكنك من القيام باضافة ما يسمى مقبض او حدث الى أداة ما بواسطة الكود
المثال على كيفية الاستخدام |

Dim NewPanelButton As New Button()

  Me.Controls.Add(NewPanelButton)

  NewPanelButton.Text = "new button"

  NewPanelButton.Name = "button1"

  NewPanelButton.Top = 12

  AddHandler NewPanelButton.MouseMove, AddressOf myButton_mov

  AddHandler NewPanelButton.MouseDown, AddressOf myButton_dn

لاحظ بهذا المثال أنشاءنا زر جديد عن طريق المفتاح New تم قمنا باضافته الى النموذج عن طريق الخاصية Controls تم النص الذي سيظهر واعطيناه أسماً، وبعدها حدننا موقعه العلوي.

وأخيرا أضفنا له حدثين بواسطة Add Handler وبعد هذه العبارة مباشرة كتبنا أسم الزر متبوعاً بالحدث المطلوب، تم عن طريق Address of حددنا الاجراء الذي سيتم تنفيذه.

وهذا هو الاجراء myButton_dn هنا يمكنك كتابة أي شئ فيه.

 Private Sub myButton_dn(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

 End Sub

وهذا هو الاجراء myButton_mov هنا.

Private Sub myButton_mov(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

End Sub

كما يمكنك بأي وقت حذف اي حدث بالشكل التالي:

RemoveHandler NewPanelButton.MouseDown, AddressOf myButton_dn


بعض الاوامر الشائعة الاستخدام Co

الأمر | Do
وظيفته | القيام بتكرار أمر او مجموعة من الأوامر لعدة مرات
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer

        Do

            value1 += 1

            MsgBox(value1)

        Loop Until value1 = 3

    End Sub

End Class

Until بمعنى حتى، أي حتى Value1=3 الامر واضح، أرجوا ذلك.

ويمكن ان تكون هكذا:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer

        Do Until value1 = 3

            MsgBox(value1)

            value1 += 1

Loop

    End Sub

End Class

كما يمكنك استخدام العبارة While كما بالشكل:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value1 As Integer

        Do While value1 < 3

            MsgBox(value1)

            value1 += 1

Loop

    End Sub

End Class

اليك مثال اخر مع عبارة While وتعني حالما انظر التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer

        Do

            value1 += 1

            MsgBox(value1)

        Loop Until value1 = 3

    End Sub

End Class

ويمكن عمل مثال متداخل:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1, value2 As Integer

       Do Until value1 = 2

            Do Until value2 = 5

                MsgBox(value2)

                value2 += 1

Loop

            value1 += 1

Loop

    End Sub

End Class


بعض الاوامر الشائعة الاستخدام Co

الأمر | On Error Resume Next
وظيفته | أمر لمعالجة الاخطاء وذلك بتجاهلها
المثال على كيفية الاستخدام |

ان تجاهل الاخطاء امر غير محبذ الا اذا كنت مظطرا الى ذلك، وعلى العموم يفيذ هذا الامر في بعض الحالات .

وطريقة الاستخدام كالتالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error Resume Next

        My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

    End Sub

End Class

سيتم تجاهل الخطاء الحاصل هنا والاستمرار في العملية وكأن شيئاً لم يحصل.

الأمر | On Error Goto
وظيفته | أمر لمعالجة الاخطاء وذلك بالانتقال الى مكان محدد
المثال على كيفية الاستخدام |

هذه احدى الطرق القديمة مثل Resume Next انظر التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error GoTo myerror

        My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

        Exit Sub

myerror:

        If Err.Number = 53 Then MsgBox("الملف غير موجود")

    End Sub

End Class

لاحظ عبارة Goto ولاحظ العبارة التي بعدها Myerror يمكنك كتابة اي شئ مكانها، ولاحظ اننا اعدنا كتابتها وبعدها : تم قمنا بقنص الخطاء كما بالمرة السابقة.

لاحظ وجود الامر Exit sub لابد من الخروج من الاجراء وعدم المرور على Myerror بعد تنفيذ المطلوب.

على اي حال أستخدم الامر Try فهو أكثر عملية.

الأمر | Try End Try
وظيفته | قنص الأخطاء
المثال على كيفية الاستخدام |

بحال اردت ان تقوم بعمل كود برمجي وتخشى الوقوع في اخطاء لم تحسب لها حساباً يمكنك استخدام Try أنظر الشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            My.Computer.FileSystem.WriteAllText("C:\Test.txt", "Text", True)

        Catch ex As Exception

        End Try

    End Sub

End Class

أنني احاول هنا نسخ ملف :

انظر الشكل التالي:

المساحة الحمراء هي المكان المخصص لكتابة الكود، والمساحة الخظراء هي المكان المخصص لاقتناص الاخطاء.

ولكن تصور لو ان الملف غير موجود، سيحدث خطاء وعندها علينا أقتناص الخطاء كالتالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

    End Sub

End Class

وستظهر الرسالة التالية:

الملف غير موجود بالطبع.

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

ولتكتبها بنفسك عليك ان تعرف رقم الخطاء.

ولمعرفة رقم الخطاء أكتب التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

        Catch ex As Exception

            MsgBox(Err.Number)

        End Try

    End Sub

End Class

وستحصل على الرسالة التالية

حسناً هذه يعني بانه وفي حال كان الملف غير موجود فسيكون رقم الخطاء 53 ولذلك علينا كتابة التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

        Catch ex As Exception

            If Err.Number = 53 Then MsgBox("الملف غير موجود")

        End Try

    End Sub

End Class

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

أضافة Finally أنظر الشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

            My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

        Catch ex As Exception

            If Err.Number = 53 Then MsgBox("الملف غير موجود ")

        Finally

            MsgBox("سيتم تنفيد كل الاوامر الموجودة هنا دائماً")

        End Try

    End Sub

End Class

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

حسناً كان الشرح السابق بسيط نوعاً ما.

ولاحظ اننا هنا نستخدم خلية الاسثناء العامة وهي Exception وهذا يعني اننا نستطيع تغيير نوعية هذه الخلية لاحظ المثال التالي:

 Try

    con.Open()

 Catch ex As OleDbException

      MsgBox(ex.Message)

 End Try

استخدمنا هنا كائن الاسثتناءات OleDbException والذي يقتنص الاخطاء التي تحدث مع عمليات الاتصال.

طبعاً يمكن كذلك استخدام الكثير من كائنات الاستثناء المختلفة بنفس الوقت كما بالشكل:

Imports System.Data.OleDb

Imports System.IO

Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try

        Catch ex As Exception

        Catch ex As OleDbException

        Catch ex As IOException

        End Try

    End Sub

End Class

كما ان من خصائص خلية الاسثناء كما بالشكل:

الخاصية | مهمتها
Message | النص الذي يبين سبب الاسثناء وما الذي أدى الى حدوثه
Source | تعطي أسم التطبيق او الكائن الذي احدث الاسثتناء
HelpLink | للحصول او تحديد ملف التعليمات الخاص بهذا الاسثتناء
TargetSite | معرفة اسم الدالة التي تسببت في الاستثناء


بعض الاوامر الشائعة الاستخدام Co

الأمر | For
وظيفته | القيام بتكرار أمر او مجموعة من الأوامر لعدة مرات
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As Integer

        For value = 1 To 3

            MsgBox(value)

        Next

    End Sub

End Class

أخبرنا العبارة For انها يجب ان تقوم بثلاث دورات وفي كل دورة تعرض رسالة برقم هذه الدورة المجمودة في المتغير Value الامر واضح.

يمكننا استخدام العبارة Step وذلك لكي نتجاهل بعض الفقرات أنظر التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As Integer

        For value = 1 To 6 Step 2

            MsgBox(value)

        Next

    End Sub

End Class

جرب المثال وغير في كل مرة في الرقم الذي بعد العبارة Step

يمكنك الخروج من هذه الدائرة بالعبارة Exit for أنظر الى المثال التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As Integer

        For value = 1 To 10

            If value = 5 Then Exit For

            MsgBox(value)

        Next

    End Sub

End Class

بهذا المثال البسيط نطلب من For القيام بعشر دورات ولكن اذا كانت قيمة Value=5 عندها أنهي الدورة.

ماذا اذا أردنا القيام بعمل دورات متداخلة انظر التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1, value2 As Integer

        For value1 = 1 To 10

            For value2 = 1 To 5

                MsgBox(value2)

            Next

        Next

    End Sub

End Class

اذا كنت قد صنعت العديد من الدوائر المتداخلة واردت معرفة عبارة For لمن تعود يمكنك استخدام التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1, value2 As Integer

        For value1 = 1 To 10

            For value2 = 1 To 5

                MsgBox(value2)

            Next value2

        Next value1

    End Sub

End Class

سيتم هنا القيام بأول دورة For value1 وعند المرور على For value2 لايتم الخروج منها الى حين أنتهائها وهكذا أي ستحصل على رسائل بعدد 5 ضرب عشرة.


بعض الاوامر الشائعة الاستخدام Co

الأمر | For Each and TypeOf is
وظيفته | القيام بتكرار مشروط والتحقق من الفئات
المثال على كيفية الاستخدام |

ليكن هذا مثالنا كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        For Each MControl As Control In Me.Controls

            If TypeOf MControl  Is TextBox Then MControl.Text = ""

        Next

    End Sub

End Class

بهذا المثال تقوم For Each بعمل حصر لكل الأدوات (Controls) الموجودة في النموذج الحالي والذي نشير له بعبارة Me

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

وبذلك فالمتغير سوف يشير في كل دورة الى كنترول مختلف، ولأجل ذلك جاء الدور لاستخدام العبارة Typeof is والتي تقوم بالتحقق من الكنترول.

وهنا أردنا في عملية التحقق هذه ان يتم التحقق من كل الكنترول وتنفيذ جملة الشرط بحال كان الكنترول هو TextBox وبحال كان كذلك يتم تنفيذ الامر

MControl.Text = ""

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

من الممكن استخدامها بطريقة أخرى كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        For Each Value As String In Me.Text

            MsgBox(Value)

        Next

    End Sub

End Class

إجراء تكرار يعتمد على عدد الحروف الموجودة بالنموذج، وبحالنا هذه وبما ان النموذج عنوانه Form1 فسوف تحصل على حرف كل دورة.

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

Imports System.Data

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim MDataSet As New DataSet

        For Each Row As DataRow In MDataSet.Tables(0).Rows

        Next

    End Sub

End Class

وهنا نستعلم عن كل الصفوف الموجودة بالداتاسيت (Dataset) على سبيل المثال.

كما هنا نستعلم عن كل العناصر بأداة CheckedListBox التي تم تحديدها لاحظ التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Col As System.Globalization.CultureInfo

        For Each Col In My.Application.UICulture.GetCultures(Globalization.CultureTypes.AllCultures)

            CheckedListBox1.Items.Add(Col.EnglishName)

        Next

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim itemChecked As Object

        For Each itemChecked In CheckedListBox1.CheckedItems

            ListBox1.Items.Add(itemChecked.ToString)

        Next

    End Sub

End Class

أضف أداة CheckedListBox

وكذلك أداة ListBox وأداة Button وشغل البرنامج وهاهي النتيجة:

لاحظ الأمر For Each وكيف استخدمناه هنا.

وتجدر الإشارة ان For Each أسرع في سرعة التنفيذ من الأوامر الأخرى مثل For Next وما شابه.


بعض الاوامر الشائعة الاستخدام Co

الأمر | IF End IF
وظيفته | القيام بتفرع مشروط في البرنامج
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As Integer = 3

        If value = 3 Then value = 0

    End Sub

End Class

اعطينا المتغير Value القيمة 3 تم قمنا بوضع جملة شرطية If تعني اذا ، أي اذا Value=3 عندها.

Then تعني أذاً ، أي أذاً Value=0

ولاحظ انك لست بحاجة الى كتابة العبارة End if اذا كانت باقي سطور البرمجة على نفس الخط.

حقيقة هذه السطور البرمجية غير منطقية، وعديمة الفائدة ولكنها لإعطاء فكرة وحسب.

نريد مثالاً أكثر واقعية وعملي، حسناً سنستخدم الرسائل لقنص قيمة ما أنظر التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As MsgBoxResult = MsgBox("هل توافق على إنهاء البرنامج", MsgBoxStyle.YesNo, "إنهاء البرنامج")

        If value = MsgBoxResult.Yes Then

            MsgBox("لقد اخترت نعم")

        End If

        If value = MsgBoxResult.No Then

            MsgBox("لقد اخترت لا")

        End If

    End Sub

End Class

ويمكنك ان تكتبها بهذا الشكل:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As MsgBoxResult = MsgBox("هل توافق على إنهاء البرنامج", MsgBoxStyle.YesNo, "إنهاء البرنامج")

        If value = MsgBoxResult.Yes Then

            MsgBox("لقد اخترت نعم")

        ElseIf value = MsgBoxResult.No Then

            MsgBox("لقد اخترت لا")

        End If

    End Sub

End Class

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

ماذا اذا كان هناك احتمال ان تكون القيمة غير معالجة أي ليست نعم أو لا على سبيل المثال، عنها ياتي دور العبارة Else كما بالشكل:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As MsgBoxResult = MsgBox("هل توافق على أنهاء البرنامج", MsgBoxStyle.YesNoCancel, "انهاء البرنامج")

        If value = MsgBoxResult.Yes Then

            MsgBox("لقد اخترت نعم")

        ElseIf value = MsgBoxResult.No Then

            MsgBox("لقد اخترت لا")

        Else

            MsgBox("ليس بنعم ولاهي بلا")

        End If

    End Sub

End Class

غيرنا نوعية الرسالة بحيث تعيد لنا ثلاث احتمالات، نعم،لا،إلغاء، بحال كانت القيمة العائدة نعم او لا قمنا بمعالجتها اما اذا كانت غير ذلك تم تنفيذ ما بعد Else

لاحظ ان هذا ما سيتم تنفيذه بكل الاحوال اذا لم تكن القيمة نعم ام لا.

إضافة العبارة العديد من الشروط راقب المثال التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer = 3

        Dim value2 As Integer = 3

        Dim value3 As Integer

        If value1 >= 2 And value2 * 3 = 8 Then value3 = 6

    End Sub

End Class


بعض الاوامر الشائعة الاستخدام Co

الأمر | Like
وظيفته | مقارنة نص بنمط ما
المثال على كيفية الاستخدام |

اولاً المعاملات المستخدمة:

الرمز | الوصف
؟ | أي حرف
* | من صفر اي لاشئ او اكثر
! | للنفي
# | أي رقم ( 0- 9)

والان لنأخذ مثال على ذلك ، انشئ مشروعاً جديدا وضع عليه زراً واكتب فيه التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim testCheck As Boolean

        ' تعود بقيمة ايجابية فالجانبين متساويين

        testCheck = "F" Like "F"

        MsgBox(testCheck)

        ' تعود بقيمة سالبة

        testCheck = "F" Like "f"

        MsgBox(testCheck)

        ' تعود بقيمة سالبة

        testCheck = "F" Like "FFF"

        MsgBox(testCheck)

        ' تعود يقيمة ايجابية

        testCheck = "aBBBa" Like "a*a"

        MsgBox(testCheck)

        ' تعود بقيمة ايجابية فالحرف موجود بين سلسلة الحروف

        testCheck = "F" Like "[A-Z]"

        MsgBox(testCheck)

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

        testCheck = "F" Like "[!A-Z]"

        MsgBox(testCheck)

        ' تعود بقيمة ايجابية فالمعامل # يمثل أي رقم

        testCheck = "a2a" Like "a#a"

        MsgBox(testCheck)

        ' تعود بقيمة ايجابية

        testCheck = "aM5b" Like "a[L-P]#[!c-e]"

        MsgBox(testCheck)

        ' تعود بقيمة ايجابية

        testCheck = "BAT123khg" Like "B?T*"

        MsgBox(testCheck)

        ' تعود بقيمة سالبة

        testCheck = "CAT123khg" Like "B?T*"

        MsgBox(testCheck)

    End Sub

End Class


بعض الاوامر الشائعة الاستخدام Co

الأمر | Me
وظيفته | تشير الى الـ Class التي انت بداخلها
المثال على كيفية الاستخدام |

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

ويمكنك فعل ذلك من خارج الـ Class من Form2 مثلاً.

وكلمة Me في الانجليزية تعني أنا، اي عندما تقولها تشير الى نفسك، وعندما تكتب Me بداخل الـ Form1 فانت تشير الى Form1

أنظر المثال التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Text = "Test"

        Me.Visible = True

        Me.Anchor = AnchorStyles.Left

        Me.BackColor = Color.Beige

    End Sub

End Class

واذا حاولت ذلك عن طريق اسم النموذج ستحصل على الخطاء التالي:

يقول لك انه لا يستطيع الاشارة الى نفسه وعليك باستخدام العبارة Me


بعض الاوامر الشائعة الاستخدام Co

الأمر | Megbox
وظيفته | أظهار رسالة الى المستخدم
المثال على كيفية الاستخدام |

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox("محتوى الرسالة", MsgBoxStyle.OkOnly, "العنوان")

    End Sub

End Class

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

تم Style وهو هل تريد اظهار رسالة معلومات ، ام رسالة تحذيرية، أم رسالة سؤال بها زري نعم ولا وغيرها الكثير

وهذه هي الخيارات التي ستظهر انظر الشكل التالي:

سنأخد مثالا عن أستخدام زر فيه نعم، ولا أنظر الى الكود التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As MsgBoxResult = MsgBox("هل ترغب في إغلاق البرنامج", MsgBoxStyle.YesNo, "إغلاق البرنامج")

        If value = MsgBoxResult.Yes Then

            MsgBox("اخترت نعم")

        Else

            MsgBox("اخترت لا")

        End If

    End Sub

End Class

عرفنا متغير Value على انه MsgBoxResult وهو تركيب من نوع enum وهذه خياراته:

وذلك حتى يتم وضع القيمة المختارة فيه لتقوم بمقارنتها ونعلم ما الزر الذي تم الضغط عليه ومعالجة ذلك.

يمكنك تجربة باقي الخيارات.


بعض الاوامر الشائعة الاستخدام Co

الأمر | MouseButtons
وظيفته | لمعرفة ما هو زر الفأرة الذي تم النقر عليه
المثال على كيفية الاستخدام |

طبعاً يمكن عمل ذلك من داخل اي حدث نقر للفأرة سوى كان للنموذج ام لاي أداة أخرى لاحظ التالي:

Public Class Form1

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

        If e.Button = Windows.Forms.MouseButtons.Left Then

        ElseIf e.Button = Windows.Forms.MouseButtons.Middle Then

        ElseIf e.Button = Windows.Forms.MouseButtons.Right Then

        End If

    End Sub

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

وبالحالة الثانية الاوسط Middle

وبالحالة الثالثة الايمن Right

حسناً كيف يمكننا استخدام عجلة الفأرة ...؟

ضع على النموذج الاداة TrackBar وفي حدث الـ MouseWheel للنموذج اكتب التالي :

Public Class Form1

    Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

        Dim lines As Integer = My.Computer.Mouse.WheelScrollLines

        Me.TrackBar1.Value = lines

    End Sub

End Class

الان شغل البرنامج وحرك عجلة الفأرة وراقب النتيجة.

ان الـ WheelScrollLines تعود لنا بالقيمة التي توقفت عليها العجلة.

يمكن تغيير مؤشر الفأرة برمجياً كما بالشكل التالي :

Me.Cursor = Cursors.Help

حيث توجد العديد من الخيارات هذه بعضها كما بالشكل :

كذلك من الممكن أخفاء وإظهار المؤشر كما بالشكل التالي :

  Windows.Forms.Cursor.Show()

  Windows.Forms.Cursor.Hide()

كما من الممكن استخدام ايقونة مؤشر فأرة كما بالشكل التالي:

        Dim openFileDialog1 As New OpenFileDialog()

        openFileDialog1.Filter = "Cursor Files|*.cur"

        openFileDialog1.Title = "Select a Cursor File"

        openFileDialog1.ShowDialog()

        If openFileDialog1.FileName <> "" Then

            Me.Cursor = New Cursor(openFileDialog1.OpenFile())

        End If


بعض الاوامر الشائعة الاستخدام Co

Multi-Threading
القيام يمهام متعددة على مسارات تنفيذ مختلفة

كثيراً ما نحتاج الى تنفيذ مهمة ما في مسار تنفيذ مختلف لمسار تطبيقنا المفتوح حالياً.

يعني تصور لو انك تحتاج الى ملئ الاداة ListBox في مشروعك من الحدث FormLoad للنموذج حتى ومع ظهور النموذج تكون الاداة جاهزة لاظهار البيانات للمستخدم.

حقيقة هذا الحدث FormLoad جيد ولكنه لن يكون كذلك بحال كانت البيانات كبيرة او كثيرة.

لان المستخدم سينتظر لبعض الوقت ربما لثوان معدودة ستكون شهور طويلة.

والمشكلة ان هذا الوقت سيكون متكرراً بكل مرة ينفذ قيها البرنامج، وسيكون انطباعاً سيئاً عن البرنامج.

وأحياناً وانت بداخل البرنامج فعلاً وتقوم بالنقر على زر سيقوم بملئ أداة ListBox مثلا بـ 200.000 سجل مثلاً او أسم مثلاً.

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

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

كيف نفعل ذلك ....؟

حسناً انشئ مشروعاً جديداً وضع عليه زراً واداة ListBox وفي حدث النقر للزر أكتب التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        For t As Integer = 1 To 200000

             Me.ListBox1.Items.Add(t)

        Next

    End Sub

End Class

شغل البرنامج ونقر على الزر وسوف يستغرق البرنامج وقتاً طويلاً لانهاء هذا التكرار ولو حاولت ان تنقر على النموذج وتتعامل معه فستحصل على عدم استجابة من النموذج كما بالشكل التالي:

وسيجد المستخدم نفسه مضطراً الى اغلاق البرنامج بطريقة سيئة ورؤية هذه النافذة الغير مرغوب فيها كما بالشكل:

تأكد تماماً ان هذا ما سيحدث ان كانت العملية التي تقوم بها طويلة، فالمستخدم خاصية الصبر له لا تتقبل قيمة زمنية طويلة.

ولذلك سيلجاء للفأرة ويشبع النموذج نقرات وكذلك سطح المكتب والشاشة ككل.

وهذا ما سيحصل عليه .

أذا الان عليك ان تقوم باستيراد مجالات الاسماء هذه كما بالشكل :

Imports System.Collections.ObjectModel

Imports System.Threading

Public Class Form1

End Class

وبعدها يجب ان تضيف أداة ListBox وكذلك ProgressPar وكذلك Label وايضا Button كما بالشكل التالي:

وسيكون الكود الكامل للمشروع كما بالشكل التالي :

Imports System.Collections.ObjectModel

Imports System.Threading

Public Class Form1

    Delegate Sub Work1()

    Dim MyString As String = ""

    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    Private Sub ASD()

        For MInteger As Integer = 1 To 200000

            Me.MyString = MInteger.ToString

            FillList()

        Next

    End Sub

    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    Private Sub FillList()

        If Me.ListBox1.InvokeRequired Then

            Dim Value As New Work1(AddressOf Me.FillList)

            Me.ListBox1.Invoke(Value)

        Else

            Me.ProgressBar1.Maximum = 200000

            Me.ListBox1.Items.Add(MyString)

            Me.ProgressBar1.Value = Val(MyString)

            Me.Label1.Text = ListBox1.Items.Item(ListBox1.Items.Count - 1)

        End If

    End Sub

    '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With New Threading.Thread(AddressOf Me.ASD)

            .Start()

        End With

    End Sub

End Class

كما تشاهد المثال يقوم بتعبئة الاداة ListBox بالاعداد من 1 الى 200000 وهو رقم كبير يحتاج الى بعض الوقت.

لذلك سترى الاداة تمتلئ بالبيانات كما يمكنك التعامل مع النموذج بشكل عادي ويمكنك ايضاً فتح نماذج فرعية والعودة لهذه النافذة بشكل طبيعي جداً.

أنظر للشكل التالي:

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

وايضا تغيير قيمة الـ Label كما تشاهد فوق.

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

لاحظ انك لو كنت قد سبق لك التعامل مع مسارات التنفيذ فقد تقول: لماذا كل هذا اللف والدوران .

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

تم بهذا المثال ولتفاذي هذه المشكلة استخدام الطريقة Invoke وكذلك Delegates

يجب استدعاء الطريقة Invoke لتستطيع الوصول الى أي عنصر اخر.

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

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.ProgressBar1.Maximum = 200000

        For Value As Integer = 1 To 200000

            Me.ListBox1.Items.Add(Value.ToString)

            Me.ProgressBar1.Value = Value

            Me.Label1.Text = Value.ToString

            Application.DoEvents()

        Next

    End Sub

End Class

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

كما سيسمح بتحديث التغيييرات التي تحدث مثل رؤية مؤشر الانتهاء يتقدم او تغيير قيمة الاداة Label1


بعض الاوامر الشائعة الاستخدام Co

الأمر | My
وظيفته | يمكنك من القيام بوظائف متعددة والوصول الى اماكن مختلفة
المثال على كيفية الاستخدام |

بأي مكان في محرر الكود اكتب My وسوف يتم عرض القائمة التالية:

Application معلومات عن المشروع الحالي.

Computer للتعامل مع جهاز الكمبيوتر.

Forms للتعامل مع كل النماذج

Resources للتعامل مع ملفات الريسورس

ودعنا من الباقي.

على سبيل المثال اذا اردت ان تشغل ملف صوت من النوع Wav يمكنك كتابة التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.Audio.Play("C:\Note.wav")

    End Sub

End Class

المطلوب هو مسار الملف.

مثلاً لاحظ هنا كيف يمكننا التعامل مع حافظة النظام.

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.Clipboard.Clear()

        My.Computer.Clipboard.ContainsAudio()

        My.Computer.Clipboard.ContainsImage()

        My.Computer.Clipboard.ContainsText()

        TextBox1.Text = My.Computer.Clipboard.GetText()

        My.Computer.Clipboard.SetText(TextBox1.Text)

        PictureBox1.Image = My.Computer.Clipboard.GetImage

    End Sub

End Class

هذه بعض الاوامر فقط وهناك المزيد الذي يمكنك ان تطالعه.

ولكن ماهي حافظة النظام، انها جزء من الذاكرة يستخدمها النظام ليضع فيها ما نقوم بنسخه ولصقه وما الى ذلك.

قد تستفيذ من هذه الحافظة في برامجك، فمثلاً عندما تقوم بنسخ نص من برنامج Microsoft Word او المفكرة يتم وضع هذا النص بالحافضة، عنها يمكنك الحصول على هذا النص من الحافظة برمجياً.

السطر الاول: يقوم بمسح ما في الحافظة من بيانات ومهما كانت.

السطر الثاني: يسأل هل الحافظة تحتوي على صوت.

السطر الثالث: يسأل: هل تحتوي على صورة.

السطر الرابع: يسأل هل تحتوي على نص.

وطبعاً القيمة العائدة من هذه الاسئلة هي Boolean اما ان تكون True-False اي صح ام لا وعليك بوضع القيمة في متغير اجعله يساوي السطر البرمجي.

السطر الخامس: يقوم بوضع النص الذي بالحافظة في اداة النص، طبعاً عليك التأكد ان كانت تحتوي على نص ام لا قبل فعل ذلك.

السطر السادس: يقوم بوضع محتويات اداة النص في الحافظة.

السطر السابع: يقوم بوضع الصورة التي في الحافظة في اداة الصورة.

مثال أخر لمعرفة مسار بعض المجلدات.

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(My.Computer.FileSystem.SpecialDirectories.Desktop)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.MyDocuments)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.MyMusic)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.MyPictures)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.ProgramFiles)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.Programs)

        MsgBox(My.Computer.FileSystem.SpecialDirectories.Temp)

    End Sub

End Class

ستقوم هذه الرسائل بعرض مسار المجلدات، سطح المكتب، والمستندات، والموسيقى، الخ.

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

وهناك العديد لتعمل معه، شبكات، فأرة، شاشة العرض، لوحة المفاتيح، الخ.


بعض الاوامر الشائعة الاستخدام Co

الأمر | Now
وظيفته | لمعرفة التاريخ واليوم والشهر والوقت
المثال على كيفية الاستخدام |

للتعامل مع التاريخ او الوقت وبكلا الحالتين نحتاج الى الفئة Now من اجل ذلك.

Date Time | 99/03/01 1:23:45AM (Default)
Time Date | 1:23:45AM 99/03/01
Date | 99/03/01
Time | 1:23:45AM
متغير او ثابت التاريخ يحتوي او يمسك التاريخ والوقت معاً ويمكن اسناده كما بالشكل:

Dim someDateAndTime As Date = #8/13/2002 12:14:00 PM#

التاريخ بالسنة والشهر واليوم والوقت بالساعة والدقيقة والثانية وهذه صورة أخرى:

Dim dateInMay As New System.DateTime(1993, 5, 31, 12, 14, 0)

كما يمكن الحصول على الوقت والتاريخ الحالي كما بالشكل

Dim Value As Date = Now

يمكننا الان من خلال هذا المتغير الحصول وعبر العديد من الخصائص والتي هي للقراءة فقط على العديد من التفصيل للوقت والتالريخ كما بالشكل:

لاحظ مثلاً Date ستعود لنا بالتالريخ فقط، و Day ستعود لنا باليوم، وHour ستعود لنا بالساعة، وMinute ستعود لنا بالدقيقة، وSecond ستعود لنا بالثانية، وYear ستعود لنا بالسنة.

كما توجد بعض الاجراءات التي تمكننا من اجراء العمليات على التاريخ او الوقت كما بالشكل.

لاظافة ايام الى التاريخ الحالي:

Dim Value As Date = Now

Value.AddDays(4)

كما ان AddHours تضيف ساعات وAddMinutes تضيف دقائق وكذلك AddMonths تضيق شهور وايضاً AddYears تضيف سنوات

اما في عملية عكسية اي طرق عدة ايام او شهور او ماشابه نقوم بالتالي:

Dim Value As Date = Now

Value.AddDays(-4)

ايضاً يمكننا الحصول على عدد الايام بشهر معين وبمعلومية السنة كذلك كما بالشكل التالي:

Dim Value As Date = Now

MsgBox(Value.DaysInMonth(2009, 6))

ايضاً يمكننا الحصول على التاريخ بتنسيق معين انظر الشكل التالي:

Dim Value As Date = Now

MsgBox(Value.ToString("yyyy/MM/dd"))

حيث yyyy ثمتل السنة ويمكن استيرادها في رقمين فقط كالتالي yy

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

وايضاً dd تشير الى اليوم

كما لست مرتبطاً بتنسيق معين من الممكن ان يكون التنسيق بهذا الشكل:

Dim Value As Date = Now

MsgBox(Value.ToString("MM/yyyy/dd"))

او بهذا الشكل:

Dim Value As Date = Now

MsgBox(Value.ToString("dd/MM/yyyy"))

الامر متروك لك.

ايضاً قد يظهر لك التاريخ بالهجري كما بالشكل:

وللحصول على التاريخ بالميلادي دائماً ولضمان ذلك يمكننا استخدام الشكل التالي:

Dim Value As Date = Now

MsgBox(Value.ToString("yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture))

أما تحويل التاريخ الى الهجري ولضمان ذلك اكتب التالي كما بالشكل:

Dim MDate As Date

 MDate = Now

 MsgBox(MDate.ToString("yyyy,MM,dd", New Globalization.CultureInfo("ar-SA")))

كما توجد بعض الدوال وهذه تستخدم لمعرفة الفرق الزمني بين تاريخين أنظر للشكل التالي:

Public Class Form1

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(DateDiff(DateInterval.Year, #5/8/2005#, Now()))

    End Sub

End Class

ملاحظة صغيرة وهي ان الفارق الزمني يمكنك تحديده من DateInterval والتي تحوي هذه الخيارات :

يعني اظهار الفارق الزمني بالسنوات او بالاشهر او بالثواني او بالساعات الخ .......

كما يمكننا الاستعلام عن جزء معين من التاريخ كما بالشكل التالي :

Public Class Form1

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(DatePart(DateInterval.Second, Now()))

    End Sub

End Class

بهذا المثال سيتم الحصول على قيمة الثوان فقط

وكذلك اذا اردت الحصول على الشهر الحالي مثلا او السنة او اليوم وهكذا .


بعض الاوامر الشائعة الاستخدام Co

الأمر | Select Case
وظيفته | القيام بتفرع مشروط في البرنامج
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As Integer = 3

        Select Case value

            Case 1

                MsgBox("1")

            Case 2

                MsgBox("2")

            Case 3

                MsgBox("3")

            Case Else

                MsgBox("غير ذلك")

        End Select

    End Sub

End Class

أختبار القيمة بداخل المتغير Value واعطاء رسالة بالنتيجة وان لم تتطابق الشورط تم تنفيذ Case else .

وهذه صورة أخرى:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer = 4

        Dim value2 As Integer = 5

        Select Case value1

            Case 1 Or 2 And value2 = 4

                MsgBox("1")

            Case 3 Or 4

                MsgBox("2")

            Case 5 Or 6

                MsgBox("3")

            Case Else

                MsgBox("غير ذلك")

        End Select

    End Sub

End Class

ايضاً

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value1 As Integer = 4

        Dim value2 As Integer = 5

        Select Case value1

            Case 1, 2, value2 = 4

                MsgBox("1")

            Case 3, 4

                MsgBox("2")

            Case 5, 6

                MsgBox("3")

            Case Else

                MsgBox("غير ذلك")

        End Select

    End Sub

End Class


بعض الاوامر الشائعة الاستخدام Co

الأمر | Using End Using
وظيفته | لانهاء الكائن او الفئة بمجرد الانتهاء من استخدامها
المثال على كيفية الاستخدام |

لفهم الامر جيداً من خلال الامثلة أنظر للشكل التالي :

  Dim s As New IO.MemoryStream

  Dim cv As Byte() = .Fields("PicImage").Value

  Dim i As Integer

      Using s

      For i = 0 To cv.Length - 1

      s.WriteByte(CByte(cv(i)))

      Next i

      picImage.Image = Image.FromStream(s)

     End Using

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

أنظر شكل أخر هنا :

   Using value As Graphics = Me.CreateGraphics

      value.DrawString("Qnefo", Me.Font, Brushes.Red, 100, 100)

   End Using

مع مثال اخر :

  Using sqc As New System.Data.SqlClient.SqlConnection(s)

     MsgBox("Connected with string """ & sqc.ConnectionString & """")

  End Using

كما من الممكن استخدامها مع كائن الاتصال كما بالشكل التالي :

  Using Con As New OleDb.OleDbConnection

  End Using

لا تقلق بشأن إغلاق الاتصال سيتكفل الأمر بذلك.


بعض الاوامر الشائعة الاستخدام Co

الأمر | With End with
وظيفته | يستخدم في تسهيل الوصول الى احداث وخصائص الكائن المسند اليه
المثال على كيفية الاستخدام |

لنفرض ان لدينا اداة Textbox على الفورم عنها اذا اردنا التعامل معها سنكتب شيئاً مثل:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TextBox1.Text = "Test"

        TextBox1.BackColor = Color.Azure

        TextBox1.BorderStyle = BorderStyle.Fixed3D

        TextBox1.MaxLength = 50

    End Sub

End Class

لاحظ تكرار كلمة TextBox هل من الضروري كتابة هذه الكلمة العديد من المرات، بالتاكيد ليس ضوروراً ولذلك جاءت عبارة With انظر الشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With TextBox1

            .Text = "Test"

            .BackColor = Color.Azure

            .BorderStyle = BorderStyle.Fixed3D

            .MaxLength = 50

        End With

    End Sub

End Class

هل ترى كيف صار الكود منظماً ومقبولاً، مجرد قيامك بكتابة النقطة بين عبارتي With و End With يتم اظهار قائمة تحتوي كل الاحداث والخصائص لهذا الكائن.

كما يمكنك ان تستخدم العبارة بشكل متداخل بعد اضافة زر Button الى النموذج أنظر التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With TextBox1

            With Button1

                .Anchor = AnchorStyles.Left

                .Cursor = Cursors.Hand

                .Dock = DockStyle.Bottom

            End With

            .Text = "Test"

            .BackColor = Color.Azure

            .BorderStyle = BorderStyle.Fixed3D

            .MaxLength = 50

        End With

    End Sub

End Class

واحدة للزر وواحدة لأداة النص


New Page 1

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

بداية أنقر على الرز لتحديد مسار قاعدة البيانات

الان عليك بتحديد الجدول الذي تريد ان تتعامل معه وتجري عليه عملياتك، أنقر على الجدول المطلوب

والان أنقر على الوظيفة التي تريد ان تحصل على شفرة لها.


البناءات Enum

تعليمات حول معالج البيانات

بصراحة كان وقتي ضيق قليلاً وأنا اعد أخر صفحة من هذا الكتاب الا وهي الخاصة بمعالج إعداد الشفرات

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

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

عند إنشاء كود الاتصال لا توجد أخطاء بحاجة لتعديل كما بالشكل التالي:

  Imports System.Data.OleDb

  Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

  Dim con As New OleDb.OleDbConnection(ConString)

ولكن لاحظ أول سطر برمجي وهو يقوم بجلب مرجع او مجال أسماء وطبعا يجب وضعه بمكانه.

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

بالنسبة الى قراءة مع قارئ البيانات

        Imports System.Data.OleDb

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Select * from T1", con)

        Try

            con.Open()

            Dim dr As OleDbDataReader = cmd.ExecuteReader()

            Do While dr.Read()

                Me.ListBox1.Items.Add(dr.Item(0).ToString)

            Loop

            dr.Close()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

لاحظ انك بحاجة الى إضافة الأداة ListBox1 او استخدام اداة أخرى بديلة، كما يمكنك تغيير الحقل الذي تريد ان تقرأه.

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

قراءة مع مجموعة البيانات

        Imports System.Data.OleDb

        Dim Row As DataRow

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("Select * From T1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "T1")

            For Each Row In ds.Tables("T1").Rows

                Me.ListBox1.Items.Add(Row(0).ToString)

            Next

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

نفس الشئ انت بحاجة الى إضافة الأداة ListBox1 او استخدام اداة أخرى بديلة، كما يمكنك تغيير الحقل الذي تريد ان تقرأه.

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

ربط الاداة dataGrideView بمجموعة البيانات :

       Imports System.Data.OleDb

        Dim Row As DataRow

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("Select * From T1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "T1")

            Me.DataGridView1.DataSource = ds.Tables(0)

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

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

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

كود حذف سجل او سجلات :

    Imports System.Data.OleDb

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Delete * From T1 Where FeildName='" & TxtFeildname.Text.Trim & "'")

        Try

            con.Open()

            cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

في جملة الـ SQL انت بحاجة الى إعادة تعريف اسم الحقل الذي على أساسه سوف تقوم بعملية الحذف كما انت بحاجة الى تعديل الأداة التي سوف تقوم بحمل القيمة المطلوبة، لاحظ التضليل الاصفر.

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

كود إضافة بيانات :

    Imports System.Data.OleDb

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Insert Into T1 (groubname,itemname,codename,) Values (@groubname,@itemname,@codename,)")

        Try

            con.Open()

            With cmd

                .CommandType = CommandType.Text

                .Parameters.Add("@groubname", OleDbType.Integer).Value = Txtgroubname.Text.Trim

                .Parameters.Add("@itemname", OleDbType.Integer).Value = Txtitemname.Text.Trim

                .Parameters.Add("@codename", OleDbType.Integer).Value = Txtcodename.Text.Trim

                .ExecuteNonQuery()

            End With

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

انت بحاجة الى حذف الفواصل التي قمنا بتلوينها باللون الأصفر.

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

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

كود تعديل سجل او سجلات :

  Imports System.Data.OleDb

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Update T1 Set (groubname=@groubname,itemname=@itemname,codename=@codename, Where FeildName=@Feildname)")

        Try

            con.Open()

            With cmd

                .CommandType = CommandType.Text

                .Parameters.Add("@groubname", OleDbType.Integer).Value = Txtgroubname.Text.Trim

                .Parameters.Add("@itemname", OleDbType.Integer).Value = Txtitemname.Text.Trim

                .Parameters.Add("@codename", OleDbType.Integer).Value = Txtcodename.Text.Trim

                .ExecuteNonQuery()

            End With

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

كما ترى انت بحاجة الى إعادة تعريف الحقل المضلل باللون الأصفر.

وكذلك إعادة تعريف نوعية الحقول من المكان المضلل باللون الأحمر

كما انت بحاجة الى تعديل مسار قاعدة البيانات.

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

ولتدرك ذلك أنظر لكود الإضافة هذا والذي تم إعداده بالمعالج :

        Imports System.Data.OleDb

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:Backup.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Insert Into t1 (m_num,m_renk,renk_2,m_name,asasy,a_askry,a_mlabes

,a_family,a_home,a_food,a_saff,a_tasoea,a_tabahk,a_driver,a

_tadress,a_drive3,a_taheel,a_fanea,a_roket,q_tgaaed,q_dakel,q_gehad,q_damga,q_shareka,q_kasem,q_hesab,

q_smqm,card_place,m_card,m_date,m_bank,m_faraa,bnk_num,a_total,q_total,safy,) Values (@m_num,@m_renk,@renk_2,@m_name,@asasy,@a_askry,@a_mlabes,@a_family,@a_home,@a_food,@a_saff,@a_tasoea,

@a_tabahk,@a_driver,@a_tadress,@a_drive3,@a_taheel,@a_fanea,@a_roket,@q_tgaaed,@q_dakel,@q_gehad,@q_damga,

@q_shareka,@q_kasem,@q_hesab,@q_smqm,@card_place,@m_card,@m_date,@m_bank,

@m_faraa,@bnk_num,@a_total,@q_total,@safy,)")

        Try

            con.Open()

            With cmd

                .CommandType = CommandType.Text

                .Parameters.Add("@m_num", OleDbType.Integer).Value = Txtm_num.Text.Trim

                .Parameters.Add("@m_renk", OleDbType.Integer).Value = Txtm_renk.Text.Trim

                .Parameters.Add("@renk_2", OleDbType.Integer).Value = Txtrenk_2.Text.Trim

                .Parameters.Add("@m_name", OleDbType.Integer).Value = Txtm_name.Text.Trim

                .Parameters.Add("@asasy", OleDbType.Integer).Value = Txtasasy.Text.Trim

                .Parameters.Add("@a_askry", OleDbType.Integer).Value = Txta_askry.Text.Trim

                .Parameters.Add("@a_mlabes", OleDbType.Integer).Value = Txta_mlabes.Text.Trim

                .Parameters.Add("@a_family", OleDbType.Integer).Value = Txta_family.Text.Trim

                .Parameters.Add("@a_home", OleDbType.Integer).Value = Txta_home.Text.Trim

                .Parameters.Add("@a_food", OleDbType.Integer).Value = Txta_food.Text.Trim

                .Parameters.Add("@a_saff", OleDbType.Integer).Value = Txta_saff.Text.Trim

                .Parameters.Add("@a_tasoea", OleDbType.Integer).Value = Txta_tasoea.Text.Trim

                .Parameters.Add("@a_tabahk", OleDbType.Integer).Value = Txta_tabahk.Text.Trim

                .Parameters.Add("@a_driver", OleDbType.Integer).Value = Txta_driver.Text.Trim

                .Parameters.Add("@a_tadress", OleDbType.Integer).Value = Txta_tadress.Text.Trim

                .Parameters.Add("@a_drive3", OleDbType.Integer).Value = Txta_drive3.Text.Trim

                .Parameters.Add("@a_taheel", OleDbType.Integer).Value = Txta_taheel.Text.Trim

                .Parameters.Add("@a_fanea", OleDbType.Integer).Value = Txta_fanea.Text.Trim

                .Parameters.Add("@a_roket", OleDbType.Integer).Value = Txta_roket.Text.Trim

                .Parameters.Add("@q_tgaaed", OleDbType.Integer).Value = Txtq_tgaaed.Text.Trim

                .Parameters.Add("@q_dakel", OleDbType.Integer).Value = Txtq_dakel.Text.Trim

                .Parameters.Add("@q_gehad", OleDbType.Integer).Value = Txtq_gehad.Text.Trim

                .Parameters.Add("@q_damga", OleDbType.Integer).Value = Txtq_damga.Text.Trim

                .Parameters.Add("@q_shareka", OleDbType.Integer).Value = Txtq_shareka.Text.Trim

                .Parameters.Add("@q_kasem", OleDbType.Integer).Value = Txtq_kasem.Text.Trim

                .Parameters.Add("@q_hesab", OleDbType.Integer).Value = Txtq_hesab.Text.Trim

                .Parameters.Add("@q_smqm", OleDbType.Integer).Value = Txtq_smqm.Text.Trim

                .Parameters.Add("@card_place", OleDbType.Integer).Value = Txtcard_place.Text.Trim

                .Parameters.Add("@m_card", OleDbType.Integer).Value = Txtm_card.Text.Trim

                .Parameters.Add("@m_date", OleDbType.Integer).Value = Txtm_date.Text.Trim

                .Parameters.Add("@m_bank", OleDbType.Integer).Value = Txtm_bank.Text.Trim

                .Parameters.Add("@m_faraa", OleDbType.Integer).Value = Txtm_faraa.Text.Trim

                .Parameters.Add("@bnk_num", OleDbType.Integer).Value = Txtbnk_num.Text.Trim

                .Parameters.Add("@a_total", OleDbType.Integer).Value = Txta_total.Text.Trim

                .Parameters.Add("@q_total", OleDbType.Integer).Value = Txtq_total.Text.Trim

                .Parameters.Add("@safy", OleDbType.Integer).Value = Txtsafy.Text.Trim

                .ExecuteNonQuery()

            End With

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

كما تشاهد سيكون مزعجاً ومتعباً كثيراً إعداد مثل هذا الكود يدوياً.

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


البناءات Enum

قواعد البيانات باستخدام Ado. net

سنستخدم قاعدة بيانات Access لان الأغلبية يستخدمونها وهي شائعة الاستخدام.

مع العلم ان الاختلاف في الكود من حيث طريقة التعامل مع قواعد البيانات المختلفة لا يوجد به اختلاف كبير.

كما تم أدراج كود الـ C# لزيادة الفائدة فقط والاطلاع .

بداية علينا استيراد مجال الأسماء التالي:

VB Code

Imports System.Data.OleDb

C# Code

using System.Data.OleDb;

أولا نريد ان نرى حركة البيانات كيف تتم من الشكل التالي:

أول شئ يحدث هو عمملية الاتصال بالبيانات Connecting to Data

بعدها استعداد برنامجك لتلقي البيانات.

بعدها جلب البيانات الى برنامجك.

بعدها عرض البيانات على النموذج.

بعدها تعديل هذه البيانات في البرنامج.

بعدها التأكيد على هذه التغييرات.

وأخيراً حفظ البيانات بقاعدة البيانات من جديد.

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

نحن الان سنتعامل مع مزود البيانات OleDb والذي قمنا باستيراده كما اوضحنا سابقاً ويمكنك ان ترى مخطط تفصيلي هنا واين هو موقعه بالضبط أنظر لششكل التالي:

من الواضح ان مزود البيانات هذا له أربع كائنات تعمل عن طريقه وهم:

OleDbCommand

OleDbConnection

OleDbDataAdapter

OleDbDataReader

لاحظ ان مزود البيانات SqlClient يتبع نفس الشئ وبنفس التسميات ولذلك قلت ان الاختلاف بالكود ليس كبيرا جداً وهو يهتم بقواعد بيانات Sql Server.

وايضاً هذا شكل اخر يبين مجموعة الكائنات وطريقة اتصالها بالبيانات كما بالشكل التالي:

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

كما قلت بأول الدرس أول شئ يجب ان نقوم به هو الاتصال بالبيانات.

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

وسلسلة الاتصال هي كما بالشكل التالي:

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb

سلسلة الاتصال هذه مقسمة الى التالي:

Provider وهي أسم لمزود بيانات وهو هنا

Microsoft.jet.OLEDB للتعامل مع قواعد بيانات Access

ورقم الإصدارة وهو 4.0

وأيضا Data Source وهو يشير الى موقع قاعدة البيانات وبحالنا هنا المسار هو على محرك الاقراص D

وأسم قاعدة البيانات هو db1

وبحال كان لقاعدة البيانات كلمة مرور وأسم مستخدم فستتغير سلسلة الاتصال لتصبح بالشكل التالي:

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb;User ID=UserName;Password=Pass

ان الكتابة المضللة هي ما تم إضافته فالـ User ID هي أسم المستخدم

وايضاً Password تشير الى كلمة المرور التي تحمي بها قاعدة بياناتك في الـ Access

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

او الاعتماد على قواعد بيانات الاوراكل او الاس كيو أل سيرفر.

كما يمكنك تحديد فترة انتظار الكائن Connection لربط الاتصال مع مصدر البيانات واذا لم يحدث ربط خلال 18 ثانية سنحصل على خطاء، أنظر للشكل التالي:

 Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb;Connection Timeout=18

حسناً هذه أذا سلسلة الاتصال والان جاء الدور لانشاء كائن الاتصال وسيكون علينا كتابة هذا الشئ

VB Code.

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

        }

    }

}

أولاً قمنا بتعريف متغير من النوع String ووضعنا به سلسلة الاتصال.

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

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

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

        }

    }

}

بحال اردت وضعها في مجلد المشروع ولكن بداخل مجلد فرعي تريد ان تسميه Data مثلا فيجب ان يكون الكود بالشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\Data\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\data\db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

        }

    }

}

جميل جداً بدأت أستمتع بما اكتبه واقوله والان ماذا عسانا نضيف ايضاً.

حسناً الان كل الامور تسير على ما يرام ولكن الاتصال هذا مغلق.

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

ولتفعل ذلك يجب ان تكتب التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

         connection.Open();

        }

    }

}

أذا لاحظ الكود الذي اضفناه ولاحظ السلسلة النصية وكيف اسندناها الى كائن الاتصال.

وأخيراً قمنا بفتح الاتصال.

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

اذا لم تكن تصدقني يمكنك ان تسأل الخاصية State عن ذلك ولتفعل ذلك أكتب التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

        MsgBox(con.State.ToString)

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

         connection.Open();

         MessageBox.Show(Convert.ToString(connection.State));

        }

    }

}

اذا أظهرت لك الرسالة كلمة Open فعندها انت متصل واذا أظهرت لك كلمة Closed فاتصال عندها قد تم إغلاقه.

ويمكنك ان تلغي السطر البرمجي Con.Open وترى النتيجة بنفسك.

على العموم بأي وقت أردت الاستعلام عن حالة الاتصال فيمكنك استخدام الجملة الشرطية التالية:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

          If con.State = ConnectionState.Open Then

            'اي شئ تريد تنفيذه هنا

          End If

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

          connection.Open();

              if (connection.State==ConnectionState.Open )

                  {

                   //  اي شئ تريد تنفيذه هنا

               }

        }

    }

}

وسيتم تنفيذ الكود بين الوسمين بحال كان الاتصال مفتوحاً.

حقيقة لابد وان ترى معي هذا المثال أنظر للتالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

   If con.State = ConnectionState.Open Then

            'اي شئ تريد تنفيذه هنا

   ElseIf con.State = ConnectionState.Closed Then

            'اي شئ تريد تنفيذه هنا

   ElseIf con.State = ConnectionState.Connecting Then

            'اي شئ تريد تنفيذه هنا

   ElseIf con.State = ConnectionState.Executing Then

            'اي شئ تريد تنفيذه هنا

   ElseIf con.State = ConnectionState.Fetching Then

            'اي شئ تريد تنفيذه هنا

   End If

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

          connection.Open();

                  if (connection.State==ConnectionState.Open ) { اي شئ تريد تنفيذه هنا//}

                  else if (connection.State == ConnectionState.Closed) {اي شئ تريد تنفيذه هنا// }

                  else if (connection.State == ConnectionState.Connecting) {اي شئ تريد تنفيذه هنا// }

                  else if (connection.State == ConnectionState.Executing) {اي شئ تريد تنفيذه هنا// }

                  else if (connection.State == ConnectionState.Fetching) { اي شئ تريد تنفيذه هنا//}

        }

    }

}

العديد من الحالات نلخصها فيما يلي :

الحالة الاولى | الاتصال مفتوح
الحالة الثانية | الاتصال تم اغلاقه او مغلق
الحالة الثالثة | يتصل او جاري الاتصال في صيغة المضارع المستمر
الحالة الرابعة | يقوم بعملية ما ربما جلب بيانات او قراءة او ما شابه
الحالة الخامسة | يقوم بجلب بيانات

على العموم ربما تحتاج هذا وربما لا تحتاجه لنواصل حديثنا.

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

ما هي المشاكل التي قد تحدث....؟

هي ليست مشاكل بالمعنى المعروف وانما استثناءات.

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

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

والان كيف نفعل ذلك أنظر للشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Try

            con.Open()

        Catch ex As Exception

              MsgBox(ex.Message)

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

               try

               {

                  connection.Open();

               }

               catch (Exception ex)

               {

                   MessageBox.Show(ex.Message);

               }

        }

    }

}

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

كما اذا أردت ان تقوم بقنص الأخطاء الخاصة بكائنات الاتصال بصورة خاصة يجب ان تستخدم الكود التالي.

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Try

            con.Open()

        Catch ex As OleDbException

              MsgBox(ex.Message)

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

               try

               {

                  connection.Open();

               }

               catch (OleDbException ex)

               {

                   MessageBox.Show(ex.Message);

               }

        }

    }

}

استخدمنا كائن الاستثناءات OleDbException والان لن يتم اقتناص الا الاخطاء التي تتعلق بالاتصال.

حتى الان الامور تسير على أحسن ما يرام.

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

مثل اي مبرمج محترف يجب ان تغلق الاتصال مع العبارة Finally كما بالشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Try

            con.Open()

        Catch ex As OleDbException

              MsgBox(ex.Message)

        Finally

             con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

        try

          {

              connection.Open();

          }

          catch (OleDbException ex)

          {

              MessageBox.Show(ex.Message);

          }

          finally

          {

              connection.Close();

          }

        }

    }

}

لماذا هذا المكان بالذات ....؟

لو كان بعد العبار Try حيث باقي الكود وحدث خطاء او استناء فسيقفز البرنامج أمر الاغلاق وتبقى قاعدة البيانات مفتوحة، وستظهر رسالة خطاء للمستخدم.

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

كيف تقع في خطاء كهذا، اشغل برنامجك فاجده يحاول فتح قاعدة بيانات مفتوحة.

يجب ان لا تدع محترفاً يرى برنامجك وهو يفعل ذلك.

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

حتى الان لم نقم الا بانشاء كائن الاتصال والاتصال بقاعدة البيانات فقط، وحان الان الدوربالتعرف على الكائن الثاني حسب الترتيب كما بالصورة:

وهو هنا OleDbCommand ولانشاء كائن من هذا النوع نقوم بالتالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Select * from t1", con)

        Try

           con.Open()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

          OleDbCommand command = new OleDbCommand("Select * from t1", connection);

        try

          {

              connection.Open();

          }

          catch (OleDbException ex)

          {

              MessageBox.Show(ex.Message);

          }

          finally

          {

              connection.Close();

          }

        }

    }

}

اضفنا الكائن واشرنا له بالاسم cmd ( كل المبرمجين تقريباً صاروا متعارفين على أسماء معينة يستخدمونها للإشارة الى هذه الكائنات ) والذي يطالبنا بجملة الاستعلام SQL وكائن الاتصال وبجملة الاستعلام قد حددنا اسم الجدول المطلوب التعامل معه.

حتى الان لن يفيدنا هذا الكود في شئ لذلك سننشئ كائن جديد Data Reader كما بالشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Select * from t1", con)

        Try

           con.Open()

        Dim dr As OleDbDataReader = cmd.ExecuteReader()

        Do While dr.Read()

             ListBox1.Items.Add(dr.Item("itemname").ToString)

        Loop

         dr.Close()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

          String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

          OleDbConnection connection = new OleDbConnection(ConString);

      OleDbCommand command = new OleDbCommand("Select * from t1", connection);

            try

            {

                connection.Open();

                OleDbDataReader dr = command.ExecuteReader();

                while (dr.Read())

                {

                    this.listBox1.Items.Add(dr["itemname"]);

                }

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

أولاً اضف الى المشروع الاداة ListBox

وكما قلت من قبل هناك تسميات شائعة الاستخدام ويفهما اي مبرمج سريعاً.

فمثلاً كائن الاتصال يرمز له بالرمز Con اختصاراً الى Connection

وكاتن الاوامر يرمز له بالرمز cmd اختصاراً الى Command

وكائن البيانات او قارئ البيانات يرمز له بالرمز dr اختصاراً الى Data Reader

وهكذا مع كل الكائنات الاخرى.

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

تم استخدمنا الخاصية Read للقراءة وتكراراً لنمر على كل السجلات وبكل دورة ينتقل المؤشر الى موقع جديد او سجل جديد.

تم عبر الخاصية Item والتي تطلب رقم الفهرس للعمود وليس السطر او أسم العمود المراد قراءة بياناته.

تم وبعد الانتهاء من كل السجلات يتم اغلاق قارئ البيانات.

ولكن اعتقد اننا بحاجة الى توضيح ما هو العمود او السطر بقاعدة البيانات، أنظر للصورة التالية والتي تظهر جدول من قاعدة البيانات.

اذا عدت الى الكود السابق ستجد أنني حددت العمود عن طريق الاسم وكان أسمه ItemName وهو هنا المضلل باللون الأخضر.

وبحالة اردت ان احدد بطريقة الفهرس فسيكون الكود كالتالي:

VB Code

 ListBox1.Items.Add(dr.Item(1).ToString)

لماذا رقم فهرس 1 ....؟

لان العمود Groubname يساوي صفر (0) والعمود ItemName يساوي 1 والعمود CodeName يساوي 2

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

اذاً تذكر ان Column تعني عمود وكذلك Row وتعني صف وايضاً Index وتعني فهرس.

والفجوال كان يظهر لنا الخيارات التالية كتلميح أنظر للشكل.

وهو يطالب رقم الفهرس وبالحالة الثانية يطالب بأسم العمود.

حسناً الان أذا شغلنا البرنامج فسيتم ملئ الاداة ListBox بقيم العمود المحدد كما بالشكل:

كما يمكننا جلب اكثر من حقل كما بالشكل التالي:

VB Code

 ListBox1.Items.Add(dr.Item("itemname").ToString & Space(2) & dr.Item("groubname").ToString)

C# Code

 this.listBox1.Items.Add(dr["itemname"] + " " + dr["groubname"]);

والجديد هنا هو استخدام الدالة Space والتي تطلب رقم يحدد عدد المسافات المطلوب اضافتها، وهي تنشئ مسافة خالية يحددها العدد الذي نكتبه.

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

وبداية سوف نشرح الان كيف يمكننا القيام بتعديل البيانات في قاعدة البيانات أنظر للشكل التالي:

اولاً نحتاج الى جملة الاستعلام وسيكون شكلها كالتالي:

 UPDATE [t1] SET qroubname=12, Itemname='Any String', Codebname='Any String' where Itemname='Any String'

طبعاً لسنا بصدد مناقشة جمل الاستعلام (SQL) ويمكنك مراجعة الدرس الذي يتحدث عنها بالتفصيل.

ولكن لاحظ ان ItemName وكذلك CodeName هي حقول نصية والقيمة التي سنرسلها تكون بين علامتي تنصيص كما تشاهد.

اما القيمة الرقمية فتترك كما هي.

طبعاً هذه الجملة عديمة الجدوي بشكلها هذا لاننا نريد ان نرسل قيم متغيرة من بعض الادوات الموجودة على النموذج مثلا.

وعندها يجب تحويل هذا الاستعلام ليصبح مترابطاً مع ادواتنا وسيكون بالشكل التالي:

VB Code

"UPDATE  t1  SET " & _

        " groubname =" & Val(Me.TextBox1.Text.Trim) & "," & _

        " ItemName ='" & Me.TextBox2.Text.Trim & "', " & _

        " CodeName ='" & Me.TextBox3.Text.Trim & "'" & " Where ItemName ='" & Me.TextBox4.Text.Trim & "'"

C# Code

 "UPDATE  t1  SET " +

            "groubname=" + this.textBox1.Text +

            "Itemname='" + this.textBox2.Text +

            "codename='" + this.textBox3.Text +

            "' Where  ItemName ='" + this.textBox4.Text + "'"

أما الكود التنقيذي الكامل لعملية تعديل البيانات سيكون كما بالشكل:

VB Code

Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("UPDATE  t1  SET " & _

        " groubname =" & Val(TextBox1.Text.Trim) & "," & _

        " ItemName ='" & Me.TextBox2.Text.Trim & "'," & _

        "  CodeName ='" & Me.TextBox3.Text.Trim & "'" & " Where  ItemName ='" & Me.TextBox4.Text.Trim & "'", con)

        Try

            con.Open()

            cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbCommand command = new OleDbCommand("UPDATE  t1  SET " +

            "groubname=" + this.textBox1.Text +

            "Itemname='" + this.textBox2.Text +

            "codename='" + this.textBox3.Text +

            "' Where  ItemName ='" + this.textBox4.Text + "'" , connection);

            try

            {

                connection.Open();

                command.ExecuteNonQuery();

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

نفس الطريقة السابقة من حيث استخدام الاستعلام مع كائن الاوامر Command وربطه بكائن الاتصال Connection

ولكن هذه المرة استخدمنا الطريقة ExecuteNonQuery لتنفيذ الاستعلام.

وسنستخدم هذه الطريقة مع جمل الاستعلام التنفيذية كالحذف والتعديل والاضافة .

واذا حدث لك خطاء بجملة الاستعلام فيمكنك استخدام صندوق الرسائل لاظهار الجملة كاملة ومراجعتها وتتبع الخطاء فيها كما بالشكل التالي:

VB Code

Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("UPDATE  t1  SET " & _

        " groubname =" & Val(TextBox1.Text.Trim) & "," & _

        " ItemName ='" & Me.TextBox2.Text.Trim & "'," & _

        "  CodeName ='" & Me.TextBox3.Text.Trim & "' Where  ItemName ='" & Me.TextBox4.Text.Trim & "'", con)

        MsgBox(cmd.CommandText)

        Try

            con.Open()

   cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbCommand command = new OleDbCommand("UPDATE  t1  SET " +

            "groubname=" + this.textBox1.Text +

            "Itemname='" + this.textBox2.Text +

            "codename='" + this.textBox3.Text +

            "' Where  ItemName ='" + this.textBox4.Text + "'" , connection);

            MessageBox.Show(command.CommandText);

            try

            {

                connection.Open();

         command.ExecuteNonQuery();

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

يمكننا قراءة الخاصية CommandText العائدة لكائن الاوامر Command وستكون النتيجة كما بالشكل التالي:

الان يمكنك بسهولة مراجعة الجملة ومعرفة أين يقع الخطاء

ولعملية الإضافة او الحذف ستحتاج فقط الى تغيير جملة Sql بالجملة المناسبة.

كما توجد طريقة أخرى عن طريق استخدام الـ Parameters العائد لكائن الأوامر أنظر للشكل التالي :

VB Code

 Imports System.Data.OleDb

  Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Insert Into t1 (groubname,itemname,codename) values (@groub,@Item,@code)", con)

        Try

            con.Open()

            With cmd

                .CommandType = CommandType.Text

                .Parameters.Add("@groub", OleDbType.Integer).Value = 123

                .Parameters.Add("@item", OleDbType.BSTR).Value = "AAAAAAA"

                .Parameters.Add("@code", OleDbType.BSTR).Value = "BBBBBBB"

                .ExecuteNonQuery()

            End With

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbCommand command = new OleDbCommand( "Insert Into t1 (groubname,itemname,codename) values (@groub,@Item,@code)", connection);

            try

            {

                connection.Open();

                command.CommandType = CommandType.Text;

                command.Parameters.Add("@groub", OleDbType.Integer).Value = 123;

                command.Parameters.Add("@item", OleDbType.BSTR).Value = "AAAAAAA";

                command.Parameters.Add("@code", OleDbType.BSTR).Value = "BBBBBBB";

                command.ExecuteNonQuery();

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

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

وطبعاً سواء كانت العملية إضافة ام تعديل يتم إتباع نفس الأسلوب السابق في تعريف متغيرات وإضافة بارامترات وتعريفها وإسناد قيم لها.

ولاحظ ان كل بارامتر نضيفه نقوم بتعريف نوعه كما بالشكل التالي:

 OleDbType.BSTR

مجموعة البيانات Dataset

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

وتفيذ هذه الطريقة كثيرا في تطبيقات الانترنت.

وطبعاً الاسم الشائع الذي تعرف به الـ Dataset هو الاختصار ds

حقيقة لم تكن الـ DataSet غريبة عني لانني وقبل ظهور الفجوال ستوديو ومع الاصدارة فجوال بيسك 6 كنت افعل شيئاً قريباً جداً من هذه الـ Dataset

الفكرة كانت في انني اقوم بمجموعة من التعريفات من النوع String والـ Integer وكذلك الـ Date وعندما يقوم المستخدم بطلب سجل

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

ولا اتصل بها الا بحالة طلب حفظ التغييرات فقط.

وحقيقة ساعدتني هذه الطريقة كثيراً في تتبع التغييرات التي كان يحدثها المستخدم بالحقول.

وكل ما كنت اقوم به هو مقارنة الاداة الحاملة للقيمة بالمتغير الذي لازال بالذاكرة، وهذا وفر على الاتصال بقاعدة البيانات مع كل تغيير يحدث.

وفعلاً بدات افكر بعدها في تطويرها الى مصفوفات تحمل الكثير من السجلات، لتكون ما نعرفه الان بالاعمدة والصفوف.

ولكن ظهرت الفجوال ستوديو ورأيت الـ Dataset ورميت الفجوال بيسك 6 بلا رجعة.

ولنفعل ذلك أنظر الى الكود التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM t1",connection );

            DataSet ds=new DataSet();

            try

            {

               connection.Open();

               da.Fill(ds,"t1");

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

لاحظ ما الذي اختلف بالكود حيث قمت بتضليله.

إنشاءنا أيضا هنا كائن محول البيانات OledbDataAdapter ويحتاج مثل كائن الأوامر إلى جملة الاستعلام وكائن الاتصال لاحظ الشكل التالي:

وهو يمثل عملية الوصل بين الـ Dataset وكذلك الـ Data Source ولكن عن طريق الـ Connection كما يمكنك ان تشاهد بالصورة هنا أيضاً.

تم إنشاءنا أيضا الـ Dataset مجموعة البيانات.

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

أيضا هناك سطر جديد بالأسفل حيث نستخدم الطريقة Fill الخاصة بمحول البيانات لتعبئة مجموعة البيانات الـ Dataset بالبيانات.

وهي تحتاج الى أسم الـ Dataset وكذلك أسم الجدول.

الان سنحاول قراءة البيانات انظر للشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Row As DataRow

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

            For Each Row In ds.Tables("t1").Rows

                ListBox1.Items.Add(Row("ItemName").ToString)

            Next

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM t1",connection );

            DataSet ds=new DataSet();

            try

            {

               connection.Open();

               da.Fill(ds,"t1");

               foreach (DataRow row in ds.Tables["t1"].Rows){

                  this.listBox1.Items.Add(row["itemname"]);

              }

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

طبعاً لابد وانك قد تعودت على ان الكتابة المضللة باللون الأصفر تفيد انها اسطر جديدة وإضافات جديدة.

أذا لاحظ أول إضافة من فوق إنشاءنا كائن جديد من النوع Data Row وواضح من أسمه يختص بالصفوف.

تم استخدمنا الحلقة Each For ويمكنك مراجعتها بدروس الـ Commands

تم وعن طريق الـ Dataset الا وهي ds وعن طريقة الخاصية Tables حددنا أسم الجدول وحددنا كذلك الـ Rows اي الصفوف للجدول المحدد

فالـ DataSet تحتوي على الجداول وكل جدول يحتوي على الكثير من الصفوف لاحظ التالي:

وأخيراً وبشكل مشابه للطريقة التي استخدمناها في الوضع المتصل ومع الـ Row حيث حددنا أسم العمود المطلوب جلب بياناته نحصل على البيانات في الاداة ListBox كما بالشكل:

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

يمكن استخدام الـ DataRow في عملية البحث بقاعدة البيانات كما بالشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

            Dim FindRow() As DataRow = ds.Tables(0).Select("groubname=2")

            MessageBox.Show(FindRow(1).Item(1))

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Windows.Forms;

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM t1", connection);

            DataSet ds = new DataSet();

            try

            {

                connection.Open();

                da.Fill(ds, "t1");

                DataView DW = new DataView(ds.Tables["t1"]);

                DW.RowFilter = "itemname Like '" + this.textBox1.Text  + "*'";

                DW.Sort = "itemname";

                DataRow[] foundRows = ds.Tables[0].Select("groubname=2");

                MessageBox.Show(foundRows[1][1].ToString());

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

وكذلك يمكن استخدام الـ DataView للقيام بفلترة البيانات كما بالشكل التالي :

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim ds As New DataSet()

        Dim con As New OleDb.OleDbConnection()

        Dim sql As String = "select * from t1"

        con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        ds.Clear()

        Dim da As New OleDb.OleDbDataAdapter(sql, con)

        da.Fill(ds, "t1")

        Dim DW As New DataView(ds.Tables("t1"))

        DW.RowFilter = "itemname Like '" & txtEmpName.Text.Trim & "*'"

        DW.Sort = "itemname"

        DataGridView1.DataSource = DW

    End Sub

End Class

C# Code

using System.Windows.Forms;

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM t1", connection);

            DataSet ds = new DataSet();

            try

            {

                connection.Open();

                da.Fill(ds, "t1");

                DataView DW=new DataView(ds.Tables["t1"]);

                DW.RowFilter = "itemname Like '" + textBox1.Text + "*'";

                DW.Sort = "itemname";

                this.dataGridView1.DataSource = DW;

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

ويمكن استخدامها في عمليات البحث عن البيانات أنظر للشكل التالي :

هذه نتيجة البحث عن الحرف (س)

ويمكننا ان نستعرض البيانات في الأداة DataGridView وذلك بالطريقة التالية.

أضف الأداة إلى النموذج تم اكتب الكود التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

            DataGridView1.DataSource = ds.Tables(0)

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM t1",connection );

            DataSet ds=new DataSet();

            try

            {

               connection.Open();

               da.Fill(ds,"t1");

               dataGridView1.DataSource = ds.Tables[0];

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

عن طريق الخاصية Data Source للاداة جعلتها تساوي الجدول المحدد

طبعاً يمكن ان نضع الاسم بدل رقم الفهرس كما بالشكل التالي:

VB Code

  DataGridView1.DataSource = ds.Tables("t1")

C# Code

  dataGridView1.DataSource = ds.Tables["t1"];

وهذه هي النتيجة.

كما توجد الخاصية Tables التابعة لمجموعة البيانات والتي تمسك بـ TabelsCollection يحتوي على DataTabels في مجموعة البيانات.

وعن طريقها يمكننا استخراج جميع أسماء الجداول بمجموعة البيانات أنظر للشكل التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

            Dim dt As DataTable

            For Each dt In ds.Tables

                Me.ListBox1.Items.Add(dt.TableName)

            Next

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM t1",connection );

            DataSet ds=new DataSet();

            try

            {

               connection.Open();

               da.Fill(ds,"t1");

               foreach (DataTable dt in ds.Tables){

               this.listBox1.Items.Add (dt.TableName);

                }

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

عرفنا كائن جديد DataTables تم انشاءنا تكرارا للمرور على كل الـ Tables وأخيراً ملئ الاداة ListBox باسماء الجداول.

كما توجد طريقة لإضافة البيانات عن طريق الـ DataRow التابعة للـ DataSet أنظر للشكل التالي:

VB Code

 Imports System.Data.OleDb

  Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da = New OleDb.OleDbDataAdapter("Select * from t1 ", con)

        Dim ds As New DataSet

        Dim Row As DataRow

        Try

            con.Open()

            da.Fill(ds, "t1")

            Row = ds.Tables("t1").NewRow()

            Row.Item("groub") = 123

            Row.Item("Itemname") = "AAAAAA"

            Row.Item("Codename") = "BBBBBB"

            ds.Tables("t1").Rows.Add(Row)

            da.Update(ds, "t1")

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbDataAdapter da=new OleDbDataAdapter("SELECT * FROM t1",connection );

            DataSet ds=new DataSet();

            try

            {

               connection.Open();

               da.Fill(ds,"t1");

               DataRow row = ds.Tables[0].NewRow();

                row["groubname"]=123;

                row["Itemname"]="AAAAAA";

                row["Codename"]="BBBBB";

              ds.Tables["t1"].Rows.Add(row);

              da.Update(ds,"t1");

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

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

وهناك طريقة أخرى تستطيع بها معرفة كل الجداول بقاعدة البيانات من خلال كائن الاتصال فقط وهي كما يلي:

أولاً انشئ مشروعاً جديداً تم ضع عليه أداة TextBox وزراً وأداتي ListBox تم في الحدث نقر للزر أكتب التالي:

VB Code

Imports System.Data.OleDb

Public Class Form1

    Dim StrCon As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        OpenFileDialog1.ShowDialog()

        StrCon = "provider=microsoft.jet.oledb.4.0;data source=" & OpenFileDialog1.FileName

        Me.TextBox1.Text = OpenFileDialog1.FileName

        Dim row As DataRow

        Dim connectionString As String = StrCon

        Using connection As New OleDb.OleDbConnection(connectionString)

            connection.Open()

            Dim table As DataTable = connection.GetSchema("TABLES")

            ListBox1.Items.Clear()

            For Each row In table.Rows

                If row("TABLE_TYPE") = "TABLE" Then

                    ListBox1.Items.Add(row("TABLE_NAME"))

                End If

            Next

        End Using

    End Sub

End Class

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            this.openFileDialog1.ShowDialog();

            String ConString = "provider=microsoft.jet.oledb.4.0;data source=" + openFileDialog1.FileName ;

            OleDbConnection connection = new OleDbConnection(ConString);

            try

            {

             connection.Open();

             DataTable table=  connection.GetSchema("TABLES");

             this.listBox1.Items.Clear();

                foreach ( DataRow  Row in table.Rows )

                {

                   if (Row["TABLE_TYPE"]=="TABLE"){

                 this.listBox1.Items.Add(Row["TABLE_NAME"] );

                   }

                }

        }

    }

}

طبعاً لن اناقش هذا الان لانني احتاج الى بعض المعلومات وتوصلت الى هذه الطريقة بصعوبة وبأجتهاد شخصي وبحث كثير.

والان في الحدث SelectedIndexChanged للاداة ListBox أكتب الكود التالي كما بالشكل:

VB Code

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

        Dim connectionString As String = StrCon

        Dim RS As New DataSet

        Dim tbl As System.Data.DataColumn

        Dim DB As New OleDb.OleDbDataAdapter("select * from " & ListBox1.Text, StrCon)

        Using connection As New OleDb.OleDbConnection(connectionString)

            connection.Open()

            ListBox2.Items.Clear()

            DB.Fill(RS, ListBox1.Text)

            For Each tbl In RS.Tables(ListBox1.Text).Columns

                ListBox2.Items.Add(tbl.Caption)

            Next

        End Using

    End Sub

C# Code

     private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

        {

            string connectionString = StrCon;

            DataSet Rs=new DataSet();

            OleDbDataAdapter DB = new OleDbDataAdapter("Select * from " + this.listBox1.Text , StrCon);

            OleDbConnection connection = new OleDbConnection(StrCon);

            connection.Open();

            this.listBox2.Items.Clear();

            DB.Fill(Rs, this.listBox1.Text);

            foreach (DataColumn Tbl in Rs.Tables[this.listBox1.Text].Columns )

            {

                this.listBox2.Items.Add (Tbl.Caption);

            }

        }

وهذا الكود سيقوم باستخراج جميع الحقول بالجدول المحدد كما بالشكل التالي:

ولكن أريد ان أعود بكم قليلاً الى الأعلى حيث كنا نقوم بعمليات الإضافة والتعديل كما بالشكل التالي :

VB Code

Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("UPDATE  t1  SET " & _

        " groubname =" & Val(TextBox1.Text.Trim) & "," & _

        " ItemName ='" & Me.TextBox2.Text.Trim & "'," & _

        "  CodeName ='" & Me.TextBox3.Text.Trim & "'" & " Where  ItemName ='" & Me.TextBox4.Text.Trim & "'", con)

        Try

            con.Open()

   cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

C# Code

using System.Data.OleDb;

namespace WindowsApplication2

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            String ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:db1.mdb";

            OleDbConnection connection = new OleDbConnection(ConString);

            OleDbCommand command = new OleDbCommand("UPDATE  t1  SET " +

            "groubname=" + this.textBox1.Text +

            "Itemname='" + this.textBox2.Text +

            "codename='" + this.textBox3.Text +

            "' Where  ItemName ='" + this.textBox4.Text + "'" , connection);

            MessageBox.Show(command.CommandText);

            try

            {

                connection.Open();

         command.ExecuteNonQuery();

            }

            catch (OleDbException ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                connection.Close();

            }

        }

    }

}

حقيقة هذا الكود مزعج كثيراً ولا أحبذه ، وتصور لو انك لك قاعدة بيانات لها عشرون او ثلاثون حقل .

كيف سيكون شكل هذا الكود حينها...!

لذلك يمكننا التغلب على هذه المشكلة بواسطة هذا الكلاسس والذي أعددناه من اجل ذلك.

هذا الكلاسس مهمته هي استقبال الحقول والبيانات منك وإعادة جملة SQL المطلوبة أنظر للشكل التالي :

VB Code

 Public Class Class2

    Dim mFeilds As New Collection

    Dim MValue As New Collection

    ''' <summary>

    ''' أدخل أسم الحقل والقيمة التي تتبعه

    ''' </summary>

    Public WriteOnly Property Fileds(ByVal FeildName As String) As Object

        Set(ByVal value As Object)

            mFeilds.Add(FeildName)

            MValue.Add(value)

        End Set

    End Property

    ''' <summary>

    ''' تعود لك بجملة Sql المطلوبة للتعديل

    ''' </summary>

    Public Function SqlUPdate(ByVal Mtabel As String, ByVal MField As String, ByVal TValue As Object) As String

        Dim k As String

        k = "Update " & Mtabel & " Set "

        For t As Integer = 1 To mFeilds.Count

            If TypeOf MValue(t) Is Integer Then

                k &= mFeilds(t) & "=" & MValue(t) & " "

            Else

                k &= mFeilds(t) & "='" & MValue(t) & "' "

            End If

        Next

        If TypeOf TValue Is Integer Then

            k &= " where " & MField & "=" & TValue

        Else

            k &= " where " & MField & "='" & TValue & "'"

        End If

        Return k

    End Function

    ''' <summary>

    ''' تعود لك بجملة Sql المطلوبة لعملية الاضافة

    ''' </summary>

    Public Function SqlInsert(ByVal Mtabel As String) As String

        Dim k As String

        k = "Insert Into " & Mtabel & "("

        Dim n As Integer

        For t As Integer = 1 To mFeilds.Count

            If n = mFeilds.Count - 1 Then

                k &= mFeilds(t)

            Else

                k &= mFeilds(t) & ","

            End If

            n += 1

        Next

        k &= ") Value ("

        n = 0

        For t As Integer = 1 To MValue.Count

            If n = MValue.Count - 1 Then

                k &= MValue(t)

            Else

                k &= MValue(t) & ","

            End If

            n += 1

        Next

        k &= ")"

        Return k

    End Function

End Class

قبل ان اتحدث عنه سنرى طريقة التعامل معه أنظر للشكل التالي :

        Dim SQL As New Class2

        SQL.Fileds("Mname") = "Ali Qnefo"

        SQL.Fileds("Mage") = 433

        SQL.Fileds("Address") = "Libya"

        SQL.Fileds("City") = "Zentan"

        Me.TextBox1.Text =(SQL.SqlInsert("T1"))

كما تشاهد قمنا بتعريف الحقول وقيمها تم استدعينا الاجراء SqlInsert والذي يعود لنا بجملة SQL المطلوبة.

أنظر للنتيجة هنا.

  Insert Into T1(Mname,Mage,Address,City) Value (Ali Qnefo,433,Libya,Zentan)

هل رأيت ....!

انها تكتب كل شئ عنك وسيكون وجودها في الكود كما بالشكل التالي :

Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim SQL As New Class2

        SQL.Fileds("Mname") = "Ali Qnefo"

        SQL.Fileds("Mage") = 433

        SQL.Fileds("Address") = "Libya"

        SQL.Fileds("City") = "Zentan"

        Dim cmd As New OleDbCommand(SQL.SqlInsert("T1"), con)

        Try

            con.Open()

   cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

أعتقد انها صارت افضل بكثير الان ويمكن تتبع الاخطاء بسهولة فيها.

ان هذه الكلاسس تحتوي على التالي :

الخاصية Fileds وهي للكتابة فقط ولا يمكن القراءة منها تستقبل اسماء الحقول وقيمها.

الإجراء SqlInsert ويعود لنا بجملة SQL المطلوبة بمعلومية أسم الجدول والجملة خاصة باضافة سجل جديد

الإجراء SqlUpdate ويعود لنا بجملة SQL المطلوبة بمعلومية أسم الجدول واسم الحقل المطلوب وقيمته لفرز السجلات والجملة المعادة خاصة بعملية تعديل البيانات.

لنأخذ مثالاً عن عملية التعديل أنظر للشكل التالي :

        Dim SQL As New Class2

        SQL.Fileds("Mname") = "Ali Qnefo"

        SQL.Fileds("Mage") = 433

        SQL.Fileds("Address") = "Libya"

        SQL.Fileds("City") = "Zentan"

         Me.TextBox1.Text = SQL.SqlUPdate("T1", "Mname", Me.Text)

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

اما الجملة المعادة فستكون كما بالشكل التالي :

  Update T1 Set Mname='Ali Qnefo' Mage=433 Address='Libya' City='Zentan'  where Mname='Form1'

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

ولاحظ بهذا المثال سيتم تعديل البيانات للسجل الذي الحقل Mname له يحتوي على القيمة Form1 مثلاً على سبيل المثال فقط

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

عادي تصير.

ولذلك يصبح كود تعديل البيانات كما بالشكل التالي :

Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim SQL As New Class2

        SQL.Fileds("Mname") = "Ali Qnefo"

        SQL.Fileds("Mage") = 433

        SQL.Fileds("Address") = "Libya"

        SQL.Fileds("City") = "Zentan"

        Dim cmd As New OleDbCommand(SQL.SqlUPdate("T1", "Mname", Me.Text), con)

        Try

            con.Open()

   cmd.ExecuteNonQuery()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

حسناً ربما لازال هناك الكثير من الكود الذي ستضطر الى كتابته.

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

وتفادي تصحيح الاخطاء.

أذا انت تبحث عن هذه الكلاسس والتي اعددتها ايضاً لمثل هذا الغرض أنظر للشكل التالي :

 Imports System.Data.OleDb

 Public Class ADODB

    Dim ConStr As String

    Dim con As New OleDb.OleDbConnection

    Dim mFeilds As New Collection

    Dim MValue As New Collection

    Dim Mtabel As String

    ''' <summary>

    ''' ارسل اسم الحقل وقيمته

    ''' </summary>

    Public WriteOnly Property Fileds(ByVal FeildName As String) As Object

        Set(ByVal value As Object)

            mFeilds.Add(FeildName)

            MValue.Add(value)

        End Set

    End Property

    ''' <summary>

    ''' سلسة الاتصال المطلوبة لاجراء اتصال بقاعدة البيانات

    ''' </summary>

    Public Property ConnectionString() As String

        Get

            ConnectionString = ConStr

        End Get

        Set(ByVal value As String)

            ConStr = value

        End Set

    End Property

    ''' <summary>

    ''' اجراء التعديل ارسل اسم الجدول واسم الحقل الذي سنفرز البيانات به وقيمته

    ''' </summary>

    Public Sub Edit(ByVal Tabel As String, ByVal Tfield As String, ByVal Tvalue As Object)

        Mtabel = Tabel

        Dim ConString As String = ConStr

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

        Dim Str As String = SqlUPdate(Tabel, Tfield, Tvalue)

        Dim cmd As New OleDbCommand(Str, con)

        Form1.TextBox1.Text = Str

        Try

            cmd.ExecuteNonQuery()

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

    ''' <summary>

    ''' ارسل جملة الاستعلام

    ''' </summary>

    Public Function Dataset(ByVal SQL As String) As DataSet

        Dim ConString As String = ConStr

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim ds As New DataSet()

        Dim da As New OleDbDataAdapter(SQL, con)

        Try

            con.Open()

            da.Fill(ds)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

        Return ds

    End Function

    ''' <summary>

    ''' اجراء الاضافة ارسل اسم الجدول

    ''' </summary>

    Public Sub AddNew(ByVal Tabel As String)

        Mtabel = Tabel

        Dim ConString As String = ConStr

        Dim con As New OleDb.OleDbConnection(ConString)

        con.Open()

        Dim Str As String = SqlInsert(Tabel)

        Dim cmd As New OleDbCommand(Str, con)

        Try

            cmd.ExecuteNonQuery()

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

    Private Function SqlUPdate(ByVal Mtabel As String, ByVal MField As String, ByVal TValue As Object) As String

        Dim k As String

        k = "UPDATE " & Mtabel & " SET "

        For t As Integer = 1 To mFeilds.Count

            If t = mFeilds.Count And TypeOf MValue(t) Is Integer Then

                k &= mFeilds(t) & "=" & MValue(t) & ", "

            ElseIf t = mFeilds.Count And TypeOf MValue(t) Is String Then

                k &= mFeilds(t) & "='" & MValue(t) & "' "

            ElseIf t <> mFeilds.Count And TypeOf MValue(t) Is Integer Then

                k &= mFeilds(t) & "=" & MValue(t) & ", "

            ElseIf t <> mFeilds.Count And TypeOf MValue(t) Is String Then

                k &= mFeilds(t) & "='" & MValue(t) & "', "

            End If

        Next

        If TypeOf TValue Is Integer Then

            k &= " where (" & MField & "=" & TValue & ")"

        Else

            k &= " where (" & MField & "='" & TValue & "')"

        End If

        mFeilds.Clear()

        MValue.Clear()

        Return k

    End Function

    Private Function SqlInsert(ByVal Mtabel As String) As String

        Dim k As String

        k = "Insert Into " & Mtabel & " ("

        Dim n As Integer

        For t As Integer = 1 To mFeilds.Count

            If n = mFeilds.Count - 1 Then

                k &= mFeilds(t)

            Else

                k &= mFeilds(t) & ","

            End If

            n += 1

        Next

        k &= ") Values ("

        n = 0

        For t As Integer = 1 To MValue.Count

            If n = MValue.Count - 1 Then

                k &= "'" & MValue(t) & "'"

            Else

                k &= "'" & MValue(t) & "',"

            End If

            n += 1

        Next

        k &= ")"

        mFeilds.Clear()

        MValue.Clear()

        Return k

    End Function

    Public Function GetTables() As Collection

        Dim row As DataRow

        Dim vb As New Collection

        Dim connectionString As String = ConStr

        Using connection As New OleDb.OleDbConnection(connectionString)

            connection.Open()

            Dim table As DataTable = connection.GetSchema("TABLES")

            For Each row In table.Rows

                If row("TABLE_TYPE") = "TABLE" Then

                    vb.Add(row("TABLE_NAME"))

                End If

            Next

        End Using

        Return vb

    End Function

    Public Function GetFileds(ByVal Mtabels As String) As Collection

        Dim ds As New DataSet

        Dim vb As New Collection

        Dim tbl As System.Data.DataColumn

        Dim DB As New OleDb.OleDbDataAdapter("select * from " & Mtabels, ConStr)

        Using connection As New OleDb.OleDbConnection(connectionString)

            connection.Open()

            DB.Fill(ds, Mtabels)

            For Each tbl In ds.Tables(Mtabels).Columns

                vb.Add(tbl.Caption)

            Next

        End Using

        Return vb

    End Function

End Class

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

ألان انتقل الى حدث تحميل النموذج واكتب فيه التالي:

 Public Class Form1

    Dim ADODB As New ADODB

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ADODB.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db2.mdb "

    End Sub

End Class

لاحظ اننا اشتققنا فئة جديدة من الفئة التي أعددناها قبل قليل بقسم التصاريح العامة.

وفي الحدث تحميل للنموذج قمنا بتعريف سلسلة الاتصال .

الان تصور اننا نريد ان نضيف سجل جديد الى قاعدة البيانات سنكتب التالي:

        ADODB.Fileds("ItemName") = "wwwww"

        ADODB.Fileds("Groubname") = 6

        ADODB.Fileds("codename") = "wwwww"

        ADODB.AddNew("t1")

فقط ولا شئ غير ذلك وسيتم اضافة البيانات الى قاعدة البيانات.

ان الفئة السابقة تقوم بفتح الاتصال وإنشاء الكائنات وربطها وتنفذ لك العملية وتغلق الاتصال وانت متكئ ترتشف الشاي.

كل ما هو مطلوب اسم الحقل والقيمة التي تود حفظها تم استدعاء الطريقة AddNew والتي تتطلب اسم الجدول فقط.

حسناً والان نريد ان نقوم بتعديل البيانات أنظر للشكل التالي :

        ADODB.Fileds("ItemName") = "opopop"

        ADODB.Fileds("Groubname") = 6

        ADODB.Fileds("codename") = "wwwww"

        ADODB.Edit("t1", "Itemname", Me.TextBox1.Text)

نفس الطريقة السابقة ولكن نقوم باستدعاء الاجراء Edit لتعديل البيانات.

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

أي ان فئتنا ستنشئ جملة SQL ستكون كما بالشكل التالي:

  UPDATE t1 SET ItemName='opopop', Groubname=6, codename='wwwww'  where (Itemname='wwwww')

ان الحقل المضلل باللون الاصفر هو الحقل المطلوب والقيمة هي المضللة باللون الاصفر كذلك.

هذا حتى تدرك المغزى من استخدام تلك الحقول فقط.

كذلك يمكننا قراءة اي حقول كما بالشكل التالي :

        Dim ds As New DataSet

        ds = ADODB.Dataset("Select * from t1")

        For Each Row As DataRow In ds.Tables(0).Rows

            ListBox1.Items.Add(Row("ItemName").ToString)

        Next

ان الإجراء Dataset يعود لنا بكائن Dataset ويتطلب جملة استعلام كما بالشكل.

بعدها يمكننا قراءة أي صفوف او أعمدة بشكل طبيعي جداً.

كما من الممكن استخدامها مع الـ DataGrideView كما بالشكل التالي:

        Dim k As New DataSet

        k = ADODB.Dataset("Select * from t1")

        DataGridView1.DataSource = k.Tables(0)

كذلك يوجد إجراء GetTables يعود لنا بأسماء كل الجداول التي بقاعدة البيانات كما بالشكل التالي:

        Dim Value As Collection = ADODB.GetTables

        For t As Integer = 1 To Value.Count

        Me.ListBox1.Items.Add(Value.Item(t))

        Next

او الإجراء GetFildes الذي يعود لنا بكل الحقول بمعلومية أسم الجدول كما بالشكل التالي :

       Dim Value As Collection = ADODB.GetFileds("t1")

        For t As Integer = 1 To Value.Count

            Me.ListBox1.Items.Add(Value.Item(t))

        Next

ما رأيك الان الأمر أصبح أسهل بكثير.

الفئة مفتوحة المصدر ويمكنك تطويرها بالشكل الذي يناسب احتياجاتك.

كما اذا أردت ان تضيف إجراء يقراء لك الصور من قاعدة البيانات فيمكنك ان تكتبه بهذا الشكل:

      Public Function ReadImage(ByVal MByre As Byte())

        Dim s As New IO.MemoryStream

        Dim cv As Byte() = MByre

        Dim i As Integer

        Using s

            For i = 0 To cv.Length - 1

                s.WriteByte(CByte(cv(i)))

            Next i

            Return Image.FromStream(s)

        End Using

    End Function

إجراء ReadImage يتطلب صورة في شكل بيانات ثنائية وطبعاً لنجلب تلك البيانات من قاعدة البيانات سنستخدم اجراء موجود مسبقاً.

الإجراء Dataset حيث نحدد السجل الذي نريد ان نتعامل معه من خلال جملة الاستعلام تم من الكائن Dataset نرسل بيانات الحقل المطلوب والذي يحتوي بيانات الصورة.

        Dim ds As New DataSet

        ds = ADODB.Dataset("Select * from t1 where itemname='StoreImage'")

        PictureBox1.Image = ADODB.ReadImage(ds.Tables(0).Rows(0).Item(3))

والباقي سوف تتكفل به الـ MemoryStream وترسل لنا الصورة على طبق من النايلون.

لا تحاول إظهار صور قد قمت بإضافتها يدوياً من الخلال برنامج الأكسس لأنها لن تظهر لك وستحصل على خطاء.

والسبب هو ان برنامج الأكسس يحفظها بصيغة مختلفة قليلاً .

ولذلك يتوجب عليك إضافتها من خلال الفيجوال ستوديو.

ويمكنك ذلك بواسطة هذا الكود:

Dim PictureByte As Byte()

PictureByte = My.Computer.FileSystem.ReadAllBytes("Path File Name")

عرفنا متغير على انه مصفوفة ثنائية تم تركنا FileSystem تقراء كل بايت في الصورة وتضع الكل بمتغيرنا.

لم يتبقى الا ان تضع هذه البيانات في الحقل المطلوب في عملية إضافة او تعديل.

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

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

والطريقة هي عن طريق استخدام FileSystem والطريقة WriteAllBytes

  My.Computer.FileSystem.WriteAllBytes("c:\MyPic.jpg", CType(.Fields("picImage").Value, Byte()), True)

  Dim MBmp As New Bitmap("c:\MyPic.jpg")

  PictureBox1.Image = MBmp

ولكنني أفضل التعامل مع الـ MemoryStream

ملاحظة : يفضل جعل كل الحقول في قاعدة البيانات من النوع String أي نص تم التعامل مع القيم المختلفة من داخل البرنامج.

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

والله الموفق


قواعد البيانات Database

اذا كنا تحدث عن تطبيقات تعمل تحت نظام التشغيل Windows فانا أفضل التعامل مع البيانات عن طريق Adodb لانها مفهومة للأغلبية وشبيه بالتقنية القديمة Dao بعض الشئ.

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

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

من القائمة Project أختر الامر Add Reference لترى هذه النافذة.

لاحظ ان مسار الملف هذا من Path لا يتبع حزمة Framework ولذلك لا تضمن وجوده على أجهزة الآخرين، في العادة اذا قمت بتنصيب Microsoft Office فسوف يتم إضافة هذا الملف.

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

بعد ذلك سننشئ شفرة الاتصال.

Dim cur_path As String = My.Computer.FileSystem.CurrentDirectory

Public Con As ADODB.Connection

Public rst As ADODB.Recordset

Public cmd As ADODB.Command

    Public Sub connect()

        Con = New ADODB.Connection

        Con.CursorLocation = ADODB.CursorLocationEnum.adUseClient

        Con.Open("Provider=Microsoft.Jet.OLEDB.4.0; _

        Data Source=" & cur_path & "\DatabaseName.mdb;Persist Security Info=true"

    End Sub

يجب ان تضع هذا الكود في Module وذلك ليتم الاتصال به مرة واحدة، فانت لا تريد ان تتصل بهذا الاجراء كلما اردت ان تفعل شيئاً مع قاعدة البيانات.

لاحظ اول سطر اننا نعرف متغير هناك لنظع فيه مسار مجلد البرنامج، اما الثاني متغير الاتصال، والثالث يرمز الى السجل، والرابع الامر.

تم لدينا الاجراء Connect الذي يقوم بالاتصال ولاحظ مسار قاعدة البيانات واسمها، عليك بتغيير DatabaseName باسم ملف قاعدة البيانات خاصتك، ويجب ان تضعها الى جانب الملف التنفيذي الموجود في المجلد Bin في المجلد Debug .

قراءة الحقول من قاعدة البيانات.

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("TabelName")

                Textbox1.Text = .Fields("groubname").Value

                Textbox2.Text = .Fields("itemname").Value

                Textbox3.Text = .Fields("codename").Value

            End With

هذا كل ما تحتاج لقراءة الحقول، الاسطر من اول سطر حتى السطر الذي فيه TabelName ستكتبها دائماً وهي متغيرات لا بد منها لاجراء الاتصال.

اما TabelName فقم تغييره الى اسم الجدول الذي تريد ان تتصل به.

وبعدها لدينا ثلاث ادوات نص تقوم على استقبال القيم من الحقول وهي، groubname - itemname - codename

وهذا كل شئ ولكن نحتاج الى تعديل بسيط، وهو معالجة الاخطاء التي تحدث ولذي سنغيره الى الشكل التالي:

        Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("TabelName")

                Textbox1.Text = .Fields("groubname").Value

                Textbox2.Text = .Fields("itemname").Value

                Textbox3.Text = .Fields("codename").Value

            End With

        Catch ex As Exception

            Finally

            Con.close()

        End Try

اضفنا العبارة Try لمزيد من المعلومات عن هذه العبارة راجع الدروس الاخرى، كما نقوم باغلاق الاتصال فيما بعد وهذا افضل مكان له وهو فيه الـ Finally حيث سيتم تنفيذ هذا الكود بكل الاحوال سوى حدث خطاء ام لم يحدث.

حسناً الان نريد طريقة اضافة حقول جديدة.

   Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("TabelName")

                .AddNew()

                .Fields("groubname").Value = Textbox1.Text

                .Fields("itemname").Value = Textbox2.Text

                .Fields("codename").Value = Textbox3.Text

                .Update()

            End With

        Catch ex As Exception

            Finally

            Con.close()

        End Try

لايختلف كثيراً عن سابقه، ولكن لاحظ عبارة Add New والتي تقوم باضافة سطر جديد باخر قاعدة البيانات.

تم قمنا بوضع وبكل حقل القيمة من ادوات النص الثلاث.

تم قمنا بتحديث البيانات.

والان نريد الطريقة لتعديل البيانات.

   Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("TabelName")

                .Fields("groubname").Value = Textbox1.Text

                .Fields("itemname").Value = Textbox2.Text

                .Fields("codename").Value = Textbox3.Text

                .Update()

            End With

        Catch ex As Exception

            Finally

            Con.close()

        End Try

نفس الكود السابق مع فارق ان عبارة Add New غير موجودة.

وحقيقة انا لا احب الفصل بين كود الاضافة والتعديل وخاصة انهما نفس الكود تقريباً ، ولتفعل ذلك أنظر للمثال التالي:

Private Sub AddEdit(ByVal State As String)

            Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                   If State = "edit" Then

                    .Open("TabelName")

                   Else

                    .AddNew()

                   End If

                .Fields("groubname").Value = Textbox1.Text

                .Fields("itemname").Value = Textbox2.Text

                .Fields("codename").Value = Textbox3.Text

                .Update()

            End With

        Catch ex As Exception

            Finally

            Con.close()

        End Try

 End Sub

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

لاحظ الجملة الشرطية If سوف تختبر الوسيط State اذا كان تعديل ستقوم بفتح الجدول المحدد، اما اذا كان اضافة فسوف تقوم باضافة سطر جديد في نهاية قاعدة البيانات.

وبذلك نضرب عصفورين بحجر واحد.

والان طريقة الحذف.

         Try

            cmd = New ADODB.Command

            With cmd

                .ActiveConnection = Con

                .CommandType = ADODB.CommandTypeEnum.adCmdText

                .CommandText = "delete from TableName where FiledName = '" & Trim(TextBox7.Text) & "'"

                .Execute()

            End With

            cmd = Nothing

        Catch ex As Exception

            MsgBox(ex.Message)

            Finally

            Con.close()

        End Try

الامر يتم عن طريق جملة Sql تلك، قم بالتغيير فيها على حسب ما تريد، ولاحظ ان FiledName يتم تحديده عن طريق TextBox7

وفي لغة Sql كل التعبيرات التي قد تحتاجها.

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

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

Dim PictureByte As Byte()

PictureByte = My.Computer.FileSystem.ReadAllBytes(OpenFileDialog1.FileName)

كما تشاهد عرفنا متغير من النوع Byte لتخزين البيانات فيه ، تم قمنا بجلب الصورة بواسطة الأداة OpenFileDialog1 ولمزيد من المعلومات عن هذه الأداة يمكنك مراجعة الدرس الخاص بكيفية التعامل مع الأدوات، وأيضا قمنا بتحويل الملف الى بيانات ثنائية وفي شكل مصفوفة ووضعناها في المتغير، وبعدها كل ما هو عليك وضع هذه البيانات في الحقل المخصص لحفظ الصورة.

ويجب ان يكون الحقل من نوع بيانات ثنائية طويلة.

والان كيف يمكننا الحصول على الصورة من قاعدة البيانات.

الطريقة الأولى كما بالشكل التالي:

   rst = New ADODB.Recordset

        With rst

            .ActiveConnection = Con

            .CursorLocation = ADODB.CursorLocationEnum.adUseClient

            .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

            .LockType = ADODB.LockTypeEnum.adLockOptimistic

            .Open("ImageStore")

            My.Computer.FileSystem.WriteAllBytes("c:\MyPic.jpg", CType(.Fields("picImage").Value, Byte()), True)

            Dim MBmp As New Bitmap("c:\MyPic.jpg")

            PictureBox1.Image = MBmp

        End With

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.close()

        End Try

بهذا المثال يتم استخلاص الصورة من قاعدة البيانات في المسار المحدد تم ربطها بأداة الصورة عندنا.

أنظر إلى هذا المثال والذي لا يقوم بنسخ الصورة على القرص الصلب وانما يتعامل معها بالذاكرة.

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

        Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("Select * from employee Where empname = '" & e.Item.Text & "'")

                Dim s As New IO.MemoryStream

                Dim cv As Byte() = .Fields("PicImage").Value

                Dim i As Integer

                Using s

                    For i = 0 To cv.Length - 1

                        s.WriteByte(CByte(cv(i)))

                    Next i

                    picImage.Image = Image.FromStream(s)

                End Using

                .Close()

            End With

        Catch ex As Exception

            Finally

            Con.close()

            End If

        End Try

لاحظ ان الحقل الذي به الصورة أسمه PicImage، عرفنا متغير CV من النوع Byte ووضعنا به البيانات التي بالحقل، كما عرفنا متغير S من النوع MemoryStream لوضع البيانات فيه بالتنسيق المطلوب، واستخدمنا الامر For لرصف البيانات فيه، وأخيراً وضعنا الصورة التي بالذاكرة في اداة الصورة الخاصة بنا، والامر Using ليقوم بقتل الكائن عند الانتهاء منه حتى لا تبقى هذه البيانات بالذاكرة.

واريد ان أريك لمسة جمالية، فيمكنك مثلاً أستخدام هذه الطريقة التي استخدمتها ذات مرة، حيث اقوم بعرض الصورة في اداة Picture خلفيتها جهاز تلفزيون، واذا كانت الصورة موجودة تم عرضها واذا لم تكن موجودة تم عرض الصورة والتي تعطي انطباعاً بضياع الاشارة أنظر الشكل التالي.

كما يمكنك ربط الاداة DataGridView بهذه الطريقة:

 Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("TabelName")

                DataGridView1.DataSource = .DataSource

            End With

        Catch ex As Exception

        Finally

            Con.close()

End Try

لاحظ السطر الذي قمنا باضافته لربط الاداة بالبيانات.

أيضاً يمكنك التعامل مع هذه المكتبة بطريقة أخرى.

أنقر على شريط الادوات بزر الفأرة الايمن وأختر العنصر Choose Items كما تشاهد بالصورة:

طبعاً يمكنك مراجعة الدرس الخاص بشريط الادوات لمزيد من التفاصيل.

بعدها سوف تجد نفسك بهذه النافذة كما بالشكل التالي:

الان أنظر الى الخيار ADODC الموجود بالصف الرابع تقريباً.

كل ماهو مطلوب منك تحديده الان والنقر على الزر Ok .

اذا نظرت بشريط الأدوات ستجد انه قد تم إضافة الأداة كما بالشكل التالي :

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

ربما هذا أفضل ، فهناك من يحبذ العمل مع أشياء مرئية ومحسوسة له بدل من التعامل مع شفرات و اكواد.

على العموم هذه نظرة سريعة على بعض الخصائص لها أنظر للشكل التالي :

توجد العديد من الخصائص والتي يمكن ضبطها من هنا اذا أردت.

لقد رأيت كيف تعاملنا مع البيانات بالأمثلة سابقاً بطريقة مشابهة تماماً يمكننا العمل مع هذه الأداة هنا لاحظ التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Con As ADODB.Connection

        Try

            Con = New ADODB.Connection

            Con.Open(" Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb")

            With Adodc1.Recordset

                .ActiveConnection = Con

                .Open("t1")

                TextBox1.Text = .Fields("groubname").Value

                TextBox2.Text = .Fields("itemname").Value

                TextBox3.Text = .Fields("codename").Value

            End With

        Catch ex As Exception

        Finally

            Con.Close()

        End Try

    End Sub

End Class

قمنا بقراءة البيانات واغلقنا الاتصال.

اعتقد ان الامر واضح وسهل جداً.

والان يمكنني ان ازيدك طريقة أخرى وهي اضافة هذا المكون والذي يعتمد على ثقنية Com للتعامل مع البيانات.

أنقر على شريط الادوات بزر الفأرة الايمن وأختر العنصر Choose Items كما تشاهد بالصورة:

طبعاً يمكنك مراجعة الدرس الخاص بشريط الادوات لمزيد من التفاصيل.

بعدها سوف تجد نفسك بهذه النافذة كما بالشكل التالي:

حسناً اذا نظرت الى التبويب بالاعلى فسوف ترى احدها بالاسم COM أنقر عليه وابحث عن هذه المكتبة كما بالشكل :التالي :

هذه هي مكتبة Ado والتي يمكنها التعامل مع العديد من قواعد البيانات مثل .

Access -Oracle - Sql Server

وهي من المكتبات القوية جداً.

حسناً أنقر على Ok تم قم بسحبها من شريط الادوات على النموذج أنظر للشكل التالي :

وهذه هي على النموذج :

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

أنقر على الخيار الاول وسوف تظهر لك هذه النافذة كما بالشكل التالي :

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

والسبب هو أنني استخدم أكس بي عربية وليست معربة، وعلى العموم لاتهتم لذلك لن تحتاج الى تلك الازرار كثيراً.

الان ما يهمنا هو المحدد بالخط الاحمر الـ Connection String كنت تعلم سابقاً اننا قمنا بكتابة هذه الخطوات يدوياً.

أما الان فلن نكتب شيئاً.

أنقر على الزر Build لتشاهد هذه النافذة :

من هنا سنحدد موفر البيانات المطلوب ، وهذا يعتمد على نوع قاعدة البيانات التي سوف نتعامل معها

طبعاً نححن نتعامل مع قاعدة البيانات Access ولذلك سنستخدم الخيار المحدد بالصورة السابقة وهو Microsoft Jet 4.0 Ole DB Provider

أنقر على التالي لتكون بهذا المكان كما بالشكل التالي :

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

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

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

أنقر موافق لتعود الى النافذة السابقة وحدد الخيار RecordSource كما بالشكل التالي :

بهذا المكان المطلوب منا هو تحديد الجدول المراد التعامل معه او احدى الطرق للتعامل مع الجداول أنظر للشكل التالي :

ان الخيار adCmdText سيمكنك من كتابة جملة Sql المناسبة كما ترى بالاسفل.

ولكن الخيار الامثل للجميع غالباً هو adCmdTable والذي يقوم بجلب كل الجداول بقاعدة البيانات وعرضها هنا كما بالشكل التالي :

يمكن الان تحديد الجدول المطلوب وهنا ليس عندنا الا جدول واحد فقط نحدده وهو T1 وأنقر الزر موافق.

اذا ذهبت الى نافذة الخصائص الان للاداة فستجدها ماشاء تزخر بالحياة.

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

وتبقى عالقة مسببة ازعاجاً كل ماهو مطلوب منك النقر على السهم الصغير مرة أخرى.

والان يمكنك التعامل مع المكتبة بشكل طبيعي كما كنت تفعل مع الاداة ADODC سابقاً.

مع انني انصح بالطريقة الاولى.

أما الان فدعنا نستعرض بعض جمل SQL التي يمكنها ان تفيدك في العمل وتفهم فكرة العمل، واين تجد كلمة TabelName فهي تعني أسم الجدول الذي يجب ان تحدده، وايضاً FiledName وتعني اسم الحقل الذي يجب ان تحدده.

Select * From TabelName

تقوم بتحديد جميع الحقول بالجدول المحدد

Select Filed1,Filed2 From TabelName

تقوم بتحديد الحقلين المحددين من الجدول المحدد

Select * From TabelName Where FiledName='Any Value'

استخدام العبارة Where وتعني حيث اي تحديد كل الحقول من الجدول المحدد اذا كان الحقل المحدد يساوي القيمة الموضوعة

Select * From TabelName Where FiledName=12345

نفس الجملة السابقة ولكن هذه تستعمل مع الحقل من النوع Integer وبدون علامات التنصيص

Select * From TabelName Where FiledName='Any Value' or FiledName='any value'

استخدام العبارة Or

Select * From TabelName Where FiledName='Any Value' And FiledName='any value'

أستخدام العبارة And ، حقيقة يمكنك وضع ما تريد من الشروط

Select * From TabelName Where FiledName=(Select FiledNmame From TabelName Where FiledName='Any Valu e')

تحديد مجموعة من الحقول بمعلومية حقول من جدول أخر

Select * From TabelName Where FiledName In (99,11,12,231)

تحديد الحقول التي قيمتها تقع من ظمن هذه القيم، ويمكنك استخدام Not In بمعنى لا تقم من ضمن هذه القيم.

Select * From TabelName Where FiledName='%A'

تحديد كل الحقول التي تبدأ بحرف A

Select * From TabelName Where FiledName > 123

كل الحقول التي الحقل المحدد فيها قيمته اكبر من 123 طبعاً يمكنك استخدام < - > او الاثنين معاً

Delete * From TabelName

حذف كل الحقول بالجدول المحدد

Delete * From TabelName Where FiledName='Any Value'

حذف كل الحقول التي الحقل المحدد فيها يساوي القيمة المحددة، وطبعاً يمكنك استخدام نفس المعاملات السابقة لجعل الجملة تلبي طلبك بدقة.

ولكن أين تضع جملة Sql هذه فيما يخص تحديد الحقول انظر التالي:

   Try

            rst = New ADODB.Recordset

            With rst

                .ActiveConnection = Con

                .CursorLocation = ADODB.CursorLocationEnum.adUseClient

                .CursorType = ADODB.CursorTypeEnum.adOpenDynamic

                .LockType = ADODB.LockTypeEnum.adLockOptimistic

                .Open("Select * From TabelName Where FiledName > 123")

                Textbox1.Text = .Fields("groubname").Value

                Textbox2.Text = .Fields("itemname").Value

                Textbox3.Text = .Fields("codename").Value

                .Update()

            End With

        Catch ex As Exception

             Finally

            Con.close()

        End Try

أنظر الى هذا اننا نستورد حقولاً بشرط معين، واذا كتبنا اسم الجدول فقط فهذا يعني أننا سنتورد كل الحقول وهذه تعني ايضاً كل الحقول Select * From TabelName


البناءات Enum

التقارير Crystal Reports

أي مبرمج يعلم ان هذا أهم جزء فيما يتعلق بالبرمجة.

على الأقل فيما يتعلق ببرمجة قواعد البيانات.

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

ولا يكفي ان تكون البيانات مخزنة بجهاز الكمبيوتر.

لذلك سنضع درساً هنا عن كيفية إعداد التقارير.

أولاً ولكي ننشئ تقريراً نحتاج الى الاتصال بقاعدة البيانات وجلبها الى مشروعنا.

من القائمة Data أختر Add New Datasourse

اذا لم تكن تعلم كيف تفعل ذلك فارجوا مراجعة الدرس الخاص بهذا تحت عنوان DataSource .

طالعه وادرسه أولا تم تعال الى هنا وتابع الدرس.

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

عند اضافة قاعدة البيانات الى البرنامج فسيمكننا ان نرى كل الجداول كما بالشكل التالي :

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

C:\Program Files\Microsoft Visual Studio\VB98

وأسمها : BIBLIO

أذا جاء الان دور اضافة تقرير جديد.

من القائمة Project وكما تعلمت سابقاً أختر Add New Item لتطالعك النافذة التالي :

حدد الخيار Crystal Report كما بالصورة زأنقر الزر Add لتطالعك النافذة التالية :

الخيار الاول : Using The Report Wizard

وهو معالج سياخذك في جولة قصيرة لاعداد تقريرك بالشكل المطلوب.

الخيار الثاني : As a Blank Report

لانشاء تقرير فارغ

الخيار الثالث : لانشاء تقرير من تقرير موجود مسبقاً.

اما تحت العنوان Choose an Expert فتوجد القوالب التي من الممكن ان نتعامل معها كل حسب وضيفتها.

على العموم الخيار Standerd هو خيارنا الان .

وكذلك Using The Report Wizard هو الخيار الامثل الان.

وبعدها أنقر على الرز Ok فتطالعك النافذة التالية :

كما ترى يمكننا من هنا الان تحديد الجدول الذي نريد ان نتعامل معه.

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

كما يمكنك نقل أكثر من جدول بحال كنت ستتعامل مع اكثر من جدول.

والا وقبل ان أكمل ماذا لو اننا لم نتصل بالقاعدة البيانات كما فعلنا سابقاً ...؟

عندها يمكننا من هنا تحديد الخيار Create New Connection والذي سيقوم بعمل اتصال جديد.

أنظر للشكل التالي :

كما ترى وبما اننا نتعامل مع قاعدة بيانات Access حددنا الخيار Access/Excel وبعدها أنقر على الخيار Make New Connection نقرتين.

لتطالعك النافذة التالية :

حدد مسار قاعدة البيانات من Database Name تم أنقر أنهاء لتشاهد الجداول كما بالشكل التالي :

بنفس الطريقة يمكنك اضافة الجدول او الجداول التي تريد ان تتعامل معها.

والان بعد ان عدنا الى نفس المسار لنكمل الشرح .

طبعا سنحدد الجدول Publishers وننقر على التالي لتطالعنا النافذة التالية :

المطلوب الان تحديد الحقول التي نريدها ان تظهر بالتقرير عن طريق الازرار التالية :

الزر المحدد بالسهم الاحمر سيقوم بنقل الحقل المحدد الى جهة الحقول المطلوبة.

الزر المحدد باللون الازرق سيقوم بنقل كل الحقول الى جهة الحقول المطلوبة.

الزر المحدد باللون الاخظر سيقوم باعادة الحقل المحدد وإلغاءه من بين الحقول المطلوبة.

الزر المحدد باللون الاصفر يقوم باعادة كل الحقول.

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

هذه النافذة تطالب بحقل ليتم استخدامه في تجميع البيانات وسوف تفهم لماذا لاحقاً .

على العموم هذا أختياري لك مطلق الحرية.

ونحن الان سنحدد الحقل City وننقر على الزر التالي :

تم أنقر التالي مرة أخرى.

تم أنقر التالي مرة أخرى .

فتطالعك النافذة التالية :

من هذه النافذة يمكنك تحديد شكل التقرير الذي تريده، وبعدها أنقر إنهاء لتنتقل الى مصمم التقارير كما بالشكل التالي :

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

اذا اردت اضافة اي حقل أخر ليس موجودا فيمكنك ذلك من النافذة Field Explorer كما بالشكل التالي :

كما تحت العنوان Special Fields يمكنك استخدام وأدراج حقول مخصصة في تقريرك كما بالشكل التالي :

كما اذا نقرت على التقرير بزر الفأرة الأيمن فستطالعك القائمة التالية :

من الخيار Insert يمكنك ان تلاحظ ان هناك العديد من الاشياء التي من الممكن ان تستخدمها في تقريرك .

من Line وهو يسمح لك برسم الخطوط

Box لرسم مربعات.

Chart لادراج واستخدام الرسومات البيانية.

Picture لادراج صورة في التقرير

طبعا الحديث عن التقارير بشكل مفصل يحتاج الى كتاب لوحده.

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

كما توجد نافذة الخصائص والتي تمكنك من ضبط وربط الكثير من الادوات والحقول كما بالشكل التالي :

والان تقريرنا جاهز للعمل وكل ما علينا هو الانتقال الى النموذج ومن شريط الأدوات نقوم بإسقاط Crystal Report Viewer على النموذج كما بالشكل التالي :

بعدها وبحدث التحميل للنموذج نقوم بكتابة الكود التالي :

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated

        Dim Cry As New CrystalReport2

        Dim Str As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BIBLIO.mdb"

        Dim ds As New DataSet

        Dim con As New OleDbConnection

        Dim OleDbDataAdapter1 As New OleDbDataAdapter("select * from  Publishers", con)

        Try

            con.ConnectionString = Str

            con.Open()

            OleDbDataAdapter1.Fill(ds)

            Cry.SetDataSource(ds.Tables(0))

            CrystalReportViewer1.ReportSource = Cry

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

بداية إنشاء فئة جديدة من الكريستال بما انه مجرد كلاسس عادي.

تم إجراء اتصال بقاعدة البيانات، ويمكنك مراجعة الدروس الخاصة بالـ Ado.net

تم إسناد الجدول المحدد إلى التقرير بواسطة الخاصية Datasource

وكذلك ربط عارض التقارير بالفئة الجديدة والتي تم إنشاءها قبل قليل.

بالنهاية عند تشغيل البرنامج امكننا مطالعة التقرير كما بالشكل التالي :

هل تتذكر عندما كنا نستخدم المعالج في إنشاء هذا التقرير...؟

طلب منا اختيار حقل ليتم إنشاءه لتجميع البيانات.

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

بمعنى أخر اذا اخترت مثلاً New York فسيتم عرض كل البيانات التي فيها المدينة تساوي New York

طبعاً يمكنك التحكم في كم البيانات عن طريق جملة SQL من خلال الكود للقيام بفرز البيانات المطلوبة.

وايضاً اذا ذهبت الى مجلد المشروع وجدت ملف التقرير كما بالشكل التالي :

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

وكما انه يجب ان يكون على جهاز المستخدم حزمة FrameWork 2.0 كذلك يجب ان يكون عليه حزمة Crystal Report For .Net Framework 2.0

ويمكنك الحصول على هاذين الحزمتين من الفجوال ستوديو كما بالشكل التالي :

ولمزيد من المعلومات راجع الدرس الخاص بإعداد حزمة توزيع البرنامج.


Data Sources

هذه النافذة تمكنك من الاتصال بالبيانات بشكل مرئي اذا كنت تحبذ هذه الطريقة وتحتوي على الأوامر التالية :

من اليمين الى اليسار

الزر الأول: لتنشيط القائمة وإعادة إنعاشها.

الزر الثاني: اذا أردت إعادة التعديل في شكل البيانات المستورد او ما شابه.

الزر الثالث: اذا أردت ان تعدل في قاعدة البيانات مرئياً وباستخدام Designer

الزر الرابع: لاتصال بالبيانات ، أو إنشاء اتصال بيانات جديد.

قد لا تجد هذه النافذة وعندها من القائمة Data أختر الخيار Show Data Sourse لتظهر لك هذه النافذة.

قبل كل شئ يجب ان تكون لدينا قاعدة بيانات ومن برنامج Access قم بإنشاء قاعدة بيانات جديدة وجدول بالاسم T1 قم بإنشاء هذه الحقول فيه كما بالشكل التالي:

طبعاً هناك درس عن كيفية إنشاء قاعدة بيانات جديدة راجعه بحال لا تعرف كيفية إنشاء قواعد البيانات ببرنامج Microsoft Access .

والان دعنا ننشئ اتصالاً جديدً وبعد النقر على الخيار Add New Data Sourse سترى النافذة التالي:

ما يهمنا هو الخيار المحدد حالياً Database وأنقر Next

أختر New Connection لتطالعك النافذة التالية:

يمكنك من هنا اختيار نوع قاعدة البيانات التي سوف تتعامل معها وبحالنا هذه سوف نستخدم Access وأنقر على الزر Change لتطالعك النافذة التالية :

كما تلاحظ مزودات الخدمة لقواعد البيانات المختلفة وما يهمنا هنا هو مزود البيانات Access للتعامل مع قواعد البيانات Access حدده تم أنقر Ok .

ستعود الى النافذة السابقة كما بالشكل التالي:

يوجد امام اداة النص بالعنوان Database File Name الزر Browse وهو الزر الذي يمكنك منه تحديد ملف قاعدة البيانات خاصتك.

اذا كنت قد اقفلت قاعدة البيانات بكلمة مرور واسم مستخدم عليك ان تحددها هنا في الخانتين التاليتين:

User name-password وسوف نتحدث لاحقاً كيف يمكن انشاء قاعدة بيانات في Access وكيف يمكنك حمايتها بكلمة مرور واسم مستخدم.

عند تحديد ملف قاعدة البيانات يمكنك النقر على الزر Test Connection لاختبار الاتصال واذا ظهرت هذه الرسالة فهذا يعني ان كل شئ على ما يرام.

بعدها انقر على Ok وانقر على Ok مرة أخرى لنعود الى المكان الذي انطلقنا منه أول مرة:

لاحظ هنا مسار ملف قاعدة البيانات، وشفرة الاتصال كل شئ على مايرام انقر على التالي لتطالعك الرسالة التالية:

يقولون انك تستخدم ملف قاعدة بيانات ليس موجوداً بمجلد المشروع خاصتك فهل تريد نسخ الملف الى المجلد، بالتأكيد أنقر على الزر Yes لتطالعك النافذة التالية:

لا تغير أي شئ فهنا سيتم تخزين شيفرة الاتصال في ملف التهيئة للمشروع هذا ما يحدده مربع الاختيار، ولكن لحظة أريد ان اريك شيئاً ولذلك علينا العودة الى الخلف انقر على الزر Previous

هل تلاحظ التغيير الذي حدث في شيفرة الاتصال Connection String انظر الى ما بعد الأمر Data Source لقد تم تغيير مسار قاعدة البيانات بالتالي:

|DataDirectory| وهي تعني مجلد المشروع، وكنا نستخدمها في الفيجوال بيسك 6 App.path الأمر شبيه بالتالي قد تحتاجها مستقبلاً او في إعدادات التقارير فلا تنساها.

حسناً أنقر Next تم Next مرة أخرى لتطالعك النافذة التالية:

هذه هي الجداول الموجودة في ملف قاعدة البيانات خاصتنا وقد حددت الجدول T1 تم أنقر على الزر Finish وانظر إلى النافذة Data كما بالشكل:

صارت مليئة بالحقول والجداول دعنا نجرب الزر الثاني من اليمين وسوف يقوم بإعادتك من حيث أتيت بحال الرغبة في تعديل أي شئ.

للنقر على الزر الثالث وهو المسئول عن التعديل بواسطة Data Designer كما بالشكل.

لاحظ أسم الجدول والحقول بقاعدة البيانات، اذا نقرت على احد الحقول او الجدول فيمكنك ان ترى خصائصه بنافذة الخصائص كالتالي:

لست مضطرا إلى القيام بأي تعديلات على الحقول من برنامج Access يمكنك إجراء التعديلات من هنا، نوعية الحقل أسمه، هل مسموح تركه فارغاً Null الحجم الأقصى ، للقراءة فقط الخ..

أذا نقرت بزر الفأرة الأيمن فستطالعك القائمة التالية:

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

نفس برنامج Access تماماً اذا تعاملت معه.

الأمر Configure سوف يقودنا الى النافذة التالية:

لاحظ جملة الاستعلام المحددة والافتراضية والتي كتبها المعالج عند جلب البيانات وموجودة بالاسم، Fill GetData أسفل الجدول عد إلى الصورة لتشاهد ذلك.

يمكنك التعديل في جملة الاستعلام يدوياً أو اختيار Query Builder ليتم نقلك الى النافذة التالية:

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

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

اذا أردت ان تضيف استعلاماً جديدا يمكنك اختيار Query لتطالعك النافذة التالية.

أنقر التالي Next

من هنا يمكنك تحديد نوع الاستعلام الذي تريده هل هو تحديث ام حذف ام إضافة وغيره تم أنقر Next

فيتم نقلك إلى النافذة التي كنا فيها سابقاً لتحرير جملة الاستعلام حرر كما تشاء.

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

من القائمة المنسدلة Select an object to preview يمكنك تحديد الاستعلام المطلوب اذا قمت بإضافة العديد من الاستعلامات:

وبعدها انقر على الزر Preview لتطالعك البيانات .

حسناً دعنا ننهي هذه المهمة عد إلى النافذة Data source وانقر على احد الحقول ليتم عرض القائمة المنسدلة التابعة له كما بالشكل.

من هنا يمكنك تحديد ما هي الأداة التي تريدها ان تتعامل مع هذا الحقل، هل تريد للحقل الارتباط بأداة النص مثلاً Textbox.

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

هذا الحقل هو عبارة عن بيانات ثنائية ونريده لوضع بيانات الصورة فيه.

ولذلك حدد الخيار PictureBox لهذا الحقل.

كما يمكنك تحديد أداة معينة والحصول على أدوات أخرى عن طريق الخيار Customize كما بالصورة السابقة.

عندها ستحصل على هذه النافذة كما بالشكل التالي:

من تحت العنوان Associated Contrls يمكنك تحديد الأداة المناسبة ومن القائمة كما تشاهد.

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

طبعا قمت بترتيب الأدوات بهذا الشكل.

تم إضافة شريط أدوات ( T1BindingNavigator ) ليمكنك من الإضافة والتعديل والحذف، والتقدم الى الإمام والخلف وغيره.

وكذلك قارئ البيانات ومجموعة بيانات كذلك، ولزيادة فهم هذه الأدوات او الكائنات يمكنك مراجعة الدرس بالاسم Ado.net اما هنا فلسنا بصدد الحديث عنها .

وإنما كيف نتعامل مع البيانات بشكل مرئي فقط وبقليل من الكود.

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

اذا عدت الى النافذة Solution explorer فسوف تلاحظ ظهور ملف قاعدة البيانات و الـ Dataset وهي Class للتعامل مع قاعدة البيانات كما بالشكل التالي:

يمكنك ان تختار عرض كل الملفات كما تعلمت سابقاً لتطالعك النافذة كما بالشكل التالي:

أنقر على Dataset.designer لتتمكن من قراءة كامل الكود وتستفيد منه .

طبعاً اذا أردت وكانت لديك خلفية معقولة عن كيفية التعامل مع كائنات الاتصال.

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

ويحتاج إلى تدخل طفيف منا حتى يصبح برنامجاً ذا طابع احترافي نوعاً ما أنظر للشكل التالي:

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

بداية وقبل كل شئ قم بإخفاء شريط الأدوات ( T1BindingNavigator ) اجعل الخاصية Visable له تساوي False فمظهره بشع جداً.

ولا يمكن الاعتماد عليه بهذا المظهر.

سوف نصلح الأمور.

غير لون الخلفية للنموذج كما بالشكل واجعل لون الصورة وأدوات النصوص باللون الأسود ولون الخط باللون الأبيض.

ما تراه يمكنك ان تفعل مثله ولكن بخصوص الأزرار فيجب ان تبحث عن الخاصية Flat Appearince وستجد تحتها الخاصية FlatStyle اجعلها Flat .

طبعاً لكل الأزرار حتى يصبح شكلها مفلطح أنظر للشكل التالي :

غير هذه الخواص كما تراها بالشكل السابق.

واجعل الخلفية لكل الأزرار كما تراها بالصورة هنا :

المهم هو الحصول على المظهر المناسب والغير اعتيادي.

ألان جاء دور الاكواد والتدخل اليدوي.

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

والان عندنا أربعة أزرار تشير او تقوم بالعمل التالي:

الزر ورمزه | وظيفته
<< | ينقلنا الى أول السجل
< | السجل السابق
> | السجل التالي
>> | ينقلنا الى آخر سجل

أنقر على زر أول السجل واكتب فيه الكود التالي:

 T1BindingNavigator.MoveFirstItem.PerformClick()

وفي زر السابق اكتب التالي:

  T1BindingNavigator.MovePreviousItem.PerformClick()

وفي زر التالي اكتب التالي:

 T1BindingNavigator.MoveNextItem.PerformClick()

وفي زر اخر السجل اكتب التالي:

 T1BindingNavigator.MoveLastItem.PerformClick()

في زر الإضافة اكتب التالي:

 T1BindingNavigator.AddNewItem.PerformClick()

وفي زر تعديل عليك بجلب الكود الموجود سابقاً كما بالشكل التالي :

الكود الموجود بالحدث T1BundingNavigatorSaveItem فيصبح كالتالي:

 Me.Validate()

 Me.T1BindingSource.EndEdit()

 Me.T1TableAdapter.Update(Me.Db1DataSet.t1)

طبعاً لا داعي للكود الأول قم بقصه ولصقه بهذا المكان فقط.

وفي زر حذف اكتب التالي:

 T1BindingNavigator.DeleteItem.PerformClick()

وفي زر خروج اكتب التالي:

 End

وفي زر جلب صورة أكتب التالي:

 Dim Dialog As New OpenFileDialog

    Dialog.Filter = "All Support File;*.jpg;*.gif;*.png;*.bmp"

  If Dialog.ShowDialog = Windows.Forms.DialogResult.OK Then

    Me.PicPictureBox.Image = Image.FromFile(Dialog.FileName)

 End If

كل شئ يسير بشكل جيد ولكن ما زلنا بحاجة الى القليل من التعديلات فمثلاً يجب ان نخبر المستخدم ان التعديل قد تم على ما يرام كما بالشكل التالي :

 Try

  Me.Validate()

  Me.T1BindingSource.EndEdit()

  Me.T1TableAdapter.Update(Me.Db1DataSet.t1)

  MsgBox("تم حفظ البيانات بنجاح", MsgBoxStyle.Information, "حفظ البيانات")

 Catch ex As Exception

   MsgBox(ex.Message)

 End Try

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

ولذلك لا يجب ان يكون الزر بالاسم تعديل وإنما بالاسم حفظ ليكون مقبولاً.

أيضاً الحقل رقم المعرف يجب إلغاءه او جعله للقراءة فقط لأنه ترقيم تلقائي تقوم به قاعدة البيانات نيابة عنك.

كما بزر الحذف يجب إجراء هذا التغيير كما بالشكل التالي:

  Dim Value = MsgBox("هل انت متأكد من رغبتك في حذف السجل بالاسم" & Me.MnameTextBox.Text, MsgBoxStyle.OkCancel, "حذف سجل")

   If Value = 1 Then

   T1BindingNavigator.DeleteItem.PerformClick()

  End If

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

حسناً قمت بملئ بعض البيانات كما بالشكل التالي:

والان أريد ان أضيف قائمة يمكنها استعراض أسماء السيارات كما بالشكل التالي:

هل ترى ذلك السهم الصغير أنقر عليه لتحصل على هذه النافذة

حدد الخيار Use Data bound items كما بالشكل لتحصل على المزيد من الخيارات.

من الخيار Data Source حدد T1BindingSource كما بالشكل التالي:

ومن الخيار Display Member حدد الحقل mname كما بالشكل التالي:

هذا كل شئ شغل البرنامج لتجد شيئا كما بالشكل التالي:

قام الفيجوال بتعبئة القائمة نيابة عنا انقر على أي اسم لاستعراض بياناته وصورته.

ولكن ماذا لو ان البيانات كثيرة ونريد ان نقوم بعملية بحث ....؟

من الكائن T1TableAdapter أختر الخيار Edit Queriers in Dataset Designer كما بالشكل التالي:

ستجد نفسك بهذا المكان الذي سبق وتحدثنا عنه.

انقر على هذا الشكل والذي يمثل الجدول بزر الفأرة الأيمن ومن Add أختر Query وهو الخيار الأول كما بالشكل التالي:

ستجد نفسك هنا كما بالشكل التالي:

انقر على الزر Next لتنتقل الى النافذة التالية :

أنقر على الزر Next مرة ثانية لتنتقل الى الشكل التالي :

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

لذلك غيرها الى الشكل التالي:

 SELECT المعرف, mname, moudel, price, mdate, Pic FROM t1 where mname=?

أنظر الحروف المضللة هي ما قمنا بإضافته.

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

حسناً اذا نظرت للأسفل لوجدت الاستعلام الجديد الذي قمنا بإضافته .

انقر على هذا الاستعلام ومن نافذة الخصائص انتقل الى الخاصية Parameters كما بالشكل التالي :

اذا عدت الى جملة الاستعلام لوجدت اننا حدننا القيمة بعلامة ؟ دلالة على انها مجهولة والان جاء الدور لنحددها عن طريق بارامتر نقوم بتمريره فيما بعد.

أنقر على هذه الخاصية من خلال الصندوق المنقط كما بالشكل السابق لتطالعك النافذة التالية :

كما تشاهد الفيجوال وجد الحقل المطلوب والذي يحتاج الى بارامتر وهو هنا الحقل mname .

ووضع له الاسم mname كما تشاهد .

ما يهمنا هو الخاصية DbType للبارامتر والتي تحدد نوع البيانات عادة الفيجوال يعلم ما هي البيانات على حسب نوع الحقل، وهي نصية هنا.

أنقر الزر Ok .

اذهب الى النموذج وأضف أداة نص جديدة وزراً جديداً اكتب فيه التالي:

كما تشاهد عن طريق الكائن T1TableAdaprer ستجد الإجراء الذي أعددناه سابقاً وهو هنا بالاسم FillBy كما هو محدد بالصورة .

الإجراء يطالبنا باسم الجدول وقيمة البارامتر كما بالشكل التالي :

وعليه سنكتب التالي :

 Me.T1TableAdapter.FillBy(Me.Db1DataSet.t1, Me.TextBox1.Text.Trim)

ما سيحدث هنا هو انه سيتم عرض كل أسماء السيارات التي نقوم بكتابتها وتعبئة كائن مجموعة البيانات بالبيانات الجديدة.

وكما تشاهد هنا تم فرز البيانات وعرض السيارات التي بالاسم BMW فقط .

هذه بعض الأفكار التي أقدمها طبعاً يمكنك التعديل في الكثير وإضافة الكثير إليها لتصبح بشكل أفضل من ذلك.

وكما لاحظت إنني لم اشرح الكود كثيراً وذلك لأننا هنا نتعلم البرمجة من غير كود تقريباً .

وان أردت ان تتعلم عن هذه الأشياء فلها شرح كلها بمكان غير هذا المكان.

وطبعاً ربما أمكنك ان تلاحظ اننا فعلنا أشياء كثيرة ولكننا لم نكتب الكثير من الكود وذلك لان الفيجوال يقوم بكتابة الكثير من الكود عنك ولكنك لا تراه.

وهو موجود بالـ Dataset Designer كما أخبرتك سابقاً.

ولتعلم ما مقدار الكود الذي كتبه الفيجوال ليقدم لك كل شئ جاهزاً أنظر للكود التالي :

'------------------------------------------------------------------------------

' <auto-generated>

'     This code was generated by a tool.

'     Runtime Version:2.0.50727.3053

'

'     Changes to this file may cause incorrect behavior and will be lost if

'     the code is regenerated.

' </auto-generated>

'------------------------------------------------------------------------------

Option Strict Off

Option Explicit On

'''<summary>

'''Represents a strongly typed in-memory cache of data.

'''</summary>

<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0"),  _

 Global.System.Serializable(),  _

 Global.System.ComponentModel.DesignerCategoryAttribute("code"),  _

 Global.System.ComponentModel.ToolboxItem(true),  _

 Global.System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema"),  _

 Global.System.Xml.Serialization.XmlRootAttribute("db1DataSet"),  _

 Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")>  _

Partial Public Class db1DataSet

    Inherits Global.System.Data.DataSet

    Private tablet1 As t1DataTable

    Private _schemaSerializationMode As Global.System.Data.SchemaSerializationMode = Global.System.Data.SchemaSerializationMode.IncludeSchema

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Public Sub New()

        MyBase.New

        Me.BeginInit

        Me.InitClass

        Dim schemaChangedHandler As Global.System.ComponentModel.CollectionChangeEventHandler = AddressOf Me.SchemaChanged

        AddHandler MyBase.Tables.CollectionChanged, schemaChangedHandler

        AddHandler MyBase.Relations.CollectionChanged, schemaChangedHandler

        Me.EndInit

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Sub New(ByVal info As Global.System.Runtime.Serialization.SerializationInfo, ByVal context As Global.System.Runtime.Serialization.StreamingContext)

        MyBase.New(info, context, false)

        If (Me.IsBinarySerialized(info, context) = true) Then

            Me.InitVars(false)

            Dim schemaChangedHandler1 As Global.System.ComponentModel.CollectionChangeEventHandler = AddressOf Me.SchemaChanged

            AddHandler Me.Tables.CollectionChanged, schemaChangedHandler1

            AddHandler Me.Relations.CollectionChanged, schemaChangedHandler1

            Return

        End If

        Dim strSchema As String = CType(info.GetValue("XmlSchema", GetType(String)),String)

        If (Me.DetermineSchemaSerializationMode(info, context) = Global.System.Data.SchemaSerializationMode.IncludeSchema) Then

            Dim ds As Global.System.Data.DataSet = New Global.System.Data.DataSet

            ds.ReadXmlSchema(New Global.System.Xml.XmlTextReader(New Global.System.IO.StringReader(strSchema)))

            If (Not (ds.Tables("t1")) Is Nothing) Then

                MyBase.Tables.Add(New t1DataTable(ds.Tables("t1")))

            End If

            Me.DataSetName = ds.DataSetName

            Me.Prefix = ds.Prefix

            Me.Namespace = ds.Namespace

            Me.Locale = ds.Locale

            Me.CaseSensitive = ds.CaseSensitive

            Me.EnforceConstraints = ds.EnforceConstraints

            Me.Merge(ds, false, Global.System.Data.MissingSchemaAction.Add)

            Me.InitVars

        Else

            Me.ReadXmlSchema(New Global.System.Xml.XmlTextReader(New Global.System.IO.StringReader(strSchema)))

        End If

        Me.GetSerializationData(info, context)

        Dim schemaChangedHandler As Global.System.ComponentModel.CollectionChangeEventHandler = AddressOf Me.SchemaChanged

        AddHandler MyBase.Tables.CollectionChanged, schemaChangedHandler

        AddHandler Me.Relations.CollectionChanged, schemaChangedHandler

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

     Global.System.ComponentModel.Browsable(false),  _

     Global.System.ComponentModel.DesignerSerializationVisibility(Global.System.ComponentModel.DesignerSerializationVisibility.Content)>  _

    Public ReadOnly Property t1() As t1DataTable

        Get

            Return Me.tablet1

        End Get

    End Property

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

     Global.System.ComponentModel.BrowsableAttribute(true),  _

     Global.System.ComponentModel.DesignerSerializationVisibilityAttribute(Global.System.ComponentModel.DesignerSerializationVisibility.Visible)>  _

    Public Overrides Property SchemaSerializationMode() As Global.System.Data.SchemaSerializationMode

        Get

            Return Me._schemaSerializationMode

        End Get

        Set

            Me._schemaSerializationMode = value

        End Set

    End Property

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

     Global.System.ComponentModel.DesignerSerializationVisibilityAttribute(Global.System.ComponentModel.DesignerSerializationVisibility.Hidden)>  _

    Public Shadows ReadOnly Property Tables() As Global.System.Data.DataTableCollection

        Get

            Return MyBase.Tables

        End Get

    End Property

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

     Global.System.ComponentModel.DesignerSerializationVisibilityAttribute(Global.System.ComponentModel.DesignerSerializationVisibility.Hidden)>  _

    Public Shadows ReadOnly Property Relations() As Global.System.Data.DataRelationCollection

        Get

            Return MyBase.Relations

        End Get

    End Property

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Overrides Sub InitializeDerivedDataSet()

        Me.BeginInit

        Me.InitClass

        Me.EndInit

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Public Overrides Function Clone() As Global.System.Data.DataSet

        Dim cln As db1DataSet = CType(MyBase.Clone,db1DataSet)

        cln.InitVars

        cln.SchemaSerializationMode = Me.SchemaSerializationMode

        Return cln

    End Function

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Overrides Function ShouldSerializeTables() As Boolean

        Return false

    End Function

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Overrides Function ShouldSerializeRelations() As Boolean

        Return false

    End Function

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Overrides Sub ReadXmlSerializable(ByVal reader As Global.System.Xml.XmlReader)

        If (Me.DetermineSchemaSerializationMode(reader) = Global.System.Data.SchemaSerializationMode.IncludeSchema) Then

            Me.Reset

            Dim ds As Global.System.Data.DataSet = New Global.System.Data.DataSet

            ds.ReadXml(reader)

            If (Not (ds.Tables("t1")) Is Nothing) Then

                MyBase.Tables.Add(New t1DataTable(ds.Tables("t1")))

            End If

            Me.DataSetName = ds.DataSetName

            Me.Prefix = ds.Prefix

            Me.Namespace = ds.Namespace

            Me.Locale = ds.Locale

            Me.CaseSensitive = ds.CaseSensitive

            Me.EnforceConstraints = ds.EnforceConstraints

            Me.Merge(ds, false, Global.System.Data.MissingSchemaAction.Add)

            Me.InitVars

        Else

            Me.ReadXml(reader)

            Me.InitVars

        End If

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Protected Overrides Function GetSchemaSerializable() As Global.System.Xml.Schema.XmlSchema

        Dim stream As Global.System.IO.MemoryStream = New Global.System.IO.MemoryStream

        Me.WriteXmlSchema(New Global.System.Xml.XmlTextWriter(stream, Nothing))

        stream.Position = 0

        Return Global.System.Xml.Schema.XmlSchema.Read(New Global.System.Xml.XmlTextReader(stream), Nothing)

    End Function

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Friend Overloads Sub InitVars()

        Me.InitVars(true)

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Friend Overloads Sub InitVars(ByVal initTable As Boolean)

        Me.tablet1 = CType(MyBase.Tables("t1"),t1DataTable)

        If (initTable = true) Then

            If (Not (Me.tablet1) Is Nothing) Then

                Me.tablet1.InitVars

            End If

        End If

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Private Sub InitClass()

        Me.DataSetName = "db1DataSet"

        Me.Prefix = ""

        Me.Namespace = "http://tempuri.org/db1DataSet.xsd"

        Me.EnforceConstraints = true

        Me.SchemaSerializationMode = Global.System.Data.SchemaSerializationMode.IncludeSchema

        Me.tablet1 = New t1DataTable

        MyBase.Tables.Add(Me.tablet1)

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Private Function ShouldSerializet1() As Boolean

        Return false

    End Function

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Private Sub SchemaChanged(ByVal sender As Object, ByVal e As Global.System.ComponentModel.CollectionChangeEventArgs)

        If (e.Action = Global.System.ComponentModel.CollectionChangeAction.Remove) Then

            Me.InitVars

        End If

    End Sub

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

    Public Shared Function GetTypedDataSetSchema(ByVal xs As Global.System.Xml.Schema.XmlSchemaSet) As Global.System.Xml.Schema.XmlSchemaComplexType

        Dim ds As db1DataSet = New db1DataSet

        Dim type As Global.System.Xml.Schema.XmlSchemaComplexType = New Global.System.Xml.Schema.XmlSchemaComplexType

        Dim sequence As Global.System.Xml.Schema.XmlSchemaSequence = New Global.System.Xml.Schema.XmlSchemaSequence

        Dim any As Global.System.Xml.Schema.XmlSchemaAny = New Global.System.Xml.Schema.XmlSchemaAny

        any.Namespace = ds.Namespace

        sequence.Items.Add(any)

        type.Particle = sequence

        Dim dsSchema As Global.System.Xml.Schema.XmlSchema = ds.GetSchemaSerializable

        If xs.Contains(dsSchema.TargetNamespace) Then

            Dim s1 As Global.System.IO.MemoryStream = New Global.System.IO.MemoryStream

            Dim s2 As Global.System.IO.MemoryStream = New Global.System.IO.MemoryStream

            Try

                Dim schema As Global.System.Xml.Schema.XmlSchema = Nothing

                dsSchema.Write(s1)

                Dim schemas As Global.System.Collections.IEnumerator = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator

                Do While schemas.MoveNext

                    schema = CType(schemas.Current,Global.System.Xml.Schema.XmlSchema)

                    s2.SetLength(0)

                    schema.Write(s2)

                    If (s1.Length = s2.Length) Then

                        s1.Position = 0

                        s2.Position = 0

                        Do While ((s1.Position <> s1.Length)  _

                                    AndAlso (s1.ReadByte = s2.ReadByte))

                        Loop

                        If (s1.Position = s1.Length) Then

                            Return type

                        End If

                    End If

                Loop

            Finally

                If (Not (s1) Is Nothing) Then

                    s1.Close

                End If

                If (Not (s2) Is Nothing) Then

                    s2.Close

                End If

            End Try

        End If

        xs.Add(dsSchema)

        Return type

    End Function

    Public Delegate Sub t1RowChangeEventHandler(ByVal sender As Object, ByVal e As t1RowChangeEvent)

    '''<summary>

    '''Represents the strongly named DataTable class.

    '''</summary>

    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0"),  _

     Global.System.Serializable(),  _

     Global.System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedTableSchema")>  _

    Partial Public Class t1DataTable

        Inherits Global.System.Data.DataTable

        Implements Global.System.Collections.IEnumerable

        Private columnالمعرف As Global.System.Data.DataColumn

        Private columnmname As Global.System.Data.DataColumn

        Private columnmoudel As Global.System.Data.DataColumn

        Private columnprice As Global.System.Data.DataColumn

        Private columnmdate As Global.System.Data.DataColumn

        Private columnPic As Global.System.Data.DataColumn

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub New()

            MyBase.New

            Me.TableName = "t1"

            Me.BeginInit

            Me.InitClass

            Me.EndInit

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Friend Sub New(ByVal table As Global.System.Data.DataTable)

            MyBase.New

            Me.TableName = table.TableName

            If (table.CaseSensitive <> table.DataSet.CaseSensitive) Then

                Me.CaseSensitive = table.CaseSensitive

            End If

            If (table.Locale.ToString <> table.DataSet.Locale.ToString) Then

                Me.Locale = table.Locale

            End If

            If (table.Namespace <> table.DataSet.Namespace) Then

                Me.Namespace = table.Namespace

            End If

            Me.Prefix = table.Prefix

            Me.MinimumCapacity = table.MinimumCapacity

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Sub New(ByVal info As Global.System.Runtime.Serialization.SerializationInfo, ByVal context As Global.System.Runtime.Serialization.StreamingContext)

            MyBase.New(info, context)

            Me.InitVars

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property المعرفColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnالمعرف

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property mnameColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnmname

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property moudelColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnmoudel

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property priceColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnprice

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property mdateColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnmdate

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property PicColumn() As Global.System.Data.DataColumn

            Get

                Return Me.columnPic

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Browsable(false)>  _

        Public ReadOnly Property Count() As Integer

            Get

                Return Me.Rows.Count

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Default ReadOnly Property Item(ByVal index As Integer) As t1Row

            Get

                Return CType(Me.Rows(index),t1Row)

            End Get

        End Property

        Public Event t1RowChanging As t1RowChangeEventHandler

        Public Event t1RowChanged As t1RowChangeEventHandler

        Public Event t1RowDeleting As t1RowChangeEventHandler

        Public Event t1RowDeleted As t1RowChangeEventHandler

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Overloads Sub Addt1Row(ByVal row As t1Row)

            Me.Rows.Add(row)

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Overloads Function Addt1Row(ByVal mname As String, ByVal moudel As String, ByVal price As Integer, ByVal mdate As Date, ByVal Pic() As Byte) As t1Row

            Dim rowt1Row As t1Row = CType(Me.NewRow,t1Row)

            Dim columnValuesArray() As Object = New Object() {Nothing, mname, moudel, price, mdate, Pic}

            rowt1Row.ItemArray = columnValuesArray

            Me.Rows.Add(rowt1Row)

            Return rowt1Row

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function FindByالمعرف(ByVal المعرف As Integer) As t1Row

            Return CType(Me.Rows.Find(New Object() {المعرف}),t1Row)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Overridable Function GetEnumerator() As Global.System.Collections.IEnumerator Implements Global.System.Collections.IEnumerable.GetEnumerator

            Return Me.Rows.GetEnumerator

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Overrides Function Clone() As Global.System.Data.DataTable

            Dim cln As t1DataTable = CType(MyBase.Clone,t1DataTable)

            cln.InitVars

            Return cln

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Function CreateInstance() As Global.System.Data.DataTable

            Return New t1DataTable

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Friend Sub InitVars()

            Me.columnالمعرف = MyBase.Columns("المعرف")

            Me.columnmname = MyBase.Columns("mname")

            Me.columnmoudel = MyBase.Columns("moudel")

            Me.columnprice = MyBase.Columns("price")

            Me.columnmdate = MyBase.Columns("mdate")

            Me.columnPic = MyBase.Columns("Pic")

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Private Sub InitClass()

            Me.columnالمعرف = New Global.System.Data.DataColumn("المعرف", GetType(Integer), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnالمعرف)

            Me.columnmname = New Global.System.Data.DataColumn("mname", GetType(String), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnmname)

            Me.columnmoudel = New Global.System.Data.DataColumn("moudel", GetType(String), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnmoudel)

            Me.columnprice = New Global.System.Data.DataColumn("price", GetType(Integer), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnprice)

            Me.columnmdate = New Global.System.Data.DataColumn("mdate", GetType(Date), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnmdate)

            Me.columnPic = New Global.System.Data.DataColumn("Pic", GetType(Byte()), Nothing, Global.System.Data.MappingType.Element)

            MyBase.Columns.Add(Me.columnPic)

            Me.Constraints.Add(New Global.System.Data.UniqueConstraint("Constraint1", New Global.System.Data.DataColumn() {Me.columnالمعرف}, true))

            Me.columnالمعرف.AutoIncrement = true

            Me.columnالمعرف.AllowDBNull = false

            Me.columnالمعرف.Unique = true

            Me.columnmname.MaxLength = 255

            Me.columnmoudel.MaxLength = 255

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function Newt1Row() As t1Row

            Return CType(Me.NewRow,t1Row)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Function NewRowFromBuilder(ByVal builder As Global.System.Data.DataRowBuilder) As Global.System.Data.DataRow

            Return New t1Row(builder)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Function GetRowType() As Global.System.Type

            Return GetType(t1Row)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Sub OnRowChanged(ByVal e As Global.System.Data.DataRowChangeEventArgs)

            MyBase.OnRowChanged(e)

            If (Not (Me.t1RowChangedEvent) Is Nothing) Then

                RaiseEvent t1RowChanged(Me, New t1RowChangeEvent(CType(e.Row,t1Row), e.Action))

            End If

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Sub OnRowChanging(ByVal e As Global.System.Data.DataRowChangeEventArgs)

            MyBase.OnRowChanging(e)

            If (Not (Me.t1RowChangingEvent) Is Nothing) Then

                RaiseEvent t1RowChanging(Me, New t1RowChangeEvent(CType(e.Row,t1Row), e.Action))

            End If

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Sub OnRowDeleted(ByVal e As Global.System.Data.DataRowChangeEventArgs)

            MyBase.OnRowDeleted(e)

            If (Not (Me.t1RowDeletedEvent) Is Nothing) Then

                RaiseEvent t1RowDeleted(Me, New t1RowChangeEvent(CType(e.Row,t1Row), e.Action))

            End If

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected Overrides Sub OnRowDeleting(ByVal e As Global.System.Data.DataRowChangeEventArgs)

            MyBase.OnRowDeleting(e)

            If (Not (Me.t1RowDeletingEvent) Is Nothing) Then

                RaiseEvent t1RowDeleting(Me, New t1RowChangeEvent(CType(e.Row,t1Row), e.Action))

            End If

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub Removet1Row(ByVal row As t1Row)

            Me.Rows.Remove(row)

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Shared Function GetTypedTableSchema(ByVal xs As Global.System.Xml.Schema.XmlSchemaSet) As Global.System.Xml.Schema.XmlSchemaComplexType

            Dim type As Global.System.Xml.Schema.XmlSchemaComplexType = New Global.System.Xml.Schema.XmlSchemaComplexType

            Dim sequence As Global.System.Xml.Schema.XmlSchemaSequence = New Global.System.Xml.Schema.XmlSchemaSequence

            Dim ds As db1DataSet = New db1DataSet

            Dim any1 As Global.System.Xml.Schema.XmlSchemaAny = New Global.System.Xml.Schema.XmlSchemaAny

            any1.Namespace = "http://www.w3.org/2001/XMLSchema"

            any1.MinOccurs = New Decimal(0)

            any1.MaxOccurs = Decimal.MaxValue

            any1.ProcessContents = Global.System.Xml.Schema.XmlSchemaContentProcessing.Lax

            sequence.Items.Add(any1)

            Dim any2 As Global.System.Xml.Schema.XmlSchemaAny = New Global.System.Xml.Schema.XmlSchemaAny

            any2.Namespace = "urn:schemas-microsoft-com:xml-diffgram-v1"

            any2.MinOccurs = New Decimal(1)

            any2.ProcessContents = Global.System.Xml.Schema.XmlSchemaContentProcessing.Lax

            sequence.Items.Add(any2)

            Dim attribute1 As Global.System.Xml.Schema.XmlSchemaAttribute = New Global.System.Xml.Schema.XmlSchemaAttribute

            attribute1.Name = "namespace"

            attribute1.FixedValue = ds.Namespace

            type.Attributes.Add(attribute1)

            Dim attribute2 As Global.System.Xml.Schema.XmlSchemaAttribute = New Global.System.Xml.Schema.XmlSchemaAttribute

            attribute2.Name = "tableTypeName"

            attribute2.FixedValue = "t1DataTable"

            type.Attributes.Add(attribute2)

            type.Particle = sequence

            Dim dsSchema As Global.System.Xml.Schema.XmlSchema = ds.GetSchemaSerializable

            If xs.Contains(dsSchema.TargetNamespace) Then

                Dim s1 As Global.System.IO.MemoryStream = New Global.System.IO.MemoryStream

                Dim s2 As Global.System.IO.MemoryStream = New Global.System.IO.MemoryStream

                Try

                    Dim schema As Global.System.Xml.Schema.XmlSchema = Nothing

                    dsSchema.Write(s1)

                    Dim schemas As Global.System.Collections.IEnumerator = xs.Schemas(dsSchema.TargetNamespace).GetEnumerator

                    Do While schemas.MoveNext

                        schema = CType(schemas.Current,Global.System.Xml.Schema.XmlSchema)

                        s2.SetLength(0)

                        schema.Write(s2)

                        If (s1.Length = s2.Length) Then

                            s1.Position = 0

                            s2.Position = 0

                            Do While ((s1.Position <> s1.Length)  _

                                        AndAlso (s1.ReadByte = s2.ReadByte))

                            Loop

                            If (s1.Position = s1.Length) Then

                                Return type

                            End If

                        End If

                    Loop

                Finally

                    If (Not (s1) Is Nothing) Then

                        s1.Close

                    End If

                    If (Not (s2) Is Nothing) Then

                        s2.Close

                    End If

                End Try

            End If

            xs.Add(dsSchema)

            Return type

        End Function

    End Class

    '''<summary>

    '''Represents strongly named DataRow class.

    '''</summary>

    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")>  _

    Partial Public Class t1Row

        Inherits Global.System.Data.DataRow

        Private tablet1 As t1DataTable

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Friend Sub New(ByVal rb As Global.System.Data.DataRowBuilder)

            MyBase.New(rb)

            Me.tablet1 = CType(Me.Table,t1DataTable)

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property المعرف() As Integer

            Get

                Return CType(Me(Me.tablet1.المعرفColumn),Integer)

            End Get

            Set

                Me(Me.tablet1.المعرفColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property mname() As String

            Get

                Try

                    Return CType(Me(Me.tablet1.mnameColumn),String)

                Catch e As Global.System.InvalidCastException

                    Throw New Global.System.Data.StrongTypingException("The value for column 'mname' in table 't1' is DBNull.", e)

                End Try

            End Get

            Set

                Me(Me.tablet1.mnameColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property moudel() As String

            Get

                Try

                    Return CType(Me(Me.tablet1.moudelColumn),String)

                Catch e As Global.System.InvalidCastException

                    Throw New Global.System.Data.StrongTypingException("The value for column 'moudel' in table 't1' is DBNull.", e)

                End Try

            End Get

            Set

                Me(Me.tablet1.moudelColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property price() As Integer

            Get

                Try

                    Return CType(Me(Me.tablet1.priceColumn),Integer)

                Catch e As Global.System.InvalidCastException

                    Throw New Global.System.Data.StrongTypingException("The value for column 'price' in table 't1' is DBNull.", e)

                End Try

            End Get

            Set

                Me(Me.tablet1.priceColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property mdate() As Date

            Get

                Try

                    Return CType(Me(Me.tablet1.mdateColumn),Date)

                Catch e As Global.System.InvalidCastException

                    Throw New Global.System.Data.StrongTypingException("The value for column 'mdate' in table 't1' is DBNull.", e)

                End Try

            End Get

            Set

                Me(Me.tablet1.mdateColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property Pic() As Byte()

            Get

                Try

                    Return CType(Me(Me.tablet1.PicColumn),Byte())

                Catch e As Global.System.InvalidCastException

                    Throw New Global.System.Data.StrongTypingException("The value for column 'Pic' in table 't1' is DBNull.", e)

                End Try

            End Get

            Set

                Me(Me.tablet1.PicColumn) = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function IsmnameNull() As Boolean

            Return Me.IsNull(Me.tablet1.mnameColumn)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub SetmnameNull()

            Me(Me.tablet1.mnameColumn) = Global.System.Convert.DBNull

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function IsmoudelNull() As Boolean

            Return Me.IsNull(Me.tablet1.moudelColumn)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub SetmoudelNull()

            Me(Me.tablet1.moudelColumn) = Global.System.Convert.DBNull

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function IspriceNull() As Boolean

            Return Me.IsNull(Me.tablet1.priceColumn)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub SetpriceNull()

            Me(Me.tablet1.priceColumn) = Global.System.Convert.DBNull

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function IsmdateNull() As Boolean

            Return Me.IsNull(Me.tablet1.mdateColumn)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub SetmdateNull()

            Me(Me.tablet1.mdateColumn) = Global.System.Convert.DBNull

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Function IsPicNull() As Boolean

            Return Me.IsNull(Me.tablet1.PicColumn)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub SetPicNull()

            Me(Me.tablet1.PicColumn) = Global.System.Convert.DBNull

        End Sub

    End Class

    '''<summary>

    '''Row event argument class

    '''</summary>

    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")>  _

    Public Class t1RowChangeEvent

        Inherits Global.System.EventArgs

        Private eventRow As t1Row

        Private eventAction As Global.System.Data.DataRowAction

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub New(ByVal row As t1Row, ByVal action As Global.System.Data.DataRowAction)

            MyBase.New

            Me.eventRow = row

            Me.eventAction = action

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property Row() As t1Row

            Get

                Return Me.eventRow

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public ReadOnly Property Action() As Global.System.Data.DataRowAction

            Get

                Return Me.eventAction

            End Get

        End Property

    End Class

End Class

Namespace db1DataSetTableAdapters

    '''<summary>

    '''Represents the connection and commands used to retrieve and save data.

    '''</summary>

    <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0"),  _

     Global.System.ComponentModel.DesignerCategoryAttribute("code"),  _

     Global.System.ComponentModel.ToolboxItem(true),  _

     Global.System.ComponentModel.DataObjectAttribute(true),  _

     Global.System.ComponentModel.DesignerAttribute("Microsoft.VSDesigner.DataSource.Design.TableAdapterDesigner, Microsoft.VSDesigner"& _

        ", Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),  _

     Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")>  _

    Partial Public Class t1TableAdapter

        Inherits Global.System.ComponentModel.Component

        Private WithEvents _adapter As Global.System.Data.OleDb.OleDbDataAdapter

        Private _connection As Global.System.Data.OleDb.OleDbConnection

        Private _commandCollection() As Global.System.Data.OleDb.OleDbCommand

        Private _clearBeforeFill As Boolean

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Sub New()

            MyBase.New

            Me.ClearBeforeFill = true

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Private ReadOnly Property Adapter() As Global.System.Data.OleDb.OleDbDataAdapter

            Get

                If (Me._adapter Is Nothing) Then

                    Me.InitAdapter

                End If

                Return Me._adapter

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Friend Property Connection() As Global.System.Data.OleDb.OleDbConnection

            Get

                If (Me._connection Is Nothing) Then

                    Me.InitConnection

                End If

                Return Me._connection

            End Get

            Set

                Me._connection = value

                If (Not (Me.Adapter.InsertCommand) Is Nothing) Then

                    Me.Adapter.InsertCommand.Connection = value

                End If

                If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then

                    Me.Adapter.DeleteCommand.Connection = value

                End If

                If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then

                    Me.Adapter.UpdateCommand.Connection = value

                End If

                Dim i As Integer = 0

                Do While (i < Me.CommandCollection.Length)

                    If (Not (Me.CommandCollection(i)) Is Nothing) Then

                        CType(Me.CommandCollection(i),Global.System.Data.OleDb.OleDbCommand).Connection = value

                    End If

                    i = (i + 1)

                Loop

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Protected ReadOnly Property CommandCollection() As Global.System.Data.OleDb.OleDbCommand()

            Get

                If (Me._commandCollection Is Nothing) Then

                    Me.InitCommandCollection

                End If

                Return Me._commandCollection

            End Get

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Public Property ClearBeforeFill() As Boolean

            Get

                Return Me._clearBeforeFill

            End Get

            Set

                Me._clearBeforeFill = value

            End Set

        End Property

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Private Sub InitAdapter()

            Me._adapter = New Global.System.Data.OleDb.OleDbDataAdapter

            Dim tableMapping As Global.System.Data.Common.DataTableMapping = New Global.System.Data.Common.DataTableMapping

            tableMapping.SourceTable = "Table"

            tableMapping.DataSetTable = "t1"

            tableMapping.ColumnMappings.Add("المعرف", "المعرف")

            tableMapping.ColumnMappings.Add("mname", "mname")

            tableMapping.ColumnMappings.Add("moudel", "moudel")

            tableMapping.ColumnMappings.Add("price", "price")

            tableMapping.ColumnMappings.Add("mdate", "mdate")

            tableMapping.ColumnMappings.Add("Pic", "Pic")

            Me._adapter.TableMappings.Add(tableMapping)

            Me._adapter.DeleteCommand = New Global.System.Data.OleDb.OleDbCommand

            Me._adapter.DeleteCommand.Connection = Me.Connection

            Me._adapter.DeleteCommand.CommandText = "DELETE FROM `t1` WHERE ((`المعرف` = ?) AND ((? = 1 AND `mname` IS NULL) OR (`mnam"& _

                "e` = ?)) AND ((? = 1 AND `moudel` IS NULL) OR (`moudel` = ?)) AND ((? = 1 AND `p"& _

                "rice` IS NULL) OR (`price` = ?)) AND ((? = 1 AND `mdate` IS NULL) OR (`mdate` = "& _

                "?)))"

            Me._adapter.DeleteCommand.CommandType = Global.System.Data.CommandType.Text

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_المعرف", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "المعرف", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_mname", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_mname", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_moudel", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_moudel", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_mdate", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.DeleteCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_mdate", Global.System.Data.OleDb.OleDbType.[Date], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.InsertCommand = New Global.System.Data.OleDb.OleDbCommand

            Me._adapter.InsertCommand.Connection = Me.Connection

            Me._adapter.InsertCommand.CommandText = "INSERT INTO `t1` (`mname`, `moudel`, `price`, `mdate`, `Pic`) VALUES (?, ?, ?, ?,"& _

                " ?)"

            Me._adapter.InsertCommand.CommandType = Global.System.Data.CommandType.Text

            Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("mname", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("moudel", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("mdate", Global.System.Data.OleDb.OleDbType.[Date], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.InsertCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Pic", Global.System.Data.OleDb.OleDbType.LongVarBinary, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "Pic", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand = New Global.System.Data.OleDb.OleDbCommand

            Me._adapter.UpdateCommand.Connection = Me.Connection

            Me._adapter.UpdateCommand.CommandText = "UPDATE `t1` SET `mname` = ?, `moudel` = ?, `price` = ?, `mdate` = ?, `Pic` = ? WH"& _

                "ERE ((`المعرف` = ?) AND ((? = 1 AND `mname` IS NULL) OR (`mname` = ?)) AND ((? ="& _

                " 1 AND `moudel` IS NULL) OR (`moudel` = ?)) AND ((? = 1 AND `price` IS NULL) OR "& _

                "(`price` = ?)) AND ((? = 1 AND `mdate` IS NULL) OR (`mdate` = ?)))"

            Me._adapter.UpdateCommand.CommandType = Global.System.Data.CommandType.Text

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("mname", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("moudel", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("mdate", Global.System.Data.OleDb.OleDbType.[Date], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Pic", Global.System.Data.OleDb.OleDbType.LongVarBinary, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "Pic", Global.System.Data.DataRowVersion.Current, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_المعرف", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "المعرف", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_mname", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_mname", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_moudel", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_moudel", Global.System.Data.OleDb.OleDbType.VarWChar, 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "moudel", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_price", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "price", Global.System.Data.DataRowVersion.Original, false, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("IsNull_mdate", Global.System.Data.OleDb.OleDbType.[Integer], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Original, true, Nothing))

            Me._adapter.UpdateCommand.Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("Original_mdate", Global.System.Data.OleDb.OleDbType.[Date], 0, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mdate", Global.System.Data.DataRowVersion.Original, false, Nothing))

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Private Sub InitConnection()

            Me._connection = New Global.System.Data.OleDb.OleDbConnection

            Me._connection.ConnectionString = Global.WindowsApplication1.My.MySettings.Default.db1ConnectionString

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _

        Private Sub InitCommandCollection()

            Me._commandCollection = New Global.System.Data.OleDb.OleDbCommand(1) {}

            Me._commandCollection(0) = New Global.System.Data.OleDb.OleDbCommand

            Me._commandCollection(0).Connection = Me.Connection

            Me._commandCollection(0).CommandText = "SELECT المعرف, mname, moudel, price, mdate, Pic FROM t1"

            Me._commandCollection(0).CommandType = Global.System.Data.CommandType.Text

            Me._commandCollection(1) = New Global.System.Data.OleDb.OleDbCommand

            Me._commandCollection(1).Connection = Me.Connection

            Me._commandCollection(1).CommandText = "SELECT المعرف, mname, moudel, price, mdate, Pic FROM t1 where mname=?"

            Me._commandCollection(1).CommandType = Global.System.Data.CommandType.Text

            Me._commandCollection(1).Parameters.Add(New Global.System.Data.OleDb.OleDbParameter("mname", Global.System.Data.OleDb.OleDbType.WChar, 255, Global.System.Data.ParameterDirection.Input, CType(0,Byte), CType(0,Byte), "mname", Global.System.Data.DataRowVersion.Current, false, Nothing))

        End Sub

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Fill, true)>  _

        Public Overloads Overridable Function Fill(ByVal dataTable As db1DataSet.t1DataTable) As Integer

            Me.Adapter.SelectCommand = Me.CommandCollection(0)

            If (Me.ClearBeforeFill = true) Then

                dataTable.Clear

            End If

            Dim returnValue As Integer = Me.Adapter.Fill(dataTable)

            Return returnValue

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.[Select], true)>  _

        Public Overloads Overridable Function GetData() As db1DataSet.t1DataTable

            Me.Adapter.SelectCommand = Me.CommandCollection(0)

            Dim dataTable As db1DataSet.t1DataTable = New db1DataSet.t1DataTable

            Me.Adapter.Fill(dataTable)

            Return dataTable

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Fill, false)>  _

        Public Overloads Overridable Function FillBy(ByVal dataTable As db1DataSet.t1DataTable, ByVal mname As String) As Integer

            Me.Adapter.SelectCommand = Me.CommandCollection(1)

            If (mname Is Nothing) Then

                Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.SelectCommand.Parameters(0).Value = CType(mname,String)

            End If

            If (Me.ClearBeforeFill = true) Then

                dataTable.Clear

            End If

            Dim returnValue As Integer = Me.Adapter.Fill(dataTable)

            Return returnValue

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.[Select], false)>  _

        Public Overloads Overridable Function GetDataBy(ByVal mname As String) As db1DataSet.t1DataTable

            Me.Adapter.SelectCommand = Me.CommandCollection(1)

            If (mname Is Nothing) Then

                Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.SelectCommand.Parameters(0).Value = CType(mname,String)

            End If

            Dim dataTable As db1DataSet.t1DataTable = New db1DataSet.t1DataTable

            Me.Adapter.Fill(dataTable)

            Return dataTable

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")>  _

        Public Overloads Overridable Function Update(ByVal dataTable As db1DataSet.t1DataTable) As Integer

            Return Me.Adapter.Update(dataTable)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")>  _

        Public Overloads Overridable Function Update(ByVal dataSet As db1DataSet) As Integer

            Return Me.Adapter.Update(dataSet, "t1")

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")>  _

        Public Overloads Overridable Function Update(ByVal dataRow As Global.System.Data.DataRow) As Integer

            Return Me.Adapter.Update(New Global.System.Data.DataRow() {dataRow})

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter")>  _

        Public Overloads Overridable Function Update(ByVal dataRows() As Global.System.Data.DataRow) As Integer

            Return Me.Adapter.Update(dataRows)

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Delete, true)>  _

        Public Overloads Overridable Function Delete(ByVal Original_المعرف As Integer, ByVal Original_mname As String, ByVal Original_moudel As String, ByVal Original_price As Global.System.Nullable(Of Integer), ByVal Original_mdate As Global.System.Nullable(Of Date)) As Integer

            Me.Adapter.DeleteCommand.Parameters(0).Value = CType(Original_المعرف,Integer)

            If (Original_mname Is Nothing) Then

                Me.Adapter.DeleteCommand.Parameters(1).Value = CType(1,Object)

                Me.Adapter.DeleteCommand.Parameters(2).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.DeleteCommand.Parameters(1).Value = CType(0,Object)

                Me.Adapter.DeleteCommand.Parameters(2).Value = CType(Original_mname,String)

            End If

            If (Original_moudel Is Nothing) Then

                Me.Adapter.DeleteCommand.Parameters(3).Value = CType(1,Object)

                Me.Adapter.DeleteCommand.Parameters(4).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.DeleteCommand.Parameters(3).Value = CType(0,Object)

                Me.Adapter.DeleteCommand.Parameters(4).Value = CType(Original_moudel,String)

            End If

            If (Original_price.HasValue = true) Then

                Me.Adapter.DeleteCommand.Parameters(5).Value = CType(0,Object)

                Me.Adapter.DeleteCommand.Parameters(6).Value = CType(Original_price.Value,Integer)

            Else

                Me.Adapter.DeleteCommand.Parameters(5).Value = CType(1,Object)

                Me.Adapter.DeleteCommand.Parameters(6).Value = Global.System.DBNull.Value

            End If

            If (Original_mdate.HasValue = true) Then

                Me.Adapter.DeleteCommand.Parameters(7).Value = CType(0,Object)

                Me.Adapter.DeleteCommand.Parameters(8).Value = CType(Original_mdate.Value,Date)

            Else

                Me.Adapter.DeleteCommand.Parameters(7).Value = CType(1,Object)

                Me.Adapter.DeleteCommand.Parameters(8).Value = Global.System.DBNull.Value

            End If

            Dim previousConnectionState As Global.System.Data.ConnectionState = Me.Adapter.DeleteCommand.Connection.State

            If ((Me.Adapter.DeleteCommand.Connection.State And Global.System.Data.ConnectionState.Open)  _

                        <> Global.System.Data.ConnectionState.Open) Then

                Me.Adapter.DeleteCommand.Connection.Open

            End If

            Try

                Dim returnValue As Integer = Me.Adapter.DeleteCommand.ExecuteNonQuery

                Return returnValue

            Finally

                If (previousConnectionState = Global.System.Data.ConnectionState.Closed) Then

                    Me.Adapter.DeleteCommand.Connection.Close

                End If

            End Try

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Insert, true)>  _

        Public Overloads Overridable Function Insert(ByVal mname As String, ByVal moudel As String, ByVal price As Global.System.Nullable(Of Integer), ByVal mdate As Global.System.Nullable(Of Date), ByVal Pic() As Byte) As Integer

            If (mname Is Nothing) Then

                Me.Adapter.InsertCommand.Parameters(0).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.InsertCommand.Parameters(0).Value = CType(mname,String)

            End If

            If (moudel Is Nothing) Then

                Me.Adapter.InsertCommand.Parameters(1).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.InsertCommand.Parameters(1).Value = CType(moudel,String)

            End If

            If (price.HasValue = true) Then

                Me.Adapter.InsertCommand.Parameters(2).Value = CType(price.Value,Integer)

            Else

                Me.Adapter.InsertCommand.Parameters(2).Value = Global.System.DBNull.Value

            End If

            If (mdate.HasValue = true) Then

                Me.Adapter.InsertCommand.Parameters(3).Value = CType(mdate.Value,Date)

            Else

                Me.Adapter.InsertCommand.Parameters(3).Value = Global.System.DBNull.Value

            End If

            If (Pic Is Nothing) Then

                Me.Adapter.InsertCommand.Parameters(4).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.InsertCommand.Parameters(4).Value = CType(Pic,Byte())

            End If

            Dim previousConnectionState As Global.System.Data.ConnectionState = Me.Adapter.InsertCommand.Connection.State

            If ((Me.Adapter.InsertCommand.Connection.State And Global.System.Data.ConnectionState.Open)  _

                        <> Global.System.Data.ConnectionState.Open) Then

                Me.Adapter.InsertCommand.Connection.Open

            End If

            Try

                Dim returnValue As Integer = Me.Adapter.InsertCommand.ExecuteNonQuery

                Return returnValue

            Finally

                If (previousConnectionState = Global.System.Data.ConnectionState.Closed) Then

                    Me.Adapter.InsertCommand.Connection.Close

                End If

            End Try

        End Function

        <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _

         Global.System.ComponentModel.Design.HelpKeywordAttribute("vs.data.TableAdapter"),  _

         Global.System.ComponentModel.DataObjectMethodAttribute(Global.System.ComponentModel.DataObjectMethodType.Update, true)>  _

        Public Overloads Overridable Function Update(ByVal mname As String, ByVal moudel As String, ByVal price As Global.System.Nullable(Of Integer), ByVal mdate As Global.System.Nullable(Of Date), ByVal Pic() As Byte, ByVal Original_المعرف As Integer, ByVal Original_mname As String, ByVal Original_moudel As String, ByVal Original_price As Global.System.Nullable(Of Integer), ByVal Original_mdate As Global.System.Nullable(Of Date)) As Integer

            If (mname Is Nothing) Then

                Me.Adapter.UpdateCommand.Parameters(0).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.UpdateCommand.Parameters(0).Value = CType(mname,String)

            End If

            If (moudel Is Nothing) Then

                Me.Adapter.UpdateCommand.Parameters(1).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.UpdateCommand.Parameters(1).Value = CType(moudel,String)

            End If

            If (price.HasValue = true) Then

                Me.Adapter.UpdateCommand.Parameters(2).Value = CType(price.Value,Integer)

            Else

                Me.Adapter.UpdateCommand.Parameters(2).Value = Global.System.DBNull.Value

            End If

            If (mdate.HasValue = true) Then

                Me.Adapter.UpdateCommand.Parameters(3).Value = CType(mdate.Value,Date)

            Else

                Me.Adapter.UpdateCommand.Parameters(3).Value = Global.System.DBNull.Value

            End If

            If (Pic Is Nothing) Then

                Me.Adapter.UpdateCommand.Parameters(4).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.UpdateCommand.Parameters(4).Value = CType(Pic,Byte())

            End If

            Me.Adapter.UpdateCommand.Parameters(5).Value = CType(Original_المعرف,Integer)

            If (Original_mname Is Nothing) Then

                Me.Adapter.UpdateCommand.Parameters(6).Value = CType(1,Object)

                Me.Adapter.UpdateCommand.Parameters(7).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.UpdateCommand.Parameters(6).Value = CType(0,Object)

                Me.Adapter.UpdateCommand.Parameters(7).Value = CType(Original_mname,String)

            End If

            If (Original_moudel Is Nothing) Then

                Me.Adapter.UpdateCommand.Parameters(8).Value = CType(1,Object)

                Me.Adapter.UpdateCommand.Parameters(9).Value = Global.System.DBNull.Value

            Else

                Me.Adapter.UpdateCommand.Parameters(8).Value = CType(0,Object)

                Me.Adapter.UpdateCommand.Parameters(9).Value = CType(Original_moudel,String)

            End If

            If (Original_price.HasValue = true) Then

                Me.Adapter.UpdateCommand.Parameters(10).Value = CType(0,Object)

                Me.Adapter.UpdateCommand.Parameters(11).Value = CType(Original_price.Value,Integer)

            Else

                Me.Adapter.UpdateCommand.Parameters(10).Value = CType(1,Object)

                Me.Adapter.UpdateCommand.Parameters(11).Value = Global.System.DBNull.Value

            End If

            If (Original_mdate.HasValue = true) Then

                Me.Adapter.UpdateCommand.Parameters(12).Value = CType(0,Object)

                Me.Adapter.UpdateCommand.Parameters(13).Value = CType(Original_mdate.Value,Date)

            Else

                Me.Adapter.UpdateCommand.Parameters(12).Value = CType(1,Object)

                Me.Adapter.UpdateCommand.Parameters(13).Value = Global.System.DBNull.Value

            End If

            Dim previousConnectionState As Global.System.Data.ConnectionState = Me.Adapter.UpdateCommand.Connection.State

            If ((Me.Adapter.UpdateCommand.Connection.State And Global.System.Data.ConnectionState.Open)  _

                        <> Global.System.Data.ConnectionState.Open) Then

                Me.Adapter.UpdateCommand.Connection.Open

            End If

            Try

                Dim returnValue As Integer = Me.Adapter.UpdateCommand.ExecuteNonQuery

                Return returnValue

            Finally

                If (previousConnectionState = Global.System.Data.ConnectionState.Closed) Then

                    Me.Adapter.UpdateCommand.Connection.Close

                End If

            End Try

        End Function

    End Class

End Namespace

كود مزعج كثيراً أليس كذلك ...؟

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

وهكذا ينتهي هذا الدرس


البناءات Enum

Greate SQL Server Database

طبعاً قواعد بيانات من هذا النوع تتميز بالسرعة وكذلك الأمان العالي بعكس قواعد بيانات Access .

كيف ننشئ قاعدة بيانات....؟

من الفيجوال أستوديو ومن النافذة Server Explorer نحدد بزر الفأرة الأيمن ونختار Greate New SQL Server Database كما بالشكل التالي :

وهذه القائمة نتيجة نقر بزر الفأرة الأيمن كما بالشكل :

اذا لم تجد نافذة Server Explorer فيمكنك إظهارها من القائمة View .

على العموم بعدها سنحصل على النافذة التالية :

هذه النافذة تطالبنا باسم الـ Server وطبعاً قد يتغير من جهاز الى آخر على حسب إعدادات الشخص نفسه وبحسب ما أحدثه من تغييرات.

ولكي تعلم ما هو اسم الـ Server لديك وبحال قمت بتنزيله مع اصدارة الفيجوال والا فلن تستطيع العمل معه.

من قائمة أبداء تم كافة البرامج ابحث عن Microsoft SQL Server 2005 كما تشاهد.

تتبع المسار كما بالصورة التالية :

وقم بتشغيل SQL Server Configuration Manager .

ستظهر هذه النافذة كما بالشكل التالي :

انظر إلى جهة اليسار تحت العنوان Name كما تشاهد أسم الـ Server هو ( SQLEXPRESS ) وتحت State توجد كلمة Running بمعنى أنه شغال.

وبالعودة الى أخر نافذة توقفنا عندها وهي التالية :

اذا نكتب التالي للـ Server Name :

.\SQLEXPRESS

فتكون النتيجة كما بالشكل التالي :

طبعاً تحت العنوان New database name مطلوب اسم لقاعدة البيانات وهو اختياري ضع ما تشاء فيه تم انقر Ok .

ستجد نفسك بنافذة Server Explorer من جديد ومع قاعدة البيانات التي أعددناها كما بالشكل :

توجد العديد من المجلدات التي من الممكن ان نحفظ ونعد فيها مثل الجداول والإجراءات المخزنة والدوال وغيرها.

ولكن ما يهمنا ألان هو إنشاء الجداول.

لذلك عليك ان تنقر على المجلد المسمى Tables كما بالشكل السابق وتنقر بزر الفأرة الأيمن وتختار Add New Table كما بالشكل التالي :

بعدها ستظهر هذه النافذة وكما تشاهد قمت بإضافة عمود جديد ونوعه نص، اما Allow Null فهي تحدد هل يقبل قيم فارغة ام لا.

وبالأسفل يمكنك ان تشاهد خصائص كل الأعمدة التي نضيفها.

وحقيقة أجد الأمر مقبولا أكثر عند إنشاء قاعدة بيانات وأقول او نقول إضافة عمود Column بدل حقل.

وهو مصطلح يتماشى مع بيئة الفيجوال وكائنات الاتصال فيه.

فعمود ( Column ) تعني حقل وصف ( Row ) تعني سجل، سيواجهك هذان المصطلحان كثيراً

وبتكملة إعداد كل الأعمدة او الحقول يكون الجدول كما بالشكل التالي :

إذا نقرت على أي عمود او حقل بزر الفأرة الأيمن فستحصل على القائمة التالية .

ما يهمنا بداية وقبل كل شئ الخيارات التالية :

الخيار | الوظيفة
Set Primary Key | لجعل العمود او الحقل كمفتاح رئيسي وطبعاً من الضروري ان يكون من النوع Integer ليمكنك فعل ذلك
Insert Column | حشر عمود او حقل جديد بقاعدة البيانات
Delete Column | حذف عمود
Relationships | إنشاء علاقات بين الجداول

والان اذا حفظت المشروع او قمت بإغلاق الجدول فسيطالبك الفيجوال باسم للجدول.

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

ألان قاعدة البيانات جاهزة للعمل يمكننا العمل معها بشكل عادي جداً.

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

تماماً لقد جعلنا أسمها asd كما يمكنك ان تلاحظ المسار فوق وهو المكان الذي ستجدها فيه.

بالنسبة لكائنات الاتصال بها نفس الدرس حول Ado.net ولكن الاختلاف بمزود الخدمة فقط.

أما في الاتصال بها عن طريق الـ Data Sourse فنفس الطريقة التي اتبعناها بالدرس حول الـ Data Sourse لا اختلاف يذكر.

على سبيل المثال لاحظ الفرق بين هذين المثالين :

OLEDB

  Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=asd.mdb"

  Dim con As New OleDbConnection(ConString)

  Dim cmd As New OleDbCommand("Select * from Table1", con)

  con.Open()

Dim dr As OleDbDataReader = cmd.ExecuteReader()

    Do While dr.Read()

          ListBox1.Items.Add(dr.Item("mname").ToString)

    Loop

SQLCLIENT

 Dim ConString  As String = "Data Source=.\SQLEXPRESS;Initial Catalog=asd;Integrated Security=True;Pooling=False"

 Dim con As New SqlConnection(ConString)

 Dim cmd As New SqlCommand("Select * from Table1", con)

 con.Open()

 Dim dr As SqlDataReader = cmd.ExecuteReader()

   Do While dr.Read()

        ListBox1.Items.Add(dr.Item("mname").ToString)

   Loop

لاحظ الاختلاف يسلسلة الاتصال او بنوع مزود الخدمة فقط.

والباقي كله يتم بشكل عادي جداً وموحد.


الرسم Drawing

يوجد بالفجوال نت مجموعة من الخلايا Class التي تمكنك من الرسم في سهولة على مسطح ما، سوى كان صورة ام نموذج .

وهذه هي الفضاءات التي تمكنك من الرسم.

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

وعليك باستيراد بعضها او كلها

حسناً لرسم خط، أنشئ مشروعاً جديداً تم ضع عليه زراً وفي الحدث Click للزر أكتب التالي:

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.CreateGraphics.DrawLine(New Pen(Color.Blue, 4), _

        New Point(13, 13), New Point(132, 210))

    End Sub

End Class

الامر بيسط انشاء كائن رسوم CreateGraphics وتحديد الخاصية DrawLine لانشاء او رسم خط، كذلك يتوجب علينا تحديد خصائص القلم Pen الذي سيستخدم في الرسم، وتحديد نقاط الرسم Point

والان دعنا نرسم مستطيلاً.

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

        Dim P As New Pen(Color.Red)

        G.DrawRectangle(P, 20, 20, 280, 180)

    End Sub

End Class

هذا المثال يقوم برسم مستطيل، كالسابق انشاء كائن رسم، تم تحديد القلم المستخدم، تم استخدام الخاصية DrawRectangle مع الاحداثيات X - Y و الطول والعرض

والان دعونا نرسم الدائرة.

 Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

        G.DrawEllipse(Pens.Blue, New Rectangle(50, 20, 200, 200))

    End Sub

End Class

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

كما يمكنك رسم المنحيات كما بالشكل التالي :

Public Class Form1

    Dim Graphics As System.Drawing.Graphics = Graphics.FromHwnd(Me.Handle)

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        Dim points As Point() = { _

         New Point(0, 100), _

         New Point(50, 80), _

         New Point(100, 20), _

         New Point(150, 80), _

         New Point(200, 100)}

        Dim pen As New Pen(Color.FromArgb(255, 0, 0, 255))

        Graphics.DrawCurve(pen, points)

     End Sub

End Class

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

 Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

        G.DrawIcon(Me.Icon, 50, 50)

    End Sub

End Class

تم رسم ايقونة النموذج .

وهذا مثال يقوم برسم دائرة ويقوم بتعبئتها بلون ما.

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

        ' Create solid brush.

        Dim redBrush As New SolidBrush(Color.Red)

        ' Create rectangle for ellipse.

        Dim x As Integer = 0

        Dim y As Integer = 0

        Dim width As Integer = 200

        Dim height As Integer = 100

        Dim rect As New Rectangle(x, y, width, height)

        ' Fill ellipse on screen.

        G.FillEllipse(redBrush, rect)

    End Sub

End Class

الجديد هنا انه تم أضافة فرشاة للرسم وهي RedBrush حيث تم استخدامها مع الخاصية FillEllipse

وحتى اعطيك مخزوناً كبيراً من التعليمات او على الاقل الامثلة التي يمكنك تجربتها، وبحال كنت لاتجيد استخدام التعليمات في الفجوال نت، او كنت لا تجيد الانجليزية فيمكنك ان ان تقوم بالتالي:

اكتب في محرر الكود وفي الحدث Button التالي:

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

    End Sub

End Class

الان تحت السطر البرمجي الذي تشاهده اكتب حرف G والذي هو متغيرنا لانشاء كائن رسم، ومن القائمة التالية أختر احدى الخصائص كما بالشكل:

بعدها قم بتظليل هذه الخاصية كما بالشكل التالي:

والان أنقر على الزر F1 حيث سيتم نقلك الى التعليمات الخاصة بهذا الأمر مباشرة ومن هناك يمكنك الحصول على الأمثلة التي يمكنك تطبيقها.

وهكذا توفر علي نقل هذه الأمثلة وتكسب أنت العديد منها وأكثر مما سوف تحصل عليه مني، وفي هذه الامثلة ستجد e.Graphics وبما اننا عرفنا متغير في الحدث Button والذي هو G فقم بتغيير هذا الامر الى الحرف G ليعمل المثال الذي قمت بجلبه.

ولكن هناك أمر عليك معرفته و اساعود ذكرة، وهو الكائنات المستخدمة مع كائن الرسم Graphics

كائن الحجم:

 Dim MySize As New Size(100, 20)

والأرقم تمثل العرض والطول Width و Height

كائن الفرشاة:

  Dim BrushName As New SolidBrush(Color.Blue)

وهي الفرشاة المستخدمة وبين الاقواس يتم اختيار اللون.

كما يوجد نوع أخر من الفرشاة يستخدم في تعبئة اللون او مكان الفرشاة بانواع من الخطوط والاشكال كما بالشكل:

 Dim BrushName As New HatchBrush(HatchStyle.Cross, Color.Black)

ويمكنك تغيير الشكل عن طريق HatchStyle حيث توجد العديد من الانواع.

كائن القلم:

ويمكنك من تحديد القلم المستخدم في الكتابة او الرسم كما بالشكل:

 Dim Pen As New Pen(Color.Black, 12)

كائن النقطة وسبق ان تطرقنا أليه انظر التالي:

 Dim MyPoint As New Point(34, 50)

كما يمكنك رسم الخطوط كما بالشكل التالي:

 Dim G As Graphics = Me.CreateGraphics

 G.DrawString("Windows", Me.Font, Brushes.Black, 10, 10)

وطبعاً يمكنك التغيير في نوع الفرشاة ونوعية الخط والحجم كما تريد.

وهذا مثال عن استخدام تدرج الالوان:

Imports System.Drawing

Imports System.Drawing.Drawing2D

Imports System.Drawing.Imaging

Imports System.Drawing.Text

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim G As Graphics = Me.CreateGraphics

        Dim R As New RectangleF(5, 5, 200, 150)

        Dim FirstColor As Color = Color.DarkRed

        Dim SecoudColor As Color = Color.Blue

        Dim BrushName As New LinearGradientBrush(R, FirstColor, SecoudColor, _

        LinearGradientMode.Vertical)

        G.FillRectangle(BrushName, New Rectangle(5, 5, 200, 150))

    End Sub

End Class

قم بالتغيير في الأطوال والألوان وفي Linear حتى تتمكن من فهم طريقة عمله.

كما يمكنك رسم صورة كما بالشكل التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Using G As Graphics = Me.CreateGraphics

            Dim bitmap As New Bitmap("G:\png\VIPv2\Vista Icon Pack 2.0 - PNG Version\Internet & Network\Icon (22).png")

            G.DrawImage(bitmap, 60, 10)

        End Using

    End Sub

End Class

وستكون النتيجة كما بالشكل :

انشاء كائن Graphics وكذلك Bitmap والذي يحتاج الى مسار الصورة تم رسم الصورة بالاحداثيات المطلوبة .

ايضاً من الممكن تغيير دقة عرض الصورة انظر للشكل التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Using G As Graphics = Me.CreateGraphics

            Dim bitmap As New Bitmap("G:\png\VIPv2\Vista Icon Pack 2.0 - PNG Version\Internet & Network\Icon (22).png")

            Dim pThumbnail As Image = bitmap.GetThumbnailImage(100, 100, Nothing, _

               New IntPtr())

            G.DrawImage( _

               pThumbnail, _

               10, _

               10, _

               pThumbnail.Width, _

               pThumbnail.Height)

        End Using

    End Sub

End Class

الصورة الناتجة بدقة عرض 100 بيكسل في 100 بيكسل

كما من الممكن تدوير الصورة بالشكل المطلوب انظر للشكل التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Using G As Graphics = Me.CreateGraphics

            Dim bitmap As New Bitmap("G:\png\VIPv2\Vista Icon Pack 2.0 - PNG Version\Internet & Network\Icon (22).png")

            bitmap.RotateFlip(RotateFlipType.Rotate90FlipXY)

            G.DrawImage(bitmap, 0, 0)

        End Using

    End Sub

End Class

نتيجة العملية كما بالشكل :

طبعاً درجة الاستدارة من الممكن ان تتحكم فيها عن طريق هذا التركيب والذي يعطيك كل الزوايا المطلوبة انظر للشكل التالي :

كذلك يمكنك حفظ الصورة بصيغة مختلفة أنظر للشكل التالي :

Imports System.Drawing.Imaging

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Using G As Graphics = Me.CreateGraphics

            Dim bitmap As New Bitmap("G:\png\VIPv2\Vista Icon Pack 2.0 - PNG Version\Internet & Network\Icon (22).png")

            G.DrawImage(bitmap, 0, 0)

            bitmap.Save("C:\MyImage.Gif", ImageFormat.Gif)

        End Using

    End Sub

End Class

سيتم حفظ الصورة بالمسار المحدد والصيغة المحددة.

حيث ان ImageFormat لها العديد من الخصائص والتي تستطيع منها تحديد الصيغة أنظر للشكل التالي :


البناءات Enum

لاحظ كيف عرفنا البناء وكيف قمنا باستخدامه، فمجرد كتابة أسمه متبوعاً بنقطة يتم عرض كل مايحتويه لتختار منه القيمة المطلوبة.

كما يمكنك ان تضع فيه قيماً كما بالشكل:

 Public Class Form1

    Enum edit

        name

        Address

        Phone

        City

    End Enum

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        TextBox1.Text = edit.name

        TextBox1.Text = edit.City

    End Sub

End Class

وفي هذه الحالة ستعود برقم يمثل الموقع حسب ترتيبه.

هنا بالصورة عن طريقة الاستخدام.

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

صورة اخرى لاستخدام التركيب مع بارمترات اي اجراء:

 Public Class Form1

    Enum edit

        num1 = 118

        num2 = 119

        num3 = 120

        num4 = 121

    End Enum

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        mytest(edit.num3)

    End Sub

    Private Sub mytest(ByVal value As edit)

        MsgBox(value)

    End Sub

End Class

حتى الان تم تعريف هذا البناء او التركيب على مستوى Class هذه يمكنك أضافة عبارة Public قبل عبارة Enum ليصبح البناء عاما ً.

طريقة استخدام التركيب مع احد الاجراءات او كبارامتر باحد الاجراءات، وتلاحظ بمجرد نقر زر المسافة بعد اسم الاجراء او فتح قوس يعطيك الفجوال قائمة لتحدد منها ماتريد.

أيضاً اذا قد تجد تركيباً كما بالمثال السابق نقوم فيه باسناد ارقام الى الحقول وهي تقوم باظهار هذه الحقول حسب ترتيب الارقم من الاصغر الى الاكبر.

واذا نظرت الى الصورة تحت ومع ان Name هي الاولى بداخل الترتيب الا انها تظهر عند الاستخدام بالترتيب الثالث.

ولكن كان من الجيد لو كان بمقدورنا التحكم اكثر في هذه التركيبات مثل ان نغير قيمها، وتكون نصية، حسناً يمكننا ذلك من خلال العبارة Structure أنظر المثال:

 Public Class Form1

    Structure File

        Dim name As String

        Dim Address As String

        Dim City As String

        Dim age As Integer

    End Structure

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As File

        mytest(value.Address)

    End Sub

    Private Sub mytest(ByVal value As String)

        MsgBox(value)

    End Sub

End Class

الامر واضح صرت تفهم الطريقة بالتاكيد من الشرح السابق، مع ملاحظة انه لايمكننا اسناد القيمة من الاسم مباشرة أي File تم نقطة من احد الخيارات وانما من الضروري تعريف متغير ليحل محل التركيب انظر المثال بشكل واضح:

وهذه صورة توضح ظهور الـ Structure هنا

ولكن حتى الان ستظهر الرسالة فارغة لان لاقيم يحملها هذا التركيب ولنفعل ذلك يهذه الطريقة:

 Public Class Form1

    Structure File

        Dim name As String

        Dim Address As String

        Dim City As String

        Dim age As Integer

    End Structure

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As File

        value.name = TextBox1.Text

        value.Address = TextBox2.Text

    End Sub

End Class

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

كما يمكننا استخدام العبارة With لاختصار الكود وتسهيل التعامل مع التركيب مثال هنا:

Public Class Form1

    Structure File

        Dim name As String

        Dim Address As String

        Dim City As String

        Dim age As Integer

    End Structure

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As File

        With value

            .name = TextBox1.Text

            .Address = TextBox2.Text

            .City = TextBox3.Text

            .age = TextBox4.Text

        End With

    End Sub

End Class

يمكنك مشاهدة العبارة With وايضاً End With حيث صار بامكاننا كتابة نقطة لنحصل على المحتويات بدل من كتابة Value تم كتابة نقطة بعدها وهكذا.

والان أنظر الى طريقة متداخلة :

 Public Class Form1

    Structure File

        Dim name As String

        Dim Address As String

        Dim City As String

        Dim age As Integer

        Structure Work

            Dim Company As String

            Dim Weeakend As Date

        End Structure

    End Structure

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim value As File

        Dim test As File.Work

        value.name = TextBox1.Text

        value.Address = TextBox2.Text

        test.Company = TextBox2.Text

    End Sub

End Class

كذلك يمكنك إنشاء اي اجراءات بداخل التركيب انظر للتالي:

Public Class Form1

    Structure File

        Dim name As String

        Dim Address As String

        Dim City As String

        Dim age As Integer

        Structure Work

            Dim Company As String

            Dim Weeakend As Date

        End Structure

        Sub StrFunc(ByVal myint As Integer, ByVal mystring As String)

        End Sub

    End Structure

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim op As New File

        op.StrFunc(1, "AnyString")

    End Sub

End Class

واضح الاجراء هنا وهو مضلل باللون الاصفر.

ضع بالاعتبار ان قابلية الرؤية لاي متغير بداخل التركيب او أي حقل او اجراء ان كان Private فلن يمكنك رؤيته او التعامل معه من خارج التركيب.

وان اردت ان تتعامل معه من خارج مشروعك فعليك ان تجعله Public

أما اذا اردت ان تتعامل معه على مستوى المشروع فيمكنك تركه بلا تعريف وسيكون Friend


العمليات الحسابية

معالجة الأخطاء Debug Error

كيف يمكنك معالجة الأخطاء وتتبعها في برنامجك خطوة بخطوة.

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

والأخطاء عدة أنواع .

أخطاء هجائية :

وهي الأخطاء التي تكون نتيجة الخطاء بكتابة أوامر الفيجوال بيسك مثل الشكل التالي :

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

وكما يظهر بالصورة الرسالة تقول الاسم msbox غير معروف.

وطبعاً المقصود هو Msgbox الأمر ينقص حرف G فقط .

مع ان مثل هذه الأخطاء البسيطة من المفروض ان يكون محرر الكود أكثر ذكاء ويعرض التصحيح تلقائياً .

ولمزيد من التفصيل يمكنك مراجعة النافذة Error List والتي تحدثنا عنها وستجد الشرح بالدرس Some Windows .

كما ان هذا النوع من الأخطاء لا تفيد معه أوامر المعالجة مثل :

Public Class Form1

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        On Error Resume Next

        msbox("End War is coming")

    End Sub

End Class

فهذه الأوامر لمعالجة الأخطاء التي تحدث أثناء التنفيذ ( Run-Time Error )

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

تقول هناك خطاء في بناء التطبيق ، هل تريد الاستمرار في تشغيل أخر بناء للبرنامج كان ناجحاً ....؟

طبعاً في كل مرة تقوم فيها بتشغيل البرنامج يقوم الفيجوال بترجمة فورية وينتج الملف التنفيذي.

اذا اخترت نعم فلا فائدة من ذلك بأي شكل وكان لان كل التغييرات الجديدة تم تجاهلها.

لذلك اختر لا او NO ليظهر لك الفيجوال الأخطاء بنافذة Error List كما بالشكل التالي :

أخطاء أثناء التنفيذ :

قم بكتابة هذا السطر البرمجي هنا كما بالشكل التالي :

Public Class Form1

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt")

    End Sub

End Class

هذا السطر يقوم بنسخ الملف المسمى Source من محرك الأقراص C الى المسار المحدد يعدها وبالاسم Dest .

اذا شغلت البرنامج الان ستحصل على الشكل التالي :

بداية ما حدث الان هنا هو لا يسمى خطاء وإنما يسمى استثناء exception بمعنى أخر .

نحن طلبنا من البرنامج ان يقوم بنسخ الملف المحدد.

والكود او الأوامر سليمة مئة في المئة ولا يوجد خطاء بها.

اذا سيتم تنفيذ الأمر ونسخ الملف المحدد .

ولكن ....!!!

ماذا لو ان الملف غير موجود ....!!!!

هذا هو الاستثناء الذي قد يحدث .

ومن الشكل السابق يظهر عنوان النافذة التالي FileNotFoundException was unhandled .

وتحته Could Not Find File "C:\Source.txt

باختصار يقوم ان الملف هذا غير موجود.

تحت العنوان Troubleshooting tips يقترح عليك البرنامج اختيار احد الروابط لمزيد من التفصيل ومناقشة الحلول المقترحة.

اذا نقرت على أي منها سيتم نقلك لمكتبة MSDN والتي تحتوي على كل التعليمات الخاصة بالفيجوال وللحل المقترح كما بالشكل التالي :

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

ويحتوي على الجملة FileExists وهذا هو الحل الأمثل بمثل هذه الحالة.

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

اذا نقرت عليه ستنتقل الى صفحة ستجد فيها المثال التالي :

If My.Computer.FileSystem.FileExists("c://Check.txt") Then

            MsgBox("File found.")

 Else

            MsgBox("File not found.")

 End If

هذا المثال يحدد الطريقة الصحيحة لمعرفة هل الملف والمسار المحدد صحيح أم لا .

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

وبالعودة الى الشكل السابق كما بالشكل التالي :

يوجد الخيار Search for more Help Online وهو بحال كان عندك اتصال بالانترنت حيث سيتم عرض الحلول والتعليمات وكل المواضيع التي لها علاقة بهذا الحدث.

تحت العنوان Actions يوجد الخيار View Detail والذي سيقوم بعرض النافذة التالي :

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

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

لا تقم بتشغيل البرنامج وأنت تنقر على الزر Start Debuging وهو السهم الأخضر الصغير او بنقر المفتاح F5 .

وإنما أنقر على المفتاح F8 أو من القائمة Debug أختر الأمر Step Into وعندها سيتم تشغيل البرنامج والتوقف على أول سطر منه.

الان نريد ان نتتبع قيم بالبرنامج.

تصور لو انك تقوم ببعض العمليات والتي تعطيك ناتجاً ليس هو الناتج المطلوب .

هذا المثال البسيط سيوضح الفكرة اكتب الأوامر التالية .

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim myvalue(5, 3) As Integer

        myvalue(0, 0) = 1

        myvalue(0, 1) = 2

        myvalue(0, 2) = 3

        myvalue(0, 3) = 4

        myvalue(1, 0) = 5

        myvalue(1, 1) = 6

        myvalue(1, 2) = 7

        myvalue(1, 3) = 8

        myvalue(2, 0) = 9

        myvalue(2, 1) = 10

        myvalue(2, 2) = 11

        myvalue(2, 3) = 12

        myvalue(3, 0) = 13

        myvalue(3, 1) = 14

        myvalue(3, 2) = 15

        myvalue(3, 3) = 16

        myvalue(4, 0) = 17

        myvalue(4, 1) = 18

        myvalue(4, 2) = 19

        myvalue(4, 3) = 20

        myvalue(5, 0) = 21

        myvalue(5, 1) = 22

        myvalue(5, 2) = 23

        myvalue(5, 3) = 24

        Dim minteger1 As Integer

        Dim minteger2 As Integer

        Dim minteger3 As Integer

        minteger1 = myvalue(0, 2) + myvalue(1, 0) + myvalue(1, 3)

        minteger2 = myvalue(3, 2) + myvalue(1, 3) + myvalue(3, 1)

        minteger3 = myvalue(5, 2) + myvalue(1, 2) + myvalue(3, 3)

     End Sub

End Class

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

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

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

وذلك لنستخلص منه بعض المعلومات أنظر للشكل التالي:

اظهر لنا الفيجوال المصفوفة والقيم التي تحتوي عليها وقال ان طولها هو 24 Length

وكما ترى بالقائمة من الأبعاد (1,3) وما بعدها كلها تحتوي على القيم صفر لأننا لم نصل لها بعد ولم يقم الفيجوال بإسناد القيم لها.

أما التي قبلها فقد عرض لنا قيمها كما بالشكل .

الان أستمر بالتقدم لنرى النتيجة النهائية ولا تتوقف الا على السطر End Sub كما بالشكل التالي :

اذا حركت مؤشر الفأرة فوق أي متغير فستحصل على قيمته كما ترى بالشكل ان المتغير minteger3 يساوي القيمة 46

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

عندها يجب استخدام نقاط التوقف Break Point وتفعل ذلك ضع المؤشر على السطر الذي تريد ان تتوقف عند وانقر الزر F9

او أنقر مباشرة بزر الفأرة الأيسر على الشريط الرمادي الى آخر جهة اليسار.

وستحصل على الشكل التالي :

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

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

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

كما يوجد توقف مشروط أي وضع نقطة توقف يتوقف عندها البرنامج اذا تحقق شرط معين أكتب الكود التالي :

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        For value As Integer = 1 To 100

            Debug.WriteLine(value)

        Next

 End Sub

الان نريد من البرنامج ان يتوقف عندما تصبح قيمة المتغير Value تساوي 44 عندها نضع نقطة توقف على السطر المطلوب وننقر زر الفأرة الأيمن على نقطة التوقف فنحصل على القائمة التالية :

الان أنقر على الخيار Hit Count لتحصل على هذه النافذة كما بالشكل التالي :

قمنا بتحديد الخيار breeak when the hit count is equal to وفي المربع الذي ظهر كتبنا القيمة 44

ويعني توقف عندما نحصل على القيمة 44 الان انقر الزر OK وستلاحظ ان شكل نقطة التوقف قد تغير.

وأصبح يحمل علامة +

والخيارات بالنافذة السابقة هي كما بالشكل التالي :

الخيار الأول يعني توقف بكل الأحوال لا شرط محدد.

الخيار الثاني يعني اذا كان يساوي القيمة كذا

الخيار الثالث توقف عند مضاعفات الرقم المحدد يعني اذا كتبنا 15 فسوف يتوقف عندها ويلف ويتوقف عن 30 تم 45 تم 60 وهكذا .

الخيار الرابع اذا كان اكبر من او يساوي

شغل البرنامج ولن يتوقف الا بحال تحقق هذا الشرط أنظر للشكل التالي :

بمجرد ان توقف البرنامج تحققنا من قيمة Value فوجدنا انها تساوي 44 .

كما ان الخيار Condition أيضا يستخدم في وضع شرط للتوقف وسيظهر النافذة التالية :

اذا تحقق الشرط وكانت Value=44 هي Ture يحدث التوقف.

اما اذا حددت الخيار من الأسفل Has Changed فهو بحال حدث تغيير في قيمة المتغير .

كما يمكنك النقر على أي نقطة توقف ليتم إزالتها.

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

أكتب الكود التالي :

  Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb"

  Dim con As New OleDb.OleDbConnection(ConString)

  con.Open()

الان أنظر لهذا الشكل هنا :

كما تشاهد نتعامل مع المتغيرات وكأننا بمحرر الكود .

فمثلاً يمكننا كتابة الأمر التالي Con.state=1 وهي توقف اذا كان الاتصال مفتوحاً او صفر اذا كان الاتصال مغلقاً.

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

وكذلك يمكنك استخدام أكثر من نقطة توقف واحدة .

أكتب الكود التالي كما بالشكل :

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db1.mdb "

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim da As New OleDbDataAdapter("SELECT * FROM t1", con)

        Dim ds As New DataSet()

        Try

            con.Open()

            da.Fill(ds, "t1")

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

            MsgBox(ex.Message)

        Finally

            con.Close()

        End Try

    End Sub

End Class

هذا احد الأمثلة التي شرحناها واستخدمناها بدروس التعامل مع قواعد البيانات.

قم بوضع نقاط توقف على السطرين السابقين وكما بالشكل تم شغل البرنامج.

سيتم التوقف على النقطة الأولى عندها اذهب الى القائمة Debug وستجدها كما بالشكل التالي :

كما تلاحظ لقد تغيرت تماماً وحملت العديد من الخيارات الأخرى .

أختر الخيار QuickWatch لتحصل على النافذة التالية :

من Expression حدد الكائن او المتغير او اي ما تريد مراقبته وانقر على Reevaluate لتطالعك معلومات عنه كما تشاهد.

او أختر Add Watch ليتم إضافته الى المجموعة التي نريد مراقبتها في القائمة Watch1 كما بالشكل :

وبمثالنا السابق كما بهذا الشكل :

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        For value As Integer = 1 To 100

            Debug.WriteLine(value)

        Next

 End Sub

ضع نقطة توقف كما بالشكل المضلل .

وشغل البرنامج تم من النافذة QuickWatch اكتب Value تم انقر الزر Add Watch لتجد انه قد تم إضافة المتغير الى النافذة Watch1 .

انقر على الزر F8 نقرة بعد نقرة وراقب النافذة Watch1 لترى المتغير وقيمته تتغير باستمرار كما بالشكل التالي :

كما تشاهد المتغير وقيمته ونوعه.

وتفيد هذه الطريقة في مراقبة العديد من المتغيرات والعمليات .

هل تذكر مثالنا السابق عن المصفوفات يمكننا مراقبته بنفس الطريقة وسنحصل على النتيجة التالية :

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


الملفات والمجلدات Files & Fold

الملفات والمجلدات Files & Folders

نسخ الملفات

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.FileSystem.CopyFile("C:\Source.txt", "C:\NewFolder\Dest.txt", True)

    End Sub

End Class

المسار الاول هو للملف المراد نسخه والمسار الثاني الجهة المراد نسخ الملف اليها والاسم الجديد للملف او يمكنك نسخه بنفس الاسم، True أذا اردت النسخ فوق الملف اذا كان موجوداً بنفس الاسم.

حذف ملف

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.FileSystem.DeleteFile("C:\Test.txt", FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)

    End Sub

End Class

لاحظ ان السطر لم تسعه الصفحة فتم ادراجه على سطرين، هنا مسار الملف، والخيار الثاني اذا كنت تريد ظهور رسائل تاكيد على العملية، والخيار الثالث هل يتم ارسال الملف الى سلة المحذوفات ام حذفه نهائياً من الجهاز.

نقل ملف

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.FileSystem.MoveFile("C:\OldDirectory\File.txt", "c:\NewDirectory\File.txt", True)

    End Sub

End Class

نفس خيار النسخ الا ان الملف الاصلي حذفه بعد عملية النسخ.

القراءة من ملف نصي

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim fileContents As String

        fileContents = My.Computer.FileSystem.ReadAllText("C:\Test.txt")

        TextBox1.Text = fileContents

    End Sub

End Class

كتابة نص في ملف

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        My.Computer.FileSystem.WriteAllText("C:\Test.txt", "Text", True)

    End Sub

End Class

مسار الملف كالعادة وما يفرضه المنطق، النص المراد كتابتها ومن الممكن ان تضع بدل ذلك مثل Textbox1.text

تم True اذا كنت اضافة النص الى اخر الملف ام حذف الاول ووضع النص الجديد، كما لاحظ ان وبحال عدم وجود الملف سيتم إنشاءه.

الكتابة الى ملف Data بيانات ثنائية

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim fileContents() As Byte = {244, 123, 56, 34}

        My.Computer.FileSystem.WriteAllBytes("C:\Output.bin", fileContents, True)

    End Sub

End Class

الكتابة و القراءة من ملف ثنائي عن طريق الفئة BinaryWriter وكذلك BinaryReader وايضا FileStream

   Dim FS As FileStream = File.Open("C:\MyFile.dat", FileMode.OpenOrCreate)

        Dim MFile As New BinaryWriter(FS)

        MFile.Write(17)

        MFile.Write("Hello")

        MFile.Write(True)

        MFile.Write(128.001)

        MFile.Close()

للكتابة نستخدم الطريقة Write وللقراءة نستخدم الطريقة Read أنظر للشكل التالي :

    Dim FS As FileStream = File.Open("C:\MyFile.dat", FileMode.OpenOrCreate)

        Dim MFile As New BinaryReader(FS)

        Me.ListBox1.Items.Add(MFile.ReadInt32())

        Me.ListBox1.Items.Add(MFile.ReadString)

        Me.ListBox1.Items.Add(MFile.ReadDouble)

        Me.ListBox1.Items.Add(MFile.ReadBoolean())

        MFile.Close()

بالمثال انا اضع القيم باداة ListBox كما تلاحظ.

وايضا استخدم OpenOrCreate

وذلك حتى يتم إنشاء الملف بحال كان غير موجوداً

التأكد من وجود ملف

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim fileExists As Boolean

        fileExists = My.Computer.FileSystem.FileExists("C:\Test.txt")

    End Sub

End Class

طبعاً اذا كان الملف موجوداُ فستجد قيمة fileExists =True

الحصول على ملفات بمجلد

 Dim files As System.Collections.ObjectModel.ReadOnlyCollection(Of String)

        files = My.Computer.FileSystem.GetFiles("C:\", FileIO.SearchOption.SearchTopLevelOnly, "*.*")

        Dim i As Integer

        For i = 1 To files.Count

            MsgBox(IO.Path.GetFileName(files.Item(i)))

        Next

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

يتم العودة بمصفوفة تحمل كل اسماء الملفات بمساراتها، وعليه استخدمنا For لاستخراج هذه المسارات.

لتغيير سمة ملف

 SetAttr("d:x.gif", FileAttribute.ReadOnly)

مسار الملف، تم حدد السمة التي تريدها هذا كل شئ

للحصول على ايقونة ملف

  Dim myIcon As Icon

        myIcon = Drawing.Icon.ExtractAssociatedIcon("filename")

  Me.Icon = myIcon

قمنا بتعريف متغير على أنه ايقونة تم وضعنا به الايقونة التي تخص الملف، حيث Filename هو مسار الملف، تم اخبرنا البرنامج ان يضع هذه الايقونة للنموذج الحالي.

قراءة ملف نصي سطر بسطر:

If My.Computer.FileSystem.FileExists("C:\test.txt") Then

    Using File As New IO.StreamReader("C:\test.txt")

                Dim Row As String

                Do

             Row = File.ReadLine

              If Row Is Nothing Then Exit Do

          Me.ListBox1.Items.Add(Row)

Loop

   End Using

End If

انشئ مشروعاً جديداً وضع عليه أداة ListBox وزر تم في الحدث Click للزر اكتب الكود السابق.

اذهب الى محرك الاقراص C وإنشئ فيه ملق نصي بأسم Test واكتب فيه ما تريد.

تم شغل البرنامج وانقر الزر وسوف ترى ان البرنامج قام بقراءة الملف النصي ووضعه في الاداة ListBox

تلاحظ اننا تأكدنا من وجود الملف أولاً تم ندخل تكرار لا يتم الخروج منه الا بشرط حيث تقوم ReadLine بقراءة سطر كل دورة

ويتم وضع القيمة بمتغير من نوع String الذي يتم اضافته الى الاداة ListBox

استخدام ملفات INI للقراءة والكتابة.

أنظر بداية الى الكود التالي:

Public Class Form1

    Public Declare Auto Function GetPrivateProfileInt Lib "kernel32" _

    (ByVal lpApplicationName As String, ByVal lpKeyName As String, _

    ByVal nDefault As Integer, ByVal lpFileName As String) As Integer

    Public Declare Auto Function GetPrivateProfileSection Lib "kernel32" _

    (ByVal lpAppName As String, ByVal lpReturnedString As String, _

    ByVal nSize As Integer, ByVal lpFileName As String) As Integer

    ' Public Declare Auto Function GetPrivateProfileString Lib "kernel32" _

    ' (ByVal lpApplicationName As String, ByVal lpKeyName As String, _

    ' ByVal lpDefault As String, ByVal lpReturnedString As String, _

    ' ByVal nSize As Integer, ByVal lpFileName As String) As Integer

    Public Declare Auto Function WritePrivateProfileSection Lib "kernel32" _

    (ByVal lpAppName As String, ByVal lpString As String, _

    ByVal lpFileName As String) As Integer

    ' Public Declare Auto Function WritePrivateProfileString Lib "kernel32" _

    ' (ByVal lpApplicationName As String, ByVal lpKeyName As String, _

    ' ByVal lpString As String, ByVal lpFileName As String) As Integer

    Public Declare Auto Function GetPrivateProfileString Lib "kernel32" _

    (ByVal lpApplicationName As String, ByVal lpKeyName As String, _

    ByVal lpDefault As String, ByVal lpReturnedString As String, _

    ByVal nSize As Integer, ByVal lpFileName As String) As Integer

    Private Declare Auto Function WritePrivateProfileString Lib "kernel32" _

    (ByVal lpApplicationName As String, ByVal lpKeyName As String, _

    ByVal lpString As String, ByVal lpFileName As String) As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Value2 As Long

        Dim AnyValue As String

        AnyValue = Space(255)

        Value2 = GetPrivateProfileString("desktop", "backstyle", _

        "Untitled.png", AnyValue, Len(AnyValue), "c:\Seting.ini")

         MsgBox(AnyValue)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Try

             Dim AnyValue As String

            AnyValue = Space(255)

            AnyValue = WritePrivateProfileString("desktop", "backstyle", _

            "AnyValue", "c:\Seting.ini")

        Catch ex As Exception

        End Try

    End Sub

End Class

بداية لاحظ انني قمت بضم الكود تحت بضعه ووصلته بالعلامة ( _ ) والتي تفيد ان السطر التالي للكود يتبع السطر الذي قبله.

ولولا ذلك ما استطعت ان ترى الكود بشكل جيد.

ثانياً للتعامل مع هذا النوع من الملفات نحتاج الى التعامل مع دوال API المكتوبة بالاعلى.

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

[desktop]

backstyle=Untitled.png

لاحظ انني كتبت في البارامتر الاول أسم التطبيق ويعني به هنا [Desktop] أنظر اين يوجد هذا الاسم ويمكنك ان تسميه ما تريد.

كما يوجد البارامتر الثاني وهو Backstyle وهو أسم الفتاح أنظر أين يوجد هذا الاسم.

تم وضعت القيمة Untitled.png من نوع String وهي القيمة الافتراضية بحال لم يجد الملف او وجد قيمة خالية.

تم حجم السلسلة كـ Integer

تم مسار الملف المراد قراءاته، والقيمة العائدة ستكون Untitled.png كما هو واضح من محتويات الملف.

أما بحال الكتابة WritePrivateProfileString عنوان التطبيق والمفتاح والقيمة المراد كتابتها ومسار الملف.

لاحظ وبحال لم يجد النظام هذا الملف فسيتم إنشاءه تلقائياً ووضع هذه القيم به.

ولزيادة الايضاح أنظر الى هذا المحتوى لمزيداً من التفصيل.

[File]
UserName=Ali Mohamed
PassWord=1971

[Application]
 Path=C:\windows\system32
 Ver=0.01

[Help]
Abut=Nothing
 System=Windos-xp

لاحظ الان كل عنوان لتطبيق وما هي المفاتيح التي تندرج تحته وقيمها.

فمثلاً للوصول الى المفتاح Ver وتغيير قيمته نكتب التالي:

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Value2 As Long

        Dim AnyValue As String

        AnyValue = Space(255)

        Value2 = GetPrivateProfileString("Application", "Ver", _

        "D:\New Folder\", AnyValue, Len(AnyValue), "c:\Seting.ini")

         MsgBox(AnyValue)

    End Sub

ولاحظ المفاتيح والقيمة الافتراضية.

حسناً هناك الكثير بعد لتشاهده عن المجلدات والملفات وسوف تستخدم نفس الاسلوب المتبع هنا، ولتحصل على الكود أذهب الى محرر الكود وانقر بزر الفأرة الايمن سوف تظهر القائمة التالية:

اختر Insert Snippet ستظهر القائمة التالي:

أختر الخيار المحدد بالصور ستظهر لك قائمة بكل الأوامر الجاهزة اختر منها ما تشاء.

وسوف نتحدث لاحقاً كيف يمكننا اضافة او تعديل او الحذف من والى هذه القائمة.


نافذة التصميم Desiner form

نافذة التصميم Designer form

هذا المكان الذي ستظل تحوم حوله وتدور مع كل برنامج تعمل عليه وستحفظه في سرعة وتحفظ كل جزء منه لانه معك دائما، فكل الادوات وكل النوافذ وكل الاكواد التي تكتبها هذا مكانها.

بامكانك ان تنتقل بين نافذة التصميم ونافذة الكود بكل سهولة ويسر وذلك عن طريق التبويب الموجود باعلى النافذة وشكله كالتالي:

أي نافذة تنشئها تحمل في التبويب أسمها واذا كان يتبع الاسم [design] فهذا يعني نافذة في طور التصميم والا فان ذلك يعني انك بمحرر الكود لها.

ويمكنك ان تلاحظ هنا انه لذينا نموذج واحد ويحول الاسم Form1 وفي التبويب بالاعلى لذينا Form1.vb وهي نافذة الكود Form1.vb design وهي النافذة في طور التصميم.

وبالنقر على التبويب Form1.vb سننتقل الى نافذة الكود كاتالي:

كما يمكنك التنقل بين طور التصميم وطور الكود او نافذة الكود بالنقر من خلال هذين الزرين بنافذة Solution explorer كما بالشكل:

وأيضاً يمكنك الانتقال الى طور التصميم عن طريق القائمة الفجائية وذلك بالنقر بزر الفأرة الايمن لتظهر لك كما بالشكل التالي:

من هذه القائمة يمكنك أختيار View Designer للانتقال الى طور التصميم، وسأترك لك اكتشاف باقي ما في هذه القائمة.

كما اذا نقرت بزر الفأرة الايمن على الفور يمكنك ان تطالع التالي:

لاحظ وجود الخيار View Code وهما ما يسمح ايضاً بالانتقال الى طور معالجة الكود.

Lock Controls | هو للقيام بقفل الادوات او بمعنى اصح منع التغيير في اطوالها واحجامها ومواقعها
Properties | وهو للانتقال الى خصائص الاداة التي نقرت عليها او النموذج وسوف نتطرق الى ذلك لاحقاً.

وطبعاً وجود ذلك التبويب سهل كثيرا العمل خاصة اذا كان المشروع يحتوي على العديد من النماذج.

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

كما تم أضافة ميزة او خاصية جديدة الى نافذة الكود وهي امكانية اخفاء واظهار الاجراءات كيفما تشاء كالتالي:

مع بداية كل إجراء يوجد علامة + أو - وتعني الأولى بان الإجراء معروض بالكامل والثانية ان الإجراء مخفي.

وهنا يمكنك ان تشاهد الاجراء MouseDown وهو مقفل اما باقي الاجراءات فمفتوحة كلها، وطبعاً هذا سهل من عملية قراءة الكود بخاصة اذا كانت الصفحة تحتوي على العشرات من الاجراءات.

كما يمكنك معاينة جزء من الكود حتى وهو بهذه الحالة أنظر للشكل التالي :

كما ترى مرر الفأرة فوق الاجراء المخفى لتحصل على جزء من الكود .

بمحرر الكود وفي القائمة التي على اليمين من الاعلى فتحتوي على كل الاحداث التي يمكنك قنصها ، وهما كما بالشكل التالي:

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

اما الاحداث فقد تم أدراج العديد من والتي لن تحتاج الى أكثر منها بل لن تحتاج اكثر من ربعها.

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

وهذه صورة لنافذة الأدوات الموجودة على النموذج ويمكننا ان نرى وجود بعض الأدوات مثل Button - listbox - textbox وغيرها.

تحدثت عن الـ Designer form وكذلك يوجد الـ Form Designer

من المهم حقاً ان تقوم بالاطلاع على محتويات هذا الملف للفهم وزيادة الخبرة، فهنا يتم كتابة كل الأسطر البرمجة بواسطة الفيجوال نت ، فاي اداة تضيفها الى النموذج او اي خاصية تقوم بتغييرها يتم كتابة الكود الخاص بذلك هنا من نافذة Solution explorer قم بعرض كل الملفات وكما هو ظاهر بالصورة التالية :

هناك زر محدد بالأعلى له التلميح Show All Files هو المسئول لإظهار هذه الملفات.

بعدها انقر بجانب العلامة الصغير + أمام الملف Form1 او أختر اي نموذج لك.

بعدها أختر او أنقر على Form1 Desinger.vb كما بالصورة فوق :

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

 <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Partial Class Form1

    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.

    <System.Diagnostics.DebuggerNonUserCode()> _

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing AndAlso components IsNot Nothing Then

            components.Dispose()

        End If

        MyBase.Dispose(disposing)

    End Sub

    'Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer

    'It can be modified using the Windows Form Designer.

    'Do not modify it using the code editor.

    <System.Diagnostics.DebuggerStepThrough()> _

    Private Sub InitializeComponent()

        Me.Button1 = New System.Windows.Forms.Button

        Me.SuspendLayout()

        '

        'Button1

        '

        Me.Button1.Location = New System.Drawing.Point(28, 26)

        Me.Button1.Name = "Button1"

        Me.Button1.Size = New System.Drawing.Size(75, 23)

        Me.Button1.TabIndex = 0

        Me.Button1.Text = "Button1"

        Me.Button1.UseVisualStyleBackColor = True

        '

        'Form1

        '

        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)

        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font

        Me.ClientSize = New System.Drawing.Size(582, 448)

        Me.Controls.Add(Me.Button1)

        Me.Name = "Form1"

        Me.Text = "Form1"

        Me.ResumeLayout(False)

    End Sub

    Friend WithEvents Button1 As System.Windows.Forms.Button

End Class

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

وأخيراً الادواة الى النموذج.

لا يهمنا هذا الان هو لأجل العلم فقط ولكن عليك ان تزور هذا المكان كثيراً فيما بعد، افعل أشياء معقدة وأضف أدوات واربطها ببعضها وتعال الى هنا وراقب وادرس الكود بهدؤ.

كذلك سيمكنك ملاحظة الملف Form1 ذا اللاحقة resx كما بالشكل التالي :

حسناً هذا هو ملف الريسورس والذي يتم الاحتفاظ فيه بكل بيانات الصور والأيقونات وغيرها والتي تستخدمها اتناء التصميم.

اذا أنقر عليه مرتين ليتم نقلك الى هذا المكان كما بالشكل التالي :

طبعاً انا تحدثت عن هذه النافذة بمكان أخر ولكن ما يهم الحديث عنه هو انك بحال نقرت على الزر View Code فسيتم نقلك الى محرر الكود لهذه النافذة كما بالشكل التالي :

<?xml version="1.0" encoding="utf-8"?>

<root>

  <!--

    Microsoft ResX Schema

    Version 2.0

    The primary goals of this format is to allow a simple XML format

    that is mostly human readable. The generation and parsing of the

    various data types are done through the TypeConverter classes

    associated with the data types.

    Example:

    ... ado.net/XML headers & schema ...

    <resheader name="resmimetype">text/microsoft-resx</resheader>

    <resheader name="version">2.0</resheader>

    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>

    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>

    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>

    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>

    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">

        <value>[base64 mime encoded serialized .NET Framework object]</value>

    </data>

    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>

        <comment>This is a comment</comment>

    </data>

    There are any number of "resheader" rows that contain simple

    name/value pairs.

    Each data row contains a name, and value. The row also contains a

    type or mimetype. Type corresponds to a .NET class that support

    text/value conversion through the TypeConverter architecture.

    Classes that don't support this are serialized and stored with the

    mimetype set.

    The mimetype is used for serialized objects, and tells the

    ResXResourceReader how to depersist the object. This is currently not

    extensible. For a given mimetype the value must be set accordingly:

    Note - application/x-microsoft.net.object.binary.base64 is the format

    that the ResXResourceWriter will generate, however the reader can

    read any of the formats listed below.

    mimetype: application/x-microsoft.net.object.binary.base64

    value   : The object must be serialized with

            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.soap.base64

    value   : The object must be serialized with

            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter

            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64

    value   : The object must be serialized into a byte array

            : using a System.ComponentModel.TypeConverter

            : and then encoded with base64 encoding.

    -->

  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />

    <xsd:element name="root" msdata:IsDataSet="true">

      <xsd:complexType>

        <xsd:choice maxOccurs="unbounded">

          <xsd:element name="metadata">

            <xsd:complexType>

              <xsd:sequence>

                <xsd:element name="value" type="xsd:string" minOccurs="0" />

              </xsd:sequence>

              <xsd:attribute name="name" use="required" type="xsd:string" />

              <xsd:attribute name="type" type="xsd:string" />

              <xsd:attribute name="mimetype" type="xsd:string" />

              <xsd:attribute ref="xml:space" />

            </xsd:complexType>

          </xsd:element>

          <xsd:element name="assembly">

            <xsd:complexType>

              <xsd:attribute name="alias" type="xsd:string" />

              <xsd:attribute name="name" type="xsd:string" />

            </xsd:complexType>

          </xsd:element>

          <xsd:element name="data">

            <xsd:complexType>

              <xsd:sequence>

                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />

              </xsd:sequence>

              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />

              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />

              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />

              <xsd:attribute ref="xml:space" />

            </xsd:complexType>

          </xsd:element>

          <xsd:element name="resheader">

            <xsd:complexType>

              <xsd:sequence>

                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />

              </xsd:sequence>

              <xsd:attribute name="name" type="xsd:string" use="required" />

            </xsd:complexType>

          </xsd:element>

        </xsd:choice>

      </xsd:complexType>

    </xsd:element>

  </xsd:schema>

  <resheader name="resmimetype">

    <value>text/microsoft-resx</value>

  </resheader>

  <resheader name="version">

    <value>2.0</value>

  </resheader>

  <resheader name="reader">

    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

  </resheader>

  <resheader name="writer">

    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>

  </resheader>

  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

  <data name="PictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

    <value>

        R0lGODlhIANYAvQAAAAAAP///25xcH6BgC4yMD5CQE5SUF5iYA4TEB4jIJ+hn4+Rj9/g38/Qz7/Av6+w

        r+/v7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABEALAAA

        AAAgA1gCAAX/ICKOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2Kx2y+16

        v+CweEwum8/otHrNbrvf8Lh8Tq/b7/i8fs/v+/+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2e

        n6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna

        29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wADChxIsKDBgwgTKlzIsKFDhQkWBAig

        4KHFi2oSNJg4wF8CCB0xnvoYcpuDiQsA/z4IAMGASFMrW2pTMLFBQAETA7h8OQrnxJ3WfFIMmCAnBAI8

        RRWdePQazZwpVeZ8kFTUyolUg+acWBHggJxAq3r6+vPaya0CAhqAECCr2E9r217TuLUrwAJskb79hDeA

        3moJGORMK/BAgJJ4EO8FYlgxmQN/Uzh2UyCsCYlDmUBmMVnYAwg/DmgxEGAxkc8+RCMp4HfFAAYtVI8h

        IBMF7cwiZBdhHfnE62QEdPZgnaWv6SHBLd8gfqRv7xI4Ya9gLoaAYOUi6Dog8aDzD+cqoitTEFWH9dJX

        +qI/HoT8jvNHzrdGQTqA9BTwxdAVbmLARsQSedeDfM+NUN99xxBAWP8OgU2UHlsOsheEgjo0uN4QBQg2

        UYEIGDYRgiZYWN1GZYXYH0e7aTifCR7aZw4BJF4oRYsRSqgFjDkVEVdOBZL1IX4xhpHhVtidiOIQO27o

        21YgMrPiC0PmOAUBV21l4xFPthBljUAQ8NRWvRlwVk5NirCljFpEtFWJKlR5mBBerpmlmGuWqcybL6i5

        5pQQ7nllEXi2oKeVQXwk55P11RkiZoRyYeGaRYoggIpH/mConJElyiQ0wW3nwm1yUuFjo39OGICnLIDq

        ZxCj8ljCmGSWoCqpWwhFZApu5iQgDq0qSQKsPyrj3wiGgfZCr2g6cSmtpeYwbG4sHXsoEZT6OkL/cIqW

        gCwY1fJ3ArZr7opDt72BG+t4ARQgAmYwLCvlFL022wNN6iLArgvucgmErdaO8GWwJOSbbBb8ensCo7oO

        UfBz/7pITAJ2IbDRdn0ZK+2qUuQrrw0QkzAxAhXDEC+1az5nrsPahsotpCrkK+64JZtwsp29CGDxUmu6

        9UK1VrS6cQ02j4DzVjq3wDMRrRbopp1Hf8FvpCK0+vINSZ+wdDEr1VtwAAte/O6UGP8MQ9aSHtp1Cz4T

        4W6BmtqZ9spgreDu1Bz3maUIbRcjGFVJTjWDu1e4KfYMeyPQN1YyAF7EvxzGaKfiYIwK9bpb0W0D4yg4

        rrecCpAYcQz/XkHj/+AydNs5VzSEruNW9RqJsgmqg8Fa3NNVvnpOracMsDDAFl3D6FYMTXoMvecAPKAJ

        n5AozceD0efkIsRouQ22K3/uMDQykECFzErR/fApZL89DsIboaLvIoBLc/lhqAi9vcmTjPi31w/j0wPj

        6/A9FPuDf8L9+cNB/3qgIggE8Fr1M8EAseA+tMVvCAU8YPoSKI4FMsGC/hMCBnNAqbNNcHcK/NoXGsiZ

        Bwqhg/QDYQVFOIUNZvAHLrwBwsqkPhXEUAokdI0JgzDDFL5OGQnQDQmmdkMjFPGF2RHiCF52xBloimsy

        oyAJmmgDAUyvBDlUgY+uSIMnerCGzRjAZAxgk/8WUFGDLOSEl6BAISsYIHdREKPyyriCM8aAUqhCYE1s

        mMYhFGt8EmRBFiWzwyDgMYp7bAYEPke5QIZQXy3sowwE4Mg+nOd9QcgQHKOwFiss8mABqOQI7AiDp8nK

        bykgJQwSVRECXHGQKNjiEUxJAnChzxidOoFglHgCVfqAlDgpAwF4eQP55DEJxqkCaY7JxlPpMgDEnKIk

        gXBIEswuUL2cpg+eeAAGRDMFsFxSpYpQzRFck4u6CI7FPBaA8vARkt7TZgt8QgbrbHI5lMLkcNhCMxaQ

        UXs8qA8jn6DOE2zEnSjwpQtoCa2J3HOU8tyBemJ2R9rpcJxEYGiHcNcMbD3/ZyV0fOfA+BfR8ORElFjI

        j0Tt5kxkQqifJkWdDoQyUCd41AQgZYFCXVBO+LU0lSXNwayCSoJwug6dNegpZpiZjIkokSwckiY8o0BF

        W33zCvJBqQwaZjAiPFGrJtAo0LYS0ng+tV/ZnKoQ+PUXDXmwBDu96JoeqgKj6g6bRWDrCNxKDKgd1ASz

        E1dc9UdU6OQMDKq66gwQ9lOvykmxJaDRRJgag4Upwa/tBCxGHznSE9YlairkLBIE9kqLarGQEPwsAsgC

        U11QVgQrQR9bbinVzjrhiFuL6u+QqoIYZdYH1dKnDZ44PxcQ16FVPBRvafBaBMT2BLOtY2FnGrOnvBWu

        /9OlmpxaawK7DhG1a63uRK7Li6JU8ivrHEFMdJpd5Kk1ppzrAXp9wC8D0ndNzaXuoULpgmvGlwZbi9Zo

        +RtLAZdgvSJlAqUqskwztrcGyCIvCry7RPB6NicMbmwwDBOp2W2SLHQVwWBzcMMAo9UGVYLs2OQk4aSy

        LAgmxisKJnoo3aYgxi3uAYdT4GEjhXjE/oyZA0IM0ff6AFn2AeteTUvIzd7OVUMuxlckzBbHBFa6Rm5C

        DGOMmxg84C8JgBVtadAt7k6yTko+835DWwIaH6qm8N2vmXUwZRVUWbMyrm0TYFURJQP5MmvOMziZXGAn

        F4HPCEjzLXCC0APLxQTRTf/wFVzIrwf49sRy+yvIyMWDS7OJB9VqgHBdgOQ1fVM+gb5bnNes4hwwuk2P

        LkGkE/pgHGjKvi74Mwm4uqam8JTQ4hS0Y42iaFsIYCNjni9ODUzrLF8wqJVGgOlgECVcS1bYiz1UfgGc

        6m53OdhkypWGazkAvdhszXAOq5waAKxx7wvZp00vbJkt2j1Xz8HOxgFXGfvtugL7qPa2cDrH1M8e606U

        uq4BBvkFUF5HdQAL6ltJWjVnLe2XyGT2dqqj2SsHBLHGn/K0q0p4WGSNWgYEILgKDP5dAqfVtkjaCq7Z

        m+/L9doAQ+Oo0f591+UOV+bFjsW1V6BpazpV0kiArAX/CxaVk8kU0J4q2H3ydXIVtLvfOTiuxqW4Wjll

        RWDpllW3DE2CgnXF6e7ewdB7+1ujQxOoNe+BA1ziJiLWugVcrRdXty0CCoOW7EKYu3Pv7YtRQSjEEinT

        neEOcx4kYMx6XsG1cePwZSsp5Y+tMNECut+gt4DfW8+JEtG+oF7NPMiHOn2IWOqtyv/A8MhNQeKhK+yE

        h+gksDGX6pvdeAhvV2isz7G0ed5ybFsK9wjQvedZwSgGpOU/KvCQclaS7q0sH+WizrU2h8qU8aHdnWG+

        96VRlXOXc1C5QOB16JkJeruQFgagxzaySoL2sNOg+c/HtvSXDWfrIwFHKPIvTHRS/0AgMCsidVrld133

        dEUAgG8igL4gFAtCE2O2FMz0Fc3FOg3IAJAXebK3ZiXBbxaDakxhTnLSOg3jc2V3KGXFA8cWenJiGer3

        F71ScY8CdE3Wa3/hejsggf4SaydggSfyWhpoBFuSFebCXUWYGvsVMe0mLgroIx0oUefzQWxWC5cSFso2

        Y6IXWT+EXUeHIYKBcUVmW+rHEoDEeqpRAOImGw1jFzNDQIdyfZLic/nyOUhGRwLTahuFfigwebHmX1Dh

        eBCihfTWZl1IAoZBM1vBh8k1iOqFFjT3dq+3ZkCBdjYWhUZhBLbiTm4ifK/wFIpRH9c1UbVhJgHQgrU1

        hTbQF/+qyHgrEH8ooXmElyuo4nT50zBVd2OH4ojqdhh0aFl65IcLuBV8xx2p50gGSIkI0G67VwOiWAKk

        OGN9coogk4qMx4o2cAC+pRi28oqrCASlhiC9km7L8j6jQobb2I2GlRPgKAvY4jtLwQDPcQCstwB6QYF2

        BiZBkCjvWG8poHUjly/gx1I7GC4Gsib2V1FrAoq86I5yRDhrglBnqBcCY2OywnpQVGhygmvHpYLJV1xC

        8yH1eI/5CISyxo/7cigIBSw2ZjcYOQOAOE7dUiThR3y0iJIuyJKvQlG48BQgURIF4CMgQSxVcjr71WhF

        RVZAIIittkAxZheyCIOp9oxjZWr/N8BlVLmVXNmVXtmRdPiDLBGRIEOUJXEARylyszhhTLmSVHlVlPKP

        NLCMX4mVLMAvDllZW+mLp4B2MGgAJgY1thiWzyRz6rh0gbYTM1mXCLkD+RKWWsmYkjmZlJmXtlGXgGmJ

        uIJfhPk/W7krg+kDUymZCymIxsdtVAmSnzCVDXCGwXJ1MHVtEGCZkpd6ZLhwa+YppUaZmAaNqvWIvBmc

        wimZFYcCrOmaDgOb0deRtHmXWxl2stmcKzecDblz+KWOLxCZ/3ULstgACWCadol2inV1INGZftlVL/cC

        AlkAbkadqRiTLjAmvgac7lmf9plq0jkC3fmdG2eFjbgC5DkA/51ZNlRpfwE6oOU3nA6wK4DoAPn5izC4

        kKzweNo2PuIGiXijkIJyoR8yALuYky8Gi+qZlGNXn4J3A5rClxB6nyzaoolUAxQqJx43b0lJAk9kfzF6

        KAzgoTjAfd2GoxxqHzxqA7vJm/gjeRo5WQJaTEkaaBLaCkMpPQEjco1GJ6dJbqDXAOV2A2f4TTEkkC7a

        TtiZAo/yoCsYpmhqnx9qTv7xQPsxkSZgpXTjSlm6pcsxmtu5AnTKgnbqRCzqAK1mRSKnAD5XAHiqocfw

        GlCxpktwhuR1Q2BqjVsQI2Z6B1ujok+gqCjBqEjkDY7abPJmcbbpBW9aqXgweZzaqRtzhv9W5o40IJtj

        qiwxgql9cCafpqq4CjsgWAKMopQu4FsMEKtNgGqpygf85qu5iqulVh40Iqz+SY9eQKyXQACMtaPJeq0g

        aowEoCno9KbQ2gUTVayBcAAD4Cbiiq2LUaQCR6Yx0gDwCQXhiq7yGgrqik6o5p1eoCnnOq/8Ogi7iax6

        qiL42gU0sq/9erCAgGRP2mYqMqNdYCsGi7AS2we9ArAr1yfHGEe3MrEciwkF8BQNoKITlbFQQJQR27Eo

        Cwmaoo0laxTOmrIwiwk0srBP8CUQ8LIxm7OTgDA02wQ3yRI4q7NC2wgFACuqiSQqEqxDu7SdMChtEbTN

        UXdMO7WZ8IL/WNGnWjAAfUKWVNu1Xvu1YBu2Yju2ZFu2Znu2aJu2aru2bNu2bvu2cBu3cju3dFu3dnu3

        eJu3eru3fNu3fvu3gBu4gju4hFu4hnu4iJu4iru4jNu4jvu4kBu5kju5lFu5lnu5mJu5mru5nNu5nvu5

        oBu6oju6pFu6pnu6qJu6qru6rNu6rvu6sBu7sju7tFu7tnu7uJu7uru7vNu7vvu7wBu8wju8xFu8xnu8

        yJu8yru8zNu8zvu80Bu90ju91Fu91nu92Ju92ru93Nu93vu94Bu+4ju+5Fu+5nu+6Ju+6ru+7Nu+7vu+

        8Bu/8ju/9Fu/9nu/+Ju/+ru//Nu//vu//wAcwAI8wARcwAZ8wAicwAq8wAzcwA78wBAcwRI8wRRcwRZ8

        wRicwRq8wRzcwR78wSAcwiI8wiRcwiZ8wiicwiq8wizcwi78wjAcw4n6rsnQGUerLShgquVww2KLgYrA

        w07wFSegAMUpLZ4pGZ8AxFQQTEictW9BN0JxsqulBKrJxGlwL7v2hTmAxZqXw70HCb8RB2TBi1pgxTwR

        xqg3WSuZBGisXV98I2NiTSRSxNMRx9dSJeLUCbP3BjlaaFkwxkmxx9PBUgYLyEYgyDCKx2dwg9fSJ3RM

        pnYjNJQiK4qcCZinxWkAKzJTyVRAJXfnD5fcWtxHsqnCyXByFo/8K/+2l1Gk4iOp7MVf0zyMrAlJCwea

        UgKzTAW5jBG13DIMoAA7UbS9mTiTTE5ct0qrLD8yoiGvzJb6YscjYCub0CLNrAXQHM2qRK4ksAA4K80v

        Qc0ts6RYdKULtcrgjAPXbAZC0Y7VDKHSyELpfAmoHAeJcgLxPAPopRcnIZdW98mMMAC0qgfzTKYF1rP9

        bGQArQMDjaL+jEOQJBjt3F2QdBZx2tCCcCByQNEVHXccqT1VwrLvzNGSQBPf2ggYfWYWGwP1nAIkTcMB

        eYXEI9J/DEmIvAOGjM3JQiJupMRFsBERrSPTQ08GJdN3pROCUwM6HQrNBwk+nW0BbQJJDUowDQP/Te1q

        RJ0et7qI3xGGepTHSwy0ZPAVP60wYP0C2OLHPboS0kFGWHcxooAwUJsYmKwCtDHWf/eBOqddEX3WaoAt

        ZUUadv1BIMLXiPjGRNAiVrkFgC0Fa2ROzEpsZj1Vs2PTYXGkNTDZoiDMpBwHhhpkxWkdN+sDmD1jJ7HZ

        9DHXMUDYaIAziLHYPsDatQRPqg0FKboEnU0sluPaTzAkIVEfqkEjrTbbXZ1SVw0JChDXU3DbeDM1cdFi

        ut0CoI3ciMQCx60Dz20Dwm0GJBJS170DcxzbyZLdykLSISLFGcof+TyigY1yfSIA/lUvEPOFCVAk4i3e

        c2nQl2nYhWDZd+Db/6AV2nq6sac9Z3hR0gNS3DLQ3TRg38FDct5CGvyMz4kYkuGN4H8zOQn9Kk89nbjj

        ykqm4EmAag/gX4iR4b9CTPVt4UKzEWnBqQwePIyqmifREVelAC4tAzztdg6F2DamKgIC4nEKAQ77Ay+O

        ADZu3agtK3RV5IzdgTjjFoaR0nOZE7eIjdM9WtnnZcy41boiOcaV5D1AXmSxE5hhYzRxXSmu3ymAylFW

        TCpuBBqxpg8A0iyNYQJCE/jtAnO+G5VDI8JX5ioA5Iqokwduhm2d4GCePgCV311gHVP4JXrxFRuOAl9S

        L1GeQli+5XgnkunHEkjhyXMm6F9RrAu6chGjzf8qgBm3lOb6RYBuruZDBOcboaLhp4JPFCmQfnzkvMVK

        QqGJLY0WK+hlI+WvrgK5bmuJbh39xOQEJRgLmSghwQChugOsJAI0USDMziAkwrIIc+OTVOL6BOSslQMn

        QeenNXKnNDDZzgK+Fdfr3h+mnTjbPgNRYu72/J8nUAAxkuc8piH23kUlPukZClNfkePDne/7nnVgHjL4

        8eYTwszx2X04YfBjwp+U9e4w6lvw2Sr8Tuku7R0gPipmWvGx4Zy/Cd6MjuTraiYcgvE/GOEco/EqXY3m

        uXko8CjeHpA03x40PN/+9FCC/hRGwOA4j+wwNVFL7vDfYTfv0yKUtOgx8LH/X44iDEDfSo8f1bKQQtEn

        AwpaC1vqA+6Zm1IDbpLSApBfidInJjNVLn/akD3IDQ/rPtL135L1pSQnKkhjUUVTPYj3nf6kcb4CnRT2

        KFAlOZ/aRsb3DN1PT+Qdbb8bLCWhGmIT3u4h8KkhoBFVj2/WY2djLTIAX6KaPgKfM/7STTJ5KspVuvUV

        76geoI9hVx77DN2YOm9+KJ84W/vwIPd5ybgcke9vwwx/vd8DjBKT5/FNpDHthoPJRtuAWaYihz/wL50t

        mP4gu78CUXwshBH65TxedH31MgPRjJVu/liMv+419qFYV0Fb1611pv0Uv0zl4ePqMgMhNjEq5cL2Kn5c

        /4kNKigu0yBgBGPAICeaqiubEky5kKPSIoQ86+Ng+2gBsgsUbAJSo/hj4Ya63jKKGswYh18CFljYCiTl

        SmRSJRq7qzS9IoyWxxEDrEaJW++docUOzPt+RNAIhMNMTZRQwIPUQ8kN4UhDGmKkzd6f1EtAQwJCDgmB

        HmKAA0KCKNQlApXTDCqCCAknSx1KQl4Co06emsLn6gjayilLFgmpKYkhiiVTWypgYaFNL42e81yCjsAz

        E8xmpw7oSiArCYRsH3miKKmNVjmJ64l6+Tn3FHw1viC6yuNWC1q1zORzIqcPsx/v8slTITDFnQDU9K25

        du8irAAQCmQcIc7HgV8fHf9yIUAwwC1RB1uEJLGrGR9uttbAaFdKlMQWnjwimGjvEhUGv4YoSjG04YmH

        KnaO4mXsJgkG/eZVYTE0ACif/RKq4OpH3ZV/WFssnHrCaxqxNvvM7FqzFk5lcJ30OPp12ESURgryS4Fs

        SN1WF4Ne1bEWgdhtLGb8dNgoRV6+Mw7PQcsiYj6zdB5DNFdEVGMXFi8++5voxMmcNspAIIAIKZVzB94V

        9cTFB2vXI4rClMl72Vuj4Vgw7eGFRLA+sYssnPFNeNSAnFmk1htlqD27XbWtiGxc8LLR4WNeekdpz+4W

        qZFajnJAlx9cNJtC/6SiMInb/0JLeQfhbFU25FKQK/j/jaCfOZrNsRwCzUU11YDTpYCTYo6NgQJTkrl0

        SXsrRAgPUklJiJ5q2m1HHmnPYAZKRwEoaNIIBVDD34DbHMcTehcyQZABE40kGop/NFDhCWVoNFU20oSh

        gz3/hLjEKorBqMMDZpEYQHKb8ZdCi3KttgMU/pmVGiWdMcaJk0BaE+Qc782wy1Av1SchgGymsZCXUgxJ

        hhn8JZmMChOV9E4RJD7Jkg5o5EXkCgbuoKOgNxB6A3hAATNPdaP8iICbJDB6wk5lcnmkXx9qSJ8fHa6Q

        oRNbihgadpyYJup4Kd6DGSViIXUAIlfc6EoB/7QzERQDypkCr5feeFtFRKTiwH8q/+RC6wmRrQSOYL8c

        asMvf6g1S3rTDPfDlRqBEtGnmB2LwIeB8aAmTNdKgZlUqCEB04YnyusGY31A6yEkLFgLGXJUjTBsgmrQ

        Kyto6AiwgILUeYrCRGjciHBff6wSbR8LUUbpm0ueVppKf+wh78MRr/DOpyKOfEKn4Q61kqq2SvFnfq+c

        yeVJ581AZDE4muMyQCoccNIYN3J84rY+EEIrzhCfGNW6PfV7x757kfBbGi2alZEDCpqm2g9i6fMOUgtx

        fYJY/3U6EjVrNm1DzAeeJUrLea29x9xkzZD1Ck+TMYPUQFINhDmKTmxaniDtcJuJbygwN9iIC6L4CNsw

        rjHhfv+oy4JYzG52sMrXAZrqu5fRMPcdOo5KOgrNhZlzoOLZ3AerYM55Kl9LV5sZMfnO4UlyOB8I9xBC

        pZ7X0XbPgZmGDoChq8i8bwr6DqCwyhv04InVfDma/Vm1FDgVxDGJvpci/PMhS0G8X48j/yjv9klyvjjd

        11//9T84mk8DXuIginREfS3anxP6hwX2oUB/fGnZARE4g9LdDgvmG0Jj/ifBSv0OHvJ6h+iigLON7I4G

        SihXCX7xjf0crA8OlAwaOtKQCBakcdiTxgA1IYscQgJNUcmHDUH4h9yV4zl52ZQQ/aAFVwXPMyWUyAmT

        h0AbtkCDp3vhBoG4oCxCwYHPEUv/9bK4g49FIYlm2p/riCbG01WQcwzZxxpZQSQiMhCOPMiSDxZCQiBE

        JnWFUR4SfPiU9olRMSeZIQIVWLuomE0H9dLgNzIFoqlcZQB49F/96tURqzzhkk5LXX8YIwcZAeYEf5Sg

        Iu8jmSJgMY4JTIMV+dKDsengGxkxoCt38ADAcbIVwWglPB7wIxqKcQAUbOMKaIlBWeAil0NwQIUI0Ej4

        sKSPnlQBPRjwIwL0cRezqcJVjqEFMvoAmJLJg0jCeCpqiUsym0ChYUrBwx004JIHsCYmLsiXb2jBhvc8

        gxRgsbYfZHOb3YTZQuapxSjohi+kMKczKYLJOPagj845ASLy/0TMNS6Alyv4Z6IQANFWGfN1zqwnMv0w

        lJSy1GY3gsOmuMlBYkyEFIwgJ264IU2XPKJl/uqcFK6yRyAQpAEbk0MCasquURyzpVEoQFFh8ZwU6Qan

        XXBkTPPSN6dylaVNxQ2xtPAbA4xTql/tKlrTqlYfKG2tbo1Ci7QpsDqqbgYD7SpTfOqHnWz1H3JNZmqG

        esYWvjU+ZDqrFAoAg7vCFatzHQH5CivZyZ4AM3kyUiApq9nNcvVPVOQsWls0VQyFyz1sfGvFbGWAk3y2

        FuOMWNDiQLdBgnYJQRvtRQLR2iWI1iw5YGxtg8vSX9iwobgVLnKTKwU3tUa5a63baM2qBv8Z7NapxYjs

        MwwwAC0cCrPAFdFfbUBd5872uNyARXWXAN1+SJe87r0dIQ51BKu+t761JQQEsGtfm+FKFu1NQ1I3OwD9

        tnRKIZwGBQO8X8ggtrFk40Z/XWbeBVM4oE1Lb4Uz3NkHGFXDLcUVAd4wYQ93NRMB2CqJfaBdoxA4DZKz

        FYhF3OAU07jGNr7xjQ00YhxXkBzX5PFe9tiLHbtYoqTR8YyBrOQlM7nJbi3McVeMIY86eRZCyG+Vf9Cp

        1niCnVt8sK2g/DVXdDTLZj4zmtP85R6u4Ah7ZISX1Qwd2coZWTM4wE6SbEpQVnAox3WzEuBc50ETutBK

        FoAQGtcpqUz/5LtoJkAuwmboIvWiXsF6mR9ygeJLIBrMMHtQoyct6lGT2sMxM4An1CfnAVBjwKVWRXIU

        kEobrDZzkz11ql+t613zGrTNHEOtMdzrYU+BEULRs81+nRQzCJvYzn42tNXgaoohO9rWVuu0q1Xta3O7

        297+NrjDLe5xk7vc5j43utOt7nWzu93ufje84y3vedO73va+N77zre9987vf/v43wAMu8IETvOAGPzjC

        E67whTO84Q5/OMQjLvGJU7ziFr84xjOu8Y1zvOMe/zjIQy7ykZO85CY/OcpTrvKVs7zlLn85MkMkjwPM

        2g392zTMc67za1NBYDoSQc3LOZY222nU/zhP0dF3rvSA56A7nHFT0O3AE1UWfdLbdesRlq51h+/UIlCF

        QweHzpYBjaSZtpu0DNLo1FVsve0JD9o1GtqICEVdBakZCRhL3XW1pxTSJHA74A0ekfqYgER1N6nYdfb3

        Ur+D722Ee9UDL3l9v0MFWhiDjy6R+RT849WLTuvgJy96f99BBW8YA3oOb7hhLr7Uj3A8Mjs/+tnvWwsr

        4ww1VM/5qe8+8oOGBezbmBHaEx/fbF8KZ2ChexRAnei+H7QZgt9GghS/+vQ+zrHeoyPex4f7ddp1UNZ6

        fOuT3917oNVDvN8H9dcsqC0usVyk3Ael3KMABx7H2cuvf3L/yRXpT/+8H7Bf/qXBkG0baQSCYrwBlVmI

        agmBXn3f/kUguhXVqGwfAK7fBbbfD3gCfTmV3B3Alqke/aUCiWCXBkogCooaBf3CS4iAqHCfAGyaAD7f

        Bk7QVxjgMojCAsTMA0qH9DVKJQxDJQxgChahoUGabW0N8xXNCfCeDAjWEszgeTHbV3SgcsRIKfQCE6kY

        neCGA9xfCuSAIp2gEZbhmb2Ao1nN1FFBckxdqkWdFN6DMAFBzRkABKQh3dCa6AhAD/pgGsBIH6IauRCh

        GRZilmVCdWVEmPiOG95ZGsRhioiAg+GhVVhhKowgCyiW8zwDGRqiJ+KYif0gYvDDEcgD711avUj/ASRi

        xAiUzi3NGBXEWQoUwPLpzA8WUFMZgLx04if2IonRQ4t1igBkwVR4nyWpwSpyw69w4c9cIRZy4SV2IdXN

        VECoGgT6IjYqGT14mt9owg2sgPrNQTI+w4A43gFZYpGIwmfBQjQGH6ts4asMIQ1mIz3u1zaGo/NZhwrg

        4yNmICGqwUJAkBO8n8HYD/5B1iXQXxOACFt9wZrUI0SmGDkMgpIsASIMVPTYwDimQmpQRkTojRoYDxgO

        SLNVIDbp0w40Vwv8AxjyYkS+JGfdEkeMC0ik0z5qiE9tpKW4T2VFRQEYT921jWbsjB88hDK9y1BQEVGe

        CEw2ZX2ZRlGkxmfl/8ZrgKOG8J1O/sHY8IZp3EZegKF0UCMC4ETSPYSj3MZO9A+F9IZTtqVyrYjixYIe

        EAQpkUoK8E7LPCO8HJkO+FcVcEL6nJVYqN1OiOKSNEakmJizNMhpheFFNYtbRqZw4QrbiGWyYAk08BkC

        VGSj0FYtsNleXsTYQMFLjYxWqUGL0Aw1zYFAUUzBZCZ9vFTVXMm6nIxk3uZmGQ9A4CLP3AvI2BoK0CQZ

        iMKxTEQDzI/NmIjZXAGJGGZlTozTKeH8GQMnKA3mBIBi/AIZhU6zJB1ufqet0FE8PFFEnQoOzsX+9CHi

        VWQBFaUzKUN7Dg5Cgid9qtVRMgk6xFJ5lkNJLv+BeJYDOiKAJOnQc/IjrUXUF80AC5hRfTZoS8USKujn

        fpZDSQ2GBBHkUjmBLdkga5bnhgpCL8XDjzkoiZJMPvyE2U1o/aDURchd/WBY3dATJ2SUe3ooRhkZ8+FT

        ie4oX7aemmVCgNboDJUVaEoWWR3Mf/GokjpVW8lZIASpC2nmQDjHed4DZhXpkmZpSnmWkwoBlBLSoRhX

        lbboJIyplp7pRwlCLXrYk7LUGzTNERAZ1qEKmtapzeAXhtpYm6bUKvRNf3bVn9qpoLYALnSYmu1pzEnp

        oC5qySFqG/Upo0bqyTlqnymqpF4qx9mhN6ZUDngnpn6qwrmJnJKjpYKqqU7/HDVQ4h/UGmaeqqtSXEuc

        WJ6G5AA8TYW+Kq7mqq7uKq/2qq/+KrAGq7AOK7EWq7EeK7Imq7IuK7M2q7M+K7RGq7ROK7VWq7VeK7Zm

        q7ZuK7d2q7d+K7iGq7iOK7mWq7meK7qmq7qua7oNwJqyK7xqmAAEHRV8abzSmKc+XL6q2b420AXWlT7e

        q5ld3cgR7LMZrIoYqBrZq8BWWNqN3MM+W8SmQoqm0jbOasNS2N6F3MYSW8dy5AyM4QUxbMa+V+OF3MkS

        W8pGo0EmEwMowC5c2r+WbI19HsjZ7LDhbCpsXjLdauycGM0u2euJ3NA6W9FyYsv6RRVxY9DSGPDxn6qu

        /9XTOtvUcsMjHN4RgGXTklj0jVsmaC1lde2ziS03NN90terW4lj4hRvc9WuiOmehra1MKGxXQADcpm19

        YSIJBmqLio78bek7oCM3cYnbHujd/p40BuDMdgMU4q3TJu4fBELhpoMDflrAplSnqec8VK5I6eXt6K02

        ik5IdA3kiuPiukXjOm6KgS5CiMKIVtAHxsy7qsHg5hNyhKDwlS6OwQKcmEtA6W4/1lwQhJfq2hjrWkUQ

        NuYS/KROqaMMsdToTgGByd0ONmMFHS82ga1yvVQB/EIq/gD2nkXW0K0dSlrx7i7w1sIXThSGBkuP3oIW

        okNbIJ1GKEEBmo6zJJVdfv9u+lqu5gbXSw1AnDSWKL6Ayijse0SttJ2vkfYvIC6v9nLJHaaI/UGEKzgA

        xsJMiJ5DlwXUHv4vbgikYcbM6yaXFoKC34ki9r5A8Blo1raRAvAtA99D+GoiE7IipnEq2i7Ix5Bwnr2V

        oTLgcgFVhcUgi/2u9AWCNQbn4lLB5NaOLM4wS2Evb7oHbyXMcBHWFnlZCs8DISgwLV5EfIGLc+rvYrYJ

        BRmAmfbE4YUI66rD+M5s3FTQRGSwFJ+X7hYG60Rxi4DwH5zamu3LMaLAHCbFbkniPTwCUoQvl0Rwm0Xx

        KyxxKlCBsDmAG0NuixxKOJLd7eQFyd7xqpbuO5ZOLDL/42SkVGmWsTqqVCsyozIeEhm3gIykSJyCr0Yk

        Z9LawBjHclgGSAuoH/XYykGBclcp5H8eSqcoCA3Z8RK4aKkeZC5bhWIMyJPciB2nqKKOIO9exNtcledy

        w1BYwRLkwl1hov5EFvdd6WteBDUwgCccLjEnpITcIwYpkBCaXjRIZ7KdREdQmUiOszd23aayAEmuqvlI

        Dy+TZz4QbwqgjS7Tzj1AKOJpxgh+JGfe5Eeo86l4lI/EzBPHs+H6BUq6C44WJJ20zk8KJ2mkSc+kxVIC

        QUnw82+e8U1mjBrEzAMcilJYlGQ0TmD+8tBEdAqVA9eYiEnisyB8BhZb5UfwtEMt/4FSMaaagvQUT8dZ

        gkrI4gtwpiPtfKXN7MQ2RETfZLLRtOKR6kOksABZ9gEipK4QU9oGbYrx+NRaPgOD5BBuhXNC14k+GPVd

        it1/wgN2MQUnfCRVp5QIIGbOKKYSvIMNkQni1ctPcwhSUUmBwmPvgR1pvQuJcEJG8F1hdqgWcyF/TJNk

        IMVgtoAn2zVwToldWUlIOQas7MysADUYYDPvkJNuQsHdHXbuvkxqwWY7yCbAzidshstpRq6X6GYePK+D

        OeQNDAglEEuBzuZqPvfpugzXxAxmc8pSj846z6IOLGBn/uMNjbZ225ld7Rl0xw+BXoJp7OIQsIhY+jYN

        UydsQv/AdWanZzb0eqPAcs40PAfBpphNO/wDJAO49doLFuZIT5a0GpaWCLHDFcPOz47nEvxDy3jMShIx

        IUk46XIoeJuvVGM4g4bdcU6y8qJAphjCPyiwfWP3GnHPBvlxJLPTxXp3wPzue4L3LUsbUTuGilbJgw8B

        fD7mh+f29MzURqmohvRPAjQSOulzjJNGk+/PcygUPAQo8GkGPZACejgyg+dSgkbzaqAk0K5nef4VD5W5

        eQ/W/sQQkzu5GOGUgQsoXVU5yzrTI20QQZoGGdGD/U11GpjKGn1oK/8hDx3Ela+RXL3QN2xZkkuQIWG4

        j9M5Au1SOyXDiuv5np9UAsBTT4f/eH8DgSicRAkv4X5+A42mwWUauTpNqDbpZjyNJYRLXRxNufc1Oqbn

        Q5npBFF4+vYW1VGx1IeYlzODMCw88VljMJbuV9cNCfs0u1Rhg079gwH0FJBdhQwLu3UFFnk/Sy1RNE9G

        wZvejjqPqnO1zbqk+xpHQV4JraV7e3LFVriTahXIdZ7j+kfn4LNnGEG4dUN98jMEt5JxF727lxjMbh9E

        Bp0VySNg6LkjU5y+u1t5AUPjM8GXBgwwM3lF+VYnvHMpgMX/QGTsEWZhKKSyVLcH1wLMGozfTrbx2JR4

        vMhXWWHQHI8AeZpTbYFcEsmbHwxg2c0Pm6Oo/DOXmgJiNfEa/0nLD5sS33vRr9oQIH3PE1sIem8KwLK6

        AR/DT32WfU4adGq08eDMsLhvotsqpDjYP1utIXShJ72u6a89XNphfJONO1vXEXnbdz1BpLqu8SFk0EzM

        99oAMAIEDIDU972zJUCtaoLPMr7kTz7lV77lXz7mZ77mbz7nd77nfz7oh77ojz7pl77pnz7qp77qrz7r

        t77rvz7sx77szz7t177t3z7u577u7z7v977v/z7wB7/wDz/xF7/xHz/yJ7/yLz/zN7/zPz/0R7/0Tz/1

        V7/1Xz/2Z7/2bz/3d7/3fz/4h7/4jz/5l7/5nz/6p7/6rz/7t7/7vz/8x7/8zz/917/93/8//ue//u8/

        //e///8/CCDiSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsO

        i8fksvmMTqvX7Lb7DY/L5/S6/Y7P6/f8vv8PGCg4SFhoeIiYqLjI2Oj4CBkpOUlZaXmJmam5ydnp+Qka

        KjpKWmp6ipqqusra6voKGys7S1tre4ubq7vL2+v7CxwsPExcbHyMnKy8zNzs/AwdLT1NXW19jZ2tvc3d

        7f0NHi4+Tl5ufo6err7O3u7+Dh8vP09fb3+Pn6+/z9/v/w8woMCBBAsaPIgwocKFDBs6fAgxosSJFCta

        vIgxo8aNHDv/evwIMqTIkSRLmjyJMqXKlSxbunwJM6bMmTRr2ryJM6fOnTx7+vwJNKjQoUSLGj2KNKnS

        pUybOn0KNarUqVSrWr2KNavWrVy7ev0KNqzYsWTLmj2LNq3atWzbun0LN67cuXTr2r2LN6/evXz7+v0L

        OLDgwYQLGz6MOLHixYwbO34MObLkyZQrW76MObPmzZw7e/4MOrTo0aRLmz6NOrXq1axbu34NO7bs2bRr

        276NO7fu3bx7+/4NPLjw4cSLGz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+PPr36

        9ezbu38PP778+fTr27+PP7/+/fz7+/8PCmCAAg5IYIEGhgAAOw==

</value>

  </data>

</root>

لاحظ انه ملف XML عادي يتم ضبط البيانات فيه بحسب ما نقوم بعمله على النموذج او ما نقوم بإضافة الى هذا الملف.

ولكن أردت الإشارة الى ملاحظة صغيرة.

طبعاً عندما تضع صورة على النموذج وتتم ترجمتها مع البرنامج انت لست بحاجة الى تضمين هذه الصورة مع مشروعك.

والسبب لان الصورة يتم تحويلها الى بيانات ثنائية في هذا الملف أنظر للشكل التالي :

لقد وضعت اداة PictureBox على النموذج ووضعت فيها صورة وكانت هذه هي النتيجة.

أنظر للمربع الاحمر فوق والذي يحدد الاداة مع بعض التعريفات.

والمربع الازرق بالاسفل يحوي الصورة في شكل بيانات ثنائية .


الاجراءات والدوال Function and S

الاجراءات والدوال Function and Sub

عندما تنقر على أي زر أو أداة فأنك تحصل على أجراء خالي من اي كود لتكتب فيه ويكون جاهزاً للعمل، ولكن ماذا لو اردت ان تصنع واحداً بنفسك لا يتبع اي اداة وتستدعيه متى تشاء.

ولتفعل ذلك عليك ان تقرر هل يجب ان يعود لك الاجراء بشئ ام لا تريده ان يعود لك بشئ.

اذا اردت ان لا يعود لك الاجراء بشئ فعليك عندها تعريفه بهذه الطريقة أنظر الشكل التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest()

    End Sub

    Private Sub mytest()

        MsgBox("حسناً تم تنفيذ الإجراء")

    End Sub

End Class

أنظر الى الاجراء الذي عرفناه بأسم mytest وكتبنا بداخله تلك الرسالة التي ستظهر عند التنفيذ ، تم في حدث Click الخاص بالزر تم أستدعاء الاجراء

والان لنرى كيف يتم انشاء اجراء يعود الينا بقيمة أو بشئ معين أنظر الشكل التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(mytest)

    End Sub

    Private Function mytest()

        mytest = "ها قد عدت من جديد"

    End Function

End Class

لقد تم هنا انشاء اجراء من نوع Function وهذا الاجراء لابد وان يعود بقيمة ما واسميته mytest ولاحظ كيف استخدمت Msgbox لعرض القيمة العائدة، ويمكنك استخدام كذلك اي اداة لتلقي القيمة مثل ان تكتب Textbox1.text=mytest

حسناً ماذا اذا اردنا ان نمرر قيم من والى الاجراء أنظر المثال التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(mytest(3))

    End Sub

    Private Function mytest(ByVal value As Integer)

        mytest = value * 2

    End Function

End Class

انظر اين وضعنا وسيط ليتم استقبال القيمة فيه بين القوسين للاجراء حيث ضربناه في رقم 2 وكان هو طبعاً من النوع Integer وتم استدعاء الاجراء وارسلنا القيمة 3 كذلك.

ماذا اذا اردنا ان نرسل قيمة بدون ان يعود لنا الاجراء بشئ راقب التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest("هذه هي الجملة المرسلة")

    End Sub

    Private Sub mytest(ByVal value As String)

        MsgBox(value)

    End Sub

End Class

استدعينا الاجراء وارسلنا الجملة ليتم استقبالها في الوسيط Value الذي بدوره تستقبله Msgbox لتقوم بعرضه، اعتقد ان الامر واضح.

ويمكنك معالجة القيمة المرسلة بشكل اكثر تعقيداً واجراء اي عمليات تريد أنظر الشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest(2)

    End Sub

    Private Sub mytest(ByVal value As Integer)

        If value = 1 Then

            MsgBox("واحد")

        ElseIf value = 2 Then

            MsgBox("اثنان")

        ElseIf value = 3 Then

            MsgBox("ثلاثة")

        End If

    End Sub

End Class

لاحظ هنا يتم معالجة القيمة المرسلة من تم اظهار رسالة تفيذ بالرقم المرسل.

ولكن ماذا لو انك اردت ان تخرج من الاجراء ...؟

يمكنك ذلك بالعبارة Exit sub أو Exit function أنظر الشكل التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest(0)

    End Sub

    Private Sub mytest(ByVal value As Integer)

        If value > 3 Or value <= 0 Then Exit Sub

        If value = 1 Then

            MsgBox("واحد")

        ElseIf value = 2 Then

            MsgBox("اثنان")

        ElseIf value = 3 Then

            MsgBox("ثلاثة")

        End If

    End Sub

End Class

هذا مثال بسيط اذا كانت الارقم المرسلة 1،2،3 فانه يتم اظهار رسالة تفيذ ذلك والا فانه يتم الخروج من الاجراء دون فعل أي شئ.

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

أذا ماذا لو أمكننا ان نبرمج أجراء سوى أرسلنا له قيمة ام نرسل لا نحصل على خطاء...!

يمكن ذلك من خلال الخاصية Optional وهي تعني اختياري ليس مهما ان لم ترسل، ولو أرسلت لكان أفضل أليك المثال.

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest()

    End Sub

    Private Sub mytest(Optional ByVal value As Integer = 4)

        If value > 4 Or value <= 0 Then Exit Sub

        If value = 1 Then

            MsgBox("واحد")

        ElseIf value = 2 Then

            MsgBox("اثنان")

        ElseIf value = 3 Then

            MsgBox("ثلاثة")

        ElseIf value = 4 Then

            MsgBox("هذه هي القيمة الافتراضية")

        End If

    End Sub

End Class

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

كما عليك ملاحظة التالي انظر الى هذه الشكل:

ان الرسائل التوضيحية السريعة والتي تبين نوعية وعدد البيانات او المتغيرات المرسلة توضح هنا ان القيمة المرسلة اختيارية وذلك بوضعها بين قوسين، هذا يعني انها اختيارية.

كذلك يمكنك استخدام إجراء يستقبل ما تريد من القيم وترسل أليه ما تريد من القيم انظر التالي:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Call mytest(1, "String", Me)

    End Sub

    Private Sub mytest(ByVal value As Integer, ByVal test As String, ByVal myform As Form)

    End Sub

End Class

أرسلنا القيمة الأولى وهي رقم ، والثانية وهي نص، والثالثة وهي نموذج .

وMe تدل على النموذج الذي نعمل عليه حالياً Form1 ولا يمكنك إرسال أسم النموذج Form1 كما لا يمكنك استخدامه من داخل النموذج كأن تكتب Form1.close

ان هذا مسموحاً به من مكان أخر ولكن من داخله غير مسموح.

كذلك هذه الاجراءات هي محلية أي لايمكنك استدعاءها من مكان خارج Class هذه او من خارج Form1 ماذا اذا أردت ان تصل أليها من أي مكان أخر.

عندها عليك أستبدال الكلمة Private بالكلمة Public وهذا هو كل شئ، اكتب أسم النموذج متبوعاً بأسم الاجراء كالتالي:

 Form1.mytest(1)

واذا اردت ان تستدعي الاجراءات بدون ان تكتب أسم النموذج الذي هي فيه، عليك بإضافة Modules الى المشروع وكتابة إجراءاتك فيه وسوف نناقش هذا لاحقاً

بقى شئ أخر وهو انك لا تستطيع ان تعرف وسيط لاستقبال ليس اختياري بعد وسيط اختياري، دع الوسيط الاختياري هو أخر شئ.


قوائم البرنامج

هنا سوف نتطرق الى أكثر الأوامر الموجودة بقوائم البرنامج وأولها هو ملف File

New Project

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

لنناقش هذه الخيارات الان:

أسم المشروع | نوعيته ولماذا يستخدم
Windows Application | مشروع يعمل على نظام التشغيل Windows أي مصمم لاجل هذا الغرض
Class Library | إنشاء ملفات Dll تحتوي على مكتبات لفئات كثيرة
Console Application | ينشئ تطبيقات بواجهة Dos
Windows Control library | إنشاء أدوات خاصة UserControl لاستخدامها في مشروعك مباشرة او تحويلها الى ملفات Dll واستخدامها كملفات مرفقة
Web Control library | ينشئ أدوات مثل User Control ولكنها تعمل على صفحات Html وتطبيقات الويب
Windows Service | إنشاء إحدى خدمات Windows التي تعمل بخلفية البرنامج عند بدء تشغيل النظام للقيام بمهام معينة.
Empty Project | مشروع فارغ
Crystal reports | مشروع يتضمن التقارير
My Templates on line | جلب قوالب إضافية من الانترنت

New web Sits

من هنا يمكنك البدء في إنشاء مشروع يعمل على الانترنت، اذا أردت إنشاء موقع خاص او ما شابه، وهو ليس محور حديثنا.

Open project | يمكنك هذا الخيار من فتح مشروع سبق وان قمت بحفظه.
Open Web Sits | فتح مشروع انترنت او ويب سبق وان قمت بحفظه.
Open File | فتح ملف
Add | وتحتوي على التالي:
New Project | لإضافة مشروع جديد الى مشروعك
New Web Sits | لإضافة مشروع Web الى مشروعك
Existing project | إضافة مشروع سبق حفظه
Exsisting web sits | مشروع ويب سبق حفظه
Close | إغلاق النافذة التي تعمل عليها حالياً دون اغلاق المشروع ككل
Close project | إغلاق المشروع الذي تعمل عليه حالي
Save and save all | كلها للقيام بحفظ المشروع او النموذج الذي تعمل علي
Recent project Recent File | أخر المشاريع والملفات التي قمت بالعمل عليها يتم ادراجها هنا لتوفر على نفسك جلبها والبحث عنها
تحت الخيار Edit ستجد كل أوامر التحرير المعروفة من نسخ ولصق وغيرها.
اما تحت View فسوف تجد كل الأوامر التي تمكنك من عرض النوافذ المنزلقة الجانبية بحال قمت باغلاق احدها او اردت اظهار غيرها.
تحت Project |
Add window form | لإضافة نموذج جديد الى المشروع
Add user control | لإضافة اداة يمكنك بنائها بنفسك واستخدامها في مشروعك
Add Component | دعك منه الان
Add moudle | يمكنك فيه الإعلان عن المتغيرات او التركيبات او الواجهات وغيرها لاستخدامها على مستوى المشروع ككل
Add Class | لإنشاء كلاسس جديد
Add new Item | من هنا يمكنك جلب اي قالب جاهز او نموذج او كلاسس او اضافة تقرير وغيره الكثير كما بالشكل التالي:

.

Add Existing Item لجلب ملف او قالب موجود بالفعل على جهاز الكمبيوتر

وباقي الاوامر تطرقنا اليها في مواضيع أخرى جربها.

Build | من هنا يمكنك انشاء الملف التنفيذي النهائي الذي يتم وضعه بالمجلد Release أحياناً لا ينشئ البرنامج الملف ألياً الا اذا قمت بالحث عليه من هنا
 | واوامر من تسماياتها، أحدها للبناء والاخر لإعادة البناء ، والاخر لمسح الذي تم بناءه
Data | سبق وناقشناه بمكان غير هذا المكان
Format | للتحكم بمكان الأدوات وطولها وعرضها، ولن تجد بها خيارات اذا كنت تملك على النموذج اداة واحدة ضع أكثر من أداة وحددهم جميعاً بالفأرة وجرب هذه الخيارات
Algin | تقوم على محاذاة الأدوات الى جانب معين وبشكل متساو
Make same size | تجعل الأدوات تاخذ حجما متساويا في الطول او العرض او كلاهما
Center in form | تضع الأداة في منتصف النموذج
Order | جلب الأداة الى الأمام او إرسالها الى خلف الأدوات الأخرى
Lock control | لقفل الاداة حتى لا يتم عليها اي تغيير
Tools |
Attack to process | شبيهة ببرنامج Task manger الخاص بنظام التشغيل حيث يتم عرض البرامج المفتوحة ويستخدم في تصحيح اخطاء البرنامج

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

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

Customize | يمكنك من هنا التحكم بشكل القوائم وغيرها ما الذي يظهر وما الذي يختفي.
Option | يمكنك من هنا التحكم بسلوك البرنامج وغيرها ، نوعية الخط المستخدم طريقة عمل شبكة النماذج ، اظهار ارقام لاسطر البرمجة وغيرها الكثير صراحة.
Window | النوافذ المفتوحة حالياً وكيفية ترتيبها.
Help | لتدخل الى هنا فانت شخص من ثلاث.
لاتعرف الانجليزية | وتكون قد ارتحت منها، حتى وان كانت هناك امثلة يمكنها ان تساعدك بمجرد دراستها، ولكن يكون قد فاتك الكثير لتتعلمه
متوسط المعرفة | ولاانت بالذي قادر على تركها والبحث عن سبل جديدة ولا انت بالقادر على الاستمرار، كل ماتحصل عليه اقل من الصداع الذي تشعر به
معرفة جيدة | لااعرف لماذا تقراء هذا الكتاب اذا، أنصحك بأغلاقه والتحول الى هناك حالاً ، فمثلك لا يحتاج الى كتب شروحات عربية كهذه

كما يوجد شريط الادوات التالي كما بالشكل :

.طبعا اغلب هذه الخيارات ناقشناها سابقاً.

أي كلها موجودة بالقوائم ولكن يتم وضعها هنا لتقريب الوصل لها فقط.

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

زر السهم الأخضر هو لتشغيل المشروع او يمكنك النقر على المفتاح F5

اما الى جهة اليمين فتوجد أزرار لإظهار الكثير من النوافذ مثل نافذة الخصائص وشريط الأدوات ومستعرض الفئات ونافذة الأخطاء وغيرها.

كما يمكنك اظهار المزيد من أشرطة الأدوات بالنقر على اي مكان من القوائم بزر الفأرة الأيمن لتحصل على القائمة التالية :

من هنا يمكنك تحديد شريط الأدوات الذي تريد إضافته الى أشرطة الأدوات للفيجوال.

ربما تريد التحكم بشكل اكبر في هذه القوائم وأشرطة الأدوات.

عندها تحتاج الى فعل التالي أنظر لهذا الشكل :

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

الان حدد الخيار Standard لتطالعك القائمة التالية :

يمكنك اظهار او اخفاء أي من هذه العناصر، كما وبحال اردت استعادة افتراضيات القوائم هذه أنقر على الخيار السفلي Reset Toolbar

أما اذا أخترت الخيار Customize كما بهذا الشكل :

.فسيتم نقلك الى هذه النافذة :

لا يوجد كثير من الاختلاف في الأفكار فالـ Toolbars وهو التبويب العلوي سيمكنك من إظهار وإخفاء أشرطة الأدوات التي ترغب فيها.

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

بشكل أخر يمكنك إعادة ترتيب أشرطة الأدوات بالشكل الذي تريده ووضع أشرطة أدوات خاصة بك تحتوي على كل العناصر التي تريدها.


قواعد البيانات Database

قواعد البيانات Access DataBase

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

وهذا النوع من قواعد البيانات يصلح للتطبيقات المتوسطة ولا يصلح مع التطبيقات الضخمة للبطء في التعامل مع البيانات.

ويفضل الكل عندها استعمال قواعد بيانات SQL Servier

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

حيث يمكن اختراقها والحصول على كلمة المرور الخاصة بها.

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

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

على العموم سوف استخدم برنامج Access 2007 لانشاء قاعدة البيانات.

شغل البرنامج وأختر قاعدة بيانات فارغة كما بالشكل التالي :

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

لاحظ ان هناك مسار افتراضي وأسم افتراضي كذلك.

النقر على المجلد الاصفر سيفتح لك نافذة لتحدد مسار حفظ الملف، اما تحت العنوان أسم الملف فيمكنك كتابة أسم لقاعدة البيانات.

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

بالنسبة لي انا افضل العمل في طريقة عرض التصميم.

لذلك من القائمة عرض أختر طريقة عرض التصميم كما بالشكل التالي :

بعدها سننتقل الى طريقة عرض التصميم أنظر للشكل التالي قبل كل شئ :

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

نص | حقل نصي لا حاجة للشرحه نضع فيه أي جملة نريد
مذكرة | نص كذلك ولكن بحجم كبير من البيانات
رقم | رقم وفقط رقم
تاريخ / وقت | تاريخ او وقت فقط
ترقيم تلقائي | هو مفتاح أساسي يستخدم لضبط البيانات وفهرستها وعلى العموم هو موجود افتراضياً ويمكنه ان تراه بالصورة السابقة
نعم / لا | يمكن ان تكون نعم او لا صح او خطاء مشغل او مطفاء
كائن OLE | سيقبل العديد من الكائنات صورة، صوت، وغيرها

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

هذه خصائص الحقل النصي ويمكنك ان ترى الخاصية:

حجم الحقل: زاكبر حجم مسموح به هو الرقم الظاهر فعلاً الان وهو 255 حرف.

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

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

قاعدة التحقق من الصحة أي صحة البيانات المدخلة من قبل المستخدم هل هي توافي الشروط المطلوبة لنا أم لا.

طبعاً سيتم نقلك الى منشئ التعابير والذي يمكنك من الحصول على الكثير من الدوال والتعابير والتي تمكنك في سهولة من انشاء قاعدة للتحقق من البيانات المدخلة.

أنظر للشكل التالي :

نص التحقق من الصحة هي رسالة الخطاء التي ستظهر بحال كان البيانات المدخلة لا تتماشى مع قاعدة التحقق.

مطلوب والقيمة الافتراضية لها لا وهي تقوم هل من المطلوب اجبارياً ادخال بيانات بهذا الحقل أم لا.

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

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

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

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

بالنسبة الى الحقل مذكرة لا يختلف عن النص.

أما الحقل رقم فله الخصائص التالية:

حجم الحقل ويتم اختياره من بين هذه الخيارات التالية:

طبعاً انت من يعلم ما المطلوب لك وما الذي يفي بالغرض المطلوب.

وفي تنسيق سيتم عرض بعض التنسيقات والتي من الممكن ان تفي بالغرض كما بالشكل التالي :

وان لم يكن التنسيق موجوداً فيمكنك كتابته بنفسك.

طبعاً ان تحديد تنسيق معين سيجبرك على التاكد من ادخال البيانات بنفس التنسيق.

وباقي الخصائص صارت معروفة لنا.

وكل الحقول الاخرى لها نفس الفكرة وتعمل بنفس الطريقة.

ولاحظ ان هناك اسماء محجوزة ولايمكن استخدامها ولو حاولت ان تستخدمها أخبرك البرنامج بأن هذا العمل من شأنه ان يحدث لك مشاكل كثيرة.

أنظر للشكل التالي:

ظهرت هذه الرسالة نتيجة لاستخدام الاسم Name ولتفادي هذه المشكلة أضفت قبله الحرف M فصار Mname

وحلت المشكلة.

ولكن دعونا نتوقف قليلاً عن الحقل نعم أم لا وهذه خصائصه.

الخاصية تنسيق تعني بصواب وخطاء هو True - False والتي يمكن ان تعمل مع الادوات CheckBox او OptionButton

ونعم ولا تعني Yes - No

وكذلك تشغيل وإيقاف تشغيل تعني 1 - 0 واحد او صفر

بعد ان تنتهي من تعريف الحقول التي تريدها وتقوم باغلاق الجدول سيسألك البرنامج ان كنت تريد حفظ التغييرات.

أختر حفظ وقد يطلب منك تحديد أسم الجدول فقم بتحديد أسم للجدول كما بالشكل التالي :

اذا كان عندك أكثر من جدول فستجدهم بهذه القائمة كما بالشكل التالي:

أنقر على الجدول الذي تريد ان تتعامل معه.

كما يمكنك تحديد كلمة مرور واسم مستخدم لقاعدة البيانات كما بالشكل :

انقر على تشفير باستخدام كلمة مرور لتطالعك النافذة التالية :

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

كما يمكنك حفظ قاعدة البيانات بعدة صيغ كما بالشكل التالي :

أنقر على شعار مايكروسوفت تم اختر حفظ باسم .

أيضاً من المهم التطرق الى كيفية إنشاء العلاقات بين الجداول.

بداية سوف ننشئ جدولين بالاسمين الظاهرين بالصورة أنظر للتالي :

الجدول Company يحتوي على هذه الحقول :

وجدول Pieces يحتوي على الحقول التالية :

ألان من القوائم العلوية أختر الخيار أدوات قاعدة البيانات كما بالشكل التالي :

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

الان حدد الجدول الاول وانقر الزر إضافة تم حدد الجدول الثاني وانقر زر إضافة تم انقر زر إغلاق لتحصل على الجدولين كما بالشكل التالي :

والان انقر على الحقل ID من الجدول Company واسحب دون ان تفلت زر النقر وتوجه الى الجدول Pieces وافلت زر النقر على الحقل PicID كما بالشكل التالي :

عند إفلات زر النقر ستظهر لك النافذة التالية :

كما هو واضح يظهر الجدولين الذين سوف ننشئ بينهما علاقة.

كما يمكنك اختيار وتغيير الجداول التي تريد بحال كان معك اكثر من جدول واضفتها هنا.

حتى نجعل قاعدة البيانات تقوم بمهمة التحقق من البيانات بنفسها علينا تحديد الخيار ( فرض التكامل المرجعي )

وهذا الخيار يندرج تحته الخياران التاليان :

تتالي تحديث الحقول المرتبطة : يقوم بتحديث الحقول المرتبطة تلقائياً بحال حدث تغيير ولا تكون ملزماً بتحديث كل جدول على حدة.

تتالي حذف السجلات المرتبطة : يتم حذف كل الحقول الفرعية المرتبطة بالحقل الحالي بحال حذفه.

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

ولذلك حدد هذين الخيارين وأنقر زر إنشاء لتحصل على الشكل التالي :

كما ترى تم انشاء هذه العلاقة، وتدعى علاقة واحد الى كثير ويرمز لها هنا برقم واحد من جهة ورمز مالانهاية من الجهة الاخرى.

وعلاقة واحد الى كثير تعني علاقة الحقل ( أسم الشركة ) مع الحقل ( رقم القطعة ) حيث ان الحقل ( أسم القطعة ) لا نهاية له ومن الممكن ان نضع به العشرات او المئات من القطع والتي تعود كلها الى حقل واحد فقط او شركة واحدة.


قواعد البيانات Database

AgentObjects

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

حقيقة يمكنك استخدام هذه الطريقة او هذه الشخصيات الكرتونية في برامجك، أنظر للصورة التالية:

هذه أحدى الشخصيات وتسمى Merlin وتعني الساحر او العراف، كما توجد العديد من الشخصيات الاخرى.

قطط وكلاب اكرمكم الله، وجني المصباح ورجل آلي وغيرها.

ولكن بالغالب لا تتوفر هذه الشخصيات على كل الاجهزة.

وللتأكد من انها متوفرة ابحث بالمسار التالي:

C:\WINDOWS\msagent\chars

وكما تلاحظ بالصورة هنا لا يوجد الا هذا العراف أنظر للشكل التالي:

وهو موجود على كل الاجهزة أفتراضياً.

ويتم تحميله مع تحميل الويندوز ولكن هناك مكان أخر ربما يحتوي على شخصيات أخرى وهو لدى تحميل مايكروسوفت افيس :

ولا أذكر المسار الان ولكن حتماً هو بالـ Program File بمكان ما هناك.

بداية إنشئ نمودجاً جديداً .

تم عليك باستيراد هذه المكتبة من الخيار Reference كما يظهر بالصورة.

المكتبة المطلوبة هي Microsoft Agent Control كما يظهر بالصورة حددها وأنقر على الزر موافق او Ok

لاحظ التويب العلوي اننا نبحث بالتبويب المسى COM وليس .NET فلا تقل ان المكتبة ليست موجودة عندك، ولا يوجد جهاز لا توجد فيه.

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

Public Class Form1

    Private agentController As AgentObjects.Agent

    Private agentCharacter As AgentObjects.IAgentCtlCharacter

End Class

ضع زراً على النموذج وأكتب فيه التالي:

Public Class Form1

    Private agentController As AgentObjects.Agent

    Private agentCharacter As AgentObjects.IAgentCtlCharacter

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        On Error Resume Next

        agentController = New AgentObjects.Agent()

        With agentController

            .Connected = True

            .Characters.Load("Merlin", "Merlin.acs")

            agentCharacter = .Characters("Merlin")

        End With

        With agentCharacter

            .MoveTo(CShort(Me.Location.X + 120), CShort(Me.Location.Y + 130))

            .Show()

        End With

    End Sub

End Class

تم إنشاء كائن جديد Agentobjects

كما من خلال هذه الخاصية يتم تحميل الشخصية المطلوبة انظر الشكل التالي:

  .Characters.Load("Merlin", "Merlin.acs")

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

أما السطران التاليان بالاول يقوم بتحرك الشخصية الى مكان محدد والثاني يقوم باظهارها كما بالشكل:

        With agentCharacter

            .MoveTo(CShort(Me.Location.X + 120), CShort(Me.Location.Y + 130))

            .Show()

        End With

وطبعاً عكس الامر Show هو الامر Hide بأي وقت رغبت في اخفاء هذا العراف.

والان جاء لاعطاء بعض الاوامر لهذا العراف ليقوم ببعض الاعمال، مثل ان نجعله يفكر او يقراء كتاباً او ينفخ بوقاً او ينام او يصدر صوتاً او يظهر تعليقاً والى أخره.

أنظر بعض الامثلة:

الان ضع زراً أخر على النموذج وأكتب فيه التالي:

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        On Error Resume Next

        With agentCharacter

             .Play("Writing")

        End With

End Sub

شغل البرنامج وأنقر الزر الاول لاظهار العراف تم الزر الثاني لتنفيذ الامر.

طبعاً يوجد العديد من الاوامر وسوف اسردها هنا في قائمة وجربها انت واحدة تلو الاخرى.

Acknowledge

Alert

AlertReturn

Announce

Applaud

AnnounceReturn

Blink

Confused

ConfusedReturn

Congratulate

CongratulateReturn

Decline

DeclineReturn

DontRecognize

DontRecognizeReturn

Explain

ExplainReturn

GestureDown

GestureDownReturn

GestureLeft

GestureLeftReturn

GestureRight

GestureRightReturn

GestureUp

GestureUpReturn

GetAttention

GetAttentionReturn

GlanceDown

GlanceLeft

GlanceRight

GlanceUp

Greet

GreetReturn

Hear_1

Hear_2

Hear_3

Hear_4

Hide

Idle1_1

Idle1_2

Idle2_1

Idle2_2

Idle3_1

Idle3_1Return

Idle3_2

LookDown

LookDownReturn

LookLeft

LookLeftReturn

LookRight

LookRightReturn

LookUp

LookUpReturn

MoveDown

MoveDownReturn

MoveLeft

MoveLeftReturn

MoveRight

MoveRightReturn

MoveUp

MoveUpReturn

Pleased

PleasedReturn

Processing

ProcessingReturn

Read

ReadContinued

ReadReturn

Reading

ReadingReturn

RestPose

Sad

SadReturn

Searching

SearchingReturn

Show

StartListening

StartListeningReturn

StopListening

StopListeningReturn

Suggest

SuggestReturn

Surprised

SurprisedReturn

Think

ThinkReturn

Uncertain

UncertainReturn

Wave

WaveReturn

Write

WriteContinued

WriteReturn

Writing

WritingReturn

أنها قائمة طويلة وخيارات كثيرة جربها وستلاحظ الفرق بينها.

طبعاً هناك بعض الاوامر تعمل مع شخصية ولا تعمل مع الشخصية الاخرى ويجب ان تفرق بينها.

كما ستلاحظ وجود أوامر متشابها مثل Write وايضاً ًWriteReturn عندما تجد كلمة Return فهي تفيذ ان العراف سينفذ الامر تم يعود الى الحالة العادية.

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

أيضاً توجد طريقة أخرى وهي أظهار تلميحات كما بالشكل:

ويمكنك ذلك بالشكل التالي، اضف زراً جديدا واكتب فيه التالي:

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click

        With agentCharacter

             .Balloon.Style = 5

            .Speak("مرحباً انا هنا لمساعدتك")

        End With

End Sub

هذا هو الامر المسئول عن اظهار ذلك التلميح.

كما حاول التغيير في الرقم للخاصية Balloon.style وجرب ان تلغيها أيضاً واكتشف الفرق.

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

اذا تعاملت مع هذه الشخصيات ببرامج مايكروسوفت ربما لاحظت انها تظهر بالونات يمكنك منها اجراء عمليات بحث او بالونات تحتوي على ازرار وما شابه كما بالشكل التالي :

كل هذا يمكنك فعله واذا كنت راغباً في تعلم كل شئ عن هذه الطريقة.

فأعتقد انك تحتاج الى البحث أكثر بالانترنت او ملفات المساعدة.

وطبعاً اذا وسعني الامر وعلمت عنها بشكل أكبر فسيكون في الاصدار الجديد من هذا الكتاب إنشاء الله.

كما يوجد مثال جاهز بمكتبة التعليمات تحت هذا المسار

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vbcode/local/sampleexecutables/AutomateOffice.zip

يمكنك تحميل الملف المضغوط وتجربته.


قواعد البيانات Database

مكتبات مايكروسوفت Microsoft Office

تم إنشاء هذا القسم والذي يختص بكل ما يتعلق بمجموعة Microsoft Office بعد ان تبين ان هناك طلب على ذلك.

بداية اذا انشاءت مشروعاً جديداً ووضعت عليه الاداة WebBrowser تم كتبت الامر التالي:

WebBrowser1.Navigate("C:\Doc1.doc")

سيتم فتح ملف Word المحدد بالمسار في الاداة هذه وعلى النموذج لاحظ الصورة التالي:

كما تلاحظ نتعامل مع البرنامج من داخل برنامجنا على الاقل هذا ما حدث مع الاصدارة 2003 أما بالاصدارة 2007 فلا أعرف لست متأكداً.

على العموم للتعامل مع برنامج الوورد (Word) نحتاج الى اضافة المكتبة ولفعل ذلك.

أنشئ مشروعاً جديداً ومن القائمة Project أختر Reference لتطالعك النافذة التالية :

حدد المكتبة المحددة بالصورة وأنقر الزر Ok :

بعدها علينا ان نضيف مجال الأسماء التالي :

Imports Microsoft.Office.Interop

وننشئ متغير جديد يشير الى الـ Word Application بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

كما ترى بالشكل المضلل هناك، ان برنامج الوورد الان تحت تصرفك في كلمة واحدة Word وهي تمثل البرنامج ككل وبشكل عام .

الان نريد ان ننشئ مشروعاً جديدا او مستنداً جديداً أنظر للشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        word.Documents.Add()

        word.Visible = True

    End Sub

End Class

ان الخاصية Documents والتي هي للقراءة فقط تمثل مستند الوورد.

وعن طريق الوظيفة Add يمكننا اضافة مستند جديد.

ان الخاصية Visible هي المسئولة عن اظهار البرنامج والا فانك لن تراه فعلياً أمامك حتى وان كان يعمل بخلفية النظام.

كما ان Documents لها العديد من الطرق والخاصائص كما بالشكل التالي :

Add تحدثنا عنه .

Count يعود بعدد يمثل عدد المستندات المفتوحة.

Open لفتح مستند، و Save لحفظ المستند المفتوح حالياً، و Close تستخدم لإغلاق المستند المفتوح حالياً.

كما يفضل للتعامل مع المستند المفتوح حالياً استخدام هذه الطريقة:

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim doc As New Word.Document

        doc = word.Documents.Add()

        With doc

            .Content.Text = "Qnefo Word 2007"

            .Content.Underline = Microsoft.Office.Interop.Word.WdUnderline.wdUnderlineDotDash

        End With

        word.Visible = True

    End Sub

End Class

من المفيذ جدا ان تعرف متغير جديد على انه المستند الذي تتعامل معه الان.

وكما تلاحظ عرفنا متغير Doc على انه من النوع Document تم اسندناه الى المستند الذي قمنا بفتحه.

والان المستند تحت تصرفنا لنفعل به ما نشاء.

وانا هنا كتبت جملة تم طبقت عليها بعض الوسوم .

يمكنك فتح ملف موجود بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.Documents.Open("c:\dc.docx ")

    End Sub

End Class

أو حفظ الملف المفتوح حالياً بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.Documents("Qnefo").save

    End Sub

End Class

او لحفظ كافة المستندات المفتوحة حالياً كما بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.Documents.save

    End Sub

End Class

حيث ان Documents يشير الى كل المستندات وليس مستند واحد فقط.

أيضا يمكن حفظ المستند بأسم أخر كما بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.ActiveDocument.SaveAs(FileName:="C:\Qnefo.docx")

    End Sub

    End Sub

End Class

ان ActiveDocument تشير الى المستند النشط حالياً او الذي نتعامل معه الان.

كما ان FileName تحدد مسار واسم الملف، حقيقة يوجد العديد من الخيارات للتعامل مع هكذا حالات أنظر للشكل التالي :

كل هذه البارمترات أختيارية لك مطلق الحرية في ان تقوم بتعريفها او تركها أفتراضية.

لاحظ الخيارات هل تريد قفل المستند ام لا وكلمة السر والمرور وهل تريد اضافته الى المستندات المفتوحة مؤخراً أم لا .

كلها خيارات متروكة لك.

اذا اردت ان تغلق أي وثيقة فيمكنك ذلك كما بالشكل التالي :

Imports Microsoft.Office.Interop

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.Documents("Qnefo").Close()

    End Sub

End Class

بحال اغلقت اي مستند بهذه الطريقة سيسالك البرنامج اذا كنت تريد حفظ التغييرات.

ولتتجاهل ذلك او لتؤكد ذلك أنظر للشكل التالي :

Imports Microsoft.Office.Interop

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.Documents("Qnefo").Close(SaveChanges:=WdSaveOptions.wdDoNotSaveChanges)

    End Sub

End Class

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

حقيقة توجد العديد من الخيارات الموضوعة ي شكل تركيبات تحتاجها لتقوم بتمريرها كبارمترات.

ولتصل اليها ستجدها هنا كما بالشكل التالي :

كل هذه التركيبات كما ترى يسبقها الحرفان Wd .

وكل تركيب يدل عليه أسمه كما تشاهد، وبالمثال السابق استخدمنا التركيب WdSaveOption راجع المثال لتفهم ذلك جيداً.

كما يمكنك اغلاق اي مستند عن طريق ActiveDocument في أشارة الى المستند الحالي او المفتوح حالياً.

يمكن ادراج النصوص بالشكل التالي :

Imports Microsoft.Office.Interop

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Dim word As New Word.Application

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        word.ActiveDocument.Content.InsertAfter("After")

        word.ActiveDocument.Content.InsertBefore("Before")

      End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim doc As New Word.Document

        doc = word.Documents.Add()

        word.Visible = True

        With doc

            .Content.Text = "Qnefo Word 2007"

            .Content.Underline = Microsoft.Office.Interop.Word.WdUnderline.wdUnderlineDotDash

        End With

    End Sub

End Class

لاحظ السطران المضللان الاول يقوم بإدراج نص بعد النص الموجود والثاني يضيفه قبله

او بهذا الشكل :

  Word.Application.Selection.TypeText("أدراج نص")

تحويل المستند للمعاينة قبل الطباعة

  Word.Application.ActiveDocument.PrintPreview()

تغيير عنوان المستند :

 Word.Application.Caption = "العنوان"

فتح مستند في نافذة جديدة :

 Word.Application.NewWindow()

كما تحت الـ Option يمكنك إيجاد الكثير من الخصائص التي تمكنك من التحكم في طريقة عرض المستند أنظر للشكل التالي :

تحديد نوعية الورق المستخدم أنظر للشكل التالي :

   Word.Application.ActiveDocument.PageSetup.PaperSize = WdPaperSize.wdPaperA4

حيث هناك العديد من الخيارات التي تلبي الطلب بهذا التركيب أنظر للشكل التالي:

كما اذا كنت تحتاج الى تحديد الصفحة هل هي افقية ام عمودية أكتب التالي :

  Word.Application.ActiveDocument.PageSetup.Orientation = WdOrientation.wdOrientLandscape

وهذه مجموعة من الخيارات أنظر للتالي :

 Word.Application.ActiveWindow.DisplayRulers = False

 Word.Application.DisplayRecentFiles = False

 Word.Application.DisplayScreenTips = False

الخيار الاول هل اعرض المسطرة ام لا.

الخيار الثاني هل اعرض المستندات الاخيرة ام لا.

الخيار الثالث هل اعرض تلميح اليوم ام لا

وهذه تعني إغلاق الكل بدون حفظ أي شئ أنظر للتالي :

 Word.ActiveWindow.Close(False)

أستخدام التصحيح الاملائي للوورد في برنامجنا أنظر للشكل التالي :

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Word As New Microsoft.Office.Interop.Word.Application

        Word.Application.Documents.Add()

        Dim DRange As Range

        Me.Text = "Starting Word ..."

        'اضافة مستند جديد

        Word.Documents.Add()

        Me.Text = "Checking words..."

        Me.TextBox1.Text = "ادخال النص المكتوب في مربع النص الى المستند"

        ' تعرف النص المكتوب الحالي و الموجود في المستند الذي اضفناه

        DRange = Word.ActiveDocument.Range

        'ادخال النص المكتوب في مربع النص الى المستند

        DRange.InsertAfter(TextBox1.Text)

        'يمثل هذا المتغير الاخطاء الاملائية

        Dim SpellCollection As ProofreadingErrors

        'تعريف الاخطاء الاملائية المكتوبة في النص

        SpellCollection = DRange.SpellingErrors

        'اذا كانت هناك اخطاء املائية في النص

        If SpellCollection.Count > 0 Then

            Dim iword As Integer

            Dim newWord As String

            '  حلقة تكرارية تضيف جميع الاخطاء الاملائية الى الاداة

            For iword = 1 To SpellCollection.Count

                newWord = SpellCollection.Item(iword).Text

                ListBox1.Items.Add(newWord)

            Next

        End If

        Me.Text = "Word spelling Demo"

        Word.ActiveWindow.Close(False)

    End Sub

End Class

ليعمل هذا المثال اضف ListBox وكذلك TextBox الى النموذج.

ايضاً طباعة المستند الحالي :

   Word.Documents.Application.PrintOut()

لمزيد من التفاصيل يمكن استخدام الطريقة التالي :

    Word.Documents.Application.PrintOut(FileName:="", Range:=wdPrintAllDocument, Item:= _

        wdPrintDocumentContent, Copies:=1, Pages:="", PageType:=wdPrintAllPages, _

        ManualDuplexPrint:=False, Collate:=True, Background:=True, PrintToFile:= _

        False, PrintZoomColumn:=0, PrintZoomRow:=0, PrintZoomPaperWidth:=0, _

        PrintZoomPaperHeight:=0)

وبهذا الامر يمكننا معرفة الطابعة الافتراضية الان أنظر للتالي:

   MsgBox(Word.Documents.Application.ActivePrinter)

أيضاً يمكننا ادراج جدول كما بالشكل التالي :

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Word As New Microsoft.Office.Interop.Word.Application

        Word.Application.Documents.Add()

        Dim rng As Range

        rng = Word.Application.Selection.Range

        Dim tbl As Table = Word.Application.Selection.Tables.Add(rng, 4, 4)

        Word.Application.Visible = True

    End Sub

End Class

اذا شغلت البرنامج بهذا الشكل فسيتم إنشاء الجدول ولكن لن تراه لان حدوده مخفية، وكما ترى اخبرنا البرنامج اننا نريد جدول من اربعة اعمدة واريعة صفوف.

اذا اردنا تحديد ستايل او شكل الحدود فيمكننا ان نضيف التالي :

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Word As New Microsoft.Office.Interop.Word.Application

        Word.Application.Documents.Add()

        Dim rng As Range

        rng = Word.Application.Selection.Range

        Dim tbl As Table = Word.Application.Selection.Tables.Add(rng, 4, 4)

        tbl.Borders.InsideLineStyle = WdLineStyle.wdLineStyleDot

        tbl.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleDot

        Word.Application.Visible = True

    End Sub

End Class

وستكون النتيجة كما بالشكل التالي :

تحتاج احياناً الى تطبيق بعض الاشياء على الجدول ولتقوم بذلك تحتاج الى تحديد الجدول ولتفعل ذلك اكتب التالي :

Word.ActiveDocument.Tables(1).Select()

طبعاً رقم الفهرس للجدول فربما كان بالمستند اكثر من جدول.

طبعاً تلك المربعات هي عبارة عن حقول او خلايا يمكن التعامل معها كلا على حدة.

لحذف خلية نكتب التالي :

tbl.Cell(1, 4).Delete()

أنظر لهذه النتيجة لتفهم المقصود :

لقد تم حذف الخلية المحددة.

أو القيام بعملية دمج انظر للشكل التالي :

  tbl.Cell(1, 4).Merge(tbl.Cell(6, 3))

وهذه هي النتيجة :

طبعا العدد 6 خارج حدود تعريفنا للجدول، والبرنامج أعطانا حل تقريبي.

أو تقسيم الخلية أنظر للشكل التالي :

 tbl.Cell(4, 4).Split(3, 3)

وهذه هي النتيجة :

وايضاً هل نجعل النص يلتف ام لا بالخلية المحددة أنظر للشكل التالي :

 tbl.Cell(2, 4).WordWrap = True

ويمكننا محاذاة النص بالحقل كما بالشكل التالي :

 tbl.Cell(3, 4).VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter

كما اذا اردنا ملئ هذا الجدول بالبيانات نكتب التالي :

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Word As New Microsoft.Office.Interop.Word.Application

        Word.Application.Documents.Add()

        Dim rng As Range

        rng = Word.Application.Selection.Range

        Dim tbl As Table = Word.Application.Selection.Tables.Add(rng, 4, 4)

        tbl.Borders.InsideLineStyle = WdLineStyle.wdLineStyleDot

        tbl.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleDot

        tbl.Cell(1, 1).Select()

        Word.Application.Selection.Text = "رقم متسلسل"

        tbl.Cell(1, 2).Select()

        Word.Application.Selection.Text = "أسم الملف"

        tbl.Cell(1, 3).Select()

        Word.Application.Selection.Text = "حجم الملف"

        tbl.Cell(1, 4).Select()

        Word.Application.Selection.Text = "ملاحظات"

        Word.Application.Visible = True

    End Sub

End Class

وستكون النتيجة كما بالشكل التالي :

يمكن استرجاع النصوص من المستند بالطريقة التالية :

Imports Microsoft.Office.Interop.Word

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Word As New Microsoft.Office.Interop.Word.Application

        Word.Application.Documents.Add()

        Dim rng As Range

        rng = Word.Application.Selection.Range

        Dim tbl As Table = Word.Application.Selection.Tables.Add(rng, 4, 4)

        tbl.Borders.InsideLineStyle = WdLineStyle.wdLineStyleDot

        tbl.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleDot

        tbl.Cell(1, 1).Select()

        Word.Application.Selection.Text = "رقم متسلسل"

        tbl.Cell(1, 2).Select()

        Word.Application.Selection.Text = "أسم الملف"

        tbl.Cell(1, 3).Select()

        Word.Application.Selection.Text = "حجم الملف"

        tbl.Cell(1, 4).Select()

        Word.Application.Selection.Text = "ملاحظات"

        MsgBox(Word.ActiveDocument.Words(1).Text)

        Word.Application.Visible = True

    End Sub

End Class

لاحظ السطر الذي اضفناه اذا شغلت البرنامج ستحصل على التالي :

طبعاً عادت لنا بأول كلمة في المستند.

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

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

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

وكلما احتجت شيئاً ابحث عنه بالمكان المطلوب فقط، ان كان يتبع المستند فابحث في الـ Document وان كان يتبع البرنامج فابحث في الـ Application

وان كان يتعلق بالجداول فابحث بالـ Tabels وهكذا

والله الموفق.


مجالات الأسماء Name Space

أولاً مجالات الأسماء Name Space

قلت بمكان أخر ان مايسمى بالفضاءات اما مجلدات أو هو أشبه بالمجلدات في توزيعه وحقيقة اريد ان اعترف لك بأمر وهو انني ما قلت هذا الا لانني كنت مرة اعمل من داخل نظام الدوس وبالاخص تحت النظام المعروف بأسم NC Norton ومن هناك أمكنني تصفح مجلد الـ Asamply وبعدها قمت بنسخه الى مكان بالقرص الصلب وتصفحته من داخل الـ Windows فيما بعد ووجدت الكثير والكثير من ملفات الـ DLL وهي مرتبة بداخل المجلدات.

فمثلا يمكنك ان تجد مجلداً يسمى Tools بداخله مجلد يسمى Forms بداخله الكثير من الملفات.

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

لذلك من الضروري ان تضعها في مجلدات، هذه للطب، وهذه للفضاء، وهذه بالاحياء، وهذه للكمبيوتر.

هذا هو مجال الاسماء وهذا بالضبط ما هو مطلوب منه ان يعمله.

ولتقوم بجلب مجال معين يجب استدعاءه قبل بداية Class كما بالشكل التالي:

Imports System

Imports Microsoft.VisualBasic

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub

End Class

كما يمكنك ان تضع المحتويات بداخل متغير كما بالشكل التالي:

بمجرد كتابة المتغير والنقطة حصلنا على كل التركيبات والـ Class وغيرها.

سيكون من العبث استخدام الجملة التالية:

 Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Mybutton As New System.Windows.Forms.Button

    End Sub

End Class

ولذلك علينا استيراد المجال التالي حتى نختصر هذه الجملة وكل الجمل التي ستليها في البرمجة:

 Imports System.Windows.Forms

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Mybutton As New Button

    End Sub

End Class

كما يمكنك إضافة مجال أسماء عن طريق القائمة التالية:

من Solution explorer انقر نقراً مزدوجاً على my project لتظهر لك نافذة اختر منا Reference وسوف تجد كل المجالات راجع الدروس السابقة.

بحال استيرادك لمجال أسماء تم ضياعه فيما بعد، او له مسار غير موجود ستحصل على الصورة التالية:

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

GetKey هذه حقيقة لا شئ ولاوجود لها بمجال الاسماء Registry

كما يمكنك القيام بعمل مجالات اسماء خاصة بك تحتوي العديد من الاجراءات او Class الخاصة بك، ويمكنك اضافتها في نفس النموذج وان كنت احبذ ان تضعها في Modules لوحدها.

لاضافة Modules الى المشروع أختر Project تم Add Modules بعد ان يتم اضافته انتقل اليه واكتب فيه التالي:

Namespace Test

    Module Module1

    End Module

End Namespace

ضع بالاعتبار ان الـ Module لايمكن اشتقاقه كما تفعل مع أي كلاسس (Class) ويمكنك بعكس الكلاسس ان تستدعي مكوناته مباشرة دون الاعلان عنها.

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

لاحظ كيف تم احاطة namespace بالـ Module1 لايمكنك جعل namespace بداخله او بداخل اي Class بل هو الذي يحتوي هذه الاشياء.

سنجري بعض التعديلات الجديدة كما بالشكل:

 Namespace Test

    Class FileFolder

    End Class

    Class Devices

    End Class

    Class Database

    End Class

End Namespace

لقد أضفت ثلاث Class ليتم ادراج الاجراءات المناسبة فيها، والاول سيكون خاص بالتعامل مع الملفات والمجلدات، والثاني مع الاجهزة، والثالث مع قواعد البيانات، طبعاً انت محتاج لان تضع اكوادك الخاصة هنا والتي ستساعدك في عمل ذلك.

اذا عدت الى النموذج مرة أخرى فيمكنك من هناك الان الاتصال بهذه Class التي عملتها في سهولة عن طريق مجال الاسماء هذا أنظر الشكل التالي:

أنظر بمجرد كتابتك للحرفين Te فسوف يظهر مجال الاسماء الخاص بنا.

ومجرد اختيارنا لمجال الاسماء تظهر قائمة بالمحتويات الخاصة بنا، عرفنا متغير Value ليحتوي المسار، لاحظ Class الثلاثة التي عملناها ولاحظ مجال الاسماء Test الخاص بناء.

ملاحظة صغيرة بعد، أنظر الى القوسين قبل كلمة Test أنها الايقونة الدالة على ان هذا الاسم هو فضاء، وانظر الى الصورة الثانية FileFolder الايقونة تعني أنها Class .

حقيقة عليك ان تميز هذه الايقونات لتعرف مالذي تتعامل معه بالضبط بمجرد النظرة الاولى.

حتى الان كل هذا الفضاء الخاص بناء لايحتوي على شئ وفارغ تماماً ولاشئ فيه.

ولذلك علينا ان نضع فيه شيئاً او اشياء هيا بنا انظر الشكل التالي:

 Namespace Test

    Class FileFolder

        Public Sub CopyFile()

        End Sub

        Public Sub DeleteFile()

        End Sub

        Public Sub MoveFile()

        End Sub

    End Class

    Class Devices

    End Class

    Class Database

    End Class

End Namespace

الان قمنا باضافة ثلاث اجراءات للـ Class الخاصة بالملفات والمجلدات ومن نموذجنا يمكننا ان نرى التالي:

هل ترى..؟

أنها الاجراءات الثلاثة التي عملناها، ويمكننا الاتصال بها في سهولة، ولكن حتى الان لازالت هذه المجلدات او الحافظات فارغة أنظر التالي:

 Namespace Test

    Class FileFolder

        Public Sub CopyFile(ByVal FileFrom As String, ByVal FileTo As String)

            My.Computer.FileSystem.CopyFile(FileFrom, FileTo, True)

        End Sub

        Public Sub DeleteFile()

        End Sub

        Public Sub MoveFile()

        End Sub

    End Class

    Class Devices

    End Class

    Class Database

    End Class

End Namespace

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

كما يمكنك استيراد مجال الاسماء خاصتنا هذا الى المشروع عن طريق أسم التطبيق أنظر الشكل التالي:

Imports WindowsApplication1.Test.FileFolder

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

ويمكننا ايضا ان نصنع مجالات اسماء متداخلة كما بالشكل التالي:

 Namespace Test

    Class FileFolder

    End Class

    Class Devices

    End Class

    Class Database

    End Class

        Namespace OperatSystem

        End Namespace

        Namespace Network

        End Namespace

End Namespace

يمكنك ان نظيف الكثير بداخل مجال الأسماء هذا، ويمكنك تحويله الى ملف Dll ويحتوي على مكتبات وتركيبات وأشياء كثيرة ومختلفة أنظر مثال بيسط:

 Namespace Test

    Public Structure Test

        Public Test1 As String

        Public Test2 As Integer

        Public Test3 As Date

        Public Test4 As Long

    End Structure

    Class File

        Public Visual As Test

        Public Books As String

    End Class

    Class Devices

        Public Function DevX(ByVal S1 As String, ByVal S2 As Integer)As Test

        End Function

    End Class

    Class Database

    End Class

    Namespace OperatSystem

    End Namespace

    Namespace Network

    End Namespace

End Namespace

راجع المثال السابق بروية، سيوحي لك بالكثير تأكد من ذلك.

وأخيراً هل ماهذه الاسطر الا أمثلة بسيطة، هل تريد ان مثالاً حقيقياً عن اجراءات مليئة بالكود انظر التالي:

صدقني لا اريد اصابتك بالاحباط، ولكن ما ستراه بسيط وكل ما فيه ذكرناه هنا، ولكن الامر أشبه بمن يبني مسكناً، الحجر وراء الحجر يشكل احجاراً اذا رايتها عمارة قلت كيف سيمكنني ان ابني شيئاً كهذا، والحقيقة هي انك اذا بنيت حجراً واحداً فهذا يعني أنك ستبني احجاراً وستبني عمارة.

أرجوا ان يكون كلامي واضحاً، أنظر المثال الثالي:

 <Serializable(), PermissionSet(SecurityAction.InheritanceDemand, Name:="FullTrust"), PermissionSet(SecurityAction.LinkDemand, Name:="FullTrust")> _

Public Class ToolboxItem

    Implements ISerializable

    ' Events

    Public Event ComponentsCreated As ToolboxComponentsCreatedEventHandler

    Public Event ComponentsCreating As ToolboxComponentsCreatingEventHandler

    ' Methods

    Public Sub New()

    End Sub

    Public Sub New(ByVal toolType As Type)

        Me.Initialize(toolType)

    End Sub

    Private Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)

        Me.Deserialize(info, context)

    End Sub

    Protected Sub CheckUnlocked()

        If Me.Locked Then

            Throw New InvalidOperationException(SR.GetString("ToolboxItemLocked"))

        End If

    End Sub

    Public Function CreateComponents() As IComponent()

        Return Me.CreateComponents(Nothing)

    End Function

    Public Function CreateComponents(ByVal host As IDesignerHost) As IComponent()

        Me.OnComponentsCreating(New ToolboxComponentsCreatingEventArgs(host))

        Dim components As IComponent() = Me.CreateComponentsCore(host, New Hashtable)

        If ((Not components Is Nothing) AndAlso (components.Length > 0)) Then

            Me.OnComponentsCreated(New ToolboxComponentsCreatedEventArgs(components))

        End If

        Return components

    End Function

    Public Function CreateComponents(ByVal host As IDesignerHost, ByVal defaultValues As IDictionary) As IComponent()

        Me.OnComponentsCreating(New ToolboxComponentsCreatingEventArgs(host))

        Dim components As IComponent() = Me.CreateComponentsCore(host, defaultValues)

        If ((Not components Is Nothing) AndAlso (components.Length > 0)) Then

            Me.OnComponentsCreated(New ToolboxComponentsCreatedEventArgs(components))

        End If

        Return components

    End Function

    Protected Overridable Function CreateComponentsCore(ByVal host As IDesignerHost) As IComponent()

        Dim list As New ArrayList

        Dim componentClass As Type = Me.GetType(host, Me.AssemblyName, Me.TypeName, True)

        If (Not componentClass Is Nothing) Then

            If (Not host Is Nothing) Then

                list.Add(host.CreateComponent(componentClass))

            ElseIf GetType(IComponent).IsAssignableFrom(componentClass) Then

                list.Add(TypeDescriptor.CreateInstance(Nothing, componentClass, Nothing, Nothing))

            End If

        End If

        Dim array As IComponent() = New IComponent(list.Count - 1) {}

        list.CopyTo(array, 0)

        Return array

    End Function

    Protected Overridable Function CreateComponentsCore(ByVal host As IDesignerHost, ByVal defaultValues As IDictionary) As IComponent()

        Dim componentArray As IComponent() = Me.CreateComponentsCore(host)

        If (Not host Is Nothing) Then

            Dim i As Integer

            For i = 0 To componentArray.Length - 1

                Dim designer As IComponentInitializer = TryCast(host.GetDesigner(componentArray(i)), IComponentInitializer)

                If (Not designer Is Nothing) Then

                    Dim flag As Boolean = True

                    Try

                        designer.InitializeNewComponent(defaultValues)

                        flag = False

                    Finally

                        If flag Then

                            Dim j As Integer

                            For j = 0 To componentArray.Length - 1

                                host.DestroyComponent(componentArray(j))

                            Next j

                        End If

                    End Try

                End If

            Next i

        End If

        Return componentArray

    End Function

    Protected Overridable Sub Deserialize(ByVal info As SerializationInfo, ByVal context As StreamingContext)

        Dim strArray As String() = Nothing

        Dim enumerator As SerializationInfoEnumerator = info.GetEnumerator

        Do While enumerator.MoveNext

            Dim current As SerializationEntry = enumerator.Current

            If current.Name.Equals("PropertyNames") Then

                strArray = TryCast(current.Value, String())

                Exit Do

            End If

        Loop

        If (strArray Is Nothing) Then

            strArray = New String() {"AssemblyName", "Bitmap", "DisplayName", "Filter", "IsTransient", "TypeName"}

        End If

        Dim enumerator2 As SerializationInfoEnumerator = info.GetEnumerator

Label_00DB:

        Do While enumerator2.MoveNext

            Dim entry2 As SerializationEntry = enumerator2.Current

            Dim str As String

            For Each str In strArray

                If str.Equals(entry2.Name) Then

                    Me.Properties.Item(entry2.Name) = entry2.Value

                    GoTo Label_00DB

                End If

            Next

        Loop

        If info.GetBoolean("Locked") Then

            Me.Lock()

        End If

    End Sub

    Public Overrides Function Equals(ByVal obj As Object) As Boolean

        If (Not Me Is obj) Then

            If (obj Is Nothing) Then

                Return False

            End If

            If (Not obj.GetType Is MyBase.GetType) Then

                Return False

            End If

            Dim item As ToolboxItem = DirectCast(obj, ToolboxItem)

            If (Me.TypeName <> item.TypeName) Then

                If ((Me.TypeName Is Nothing) OrElse (item.TypeName Is Nothing)) Then

                    Return False

                End If

                If Not Me.TypeName.Equals(item.TypeName) Then

                    Return False

                End If

            End If

            If (Not Me.AssemblyName Is item.AssemblyName) Then

                If ((Me.AssemblyName Is Nothing) OrElse (item.AssemblyName Is Nothing)) Then

                    Return False

                End If

                If Not Me.AssemblyName.FullName.Equals(item.AssemblyName.FullName) Then

                    Return False

                End If

            End If

            If (Me.DisplayName <> item.DisplayName) Then

                If ((Me.DisplayName Is Nothing) OrElse (item.DisplayName Is Nothing)) Then

                    Return False

                End If

                If Not Me.DisplayName.Equals(item.DisplayName) Then

                    Return False

                End If

            End If

        End If

        Return True

    End Function

    Protected Overridable Function FilterPropertyValue(ByVal propertyName As String, ByVal value As Object) As Object

        Dim str As String = propertyName

        If (Not str Is Nothing) Then

            If Not (str = "AssemblyName") Then

                If ((str = "DisplayName") OrElse (str = "TypeName")) Then

                    If (value Is Nothing) Then

                        value = String.Empty

                    End If

                    Return value

                End If

                If (str = "Filter") Then

                    If (value Is Nothing) Then

                        value = New ToolboxItemFilterAttribute(0 - 1) {}

                    End If

                    Return value

                End If

                If ((str = "IsTransient") AndAlso (value Is Nothing)) Then

                    value = False

                End If

                Return value

            End If

            If (Not value Is Nothing) Then

                value = DirectCast(value, AssemblyName).Clone

            End If

        End If

        Return value

    End Function

    Public Overrides Function GetHashCode() As Integer

        Dim num As Integer = 0

        If (Not Me.TypeName Is Nothing) Then

            num = (num Xor Me.TypeName.GetHashCode)

        End If

        Return (num Xor Me.DisplayName.GetHashCode)

    End Function

    Private Function GetNonRetargetedAssemblyName(ByVal type As Type, ByVal policiedAssemblyName As AssemblyName) As AssemblyName

        If ((Not type Is Nothing) AndAlso (Not policiedAssemblyName Is Nothing)) Then

            If (type.Assembly.FullName = policiedAssemblyName.FullName) Then

                Return policiedAssemblyName

            End If

            Dim name As AssemblyName

            For Each name In type.Assembly.GetReferencedAssemblies

                If (name.FullName = policiedAssemblyName.FullName) Then

                    Return name

                End If

            Next

            Dim name2 As AssemblyName

            For Each name2 In type.Assembly.GetReferencedAssemblies

                If (name2.Name = policiedAssemblyName.Name) Then

                    Return name2

                End If

            Next

            Dim name3 As AssemblyName

            For Each name3 In type.Assembly.GetReferencedAssemblies

                Dim name4 As AssemblyName

                Dim assembly As Assembly = Nothing

                Try

                    [assembly] = Assembly.Load(name3)

                    If (([assembly] Is Nothing) OrElse Not ([assembly].FullName = policiedAssemblyName.FullName)) Then

                        GoTo Label_00E2

                    End If

                    name4 = name3

                Catch obj1 As Object

                End Try

                Return name4

Label_00E2:

            Next

        End If

        Return Nothing

    End Function

    Public Function [GetType](ByVal host As IDesignerHost) As Type

        Return Me.GetType(host, Me.AssemblyName, Me.TypeName, False)

    End Function

    Protected Overridable Function [GetType](ByVal host As IDesignerHost, ByVal assemblyName As AssemblyName, ByVal typeName As String, ByVal reference As Boolean) As Type

        Dim service As ITypeResolutionService = Nothing

        Dim type As Type = Nothing

        If (typeName Is Nothing) Then

            Throw New ArgumentNullException("typeName")

        End If

        If (Not host Is Nothing) Then

            service = DirectCast(host.GetService(GetType(ITypeResolutionService)), ITypeResolutionService)

        End If

        If (Not service Is Nothing) Then

            If reference Then

                If (Not assemblyName Is Nothing) Then

                    service.ReferenceAssembly(assemblyName)

                    Return service.GetType(typeName)

                End If

                type = service.GetType(typeName)

                If (type Is Nothing) Then

                    type = Type.GetType(typeName)

                End If

                If (Not type Is Nothing) Then

                    service.ReferenceAssembly(type.Assembly.GetName)

                End If

                Return type

            End If

            If (Not assemblyName Is Nothing) Then

                Dim assembly As Assembly = service.GetAssembly(assemblyName)

                If (Not [assembly] Is Nothing) Then

                    type = [assembly].GetType(typeName)

                End If

            End If

            If (type Is Nothing) Then

                type = service.GetType(typeName)

            End If

            Return type

        End If

        If Not String.IsNullOrEmpty(typeName) Then

            If (Not assemblyName Is Nothing) Then

                Dim assembly2 As Assembly = Nothing

                Try

                    assembly2 = Assembly.Load(assemblyName)

                Catch exception1 As FileNotFoundException

                Catch exception2 As BadImageFormatException

                Catch exception3 As IOException

                End Try

                If (((assembly2 Is Nothing) AndAlso (Not assemblyName.CodeBase Is Nothing)) AndAlso (assemblyName.CodeBase.Length > 0)) Then

                    Try

                        assembly2 = Assembly.LoadFrom(assemblyName.CodeBase)

                    Catch exception4 As FileNotFoundException

                    Catch exception5 As BadImageFormatException

                    Catch exception6 As IOException

                    End Try

                End If

                If (Not assembly2 Is Nothing) Then

                    type = assembly2.GetType(typeName)

                End If

            End If

            If (type Is Nothing) Then

                type = Type.GetType(typeName, False)

            End If

        End If

        Return type

    End Function

    Public Overridable Sub Initialize(ByVal type As Type)

        Me.CheckUnlocked()

        If (Not type Is Nothing) Then

            Me.TypeName = type.FullName

            Dim name As AssemblyName = type.Assembly.GetName(True)

            If type.Assembly.GlobalAssemblyCache Then

                name.CodeBase = Nothing

            End If

            Dim dictionary As New Dictionary(Of String, AssemblyName)

            Dim type2 As Type = type

            Do While (Not type2 Is Nothing)

                Dim policiedAssemblyName As AssemblyName = type2.Assembly.GetName(True)

                Dim nonRetargetedAssemblyName As AssemblyName = Me.GetNonRetargetedAssemblyName(type, policiedAssemblyName)

                If ((Not nonRetargetedAssemblyName Is Nothing) AndAlso Not dictionary.ContainsKey(nonRetargetedAssemblyName.FullName)) Then

                    dictionary.Item(nonRetargetedAssemblyName.FullName) = nonRetargetedAssemblyName

                End If

                type2 = type2.BaseType

            Loop

            Dim nameArray As AssemblyName() = New AssemblyName(dictionary.Count - 1) {}

            Dim num As Integer = 0

            Dim name4 As AssemblyName

            For Each name4 In dictionary.Values

                nameArray(num++) = name4

            Next

            Me.DependentAssemblies = nameArray

            Me.AssemblyName = name

            Me.DisplayName = type.Name

            If Not type.Assembly.ReflectionOnly Then

                Dim customAttributes As Object() = type.Assembly.GetCustomAttributes(GetType(AssemblyCompanyAttribute), True)

                If ((Not customAttributes Is Nothing) AndAlso (customAttributes.Length > 0)) Then

                    Dim attribute As AssemblyCompanyAttribute = TryCast(customAttributes(0), AssemblyCompanyAttribute)

                    If ((Not attribute Is Nothing) AndAlso (Not attribute.Company Is Nothing)) Then

                        Me.Company = attribute.Company

                    End If

                End If

                Dim attribute2 As DescriptionAttribute = DirectCast(TypeDescriptor.GetAttributes(type).Item(GetType(DescriptionAttribute)), DescriptionAttribute)

                If (Not attribute2 Is Nothing) Then

                    Me.Description = attribute2.Description

                End If

                Dim attribute3 As ToolboxBitmapAttribute = DirectCast(TypeDescriptor.GetAttributes(type).Item(GetType(ToolboxBitmapAttribute)), ToolboxBitmapAttribute)

                If (Not attribute3 Is Nothing) Then

                    Dim image As Bitmap = TryCast(attribute3.GetImage(type, False), Bitmap)

                    If ((Not image Is Nothing) AndAlso ((image.Width <> &H10) OrElse (image.Height <> &H10))) Then

                        image = New Bitmap(image, New Size(&H10, &H10))

                    End If

                    Me.Bitmap = image

                End If

                Dim flag As Boolean = False

                Dim list As New ArrayList

                Dim attribute4 As Attribute

                For Each attribute4 In TypeDescriptor.GetAttributes(type)

                    Dim attribute5 As ToolboxItemFilterAttribute = TryCast(attribute4, ToolboxItemFilterAttribute)

                    If (Not attribute5 Is Nothing) Then

                        If attribute5.FilterString.Equals(Me.TypeName) Then

                            flag = True

                        End If

                        list.Add(attribute5)

                    End If

                Next

                If Not flag Then

                    list.Add(New ToolboxItemFilterAttribute(Me.TypeName))

                End If

                Me.Filter = DirectCast(list.ToArray(GetType(ToolboxItemFilterAttribute)), ToolboxItemFilterAttribute())

            End If

        End If

    End Sub

    Public Overridable Sub Lock()

        Me.locked = True

    End Sub

    Protected Overridable Sub OnComponentsCreated(ByVal args As ToolboxComponentsCreatedEventArgs)

        If (Not Me.componentsCreatedEvent Is Nothing) Then

            Me.componentsCreatedEvent.Invoke(Me, args)

        End If

    End Sub

    Protected Overridable Sub OnComponentsCreating(ByVal args As ToolboxComponentsCreatingEventArgs)

        If (Not Me.componentsCreatingEvent Is Nothing) Then

            Me.componentsCreatingEvent.Invoke(Me, args)

        End If

    End Sub

    Protected Overridable Sub Serialize(ByVal info As SerializationInfo, ByVal context As StreamingContext)

        Dim traceVerbose As Boolean = ToolboxItem.ToolboxItemPersist.TraceVerbose

        info.AddValue("Locked", Me.Locked)

        Dim list As New ArrayList(Me.Properties.Count)

        Dim entry As DictionaryEntry

        For Each entry In Me.Properties

            list.Add(entry.Key)

            info.AddValue(CStr(entry.Key), entry.Value)

        Next

        info.AddValue("PropertyNames", DirectCast(list.ToArray(GetType(String)), String()))

    End Sub

    Private Sub System.Runtime.Serialization.ISerializable.GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData

        IntSecurity.UnmanagedCode.Demand()

        Me.Serialize(info, context)

    End Sub

    Public Overrides Function ToString() As String

        Return Me.DisplayName

    End Function

    Protected Sub ValidatePropertyType(ByVal propertyName As String, ByVal value As Object, ByVal expectedType As Type, ByVal allowNull As Boolean)

        If (value Is Nothing) Then

            If Not allowNull Then

                Throw New ArgumentNullException("value")

            End If

        ElseIf Not expectedType.IsInstanceOfType(value) Then

            Throw New ArgumentException(SR.GetString("ToolboxItemInvalidPropertyType", New Object() {propertyName, expectedType.FullName}), "value")

        End If

    End Sub

    Protected Overridable Function ValidatePropertyValue(ByVal propertyName As String, ByVal value As Object) As Object

        Select Case propertyName

            Case "AssemblyName"

                Me.ValidatePropertyType(propertyName, value, GetType(AssemblyName), True)

                Return value

            Case "Bitmap"

                Me.ValidatePropertyType(propertyName, value, GetType(Bitmap), True)

                Return value

            Case "Company", "Description", "DisplayName", "TypeName"

                Me.ValidatePropertyType(propertyName, value, GetType(String), True)

                If (value Is Nothing) Then

                    value = String.Empty

                End If

                Return value

            Case "Filter"

                Me.ValidatePropertyType(propertyName, value, GetType(ICollection), True)

                Dim num As Integer = 0

                Dim is2 As ICollection = DirectCast(value, ICollection)

                If (Not is2 Is Nothing) Then

                    Dim obj2 As Object

                    For Each obj2 In is2

                        If TypeOf obj2 Is ToolboxItemFilterAttribute Then

                            num += 1

                        End If

                    Next

                End If

                Dim attributeArray As ToolboxItemFilterAttribute() = New ToolboxItemFilterAttribute(num - 1) {}

                If (Not is2 Is Nothing) Then

                    num = 0

                    Dim obj3 As Object

                    For Each obj3 In is2

                        Dim attribute As ToolboxItemFilterAttribute = TryCast(obj3, ToolboxItemFilterAttribute)

                        If (Not attribute Is Nothing) Then

                            attributeArray(num++) = attribute

                        End If

                    Next

                End If

                value = attributeArray

                Return value

            Case "IsTransient"

                Me.ValidatePropertyType(propertyName, value, GetType(Boolean), False)

                Return value

        End Select

        Return value

    End Function

    ' Properties

    Public Property AssemblyName() As AssemblyName

        Get

            Return DirectCast(Me.Properties.Item("AssemblyName"), AssemblyName)

        End Get

        Set(ByVal value As AssemblyName)

            Me.Properties.Item("AssemblyName") = value

        End Set

    End Property

    Public Property Bitmap() As Bitmap

        Get

            Return DirectCast(Me.Properties.Item("Bitmap"), Bitmap)

        End Get

        Set(ByVal value As Bitmap)

            Me.Properties.Item("Bitmap") = value

        End Set

    End Property

    Public Property Company() As String

        Get

            Return CStr(Me.Properties.Item("Company"))

        End Get

        Set(ByVal value As String)

            Me.Properties.Item("Company") = value

        End Set

    End Property

    Public Overridable ReadOnly Property ComponentType() As String

        Get

            Return SR.GetString("DotNET_ComponentType")

        End Get

    End Property

    Public Property DependentAssemblies() As AssemblyName()

        Get

            Dim nameArray As AssemblyName() = DirectCast(Me.Properties.Item("DependentAssemblies"), AssemblyName())

            If (Not nameArray Is Nothing) Then

                Return DirectCast(nameArray.Clone, AssemblyName())

            End If

            Return Nothing

        End Get

        Set(ByVal value As AssemblyName())

            Me.Properties.Item("DependentAssemblies") = value.Clone

        End Set

    End Property

    Public Property Description() As String

        Get

            Return CStr(Me.Properties.Item("Description"))

        End Get

        Set(ByVal value As String)

            Me.Properties.Item("Description") = value

        End Set

    End Property

    Public Property DisplayName() As String

        Get

            Return CStr(Me.Properties.Item("DisplayName"))

        End Get

        Set(ByVal value As String)

            Me.Properties.Item("DisplayName") = value

        End Set

    End Property

    Public Property Filter() As ICollection

        Get

            Return DirectCast(Me.Properties.Item("Filter"), ICollection)

        End Get

        Set(ByVal value As ICollection)

            Me.Properties.Item("Filter") = value

        End Set

    End Property

    Public Property IsTransient() As Boolean

        Get

            Return CBool(Me.Properties.Item("IsTransient"))

        End Get

        Set(ByVal value As Boolean)

            Me.Properties.Item("IsTransient") = value

        End Set

    End Property

    Public Overridable ReadOnly Property Locked() As Boolean

        Get

            Return Me.locked

        End Get

    End Property

    Public ReadOnly Property Properties() As IDictionary

        Get

            If (Me.properties Is Nothing) Then

                Me.properties = New LockableDictionary(Me, 8)

            End If

            Return Me.properties

        End Get

    End Property

    Public Property TypeName() As String

        Get

            Return CStr(Me.Properties.Item("TypeName"))

        End Get

        Set(ByVal value As String)

            Me.Properties.Item("TypeName") = value

        End Set

    End Property

    Public Overridable ReadOnly Property Version() As String

        Get

            If (Not Me.AssemblyName Is Nothing) Then

                Return Me.AssemblyName.Version.ToString

            End If

            Return String.Empty

        End Get

    End Property

    ' Fields

    Private Shared EventComponentsCreated As Object = New Object

    Private Shared EventComponentsCreating As Object = New Object

    Private locked As Boolean

    Private properties As LockableDictionary

    Private Shared ToolboxItemPersist As TraceSwitch = New TraceSwitch("ToolboxPersisting", "ToolboxItem: write data")

    ' Nested Types

    <DefaultMember("Item")> _

    Private Class LockableDictionary

        Inherits Hashtable

        ' Methods

        Friend Sub New(ByVal item As ToolboxItem, ByVal capacity As Integer)

            MyBase.New(capacity)

            Me._item = item

        End Sub

        Public Overrides Sub Add(ByVal key As Object, ByVal value As Object)

            Dim propertyName As String = Me.GetPropertyName(key)

            value = Me._item.ValidatePropertyValue(propertyName, value)

            Me.CheckSerializable(value)

            Me._item.CheckUnlocked()

            MyBase.Add(propertyName, value)

        End Sub

        Private Sub CheckSerializable(ByVal value As Object)

            If ((Not value Is Nothing) AndAlso Not value.GetType.IsSerializable) Then

                Throw New ArgumentException(SR.GetString("ToolboxItemValueNotSerializable", New Object() {value.GetType.FullName}))

            End If

        End Sub

        Public Overrides Sub Clear()

            Me._item.CheckUnlocked()

            MyBase.Clear()

        End Sub

        Private Function GetPropertyName(ByVal key As Object) As String

            If (key Is Nothing) Then

                Throw New ArgumentNullException("key")

            End If

            Dim str As String = TryCast(key, String)

            If ((str Is Nothing) OrElse (str.Length = 0)) Then

                Throw New ArgumentException(SR.GetString("ToolboxItemInvalidKey"), "key")

            End If

            Return str

        End Function

        Public Overrides Sub Remove(ByVal key As Object)

            Me._item.CheckUnlocked()

            MyBase.Remove(key)

        End Sub

        ' Properties

        Public Overrides ReadOnly Property IsFixedSize() As Boolean

            Get

                Return Me._item.Locked

            End Get

        End Property

        Public Overrides ReadOnly Property IsReadOnly() As Boolean

            Get

                Return Me._item.Locked

            End Get

        End Property

        Default Public Overrides Property Item(ByVal key As Object) As Object

            Get

                Dim propertyName As String = Me.GetPropertyName(key)

                Dim obj2 As Object = MyBase.Item(propertyName)

                Return Me._item.FilterPropertyValue(propertyName, obj2)

            End Get

            Set(ByVal value As Object)

                Dim propertyName As String = Me.GetPropertyName(key)

                value = Me._item.ValidatePropertyValue(propertyName, value)

                Me.CheckSerializable(value)

                Me._item.CheckUnlocked()

                MyBase.Item(propertyName) = value

            End Set

        End Property

        ' Fields

        Private _item As ToolboxItem

    End Class

End Class

وبهذا المثال اختم هذا الدرس.

ثانياً الفئات او الاصناف Class

قبل ان اسرد لكم معرفتي المتواضعة يجب ان نعلم مسميات الاشياء، فاحياناً نعلم كيفية عمل الشئ ولا نعلم ما أسمه، ولذلك احفظ ما بالجدول التالي:

Modules | الوحدات
Class | الاصناف او الفئات
Objects | الكائنات
Interfaces | الواجهات
Enums | التركيبات
Fields | الحقول
Methods | الطرق
Properties | الخصائص
Events | الاحداث
Assemblies | مجمعات
Reference | مجال او فضاء ولا يقصد به الفضاء الذي هو خارج الارض وانما يمكن ان يشير الى مساحة من الارض
sender | المرسل
overload | الحمل او التحميل الزائد
Shared | مشترك
Parameters | البارمترات او يمكن تسميتها بالوسيط او الوسائط
Overrides | اعادة التوجيه
Inherits | الوراثة
Protected | محمي أوحماية
Function | وظيفة
Procedure | أجراء
Exception | أستثناء
Overloading | اعادة التعريف

والان لنبدا خطوة خطوة، وأول شئ علينا إنشاء كلاسس جدبد(Class) ،ولتفعل ذلك انشئ مشروعاً جديداً تم من القائمة Project أختر Add Class .

سيكون هذا ما ستحصل عليه بحال لم تغير الاسم كما هو ظاهر بالصورة، طبعا كل ماعليك فعله هو النقر على زر Add فقط.

Public Class Class1

End Class

عندما تريد استخدام هذه الكلاسس في اي مكان من مشروعك سيكون عليك استخدام العبارة New ، تذكر ذلك أي كلاسس تريد ان تستخدمها لابد وان تفعل ذلك.

وسأعرض لك صورة استخدمناها في الدروس فوق مع المجالات أنظر الشكل التالي:

واضع في عملية التعريف او الاشتقاق العبارة New ويظهر الكلاسس FileFolder كما بالصورة.

وبالتأكيد يجب ان تستخدم هذه الطريقة مع أي كائن هو عبارة عن كلاسس تريد ان تستخدمه في برامجك، فمثلا انظر للشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New OpenFileDialog

        Value.ShowDialog()

    End Sub

End Class

بهذا المثال استخدمنا صندوق الحوار الخاص بفتح ملف ولاحظ العبارة New جيداً.

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

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Size = New Point(123, 223)

        Me.Size= 123, 223

    End Sub

End Class

السطر المظلل بالاسود غير صحيح.

حتى وانت تريد تغيير الخط لشئ ما مثل النموذج بحالتنا هذه انظر للشكل التالي.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Font = New Font("Times New Roman", 8, FontStyle.Bold)

    End Sub

End Class

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

اذا وبالعودة الى الكلاسس (Class1) الذي إنشاءناه سابقاً وبحال اردنا ان نستخدمه علينا ان نكتب التالي:

العبارة من جديد وبما ان الكلاسس لا يحتوي على شئ اظهر لنا بعض الـ Method الخاصة بهذه الكلاسس ولنرى ما تعني بالضبط.

سنستعلم عن الطريقة الاولى كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Value.Equals(Me))

    End Sub

End Class

سنستخدم الرسائل لاظهار النتائج وطبعا عند فتحك للقوس بعض العبارة Equals ستحصل على التلميح التالي:

وتعني اجراء مقارنة للكائن مع كائن اخر لترى هل هو يشير الى الى نفس الكائن أم لا، وبهذه الحالة طبعاً سنتحصل على القيمة False والتي يمكن ان تعيدها لنا هذه الطريقة.

ايضاً ما يمكنك الاستفادة منه هو الطريقة GetType والتي ستعود لك بمعلومات عن الكلاسس مثل أسمه ونوعه وما الى ذلك كما بالشكل التالي:

يمكننا من هنا الحصول على الكثير من المعلومات حول الفئة التي نتعامل معها، فمثلا FullName ستعود لنا بالاسم كاملاً بما فيه المرجع كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1

    Dim Mybutton As New Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Mybutton.GetType.FullName & vbCrLf & Value.GetType.FullName)

    End Sub

End Class

وطبعا النتيجة ستكون كما بالشكل:

فمثلا Name Space سيعود بأسم المرجع او الفضاء فتكون النتيجة للزر System.windows.forms

ولفئتنا ستكون WindowsApplication1

وبحال مثلاً استعلمت عن أسم الوحدة Module.Name فستكون النتيجة.

System.windows.forms.dll

WindowsApplication1.exe

كما يمكننا معرفة هل الفئة تتبع الوحدة العامة للمجمعات (GlobalAssemblyCache) أم لا كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1

    Dim Mybutton As New Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Mybutton.GetType.Assembly.GlobalAssemblyCache & vbCrLf & Value.GetType.Assembly.GlobalAssemblyCache)

    End Sub

End Class

النتيجة بالنسبة للزر ستكون True أما بالنسبة لفئتنا ستكون False بالتأكيد.

يمكننا الاستعلام كذلك عن الموقع كما بالشكل:

Public Class Form1

    Dim Value As New Class1

    Dim Mybutton As New Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Mybutton.GetType.Assembly.Location & vbCrLf & Value.GetType.Assembly.Location)

    End Sub

End Class

وهذه هي النتيجة لاحظ الصورة.

المسار الاول بمجلد C:\windows\assembly وكذلك المسار الثاني ومن الواضح أنني لم احفظ المشروع ويستخدمه الفجوال بداخل المجلد Temporary

كما يمكنك الاستعلام عن الكثير من الخصائص للكائن او الفئمة كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1

    Dim Mybutton As New Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Mybutton.GetType.IsClass & vbCrLf & Value.GetType.IsClass)

    End Sub

End Class

بهذا المثال نستعلم هل هو فئة ام لا والنتيجة العائدة ستكون منطقية (Boolean) وبمثالنا سنحصل على القيمة True بالحالتين.

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

وكذلك ما هو معرف الوصول Public أم Private أم Friend أم Protected

يعني بمعلومات مثل هذه يمكنك صنع برنامج مثل (NET Reflector ) والذي يحول المكتبات والملفات التنفيذية الى كود من جديد.

ويمكنك تجربة الخصائص الاخرى لمعرفة البقية فما هذه الا بداية الطريق والخطوة الاولى.

ايضاً لدينا ReferenceEquals وهي نفس الطريقة السابقة Equals مقارنة كائنين كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1

    Dim k = Value

    Dim p = Value

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Value.ReferenceEquals(k, p))

    End Sub

End Class

والقيمة الناتجة بالتأكيد ستكون True كما وبما انها تتبع الصنف او الفئة System.Opject فيمكن ان تكون هكذا أيضاً.

Public Class Form1

    Dim Value As New Class1

    Dim k = Value

    Dim p = Value

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox([Object].ReferenceEquals(k, p))

    End Sub

End Class

حسناُ لنعد الان الى الفئة التي إنشاءناها سابقاً كما بالشكل:

Public Class Class1

End Class

بالنسبة الى انشاء تراكيب او بناءات او سميها ما تشاء يوجد درس خاص بها يمكنك مراجعته لوحده تحت العنوان Enum انظر للقائمة الى يسارك.

وعلى العموم هذا تركيب هنا.

Public Class Class1

    Enum edit

        name

        Address

        Phone

        City

    End Enum

End Class

اذا استعلمت كما شرحنا سابقاً عن معرف الوصول كما بالشكل التالي:

Public Class Form1

    Dim Value As New Class1.edit

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Value.GetType.IsPublic)

    End Sub

End Class

فستحصل على القيمة False مما يعني أنه ليس Public وليس Private وأنما هو Friend وحتى بحال أنتقلت الى الـ ClassDiagram ومن نافذة الخصائص ستجده كما بالشكل:

واضح ان خاصية الوصول له من الـ Access هي Friend

اذا اردت ان تستخدمه على مستوى الفئة استخدم Private اما Public فسيمكن للمستخدمين استخدامه من خارج المشروع اما بحالته الافتراضية فسيمكن استخدامه على مستوى المشروع.

وايضاً يمكننا تعريف اي قدر من الحقول كما بالشكل التالي:

Public Class Class1

    Dim Value1 As String

    Dim Value2, Value3, Value4 As String

    Dim Value5 As Integer

    Dim Value6 As Boolean

    Dim Value7 As Char

    Dim Value8 As Double

End Class

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

ويمكنك ايضاً وراثة اي فئة كما بالشكل التالي:

Public Class Class1

    Inherits System.Windows.Forms.ListBox

End Class

وبذلك نخبر الفجوال بان فئتنا هذه سثرت الاداة ListBox وبذلك تكون قد ورثنا كل الفئات والاحداث وكل شئ يخص الاداة ListBox

اذا ذهبت الى الـ Tool Box الان فسوف تجد الاداة هناك كما بالشكل التالي:

ويمكنك ان تلاحظ أسم فئتنا وهي هنا Class1 يمكنك سحبها واسقاطها على النموذج والتعامل معها بشكل طبيعي جداً.

او يمكننا اضافتها عن طريق الكود كما بالشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New Class1

        Value.Location = New Point(20, 20)

        Dim ArrString() As String = {"Windows", "System", "CGI"}

        Value.Items.AddRange(ArrString)

        Me.Controls.Add(Value)

    End Sub

End Class

كما لو انني إنشاءت فئة جديدة وأسميتها Class2 واردتها ان ترث الفئة الاولى Class1 فسأكتب التالي:

Public Class Class2

    Inherits Class1

End Class

وبذلك تكون الفئة الثانية Class2 لها كل خصائص واحداث الفئة الاولى Class1 .

ولكن ماذا لو أنني أردت ان لا يستطيع احد ان يقوم بوراثة الكلاسس الاولى Class1 ...؟

عندها يمكننا ان نخبر الفجوال بذلك وبهذه الطريقة أنظر للتالي:

Public NotInheritable Class Class 1

End Class

والان لا يمكن وراثة هذه الفئة، جرب ذلك.

طبعاً يمكنك اضافة اي خاصية جديدة لهذه الكلاسس لتقوم بعمل ما كما بالشكل التالي:

Public Class Class1

    Inherits System.Windows.Forms.ListBox

    Public Property Property1() As Integer

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

End Class

ولزيادة فهم ذلك يمكنك مراجعة هذا بالدرس الخاص بالـ UserControl

اذا جاء الدور لنتحدث عن الواجهات او ما يسمى بالـ Interface .

الواجهات هي عبارة عن مجموعة من التعريفات التي مثل الخصائص والطرق والاحداث وغيرها.

لايهم انشئ مشروعاً جديداً تم من القائمة Project أختر AddNewItem تم أختر Interface لتحصل على الشكل التالي:

Public Interface Interface1

End Interface

ما أجمل الفئات والواجهات الخالية، حسنا الان جاء دور اضافة بعض الخصائص والطرق والاحداث أليها أنظر للشكل التالي:

Public Interface Interface1

    Event Event1 As EventHandler

    Property Property1() As Integer

    Property Property2() As Integer

    Sub Method()

End Interface

لاتنسى يمكنك دائما ولتسهيل المهمة عليك استخدام الـ ClassDiagram لاضافة مثل هذه الاشياء بدل كتابتها يدوياً ، فقط أنقر على الفئة او الواجهة واختر View Class Diagram

وتحدثث عن كيفية التعامل معه بأحد الدروس.

حسناً ماذا نفعل بهذا الشئ الذي كتبناه هنا.

لاشئ، لايوجد ما يمكن فعله الان.

الان انشئ كلاسس جديد كما تعلمت سابقاً واكتب فيه التالي:

Public Class Class1

    Implements Interface1

End Class

الان اظغط مفتاح Enter أنظر للصور التالي:

كما تشاهد بمجرد ضغط مفتاح الادخال يقوم الفجوال بكتابة كل الخصائص والطرق والاحداث الموجودة بالواجهة التي صممناها.

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

على العموم هذا ما سنحصل عليه.

Public Class Class1

    Implements Interface1

    Public Event Event1(ByVal sender As Object, ByVal e As System.EventArgs) Implements Interface1.Event1

    Public Sub Method() Implements Interface1.Method

    End Sub

    Public Property Property1() As Integer Implements Interface1.Property1

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

    Public Property Property2() As Integer Implements Interface1.Property2

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

    Public Property Property3() As Integer Implements Interface1.Property3

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

End Class

كما سيعرض لك الفجوال الكثير من الواجهات لاستخدامها غير الواجهة التي استخدمناها نحن أنظر للصورة التالية:

حسناً الان جيب ان نعمل Overrides لخاصية ما من داخل فئتنا وكما قلت سابقاُ في تعريفنا لها بالجدول هي اعادة توجيه هذه أنظر الشكل التالي:

Public Class Class1

    Inherits System.Windows.Forms.ListBox

  Public Overrides Property Cursor() As System.Windows.Forms.Cursor

        Get

            Cursor = Me.Parent.Cursor

        End Get

        Set(ByVal value As System.Windows.Forms.Cursor)

            Me.Parent.Cursor = value

        End Set

  End Property

End Class

ببساطة شديدة ان هذه الخاصية كانت تقوم بتغيير شكل مؤشر الفأرة للكنترول او فئتنا والتي ترث الكنترول ListBox وهنا تدخلنا واعدنا توجيهها لتغير شكل المؤشر للنموذج الحامل لها.

وذلك عن طريق الخاصية Parent وهي حقيقة مهمة كثيراً، واقصد Parent فتصور لو انك تريد ان تنتج اداة تقوم على تغيير لون النموذج للمستخدم الى تدرج من لونين مثلاً.

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

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

كما يمكنك ان تقوم بمعرفة كل ما على الاداة الحاملة كما بالشكل التالي:

For Each value As Control In Me.Parent.Controls

     If TypeOf value Is Button Then

     End If

Next

والان سأعطي مثالاً طالما اتحدث عن فئات او ادوات تعمل كلملفات DLL وهوكيف يمكنك اعادة مصفوفة من البيانات الى المستخدم.

تصور ان لدينا هذا الاجراء كما بالشكل التالي:

Public Class Class1

    Public Function ArrString() As List(Of String)

        Dim value As New List(Of String)

        value.Add("File")

        value.Add("copy")

        value.Add("Edit")

        value.Add("Open")

        Return value

    End Function

 End Class

طبعاً هذا كمثال من الممكن ولكي يكون واقعياً ان يجلب بيانات من قاعدة البيانات او اسماء الملفات من مجلد ما او ما شابه.

بأي وقت نريد ان نحصل على هذه البيانات من مشروعنا يمكننا كتابة الثالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim k As New Class1

        For Each sd As String In k.ArrString

            Me.ListBox1.Items.Add(sd)

        Next

    End Sub

End Class

احياناً تجد نفسك مضطراً الى استخدام تكرارين لجلب البيانات، تصور لو بالاجراء والذي بفئتنا قمنا بتكرار يقوم بملئ الفئة List(Of String)

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

ولو كان التكرار الاول سيأخذ مني خمسة ثوان فعندها ومع التكرار الثاني سيأخذ عشرة ثوان.

توجد طريقة يمكن ان نراها راقب الشكل التالي:

Imports System.Data.OleDb

Public Class Class1

    Public Function ArrString(ByVal myinteger As Integer) As String

        Dim connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb")

        Dim command As New OleDbCommand("Select * from t1", connection)

        Try

            connection.Open()

            Dim reader As OleDbDataReader = command.ExecuteReader()

            Dim k As String = reader.Item(myinteger).ToString

            Return k

            reader.Close()

        Catch ex As Exception

        Finally

            connection.Close()

        End Try

    End Function

End Class

هذا كود للاتصال بقاعدة البيانات وسيعود بقيمة حقل من سجل في كل مرة، بمعلومية رقم الفهرس والذي سيرسله المستخدم وهو هنا البارامتر Myinteger

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

والان يمكننا استدعاءه بهذا الشكل:

Imports System.Collections.ObjectModel

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim myString As New Class1

        For value As Integer = 0 To myString.getCount - 1

            Me.ListBox1.Items.Add(myString.ArrString(value))

        Next

    End Sub

End Class

الطريقة التي سننشئها هي GetCount والتي تعود بعدد السجلات ونحتاجها لنخرج من هذا التكرار بعد انهاء المهمة.

وكذلك نقوم بارسال قيمة من النوع Integer تمثل موقع الحقل.

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

على سبيل المثال فقط.

وبالعودة الى اعادة التوجيه يمكنك اختيار بالضبط ما تريد من الـ ClassDiagram حيت تنقر على الفئة بزر الفأرة الايمن وتختار IntelliSense كما بالشكل:

من القائمة الجانبية أختر override member لتطالعك النافذة التالي

أختر ما شئت لتقوم باعادة توجيهه، وانا هنا بالمثال اقوم بتحديد OnPaintBackground والذي ينطلق عند رسم خلفية الاداة وبحال اختياره يقوم الفجوال بكتابة الكود تلقائياً كما بالشكل التالي:

Public Class Class1

    Inherits System.Windows.Forms.ListBox

    ''' <param name="pevent">A <see cref="T:System.Windows.Forms.PaintEventArgs"></see> that contains information about the control to paint.</param>

    Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)

    End Sub

End Class

ايضاً توجد الطريقة او الطرق المشتركة او المشاركة كما بالشكل التالي:

Class Class2

    Dim b As String

    Public Property Property1() As Integer

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

    Public Shared Function Value() As String

        Return "Hello"

    End Function

End Class

حقيقة لا اعرف ما الغاية من هذا الف والدوران ولكن هذه الطريقة تمكنك من استخدام اي من الاجراءات هنا دون ان تقوم باشتقاق او تعريف الفئة من جديد أنظر للشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Class2.Value)

    End Sub

End Class

بحالة الفئات التي انشاءناها سابقاً كنا نكتب التالي

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim myString As New Class1

    End Sub

End Class

وذلك لانشاء كائن جديد حتى نستطيع العمل معه.

ولكن اين هي الخاصية Property1

ربما لاحظت انها لم تظهر كما بالشكل التالي:

ولتستطيع التعامل معها عليك استخدام نفس الطريقة ليكون الكود كما بالشكل التالي:

Class class2

    Shared b As String

    Public Shared Property Property1() As Integer

        Get

        End Get

        Set(ByVal value As Integer)

        End Set

    End Property

    Public Shared Function Value() As String

        Return "Hello"

    End Function

End Class

الان يمكنك التعامل مع كل ما فيها، وتصل الى اي شئ طالما قد قمت بمشاركته.

والان سنتحدث عن الاحداث وكيف نستطيع الاستفادة منها

انشئ مشروعاً جديداً واضف له أداة UserControl .

أنقر على الاداة نقرتين للانتقال الى حدث التحميل.

هنا بالذات سوف نقوم بانشاء حدث جديد، كنت افضل وجود اداة ما لا يوجد لها الحدث Click حتى ننشئ لها هذا الحدث لاستخدامه فيما بعد.

في الفجوال بيسك 6 كنت انشئ هذا الحدث بنفسي في ادوات UserControl الخاصة والتي تمثل الازرار على سبيل المثال.

لاحظ انني اريد ان اجد طريقة بسيطة استطيع ان افهمك من خلالها كيف تستفيذ من الاحداث.

حسناً في قسم التصاريح العامة أكتب التالي:

Public Class UserControl1

    Event Event1()

End Class

وهذا هو الحدث الذي قمنا بإنشاءه.

الان انتقل الى الحدث FormLoad للاداة واكتب فيها التالي:

لاحظ بمجرد كتابة RaiseEvent ظهرت لنا قائمة تحتوي على الاحداث المتوفرة، وبحالنا هذه ليس لدينا الا الحدث Event1 .

طبعاً لا داعي لان أذكرك ان اسماء الاحداث يمكنك ان تسميها كيفما تشاء.

وبذلك يكون الكود الكامل هو كالتالي:

Public Class UserControl1

    Event Event1()

    Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        RaiseEvent Event1()

    End Sub

End Class

الان انتقل الى النموذج الرئيسي واسحب الاداة من شريط الادوات وضعها على النموذج.

انقر عليها نقرتين وابحث بقائمة الاحداث عن الحدث الذي انشئناه كما بالصورة التالية:

حسناً هاهو الحدث الخاص بنا موجود هنا يمكننا استخدامه بأي وقت.

الان حدد هذا الحدث لتنتقل اليه كما بالشكل التالي وأكتب فيه:

Public Class Form1

    Private Sub UserControl11_Event1() Handles UserControl11.Event1

    MsgBox("تم قنص الحدث")

    End Sub

End Class

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

طبعا الحدث هذا سيتم تنفيذه مع بداية تحميل الاداة تماماً، لاننا قمنا بتعريفه من هناك.

ايضاً من الممكن ان تنشئ خاصية للقراءة فقط أنظر للشكل التالي:

Public Class class1

    Public ReadOnly Property Property1() As Integer

        Get

        End Get

    End Property

End Class

كل خاصية تعتوي على المعامل Get وكذلك Set بمثالنا هذا لا وجود للـ Set والمسئولة عن الكتابة كما تم اضافة العيارة ReadOnly وبذلك تصبح للقراءة فقط.

وعلى العكس من ذلك اذا اردناها للكتابة فقط يمكننا كتابة الشكل التالي:

Public Class Class1

    Public WriteOnly Property Property1() As Integer

        Set(ByVal value As Integer)

        End Set

    End Property

End Class

والان جاء الوقت لتبطيق ما يعرف بالـ OverLoading .

وهي ببساطة إنشاء العديد من الاجراءات ولكن بمتغيرات او بارامترات مختلفة.

وباحل تم ذلك فيمكنك ان تشاهد مثل هذه القصاصة كما بالشكل:

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

دعنا من هذا الان ولنجرب ان ننشئ شيئاً كهذا.

أنشئ مشروعاً جديداً تم اضف له Class جديد واكتب فيه شئياً مثل:

Public Class Class1

    Dim Name As String

    Dim Address As String

    Dim Phone As Integer

    Public Sub Flay()

    End Sub

    Public Sub Flay(ByVal TName As String, ByVal TAddress As String)

        Name = TName

        Address = TAddress

    End Sub

    Public Sub Flay(ByVal TName As String, ByVal TAddress As String, ByVal TPhone As Integer)

        Name = TName

        Address = TAddress

        Phone = TPhone

    End Sub

End Class

لاحظ الاجراءات الثلاثة انها تحمل نفس الاسم، ولكن ببارمترات مختلفة.

كما يمكنك بحال استدعيت هذه الفئة ان تلاحظ القصاصة التي تحدثنا عنها سابقاً تظهر لك كما بالشكل التالي:

هاهو الاجراء هنا بخياراته الثلاثة ، كما انك بحال استخدمت الـ Class Diagram فسوف تطالع التالي:

كما تلاحظ ان الاجراء المحدد بالاسم Flay امامه Overloads +2 في اشارة الى الاجراءات الاخرى.

ولكن هناك شئ ناقص هنا...!!!!

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

ولنفعل ذلك يمكننا كتابة شئ مثل التالي:

Public Class Class1

    Dim Name As String

    Dim Address As String

    Dim Phone As Integer

    '''<summary>New Class No Parameters needed</summary>

    Public Sub Flay()

    End Sub

    '''<summary>Name As String And Address As String </summary>

    Public Sub Flay(ByVal TName As String, ByVal TAddress As String)

        Name = TName

        Address = TAddress

    End Sub

    '''<summary>Name As String And Address As String and Phone As Integer</summary>

    Public Sub Flay(ByVal TName As String, ByVal TAddress As String, ByVal TPhone As Integer)

        Name = TName

        Address = TAddress

        Phone = TPhone

    End Sub

    ''' <param name="id">The ID of the record to update.</param>

    ''' <remarks>Updates the record <paramref name="id"/>.

    ''' <para>Use <see cref="DoesRecordExist"/> to verify that

    ''' the record exists before calling this method.</para>

    ''' </remarks>

    Public Sub UpdateRecord(ByVal id As Integer)

        ' Code goes here.

    End Sub

    ''' <param name="id">The ID of the record to check.</param>

    ''' <returns><c>True</c> if <paramref name="id"/> exists,

    ''' <c>False</c> otherwise.</returns>

    ''' <remarks><seealso cref="UpdateRecord"/></remarks>

    Public Function DoesRecordExist(ByVal id As Integer) As Boolean

        ' Code goes here.

    End Function

End Class

والان ستحصل على النتيجة التالي:

حصلنا على سطر أضافي يحوي المعلومات او التعليقات المساعدة المطلوب عرضها.

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

كما يمكنك الحصول على قائمة تحوي الكثير من الوسوم بمجرد كتابة العلامة > كما بالشكل التالي:

كما عليك وضع في الاعتبار ان بعض هذه الوسوم تتماشئ مع الاجراءات SUB وبعضها لا يتماشئ الا مع الاجراء Function مثل هذا الوسم:

<returns>

ويستخدم مع الاجراءات Function في اشارة الى القيمة العائدة او المسترجعة منه.

واذا كان هناك خطاء باستخدام احدى هذه الوسوم فسترى تحتها خط متعرج.

كما ان كل هذه الفئات او الكائنات التي قمنا بانشاءها او ورثناها لها الاجراء Finalize والذي يتم تنفيذه عند موت الكائن.

كما يمكن الاستفادة منه في تنفيذ بعض الاشياء قبل موت الكائن عن طريق عمل Overrides أي اعادة توجيه.

والاجراء له الشكل التالي:

Protected Overrides Sub Finalize()

        If Me.myboolean = True Then

            'أي شئ

        Else

            'أي شئ

        End If

        MyBase.Finalize()

End Sub

لاحظ الاضافة التي زدناها هنا لعمل اشياء قبل موت الكائن.

على العموم هذا المكان مناسب لتختبر موت الكائنات.

ملاحظة

ذكرت فيما سبق او بمكان أخر ان العبارة Me تشير الى الفئة التي انت بداخلها ، واريد ان اضيف ان العبارة MyBase تشير الى الفئة التي ترثها الفئة الحالية.

توجد طريقة اخرى في إنشاء الفئات تسمح لك بتحديد نوع البارمترات كما بالشكل التالي :

Public Class Dictionary(Of entryType, keyType As IComparable)

    Public Sub add(ByVal e As entryType, ByVal k As keyType)

        Dim dk As keyType

        If k.CompareTo(dk) = 0 Then

        End If

    End Sub

    Public Function find(ByVal k As keyType) As entryType

    End Function

End Class

عندما تقوم باشتقاق فئة جديدة ستكون مضطراً الى تحديد نوع البارمترات كما بالشكل التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Value As New Dictionary(Of Integer, String)

        Value.add(123, "Hello")

        Value.find("Well Come")

    End Sub

End Class

ولاحظ التغيير هنا كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim Value As New Dictionary(Of Double, Byte)

        Dim Mbyte As Byte

        Value.add(123.6, Mbyte)

        Value.find(Mbyte)

    End Sub

End Class

بطريقة بسيطة أنظر للشكل التالي :

Public Class Class1(Of Entry)

    Public Function Find(ByVal Value As Entry) As Entry

    End Function

End Class

لاحظ ان العبارة Entry من الممكن ان تكون أي عبارة تحدهها انت.

والان لاحظ طريقة اشتقاق فئة جديدة من فئتنا هذه كما بالشكل :

الان اذا نقرت على الفئة التي انشاءناها كما ترى بالصور ستحصل على الشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New Class1(Of

    End Sub

End Class

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

الان يمكنك ان تجعله من نوع String أو Integer او اي شئ تريده ونفرض اننا قمنا بهذا العمل كما بالشكل :

كما تشاهد جعلناه من النوع String ولو حاولت ان ترسل اي نوع أخر فستحصل على خطاء.

كما يمكنك استخدام نفس الفئة وبنفس الوقت وبطرق مختلفة أنظر للشكل التالي :

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value1 As New Class1(Of String)

        Dim Value2 As New Class1(Of Integer)

        Dim Value3 As New Class1(Of Icon)

        Value1.Find("AAAAAA")

        Value2.Find(1234567)

        Value3.Find(Me.Icon)

    End Sub

End Class


العمليات الحسابية

الرمز | الوظيفة
+ | الجمع
- | الطرح
* | الضرب
^ | رفع الرقم الاس 3 ^ 3
/ | القسمة ويمكن ان تعيد رقماً عشرياً من ناتج القسمة
\ | القسمة وتعود بعدد صحيح فقط
= | يساوي
=^ | تقوم بعملية الرفع وتسند القيمة الى متغير جديد
=/ | تقسم فيمة متغير وتخصص النتيجة لمتغير جديد
=- | انقاص قيمة من المتغير واسنادها الى متغير جديد
& | لربط المتغيرات النصية ببعضها
=& | تضيف القيمة للمتغير مع اسناد القيمة الجديدة له او لمتغير جديد
<> | لا يساوي
< | اكبر من
> | اصغر من
=> | اصغر من او يساوي
=< | اكبر من او يساوي
Like | مقارنة نص بنمط
Is | مقارنة كائنين اذا كانا يشيران الى نفس الفئة او الصنف
Is Not | مقارنة كائنين اذا كانا يشيران الى نفس الفئة او الصنف
Not | النفي المنطقي لتعبير منطقي
And | الربط المنطقي لتعبيرين منطقيين او عددين او نصين
Or | الفرز المنطقي لتعبيرين منطقيين او عددين او نصين
Xor | عملية اسثتناء منطقية لتعبيرين منطقيين او عددين
=+ | تضيف قيمة مماثلة وتسند القيمة الجديدة لمتغير جديد
=* | تضاعف القيمة وتسند القيمة الجديدة لمتغير جد يد
( ) | القيم التي بين الاقواس سيتم تنفيذها أولاً
Mod | القسمة و تعود بعدد صحيح فقط

عملية على جمع عددين:

Value=3 + 3

القيمة بداخل Value قد صارت 6 اذا أردنا ان نزيدها رقم 5 نقوم بالتالي:

Value=Value + 5

لااحبذ هذه الطريقة والافضل ان تختصرها الى التالي:

Value + =5

صارت أكثر منطقية في الشكل، وربما اذا كنت من مبرمجي الجافا لكان لك الشكل مألوفاً، حقيقة ان الفجوال نت قد أخذت الكثير من ميزايا لغات البرمجة الاخرى، من C ومن الدلفي ومن الجافا وان لم يكن من ناحية الكود فمن ناحية الشكل والطريقة المتبعة.

كما يمكنك جمع قيمة متغير مع القيمة الحالية كما بالشكل:

ValueX=8

Value + =ValueX

عملية الطرح

Value=10 - 2

القيمة بداخل Value قد صارت 8 اذا أردنا ان نطرح منها رقم 3 نقوم بالتالي:

Value=Value - 3

أو

Value + =3

كما يمكنك التالي:

ValueX=4

Value - =ValueX

عملية الضرب

Value=3 * 3

القيمة بداخل Value قد صارت 9 اذا أردنا ان نضربها برقم 2 نقوم بالتالي:

Value=Value * 2

او

Value * =2

عملية القسمة

Value=8 \ 2

القيمة بداخل Value قد صارت 4 اذا أردنا ان نقسمها على رقم 2 نقوم بالتالي:

Value=Value \ 2

او

Value \ =2

ويمكنك أتباع نفس الاسلوب مع باقي الاوامر.


مدير المشروع Project Designer

من النافذة Solution explorer اذا نقرت نقراً مزدوجاً على My project فسوف يتم نقلك الى مدير المشروع حيث يمكنك التغيير في بعض الخصائص وسلوك البرنامج أنظر الشكل:

قم بتغيير Assembly name و Root namespace الى أسماء تفهما وتريدها، ببساطة شديدة المعلومات التي تظهر هنا ستكون بمثابة معلومات ترافق مشروعك، اذهب الى المجلد Bin الموجود في مجلد المشورع وأنقر على الملف التنفبذي بزر الفأرة الايمن وأختر خصائص تم بعدها أختر Version لاحظ المعلومات التي تظهر هنا انها نفس المعلومات المعطاة لك بهذه النافذة، كالاصدارة وحقوق النشر وغيرها أنظر الشكل التالي:

حسناً يمكنك من هنا تغيير الايقونة للملف التنفيذي من الخيار Icon كما يمكنك أختيار النموذج الذي ترغب في ان يكون اول نموذج يتم تشغيله من Statup Form ، ايضاً يمكنك تحديد نوعية المشروع من Applicatino type هل هو تطبيق يعمل تحت Windows ام تطبيق يعمل تحت Dos ام هو احدى خدمات windows أم ما يسمى UserControl

حقيقة قد لا تجد مبرر لتغيير نوعية المشروع خاصة وأنك بداته وانت تعلم ما هو وما تريده ان يكون، ولكن تفيذك هذه الطريقة بحال كنت تعد مشروعاً لاداة خاصة مثلاً User Control وكنت تجربها على Form بالمشروع واردت ان تحولها الى ملف Dll هنا يمكنك تغيير نوعية المشروع الى Class Library ، مع ملاحظة انه وبالفجوال بيسك 6 كان الملف المنتج يتحول الى ملف من نوع Ocx

وكنت تحتاج الى تسجيله بداخل نظام التشغيل حتى يتم التعرف عليه، اما الان فلست مظطرا الى تسجيله، قم بوضعه مع الملف التنفيذي وكفى.

هنا بعض البيانات الاخرى موجودة بالزر Assembly Information كما بالصورة التالية:

عليك مراجعة الكثير في التعليمات للحصول على بعض الاجوبة بشكل دقيق اذا أردت.

تحت Enable Xp Visual Style من هنا يمكنك تمكين او عدم تمكين Visual Style من نظام التشغيل ولمعرفة ذلك جرب الغاء هذا الخيار وعد الى النموذج الرئيسي وضع بعض من الادوات وراقب النتيجة لتعلم، بقى خيار أحب ان الفت أنتباهك اليه وهو Shutdown mode .

متى يتم انهاء البرنامج، هل عندما النموذج الذي قمنا بجعله Starup تم اغلاقه، ام عندما يتم اغلاق اخر نموذج لك الخيار في هذا.

Splash screen هي النافذة التي تظهر للحظات مع بداية تشغيل البرنامج وعادة تحمل شعار البرنامج وما الى ذلك، اذا قمت باضافة واحدة الى المشروع فيمكنك تحديدها من هنا.

مع العلم انك ولاضافتها تحتاج الى ان تختار Project من قائمة البرنامج تم تختار Add new Item وسوف تنطرق الى هذا لاحقاً.

حسناً الى جهة اليمين يمكنك ان تطالع الخيارات بنافذة مدير البرامج أنقر على الزر Reference لتطالعك النافذة التالية:

من هنا يمكنك ان تقوم باستيراد اي فضاء او مجال او سمه ماتشاء للمشروع، كما يمكنك ان تلغي منها ما تشاء بشرط ان لا يكون المشروع في حاجة اليها.

ولتتفادى هذه الحيرة يمكنك ان تنقر على الزر unused Reference فتحصل على الشكل التالي :

تظهر هنا الفضاءات الغير مستخدمة أنقر على الزر Remove لازالتها.

كما انك اذا كنت تستخدم ملفات واردت اضافتها الى المجال فأخر المجلد الذي هم فيه من خلال الزر Reference Path

ولاحظ انك عند استيراد مجال الاسماء System على سبيل المثال واردت ان تزيد من تظييق او تحديد المجالات وكنت بحاجة الى المجال System.text فعليك ان تحدده من القائمة السفلية .

ومن الخيارات بنافذة مدير المشروع ايضاً الزر Resource أنقر عليه لتطالعك النافذة التالية:

من هنا يمكنك اضافة اي ملفات تريدها الى المشروع صور اصوات ايقونات نصوص الى غير ذلك، اذا نقرت على القائمة String فوق ستطالعك القائمة التالية:

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

وكما بالصورة التي قبل هذه يوجد لدينا حقل نص، حيث Name هو الاسم الفريد اما Value فضع النص الذي تريده اما Comment فاضف اي تعليق تريد.

ان لملفات Resource استخدامات كثيرة ومهمة جداً ولابد وان تواجهك يوماً.

أنقر على القائمة الثانية Add resource لتطالعك القائمة الفرعية التالية:

من هنا يمكنك اضافة ما تريد، ولكن كيف يمكن الاتصال بهذا المخزن الذي اعددناه.

يمكنك ذلك من خلال الامر التالي:

My.Resources.String1

عند كتابتك my متبوعاً بنقطة أختر من القائمة Resources أتبعها بنقطة لتطالعك كل محتويات ملف الـ Resources


الخصائص Properties

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

هذه هي نافذة الخصائص Properties الواقعة بالاسفل ويمكن مشاهدة نافذة Solution explorer والتي يتم عرض كل النماذج والكلاسس وغيرها فيها وسوف نتطرق لها لاحقاً.

قبل كل شئ ومن الوهلة الاولى يمكننا ان نشاهد الاضافات على هذه النافذة أنظر الشكل التالي:

اول زر وهو يقوم على اغلاق النافذة

ويوجد الزر الذي يحمل علامة الدبوس: وهو يقوم باخفاء او طي النافذة لحين الحاجة اليها .

أما الزر الذي يحمل علامة السهم الصغير المتجه للاسفل فهو يقوم بعرض قائمة كما بالشكل التالي:

Floating | يقوم يتحرير النافذة من مكانها
Dockable | يقوم بمحاذة النافذة الى المكان المحدد او الذي تحدده
Tabbed Document | يقوم بنقل النافذة للعرض مع مصمم النماذج او نافذة الكود
Auto Hide | اخفاء تلقائي
Hide | اخفاء

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

لاحظ هنا أسم الاداة متبوعاً باسم المجال الذي تتبعه او الذي تم أستيرادها منها وسوف تنطرق الى هذا لاحقاً.

كما تحت القائمة المنسدلة شريط قوائم قصير يحوي بعض الازرار كما بالشكل التالي:

من اليمين الى اليسار.

Property Page | سوف نتطرق الى هذا لاحقاً
Events | يقوم بعرض كل الاحداث التي يمكنك التنقل بينها وانشاءها من هنا.
Properties | عرض خصائص الاداة
Alphabetic | ترتيب الخصائص او الاحداث ترتيباً ابجدياً
Categorizes | ترتيب الخصائص او الاحداث حسب التصنيف الذي وضعت به.

حقيقة وفيما يخص الاحداث

ولكن ما هي الاحداث....؟

الاحداث هي نوعية البرمجة التي يقوم عليها نظام التشغيل Windows ككل، وهي تعتمد على اقتناصها او اصطيادها أي هذه الاحداث للقيام بعمل معين.

مثلاً لكل أداة حدث النقر عندما تنقر عليها بزر الفأرة، ولها الحدث مرور الفأرة وهناك غيرها الكثير، عند حصول ذلك يتم اقتناص هذا الحدث والقيام بتفيذ البرمجة التي يحتوي عليها.

مثلاً.

ضع زراً على النموذج وانقر عليه نقرتين عندها سيتم تحويلك الى الحدث Button_Click أنه الحدث الافتراضي.

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub

End Class

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

وهي القائمة الموجودة الى يمين نافذة محرر الكود، بالجانب العلوي أنظر الشكل:

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

في تلك القائمة ستجد كل الادوات التي قمت باسقاطها على النموذج.

أما اهم الاحداث المستخدمة فهي كما بالجدول.

الحدث | وظيفته
Click | عند النقر
DoubleClick | عند النقر المزدوج
Enter | يشبه الحدث Load
GotFocus | عند انتقال التركيز الى الاداة
KeyDown | ضغط احد المفاتيح
KeyPress | ضغط احد المفاتيح
KeyUp | لحظة رفع اصبعك عن المفتاح
Leave | لحظة المغادرة
LostFocus | لحظة انتقال التركيز الى اداة اخرى
MouseClick | النقر بالفأرة
MouseDoubleClick | النقر بالفأرة المزدوج
MouseDown | لحظة النقر بالفأرة ولاحظ ان تشابه الاحداث يختلف فمثلاً هذا الحدث يتم تنفيذه قبل ان تفلت الزر
MouseEnter | لحظة الدخول بالفأرة
MouseHover | شبه مرور الفأرة
MouseLeave | لحظة ترك الفأرة
MouseMove | مرور الفأرة
MouseUp | انتقال الفأرة فوق الاداة
MouseWheel | عند تحريك عجلة الفأرة
Resize | لحظة تغيير الحجم
TextChanged | لحظة تغيير الخاصية Text

حقيقة التعريفات هنا غير دقيقة ولكي تعرف الفرق بالضبط عليك مراقبة ذلك بنفسك، فالاختلافات احياناً دقيقة جداً ولافرق بينها ملموس.

ويمكنك معرفة الحدث من التسمية، فباقي الاحداث يمكنها ان تدل على نفسها واردت هنا ان اعطيك فكرة فقط.

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

مثلا مجرد مثال فقط.

حسناً سيكون من العبث ان تقوم بتغيير لون الزر في الحدث مرور الفأرة MouseMove .

لماذا...؟

لانك ستحصل على ارتعاش بسيط للزر او الصورة عند مرور الفأرة لان الحدث سيتم تنفيده طوال وقت مرور الفأرة ومع اعادة رسم الزر ستحصل على ارتعاش، ولكن ما هو الحدث الصحيح ....؟

هو هذا الحدث MouseEnter أي لدى دخول الفأرة فيتم تنفيذه لمرة واحدة فقط.

يجب ان تكون دقيقاً في أختيار الاحداث المناسبة لك في برمجتك.

لنفترض انك نقرت على زر الاحداث من نافذة الخصائص فسوف تطالعك النافذة التالية:

كما ترى هذه النافذة تعرض كل الاحداث للنموذج Form1 وقمت هنا بتحديد الحدث Click .

اذا اردت القيام بانشاء الحدث Click فكل ما عليك هو النقر المزدوج عليه لتنتقل الى نافذة محرر الكود كما بالشكل التالي:

اذا كنت من مبرمجي دلفي فهذا المشهد وهذه الطريقة مألوفة لديك بالتأكيد.

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

هل تشاهد Form1_Click في الحدث Click هذا يعني ان الحدث Click للنموذج قد تم أنشاءه، واذا غيرت خصائص النافذة الى اداة أخرى ولنفرض احد الازرار فسوف يختفي هذا الحدث ولكن اذا قمت باستعراض محتويات الحدث Click فستجد انه موجود، وهذا يعني ان هناك حدثا هنا لا ينتمي الى الحدث الزر Buuton1 أنظر الشكل التالي:

هل تعلم تستطيع ان تختار من هنا Form1_click وهو يعني انك سوف تتشارك مع النموذج في الحدث Click ، او قم بالنقر مرتين لإنشاء حدث خاص بالزر.

ماذا لو ان لديك أكثر من 20 Textbox واردتها ان تتشارك في الحدث Click أو OnChang بالتأكيد تحتاج الى هذه النافذة لتفعل ذلك.

تصور لو ان لدينا مجموعة من الازرار كما بالشكل التالي ونريد ان نجعل لها حدث Click يجمعها معاً:

يمكنك ان تلاحظ انني حددتها جميعاً بواسطة الفأرة، والان اذا نقرت عليها نقرتين فستحصل على الكود التالي :

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

    End Sub

    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click

    End Sub

    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click

    End Sub

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click

    End Sub

    Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click

    End Sub

    Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click

    End Sub

    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click

    End Sub

End Class

كما تلاحظ تم إنشاء كل حدث مفصولاً عن الاخر او بالاحرى لكل زر حدث خاص به.

ولكن دعنا نحاول بشكل أخر عد الى النموذج وحدد الازرار من جديد كما بالشكل التالي :

والان أنتقل الى نافذة الخصائص وابحث عن الحدث Click كما بالشكل التالي :

والان انقر بالمكان المخصص أمامه وستحصل على الكود التالي :

Public Class Form1

    Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click,    Button8.Click, Button7.Click, Button6.Click, Button5.Click, Button4.Click, Button3.Click, Button2.Click, Button11.Click, Button10.Click, Button1.Click

    End Sub

End Class

كما ترى الان تم جمع كل الازرار بحدث واحد.

كما انك اذا ما مسحت مثلاً عبارة Click من امام احد الازار ونقرت على المسافة فسوف تحصل على الشكل التالي :

وهذه النافذة تقوم بعرض العديد من الاحداث التي يمكنك ان تختار منها ما يتماشى مع متطلبات عملك .

فمثلاً يمكن ان يكون كما بهذا الشكل :

Public Class Form1

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _

    Button2.Click, Button1.Leave

    End Sub

End Class

حدثين مختلفين لزرين مختلفين أحدهما عند النقر والاخر عند مغادرته.

فبالفجوال نت يمكنك ان تتشارك في حدث واحد مع أنواع مختلفة، مثا ان تتشارك في الحدث Click للنموذج مع احد الأزرار.

فلو انك كتبت بأخر سطر قنص الاحداث العلامة التالي كما بالشكل فيمكنك ان تطالع التالي :

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

وبهذا يمكننا ان نجمع مع الحدث السابق حدث جديد يخص النموذج وهو لحظة النقر عليها أنظر للكود التالي :

Public Class Form1

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _

    Button2.Click, Button1.Leave, Me.Click

    End Sub

End Class

ويمكننا ان نلاحظ ان الحدث يحمل أسم Button2_Click وهو اسم احد الازرار ويمكننا ان نقوم بتغييره كما بالشكل بأي أسم نريده :

Public Class Form1

    Private Sub PowerEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _

    Button2.Click, Button1.Leave, Me.Click

    End Sub

End Class

ان العبارة Handles والتي تراها هي التي تقوم بتحديد او قنص الاحداث المحددة بعدها لكل زر او أي اداة.

ولاحظ لو ان لديك الاجراء كما بالشكل التالي :

Public Class Form1

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

    Handles Button2.Click, Button1.Click

        'أي كود يمكن وضعه هنا للشرح فقط

        Me.Text = "Form1"

        Me.Location = New Point

        Me.Font = Me.Font

    End Sub

End Class

الان قم بحذف الزرين من مشروعك وعد هنا لترى ما الذي حدث أنظر للشكل التالي :

Public Class Form1

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        'أي كود يمكن وضعه هنا للشرح فقط

        Me.Text = "Form1"

        Me.Location = New Point

        Me.Font = Me.Font

    End Sub

End Class

اذا أمكنك ان تلاحظ لقد تم حذف العبارة Handles وكل ما بعدها.

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

الا بحال واحدة وهي استدعاءه برمجياً كاي دالة او اجراء عادي.

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

كما يمكن برمجة الاحداث يدوياً لحظة التشغيل أنظر للشكل التالي :

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New Button

        Value.Text = "Button1"

        Value.Name = "Button1"

        AddHandler Value.Click, AddressOf myButton_mov

        Me.Controls.Add(Value)

    End Sub

    Private Sub myButton_mov(ByVal sender As System.Object, ByVal e As System.EventArgs)

        MsgBox(sender.ToString)

    End Sub

End Class

عرفنا متغير Value على انه زر تم اعطيناه اسماً ونصاً زبعدها استخدمنا AddHandler والتي تقوزم باضافة احداث وتقوم بقنصها.

وهي تطلب كما ترى الفئة او الاداة والحدث المطلوب وهو هنا Click تم وعن طريق AddressOf يتم تحديد الاجراء المطلوب تنفيذه.

والاجراء هنا هو MyButton_mov وطبعاً هو اجراء انشاءناه يدوياً كذلك.

أما بحال أردت ان تقوم بازالة احد الاحداث فيمكنك ذلك كما بالشكل التالي :

  RemoveHandler Value.Click, AddressOf myButton_mov

وهو يقوم على الغاء الحدث السابق ، وكما ترى طبعاً الحدث والعنوان لازالة عملية الربط السابقة.

اذا اردت الكود كاملا اضف زراً الى النموذج وضع فيه هذا الكود :

Public Class Form1

    Dim Value As New Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Value.Text = "Button1"

        Value.Name = "Button1"

        AddHandler Value.Click, AddressOf myButton_mov

        Me.Controls.Add(Value)

    End Sub

    Private Sub myButton_mov(ByVal sender As System.Object, ByVal e As System.EventArgs)

        MsgBox(sender.ToString)

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        RemoveHandler Value.Click, AddressOf myButton_mov

    End Sub

End Class

طبعاً نقلت تعريف الزر الى قسم التصاريح العامة ليصبح مرئياً على مستوى هذه الفئة او الكلاسس.

وبالعودة الى الخصائص.

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

أنظر للشكل التالي :

العنوان فوق يعني محاذاة النص.

والتلميح يقول محاذاة النص الذي سيتم عرضه على الكنترول.

طبعاً مفيذة جداً.

كما أنك اذا نقرت على نافذة الخصائص بالزر الايمن للفأرة فستحصل على القائمة التالي :

ان الخيار Commands سيسمح لنافذة الخصائص من عرض كل الخيارات التي يمكن تنفيذها على لاداة .

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

ظهرت خيارات جديدة كما ترى حيث ظهر Edit Items

اما الخيار Description فهو للسماح باضهار نافذة التلميحات التي تراها بالاسفل

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

System.Windows.Forms

Form

أسم الخاصية | وظيفتها
Name | الاسم البرمجي للاداة الذي يمكن استدعاءها به وتمييزها به عن غيرها من الادوات
Acceptbutton | سيتم استخدام الزر الذي تختاره هنا ليتم تنفيذه بحال قمت بالضغط على الزر أنتر Enter في لوحة المفاتيح
AllowDrop | هل يتم السماح او عدم السماح بعمليات السحب والافلات
AutoScroll | اذا كان حجم الاداة على النموذج أكبر من حجم النموذج يتم اضافة اداة انزلاق الى النموذج حتى تتمكن من استعراض ما عليه.
Autosize | هل يتم استخدام الحجم التلفائي او الالي ام لا.
BackColor | لون الخلفية للاداة.
Backgroundimage | يمكنك من هنا اختيار صورة ليتم وضعها في خلفية الاداة.
BackgroundImageLayout | اختيار طريقة التخطيط للصورة، هل يكون بوضعها العادي ام يتم تمددها لتسع كامل المساحة ام يتم تكرارها اذا كانت غيرة ألخ...
CancelButton | اختيار الزر الذي سيتم استخدامه بحال الضغط على المفتاح Esc او زر الهروب
ConTextMenuStrip | اختيار القائمة التي سيتم عرضها بحال تم النقر بزر الفأرة الايمن على الاداةز
ControlBox | هل يتم عرض او لا يتم عرض شريط ادواة التحكم الخاص بالنموذج.
Cursor | اختيار مؤشر الفأرة الذي ترغب في ظهوره على الاداة
Enabled | هل يتم تمكين ام عدم تمكين الاداة
Font | اختيار نوعية الخط وحجمه ولونه وما الى ذلك
FontColor | لون الخط
FormBorderStyle | اختيار نوعية الاطار للنموذج او الاداة
HelpButton | هل تريد استخدام زر المساعدة ام لا ، ويجب ان يكون MaximizeBox و MinimizeBox للااة False
Icon | أختيار أيقونة ليتم وضعها للنموذج
IsMdiContainer | هل تريد ان يكون هذا النموذج من النوع الحامل
Locked | هل تريد قفل الاداة او النموذج أي لايمكن عمل اي شئ بهم او عليهم
MaximizeBox | هل تريد عرض زر النموذج الخاص بتكبير النموذج
MinimizeBox | هل تريد عرض الزر النموذج الخاص بتصغير النموذج
Opacity | اختيار درجة شفافية النموذج من 1 الى 100
RightToLeft | من اليمين الى اليسار
RightToLeftLayout | تقنية المرأة اي قلب كل شئ لجهة اليمين او العكس
ShowIcon | هل اقوم بعرض الايقونة ام لا
ShowInTaskpar | هل تريد ان ترى النموذج في شريط المهام الخاص بنظام التشغيل والملتصق بزر أبدا ام لا
SizeGripStyle | هل تريد عرض اداة تغيير الحجم التي تظهر في اسفل النموذج
StartPosition | ماهي الطريقة التي تريد ان يتم عرض النموذج بها، هل يتم ذلك يدوياً ام في منتصف الشاشة الخ..
Text | النص الذي سيظهر على الاداة او العنوان
Topmost | هل تريد ان يظهر النموذج فوق كل النماذج الاخرى
Transparenckey | أختيار اللون الذي تريد ان يكون شفافاً ، اذا كان لون النموذج أبيض وأخترت الابيض فسيكون شفافاً.
UseWaitCousor | هل تريد ان يتحول مؤشر الفأرة الى وضع الانتظار على الاداة
WindowState | كيف تريد عرض النموذج هل عادي، أم بكامل حجمه، أم في وضع التصغير

Button

أسم الخاصية وظيفتها
Anchor | من هنا يمكنك ان تتحكم في حجم الاداة عند تغيير حجم النموذج او الاداة الحاملة
Dock | من هنا يمكنك ان تتحكم في مكان ووضع الزر هل الى اليمين ام اليسار الخ.
FlatStyle | أستخدام Flat بدلاً من VisualStyle في عرض مظهر الزر
Image | الصورة التي تريدها للزر
ImageAlign | اين تريد محاذاة الصورة
ImageIndex | يمكنك من هنا أختيار الصورة التي تريد بحال واحدة وهي أنك استخدمت ListImage أيضاً فيتم عرض الصور التي تحويها
ImageList | تحديد Imagelist المطلوبة والتي تم وضعها على النموذج
ImageKey | تقوم بنفس عمل Imageindex
Modifiers | ماذا اذا أردت من الزر هذا ان تتم رؤيته في نموذج أخر من هنا يمكنك تحديد ذلك هل هو محلي أم عام ألخ
TabIndex | ترتيب الادوات وفهرستها تفيدك هذه بحال أستخدامك للزر Tab والتنقل بين الادوات او نقل التركيز بين الادوات
TabStop | هل نوقف عمل السابقة
TextAlign | محاذاة النص
TextImageRelation | اين يوضع النص فوق الصورة ام تحتها ام الى يمينها الخ
Visible | هل الزر قابل للرؤية ام لا

CheckBox

أسم الخاصية وظيفتها
Appearance | المظهر
Autocheck | هل يتم تفعيل الخاصية Check ألياً أم لا
CheckAlign | اين تريد أظهار صندوق العلامة
Checked | تفعيل ام عدم تفعيل
CheckState | وضع الاداة الحالي

CheckedListBox

أسم الخاصية وظيفتها
HorizontalScroll | هل يتم تمكين شريط الانزلاق الافقي ام لا
ScrollAllowVisable | هل يتم عرض شريط الانزلاف الافقي دائماً ام وقت الحاجة فقط
Sorted | هل يتم الترتيب
Items | أضافة كل الاسماء لقائمة CheckList المراد أضهارها

ComboBox

أسم الخاصية وظيفتها
Dock | تحدد اي طريقة ترغبها في محاذاة الاداة للاداة الحاضنة
DropDownStyle | تحدد طريقة عرض الاداة، قائمة، ام قابلة للتحرير الخ
Items | يمكنك منها اضافة العناصر الى الاداة يدوياً
Sorted | ترتيب العناصر بالاداة تصاعدي ام تنازلي وابجدياً
ItemsHeight | طول القائمة المنسدلة

ListBox

أسم الخاصية وظيفتها
ColumnWidth | عرض التحديد للعنصر بحال اختر العرض في اعمدة متعددة
MultiColumn | العرض في اعمدة متعددة
SelectionMode | كم من العناصر تريد ان تحدد
ScrollAlwaysVisible | يتم عرض اداة الانزلاق دائماً

ListView

أسم الخاصية وظيفتها
CheckBoxes | تحديد كل عنصر باداة CheckBox
Columns | لاضافة اعمدة الى الاداة يدوياً
FullRowSelect | تحديد الخانات الفرعية ايضاً
GrideLines | اظهار الشبكة
Groups | اضافة مجموعات يدوياً
HeaderStyle | شكل شريط العنوان
HideSelection | اخفاء التحديد
HotTracking | تحديد العنصر بخط تحته عند مرور الفأرة
HoverSelection | التحديد بمجرد مرور الفأرة
LabelWrap | اذا كان عنوان العنصر كبيرا فهل يتم ادراجه في سطر جديد ام لا
ShowGroup | عرض المجموعات
ShowItemTollTip | عرض تلميح بالعنوان اذا كان كبيراً ولايظهر كاملاً
SmallImageList | الاداة ImageList المستخدمة لعرض الايقونات الصغيرة
LargeImageList | الاداة ImageList المستخدمة لعرض الايقونات الكبيرة
View | طريقة عرض العناصر

NotifyIcon

أسم الخاصية وظيفتها
BallonTipIcon | الايقونة الرمزية المراد استخدامها
BallonTipText |
BallonTipTitle | العنوان
Text | النص الذي سيظهر عند مرور الفأرة على الايقونة

NumericUpDown

أسم الخاصية | وظيفتها
DecimalSpace | عدد الخانات العشرية
HexaDecimal | أظهار الخانات العشرية
Increment | قوة الرفع بالأرقام
Maximum | القيمة القصوى
Minimum | القيمة الأدنى

ProgressBar

أسم الخاصية | وظيفتها
Step | التحكم بحركة وخطوات الزيادة في الأداة
Style | المظهر المستخدم
Value | قيمة الأداة الحالية


Solution explorer

التعامل مع مسجل النظام Registry

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

بمعى أخر هو قاعدة بيانات النظام.

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

اذا بهذا المكان يتم تسجيل هذه البيانات.

وليس نظام التشغيل فقط من يستخدم الريحستري وانما كل البرامج الاخى تستخدمه أيضاً، حتى الفيروسات وبرامج التجسس تحتاج أليه.

بل انه الهدف الاول لكل فيروس او ملف تجسس.

كما ان النظام له محرر خاص به ويمكن تشغيله كما التالي :

من قائمة أبداء أختر تشغيل كما بالصورة :

اذا كنت تستخدم اللغة الانجليزية فستجده بالاسم Run

سيظهر لك صندوق صغير اكتب فيه التالي :

وبعدها أنقر على موافق او Ok ليظهر لك محرر التسجيل كما بالشكل التالي :

هذا هو اذاً.

أنه متاهة حقيقة.

متاهة كما تحب مايكروسوفت ان تسميه أحياناً.

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

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

يتألف السجل من ستة مفاتيح جذرية كما بالشكل التالي:

HKEY_CLASSES ROOT | يتضمن كل المعلومات الخاصة بأنواع الملفات والبيانات
HKEY_CURRENT_USER | يتضمن كل تخصيصات المستخدم الذي دخل على جهاز الكمبيوتر
HKEY_LOCAL_MACHINE | يتضمن كل المعلومات الخاصة بمكونات الحاسب والبرمجيات
HKEY_USER | يتضمن على تخصيصات كل مستخدم على هذا الحاسب
HKEY_CURRENT_CONFIG | يتضمن كل ما يتعلق بالمكونات المادية للحاسب مثل كرت الشاشة والصوت وغيرها

أنظر للشكل التالي :

اما انواع القيم بالسجلات فهي عدة أنواع أنظر للشكل التالي :

STRING | قيمة حرفية
BINARY | ست عشرية من 0 - 9 وكذلك من A - F
DWORD | قيمة ثنائية يتم اظهارها كقيم عشرية

للتعامل مع الريجستور برمجياً ومن داخل الفجوال ستوديو سنجد اننا نحتاج الى التعامل مع فئتان هما :

RegistryKey وكذلك Registry

أنشئ مشروعاً جديداً وضع عليه الاداة Button وكذلك الاداة ListBox تم بعدها قم باستيراد المجال التالي :

Imports Microsoft.Win32

Public Class Form1

End Class

بعدها سنقوم الفئة Registrykey يمكننا تحديد ما هو المفتاح الذي سنتعامل معه كما تلاحظ بالصورة :

طبعاً صارت لك خلفية عن هذه المفاتيح كما شرحنا سابقاً.

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

ويمكننا ان نستعرض هذه المفاتيح بالطريقة التالية :

Imports Microsoft.Win32

Public Class Form1

    Dim Value As RegistryKey = Registry.LocalMachine

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim name As String

        For Each name In Value.GetSubKeyNames

            Me.ListBox1.Items.Add(name)

        Next

    End Sub

End Class

بما ان اسماء هذه المفاتيح حرفية فقد عرفنا المتغير Name على انه من النوع String

ولاحظ ان المتغير Value صار يساوي المفتاح LocalMachine ولاحظ اننا في التكرار نستعلم عن GetSubKeyNames وهي المفاتيح الفرعية.

عند التنفيذ سنحصل على النتيجة التالية :

وهي المفاتيح الفرعية كما يتبين لنا من هذه الصورة المباشرة من محرر التسجيل أنظر للشكل التالي :

طبعاً اذا اردت الحصول على أي مفاتيح فأنت صرت تعرف الطريقة.

كيف تحدد المفتاح الرئيسي وكذلك المفتاح الفرعي، وكيف تجعل تكراراً يجلب لك البيانات.

طبعا استخدمنا سابقاً GetSubKeyNames ويوجد مع هذه الطريقة العديد من الطرق الاخرى والتي تؤدي وظائف مختلفة أنظر للشكل التالي :

يمكنك حذف مفتاح فرعي كما بالشكل التالي :

 Registry.CurrentUser.DeleteSubKey("RegistryOpenSubKeyExample", False)

المطلوب هو أسم المفتاح كما تشاهد اما القيمة الثانية والتي هي اما False أو True فهي هل يتم ارسال خطاء بحال ان المفتاح لم يكن موجودا ام يتم تجاهل الامر.

وكذلك إنشاء مفتاح جديد انظر للشكل التالي :

   Dim rk As RegistryKey = Registry.CurrentUser.CreateSubKey("RegistryOpenSubKeyExample")

   rk.Close()

وللحصول على قيمة ما من مفتاح فرعي أنظر للشكل التالي :

Imports Microsoft.Win32

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim rkCurrentUser As RegistryKey = Registry.CurrentUser

        Dim rkTest As RegistryKey = rkCurrentUser.OpenSubKey("Console")

        Me.ListBox1.Items.Add(rkTest.GetValue("ScreenBufferSize"))

        rkTest.Close()

        rkCurrentUser.Close()

    End Sub

End Class

لفهم المثال التالي أنظر للصورة التالية أولاً :

اولا حددنا المفتاح HKEY_CURRENT_USER تم فتح المفتاح الفرعي Console تم استخدام الطريقة GetValue وأسم الحقل

وبالمثال التالي يتم كتابة قيمة الى حقل ما أنظر للشكل التالي :

Imports Microsoft.Win32

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim rkCurrentUser As RegistryKey = Registry.CurrentUser

        ' Obtain the test key in read/write mode.

        Dim rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample", True)

        rkTest.SetValue("TestName", "TestValue")

        Console.WriteLine("Test value for TestName: {0}", rkTest.GetValue("TestName"))

        rkTest.Close()

    End Sub

End Class


إعداد المشروع

إعداد المشروع Setup Project

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

حقيقة ليس عندي شرح واف، ولكن القليل أفضل من لاشئ.

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

قم بفتح الفجوال نت ومن القائمة ملف File اختر مشروع جديد New Project وعند ظهور النافذة أختر Other Project Type ومن الخيارات الفرعية أختر Setup And Deployment .

ومن القائمة الى اليمين انقر على Setup Project تم انقر على موافق Ok

ستظهر لك النافذة File System وتعني ملفات النظام، وفيها ثلاث مجلدات افتراضية هي كالتالي:

أسم المجلد | مكانه ووظيفته
Application Folder | ويرمز الى مجلد المشروع الذي سيتم وضع كل ملفات المشروع فيه، الملف التنفيذي وغالباً ملفات Dll وملف قاعدة البيانات وغيرها.
User's Desktop | ويرمز الى سطح المكتب، اذا أردت إنشاء اختصارات مثلاً للملف التنفيذي وملف التعليمات وما شابه
User's Programs Menu | ويرمز الى مجلد البرامج او اختصاراتها التي تظهر في قائمة أبدا

وهذه ليست كل المجلدات التي تستطيع التعامل معها فيمكنك ان تضيف المزيد عن طريق النقر على File System On Target Machine بزر الفأرة الايمن وتعني ملفات النظام على جهاز الكمبيوتر.

عندها ستظهر لك قائمة من خيار واحد كما بالشكل:

ومن هذا الخيار ستنبثق قائمة جانبية تحتوي على كل المجلدات كما بالشكل التالي:

سوف نتطرق الى المجلدات الشائعة الاستخدام كما بالجدول التالي:

أسم المجلد | مكانه ووظيفته
Fonts Folder | ويرمز الى مجلد الخطوط، حيث يمكنك اضافة اي خطوط تستخدمها وتخشى ان لا تكون موجودة على اجهزة المستخدمين
System Folder | ويرمز الى المجلد System32
Windows Folder | ويرمز الى مجلد النظام C:\Windows
Global Assembly | ويرمز الى المجلد Assembly بمجلد النظام
Custom Folder | لتحديد مجلد معين

هذا بخصوص النافذة File System ويمكنك التعامل مع العديد من الأماكن المختلفة بالنظام.

من النافذة View أختر Editor لتحصل على القائمة التالية:

ما يهمك من الخيارات الشائعة الاستخدام.

الخيار الأول يظهر النافذة التي كنا نتحدث عنها قبل قليل.

Registry للقيام بقراءة قيمة او تسجيل او إنشاء مفتاح جديد.

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

Custom Action من هنا يمكن تحديد ملف Exe او Dll او Vbs الذي تريد تنفيذه بمرحلة معينة من مراحل اعداد المشروع.

Install عند أنتهاء تحميل كل الملفات

Uninstall عند الانتهاء من عملية الغاء تنصيب الملفات

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

Commit أعتقد ان الامر سينفذ مع أخر عملية توزيع للملفات.

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

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

نلاحظ مثلاً هنا الصندوق Welcome الذي يظهر مرحباً بالمستخدم مع او تنفيذ برنامج الإعداد.

يمكنك حذف او إضافة اي من هذه الصناديق، كما يمكنك التغيير في القليل حقيقة من نافذة الخصائص.

مثل الصور والإيقونات المستخدم، والنصوص التي يتم عرضها.

والان دعنا نعود الى النافذة File System لإضافة ملفات الى مجلد أنقر عليه بزر الفأرة الأيمن وأختر Add وستظهر القائمة التالية:

Folder لإضافة مجلد.

File لإضافة الملفات.

Assemply لإضافة مجمع الى البرنامج.

كما أي ملف تضيفه اذا نقرت عليه ستطالعك نافذة خصائصه كما بالشكل التالي :

أهم خيار هو Register والذي يمكنك من تسجيل أدوات او ملفات Activex .

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

من Configuration أختر Release لإنشاء النسخة الأخيرة.

ويمكنك تغيير مسار إنشاء حزمة التثبيت من Output File Name كما يمكنك ان تتحكم هل تريد برنامج الإعداد في شكل ملف واحد مستقل ام يتم ذلك من خلال إنشاء مجلد يحتوي على الملفات الضرورية، أنصحك بترك الخيار كما هو.

Compression لإجراء نوعية الضغط المطلوبة، انا لم أجرب شيئاً من هذا يمكنك تجربة عدة خيارات لتحصل على اقل حجم اذا كان هذا مهماً.

من المهم ان تتجه الى Prerequisites لتحدد لبرنامج الإعداد طريقة اعتماده على التنزيل هل هو Framework وبعدة إصدارات مختلفة او Windows Installer والإصدارة.

أي منهم يفي بالغرض، حتى وان كانت اغلب البرامج التي اعرفها تتعامل مع Windows Installer في عمليات التنصيب.

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

واذا أردت استخدام Windows Installer فأختر الإصدارة 3.1 فهي الإصدارة الأحدث وأنظمة التشغيل كلها تحتوي عليها حتى هذا التاريخ على الأقل.

كما يمكنك من الانتقال الى الخيار التالي Prerequisites والتي تنقلك الى النافذة التالي:

يمكنك من هنا اختيار اي حزمة تريدها لدمجها مع مشروعك والبرنامج يتعرف على ما استخدمت انت منها فيؤشر عليها كما ترى هنا وهو:

.net Framework 2.0

طبعا اذا استخدمت التقارير يجي عليك تحديد Crystal Report من هنا .

وطبعا بحال لم يجد برنامج التنصيب اي حزمة من هذه سيقوم بتحميلها من عدة اماكن مقترحة كما بالشكل :

الخيار الاول سيقوم بتحميلها من موقع مايكروسوفت وهذا حل غير مناسب.

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

الخيار الثالث سيقوم بتحميلها من مسار انت تحدده وهذا عديم الجدوى

كما يوجد رابط هنا يقوم بالكشف عن أي تحديثات جديدة

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


Snippets

يقوم الفجوال نت بوضع بعض الاكواد الجاهزة في مجلد بالمسار التالي: Program Files\Microsoft Visual Studio 8\VB\Snippets\1033

حيث يصنفها حسب نوعها الخاصة بالملفات في مجلد الملفات، والخاصة بقاعدة البيانات في المجلد قاعدة البيانات وهكذا.

اذا فتحت احد المجلدات وجدت به هذه الاكواد على شكل ملفات نصية، أنقر على احدها نقراً مزدوجاً وسوف يقوم الفجوال نت بفتح الملف للتحرير كالتالي:

 <?xml version="1.0"?>

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">

  <CodeSnippet Format="1.0.0">

    <Header>

      <Title>Create a Folder </Title>

      <Author>Microsoft Corporation</Author>

      <Description>Creates two new folders on a computer.</Description>

      <Shortcut>filCreateFold</Shortcut>

    </Header>

    <Snippet>

      <Declarations>

        <Literal>

          <ID>folderName</ID>

          <ToolTip>Replace with the name of the folder to be created.</ToolTip>

          <Default>"C:\NewDirectory"</Default>

        </Literal>

      </Declarations>

      <Code Language="VB" Kind="method body"><![CDATA[My.Computer.FileSystem.CreateDirectory($folderName$)]]></Code>

    </Snippet>

  </CodeSnippet>

</CodeSnippets>

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

واقصد بالوسوم هي الواقعة بين علامتي <> واذا كانت لك خلفية بلغة Html فلن يكون هذه الكود غريباً عنك.

على اي حال هو بسيط جداً وبدائي لنرى مافيه.

الوسم | وظيفته
<Title> | ويعني العنوان
<Author> | مؤلف الكود
<Description> | الجملة التوضيحية التي تبين ما الذي يفعله الكود
<Shortcut> | الاختصار الذي سيظهر بالقائمة
<ID> | متغير سيتم وضع القيمة الافتراضية فيه
<ToolTip> | يستخدم لاظهار رسالة توضيحة فوق الكتابة المائية الخظراء
<Default> | قيمة افتراضية سيتم استخدامها في الكود
<Code Language="VB" Kind="method body"> | تعريفات باللغة المستخدمة والنوع والكود

والان تعال لنرى كيف تم تحرير الكود انظر للتالي:

<![CDATA[My.Computer.FileSystem.CreateDirectory($folderName$)]]>

يجب كتابة الكود بعد [Data] تم اقفال الاقواس كما ترى بالصورة.

لاحظ تم كتابة الكود طبيعياً أي الذي تريده ان يظهر ماعدا المتغير $folderName$ اذا عدت الى الوسوم فوق لوجدت اننا وضعنا به متغير راجع ذلك.

هذا الكود هو الخاص بانشاء مجلد دعنا الان نرى بالصورة كيف واين تظهر هذه الاشياء أنظر للبداية.

انظر للكلمة Greate a Folder أين ظهرت هذه التسمية، تم انظر الى الرسالة التوضيحية أين ظهرت بالمربع الاصفر يمكنك كتابتها باللغة العربية.

حسناً أين باقي الاشياء انظر للتالي.

أنظر للقيمة الافتراضية، تم انظر للرسالة التوضيحية، أعتقد بأن الامر واضح.

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

او يمكنك إدراجها في القرص المدمج للفجوال اذا أمكنك ذلك.

حسناً هذا مثال أخر:

  <?xml version="1.0"?>

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">

  <CodeSnippet Format="1.0.0">

    <Header>

      <Title>Create a Bitmap at Run Time</Title>

      <Author>Microsoft Corporation</Author>

      <Description>Creates and fills a Bitmap object and displays it in an existing Windows Forms PictureBox control.</Description>

      <Shortcut>drawBitmap</Shortcut>

    </Header>

    <Snippet>

      <References>

        <Reference>

          <Assembly>System.Drawing.dll</Assembly>

        </Reference>

        <Reference>

          <Assembly>System.Windows.Forms.dll</Assembly>

        </Reference>

      </References>

      <Imports>

        <Import>

          <Namespace>Microsoft.VisualBasic</Namespace>

        </Import>

        <Import>

          <Namespace>System</Namespace>

        </Import>

        <Import>

          <Namespace>System.Drawing</Namespace>

        </Import>

        <Import>

          <Namespace>System.Windows.Forms</Namespace>

        </Import>

      </Imports>

      <Declarations>

        <Literal>

          <ID>Width</ID>

          <Type>Integer</Type>

          <ToolTip>Replace with width, in pixels, of the bitmap.</ToolTip>

          <Default>10</Default>

        </Literal>

        <Literal>

          <ID>Height</ID>

          <Type>Integer</Type>

          <ToolTip>Replace with height, in pixels, of the bitmap.</ToolTip>

          <Default>10</Default>

        </Literal>

        <Literal>

          <ID>pixelColor</ID>

          <Type>System.Drawing.Color</Type>

          <ToolTip>Replace with background color for the bitmap.</ToolTip>

          <Default>Color.White</Default>

        </Literal>

        <Object>

          <ID>control</ID>

          <Type>PictureBox</Type>

          <ToolTip>Replace with a Control.</ToolTip>

          <Default>PictureBox1</Default>

        </Object>

      </Declarations>

      <Code Language="VB" Kind="method body"><![CDATA[Dim flag As New Bitmap($Width$, $Height$)

Dim x As Integer

Dim y As Integer

' Make the entire bitmap white.

For x = 0 To flag.Height - 1

    For y = 0 To flag.Width - 1

        flag.SetPixel(x, y, $pixelColor$)

    Next

Next

' Draw a diagonal red stripe.

For x = 0 To flag.Height - 1

    flag.SetPixel(x, x, Color.Red)

Next

$control$.Image = flag

            ]]></Code>

    </Snippet>

  </CodeSnippet>

</CodeSnippets>

لنرى الوسوم الجديدة بهذا المثال:

الوسم | وظيفته
<Assembly> | المرجع ملف Dll المطلوب أسنخدامه
<Namespace> | لاستيراد مجال الأسماء المكتوب فيه وصرت تعرف كيف تفعل ذلك من خلال الامر Imports
<Type> | نوع المتغير

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

واذا كان غير موجود فسيتم إدراجه وتراه مكتوباً.

ولاضافة كود جديد يمكنك فتح احد هذه الملفات والقيام بالتعديلات المطلوبة تم حفظه بأسم أخر، وبعدها التوجه الى Tolls من القائمة واختيار Code Snippet Manger

وسوف تظهر لك النافذة التالية:

من Language أختر اللغة التي يتبعها.

ومن Add يمكنك تحديد المجلد المراد إضافته.

ومن Remove يمكنك حذف مالا تريده.

ومن Imports يمكنك تحديد الملف المراد إضافته.

ومن Search Online يمكنك البحث بالانترنت عن اكواد جديدة

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

كما لست مضطراً الى فتح احد الملفات الموجودة والمحفوظة مسبقاً بالمجلد المذكور وإنما يمكنك إضافة ملف جديد من القائمة Project أختر Add New Items تم اختر Xml File

وبداخل هذا الملف اكتب ما تعلمته سابقاً وقم بإضافته كما تعلمت سابقا إلى مجلد الفيجوال.

الان سوف نقوم بتطبيق مثال عملي على ذلك.

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

<?xml version="1.0"?>

<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">

  <CodeSnippet Format="1.0.0">

    <Header>

      <Title>Read Data From Database</Title>

      <Author>Qnefo Corporation</Author>

      <Description>Read data by OleDbDataReader</Description>

      <Shortcut> </Shortcut>

    </Header>

    <Snippet>

      <Imports>

        <Import>

          <Namespace>System.Data.OleDb</Namespace>

        </Import>

        </Imports>

      <Declarations>

        <Literal>

          <ID>DataBasePath</ID>

          <ToolTip>اكتب اسم قاعدة البيانات هنا</ToolTip>

          <Default>DataBaseName.mdb</Default>

        </Literal>

        <Literal>

          <ID>SQL</ID>

          <ToolTip>استبدله بجملة الاستعلام المناسبة</ToolTip>

          <Default>"Select * from TabelName"</Default>

        </Literal>

        <Literal>

          <ID>FeildName</ID>

          <ToolTip>استبدله باسم الحقل الذي تريد</ToolTip>

          <Default>"FeildName"</Default>

        </Literal>

        <Literal>

          <ID>Control</ID>

          <ToolTip>استبدله بالأداة المناسبة أو أضف للمشروع هذه الأداة</ToolTip>

          <Default>ListBox1</Default>

        </Literal>

      </Declarations>

      <Code Language="VB" Kind="method body">

        <![CDATA[

       Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$DataBasePath$"

       Dim con As New OleDb.OleDbConnection(ConString)

       Dim cmd As New OleDbCommand($SQL$, con)

      Try

           con.Open()

       Dim dr As OleDbDataReader = cmd.ExecuteReader()

        Do While dr.Read()

             $Control$.Items.Add(dr.Item($FeildName$).ToString)

        Loop

        dr.Close()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

      ]]>

      </Code>

    </Snippet>

  </CodeSnippet>

</CodeSnippets>

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

بعد ذلك قم بحفظ الملف

ولإضافة هذا الملف الجديد توجه الى Tolls من القائمة واختيار Code Snippet Manger كما بالشكل التالي:

الان أنقر على الزر Imports ليظهر لك نافذة فتح الملفات والتي عن طريقها قم بتحديد الملف المطلوب لتطالعك النافذة التالية:

المطلوب منك الان تحديد المجموعة التي تريده ان يظهر معها ويمكنك ان تشاهد أنني حددت مجلد معين.

طبعاً يجب ان تنتقي المجموعة بعناية فلا تضع اكواداً تتعامل مع الملفات مع مجموعة قواعد البيانات مثلا.

كما يمكنك تحديد اكثر من مجلد وهو على حسب اختيارك.

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

أنتقل الى محرر الكود وانقر بزر الفأرة الايمن وأختر Insert Snippet لتطالعك القائمة التالية:

انقر على المجموعة التي حددناها سابقا وأضفنا لها الكود الجديد وهي Ado.net كما تظهر بالشكل لتطالعك القائمة التالية :

الان يمكنك ان ترى الكود الذي أضفناه بالاسم Read Data From Database أنقر عليه فتحصل على الكود التالي :

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBaseName.mdb"

        Dim con As New OleDb.OleDbConnection(ConString)

        Dim cmd As New OleDbCommand("Select * from TabelName", con)

        Try

            con.Open()

            Dim dr As OleDbDataReader = cmd.ExecuteReader()

            Do While dr.Read()

                ListBox1.Items.Add(dr.Item("FeildName").ToString)

            Loop

            dr.Close()

        Catch ex As OleDbException

            MsgBox(ex.Message)

        Catch ex As Exception

        Finally

            con.Close()

        End Try

    End Sub

End Class

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

جرب تحريك الفأرة هنا وما ستحصل عليه هو نفسه ما ستحصل عليه بالفيجوال تماماً.

يمكنك ان ترى مجال الأسماء الذي قمنا باستيراده وتعريف الكائنات وربطها ببعض.

ستوفر عليك هذه الطريقة كتابة الكثير من الاكواد.

واعتقد بعد هذا المثال قد صارت الأمور واضحة جداً


العمليات الحسابية

بعض النوافذ

النافذة Error List وهذه النافذة تظهر عند حدوث خطاء بكتابة الكود في الفيجوال لتخيرك بطبيعة الخطاء ومكانه وما إلى ذلك .

فمثلا جرب اكتب في حدث التحميل أي شئ مثل التالي :

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        asdasd()

  End Sub

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

واذا كانت نافذة Error List ظاهرة فسترى انها قد عرضت الخطاء بداخلها.

واذا لم تكن ظاهرة فمن القائمة View أختر Error List وسترى النتيجة التالية :

كما ترى تخبرك النافذة ان العبارة asdasd غير معرفة ومواصلة السطر يمكننا ان نرى الملف الذي به الخطاء وهو Form1

بالسطر الخامس.

العمود التاسع .

وفي المشروع WindowsApplivation1

اذا أي أخطاء للبرنامج فسيتم عرضها بهذه النافذة .

كما توجد إلى جانبها النافذة Warning وهي تقوم بعرض التحذيرات والتي غالباً لا توقف عمل البرنامج وإنما من الممكن ان تتسبب بشئ ما او تتحول الى خطاء بوقت ما.

أكتب الكود التالي :

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As String

  End Sub

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

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

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

أيضاً توجد النافذة Daynamic Help ولتظهرها ستجدها تحت القائمة Help ومهمتها أظهار اختصارات للعديد من العناوين بحسب المكان الذي تعمل عليه .

فمثلا عندما تكون بوضع التصميم وتنقر على النموذج تظهر لك النافذة العناوين التالية :

الكثير من العناوين الخاصة او التي تتحدث عن Windows Forms .

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

أو جرب ان تدخل الى محرر الكود وتنتقل من إجراء الى اخر وتنقر بالفأرة على أماكن مختلفة.

لا ريب انها نافذة مهمة .

ولكن عيبها الوحيد هو ان سوف تبطئ عمل الجهاز اذا كانت مواصفاته رديئة.

ولكن ان كان جهازك قوياً فلن تشعر بشئ .

أيضا توجد النافذة Class Veiw والتي يمكنك إظهارها من القائمة View تم من القائمة الفرعية Other Window .

وهذه النافذة تقوم على استعراض كل الكلاسس والمراجع التي يتضمنها المشروع كما بالشكل التالي :

يمكنك البحث عن أي كلاسس او عن أي حدث او متغير وغيرها .

كما يمكنك من خلال Class View Setting التحكم بما تريد عرضه او ما لا تريد عرضه انظر للشكل التالي :

اذا كنت تريد إظهار الفئة القاعدية التي تشتق منها أي كلاسس مستخدمة او عدم إظهارها .

او يمكنك تحديد نوعية الفئات او الحقول وغيرها التي تريد ظهورها.

مكان جيد للمراجعة المشروع خاصة اذا كان حجمه كبير جداً


بداية البرمجة

System 64

غير مسموح العمل بمحتويات هذا النظام في أي برامج أو نظام قبل مراجعة المؤلف

We write this letter for sent to Microsoft, any one thank we can work together with this idea, connect us on above address.

ما هو النظام 64 (What is system 46)

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

ومن حيث القدرة الاختزالية فالنظام 16 هو أفضل هذه الأنظمة من حيث أن له القدرة على التعبير برمز أو رقم واحد حتى 16 حرف وهي كالتالي:

1-2-3-4-5-6-7-8-9-F-E-D-C-B-A

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

فمثلاً أنظر إلى هذه السطور.

10110110-11011001-11100110-00101000-00101100-01111011-10011101

11011111-11000011-00011000-11011101-00011101-11011010-00001111

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

لنفرض إننا نريد تحويل هذه البيانات إلى النظام السادس عشر انظر للتالي:

F4-DD-EC-A5-23-CA-F8

EE-A2-DC-FD-F5-F1-AE

صارت بهذا الشكل أسهل كثيراً ولابد انك رأيت شيئا كهذا لدى قرأتك لبعض البيانات.

حسناً النظام 46 له القدرة على تمثيل هذه البيانات والتعبير برمز او حرف او رقم حتى 46 ، مع إمكانية قراءة القيمة بسهولة تفوق النظام السادس عشر، فمثلاً الأرقام السابقة للنظام 16 ولتعلم ما تمثله عليك ان تحلها كالتالي:

AA =1010

طبعاً القدرة الاختزالية حتى 46 تفوق القدرة الاختزالية للنظام 16 بكثير.

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

وألان تعال نتعرف على النظام 46 عن قرب.

رموز النظام (system Digit)

لابد وان يكون للنظام رموز يتعامل معها فالنظام 16 مثلاً له هذه الأرقام والحروف.

1-2-3-4-5-6-7-8-9-F-E-D-C-B-A

أذا هذه هي الرموز للنظام 46.

إنها ليست كل الرموز ولكنها من صفر إلى خمسة فقط، وقبل ان نتابع عملية الشرح سوف نقوم بشرح القاعدة التي يقوم بإتباعها في تحديد هذه الأرقام وقيمها، ان كل أصبع جانبي يمثل قيمة أنظر للشكل التالي:

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

وأكبر رقم هو الذي تراه أمامك ألان ويمثل مجموع قيم هذه الأصابع الجانبية وهي 64.

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

العمليات الرياضية.

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

فمثلاً في عملية الجمع 1+2=3 يمكنك فعل التالي:

قم بتحويل الأعمدة إلى الجهة المقابلة فقط فتحصل على الناتج،ولكن هناك أجراء بحال كان هناك تصادم مع أصابع أخرى كما بالشكل التالي 1+3=4

قمنا بنقل الأصبع فوجدنا انه هناك واحداً يقابله عندها يقوم على محوه ويرحل إلى الخانة الثانية وهناك وجد أصبع أخر يقوم على محوه وينتقل إلى الخانة الثالثة لم يجد فيها شئ عندها يتوقف هناك ويكون الناتج كما بالشكل.

طبعاً هناك قواعد لكل العمليات الطرح والقسمة والضرب، ولكن حتى عند الرغبة في القيام بالعملية ذهنياً سيكون الأمر سهلاً للغاية.

التحويل من والى النظام الثنائي.

ان عملية التحويل تتم بسهولة كبيرة فيكفي ان تلقي نظرة على الأصابع وتقوم بتحويلها الى أحاد او أصفار كما بالشكل التالي:

الأمر في غاية السهولة كما هو واضح ويمكنك ان تلاحظ ان النظام 46 شبه كثيراً النظام الثنائي فهو أيضاً يقوم بالتعبير عن القيمة أما بأصبع أو لاشئ.

ولذلك ستجد ان له مرونة كبيرة في التعامل مع النظام الثنائي، واكبر قيمة للنظام 46 ممثلة بالنظام الثنائي هي كالتالي:

111111 هذه القيمة بالنظام الثنائي

3F وهذه القيمة ممثلة بالنظام الست عشري

هذه نبذة بسيطة عن النظام 46 بحال أراد احد الاستفادة منه فيمكننا العمل معاً ومتابعة بقية القواعد والشروح.

System 128

يمكننا التوسع أكثر وزيادة القدرة الاختزالية للنظام ولكن سيكون ذلك على حساب بعض المرونة


الأدوات Tolls

الأداة | ComboBox
وظيفته | قائمة منسدلة يتم وضع فيها بعض القيم للاختيار من بينها وطريقة التعامل معها تشبه ListBox
المثال على كيفية الاستخدام |

يمكنك التعامل مع محتويات الأداة عن طريق الخاصية Items دعنا نشاهد

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ComboBox1.Items.Add("Test")

        MsgBox(ComboBox1.Items.Count)

        ComboBox1.Items.Insert(1, "Test1")

        ComboBox1.Items.Remove("Test1")

        ComboBox1.Items.RemoveAt(0)

        ComboBox1.Items.Clear()

    End Sub

End Class

أنظر وكأننا نتعامل مع الاداة ListBox تماماً عد الى أعلى الصفحة لتقارن الكودين .

نفس الشئ، إضافة، عدد العناصر، حشر عنصر جديد، حذف، حذف بواسطة الفهرس، مسح

ويمكنك إضافة مجموعة من العناصر عن طريق Loop

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As Integer

        For value = 0 To 100

            ComboBox1.Items.Add("Test " & value)

        Next

    End Sub

End Class

كما يمكنك معرفة العنصر المختار او الذي تم تحديده بالشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        MsgBox(ComboBox1.Text)

    End Sub

End Class

نفس الشئ مع الأداة ListBox

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

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

ComboBox1.Text = ""

لن يعمل معك هذا الكود في محاولة للتخلص من الاختيار المحدد.

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

ComboBox1.SelectedIndex = 0

ولكن الاداة سيكون شكلها غير مقبول أنظر للشكل التالي :

هل ترى ذلك الفراغ الأبيض...؟

لا يعجبني وجوده أبداً.

على العموم يمكننا ان نقوم بمسح النص المحدد بالأداة بينما الخاصية DropDownList تساوي DropDownList بالشكل التالي :

ComboBox1.SelectedIndex = -1

هذا هو كل شئ .

توجد الخاصية dropDownWith والتي تحدد عرض القائمة المنسدلة أجعلها تساوي 300 وشغل البرنامج وسترى هذه النتيجة :

كما توجد الخاصية FlatStyle والتي تقوم بتغيير القليل من شكل هذه الأداة فتصبح ذات حواف ناعمة.

والخاصية DropDownHeight وهذه تقوم على تمديد القائمة المنسدلة ناحية الأسفل.

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

أجل القيمة مثلا تساوي 500


الأدوات Tolls

الأداة | ContextMenuStrip
وظيفته | تستخدم لعرض قائمة عند النقر بزر الفارة الأيمن على أي أداة
المثال على كيفية الاستخدام |

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

وبعدها نريد ان نسندها الى الاداة التي نريد عند الضغط عليها بزر الفارة الايمن تظهر لنا النافذة وبحالتنا هذه سنختار النموذج لذلك اكتب.

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.ContextMenuStrip = ContextMenuStrip1

    End Sub

End Class

او يمكنك القيام بذلك يدوياً من نافذة الخصائص للنموذج كما بالشكل التالي :

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

وهذا طبعاً يغنيك عن التدخل اليدوي الذي من الممكن ان تقوم به.

والان شغل البرنامج وانقر بزر الفارة الايمن على النموذج لتجربة القائمة.

طبعاَ يمكنك كتابة الكود في كل حدث ووذلك بالنقر المزدوج على اي عنوان مثل New وعند انشاء الاجراء الخاص به اكتب هناك ماتريد فعله.

ولا تنسى انه يمكنك ان تضع لكل خيار او عنصر ايقونة خاصة به عن طريق الخاصية Image أنظر للشكل :

اذا استخدمت صورا ذات لاحقة Bmp فلابد وان تكون لها خلفية اما بيضاء او زرقاء او وردية وغيرها.

ولكي تتخلص من هذه الخلفية وضعوا لك الخاصية Image Transparent وكل ما عليك هو تحديد لون الخلفية ليتم التخلص منه.

كما يمكنك محاذاة الصورة الى الجهة التي تريدها عن طريق الخاصية ImageAlign

وايضاً الخاصية TextDirection تجعلك تتحكم في طريقة ظهور النص افقي ام عمودي وغيره أنظر للشكل التالي :

ومن الخصائص الجيدة والتي توفر عليك الوقت الخاصية ShortcutKeys ومن هنا يمكنك تحديد مفتاح مختصر لاي عنصر بالقائمة.

حيث يتم تنفيذه بحال نقر هذا الاختصار، أنظر للشكل التالي :

ان القائمة المنسدلة السفلية تحتوي على العديد من الاحرف من

A-Z وكذلك احرف خاصة مثل F1-F2-F3 وغيرها.

كما يمكنك تحديد احد مفاتيح الوظائف مثل Ctrl اوAlt


الأدوات Tolls

الأداة | DataGridView
وظيفته | بالدرجة الاولى تستخدم في عرض البيانات من قاعدة البيانات
المثال على كيفية الاستخدام |

عن طريق الخاصية DataSource يتم إسناده الجدول المراد استعراضه بالأداة كما بالشكل التالي:

  DataGridView1.DataSource = DataSet.Tables(0)

والجدول من الممكن ان يكون بالاسم أيضا كما بالشكل التالي:

  DataGridView1.DataSource = DataSet.Tables("Tabel Name")

كذلك هناك الكثير من العمل الذي يمكننا ان نفعله بالفأرة أنظر للشكل التالي:

اذا نقرت على السهم الصغير بالاداة فسيتم عرض هذه النافذة او الـ Editor والتي تمكننا من التعديل في خصتئص الاداة.

ان الخيار Choose Data Source يمكنك من تحديد مصدر البيانات وتحديد الجدول الذي ترغب في استعراضه، وهذا بحال قمت باضافة قاعدة البيانات الى المشروع عن طريق الـ Data Source

كما ان الخيار Edit Columns هو لتحرير الاعمدة و سوف يفتح هذه النافذة كما بالشكل التالي:

طبعاً لا شئ فيها وهي تستخدم لاضافة اعمدة الى الاداة، ولو كان فيها اعمدة فستجد خيارات تحريرها هنا.

فالاداة بالنهاية تحتوي على اعمدة وصفوف.

أنقر على الزر Add لتطالعك النافذة التالية:

الخيار Name هو لتحديد اسم لهذا العمود حتى يمكن التعامل معه من خلاله.

الخيار Type لتحديد ما ستكون نوعية العمود هو ستكون نصية TextBox ام زر ام منطقية CheckBox وغير ذلك وحسب الحاجة لذلك.

وهذا صورة للتوضيح واستخدام كل عمود مع كنترول مختلف أنظر للشكل التالي:

الخيار Header text هو لتحديد العنوان للعمود، أنظر للصورة السابقة وكيف قمنا بتغيير العنوان بالعبارة رابط الموقع .

تم بالاسفل الخيار Visible لإخفاء العمود وكذلك Read only لجعله للقراءة فقط.

عندما تنتهي من اضافة الاعمدة المطلوب أنقر على الزر Cancel للعودة الى النافذة السابقة مع ان الخيار Cancel غير منطقي وكان يجب ان يكون عنوانه Close .

على العموم أنظرللشكل التالي:

يمكنك تحرير كل الأعمدة من هنا بأي وقت.

والزر Remove هو لازالة أي عمود لم تعد ترغب في وجوده.

أذا عدنا الى الـ Editor السابق كما بالشكل التالي :

فسنجد وجود خيار أخر وهو Add Colums وهو لإضافة الأعمدة وينقلك مباشرة الى النافذة التي كنا نتحدث عنها سابقاً وكما بالشكل التالي:

الخيار Enabeld Adding وهو هل سيسمح بإضافة الصفوف ام لا يسمح

الخيار Enabled Editing وهو هل سيسمح بالتعديل ام لا يسمح

الخيار Enabled Deleting وهو يسمح او لا يسمح بالحذف

أيضا من نافذة الخصائص للأداة ستجد بعض الخصائص المهمة مثل:

أسم الخاصية | وظيفتها
Allow user to Resiz Rows | هل يسمح او لا يسمح للمستخدم بتغيير ابعاد الصفوف عرض وطول يعني
Cell Border Style | لتغيير اطار الخلايا
Column header border style | لتغيير اطار العناوين
ColumnheaderHeight | لتحديد ارتفاع شريط العناوين
ColumnheaderVisable | اخفاء او اظهار شريط العناوين
MultiSelect | لتحيد اكثر من صف او عمود
RowheaderVisable | اخفاء او اظهار شريط الصفوف
RowheaderWith | لتحديد عرض شريط الصفوف

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

  DataGridView1.AllowUserToResizeColumns = True

  DataGridView1.AllowUserToDeleteRows = False

  DataGridView1.AllowUserToAddRows = True

  DataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Raised

  DataGridView1.ColumnHeadersHeight = 23

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

اذا فكرنا في إضافة أعمدة جديدة بواسطة الكود فسوف نكتب شيئاً مثل :

 DataGridView1.Columns.Add("Col1", "Path")

والنتيجة كما بالشكل التالي:

لاحظ ان Col1 هي أسم العمود والـ Path هو العنوان.

كما يمكن إضافة الأعمدة بشكل متتالي كما بالشكل التالي :

    DataGridView1.Columns.Add("Col1", "File Name")

    DataGridView1.Columns.Add("Col2", "File Path")

    DataGridView1.Columns.Add("Col3", "File Size")

هذه هي النتيجة .

بأي وقت أردنا الوصول الى هذه الأعمدة للتعامل معها يمكننا ذلك بالشكل التالي:

  DataGridView1.Columns("Col1").HeaderText = "Other Text"

  DataGridView1.Columns("Col2").Width = 300

  DataGridView1.Columns("Col3").Name = "Col4"

لاحظ عن طريق اسم كل عمود أمكننا الوصول له والتغيير في خصائصه.

كما من الممكن بدلاً من أسمه ان نستخدم رقم الفهرسة له.

أو يمكننا فعل ذلك عن طريق مصفوفة كما بالشكل التالي :

 Dim value() As String = {"Visual", "Windows", "File"}

 DataGridView1.Columns.Add("Col1", "File Name")

 DataGridView1.Columns.Add("Col2", "File Path")

 DataGridView1.Columns.Add("Col3", "File Size")

 DataGridView1.Rows.Add(value)

اذا اردت ان تقوم بحذف أي عمود اكتب التالي:

   DataGridView1.Columns.Remove("Col1")

عن طريق اسمه او رقمه.

اما اذا أردت ان تعرف عدد الأعمدة اكتب التالي:

  MsgBox(DataGridView1.Columns.Count)

وهذا الأمر لمسحها :

  DataGridView1.Columns.Clear

كما يمكننا التعامل مع الصفوف عن طريق الـ Row أنظر للشكل التالي :

  DataGridView1.Columns.Add("Col1", "File Name")

  DataGridView1.Columns.Add("Col2", "File Path")

  DataGridView1.Columns.Add("Col3", "File Size")

  DataGridView1.Rows.Add(3)

وسيتم إضافة الصفوف كما بالشكل التالي:

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

وإضافة صف جديد من خلاله من جهة أخرى، وعليه فالصفوف الفعلية التي بالأداة ألان هي ثلاثة صفوف.

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

كما يمكن التعامل معها كما بالشكل التالي:

 DataGridView1.Rows(1).Selected = True

 DataGridView1.Rows.Clear()

 MsgBox(DataGridView1.Rows.Count)

السطر الاول يقوم بتحديد صف معين عن طريق رقم فهرسته.

السطر الثاني سيمسح كل الصفوف.

السطر الثالث يخبرنا بعدد الصفوف.

اذا أردت ان تتعامل مع الخلايا بالصفوف فيمكنك ان تصل إليها بالشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(3)

        DataGridView1.Rows(0).Cells(2).Value = "34"

        DataGridView1.Rows(1).Cells(2).Value = "16"

        DataGridView1.Rows(2).Cells(2).Value = "22"

        DataGridView1.Rows(0).Cells(1).Value = "C:\"

        DataGridView1.Rows(1).Cells(1).Value = "D:\"

        DataGridView1.Rows(2).Cells(1).Value = "E:\"

        DataGridView1.Rows(0).Cells(0).Value = "AAAA"

        DataGridView1.Rows(1).Cells(0).Value = "BBBB"

        DataGridView1.Rows(2).Cells(0).Value = "CCCC"

    End Sub

End Class

وهذه هي النتيجة :

بأي وقت اردت ان تتحكم بشكل هذه الخلايا فيمكنك عن طريق Style كما بالشكل التالي:

 DataGridView1.Rows(1).Selected = True

 DataGridView1.Rows.Clear()

 MsgBox(DataGridView1.Rows.Count)

أنظر الى هذا المثال :

  Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(3)

        DataGridView1.Rows(0).Cells(2).Value = "34"

        DataGridView1.Rows(1).Cells(2).Value = "16"

        DataGridView1.Rows(2).Cells(2).Value = "22"

        DataGridView1.Rows(0).Cells(1).Value = "C:\"

        DataGridView1.Rows(1).Cells(1).Value = "D:\"

        DataGridView1.Rows(2).Cells(1).Value = "E:\"

        DataGridView1.Rows(0).Cells(0).Value = "AAAA"

        DataGridView1.Rows(1).Cells(0).Value = "BBBB"

        DataGridView1.Rows(2).Cells(0).Value = "CCCC"

        DataGridView1.Rows(0).Cells(0).Style.BackColor = Color.Bisque

        DataGridView1.Rows(2).Cells(2).Style.ForeColor = Color.Red

        DataGridView1.Rows(1).Cells(1).Style.BackColor = Color.DarkCyan

    End Sub

  End Class

وهذه هي نتيجة العمل :

ماذا لو أردت ان تقوم بتعبئة هذه الخلايا بواسطة احد الحلقات التكرارية أنظر للشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(3)

        For t As Integer = 0 To DataGridView1.Columns.Count - 1

            For A As Integer = 0 To DataGridView1.Rows.Count - 2

                DataGridView1.Rows(A).Cells(t).Value = "Row" & A & "-" & "Col" & t

            Next

        Next

    End Sub

End Class

طبعاً هذا ما كان وهذا ما سيكون أنظر للنتيجة :

الأمر أشبه بكون هذه الخلايا عبارة عن مصفوفات عادية ذات أبعاد مختلفة.

على العموم هذه طريقة أخرى بشكل احترافي :

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(3)

        Dim row As New DataGridViewRow

        Dim Col As New DataGridViewColumn

        For Each Col In DataGridView1.Columns

            For Each row In DataGridView1.Rows

                row.Cells(Col.Index).Value = "Row" & row.Index & "-" & "Col" & Col.Index

            Next

        Next

    End Sub

End Class

نفس النتيجة أيضا كل الطرق تؤدي لاي مكان أنظر للشكل التالي :

ماذا عن الأحداث أنظر لهذا الحدث :

 Private Sub DataGridView1_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter

         MsgBox("Row" & e.RowIndex & "-" & "Col" & e.ColumnIndex)

 End Sub

الحدث CellEnter سيتم تشغيله عند الدخول على الخلية وانتقال المؤشر إليها.

ويمكنك ان تحصل على رقم الفهرس للصف والعمود ومن خلالهما يمكنك ان تحدد مكان الخلية، تماماً مثل رقعة الشطرنج.

كما توجد العديد من الأحداث الأخرى مثل :

تغيير الإطارات او لون الخلفيات او القيم او عند إضافة صفوف او أعمدة او حذفها.

بمعنى ان كل ما يمكن ان تقوم به على هذه الأداة ستجد له حدثاً.

كما يمكنك التحكم في سلوك الأداة عبر الحدث Cell Formatting كما بالشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value1() As String = {"Visual", "Windows", "File"}

        Dim value2() As String = {"Copy", "Past", "Cut"}

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(value1)

        DataGridView1.Rows.Add(value2)

        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    End Sub

    Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

        e.CellStyle.SelectionForeColor = Color.Red

        e.CellStyle.ForeColor = Color.White

        e.CellStyle.SelectionBackColor = Color.Azure

        DataGridView1.RowsDefaultCellStyle.BackColor = Color.Olive

        DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Teal

    End Sub

End Class

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

   DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

أما بحدث تعديل إحدى الخلايا Cell Formatting فقد قمنا بجعل الخط المحدد يصبح احمر اللون.

ولونه الأساسي هو الأبيض.

ولون الخلفية للخلية Azure .

والسطران التاليان يقومان على تبديل لون الصفوف بالتناوب وبلونين محددين.

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

اذا كانت متطابقة بقى لون الخلفية كما هو.

وإلا فان خلفية الخلية تتغير الى اللون الأحمر مثلا دلالة على إنها قد تغيرت.

لتأخذ فكرة عن هذا الموضوع أليك هذا المثال :

 Public Class Form1

    Dim value1() As String = {"Visual", "Windows", "File"}

    Dim value2() As String = {"Copy", "Past", "Cut"}

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        DataGridView1.Columns.Add("Col1", "File Name")

        DataGridView1.Columns.Add("Col2", "File Path")

        DataGridView1.Columns.Add("Col3", "File Size")

        DataGridView1.Rows.Add(value1)

        DataGridView1.Rows.Add(value2)

        DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    End Sub

    Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting

        If value1(e.ColumnIndex) = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value Then

            e.CellStyle.BackColor = Color.BurlyWood

        End If

        If value2(e.ColumnIndex) = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value Then

            e.CellStyle.BackColor = Color.BurlyWood

        End If

    End Sub

End Class

حتى أوصل لك الفكرة فقط.

طبعاً من الممكن استخدام مصفوفة متعددة الأبعاد لتستطيع التعامل مع الأداة ومهما حملت من صفوف.

جرب ذلك بعد ان تستوعب الفكرة السابقة.

على كل حال هذه صورة توضيحية لما حدث عند تغيير تلك الخلية من القيمة Windows الى القيمة Change .

أي قيمة تتغير يتم تحويل خلفيتها الى اللون الأبيض وهو اللون الافتراضي للخلية طالما لم يتحقق الشرط .

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

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

حقيقة توجد طريقة غريبة قليلاً ولكنها بسيطة وقد اخترعتها وانأ اكتب هذه السطور أنظر للشكل التالي :

 Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit

        Try

            Dim k As Integer = DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value + 5

        Catch ex As Exception

            DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ""

        End Try

    End Sub

في الحدث CellEndEdit والذي يتم تفعيله مع نهاية عملية التحديث للبيانات بالخلية.

قمت هنا بدفع البرنامج إلى الوقع بخطاء في حال حاول جمع عدد مع نص وعندها نقوم بمسح البيانات.

طبعاً الا بحالة واحدة وهي ان البيانات كانت رقمية فقط.


الأدوات Tolls

الأداة | DateTimePicker
وظيفته | تستخدم لإظهار التاريخ واستخلاصه منها وما إلى ذلك
المثال على كيفية الاستخدام |

اذا وضعت أداة على النموذج وشغلت البرنامج فسيكون هذا مظهرها لنعطي فكرة أنظر للشكل التالي :

من الخصائص المهمة لهذه الأداة الخاصية Custom Format والتي تحدد طريقة إظهارنا للتاريخ أنظر للشكل التالي :

يظهر من الشكل اننا وضعنا للخاصية القيمة yyyy والرمز y يشير الى السنة

ولكن وحتى يمكننا استخدام هذا التنسيق المخصص لا بد وان نحدد من الخاصية Format القيمة Custom كما ترى بالشكل.

والعلامات التي يمكننا التعامل معها هي كما بالشكل التالي :

الرمز | المعنى | النتيجة
yyyy | يرمز الى السنة ومن الممكن اختصاره الى yy | 2009 او 09
MM | ويرمز الى الشهر ولاحظ يجب ان تكون الحروف كبيرة | 08
dd | ويرمز الى اليوم | 04
yyyy-MM-dd | تاريخ | 04-08-2009
ss | إظهار الثواني | 33
hh | الساعة | 6
mm | الدقائق | 55

كما تلاحظ من الممكن استخدام الأداة في إظهار التاريخ او الوقت لا فرق واذا عدت إلى الخاصية Format فسوف تجد احد الخيارات و Time كما بالشكل التالي :

حيث الخيار الأول يعطينا تاريخاً طويلاً مفصلا.

والثاني مختصر كثيرا.

تم الخيار الثالث والذي يقوم بعرض الوقت.

الخاصية maximumsize تحدد اكبر قيمة للتاريخ يمكننا ان نحددها.

كما ان الخاصية mindate تحدد اقل قيمة يمكننا ان نستخدمها.

والخاصية ShowUpDaown تلغي طريقة القائمة المنسدلة وتعرض أسهم صغيرة لتغيير التاريخ.

والخاصية Value هي الخاصية التي تمكننا من الحصول على قيمة التاريخ الحالي او تحديد التاريخ الحالي للأداة.

وبالانتقال الى الكود جرب ان تستعلم عن القيمة كما بالشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(Me.DateTimePicker1.Value)

    End Sub

End Class

اذا شغلت البرنامج فربما حصلت على التاريخ الهجري ولتفادي ذلك يمكنك تغيير الكود الى الشكل التالي :

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As Date = Me.DateTimePicker1.Value

        MsgBox(value.ToString("yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture))

    End Sub

End Class

ولمزيد من المعلومات راجع الدرس الخاص بالتاريخ والوقت تحت العنوان Now مع المجموعة Commands

كما يمكنك تغيير بعض الألوان في الأداة بما يتماشى مع برامجك كما بالشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.DateTimePicker1.CalendarForeColor = Color.Brown

        Me.DateTimePicker1.CalendarMonthBackground = Color.DarkRed

        Me.DateTimePicker1.CalendarForeColor = Color.Wheat

        Me.DateTimePicker1.CalendarTitleForeColor = Color.Yellow

    End Sub

End Class

أنظر للنتيجة على سبيل المثال فقط :


الأدوات Tolls

الأداة | Drivelist - Dirlist-Filelist
وظيفته | تقوم هذه الادوات على استراض الملفات والملجدات
المثال على كيفية الاستخدام |

أولاً يجب ان تضيف هذه الأدوات الثلاثة الى شريط الأدوات، واذا لك تكن تعرف كيف تفعل ذلك راجع الدرس حول شريط الأدوات TollBox

بعدها ستجد هذه الأدوات كما بالشكل التالي:

الأداة الأولى كما بالصورة تستعرض المجلدات.

والثانية تحدد القرص النشط.

والثالثة تستعرض الملفات.

أولا ضع الأدوات على النموذج كما بالشكل التالي:

تم أنقر على الاداة DriveListBox واكتب فيها كما ترى بالمثال هنا :

  Public Class Form1

    Private Sub DriveListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DriveListBox1.SelectedIndexChanged

        Me.DirListBox1.Path = Me.DriveListBox1.Drive

        Me.FileListBox1.Path = Me.DriveListBox1.Drive

    End Sub

    Private Sub DirListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DirListBox1.SelectedIndexChanged

        Me.FileListBox1.Path = Me.DirListBox1.Path

    End Sub

End Class

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

كذلك الحدث الخاص بالأداة DirList بحال تم تغيير مسار المجلد تم تغيير عرض الملفات بالأداة FileList

ينقص هاتين الأداتين المظهر الاحترافي فانهما قديمتان قدم الفيجوال بيسك 6 ولقد ظهر بعدها أدوات احترافية كما بالشكل التالي:

هذه واحدة ولا زالت هناك ثلاث أدوات أخرى كل منها لها دور مختلف قليلاً.


الأدوات Tolls

الأداة | ErrorProvider
وظيفته | تستخدم مع الأدوات لإظهار رسالة مع حدث معين
المثال على كيفية الاستخدام |

اضف الاداة الى النموذج وأضف الاداة TextBox كذلك واكتب التالي:

 Public Class Form1

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        If Char.IsNumber(TextBox1.Text) Then

            ErrorProvider1.Clear()

        Else

            ErrorProvider1.SetError(TextBox1, "ارجوا إدخال قيمة حرفية")

        End If

    End Sub

End Class

هذا هو الحدث الخاص بي TextBox عند تغيير محتوياته، وهنا نقوم بالاستعلام عن المحتوي هل هو نص ام رقم عن طريق الخاصية IsNumber التابعة للـ Char

اذا كانت رقمية تجاهلنا الامر وقمنا بمسح اي رسائل مسندة الى الاداة TextBox واذا لم تكن كذلك تم اسناد الرسالة التي سوف تظهر كايقونة بجانب الاداة اذا مررت عليها زر الفارة ظهرت الرسالة.

جرب هذا المثال، كما يمكنك تغيير هذه الايقونة التي قامت مايكروسوفت بجعلها افتراضية من نافذة الخصائص للاداة.

او كمثال سريع يمكنك ان تسندها الى ايقونة النموذج كالتالي:

 Public Class Form1

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

        If Char.IsNumber(TextBox1.Text) Then

            ErrorProvider1.Clear()

        Else

            ErrorProvider1.Icon = Me.Icon

            ErrorProvider1.SetError(TextBox1, "ارجوا إدخال قيمة حرفية")

        End If

    End Sub

End Class

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

وطبعاً استخدمنا الايقونة الخاصة بنمودجنا ويمكن استخدام ايقونة تكون معبرة عن الحالة التي نتعامل معها، مثل ان تكون علامة X حمراء بمثالنا هذا دلالة على وجود خطاء.

ويمكنك تغيير موضع الإيقونة من الخاصية التالية:

 ErrorProvider1.GetIconAlignment = ErrorIconAlignment.BottomLeft

حيث تشير الحالة الان الى جهة اليسار من الناحية السفلية.

فكل جهة سواء كانت اليمين او اليسار لها ثلاث حالات اخرة ان تكون بالوسط او بالاعلى او بالاسفل.


الأدوات Tolls

الأداة | HelpProvider
وظيفته | تستخدم لاظهار تلميحات وتشغيل ملفات المساعدة عند النقر على ازرار معينة وما شابه
المثال على كيفية الاستخدام |

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

بالتأكيد انت دائماَ عندما تحتاج الى التعليمات بأي برنامج تنقر على الزر F1 وهذا صار متعارف عليه بكل البرامج.

الان اريدك ان تفعل ذلك بمشروعك.

اولا عليك ان تصمم صفحة او صفحات التعليمات هذه وطبعاً لابد وان تكون ذات الامتداد Html -Htm-Col-Chm

هناك الكثير من البرامج التي تصنع هذه الملفات، وان اردت ان يكون عملك أحترافياً فانا انصحك بانشاء ملف ذا اللاحقة Chm وهو من نفس نوعية الملفات او الكثاب الذي تتصفحه الان.

وكل البرامج والشركات تستخدم هذا النوع من الملفات مع برامجها، وهناك الكثير من البرامج التي تساعدك على تنفيد مثل هذا العمل وبسطت الكثير من الشركات ذلك وصار سهلا كثيرا حيث تعمل في بيئة أقرب ما تكون الى برنامج Word او Notepad ومن هذه البرامج WinCHM Pro وهذه صورة له

وعلى أي حال وبحال اردت استخدام ملفات الـ Html فيمكنك استخدام برنامج الـ FrontPage والذي يأتي مع مجموعة Microsoft Office او الفيجوال ستوديو نفسه.

ولتعرف كيف تفعل ذلك راجع الدرس حول WebBrowser .

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

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

لاحظ ان مسار الملف سوف يكون شيئاً مثل (D:\Visual Basic Net\Books\QnifoVb.chm)

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

أولا والطريقة الاولى استخدام حدث تحميل النموذج وكتابة الشيفرات برمجياً كما بالشكل التالي:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        HelpProvider1.HelpNamespace = My.Computer.FileSystem.CurrentDirectory & "\QnifoVb.chm"

End Sub

عند كتابة هذا السطر البرمجي في حدث التحميل للنموذج يكون عليك ان تضع الملف مجاوراً للملف التنفيذي وتغيير هذا الاسم هنا (QnifoVb.chm) بأسم الملف الذي اعدده .

ماذا لو اردت ان تضع ملفاتك في مجلد تسميه Help بدلا من ان يكون مجاورا للملف التنفيذي عندها عليك ان تكتب التالي:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        HelpProvider1.HelpNamespace = My.Computer.FileSystem.CurrentDirectory & "\Help\QnifoVb.chm"

End Sub

كما توجد طريقة أخرى لمعرفة مسار البرنامج كما بالشكل التالي:

Dim a As String = System.Environment.CurrentDirectory

حسناً والان جاء دور اظهار التعليمات للنتقل الى النموذج او الى نافذة الخصائص الخاصة بالنموذج وستجد ان الاداة قد اضافت خصائص جديدة الى النموذج ومنها :

أذا لاحظت ان الخاصية HelpNavigator on HelpProvider تحمل بعض القيم في تركيب كالتالي:

هذه الخيارات سوف تعرفها فيما بعد اذا تعاملت مع الملفات Chm ولكن اذا استخدمت ملفات الـ Html فلست بحاجة الى معرفتها، حسناً انظر الشكل التالي:

لاحظ التبويب الموجود الى جهة اليسار ، سوف يمكنك ان تلاحظ وجود خيارات مثل محتويات - فهرس - بحث - المفظلة

والان ان التركيب هذا وقبل الصورة هذه يمكنك منه تحديد اين تريد ان تنتقل عند النقر على زر F1 هل الى المحتويات ام الى البحث وهكذا

بداية ما يهمك هو ان تعلم ان :

Find | هذه لنقل المستخدم الى نافذة البحث مباشرة
TableOfContents | المحتويات
Index | الفهرس

بقى أمر أخر وهو عليك البحث عن الخاصية التالية ShowHelp on HelpProvider1 وجعل قيمتها تساوي True كما بالشكل التالي:

اذا لم تفعل ذلك فان التعليمات لن تعمل معك.

والان حدد احد هذه الخيارات السابقة وشغل البرنامج وأنقر الزر F1 وسيعمل معك انشاء الله.

يبقى أمر وهو يخص الخاصية HelpKeyword on HelpProvider1 والذي يمكنك من تحديد مفتاح او جملة لاستخدامها مع القيمة Keyword Index للخاصية HelpNavigator on HelpProvider

بمعنى عند تحديد كلمة واستخدام هذه القيمة بالشكل المذكور سلفاً فأن ملف التعليمات سيتم فتحه على التبويب Index أي الفهرس والكلمة التي سيتم التركيز او الانتقال اليها وعرض تعليماتها ستكون هي الكلمة التي كتبتها انت، ويمكنك استغلال هذه الطريقة في عرض تعليمات دقيقة للمستخدم بحسب الحالة التي هو فيها.

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

حسناً هناك طرق أخرى تستخدم في اظهار هذا النوع من الملفات أنشئ مشروعاً جديداً:

ضع زرا على النموذج واكتب فيه التالي:

Help.ShowHelp(Me, "file://c:\charmap.chm")

طبعاً يمكنك تحديد المسار المناسب لك مع ملاحظة انه لا يمكنك التحكم بطريقة الظهور كما بالحالة السابقة، ولكن يمكنك ذلك بالطريقة التالية:

Help.ShowHelp(TextBox1, "file://c:\charmap.chm", HelpNavigator.Index)

وايضاً

 Help.ShowHelp(Me, hpAdvancedCHM.HelpNamespace, HelpNavigator.Find, "")

تماماً كما الخيارات التي تحدثنا هنا سابقاً فالـ HelpNavigator سوف تعطيك خيارات اين تريد ان تنقل المستخدم وهي نفس الخيارات التي تحدثنا عنها كما بالشكل:

وتلاحظ بمثالنا السابق اننا قد حددنا الخاصية Index لننقل المستخدم الى الفهرس مباشرة.

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

انشئ مشروعاً جديداً وضع عليه الاداة HelpProvider وضع محموعة من الادوات وكما تريد ولنفرض كما بالشكل التالي:

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

ولكي تظهر هذا الزر عليك بعمل الاتي من نافذة الخصائص للنموذج.

Help Button | اجعل هذه الخاصية تساوي القيمة True
MinimizeBox | اجعل هذه الخاصية تساوي القيمة False
MaximizeBox | اجعل هذه الخاصية تساوي القيمة False

بعدها سيمكنك مشاهدة هذا الزر، والان انتقل الى اي كنترول على النموذج وانقر عليه وانتقل الى نافذة الخصائص له وقم بالتالي:

عليك البحث عن الخاصية التالية ShowHelp on HelpProvider1 وجعل قيمتها تساوي True

وبعدها ابحث عن الخاصية HelpString on HelpProvider1 واكتب فيها الجملة التوضيحية التي تريد ان يراها المستخدم.

والان شغل البرنامج وانقر على الزر الجديد والذي يحمل علامة الاستفهام وانقر على الكنترول الذي اعددنا له التعليمة وسوف تشاهد شيئاً مثل:

بالتأكيد انت شاهدت شيئا كهذا كثيرا بالبرامج، وطبعاً هي سريعة وغير مربكة وتؤدي الغرض .


الأدوات Tolls

الأداة | Image List
وظيفته | تستخدم لحفظ الصور والايقونات وفهرستها
المثال على كيفية الاستخدام |

حقيقة هذه الاداة مهمة كثيراً ولاتجد أداة من الادوات الاخرى لاتعتمد عليها .

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

حسناً من شريط الادوات اضف هذه الاداة كما بالشكل التالي :

الى اليسار الأداة والى اليمين نافذة الخصائص لها.

الخاصية Image Size تمكننا من تحديد حجم الصورة او الإيقونة التي سوف نقوم باستيرادها، طبعاً كل الصور او الإيقونات ستكون بنفس الحجم.

لا يمكن جعل كل صورة او إيقونة بحجم مختلف.

والخاصية Image Bit Depth يمكنك منها تحديد درجة وضوح وجودة الصورة او الإيقونة، ويتم تحديدها بالبكسل لكل بت واحد من الصورة.

كما يمكنك عن طريق Choose images او من Images استيراد الصور أنقر على هذا الخيار وستطالعك النافذة التالية :

يمكنك من خلال الزر Add جلب الصورة الواحدة تلو الاخرى أنظر للشكل التالي :

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

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

ولكي نصل الى احداها نحتاج الى هذا الرقم.

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

ونحن نريد ان نحصل على الصورة فقط.

توجد خاصية أخرى تسمى TransparentColor كما بالشكل التالي :

ولاحظ انني حددت نفس لون الخلفية المستخدم وعندها ستقوم الاداة بمسح اي لون تجد مثله بالصورة او الايقونة.

ولذلك وبعد استخدام هذه الايقونات مع اداة ما لا تظهر الخلفية أنظر للشكل التالي:

كل هذه الحديث هنا هو بوقت التصميم، ولا ننسى انه بامكاننا التعامل معها حتى بوقت التشغيل.

توجد الخاصية Images والتي تمكننا من الاتصال باي ايقونة او صورة كما بالشكل التالي :

   Me.ImageList1.Images(0).Save("C:\Image.png")

هذه الخاصية تحتاج الى رقم الفهرسة للصورة المطلوب التعامل معها كما اخبرتك سابقاً.

وانا هنا اقوم بحفظ هذه الصورة على المسار المحدد.

أعتقد صرنا نفهم الان جيداً هذه الاداة.


ListBox

الأداة | ListBox
وظيفته | تستخدم لعرض البيانات او الملفات
المثال على كيفية الاستخدام |

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListBox1.Items.Add("Test")

    End Sub

End Class

هذا الامر يقوم على أضافة كلمة Test الى الاداة.

اذا اردت باي وقت التعامل مع محتويات الاداة فلابد ان تتعامل معه عن طريق الخاصية Items

بعض الاوامر الاخرى:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListBox1.Items.Add("Test")

        MsgBox(ListBox1.Items.Count)

        ListBox1.Items.Insert(1, "Test1")

        ListBox1.Items.Remove("Test1")

        ListBox1.Items.RemoveAt(0)

        ListBox1.Items.Clear()

    End Sub

End Class

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

السطر الرابع يقوم بحذف قيمة، السطر الخامس يقوم بحذف قيمة بمعلومية الفهرس، السطر السادس يقوم بمسح كل القيم.

كما يمكننا ان نقوم بتعبئة الاداة باحد أوامر Loop أنظر المثال التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As Integer

        For value = 0 To 100

            ListBox1.Items.Add("Test " & value)

        Next

    End Sub

End Class

يقوم المثال بتعبئة الاداة بمئة حرف يسبقها كلمة Test لاجل مزيد من المعلومات حول الامر For راجع الدروس

وهذا مثال أكثر عملية:

 Imports System.Collections.ObjectModel

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim files As ReadOnlyCollection(Of String)

        Dim Value As Integer

        files = My.Computer.FileSystem.GetFiles("C:\Windows", FileIO.SearchOption.SearchTopLevelOnly, "*.*")

        For Value = 0 To files.Count - 1

            ListBox1.Items.Add(files.Item(Value).ToString)

        Next

    End Sub

End Class

هذا مثل يقوم باستعراض كل الملفات بمجلد Windows ووضعها مع مسارها في الأداة.

ولكن عند النقر على أحد العناصر بالأداة، كيف يمكنك تحديد ما هو العنصر الذي تم النقر عليه أنظر التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

        MsgBox(ListBox1.Text)

    End Sub

End Class

أنقر على الأداة نقرتين بالفأرة لتنتقل لاى إجراء SelectedInedxChanged التالي، وفيه اكتب ما تشاهده، حيث نقوم بإظهار رسالة بالعنصر المحدد عن طريق الخاصية Text

ولمزيد من المعلومات عن الأحداث راجع الدروس

كما من الممكن وضع العناصر بخبطة واحدة عن طريق مصفوفة أنظر للشكل التالي:

Public Class Form1

    Dim Value(2) As String

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.ListBox1.Items.AddRange(Data)

    End Sub

    Private Function Data() As Array

        Value(0) = "aaa"

        Value(1) = "bbb"

        Value(2) = "ccc"

        Return Value

    End Function

End Class

كما تشاهد من خلال الاجراء AddRange يمكننا وضع مجموعة من العناصر في الاداة دفعة واحدة.

وهنا نقوم باستدعاء الاجراء Data والذي يقوم بتعبئة المصفوفة بالبيانات تم يمررها من جديد لنا لنضع عناصرها في الاداة.

أو من الممكن ان تكون كما بالشكل التالي:

Public Class Form1

    Dim Value() As String = {"aaa", "bbb", "ccc", "ddd"}

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.ListBox1.Items.AddRange(Value)

    End Sub

End Class


الأدوات Tolls

الأداة | ListView
وظيفته | تستخدم في اظهار مجموعة من العناصر ولكن يمكن تمثيلها بأيقونات وهي شبيهة بالـ ListBox
المثال على كيفية الاستخدام |

في هذا المثال لن نستخدم الكود لتسهيل المهمة عليك كثيراً.

أضف الاداة الى النموذج واضف زراً واضف أداة ImageList الى النموذج تم انقر على السهم الصغير الذي بطرف الاداة ImageList كما بالشكل:

هذه الاعدادات الافتراضية، وتمثل الاولى عرض وطول الايقونات المستخدمة والثانية تمثل عمق الالوان وعليك تغيير هذه الاعدادات كما بالشكل التالي:

حيث سنستخدم أيقونة بحجم 32 ,عمق الوان 32 Bit وهو عالي الوضوح

والان علينا ان نضيف الايقونة ذات الابعاد 32 ولذلك انقر على Choose images لتظهر هذه النافذة.

أنقر على الزر Add لتظهر لك نافذة لتحديد الايقونة، لاحظ انه يمكنك استخدام العديد من انواع الصور كذلك حيث استخدمت انا صورة هنا من نوع Png حجمها 32-32

الزر Remove يجعلك قادراً على حذف الايقونة او الصورة التي لا تريدها، كما لاحظ ان هذه الايقونات لست بحاجة الى توزيعها مع برنامجك لانه سيتم تدمجها مع الملف التنفيذي.

وعند اضافة الايقونات سوى يتم فهرستها الاولى 0 والثانية 1 والثالثة 2 وهكذا حتى يمكننا معرفة ما الايقونة التي نرغب في استخدامها.

أنقر على Ok تم أنقر على الاداة ImageList وعلى السهم الصغير بجانب الاداة كما بالشكل:

الخيار Edit items يستخدم لاضافة عناصر الى الاداة بشكل يدوي ولكننا نريد استخدام الكود لمزيد من الخبرة.

الخيار Edit Columns يستخدم لاضافة وتعديل الاعمدة التي نريد استخدامها.

الخيار Edit Groups يستخدم لاضافة وتعديل المجموعات التي تستخدم لفرز العناصر على اساسها.

الخيار View يستخدم لاختيار نوعية العرض المطلوبة وبحالتنا الان نريد LargeIcon

الخيار Small ImageList يستخدم في تحديد الـ ImageList التي يجب استخدامها بحال تم تغيير طريقة العرض الى الوضع المصغر.

الخيار Large ImageList يستخدم في تحديد الـ ImageList التي يجب استخدامها بحال طريقة العرض الكبيرة وهنا حددنا الاداة ImageList الخاصة بنا.

ضع الخيارات كما تشاهد بالصورة تم اكتب الكود التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.Items.Add("Windows", 0)

        ListView1.Items.Add("Virus", 0)

    End Sub

End Class

يمكنك الوصول الى اي عنصر عن طريق الخاصية Items وهنا قمنا بإضافة النص الذي سيظهر للعنصر دالاً عليه، تم رقم يمثل فهرس الايقونة التي نريد لها الظهور أنظر:

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

أولاً عليك ان تضيف ثلاث ايقونات أخرى او صور بنفس الحجم تم اكتب التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.Items.Add("Windows", 0)

        ListView1.Items.Add("Virus", 1)

        ListView1.Items.Add("Internet", 2)

        ListView1.Items.Add("Info", 3)

    End Sub

End Class

لاحظ طريقة إسناد الأيقونات الى العناصر، وأنظر الى الشكل التالي:

حسناً الان نريد أضافة مجموعات يتم فرز العناصر على اساسها كما يفعل نظام التشغيل وفي جهاز الكمبيوتر تحديداً انظر الشكل التالي:

هل ترى على سبيل المثال Hard Disk Drives أنها مجموعة كيف نفعل ذلك أنظر الشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.Groups.Add("", "Folder In my computer")

        ListView1.Groups.Add("", "Some Programmes")

        ListView1.Items.Add("Windows", 0)

        ListView1.Items(0).Group = ListView1.Groups(0)

        ListView1.Items.Add("Virus", 1)

        ListView1.Items(1).Group = ListView1.Groups(1)

        ListView1.Items.Add("Internet", 2)

        ListView1.Items(2).Group = ListView1.Groups(1)

        ListView1.Items.Add("Info", 3)

        ListView1.Items(3).Group = ListView1.Groups(1)

    End Sub

End Class

حسناً بداية قمنا باضافة مجموعتين ولاحظ التسمية لكل مجموعة وهي العنوان الذي سيظهر لها، ولاحظ انه تتم فهرستها أي الاولى لها الرقم 0 والثانية لها الرقم 1

تم اضفنا العنصر بشكل طبيعي جداً واسفل كل سطر برمجي لاضافة عنصر قمنا بتحديد العنصر عن طريق رقم الفهرس الخاص به تم أسندنا الخاصية Group له الى احدى المجموعات التي عملناها عن طريق رقم الفهرس الخاص بها والنتيجة ستكون كما بالشكل:

كما يمكنك اظهار المجموعات او عدم اظهارها عن طريق الخاصية

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ListView1.ShowGroups = False

 End Sub

حسناً ماذا لو اردت ان تعرف ما هو العنصر الذي نقرت عليه بالفأرة، أضف اداة Textbox تم اختر الحدث ItemSelectionChanged واكتب التالي:

 Private Sub ListView1_ItemSelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged

        TextBox1.Text = e.Item.Text

    End Sub

الان شغل البرنامج وانقر على العناصر ليظهر أسم العنصر في أداة النص.

اذا كنت تريد استخدام ايقونات صغيرة فغير كل تلك الايقونات بايقونات من حجم 16-16 تم من نافذة الاداة ListView حدد Small ImageList لاستخدام الاداة ImageList والغي الخيار Large ImageList الذي حددناه سابقاً وكما يظهر بالصورة، كما غير الخاصية View الى SmallIcon وشغل البرنامج.

حاول بعدها تملئ الاداة التغيير في الخاصية View الى Tile والى List فهي طرق أخرى لعرض الملفات تحاكي تماماً عمل هذه القائمة الموجودة بكثرة في نوافذ Windows كما بالشكل:

أما الخيار Details فهو يختلف قليلاً عن سابق الاوامر لذلك أمسح كل البرمجة السابقة من النموذج وغير الخاصية View الى Details ودعنا نستمر مع الايقونات الصغيرة واكتب التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ListView1.Columns.Add("Name", 122)

        ListView1.Columns.Add("Size", 122)

        ListView1.Columns.Add("Type", 122)

        ListView1.Items.Add("Test.txt", 1)

        ListView1.Items(0).SubItems.Add("37 KB")

        ListView1.Items(0).SubItems.Add("File")

        ListView1.Items.Add("Test", 0)

        ListView1.Items(1).SubItems.Add("137 MB")

        ListView1.Items(1).SubItems.Add("Folder")

    End Sub

End Class

حسناً لقد أضفنا اعمدة واسندنا لها العنوان الذي ستظهر به، وايضا العرض.

تم اضفنا العنصر كما تعلمنا سابقاً وحددنا الايقونة، وبعدها انتقلنا الى الخانة الفرعية عن طريق الخاصية SubItems بمعلومية الفهرس وكتبنا ما نريد، تم انتقلنا الى الخانة التي بعدها وهكذا.

أنظر نتيجة التنفيذ.

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

اذا كنت قد قمت بتحديد العديد من العناصر بالاداة فيمكنك مثلا مسحها جميعا كما بالشكل التالي:

  Dim Item As ListViewItem

  For Each Item In ListView1.SelectedItems

     Item.Remove()

  Next

طبعاً لا يمكنك تحديد العديد من العناصر الا بحال جعلت الخاصية MultiSelect القيمة لها تساوي True


الأدوات Tolls

الأداة | MaskedTextBox
وظيفته | تستخدم لإظهار الأرقام في تنسيق معين
المثال على كيفية الاستخدام |

من المهم تقييد المستخدم بهيئة لإدخال البيانات حتى نتجنب حدوث أي مشاكل

من الخاصية Mask سيمكنك التحكم بطريقة تنسيق الأرقام وستظهر لك هذه النافذة كما بالشكل التالي :

يمكنك من هنا تحديد التنسيق الذي يتماشى ما عملك او يمكنك تحديد تنسيق خاص بك.

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

أنظر الى الخيار mask والذي تم تحديده بالقيمة 0000-000 وهذا يعني ان الأداة ستقبل قيماً من سبعة أرقام أربعة مع بعضها وثلاثة اخرى مع بعضها.

كما بالشكل التالي:

7648-822

9809-454

2305-777

هذه مجرد أمثلة.

أما الخيار Preview فيعرض الرموز التي تظهر شكل التنسيق للمستخدم ويمكنك تغييرها الى أي شكل أخر تريده ولكن ليس من هنا وإنما من نافذة الخصائص ومن خلال الخاصية Prompt Char.

فلو استخدمت الرمز # مثلاً فسيصبح الشكل كالتالي:

كما يمكنك استخدام الخاصية Password Char لإخفاء القيم برمز معين.

ويمكنك الحصول على القيمة او وضعها من خلال الخاصية Text

وإذا أردت استخدام تنسيق خاص بك فيمكنك كتابته في المكان المخصص للـ Mask

 Public Class Form1

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Me.Text = Now

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Timer1.Interval = 1000

        Timer1.Enabled = True

    End Sub

End Class

في حدث الـ Form_load قمنا باسناد القيمة 1000 الى الخاصية Interval اي اننا نريد تنفيذ الامر كل ثانية

تم قمنا بتمكين عمل المؤقت والذي اقصد به Timer

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


الأدوات Tolls

الأداة | MenuStrip
وظيفته | إنشاء القوائم للبرنامج
المثال على كيفية الاستخدام |

من شريط الأدوات ومن الحاوية التي أسمها Menu & Tollpares أسحب الأداة MenuStrip على النموذج .

توجد لهذه الأداة عناصر افتراضية يمكننا استخدامها والتغيير فيها.

أنقر على الأداة بزر الفأرة الأيمن وأختر Insert Standerd items لتحصل على القائم الافتراضية كما بالشكل التالي :

طبعاً يمكنك التغيير في هذه القائم او قم ببنائها من البداية كما بالشكل التالي :

من السهم الصغير سوف تنبثق نافذة صغيرة كما بالشكل التالي :

الخيار الأول سوف يضيف قائمة والخيار الثاني سيضيف قائمة منسدلة والخيار الثالث سيضيف أداة نص .

وتوجد بنافذة الخصائص بعض الخصائص الشائعة الاستخدام وهي :

لتحديد العنصر بعلامة تدل على التحديد ويعمل عمل الأداة CheckBox | Check on click
يقوم بتحديد العنصر المحدد | Checked
هل سيتم عرض العنوان فقط ام العنوان والإيقونة ام الأيقونة فقط | Display Style
لتحديد صورة او أيقونة للعنصر | Image
لتحديد عنوان للعنصر المحدد | Text

كما يمكن تغيير ألوان القائمة بالشكل التالي:

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

Public Class MenuColoring

    Inherits ProfessionalColorTable

    Overrides ReadOnly Property ImageMarginGradientBegin() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ImageMarginGradientEnd() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ImageMarginGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property MenuItemBorder() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Overrides ReadOnly Property MenuItemPressedGradientBegin() As System.Drawing.Color

        Get

            Return Color.Yellow

        End Get

    End Property

    Overrides ReadOnly Property MenuItemPressedGradientEnd() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property MenuItemPressedGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property MenuItemSelected() As System.Drawing.Color

        Get

            Return Color.OrangeRed

        End Get

    End Property

    Overrides ReadOnly Property MenuStripGradientBegin() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property MenuStripGradientEnd() As System.Drawing.Color

        Get

            Return Color.Yellow

        End Get

    End Property

    Overrides ReadOnly Property StatusStripGradientBegin() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property StatusStripGradientEnd() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ToolStripDropDownBackground() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ToolStripGradientBegin() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ToolStripGradientEnd() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Overrides ReadOnly Property ToolStripGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Orange

        End Get

    End Property

    Public Overrides ReadOnly Property MenuItemSelectedGradientBegin() As System.Drawing.Color

        Get

            Return Color.OrangeRed

        End Get

    End Property

    Public Overrides ReadOnly Property MenuBorder() As System.Drawing.Color

        Get

            Return Color.OrangeRed

        End Get

    End Property

    Public Overrides ReadOnly Property MenuItemSelectedGradientEnd() As System.Drawing.Color

        Get

            Return Color.OrangeRed

        End Get

    End Property

    Public Overrides ReadOnly Property ToolStripPanelGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ToolStripPanelGradientEnd() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property OverflowButtonGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property OverflowButtonGradientEnd() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property OverflowButtonGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ToolStripContentPanelGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ToolStripContentPanelGradientEnd() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property CheckBackground() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property CheckPressedBackground() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property CheckSelectedBackground() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonCheckedGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonCheckedGradientEnd() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonCheckedGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonCheckedHighlightBorder() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonCheckedHighlight() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonPressedBorder() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonPressedGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonPressedGradientEnd() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonPressedGradientMiddle() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonPressedHighlightBorder() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonSelectedBorder() As System.Drawing.Color

        Get

            Return Color.Yellow

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonSelectedGradientBegin() As System.Drawing.Color

        Get

            Return Color.Black

        End Get

    End Property

    Public Overrides ReadOnly Property ButtonSelectedGradientEnd() As System.Drawing.Color

        Get

            Return Color.OrangeRed ProfessionalColorTable

        End Get

    End Property

End Class

هذه الفئة والتي ترث الفئة ProfessionalColorTable وتقوم بإعادة توجيهها (Overrids) او بالأحرى إعادة توجيه الألوان التي تستخدمها بعض الأدوات.

كل ما عليك ان تنشئ كلاسس جديدة وتلصق بها الكود السابق تم ضع الاداة على النموذج وأكتب التالي :

Public Class Form1

    Dim k As New MenuColoring

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.MainMenuStrip.Renderer = New ToolStripProfessionalRenderer(k)

        Me.ToolStrip1.Renderer = New ToolStripProfessionalRenderer(k)

        Me.StatusStrip1.Renderer = New ToolStripProfessionalRenderer(k)

        Me.ContextMenuStrip1.Renderer = New ToolStripProfessionalRenderer(k)

   End Sub

     Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

        Dim R As New RectangleF(0, 0, Me.Width, Me.Height)

        Dim FirstColor As Color = Color.OrangeRed

        Dim SecoudColor As Color = Color.Yellow

        Dim BrushName As New LinearGradientBrush(R, FirstColor, SecoudColor, _

        LinearGradientMode.Vertical)

        e.Graphics.FillRectangle(BrushName, New Rectangle(0, 0, Me.Width, Me.Height))

    End Sub

End Class

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

طبعا حسن اختيارك للأوان يترتب عليه ظهور القائمة بمظهر مناسب.

كما في الحدث Paint قمت بعمل تدرج من الألوان لخلفية النموذج.

وهذه محاولة سريعة مني كانت هذه هي نتيجتها.

طبعاً الأزرار والروابط وغيرها عدلت في ألوانها عن طريق نافذة الخصائص لتتلاءم مع ألوان القائمة.


الأدوات Tolls

الأداة | NotifyIcon
وظيفته | تستخدم في اظهار ايقونة بشريط المهام لنظام التشغيل
المثال على كيفية الاستخدام |

لماذا اقوم بذلك...؟

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New NotifyIcon

        Value.Icon = Me.Icon

        Value.Visible = True

    End Sub

End Class

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

وألان ماذا اذا أردت ان تظهر رسالة من هناك، ان ظهور رسالة بها سهم صغير يشير الى أيقونة برنامجك يعني انها تتبع هذا البرنامج، الكثير من البرامج تستخدم هذه الطريقة.

أضف زراً الى النموذج وفي الحدث Click أكتب التالي:

 Public Class Form1

    Dim Value As New NotifyIcon

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Value.Icon = Me.Icon

        Value.Visible = True

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Value.BalloonTipIcon = ToolTipIcon.Info

        Value.BalloonTipText = "هذا مثال عن هذا النوع من رسائل شريط المهام"

        Value.BalloonTipTitle = "العنوان"

        Value.ShowBalloonTip(12)

    End Sub

End Class

أولاً لاحظ اننا نقلنا التعريف التالي الى قسم التصاريح العامة حتى نتمكن من التعامل معه على مستوى هذه الـ Class

Dim Value As New NotifyIcon

في حدث الزر اخترنا نوعية الإيقونة، والنص الذي سيظهر، والعنوان، تم قمنا بعرض الرسالة مع رقم يمثل مدة عرض هذه الرسالة

كما لا يجب ان تنسى قتل هذا الكائن او أنهاء مهمته عند اغلاق البرنامج حتى لاتبقى الايقونة عالقة بشريط المهام أنظر التالي

 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        Value.Dispose()

    End Sub

ويمكنك أختيار حدث FormClosing كما بالكود السابق

يمكنك كذلك استعمال قائمة تظهر لدى النقر على الايقونة كما بالشكل التالي :

 Value.ContextMenuStrip = Me.ContextMenuStrip1

طبعا بداية يجب عليك اضافة القائمة ContextMenuStrip الى النموذج.

أما عن كيفية التعامل معها فلها درس خاص بها يمكنك مراجعته.

وبالنهاية عند النقر بزر الفأرة الايمن على الايقونة بشريط المهام نحصل على قائمتنا أنظر للشكل التالي :

كما يمكنك ادراج الاداة من شريط الادوات بدل الطريقة البرمجية التي اتبعناها هنا ومن نافذة الخصائص يمكنك تحديد القائمة

أنظر للشكل التالي :

لاحظ قائمتنا انها هناك، كما يمكنك تحديد كل الخصائص التي تحدثنا عنها سابقاً يدوياً من هنا ولست مضطراً الى كتابتها برمجياً.


الأدوات Tolls

الأداة | NumericUpDown
وظيفته | أداة للحصول على رقم ورفعه وخفظه عن طريق الفأرة.
المثال على كيفية الاستخدام |

وباي لحظة اردت ان تعرف قيمته افعل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(NumericUpDown1.Value)

    End Sub

End Class

ان الخاصية Increment تمكنك من تحديد القيمة التصاعدية والتنازلية عند تغيير القيمة.فلو جعلتها أربعة مثلا فسيتم زيادة القيمة باربعة.

كما ان الخاصية Maximum تحدد اعلى قيمة من الممكن ان تصل لها الاداة ولن تتجوزها.

كما ان الخاصية Minimum تحدد أقل قيمة .

وايضاً الخاصية Dechmal Place تمكننا من جعل القيمة عشرية للاداة.

والرقم الذي نضعه هنا يشير الى الاصفار ناحية اليمين، فلو وضعنا الرقم 2 مثلا قسيكون الناتج هو 0.00

وطبعاً اذا كان معدل التزايد رقم واحد صحيح فلن يمكنك رؤية القيمة العشرية تتغير.

لذلك أجل الخاصية increment تساوي 0.01 وجرب البرنامج.


الأدوات Tolls

الأداة | Open File Dialog
وظيفته | يستخدم لتحديد ملف
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Dim value As New OpenFileDialog

        If value.ShowDialog = Windows.Forms.DialogResult.OK Then

            MsgBox(value.FileName)

        End If

    End Sub

End Class

اذا نقر المستخدم زر فتح نقوم باستقبال المسار في المتغير FileName

ولكن ينقصك شئ أخر أنظر المثال التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As New OpenFileDialog

        value.Title = "Open File"

        value.Filter = "Text File|*.txt"

        If value.ShowDialog = Windows.Forms.DialogResult.OK Then

            MsgBox(value.FileName)

        End If

    End Sub

End Class

أضفنا له ما هو العنوان المطلوب ظهوره لنافذة فتح الملفات، وايضاً ماهي انواع الملفات المطلوب فتحها، ويمكنك استخدام العديد من انواع الملفات بالشكل التالي:

أكتب النص الذي تريد ظهوره دالاً على نوع الملفات مثل Text File تم العلامة | تم txt.* تم عرمة النجمة تم نقطة تم أمتداد الملف.

ولنظيف امتداداً أخر تابع السطر السابق أكتب العلامة | تم مثلاً Picture تم العلامة | تم Jpg.*

واستمر بهذه الطريقة حتى تظيف كل الامتدادات أنظر الشكل التالي:

value.Filter = "Text File|*.txt|Image|*.Bmp|Picture|*.jpg"

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

كما يمكنك اجبار المستخدم على الانتقال الى مجلد او مسار معين عند تشغيل الاداة عن طريق كتابة المسار في الخاصية InitialDerictory

يمكنك كذلك كتابة اسم ملف افتراضي ليظهر لحظة التشغيل عن طريق الخاصية FileName

الأداة | Save File Dialog
وظيفته | يستخدم لتحديد لفتح نافذة حفظ الملفات
المثال على كيفية الاستخدام |

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Dim value As New SaveFileDialog

        value.Title = "Save File"

        value.Filter = "All File|*.*"

        If value.ShowDialog() = Windows.Forms.DialogResult.OK Then

            MsgBox(value.FileName)

        End If

    End Sub

End Class

بنفس الطريقة السابقة نحصل على مسار حفظ الملف ونقوم بحفظه هناك.

الأداة | ColorDialog
وظيفته | فتح نافذة لاختيار اللون
المثال على كيفية الاستخدام |

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As New ColorDialog

        If value.ShowDialog = Windows.Forms.DialogResult.OK Then

            Me.BackColor = value.Color

        End If

    End Sub

End Class

لاجديد من ناحية المتغيرات واختبار القيمة المختارة، الخاصية Color تعود باللون المختار وهذا كل شئ.

توجد خاصية اخرى وهي Full Open وهي تقوم على عرض صندوق الالوان بكامل خياراته كما بالشكل التالي:

انتقل الى نافذة الخصائص واجعل قيمتها تساوي True

الأداة | FontDialog
وظيفته | فتح نافذة لاختيار نوعية خط معين
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Dim value As New FontDialog

        If value.ShowDialog = Windows.Forms.DialogResult.OK Then

            Me.Font = value.Font

        End If

    End Sub

End Class

أيضا لا جديد، الخاصية Font تعود بنوعية الخط المختار

ويمكنك عن طريق الخاصية Show Color ان تجعل بالإمكان تحديد لون الخط من صندوق الاختيار، كما ان الخاصية Show effects تمكنك من عرض او عدم عرض بعض الخصائص مثل تحته خط

الأداة | FolderBrowserDialog
وظيفته | تستخدم لتحديد مسار مجلد
المثال على كيفية الاستخدام |

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      Dim value As New FolderBrowserDialog

        If value.ShowDialog = Windows.Forms.DialogResult.OK Then

            MsgBox(value.SelectedPath)

        End If

    End Sub

End Class

الخاصية Selectedpath تعود بمسار المجلد المحدد


الأدوات Tolls

الأداة | PictureBox
وظيفته | تستخدم لعرض صورة
المثال على كيفية الاستخدام |

اضف PictureBox الى النموذج ودع اسمها الافتراضي كما هو:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New Bitmap("Full Path File Name")

        PictureBox1.BackgroundImage = Value

    End Sub

End Class

لوضع صورة يمكنك استخدام الخاصية BackgroundImage ولكن قبلها عليك جلب الصورة بمعلومية المسار الكامل للصور مثلاً C:\MyImage.Bmp

ووضع الصورة بالقيمة Value تم اسنادها الى الخاصية BackgroundImage

كما يمكنك فعل ذلك عن طريق الخاصية Image كما بالشكل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New Bitmap("Full Path File Name")

        PictureBox1.Image = Value

    End Sub

End Class

وتجدر هنا الملاحظة ان الخاصية Image مفيدة بحال أردت ان تضع بالصورة صورة من نوع Gif تلك الصور المتحركة، حيث يمكنك رؤية هذه الحركة، ولكن اذا استخدمت الخاصية BackgroundImage فلن تتمكن من رؤية الحركة بالصورة.

كما تمتلك الصورة الخاصية BackgroundImageLayout وهي تمكنك من التحكم في طريقة عرض الأداة للصورة.

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PictureBox1.BackgroundImageLayout = ImageLayout.None

        PictureBox1.BackgroundImageLayout = ImageLayout.Center

        PictureBox1.BackgroundImageLayout = ImageLayout.Stretch

        PictureBox1.BackgroundImageLayout = ImageLayout.Tile

    End Sub

End Class

مثلاً هل تريدها في المنتصف، ام تريد ان يتم تمديدها على حسب حجم الصورة، ام تريد ان يتم تكرارها.


الأدوات Tolls

الأداة | PrintPreviewDialog
وظيفته | تقوم بعرض مستند لغرض الطباعة
المثال على كيفية الاستخدام |

حقيقة هذه الأداة لا يمكنها العمل لوحدها وإنما تعمل مع بعض الأدوات الأخرى.

ولفهم الموضوع يجب ان أخذك في مشروع خطوة بخطوة.

أنشئ مشروعاً جديداً تم اسقط عليه الأدوات التالية :

PrintPreviewDialog

PageSetupDialog

PrintDialog

PrintDocument

PrintPreviewControl

تم اسقط أربعة أزرار والأداة RichTextBox واكتب فيها أي نص وسيكون البرنامج بالشكل التالي:

كما تشاهد بالأسفل الأدوات التي أسقطناها وهي غير مرئية الا أداة واحدة وهي الأداة PrintPreviewControl والتي تراها تملئ النموذج.

طبعاً انت لا تحتاج الى كل هذه الأدوات ولكن أردت ان اجمعها معاً هنا حتى تأخذ فكرة كاملة عن الموضوع ، خاصة وانها لها علاقة ببعضها البعض.

ان الأداتين PrintPreviewControl وكذلك الأداة PrintPreviewDialog هما المسئولتان عن إظهار معاينة الطباعة.

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

وكلا الأداتين لا تظهران ان أي ما لم تكن مرتبطتان بمستند وهو هنا PrintDocument وهو المستند الذي سوف نقوم بإظهاره.

ويجب ربط الأداتين بهذا المستند عن طريق الخاصية Document .

الأداة PageSetupDialog أيضا تحتاج إلى ان نحدد لها المستند الذي سوف تتعامل معه وهي مسئولة عن إعداد الصفحة بالشكل المطلوب.

وهذه صورة عن الخاصية وكيفية تحديد المستند المطلوب كما بالشكل التالي:

اذا قمت بعدها باستدعاء او تشغيل هذه الأداة عن طريق الأمر التالي بعد ان تكتبه بالزر الخاص بها:

   PageSetupDialog1.ShowDialog()

فعندها ستحصل على هذه النافذة أنظر للشكل التالي :

طبعاً هذه النافذة مشهورة وغنية عن التعريف ومن خلالها يمكننا التحكم بخصائص المستند الذي نتعامل معه ألان.

وبالمثل تماماً فيما يخص الـ PrintDialog يتم ربطه بالمستند واذا كتبت بالزر الخاص بها كما بالشكل التالي وشغلته :

  PrintDialog1.ShowDialog()

فسيمكننا رؤية هذه النافذة :

وهي النافذة الخاصة بالطباعة وهي غنية عن التعريف وأشهر من نجوم بيضاء في علم.

وبالمثل تماماً اذا قمت بربط الأداة PrintPreviewDialog1 وكتب بالزر الخاص بها الأمر كما بالشكل التالي وشغلته:

PrintPreviewDialog1.ShowDialog()

فستحصل على النافذة التالية:

طبعاً المستند خالي تماماً لأننا وحتى الأن لم نقم بالتعامل مع المستند PrintDocument وكل ما فعلناه هو ربطه بهذه الأدوات فقط.

ألان جاء الدور للتعامل مع المستند .

أنقر عليه نقرتين لتنتقل إلى الحدث التالي وكما بالشكل واكتب ما تراه:

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim rectDraw As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, _

         e.MarginBounds.Width, e.MarginBounds.Height)

        Dim PrintFont As New Font("Arial", 10)

        Dim strFormat As New StringFormat

        strFormat.Trimming = StringTrimming.Word

        e.Graphics.DrawString(Me.RichTextBox1.Text, PrintFont, _

         Brushes.Black, rectDraw, strFormat)

    End Sub

حسناً الان فقط قد دخلنا في صلب الموضوع .

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

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

وكذلك تهيئة شكل النص الذي سنستخدمه.

وأخيرا رسم النص الموجود في الأداة RichTextBox بالخط الذي عرفناه وبفرشاة الرسم السوداء وبشكل النص الذي عرفناه كذلك.

ضع اي نص في الأداة RichTextBox .

ولنعد قليلاً الى حيث كنا نعد المشروع من قبل وقلت لك اجعل البرنامج يكون بهذا الشكل:

لاحظ إنني أضع بالأداة نص ما وهو ما نريد ان نعرضه للمعاينة.

حسناً اذا قمت بكل الخطوات السابقة فسيكون الكود كاملا كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        PrintPreviewDialog1.ShowDialog()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        PageSetupDialog1.ShowDialog()

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

        PrintDialog1.ShowDialog()

    End Sub

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim rectDraw As New RectangleF( _

         e.MarginBounds.Left, e.MarginBounds.Top, _

         e.MarginBounds.Width, e.MarginBounds.Height)

        Dim PrintFont As New Font("Arial", 10)

        Dim strFormat As New StringFormat

        strFormat.Trimming = StringTrimming.Word

        e.Graphics.DrawString(Me.RichTextBox1.Text, PrintFont, _

         Brushes.Black, rectDraw, strFormat)

    End Sub

End Class

ألان قم بإخفاء الأداة RichTextBox و شغلت البرنامج ستحصل على الشكل التالي:

طبعاً هذه الأداة وكما تشاهد تقوم بعرض المعاينة على النموذج وتحتاج لمزيد من التدخل اليدوي مثل ان نضيف خيارات التحكم كتكبير العرض والطباعة وغيرها.

ولكن اذا نقرت على الزر PrintPreviewDialog فستشاهد هذه النافذة :

طبعاً هي نافذة مستقلة وتحتوي كل الخيارات من تكبير مساحة العرض والطباعة والانتقال بين الصفحات وغير ذلك.

هذا فيما يخص طباعة النصوص طبعاً يمكنك طباعة الصور والإيقونات والخطوط والدوائر وغيرها فقط غير في صيغة الأمر كما بالشكل التالي:

لاحظ كل تلك الطرق التي تبدءا بالكلمة Draw وبعدها ما تريد ان ترسمه.

لنأخذ مثالاً عن طباعة صورة أنظر للشكل التالي:

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim k As Image = Image.FromFile("D:\profisonal work\untitled6.bmp")

        e.Graphics.DrawImage(k, 3, 6)

    End Sub

فستكون النتيجة كما بالشكل التالي:

طبعاً توجد العديد من الخيارات التي تحتاج منك الى جهد ووقت لمتابعتها وتجربتها ولكن هذه اهم الخطوات التي يجب ان تتعلمها.


الأدوات Tolls

الأداة | ProgressBar
وظيفته | أنه مؤشر يستخدم للدلالة على حالة سير عملية ما
المثال على كيفية الاستخدام |

هل رأيت تلك المؤشرات التي تظهر عند قيامك بنسخ مجموعة من الملفات وتبدأ في الامتلاء بلون معين، عندما يمتلئ كل الأنبوب تنتهي العملية، انه هو نفسه ProgressBar

تمتلك هذه الاداة خاصية Value وهي تحدد القيمة الحالية للاداة، كما تمتلك الخاصية Maximum وهي تحدد اعلى قيمة يمكن للاداة ان تصل اليها، كما تمتك الخاصية Minimum وهي تحدد القيمة الادنى التي ستبدأ منها الاداة.

الان ضع اداة ListBox وايضا Button وايضا ProgressBar على النموذج واكتب التالي في الحدث Click الخاص بالـ Button

 Imports System.Collections.ObjectModel

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim files As ReadOnlyCollection(Of String)

        Dim Value As Integer

        files = My.Computer.FileSystem.GetFiles("C:\Windows", FileIO.SearchOption.SearchAllSubDirectories, "*.*")

        ProgressBar1.Maximum = files.Count - 1

        For Value = 0 To files.Count - 1

            ListBox1.Items.Add(files.Item(Value).ToString)

            ProgressBar1.Value = Value

        Next

    End Sub

End Class

لقد استخدمنا هذه السطور الأولى سابقاً في تعبئة الأداة ListBox بكل مسارات الملفات الواقعة في المجلد Windows ولكن ماذا عن السطر هذا:

ProgressBar1.Maximum = files.Count - 1

أننا نخبر الأداة بان القيمة القصوى لها يجب ان تكون هي نفسها كل عدد الملفات التي سوف نتعامل معها، فان كانت 100 فيجب ان تكون القيمة القصوى 100

تم استخدمنا العبارة For للقيام بتكرار يعتمد على عدد الملفات المراد التعامل معها، وبعدها قمنا بوضع اسم الملف ومساره في الأداة.

وأخيراً علينا ان نضع للأداة ProgressBar القيمة التي وصلنا لها حتى الآن وهي قيمة تصاعدية.

والنتيجة انك سترى هذا الخط او الأنبوب يمتلئ بلون معين حتى وعندما يصل الى النهاية يكون متزامناً وصوله مع انتهائنا من تعبئة الأداة ListBox بأسماء الملفات.

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

وعند تنفيذك لهذا المثال سوف يستغرق بعض الوقت، أي حوالي 15 ثانية وينتهي من عمله ولكن سيمكنك رؤية تقدم المؤشر، هذه هي الفكرة الرئيسية ويمكنك استخدامها كما تشاء وبالشكل الذي يناسبك.

وهناك طريقة اخرى لست مجبراً فيها على تحديد متى سينتهي عملك ، ويضل المؤشر يتحرك حتى تنتهي من العمل أنظر الشكل التالي:

ProgressBar1.Style=ProgressBarStyle.Marquee

عند تغييرك لخاصية Style بهذا الشكل سيظل المؤشر يتحرك دائماً وعندما يصل النهاية سيعود الى البداية من جديد وهكذا، ولكني لا احب هذه الطريقة، لان البرنامج قد يتوقف عن الاستجابة ولا يعلم المستخدم بذلك ويهدر كثير من الوقت حتى يفيق الى ان هناك امراً غير طبيعي بالبرنامج.


الأدوات Tolls

الأداة | PropertyGrid
وظيفته | تستخدم لعرض خصائص اي كلاسس
المثال على كيفية الاستخدام |

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

بداية سنتعرف كيف يمكننا ربط هذه الاداة بخصائص اي Class .

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

سوف تظهر لك اسماء كل الادوات التي قمت بوضعها على النموذج، فمثلا يمكنك تحديد اسم النموذج.

شغل البرنامج الان وانظر ما الذي ستحصل عليه، يمكنك التغيير في اي خاصية ومراقبة النتائج، طبعاً يمكن الاستفادة من هذه الطريقة كثيرا في برامجنا وباشكال مختلفة.

حسناً ربما لا تريد ان تظهر هذه الاداة الا ما تريده انت فقط.

او ظهور خصائص معينة.

جميل جدا، والامر في غاية البساطة فكل ما علينا هو انشاء Class جديد يحتوي على الخصائص التي نريدها.

انشئ مشروع جديد او دع المشروع الاول مفتوح واضف له Class جديد.

طبعاً انت تعرف كيف تفعل ذلك واخبرتك بمكان غير هذا المكان، على العموم من القائمة العلوية Project حدد الخيار Add Class سيظهر لك مربع حوار اكتب الاسم الجديد للـ Class او دعه كما هو وبألاسم الافتراضي وهو Class1 وانتقر Add.

Public Class Class1

End Class

ما ستحصل عليه سيكون كما بالشكل السابق وانا هنا تركت اسم الـ Class كما هو ويحمل الاسم Class1

طبعا بمكان غير هذا المكان شرحت الطريقة لاظافة خصائص واجراءات تركيبات وغيرها الى اي Class وبخاصة في دروس التعامل مع ادوات User Control .

والان اكتب في هذه الـ Class الكود التالي او قم بنسخه ولصقه هناك كما بالشكل التالي:

Public Class Class1

    Public Enum Lng

        Arabic

        English

        Deuth

        Fransh

        Comaco

        China

    End Enum

    Public Property Language() As Lng

        Get

        End Get

        Set(ByVal value As Lng)

        End Set

    End Property

    Public Property Color() As Color

        Get

        End Get

        Set(ByVal value As Color)

        End Set

    End Property

    Public Property Picture() As Bitmap

        Get

        End Get

        Set(ByVal value As Bitmap)

        End Set

    End Property

    Public Property Text() As String

        Get

        End Get

        Set(ByVal value As String)

        End Set

    End Property

End Class

مجموعة من الخصائص واستخدمت مع احدها التركيب الذي تراه فوق لاظهار اداة منسدلة تحوي مجموعة من اللغات ليقوم المستخدم بتحديد احدها.

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

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim mytools As New Class1

        PropertyGrid1.SelectedObject = mytools

    End Sub

End Class

عرفنا متغير جديد بالاسم mytools مشتقاً من الـ Class التي انشأناها تم اسندناه الى الاداة عن طريق الخاصية SelectedObject والان شغل البرنامج لتحصل على التالي.

بهذا الشكل يمكنك التعامل مع الاداة كما تشاء، طبعاً لازال الموضوع يحتاج الى بعض العمليات وكتابة بعض الكود لاجراء تعديلات احترافية على العمل.

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

واذا اردت التفاعل مع الاداة او مع التغييرات التي يحدتها المستخدم فانتقل الى الحدث التالي.

Private Sub PropertyGrid1_PropertyValueChanged(ByVal s As Object, ByVal e As System.Windows.Forms.PropertyValueChangedEventArgs) Handles PropertyGrid1.PropertyValueChanged

End Sub

للوصول الى هذا الحدث انقر على الاداة نقرتين تم من نافذة الاحداث المنسدلة بالركن العلوي الى جهة اليمين حدد الحدث PropertyValueChanged

ومن هنا يمكنك قنص اي تغيير يحدث باي خاصية.

e.ChangedItem

e.OldValue

العبارة الاولى سوف تعيد لك القيمة المتغيرة ، اما الثانية فتعيد لك القيمة القديمة والتي كانت تحتويها الخاصية.

كما ان هذا حدث يتم تنفيذه بحال قمت بتغيير الـ Class او قمت بتحويل الاداة لتمسك بخصائص اداة ثانية.

Private Sub PropertyGrid1_SelectedObjectsChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles PropertyGrid1.SelectedObjectsChanged

End Sub

لترى مثالا اخر وتدرسه انسخ هذا الكود وقم باستبدال محتويات الـ Class1 به كما بالشكل التالي:

Imports System.ComponentModel

Public Class Class1

    Private _ApplicationSize As Size

    Private _ApplicationLocation As Point

    Private _ApplicationFont As System.Drawing.Font

    Private _FontColor As System.Drawing.Color

    Private _ApplicationIcon As System.Drawing.Icon

    Private _ApplicationCursor As System.Windows.Forms.Cursor

    Private _ApplicationLangugae As System.Globalization.CultureInfo

    '''

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد حجم التطبيق")> _

    Public Property ApplicationSize() As Size

        Get

            Return _ApplicationSize

        End Get

        Set(ByVal Value As Size)

            _ApplicationSize = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد موقع التطبيق")> _

    Public Property ApplicationLocation() As Point

        Get

            Return ApplicationLocation

        End Get

        Set(ByVal Value As Point)

            _ApplicationLocation = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد الخط للتطبيق")> _

    Public Property ApplicationFont() As System.Drawing.Font

        Get

            Return _ApplicationFont

        End Get

        Set(ByVal Value As System.Drawing.Font)

            _ApplicationFont = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد لون الخط")> _

    Public Property FontColor() As System.Drawing.Color

        Get

            Return _FontColor

        End Get

        Set(ByVal Value As System.Drawing.Color)

            _FontColor = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد ايقونة للتطبيق")> _

    Public Property ApplicationIcon() As System.Drawing.Icon

        Get

            Return _ApplicationIcon

        End Get

        Set(ByVal Value As System.Drawing.Icon)

            _ApplicationIcon = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد مؤشر للتطبيق")> _

    Public Property ApplicationCursor() As System.Windows.Forms.Cursor

        Get

            Return _ApplicationCursor

        End Get

        Set(ByVal Value As System.Windows.Forms.Cursor)

            _ApplicationCursor = Value

        End Set

    End Property

    <CategoryAttribute("Design"), DefaultValueAttribute(""), _

    DescriptionAttribute("حدد لغة المستخدم")> _

    Public Property ApplicationLangugae() As System.Globalization.CultureInfo

        Get

            Return _ApplicationLangugae

        End Get

        Set(ByVal Value As System.Globalization.CultureInfo)

            _ApplicationLangugae = Value

        End Set

    End Property

End Class

هذا المثال فقط لزيادة توضيح الفكرة ويمكنك الالمام بالـ Attribute الستخدمة هنا بمكان غير هذا المكان حيث نتحدث عنها بشكل مفصل.


الأدوات Tolls

الأداة | CheckBox
وظيفته | تستخدم للاحتفاظ بقيمة True أو False
المثال على كيفية الاستخدام |

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        If CheckBox1.Checked = True Then

            MsgBox("الإجابة نعم")

        Else

            MsgBox("الإجابة لا")

        End If

    End Sub

End Class

حسناً اننا نختبر الاداة هل قيمتها هي صح ام لا أي True أم False ونظهر أجابة هذا السؤال.

ولتغيير القيمة برمجياً نفعل التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        CheckBox1.Checked = True

        CheckBox1.Checked = False

    End Sub

End Class

بالسطر الاول: جعلنا قيمتها True، وبالسطر الثاني جعلنا قيمتها False

الأداة | RadioButton
وظيفته | تستخدم للاحتفاظ بقيمة True أو False
المثال على كيفية الاستخدام |

انها كالأداة السابقة ولكن اذا جعلتها True فلن تستطيع جعلها False وقت التشغيل بزر الفأرة، وهي وجدت لتعمل مع مجموعة اخوات لها، فعنما تجعل قيمة احدها True يصبح الاخريات جميعاً False

لذلك ضع منها ثلاث أدوات على النموذج، وجرب التغيير في خاصية Checked وراقب النتيجة.


الأدوات Tolls

الأداة | RichTextBox
وظيفته | تستخدم لاظهار النصوص المنسقة
المثال على كيفية الاستخدام |

ما هي النصوص المنسقة، حسناً ضع الاداة على النموذج تم اذهب الى محرر الكود وانسخ اي كود مكتوب هناك وشغل البرنامج تم ضع مؤشر الفارة داخل الاداة واضغط المفاتيح Ctrl + V

وهذا ما يمكنك ان تراه.

لقد تم نسخ الكود بالألوان وبنفس حجم الخط ونوعه، أنه نص منسق، والأداة تقبل التعامل مع النصوص المنسقة.

حسناً ماهي الخصائص المهمة والتي يمكن ان نتعامل معها:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If RichTextBox1.CanUndo Then

            RichTextBox1.Undo()

        End If

End Sub

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

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If RichTextBox1.CanRedo Then

            RichTextBox1.Redo()

        End If

End Sub

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

 RichTextBox1.Clear()

تقوم بمسح كل النص الموجود بالاداة.

 RichTextBox1.ClearUndo()

تقوم بمسح كل العمليات المخزنة لعلميات التراجع، بحيث لن يمكنك التراجع عن اي تعديل.

RichTextBox1.SelectAll()

RichTextBox1.DeselectAll()

تقوم بتحديد كامل النص، والاخرى تقوم بالغاء التحديد

  RichTextBox1.Copy()

  RichTextBox1.Cut()

  RichTextBox1.Paste()

الاولى تقوم بنسخ النص المحدد، والثانية بقصه، والثالثة تقوم بلصق النص الموجود بالحافظة.

  RichTextBox1.SaveFile("C:\Test.rtf")

تقوم بحفظ النص الى ملف على جهاز الكمبيوتر مطلوب منك مسار الحفظ واسم الملف وامتداده فقط

  RichTextBox1.LoadFile("C:\Test.rtf")

تقوم بتحميل ملف من النسار المحدد الى الاداة.

 RichTextBox1.SelectionAlignment = HorizontalAlignment.Center

 RichTextBox1.SelectionAlignment = HorizontalAlignment.Left

 RichTextBox1.SelectionAlignment = HorizontalAlignment.Right

تقوم بمحاذاة النص المحدد الى الوسط الى اليسار الى اليمين على الترتيب.

 RichTextBox1.SelectedText

تشير الى الن المحدد حيث يمكنك معرفة عدد الحروف المحددة مثلاً، او على الاقل معرفة هل هناك نص محدد ام لا، ومثل عملي لا يمكنك تفعيل الزر نسخ الا اذا كان النص المحدد على الاقل هناك حرف واحد محدد بالفعل والا فليس هناك داع لعملية النسخ أو زر النسخ، مثال عملي على ذلك:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If RichTextBox1.SelectedText.Length > 0 Then

            RichTextBox1.Copy()

        End If

 End Sub

لاحظ كيف نتاكد من عدد الحروف المحددة عن طريق الخاصية Length

 RichTextBox1.SelectionBackColor = Color.Beige

استخدم هذه الخاصية لتغيير لون الخلفية للنص المحدد باي لون تريده.

 RichTextBox1.SelectionBullet = True

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

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If RichTextBox1.SelectionLength > 0 Then

            RichTextBox1.Copy()

        End If

    End Sub

تعود لك بعدد الحروف المحددة أيضاً

 RichTextBox1.WordWrap = True

استخدم هذه الخاصية لجعل النص قابل للالتفاف بداخل الاداة او لا.

حسناً هذه بعض اهم الخصائص في هذه الاداة، واذا اردت ان ترى الكود الذي يعمل وراء على تنسيق النص فقم بلصق كود منسق كما قمنا بالسابق واكتب التالي:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(RichTextBox1.Rtf)

End Sub

حيث سيتم عرض النتيجة كما بالرسالة التالي:

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

ولاحظ انه يتم تعريف بعض المتغيرات فوق، بعض الألوان ونوع الخط وحجمه، تم يتم وضع الكلمات بين الوسوم المطلوب، مثلاً C1 اذا تم وضع جملة بينه يتم تغييرها الى اللون الازرق

كما توجد الخاصية Scroll Pars وهي تمكنك من مشاهدة أداتي الانزلاق الافقي والعمودي الخاصتين بالأداة، يمكنك تحديد اظهارهما الاثنتين او احدهما او بلا.

أما الخاصية Detect Urls فهي تمكن او لا تمكن الاداة من التعرف على الروابط بين النصوص وبالتالي تحديدها بسماتها الخاصة أنظر للتالي:

طبعاً يمكن استخدام مفاتيح الاختصار المشهورة للنسخ واللصق والقص وتحديد الكل على الاداة.

ولكن يمكنك إلغاء ذلك او تمكينه من الخاصية التالية ShortCut Enabled

كما يمكننا فتح الارتباط عند النقر كما بالشكل التالي :

     Dim p As New System.Diagnostics.Process

    Private Sub RichTextBox1_LinkClicked _

       (ByVal sender As Object, ByVal e As _

       System.Windows.Forms.LinkClickedEventArgs) _

       Handles RichTextBox1.LinkClicked

        p = System.Diagnostics.Process.Start("IExplore.exe", e.LinkText)

    End Sub


الأدوات Tolls

الأداة | TabControl
وظيفته | لعرض الادوات في شكل صفحات متعددة
المثال على كيفية الاستخدام |

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

عند إضافة الأداة على النموذج والنقر على السهم الصغير وظهور الـ Editor الخاص بها كما بالشكل التالي :

سيمكنك ان ترى الخيار الأول Add Tab والذي يقوم على إنشاء صفحة جديدة.

وكذلك الخيار Remove Tab والذي يقوم على حذف الصفحة المحددة.

ان هذه الصفحات من الممكن ان تحمل إيقونات او صور تعبر وتدل على وظيفتها.

أولا يجب إضافة أداة ImageList ووضع الصور بها، اذا لم تكن تعرف كيف راجع الدرس الخاص بهذه الأداة.

بعدها انقر على الأداة من الناحية العلوية وليس على الصفحات ومن نافذة الخصائص ابحث عن الخاصية ImageList كما بالشكل التالي :

منها حدد الأداة ImageList كما ترى لنستطيع الوصول الى الإيقونات التي فيها.

بعدها أنقر على كل صفحة ومن نافذة الخصائص لها أبحث عن الخاصية ImageIndex كما بالشكل التالي:

وحدد الإيقونة المناسبة وستكون النتيجة كالتالي:

توجد لهذه الاداة الخاصية Muilti Line وهي تحدد هل من الممكن جعل الاداة تقوم بعرض متتالي ام متوازي انظر للشكل التالي:

هذا بحال كانت القيمة True :

كما توجد الخاصية Appearince جرب ان تغيير فيها لانها ستقوم بالتغيير في الشكل فقط :

والخاصية Alignment والتي ستقوم بعرض رؤوس الصفحات من عدة اتجاهات حسب الطلب.

من الأشياء التي قد تحتاجها برمجياً هو تحديد احد هذه الصفحات بهذا الشكل :

 TabControl1.SelectedIndex = 1

حيث الرقم هو فهرس الصفحة وأول صفحة تحمل الرقم صفر.

او بهذه الطريقة :

 TabControl1.SelectTab(2)

وهذا يقوم على مسح كل الصفحات :

 TabControl1.TabPages.Clear()

يعود لنا بعدد الصفحات :

 MsgBox(TabControl1.TabPages.Count)

حذف صفحة بمعلومة رقم فهرسها :

 TabControl1.TabPages.RemoveAt(2)

وكذلك إضافة صفحة جديدة :

 TabControl1.TabPages.Add("Home")

بشكل اخر المفتاح + العنوان + رقم فهرسة الأيقونة :

 TabControl1.TabPages.Add("", "Home", 1)

وكذلك حشر صفحة بين صفحات :

 TabControl1.TabPages.Insert(2, "Sleep")

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

أو يمكن بهذا الشكل مع مزيد من الخيارات :

 TabControl1.TabPages.Insert(2, "", "Sleep", 1)

حتى الان لازلنا نتعامل مع رؤوس الصفحات .

وبهذا المثال يمكننا الوصول الى الصفحة نفسها أنظر للشكل التالي :

 TabControl1.TabPages.Item(1).BackColor = Color.BlueViolet

فتكون النتيجة كما بالشكل التالي :

كما يوجد الكثير لتعمل معه ومع الـ Item .

كما يمكنك اضافة الصفحات واضافة الكنترول اليها أنظر للشكل التالي :

 Public Class Form1

    Dim Myinteger As Integer = 1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TabControl1.TabPages.Clear()

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim k As New RichTextBox

        k.Dock = DockStyle.Fill

        k.Text = "Document" & Myinteger

        TabControl1.TabPages.Add("Document" & Myinteger)

        TabControl1.TabPages.Item(TabControl1.TabPages.Count - 1).Controls.Add(k)

        TabControl1.SelectTab(TabControl1.TabPages.Count - 1)

        Myinteger += 1

    End Sub

End Class

اضف زراً جديداً مع الاداة وانسخ هذا الكود والصقه بمحرر الكود وشغل البرنامج ولاحظ النتيجة .

 TabControl1.SelectTab(2)


الأدوات Tolls

الأداة | TextBox
وظيفته | تستخدم لإظهار النصوص والتعامل معها
المثال على كيفية الاستخدام |

لن تجد برنامجاً لا يحتاج الى هذه الأداة .

فيمكننا عن طريقها مثلا إدخال النصوص الى قاعدة البيانات وإظهارها من قواعد البيانات كذلك.

يمكننا التعامل مع النص من خلال الخاصية Text كما بالشكل التالي :

Me.Text = Me.TextBox1.Text

لعل من أهم الخصائص لهذه الأداة الخصائص التالي :

الخاصية | وظيفتها
Mulitiline | لجعل الأداة تقبل تعدد الأسطر فيها
Maxlength | الحد الأقصى من الحروف المسموح بإدخالها في هذه الأداة
Lines | تعود بمصفوفة تمثل قيم كل سطر في حالة تعدد الأسطر
Password char | الرمز الذي يجب استخدامه ليحل محل كل حرف ويفيد في إخفاء العبارات عن الآخرين وخاصة بحال إدخال كلمات المرور وما شابه
Read only | جعل هذه الأداة للقراءة فقط
ScrolPars | لإظهار أشرطة التمرير للأداة عموديا او أفقيا او كلاهما

كما توجد بعض الخصائص المهمة التي يمكن العمل معها من خلال الكود أنظر للشكل التالي :

  Me.TextBox1.AppendText("AAAAAAAAAAA")

  Me.TextBox1.Text = "AAAAAAAAAAAAAAA"

  MsgBox(Me.TextBox1.CanFocus)

  MsgBox(Me.TextBox1.CanSelect)

  MsgBox(Me.TextBox1.CanUndo)

  Me.TextBox1.Clear()

  Me.TextBox1.ClearUndo()

  Me.TextBox1.Copy()

  Me.TextBox1.TextAlign = HorizontalAlignment.Left

  MsgBox(Me.TextBox1.TextLength)

  Me.TextBox1.Undo()

  Me.TextBox1.Visible = True

  Me.TextBox1.WordWrap = False

في السطر الأول تقوم تلك الخاصية بوضع نص بنهاية النص الموجود مسبقاُ بالأداة.

وهي تعمل تماما عمل أحد هذين السطرين

  Me.TextBox1.Text = Me.TextBox1.Text & "AAAAAAAAAAAAAA"

  Me.TextBox1.Text &= "AAAAAAAAAAAAAAA"

حسناً اما السطر الثاني فيقوم بوضع نص في الأداة.

السطر الثالث يعود بقيمة منطقية Ttrue اذا كان بالإمكان نقل التركيز الى الأداة

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

السطر الخامس يعود بقيمة منطقية True اذا كان بالإمكان التراجع عن التغييرات التي حدثت مؤخراً

السطر السادس يقوم بمسح كامل محتويات الأداة ويعمل عمل الكود التالي تماماً.

  Me.TextBox1.Text = ""

السطر السابع يقوم بمسح كل العمليات المخزنة لعمليات التراجع الممكنة.

السطر الثامن يقوم بنسخ النص المحدد الى الحافظة

السطر التاسع يقوم بمحاذاة النص الى الجهة المحددة

السطر العاشر يعود برقم يمثل عدد الحروف المحددة بالأداة.

السطر الحادي عشر يقوم بالتراجع عن أخر تغيير حدث

السطر الثاني عشر يقوم بإظهار او إخفاء الأداة.

السطر الثالث عشر يقوم بتمكين خاصية التفاف النص بالأداة او عدم تمكينها


الأدوات Tolls

الأداة | Timer
وظيفته | تستخدم لتنقيذ امر او مجموعة من الاوامر كل وقت محدد
المثال على كيفية الاستخدام |

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

 Public Class Form1

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Me.Text = Now

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Timer1.Interval = 1000

        Timer1.Enabled = True

    End Sub

End Class

في حدث الـ Form_load قمنا باسناد القيمة 1000 الى الخاصية Interval اي اننا نريد تنفيذ الامر كل ثانية

تم قمنا بتمكين عمل المؤقت والذي اقصد به Timer

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


الأدوات Tolls

الأداة | ToolTip
وظيفته | تستخدم لاظهار تلميح الى المستخدم عند مروره بزر الفأرة على أداة معينة
المثال على كيفية الاستخدام |

حسناً أضف أداة TextBox الى النموذج واكتب التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New ToolTip

        Value.SetToolTip(TextBox1, "أرجوا إدخال الاسم كاملاً")

    End Sub

End Class

ألان شغل البرنامج ومرر الفأرة فوق الأداة بروية وصبر، وسوف تشاهد هذه الرسالة القصيرة.

ولكن هناك بعض الخصائص التي يمكننا العمل معها انظر الشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim Value As New ToolTip

        Value.ToolTipIcon = ToolTipIcon.Info

        Value.IsBalloon = True

        Value.ToolTipTitle = "تلميح"

        Value.SetToolTip(TextBox1, "أرجوا إدخال الاسم كاملاً")

    End Sub

End Class

قمنا هنا بإضافة ايقونة تعبر عن نوعية الرسالة، وتوجد حوالي أربع أنواع لكل واحدة مهمة خاصة بها.

كما قمنا بجعل التلميح يأخذ الشكل الدائري عن طريق IsBalloon

تم أضفنا للأداة عنوان، وهذا كل ما الأمر يمكنك الان تجربة المثال من جديد.

أنظر لنتيجة عملنا:

هذا كل شئ اعتقد ان هذا يفي بالمطلوب.


الأدوات Tolls

الأداة | TreeView
وظيفته | تستخدم لاظهار قوائم متشعبة ومفهرسة للمجموعة من العناصر
المثال على كيفية الاستخدام |

أضف ImageList وهذه الأداة الى النموذج ، قم بإضافة بعض الأيقونات 16-16 الى الأداة ImageList تم أنقر على الأداة TreeView وعلى السهم الصغير وعند ظهور القائمة من الخيار ListImage حدد الاداة ListImage الخاصة بنا.

ملاحظة : يمكنك مراجعة الدرس الخاص بالـ ImageList لزيادة الفهم لهذا الدرس اذا لم تكن قد اتطلعت عليه من قبل.

وألان اكتب الكود التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TreeView1.Nodes.Add("Windows")

        TreeView1.Nodes.Add("Program Files")

        TreeView1.Nodes.Add("Documents and Settings")

    End Sub

End Class

قمنا عن طريق الخاصية Nodes بإضافة هذه العناصر كما بالشكل:

ولكننا نريد إضافة عناصر فرعية الى هذه العناصر اكتب التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TreeView1.Nodes.Add("Windows")

        TreeView1.Nodes.Add("Program Files")

        TreeView1.Nodes.Add("Documents and Settings")

        TreeView1.Nodes(0).Nodes.Add("", "bootstet.dat", 1, 1)

        TreeView1.Nodes(0).Nodes.Add("", "DUMP0b45.tmp", 1, 1)

        TreeView1.Nodes(0).Nodes.Add("", "OEWABLog.txt", 1, 1)

        TreeView1.Nodes(0).Nodes.Add("", "RtlExUpd.dll", 1, 1)

    End Sub

End Class

أنظر الى السطور الجديدة، قمنا عن طريق Nodes وهي التي عن طريقها يمكنك الوصول إلى كل العناصر، وعن طريق فهرس العنصر أمكننا إضافة عناصر فرعية اليها.

اما الأرقام 1-1 فالأولى تحدد الأيقونة المستخدمة والثانية تحدد الأيقونة التي يجب استخدامها لحظة النقر على العنصر، وهما نفس الشئ هنا ويمكنك التغيير طبعاً في الأيقونة.

وهذه هي النتيجة:

لاحظ ظهور علامة + اذا نقرت عليها حصلت على العناصر الفرعية كما بالشكل.

كما يمكنك اضافة عناصر الى اي عنصر فرعي كما بالكود التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        TreeView1.Nodes.Add("Windows")

        TreeView1.Nodes.Add("Program Files")

        TreeView1.Nodes.Add("Documents and Settings")

        TreeView1.Nodes(0).Nodes.Add("bootstet.dat")

        TreeView1.Nodes(0).Nodes.Add("", "DUMP0b45.tmp", 1, 1)

        TreeView1.Nodes(0).Nodes.Add("", "OEWABLog.txt", 1, 1)

        TreeView1.Nodes(0).Nodes.Add("", "RtlExUpd.dll", 1, 1)

        TreeView1.Nodes(0).Nodes(0).Nodes.Add("", "bootstet.dat", 1, 1)

    End Sub

End Class

أما اذا اردت ان تعرف كيف يمكنك معرفة العنصر الذي تم النقر عليه فانقر على الاداة نقرتين وأختر الحدث التالي واكتب فيه:

Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

        MsgBox(e.Node.Text)

    End Sub

شغل البرنامج وانقر على العناصر.

توجد خاصية تسمى CheckBoxs اذا جعلت قيمتها تساوي True فعندها ستحصل على الشكل التالي :

كما ترى حتى يمكنك تحديد العناصر التي تريدها.

كما يمكنك معرفة العناصر المحددة كما بالشكل التالي :

  Dim node As TreeNode

  For Each node In TreeView1.Nodes

     If node.Checked = True Then MsgBox(node.Text)

  Next

طبعاً سيتم البحث بكل العناصر من المستوى الاول Node9 وكذلك Node10

وللبحث بأي مستوى اخر يجب تغيير الجملة أنظر للشكل التالي :

    Dim node As TreeNode

        For Each node In TreeView1.Nodes(0).Nodes

        If node.Checked = True Then MsgBox(node.Text)

    Next

يمكن تغيير رقم الفهرس جرب ذلك واكتشف بنفسك النتيجة


الأدوات Tolls

الأداة | WebBrowser
وظيفته | تشبه الاداة Internet Explorer كثيراً في طريقة عملها
المثال على كيفية الاستخدام |

يمكنك من خلالها استعراض المجلدات، او حتى مواقع Web او استعراض الملفات النصية، او ملفات Html او حتى ملفات Word

شاهد المثال التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        WebBrowser1.Navigate("www.componentsource.com")

        WebBrowser1.Navigate("C:\Windows")

        WebBrowser1.Navigate("C:\Test.txt")

        WebBrowser1.Navigate("C:\Test.Doc")

        WebBrowser1.Navigate("C:\Test.Html")

    End Sub

End Class

بالسطر الأول قمنا باستدعاء الموقع المحدد على الانترنت كما بالشكل التالي:

السطر الثاني قمنا باستدعاء المجلد المحدد كما بالشكل التالي :

والسطر الثالث قمنا بفتح الملف النصي المحدد.

والسطر الرابع قمنا بفتح الملف المحدد Word كما بالشكل المحدد هنا.

والسطر الخامس قمنا باستدعاء صفحة Html

الأمر بغاية البساطة ولكن هناك بعض الخصائص الأخرى التي يمكنك التعامل معها انظر التالي:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        MsgBox(WebBrowser1.IsOffline)

        MsgBox(WebBrowser1.IsBusy)

        WebBrowser1.GoHome()

        WebBrowser1.GoForward()

        WebBrowser1.GoBack()

        MsgBox(WebBrowser1.DocumentTitle)

        WebBrowser1.Refresh()

        WebBrowser1.Print()

        MsgBox(WebBrowser1.DocumentType)

    End Sub

End Class

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

السطر الخامس يطلب التراجع الى الخلف، السطر السادس يسأل عن عنوان الصفحة، السطر السابع يقوم بتحديث الصفحة، السطر الثامن يقوم بطباعة الصفحة.

السطر التاسع يسأل عن نوع الوثيقة او المستند.

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

والتراجع سبقه تقدم جرب ذلك.

كما يمكنك عن طريق الخاصية DocumentText ان تقوم بكتابة شيفرة من نوع Html تم تقوم باسنادها الى الاداة عن طريق هذه الخاصية كما بالشكل:

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim str As String = "<html>"

        str &= "<head>"

        str &= "</head>"

        str &= "<body>"

        str &= "<h1>Test Page </h1>"

        str &= "</body>"

        str &= "</html>"

        WebBrowser1.DocumentText = str

    End Sub

End Class

أنظر الى المثال التالي، عرفنا متغير Str تم قمنا بوضع الشفرة فيه تم اسندناها الى الاداة، طبعاً لابد وان تكون ملماً بالـ Html وايضاَ JAVA

يمكنك اضافة اجراءات الجافاسكريبت واستدعاءها بشكل طبيعي جداً.

كما يمكنك ومن خلال صفحة Html التي انشاءتها بالكود او صممتها واتصلت بها ان تستدعي اجراء موجود في البرنامج كما بالشكل:

 <script language="vbscript" type="text/vbscript">

 Sub Test()

 window.external.addd_code()

 end sub

 </script>

يتم استدعاء الاجراء Test من خلال صفحة Html وو بدوره يقوم باستدعاء الاجراء Addd_code الموجود في برنامجنا ويجب ان يكون عاماً حتى يمكن رؤيته.

كما يمكن العكس استدعاء اجراء من البرنامج في الصفحة Html

سنأخذ مثالاً عن ذلك أضف زراً جديداً وضع الاداة على النموذج واكتب الكود التالي :

Imports System

Imports System.Windows.Forms

Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _

Public Class Form1

    Public Sub ASD()

        MsgBox("تم الاتصال بهذا الاجراء من صفحة الهتمل")

    End Sub

    Private Sub Button1_Click1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim str As String = "<html>" & vbCrLf

        str &= "<head>" & vbCrLf

        str &= "</head>" & vbCrLf

        str &= "<script language='vbscript'type='text/vbscript'>" & vbCrLf

        str &= "Sub Test()" & vbCrLf

        str &= " window.external.ASD()" & vbCrLf

        str &= "End Sub" & vbCrLf

        str &= "</script>" & vbCrLf

        str &= "<body>" & vbCrLf

        str &= "<Button Onclick='test'>أنقر هنا</Button>" & vbCrLf

        str &= "</body>" & vbCrLf

        str &= "</html>" & vbCrLf

        WebBrowser1.DocumentText = str

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        WebBrowser1.ObjectForScripting = Me

    End Sub

End Class

اذا شغلت البرنامج ونقرت على الزر فسترى شيئاً مثل هذا :

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

والرسالة التي ظهرت هنا هي نتيجة لاستدعاء الاجراء ASD الذي ببرنامجنا من خلال السكريبت الموضوع في صفحة الويب.

ويمكننا استدعاء سكريبت او اجراء بداخل صفحة ويب كما بالشكل التالي :

Imports System

Imports System.Windows.Forms

Imports System.Security.Permissions

<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _

Public Class Form1

    Public Sub ASD()

        MsgBox("تم الاتصال بهذا الاجراء من صفحة الهتمل")

    End Sub

    Private Sub Button1_Click1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        WebBrowser1.Document.InvokeScript("test")

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        WebBrowser1.ObjectForScripting = Me

        Dim str As String = "<html>"

        str &= "<head>"

        str &= "</head>"

        str &= "<script language='vbscript'type='text/vbscript'>"

        str &= "Sub Test()"

        str &= "msgbox(""Hello"")"

        str &= "End Sub"

        str &= "</script>"

        str &= "<body>"

        str &= "</body>"

        str &= "</html>"

        WebBrowser1.DocumentText = str

    End Sub

End Class

ان الطريقة InvokeScript تقوم على استدعاء الاجراء المطلوب.

ملاحظة : يمكنك استدعاء الاجراءات سواء من برنامجك الى صفحة ويب او العكس حتى وان كانت صفحة الويب التي تتعامل معها موجودة فعلاً على جهازك المهم ان تتصل كما بالشكل التالي :

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        WebBrowser1.Navigate("WWW.google.com")

        WebBrowser1.Navigate("C:\Test.Html")

    End Sub

End Class

كما لا يجب ان اذكرك بأنك قادر على تبادل البيانات عن طريق البارمترات لكل أجراء.

أي ترسل بيانات عند استدعاءك لاحد الاجراءات.

حسناً هذه طريقة أخرى وهي التحقق من المدخلات في الحدث Navigation وهو ويعمل عند ربط الاداة بمسارات او روابط أنظر للشكل التالي :

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _

     Handles Me.Load

        WebBrowser1.DocumentText = _

            "<html><body>ارجوا ادخال الاسم<br/>" & _

            "<input type='text' name='userName'/><br/>" & _

            "<a href='http://www.ArabPower.com'>أستمرار</a>" & _

            "</body></html>"

    End Sub

    Private Sub webBrowser1_Navigating( _

        ByVal sender As Object, ByVal e As WebBrowserNavigatingEventArgs) _

        Handles WebBrowser1.Navigating

        Dim document As System.Windows.Forms.HtmlDocument = _

            webBrowser1.Document

        If document IsNot Nothing And _

            document.All("userName") IsNot Nothing And _

            String.IsNullOrEmpty( _

            document.All("userName").GetAttribute("value")) Then

            e.Cancel = True

            MsgBox("يجب ان تدخل الاسم حتى يمكنك الدخول على الموقع  " & _

                e.Url.ToString())

        End If

    End Sub

End Class

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

اذا كان الحقل UserName فارغاً تم الغاء الاتصال بالموقع المحدد وظهرت رسالة تبين ظرورة أدخال بيانات كما بالشكل التالي :

والان هذه طريقة او مثالا أخر على كيفية أستخدام هذه الاداة في أمور مفيدة.

هنا اقوم باستعراض الملفات بمجلد معين تم اقوم بعرض تقرير عنها.

Public Class Form1

    Private Sub Button1_Click1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        WebBrowser1.ObjectForScripting = Me

        Dim str As String = "<html>"

        str &= "<head>"

        str &= "</head>"

        str &= "<body>"

        Dim files As ReadOnlyCollection(Of String)

        files = My.Computer.FileSystem.GetFiles("C:\windows", FileIO.SearchOption.SearchTopLevelOnly, "*.*")

        For Value As Integer = 1 To files.Count - 1

            str &= "<table border='0' width='100%' id='table1'><tr><td bgcolor='#99CC00'>"

            str &= files.Item(Value).ToString()

            str &= "</td>"

            str &= "<td width='142' bgcolor='#CCFF66'>"

            str &= files.Item(Value).Length

            str &= "</td></tr></table>"

        Next

        str &= "</body>"

        str &= "</html>"

        WebBrowser1.DocumentText = str

    End Sub

End Class

طبعاً سيمكنك ان تشاهد شيئاً مثل هذا :

يمكنك تغير الألوان وإضافة الصور والإيقونات كل ما يجب ان تتعلمه هو كيفية التعامل مع لغة Html فقط ، مع أنها ليست لغة برمجة

كما يمكنك حفظ هذه النتيجة على جهازك.

حسناً أضف زراً جديدا واكتب فيه التالي :

    My.Computer.FileSystem.WriteAllText("C:\Report.Html", WebBrowser1.DocumentText, False)

شغل البرنامج تم انقر على هذا الزر، وبعدها ستجد الملف بمحرك الاقراص C: كما هو واضح من المسار المحدد.

ان الخاصية DocumentText هنا تعود لنا بنص الصفحة كاملاً.

أنظر للشكل التالي وهاهو ملفنا موجود هنا بالاسم Report:

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

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

<html>

</html>

بداخل هذا الوسم ويسمونها وسوماً فبداخل وسم Html يمكننا ان نجد هذا الوسم أيضاً :

<html>

<body>

</body>

</html>

الوسم Body وهنا يتم تعريف كل الأزرار والأدوات والكتابات وغيرها وكل ما يقع هنا ستتم رؤيته بالصفحة .

تم عندنا هذا الوسم الثاني :

<html>

<head>

</head>

<body>

</body>

</html>

الوسم head ويعني رأس الصفحة وهنا يتم إدراج سكربتتات الجافا عادة او غالباً كما بالشكل التالي :

<html>

<head>

<script type = "text/javascript">

</script>

</head>

<body>

</body>

</html>

يتم الربط بين الأزرار او الأحداث وإجراءات الجافا كما بالشكل التالي :

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

وبحالتنا هذه سوف نستخدم الحدث نقر onclick كما هو ظاهر بالصورة، انظر للشكل التالي :

<html>

<head>

<script type = "text/javascript">

function Hello(){

  window.alert("يا مرحبمبك");

 }

</script>

</head>

<body>

<p><input type="button" onclick="Hello()" value="Button" name="B3"></p>

</body>

</html>

طبعاً من القائمة Project أختر Add new Items تم أختر الصفحة Html ويمكنك التعامل معها من داخل البرنامج بشكل طبيعي جداً.

وكما تشاهد لقد عرفنا أجراء جافا كما بالشكل واسميناه Hello وتم استدعائه من خلال الحدث onclick .

إظهار الرسائل :

<html>

<head>

<script type = "text/javascript">

  window.alert("يا مرحبمبك");

</script>

</head>

<body></body>

</html>

استخدام المصفوفات :

<html dir="rtl">

     <head>

          <script type = "text/javascript">

                var  name = new Array ("AAA"،"BBB"،"CCC"،"DDD"،"FFF"،"GGG") ;

                var  i ;

                for (i = 0 ; i < name.length ; i ++ )

                document.writeln ( name[i] + " <br /> ") ;

          </script>

     </head>

   <body>

</body>

 </html>

استخدام المصفوفات :

<html>

    <head>

         <script type = "text/javascript">

             var arr = [ [1,3,5,7] , [3,3,3,3] , [9,1,4,0] ] ;

             document.writeln("<h2>طباعة المصفوفة</h2><tt>");

             for (i=0 ;i< arr.length;++i)

                  {

                       for (j=0 ;j< arr[i].length;++j)

                                document.writeln(arr[i] [j] + " ");

                       document.writeln("<br />");

                  }

              document.writeln("</tt> ");

         </script>

      </head>

   <body></body>

</html>

استخدام المصفوفات :

<html>

     <head>

        <script type = "text/javascript">

            var i ;

            var  number=new Array() ;

            for (i=0 ; i<4 ; i++)

               {

                  number[i] = i ;

                  document.writeln(number[i] + "<br>");

               }

        </script>

     </head>

  <body></body>

</html>

استخدام المصفوفات :

 <html dir="rtl">

       <head>

            <script type = "text/javascript">

                  var x = new Array("AAA"،"BBB"،"CCC"،"DDD"،"FFF"،"GGG") ;

                  for(var i=0 ; i <x.length ; i++)

                       {

                             if(i == 4)

                             break ;

                             document.writeln(x[i] + "<br />") ;

                       }

              </script>

         </head>

     <body></body>

</html>

استخدام المصفوفات :

 <html dir="rtl">

       <head>

             <script type = "text/javascript">

                    var x = new Array("AAA"،"BBB"،"CCC"،"DDD"،"FFF"،"GGG") ;

                     for(var i=0 ; i <x.length ; i++)

                          {

                              if(i == 4)

                              continue;

                              document.writeln(x[i] + "<br />") ;

                          }

             </script>

        </head>

    <body></body>

</html>

التاريخ :

 <html>

       <head>

             <script type = "text/javascript">

                   var d = new Date() ;

                   document.writeln("<p>رقم اليوم من الشهر <p>" + d.getDate());

                   document.writeln("<p>رقم الشهر <p>" + d.getMonth());

                   document.writeln("<p> السنة لنا بأربع أرقام <p>" + d.getFullYear());

            </script>

        </head>

    <body></body>

</html>

التاريخ

 <html>

       <head>

             <script type = "text/javascript">

                var c = new Date (2004 , 9 ,29 , 1 , 7, 0 );

                document.writeln("<b>Date :</b> " + c + "<br />");

                  c.setDate(11);

                  c.setMonth(9);

                  c.setHours(23);

                  c.setFullYear(2003);

                  c.setMinutes(50);

                  c.setSeconds(55);

                document.writeln("<b>Dtae : </b>" + c);

            </script>

        </head>

    <body></body>

</html>

Do While

 <html >

    <head>

      <script type = "text/javascript">

           var  i = 1 ;

           do {

                      document.write( i ) ;

                      i ++ ;

              }

            While (i <= 10)

      </script>

    </head>

  <body></body>

</html>

for

 <html >

   <head>

     <script type = "text/javascript">

       for (var i = 0 ; i<= 10 ; i ++ )

            {

            document.write ( i ) ;

            }

    </script>

   </head>

 <body></body>

</html>

Function

 <html>

      <head>

         <script type = "text/javascript">

               var  z ;

               var  x=2 ;

               var  y=3 ;

               document.write ( x ) ;

               document.write ( " <br> " + y ) ;

               z = summation ( x , y ) ;

               document.write ( " <br> " + z ) ;

          function   summation ( x , y )

                {

                     var  sum = 0 ;

                     sum= x + y ;

                     return  sum ;

                }

         </script>

      </head>

   <body></body>

</html>

If

 <html dir="rtl">

     <head>

        <script type = "text/javascript">

           var pass_2="ASD";

           var  pass_user;

           pass_user = window.prompt("Enter Password","password");

              if (pass_2==pass_user)

                  {

                         document.write("Hello") ;

                  }

        </script>

     </head>

  <body></body>

</html>

Else If

 <html dir="rtl">

   <head>

      <script type = "text/javascript">

         var pass_2="ASD";

         var  pass_user;

         pass_user = window.prompt("Enter Password","password");

           if (pass_2 ==pass_user  )

                    {

                       document.write("Hello") ;

                    }

        Else

                    {

                        document.write ("Wrong Password") ;

                    }

          document.write ("In Programing World") ;

      </script>

   </head>

 <body></body>

</html>

الدوال الرياضية

 <html>

    <head>

         <script type = "text/javascript">

           document.write(Math.sqrt(9));

           document.write("<br />");

           document.write(Math.max(10,2));

           document.write("<br />");

           document.write(Math.sin(1.0));

        </script>

     </head>

   <body></body>

</html>

صناديق الحوار

<html dir="rtl">

   <head>

     <script>

         var name ;

         name = window.prompt (" Enter Your Name"  , "Name" ) ;

         document.write(" Well Come "  + name  ) ;

     </script>

    </head>

  <body> </body>

</html>

تحديث الصفحة

 <html >

      <head>

              <script type = "text/javascript">

                   location.reload();

              </script>

      </head>

   <body></body>

</html>

طباعة حرف معين

<html dir="rtl">

      <head>

           <script type = "text/javascript">

                 var  a ="ASD";

                 document.write("<p> Print char indexs 0 " + a.charAt(0));

           </script>

      </head>

    <body></body>

</html>

طباعة حرف معين

<html dir="rtl">

        <head>

              <script type ="text/javascript">

                      var a ="visual";

                      var b ="good";

                      document.writeln("<p>char 0 "+ a.charAt(0));

                      document.writeln("<p>upeercase "+ a.toUpperCase() );

                      document.writeln("<p> mearg "+ b.concat(a) );

              </script>

         </head>

     <body></body>

</html>

تكرار وطباعة ارقام

<html>

  <head>

    <script type = "text/javascript">

     var   i = 1 ;

        While (i <= 10)

       {

         document.write ( i ) ;

         i++ ;

       }

   </script>

  </head>

 <body>

</body>

</html>

ويمكنك كذلك استخدام الفجوال سيكريبت بدل الجافا كما بالشكل التالي :

<html>

  <head>

    <script type=text/vbscript>

    for t= 1 to 10

      document.write (t)

    next

    Private Sub Hello(Str)

         msgbox ( str )

    End sub

   </script>

  </head>

 <body>

 <input type="button" onclick="Hello('Hello where you say hello')" value="Button" name="B3">

</body>

</html>

لاحظ كيف ان اي كود لا يتم احتواءه من ضمن إجراء معين فسيتم تنفيذه بمجرد تشغيل الصفحة وهو يعمل كما لو كان الحدث Load .

وقمنا باستدعاء الإجراء ومررنا له العبارة التي يتطلبها البارامتر Str

ويمكنك ان تشاهد انها لغة الفيجوال العادية.

كما يمكنك ان تقوم بتحميل الملفات من موقع معين كما بالشكل التالي :

    My.Computer.Network.DownloadFile _

       ("http://www.cohowinery.com/downloads/WineList.txt", _

       "C:\Documents and Settings\All Users\Documents\WineList.txt")

الملف من الموقع ومسار حفظ الملف .

وربما احتجت الى كلمة المرور واسم المستخدم وطالبك بهما الموقع عندها تقوم بالتالي:

    My.Computer.Network.DownloadFile _

       ("http://www.cohowinery.com/downloads/WineList.txt", _

       "C:\Documents and Settings\All Users\Documents\WineList.txt", "UserName", "PassWord")

وبحال أردت ان تتصل كزائر اكتب التالي:

      My.Computer.Network.DownloadFile _

       ("http://www.cohowinery.com/downloads/WineList.txt", _

       "C:\Documents and Settings\All Users\Documents\WineList.txt", "anonymous", "")

وأيضا عملية رفع الملفات تتم بالشكل التالي :

   My.Computer.Network.UploadFile( _

   "C:\My Documents\Order.txt", _

   "http://www.cohowinery.com/upload.aspx")


شريط الادوات

شريط الادوات Toolbox

دعنا نشاهد خيارات شريط الادوات في الفجوال نت.

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

توجد خيارات التحرير، من قص ونسخ ولصق وحذف واعادة تسمية حيث يمكنك استخدامها كما تشاء.

عمليات نسخ ولصق عادية والخ..

ListView | هذا الخيار يجعلك تستطيع عرض الحافظة الحالية في طور القائمة أي ظهور الادوات مع مسمياتها او ظهور الادوات كايقونات فقط وبدون اسماء، جرب ذلك.
Show All | يجعلك هذا الخيار تستيطع رؤية كل الادوات مجتمعة، الخاصة بتطبيقات الويب والتي تظهر فقط عند انشاء أحد تطبيقات الويب او غيرها.
Chosse Items | من هنا يمكنك تحديد او جلب Components أخرى او جلب وربط البرامج باحد ملفات Activex المعتمدة على التقنية القديمة Com

أنظر للشكل التالي:

عند التبويب .Net Framework Components ستجد العديد من الكمومبوننت التي تم استيرادها من المجمع العام حيث تحت العنوان Directory بالقائمة سيمكن رؤية المسار بأسم:

Global Assembly Cache وهو مجلد موجود بمجلد النظام Windows

واحياناً ستجد المسار يشير الى Program File او الى مسار مختلف تماماً.

ولكن ما الفرق بين ذلك.

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

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

وعندها هذا الملف او المكتبة التي اضفتها يجب ان تكون موجودة مع برنامجك عند التوزيع.

ومن الجيد ان هذه الملفات لا تحتاج الى تسجيلها عند التوزيع كما كان يحدث مع ملفات الـ Activex او كما يعرفها البعض بذات اللاحقة Ocx والتي تعتمد على ثقنية Com

كما لا زال بامكانك التعامل مع هذا النوع من الملفات.

واذا نظرت الى التبويب العلوي سيمكنك رؤية التبويب والذي يحمل العنوان Com Components هناك ستجد كل الادوات المسجلة بالجهاز.

ولكن كما قلت قبل قليل اذا استخدمت هذا النوع من المكتبات يجب ان تقوم بتسجيلها في جهاز الزبون عند التوزيع.

Sort items Alphabetically | لترتيب الادوات حسب الترتيب الهجائي.
Reset toolbox | اعادة الشريط الى الاعدات الافتراضية الاولى عندما تقوم باضافة حافظة للادوات جديدة وتقوم بجلب ادوات جديدة أخرى، يمكنك عن طريق هذا الخيار باعادة وضع شريط الادوات الى الوضع الاول والافتراضي.
Add tab | لانشاء حافظة جديدة للادوات.
Move up | لتحريك الاداة الى الاعلى.
Move down | لتحريك الاداة الى الاسفل.

وهذه صورة للادوات الافتراضية والتي تأتي بشريط الادوات لحظة تنصيب الفجوال ستوديو :

يمكنك استعراض مكونات أي حاوية او طيها عن طريق الزر الصغير والذي يحمل علامة + او - كما هو واضح بالصورة.

لاحظ الأدوات التي يمكنك استخدامها في تنفيذ العديد من المهام والوظائف المختلفة، كما ان هذه الأدوات بإعداداتها القياسية ويمكنك استيراد العديد غيرها اذا دعت الحاجة.

وبذلك نختم هذا الجزء من الشرح حول شريط الأدوات .

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

اولاً يجب ان نقوم بإنشاء حاوية جديدة .

أنقر على شريط الادوات بزر الفأرة الايمن وأختر Add Tab كما بالشكل التالي :

بعدها سيقوم الفجوال بإنشاء حاوية مطالباً أياك بكتابة أسم لها كما بالشكل التالي :

بعدها أنقر بزر الفأرة الايمن على هذه الحاوية وأختر Choose Items... كما بالشكل التالي :

بعدها ستظهر لك هذه النافذة والتي تحدثنا هنا سابقاً أختر الزر Browse... كما يظهر بالشكل التالي :

ليظهر لك صندوق جلب الملفات كما بالشكل التالي :

وهنا انا احدد احد ملفات الاسيمبلي والذي يحتوي على الكومبوننت والتي نريد اضافتها الى شريط الادوات .

حدد الملف الذي تريده وأنقر على الزر Open فتظهر لك الادوات بهذا الشكل :

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

لم يعد هناك الكثير لتقوم به يمكنك من هنا إلغاء اختيار الادوات التي لا تريدها ان تظهر.

او لإاترك كل شئ كما هو وأنقر الزر Ok

وبعدها سترى الفجوال وقد قام باضافة الادوات كما بالشكل التالي :

طبعاً كملاحظة فقط ان الملف الذي اضفناه الان يجب وضعه مع الملف التنفيذي حتى يعمل برنامجنا على احسن مايرام.


أعادة التعريف Overrides

ألادوات الخاصة User Control

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

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

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

وأكثر الأشياء التي تلاحظ عدم وجودها من غيرها هي الأدوات التي تقوم بتغيير Style للأدوات، لا وجود للعالم العربي، واغلب تلك الأدوات القوية لأتقبل اللغة العربية، ولا اعلم هل هو شئ متعمد ام غير متعمد، المشكلة هي ليس في عدم ظهور الأحرف او تثناتر الأدوات هنا وهناك ، لقلت حينها انها لأتقبل العربية وتقنية المرأة .

ولكن مع التجربة والصبر عليها لاحظت ان اي كلمة عربية أحيانا تقوم على توقف البرنامج ككل، وكأنه إجراء يقتنص الحروف العربية وينهي الفيجوال نت نهائياً عن العمل.

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

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

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

ان بناء الأدوات الخاصة مهم لك كمبرمج فلا تجد برنامجاً او مبرمجاً لا يستخدم اداة UserControl لتعينه على القيام ببعض الأعمال.

في الفيجوال نت تم تسهيل الأمر كثيراً للقيام بذلكن فانت يمكنك إنشاء أداة جديدة من الصفر، او يمكنك وراثة أداة موجودة فعلاً والتعديل في خصائصها او إضافة خصائص جديدة اليها وما شابه.

لإضافة اداة UserControl من project اختر Add User Control ليتم نقلك مباشرة الى واجهة التصميم وهي كما بالشكل:

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

حسناً بعيداً عن الكود دعنا اولا نلقي بعض الأدوات عليه من TollBox تم أنتقل الى FormDesign وأنظر الى الـ TollBox وفي بدايته، عليك قبل ان تفعل هذا ان تقوم بحفظ المشروع، وتشغيل البرنامج وإيقافه، او اختيار Build من القائمة تم ReBulid وذلك حتى يتم إنشاء الأداة وتحديثها.

تذكر: عليك بفعل هذه الخطوة كلما أجرينا تغييرات، والا فأنك لن ترى هذه التغييرات.

عند فتحك للـ TollBox ستجد الأداة كما بالشكل:

هاهي هنا وأسمها UserControl يمكنك طبعاً التغيير ولكن دعك من هذا ألان وقم بسحبها وإسقاطها على النموذج وقم بتغيير لون الخلفية حتى تميزها عن النموذج انظر الشكل التالي:

حسناً هذه بداية موفقة لك، وهذه أول أداة تقوم بتصميمها وهي خاصة بك.

قم الان بالعودة الى الأداة UserControl وأضف لها نفس الأدوات هنا ، لأننا سنضيف بعض الخصائص أليها.

ولفعل ذلك ادخل على محرر الكود الخاص بها وأكتب شيئاً مثل هذا:

 Public Class UserControl1

    Dim myValue As String

    Public Property MyText() As String

        Get

            MyText = myValue

        End Get

        Set(ByVal value As String)

            myValue = value

        End Set

    End Property

End Class

انظر جيداً، عرفنا متغير myvalue من النوع النصي ليحتفظ بقيمة الخاصية Mytext الجديدة التي عملناها.

والخاصية لها Get وأيضا Set والأول يتم استدعاءه للحصول على قيمة الخاصية والثاني عندما نقوم بتغيير هذه القيمة ولها وسيط هو Value ليستقبل القيمة المرسلة.

حسناً لا تنسى ReBuild لحفظ التغييرات، تم أنتقل الى النموذج وانقر على الأداة وانتقل الى نافذة الخصائص لنبحث عن هذه الخاصية الجديدة التي عملناها كما بالشكل:

هاهي موجودة هنا، وجاهزة للاستخدام بأي وقت.

والان انقر على الزر العلوي الخاص بفرز الخصائص حسب التصنيف لقد شرحنا هذا سابقاً أنه بجوار زر الفرز حسب الترتيب الأبجدي، تم أبحث عن خاصيتنا هذه من جديد انظر الشكل:

هل ترى الحافظة التي تحتويها اسمها Misc ويوجد منها الكثير مثل Layout و Focus و Design يمكنك مشاهدتها.

انها بمثابة حافظات تحتوي كل مجموعة من الخصائص معاً، وأنظر كذلك الى الجملة Mytext بالاسفل.

انقر على Size فوق خاصيتنا بقليل وأنظر ما الذي تغير مكان الجملة Mytext هل ترى...؟

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

والان، دعنا نضيف خاصيتنا الى حافظة موجودة بالفعل، ونظيف اليها جملة معبرة، عد الى الأداة وعند إجراء الخاصية أكتب التالي:

Imports System.ComponentModel

Public Class UserControl1

    Dim myValue As String

    <Category("Appearance"), Description("لم نعرف لماذا حتى الان")> _

    Public Property MyText() As String

        Get

            MyText = myValue

        End Get

        Set(ByVal value As String)

            myValue = value

        End Set

    End Property

End Class

ما الذي تغير، انظر الى جملة الاستيراد تلك، لابد وان تقوم باستيرادها حتى يتسنى لنا أستخدام هذه السمات على الخاصية.

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

أنتقل الى النموذج وابحث عن الخاصية انظر الشكل:

يمكنك ان ترى أي حافظة صارت من ضمنها، ويمكنك ان ترى الجملة القصيرة المعبرة.

حتى الان لم تقم الخاصية بالقيام بأي عمل، عد الى الاداة وأكتب التالي هناك:

 Imports System.ComponentModel

Public Class UserControl1

    Dim myValue As String

    <Category("Appearance"), Description("لم نعرف لماذا حتى الان")> _

    Public Property MyText() As String

        Get

            MyText = myValue

            Me.ComboBox1.Text = MyText

        End Get

        Set(ByVal value As String)

            myValue = value

        End Set

    End Property

End Class

لقد أضفنا مضطرا جديداً وهو ان قمنا بربط الأداة ComboBox بالقيمة Mytext المرسلة، انتقل الى النموذج وابحث عن خاصيتنا واكتب بها اي نص تم انظر الى النموذج.

يمكنك ان ترى ان النص الذي كتبته قد تم وضعه بالخاصية Text للأداة ComboBox

بهذه الطريقة يتم عمل الخصائص فأنت عندما تحدد الخاصية Text للأداة النص وتكتب فيها نصاً يظهر هذا النص في اداة النص على النموذج.

والان نريد ان نظيف خاصية أخرى تقوم على تغيير لون الأداة ComboBox اي الخلفية.

ولكن لن نظيف هذه الخاصية بشكل يدوي كما فعلت سابقاً ، أريد ان أريحك من ذلك ولذلك علينا ان نستخدم Class Diagram تحدثنا عن هذا سابقاُ من النافذة Solution explorer أنقر على الاداة بزر الفأرة الأيمن وأختر Veiw Class Diagram لتطالعك النافذة التالية:

يمكنك ان ترى وتحت العنوان خصائص الخاصية التي أضفناها، وكذلك تحت العنوان الحقول المتغير myvalue الخاص بنا.

أنقر على أعلى هذا الشكل الخوارزمي بزر الفأرة الأيمن لتظهر لك النافذة التالية:

من Add أختر Property

سيتم اضافة الخاصية الجديدة ولكن بالقيم الافتراضية أنظر التالي:

غير أسم الخاصية الى MyColor والنوعية هنا هي Integer أمسح المحتوى لتظهر لك قائمة أختر Color او أكتب الحروف الأولى وسوف يتم نقلك الى هناك أنظر الشكل التالي:

ودع الخاصية Public لا تغير شيئاً، اتبع هذه الطريقة كلما أردت ان تضيف خاصية جديدة.

عد ألان إلى محرر الكود وغير في الكود كما بالشكل.

 Imports System.ComponentModel

Public Class UserControl1

    Dim myValue As String

    Dim colorX As Color

    <Category("Appearance"), Description("لم نعرف لماذا حتى الان")> _

    Public Property MyText() As String

        Get

            MyText = myValue

            Me.ComboBox1.Text = MyText

        End Get

        Set(ByVal value As String)

            myValue = value

        End Set

    End Property

    Public Property mycolor() As Color

        Get

            mycolor = colorX

            Me.ComboBox1.BackColor = mycolor

        End Get

        Set(ByVal value As Color)

            colorX = value

        End Set

    End Property

End Class

وبعدها انتقل الى النموذج وابحث عن هذه الخاصية وقم بالتغيير في اللون.

يمكنك كذلك إضافة إجراءات عادية تستدعيها عن طريق الأداة نفسها، أضف الكود التالي:

Imports System.ComponentModel

Public Class UserControl1

    Dim myValue As String

    Dim colorX As Color

    <Category("Appearance"), Description("لم نعرف لماذا حتى الان")> _

    Public Property MyText() As String

        Get

            MyText = myValue

            Me.ComboBox1.Text = MyText

        End Get

        Set(ByVal value As String)

            myValue = value

        End Set

    End Property

    Public Property mycolor() As Color

        Get

            mycolor = colorX

            Me.ComboBox1.BackColor = mycolor

        End Get

        Set(ByVal value As Color)

            colorX = value

        End Set

    End Property

    Public Sub myTest()

    End Sub

End Class

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

حسناً ليس عندي ما أضيفه لك سوى ان أطلعك على مشروع كامل لأداة أستخدمها لعمل شئ ما لنبدأ من جديد، مشروع جديد، أداة جديدة انتقل الى محرر الكود واكتب التالي:

اعد تسمية الأداة من نافذة Solution Explorer الى PanelControl

قم باستيراد Imports System.ComponentModel

تم أنسخ الكود التالي وألصقه في محرر الكود بعد ان تقوم بمسح كل محتوياته.

 Imports System.ComponentModel

<Designer(GetType(PanelDesingner))> _

Public Class PanelControl

    Inherits System.Windows.Forms.Panel

    Dim mAlginControl As Boolean

    <Description("أذا كنت ترغب في محاذاة الفورم أتوماتيكياً في المنتصف")> _

       <Category("Qnifo Control value")> _

       Public Property AlginControl() As Boolean

        Get

            AlginControl = mAlginControl

        End Get

        Set(ByVal value As Boolean)

            mAlginControl = value

        End Set

    End Property

    Public Sub From(ByVal value As Control)

        If Me.Controls.Count > 0 Then

            Me.Controls(0).Dispose()

        End If

        Me.Controls.Add(value)

        Center()

    End Sub

    Private Sub Center()

        On Error Resume Next

        If mAlginControl = True Then

            Me.Controls(0).Left = ((Me.Width \ 2) - (Me.Controls(0).Width \ 2))

            Me.Controls(0).Top = 2

        End If

    End Sub

    Private Sub UserControl1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter

        Center()

    End Sub

    Private Sub UserControl1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

        Center()

    End Sub

End Class

حسناً ستواجهك مشاكل كثيرة مع الكود ولكن أولا عليك ان تقوم بالتالي، أذهب الى الجملة

Inherits System.Windows.Forms.Pane

أي سطر برمجي تحت خط ازرق متعرج يعني أن به مشكلة، واذا كانت هناك حلول مقترحة فستجد مربع احمر صغير في نهايته اذا حركت الفأرة فوق ببطء وروية ظهر لك مربع اخر به سهم صغير انقر عليه فيتم عرض الحلول المقترحة، لاحظ أنها حلول قد لا تصلح بتاتاً وانما بأغلب الأوقات تفيد وفيها الحل أنظر الشكل التالي:

أختر الخيار الأول، وهذا السطر البرمجي يخبر الفيجوال نت باننا نريد ان نقوم بوراثة الأداة Panel

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

الان نريد ان ننشئ PanelDesingner وهو الـ Class الذي يبحث عنه الخطاء الأول أنظر لصورة لان هذه الـ Class لم نقم ببرمجتها بعد.

أضف Class جديدة من Project اختر Add Class وسميها PanelDesingner

بعدها أضف لها الكود التالي:

Imports System.Security.Permissions

Imports System.ComponentModel.Design

<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _

Public Class PanelDesingner

    Inherits System.Windows.Forms.Design.ControlDesigner

    Private lists As DesignerActionListCollection

    'Use pull model to populate smart tag menu.

    Public Overrides ReadOnly Property ActionLists() _

    As DesignerActionListCollection

        Get

            If lists Is Nothing Then

                lists = New DesignerActionListCollection()

                lists.Add(New PanelActionList(Me.Component))

            End If

            Return lists

        End Get

    End Property

End Class

لا تهتم أضف Class جديدة بأصم PanelActionList واكتب فيها الكود التالي:

 Imports System.Text

Public Class PanelActionList

    Inherits System.ComponentModel.Design.DesignerActionList

    Private colLabel As PanelControl

    Private designerActionUISvc As DesignerActionUIService = Nothing

    Private Function GetPropertyByName(ByVal propName As String) _

    As PropertyDescriptor

        Dim prop As PropertyDescriptor

        prop = TypeDescriptor.GetProperties(colLabel)(propName)

        If prop Is Nothing Then

            Throw New ArgumentException("Matching ColorLabel property not found!", propName)

        Else

            Return prop

        End If

    End Function

    Public Sub New(ByVal component As IComponent)

        MyBase.New(component)

        Me.colLabel = component

        ' Cache a reference to DesignerActionUIService, so the

        ' DesigneractionList can be refreshed.

        Me.designerActionUISvc = _

        CType(GetService(GetType(DesignerActionUIService)), _

        DesignerActionUIService)

    End Sub

    Public Property BackColor() As Color

        Get

            Return colLabel.ForeColor

        End Get

        Set(ByVal value As Color)

            GetPropertyByName("BackColor").SetValue(colLabel, value)

        End Set

    End Property

    Public Property BackgroundImage() As Image

        Get

            Return colLabel.BackgroundImage

        End Get

        Set(ByVal value As Image)

            GetPropertyByName("BackgroundImage").SetValue(colLabel, value)

        End Set

    End Property

    Public Property [AlginControl]() As Boolean

        Get

            Return colLabel.AlginControl

        End Get

        Set(ByVal value As Boolean)

            GetPropertyByName("AlginControl").SetValue(colLabel, value)

        End Set

    End Property

    Public Overrides Function GetSortedActionItems() _

   As DesignerActionItemCollection

        Dim items As New DesignerActionItemCollection()

        'Define static section header entries.

        items.Add(New DesignerActionHeaderItem("Appearance"))

        items.Add(New DesignerActionHeaderItem("Information"))

        items.Add( _

          New DesignerActionPropertyItem( _

          "BackColor", _

          "Back Color", _

          "Appearance", _

          "Selects the foreground color."))

        items.Add( _

         New DesignerActionPropertyItem( _

         "BackgroundImage", _

         "Background Image", _

         "Appearance", _

         "Selects the foreground color."))

        items.Add( _

         New DesignerActionPropertyItem( _

         "AlginControl", _

         "Algin Control", _

         "Appearance", _

         "Algin Control in center Parent"))

        'Create entries for static Information section.

        Dim location As New StringBuilder("Location: ")

        location.Append(colLabel.Location)

        Dim size As New StringBuilder("Size: ")

        size.Append(colLabel.Size)

        items.Add( _

        New DesignerActionTextItem( _

        location.ToString(), _

        "Information"))

        items.Add( _

        New DesignerActionTextItem( _

        size.ToString(), _

        "Information"))

        Return items

    End Function

End Class

سيحتوي الكود على الكثير من الأخطاء وسترى الكثير من الحلول، لا تفيد وعليك ان تذهب الى Solution explorer تم انقر على my project مرتين لترى ومن النافذة اختر Reference

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

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

بعض إضافة المجالات لن يعود هناك اي أخطاء بالبرنامج.

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

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

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

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

إنني استخدم هذه الأداة في عرض مجموعة من أدوات UserControl فيها، يوجد إجراء يدعي Form كما بالشكل:

 Public Sub From(ByVal value As Control)

        If Me.Controls.Count > 0 Then

            Me.Controls(0).Dispose()

        End If

        Me.Controls.Add(value)

        Center()

End Sub

يستقبل الوسيط Value أسم الأداة UserControl المطلوبة تم يقوم بالتحقق من عدد الأدوات الموجودة ، اذا كانت اكثر من 0 فهذا يعني ان هناك اداة أخرى وقبل ان يضيفها يقوم بحذفها تم يضيف الأداة عن طريق الخاصية Controls تم يتم استدعاء الإجراء Center والذي تقوم مهمته في زحزحة الأداة المرد حملها على أداتنا الى المنتصف تماماً وهاهو الإجراء Center

 Private Sub Center()

        On Error Resume Next

        If mAlginControl = True Then

            Me.Controls(0).Left = ((Me.Width \ 2) - (Me.Controls(0).Width \ 2))

            Me.Controls(0).Top = 2

        End If

 End Sub

هنا نقوم بمجموعة من القياسات لمعرفة المسافات ووضع الأداة في المنتصف تماماً.

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

  Private Sub UserControl1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter

        Center()

    End Sub

    Private Sub UserControl1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

        Center()

    End Sub

تم عندنا الخاصية الجديدة المسماة Align وهي تسألنا اذا كنا نريد ان نضع الأداة في المنتصف ام لا حيث يتم اختبار هذه القيمة في الإجراء Center فاذا كانت True نفذ المهمة.

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

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

ولا تنسى انه يمكنك ضم كل الـ Class في نفس ملف الأداة انظر الشكل التالي:

Imports System.Security.Permissions

'///////////////////////////////////////////////////////////////

'ColorLabel is a simple extension of the standard Label control,

' with color property locking added.

'///////////////////////////////////////////////////////////////

<Designer(GetType(ColorLabelDesigner))> _

Public Class ColorLabel

    Inherits System.Windows.Forms.Label

    Private colorLockedValue As Boolean = False

    Public Property ColorLocked() As Boolean

        Get

            Return colorLockedValue

        End Get

        Set(ByVal value As Boolean)

            colorLockedValue = value

        End Set

    End Property

End Class

'///////////////////////////////////////////////////////////////

'Designer for the ColorLabel control with support for a smart

' tag panel.

'///////////////////////////////////////////////////////////////

'Must add reference to System.Design.dll

<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _

Public Class ColorLabelDesigner

    Inherits System.Windows.Forms.Design.ControlDesigner

    Private lists As DesignerActionListCollection

    'Use pull model to populate smart tag menu.

    Public Overrides ReadOnly Property ActionLists() _

    As DesignerActionListCollection

        Get

            If lists Is Nothing Then

                lists = New DesignerActionListCollection()

                lists.Add(New ColorLabelActionList(Me.Component))

            End If

            Return lists

        End Get

    End Property

End Class

'///////////////////////////////////////////////////////////////

'DesignerActionList-derived class defines smart tag entries and

' resultant actions.

'///////////////////////////////////////////////////////////////

Public Class ColorLabelActionList

    Inherits System.ComponentModel.Design.DesignerActionList

    Private colLabel As ColorLabel

    Private designerActionUISvc As DesignerActionUIService = Nothing

    'The constructor associates the control

    'with the smart tag list.

    Public Sub New(ByVal component As IComponent)

        MyBase.New(component)

        Me.colLabel = component

        ' Cache a reference to DesignerActionUIService, so the

        ' DesigneractionList can be refreshed.

        Me.designerActionUISvc = _

        CType(GetService(GetType(DesignerActionUIService)), _

        DesignerActionUIService)

    End Sub

    'Helper method to retrieve control properties. Use of

    ' GetProperties enables undo and menu updates to work properly.

    Private Function GetPropertyByName(ByVal propName As String) _

    As PropertyDescriptor

        Dim prop As PropertyDescriptor

        prop = TypeDescriptor.GetProperties(colLabel)(propName)

        If prop Is Nothing Then

            Throw New ArgumentException("Matching ColorLabel property not found!", propName)

        Else

            Return prop

        End If

    End Function

    'Properties that are targets of DesignerActionPropertyItem entries.

    Public Property BackColor() As Color

        Get

            Return colLabel.BackColor

        End Get

        Set(ByVal value As Color)

            GetPropertyByName("BackColor").SetValue(colLabel, value)

        End Set

    End Property

    Public Property ForeColor() As Color

        Get

            Return colLabel.ForeColor

        End Get

        Set(ByVal value As Color)

            GetPropertyByName("ForeColor").SetValue(colLabel, value)

        End Set

    End Property

    'Boolean properties are automatically displayed with binary

    ' UI (such as a checkbox).

    Public Property LockColors() As Boolean

        Get

            Return colLabel.ColorLocked

        End Get

        Set(ByVal value As Boolean)

            GetPropertyByName("ColorLocked").SetValue(colLabel, value)

            ' Refresh the list.

            Me.designerActionUISvc.Refresh(Me.Component)

        End Set

    End Property

    Public Property [Text]() As String

        Get

            Return colLabel.Text

        End Get

        Set(ByVal value As String)

            GetPropertyByName("Text").SetValue(colLabel, value)

        End Set

    End Property

    Public Property [AutoSize]() As Boolean

        Get

            Return colLabel.Autosize

        End Get

        Set(ByVal value As Boolean)

            GetPropertyByName("AutoSize").SetValue(colLabel, value)

        End Set

    End Property

    'Method that is target of a DesignerActionMethodItem

    Public Sub InvertColors()

        Dim currentBackColor As Color = colLabel.BackColor

        BackColor = Color.FromArgb( _

        255 - currentBackColor.R, _

        255 - currentBackColor.G, _

        255 - currentBackColor.B)

        Dim currentForeColor As Color = colLabel.ForeColor

        ForeColor = Color.FromArgb( _

        255 - currentForeColor.R, _

        255 - currentForeColor.G, _

        255 - currentForeColor.B)

    End Sub

    'Add my control to the list here

    'Implementation of this virtual method creates smart tag

    ' items, associates their targets, and collects into list.

    Public Overrides Function GetSortedActionItems() _

    As DesignerActionItemCollection

        Dim items As New DesignerActionItemCollection()

        'Define static section header entries.

        items.Add(New DesignerActionHeaderItem("Appearance"))

        items.Add(New DesignerActionHeaderItem("Information"))

        'Boolean property for locking color selections.

        items.Add(New DesignerActionPropertyItem( _

        "LockColors", _

        "Lock Colors", _

        "Appearance", _

        "Locks the color properties."))

        items.Add( _

                  New DesignerActionPropertyItem( _

                  "AutoSize", _

                  "Auto Size", _

                  "Appearance", _

                  "Change text to autosize or not."))

        If Not LockColors Then

            items.Add( _

            New DesignerActionPropertyItem( _

            "BackColor", _

            "Back Color", _

            "Appearance", _

            "Selects the background color."))

            items.Add( _

            New DesignerActionPropertyItem( _

            "ForeColor", _

            "Fore Color", _

            "Appearance", _

            "Selects the foreground color."))

            'This next method item is also added to the context menu

            ' (as a designer verb).

            items.Add( _

                       New DesignerActionMethodItem( _

                       Me, _

                       "InvertColors", _

                       "Invert Colors", _

                       "Appearance", _

                       "Inverts the fore and background colors.", _

                        True))

        End If

        items.Add( _

        New DesignerActionPropertyItem( _

        "Text", _

        "Text String", _

        "Appearance", _

        "Sets the display text."))

        'Create entries for static Information section.

        Dim location As New StringBuilder("Location: ")

        location.Append(colLabel.Location)

        Dim size As New StringBuilder("Size: ")

        size.Append(colLabel.Size)

        items.Add( _

        New DesignerActionTextItem( _

        location.ToString(), _

        "Information"))

        items.Add( _

        New DesignerActionTextItem( _

        size.ToString(), _

        "Information"))

        Return items

    End Function

End Class

هذا مثال عن أداة Label بها كل الإمكانيات التي تحدثنا عنها، أنشئ أداة User Control جديدة وضع بها هذا الكود وجربها.

وللتعامل مع الـ Attributes تحتاج الى استيراد هذا المجال

Imports System.ComponentModel

والان لنستعرض بعض من الـ Attributes ونرى ما الذي يمكنها فعله.

هذه تقوم بوضع المؤشر على خاصية معينة لاول مرة تظهر فيها | DefaultPropertyAttribute("Title")
تقوم بإظهار او إخفاء الخاصية اذا اخترت False فلن يمكنك رؤيتها | Browsable(True)
هل هي للقراءة فقط ام لا | [ReadOnly](False)
لتحديد هل للخاصية مصدر بيانات ليتم ربطها به | BindableAttribute(False)
القيمة الافتراظية للخاصية | DefaultValueAttribute("")
اذا كانت True فهي تشير الى ان الخاصية للقراءة فقط بزمن التشغيل | DesignOnly(False)
هل تلميح صغير يظهر ليعطي فكرة عن الخاصية | DescriptionAttribute("Enter Title for the application"))
لتحديد أسم الى الخاصية | DisplayName("Any Name")
يستخدم مع الكلاسس لتحديد إيقونة ليتم وضعها كرمز بالـ ToolBox | ToolboxBitmap()
يستخدم مع بعض الـ Class الأخرى للتحكم في خصائص الكنترول بزمن التصميم | EditorAttribute
يقوم بإضافة كلاسس معين الى الكنترول للاستفادة منها | DesignerSerializationVisibility()
وتحدد مكان ظهور الخاصية اي الحاوية التي تجمع تحتها مجموعة من الخصائص | CategoryAttribute("Application")

تقريباً كل الـ Attribute السابقة رأينا طريقة عملها من الأمثلة السابقة.

ولكن واحداً لم نتطرق لكيفية استخدامه وهي DesignerSerializationVisibility أنظر للشكل التالي:

Imports System.ComponentModel

Public Class WinWar

    Inherits Control

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Category(">")> _

    Public ReadOnly Property OtherClass() As MClass

        Get

            Return New MClass()

        End Get

    End Property

    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Category(">")> _

    Public ReadOnly Property Good() As Home

        Get

            Return New Home

        End Get

    End Property

    End Class

    <TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))> _

    Public Class MClass

    Private MPic As Bitmap

    Private MColor As Color

    Private Mfont As Font

    Public Sub New()

    End Sub

    Public Property Pic() As Bitmap

        Get

            Return MPic

        End Get

        Set(ByVal value As Bitmap)

            MPic = value

        End Set

    End Property

    Public Property Color() As Color

        Get

            Return MColor

        End Get

        Set(ByVal value As Color)

            MColor = value

        End Set

    End Property

    Public Property Font() As Font

        Get

            Return Mfont

        End Get

        Set(ByVal value As Font)

            Mfont = value

        End Set

    End Property

End Class

<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))> _

Public Class Home

    Public Sub New()

    End Sub

    Public Property Size() As Point

        Get

        End Get

        Set(ByVal value As Point)

        End Set

    End Property

    Public Property StringArray() As Collection

        Get

        End Get

        Set(ByVal value As Collection)

        End Set

    End Property

    Public Property Data() As Date

        Get

        End Get

        Set(ByVal value As Date)

        End Set

    End Property

End Class

كما تلاحظ عندنا ثلاث كلاسس والكلاسس Winwar فيه خاصيتين كل خاصية تندرج تحتها كل خصائص الكنترول الأخرى.

ويكون شكلها بنافذة الخصائص كالتالي :

يمكنك ان تشاهد الخاصية Good والتي هي عبارة عن الكلاسس WindowsApplication.Home

وكذلك الخاصية OtherClass والتي هي عبارة عن الكلاسس WindowsApplication.Mclass

وتظهر تحت كل خاصية كامل خصائص الكنترول او الكلاسس

كل الحديث السابق في تصميم أدوات خاصة كان إنشاء أداة خاصة مركبة من أدوات أخرى ، وخاصة بالمثال الأول .

أي انك تنشئ أداة UserControl جديدة تم تضع عليها مجموعة من الأدوات لأداء وظيفة ما.

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

أولا سننشئ أداة جديدة وسنطبق مبداء الوراثة ونجعلها ترث الكنترول ListView .

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

وكما بهذه الصورة تماماً.

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

أنشئ مشروعاً جديداً وأضف له اداة UserControl جديدة وسنجعلها نرث الأداة ListView كما بالشكل التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

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

حقيقة ستحصل على خطاء كما بالصورة هنا ألان:

بعض التلميحات عن الأخطاء الواقعة، وكذلك التحذير من التغيير في الطريقة InitializeComponent وعدم التغيير فيها يدوياً.

بعض الهراء الذي تعودنا عليه من مايكروسوفت لا تهتم انقر على الخيار بشكل رابط والمسمى Edit وسوف تنتقل الى محرر الكود حيث يتم كتابة كل الشيفرات التي تخص Windows Forms designer وهناك سوف تجد بعض الأسطر البرمجية والتي تم وضع خط متعرج باللون الأزرق كما بالشكل التالي:

كل ما في الموضوع وهو اننا عندما ورثنا الأداة الجديدة تتغير بعض الخصائص وتختلف فيما بينها ولذلك وجب علينا التدخل الان.

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

الان وبعد ان أصبحت في وضع التصميم عليك القيام ومن النافذة ToolBox بإسقاط الأداة ImageList ووضع بعض الإيقونات فيها واذا لم تعلم كيف أذهب الى الدرس الخاص بالأدوات Tools

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

وبعدها سنضيف تركيبا وخاصية جديدة وحقل كما بالشكل كما بالشكل:

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Dim myicon As micon

    Public Enum micon

        Msystem

        MFile

        MFolder

        MCar

        MInternet

    End Enum

Public Property SelectIcon() As micon

        Get

            SelectIcon = myicon

        End Get

        Set(ByVal value As micon)

            myicon = value

        End Set

    End Property

End Class

حسناً والان لماذا كل هذا...؟

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

والان اذا وضعت الأداة على النموذج وبحثث عن الخاصية الجديدة باسم SelectIcon فستجدها كما بالشكل التالي:

لاحظ التركيب خاصتنا وطبعا التسمية هنا اختيارية ويجب ان تدل على نوعية الصورة فمثلا System من الممكن ان تكون صور لشعار Windows وكذلك MFile من الممكن ان تكون صورة ملف وهكذا

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

والان جاء دور إنشاء إجراء جديد كما بالشكل التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Dim myicon As micon

    Public Enum micon

        Msystem

        MFile

        MFolder

        MCar

        MInternet

    End Enum

    Public Property SelectIcon() As micon

        Get

            SelectIcon = myicon

        End Get

        Set(ByVal value As micon)

            myicon = value

        End Set

    End Property

    Public Sub Additems(ByVal MString As String)

        Me.Items.Add(MString, myicon)

    End Sub

End Class

هل يمكنك رؤية ما الذي أضفناه أنه الإجراء باسم Additems ويحتوي على بارامتر من النوع String

بداخل الأداة نستخدم الخاصية Items لإضافة عنصر جديد الى الأداة بالطريقة Add وطبعا نحدد ما هي الإيقونة المستخدمة عن طريق الحقل myicon والذي نحتفظ فيه باختيارنا

واذا ما كتب بنموذج التحميل الكود التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        UserControl11.Additems("Windows")

        UserControl11.Additems("sender")

        UserControl11.Additems("System")

        UserControl11.Additems("Object")

        UserControl11.Additems("EventArgs")

        UserControl11.Additems("Form1")

        UserControl11.Additems("Class")

    End Sub

End Class

فستحصل على النتيجة

ولكن عند إضافتك للأداة على النموذج تظهر الأداة خالية ولذلك نريد عندما يحدد المستخدم إيقونة من الخاصية SelectedIcon نقوم بوضع عناصر في الأداة حتى تعطي فكرة للمستخدم وهو بزمن التصميم ما هي الإيقونة المستخدمة وكيف سيكون مظهر العناصر في الأداة، ولنفعل ذلك علينا إضافة الكود التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Dim myicon As micon

    Public Enum micon

        Msystem

        MFile

        MFolder

        MCar

        MInternet

    End Enum

    Public Property SelectIcon() As micon

        Get

            SelectIcon = myicon

        End Get

        Set(ByVal value As micon)

            myicon = value

            Me.Items.Clear()

            For myinteger As Integer = 1 To 20

                Me.Items.Add("Test " & myinteger, myicon)

            Next

        End Set

    End Property

    Public Sub Additems(ByVal MString As String)

        Me.Items.Add(MString, myicon)

    End Sub

End Class

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

ولكن متى سيتم تنفيذ هذا الإجراء....؟

سيتم التنفيذ عندما يقوم المستخدم بتغيير هذه الخاصية وهو يحدد نوع الإيقونة المستخدمة لاحظ النتيجة.

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

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Dim myicon As micon

    Public Enum micon

        Msystem

        MFile

        MFolder

        MCar

        MInternet

    End Enum

    Public Property SelectIcon() As micon

        Get

            SelectIcon = myicon

        End Get

        Set(ByVal value As micon)

            myicon = value

            Me.Items.Clear()

            For myinteger As Integer = 1 To 20

                Me.Items.Add("Test " & myinteger, myicon)

            Next

        End Set

    End Property

    Public Sub Additems(ByVal MString As String)

        Me.Items.Add(MString, myicon)

    End Sub

    Public Sub AdditemsWithIcon(ByVal MString As String, ByVal MySelectIcon As micon)

        Me.Items.Add(MString, MySelectIcon)

    End Sub

End Class

لاحظ الإجراء الجديد الذي أضفناه حيث يطلب منا أيضا ان نحدد الإيقونة التي نريد ان نستخدمها، لاحظ الشكل التالي:

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

وبذلك نترك له الخيار ليختار هو اي أجراء يريد بالضبط، وهذه نتيجة عملنا الان.

طبعا التسميات التي اختارها والإيقونات لا يوجد رابط بينها وإنما هي فقط لإعطاء مثال.

ملاحظة

تجدر الإشارة الى انك وبحال أردت توزيع هذه الأداة كـملف DLL يجب ان تجعل محدد الوصول لاي تركيب وأي أجراء كـ Public أي عام حتى يستطيع المستخدم رؤيتها في مشروعه.

والان ماذا لو أردنا من الأداة ان تظهر لنا بيانات من سجل يحدده المستخدم...؟

أنظر المثال التالي:

Imports System.Data.OleDb

Public Class UserControl1

    Inherits System.Windows.Forms.ListView

    Dim myicon As micon

    Dim Mdatabase As String

    Dim MFeild As String

    Dim MTabel As String

    Dim MActive As Boolean

    Public Enum micon

        Msystem

        MFile

        MFolder

        MCar

        MInternet

    End Enum

    Public Property MTabelName() As String

        Get

            MTabelName = MTabel

        End Get

        Set(ByVal value As String)

            MTabel = value

        End Set

    End Property

    Public Property MDatabasePath() As String

        Get

            MDatabasePath = Mdatabase

        End Get

        Set(ByVal value As String)

            Mdatabase = value

        End Set

    End Property

    Public Property MFeildName() As String

        Get

            MFeildName = MFeild

        End Get

        Set(ByVal value As String)

            MFeild = value

        End Set

    End Property

    Public Property SelectIcon() As micon

        Get

            SelectIcon = myicon

        End Get

        Set(ByVal value As micon)

            myicon = value

        End Set

    End Property

    Public Property DBActive() As Boolean

        Get

            DBActive = MActive

        End Get

        Set(ByVal value As Boolean)

            Try

                Using connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &           My.Computer.FileSystem.CurrentDirectory & "\" & Me.MDatabasePath & ".mdb")

                    Dim command As New OleDbCommand("Select * from " & Me.MTabelName, connection)

                    connection.Open()

                    Dim reader As OleDbDataReader = command.ExecuteReader()

                    While reader.Read()

                        Dim k As String = reader.Item(Me.MFeildName).ToString

                        Me.Additems(k)

                    End While

                    reader.Close()

                End Using

            Catch ex As Exception

                Me.Additems(ex.Message)

            End Try

            MActive = value

        End Set

    End Property

    Public Sub Additems(ByVal MString As String)

        Me.Items.Add(MString, myicon)

    End Sub

    Public Sub AdditemsWithIcon(ByVal MString As String, ByVal MySelectIcon As micon)

        Me.Items.Add(MString, MySelectIcon)

    End Sub

End Class

أضفنا خاصية جديدة وأسميناها Active فيها كود للاتصال بقاعدة البيانات وعرض احد الحقول التي يحددها المستخدم.

حقيقة المطلوب من المستخدم هو تحديد أسم قاعدة البيات بدون المسار على افتراض انها موجودة بمجلد النظام.

وتحديد اسم الجدول الذي ستتعامل معه الأداة.

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

وبمجرد جعل قيمة الخاصية Active=true سيتم الاتصال بالبيانات وقت التصميم وملئ الأداة بالبيانات.

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

مثلاً انا ذات مرة جعلت لها خاصية تحدد منها اسم قاعدة البيانات وخاصية تحدد منها اسم الجدول وتقوم هي بقراءة البيانات لوحدها.

وأيضا تعرض أسم الشخص وبدلا من الإيقونة تعرض صورته المخزنة في قاعدة البيانات.

طبعاً هذه محاولة بسيطة ومن الممكن تطوير هذا الكنترول ليكون لاماً وشاملاً ويؤدي وظائف كثيرة وعديدة.

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

أيضا من الأشياء البسيطة التي يمكنك ان تنشئها اداة تحوي على كل أسماء الخطوط بالجهاز.

أنشئ مشروعاً جديدا وأضف أداة UserControl ودعها ترث الـ ComboBox واكتب في الحدث Sub New التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ComboBox

    Public Sub New()

        ' This call is required by the Windows Form Designer.

        InitializeComponent()

        Dim fonts As New Drawing.Text.InstalledFontCollection()

        Dim fontFamilies() As FontFamily = fonts.Families

        Dim fontFamily As FontFamily

        For Each fontFamily In fontFamilies

            Me.Items.Add(fontFamily.Name)

        Next

        Me.SelectedIndex = 1

        Me.DropDownStyle = ComboBoxStyle.DropDownList

    End Sub

End Class

هذا كل شئ الان جرب إسقاط الأداة على النموذج وشغل المشروع هاهي النتيجة:

اخترت الحدث Sub New وهو الحدث الذي يتم تنفيذه عند إنشاء فئة جديدة، ولذلك عندما تقوم بإسقاط الأداة على النموذج تكون الأداة فعلاً قد ملئت بأسماء الخطوط.

انظر للصورة هنا.

اذا نقرت على السهم الصغير للأداة واختر Edit Itesm فستنتقل الى الـ Editor حيث يمكنك مطالعة كل أسماء الخطوط.

واذا انتقلت الى الـ Form Designer فسيمكنك أيضا مشاهدة كود الإضافة أنظر للشكل التالي:

'UserControl11

        '

        Me.UserControl11.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList

        Me.UserControl11.FormattingEnabled = True

        Me.UserControl11.Items.AddRange(New Object() {"Agency FB", "Aharoni", "Andalus", "Angsana New", "AngsanaUPC", "Arabic Transparent", "Arial", "Arial Black", "Arial Narrow", "Arial Rounded MT Bold", "Blackadder ITC", "Bodoni MT", "Bodoni MT Black", "Bodoni MT Condensed", "Book Antiqua", "Bookman Old Style", "Bookshelf Symbol 7", "Bradley Hand ITC", "Browallia New", "BrowalliaUPC", "Calisto MT", "Castellar", "Century Gothic", "Century Schoolbook", "Comic Sans MS", "Copperplate Gothic Bold", "Copperplate Gothic Light", "Cordia New", "CordiaUPC", "Courier New", "Curlz MT", "David", "David Transparent", "DilleniaUPC", "Edwardian Script ITC", "Elephant", "Engravers MT", "Eras Bold ITC", "Eras Demi ITC", "Eras Light ITC", "Eras Medium ITC", "Estrangelo Edessa", "EucrosiaUPC", "Felix Titling", "Fixed Miriam Transparent", "Forte", "Franklin Gothic Book", "Franklin Gothic Demi", "Franklin Gothic Demi Cond", "Franklin Gothic Heavy", "Franklin Gothic Medium", "Franklin Gothic Medium Cond", "FrankRuehl", "FreesiaUPC", "French Script MT", "Garamond", "Gautami", "Georgia", "Gigi", "Gill Sans MT", "Gill Sans MT Condensed", "Gill Sans MT Ext Condensed Bold", "Gill Sans Ultra Bold", "Gill Sans Ultra Bold Condensed", "Gloucester MT Extra Condensed", "Goudy Old Style", "Goudy Stout", "Haettenschweiler", "Impact", "Imprint MT Shadow", "IrisUPC", "JasmineUPC", "Kartika", "KodchiangUPC", "Latha", "Levenim MT", "LilyUPC", "Lucida Console", "Lucida Sans", "Lucida Sans Typewriter", "Lucida Sans Unicode", "Maiandra GD", "Mangal", "Marlett", "Microsoft Sans Serif", "Miriam", "Miriam Fixed", "Miriam Transparent", "MS Reference Sans Serif", "MS Reference Specialty", "MV Boli", "Narkisim", "Nina", "OCR A Extended", "Palace Script MT", "Palatino Linotype", "Papyrus", "Perpetua", "Perpetua Titling MT", "Pristina", "Raavi", "Rage Italic", "Rockwell", "Rockwell Condensed", "Rockwell Extra Bold", "Rod", "Rod Transparent", "Script MT Bold", "Shruti", "Simplified Arabic", "Simplified Arabic Fixed", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Traditional Arabic", "Trebuchet MS", "Tunga", "Tw Cen MT", "Tw Cen MT Condensed", "Tw Cen MT Condensed Extra Bold", "Verdana", "Vrinda", "Webdings", "Wingdings", "Wingdings 2", "Wingdings 3"})

        Me.UserControl11.Location = New System.Drawing.Point(37, 92)

        Me.UserControl11.Name = "UserControl11"

        Me.UserControl11.Size = New System.Drawing.Size(184, 21)

        Me.UserControl11.TabIndex = 0

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

والحل هو القيام بمسح الأداة من اي عناصر فيها كما بالشكل التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ComboBox

    Public Sub New()

        ' This call is required by the Windows Form Designer.

        InitializeComponent()

        Me.Items.Clear()

        Dim fonts As New Drawing.Text.InstalledFontCollection()

        Dim fontFamilies() As FontFamily = fonts.Families

        Dim fontFamily As FontFamily

        For Each fontFamily In fontFamilies

            Me.Items.Add(fontFamily.Name)

        Next

        Me.SelectedIndex = 1

        Me.DropDownStyle = ComboBoxStyle.DropDownList

    End Sub

End Class

والسطر المظلل هو السطر الذي تمت أضافته.

كما من الممكن ان تستخدم الأداة بدل من ان تعرض لك أسماء الخطوط تعرض لك أسماء الدول المتوفرة بالجهاز كما بالشكل التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ComboBox

    Public Sub New()

        ' This call is required by the Windows Form Designer.

        InitializeComponent()

        Me.Items.Clear()

        Dim Col As System.Globalization.CultureInfo

        For Each Col In My.Application.UICulture.GetCultures(Globalization.CultureTypes.AllCultures)

            Me.Items.Add(Col.EnglishName)

        Next

        Me.SelectedIndex = 1

        Me.DropDownStyle = ComboBoxStyle.DropDownList

    End Sub

End Class

او أسماء الطابعات المتوفرة على الجهاز كما بالشكل التالي:

Public Class UserControl1

    Inherits System.Windows.Forms.ComboBox

    Public Sub New()

        ' This call is required by the Windows Form Designer.

        InitializeComponent()

        Me.Items.Clear()

        Dim PDialog As New PrintDialog

        Dim MPrinter As String

        For Each MPrinter In PDialog.PrinterSettings.InstalledPrinters

            Me.Items.Add(MPrinter)

        Next

        Me.SelectedIndex = 1

        Me.DropDownStyle = ComboBoxStyle.DropDownList

    End Sub

End Class

والان نريد تصميم اداة تقوم برسم خط كما كان يوجد في الفيجوال بيسك 6 .

أنظر صورة عن المثال:

وهذا هو الكود كما بالشكل التالي:

Imports System.Drawing.Drawing2D

Public Class UserControl1

    Public Enum fghjk

        horizantl

        vertical

    End Enum

    Dim mDarkline As fghjk

    Public Property Darkline() As fghjk

        Get

            Darkline = mDarkline

        End Get

        Set(ByVal value As fghjk)

            mDarkline = value

        End Set

    End Property

    Private Sub UserControl1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

        '  Dim a As Graphics = Me.CreateGraphics

        If mDarkline = fghjk.vertical Then

            e.Graphics.DrawLine(Pens.DarkGray, 0, 0, Me.Width, 0)

            e.Graphics.DrawLine(Pens.White, 0, 1, Me.Width, 1)

        Else

            e.Graphics.DrawLine(Pens.DarkGray, 0, 0, 0, Me.Height)

            e.Graphics.DrawLine(Pens.White, 1, 0, 1, Me.Height)

        End If

    End Sub

    Private Sub UserControl1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

        If mDarkline = fghjk.vertical Then

            Me.Height = 2

        Else

            Me.Width = 2

        End If

    End Sub

End Class

طبعاً تطرقنا للحديث عن كل الأوامر الموجودة هنا.

في حدث Paint نقوم برسم الخط حسب المطلوب.

طبعاً توجد خاصية جديدة هنا لتقوم برسم الخط عمودي او أفقي ويستطيع المستخدم التغيير فيها من نافذة الخصائص.

وأيضا هذه اداة لم أكملها لتصبح احترافية ولكن سأعطيك فكرتها وأكمل انت الباقي أنظر صورة لها:

اداة يمكنك تغيير لونها ولها ظل ويمكن استخدامها مثل Group Box لاحتواء الأدوات.

طبعا انشأ اداة UserControl جديدة وضع عليها خمسة أدوات PictureBox اما الكود أنظر للشكل التالي:

Public Class UserControl2

    Private Sub UserControl2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        PictureBox1.Left = Me.Width - PictureBox1.Width

        PictureBox4.Top = Me.Height - PictureBox4.Width

        PictureBox4.Left = 0

        PictureBox3.Top = Me.Height - PictureBox4.Width

        PictureBox3.Left = 0 + PictureBox4.Width

        PictureBox3.Width = Me.Width

        PictureBox2.Left = Me.Width - PictureBox1.Width

        PictureBox2.Top = 0

        PictureBox2.Height = Me.Height

        Dim k As New Point(2, 2)

        PictureBox5.Location = k

        PictureBox5.Width = Me.Width - 8

    End Sub

    Private Sub UserControl2_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize

        PictureBox1.Left = Me.Width - PictureBox1.Width

        PictureBox4.Top = Me.Height - PictureBox4.Width

        PictureBox4.Left = 0

        PictureBox3.Top = Me.Height - PictureBox4.Width

        PictureBox3.Left = 0 + PictureBox4.Width

        PictureBox3.Width = Me.Width

        PictureBox2.Left = Me.Width - PictureBox1.Width

        PictureBox2.Top = 0

        PictureBox2.Height = Me.Height

        Dim k As New Point(2, 2)

        PictureBox5.Location = k

        PictureBox5.Width = Me.Width - 8

    End Sub

End Class

لاشئ اكواد للمحاذاة ولوضع كل شئ ففي مكانه فقط.

وأيضا هذه اداة ListBox ملونة أنظر الشكل التالي:

وهذا الكود هنا أنظر التالي:

Public Class UserControl1

    Private Sub UserControl1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem

        On Error Resume Next

        If e.Index = -1 Then Exit Sub

        Dim txtBrush, bgBrush As SolidBrush

        Dim TxtFnt As Font

        If e.Index Mod 2 = 0 Then

            ' تلوين العناصر الزوجيّة

            txtBrush = New SolidBrush(Color.Blue)

            bgBrush = New SolidBrush(Color.LightYellow)

        Else

            ' تلوين العناصر الفرديّة

            txtBrush = New SolidBrush(Color.DarkBlue)

            bgBrush = New SolidBrush(Color.PaleGreen)

        End If

        If e.State And DrawItemState.Selected Then

            ' استخدم اللون الأحمر والخطّ السميك مع العنصر المحدّد

            txtBrush = New SolidBrush(Color.Red)

            TxtFnt = New Font(Me.Font.Name, Me.Font.Size, FontStyle.Bold)

        Else

            TxtFnt = Me.Font

        End If

        e.Graphics.FillRectangle(bgBrush, e.Bounds)

        e.Graphics.DrawRectangle(Pens.Black, e.Bounds)

        Dim R As New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)

        e.Graphics.DrawString(Items(e.Index).ToString, TxtFnt, txtBrush, R)

        e.DrawFocusRectangle()

    End Sub

    Private Sub UserControl1_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles Me.MeasureItem

        On Error Resume Next

        Dim itmSize As SizeF

        Dim S As New SizeF(Me.Width, 200)

        itmSize = e.Graphics.MeasureString(Items(e.Index).ToString, Me.Font, S)

        e.ItemHeight = itmSize.Hei

ght

        e.ItemWidth = itmSize.Width

    End Sub

End Class

رسم وألوان ووراثة لا جديد، يجب وضع بالاعتبار ان هذه الأداة ترث الكنترول ListBox ولكن تم فعل ذلك عن طريق Form Designer

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

أولا تقوم بإعداد الصور ولتكن كما بالشكل التالي لهذا البرنامج مثلاً.

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

ولاحظ يفضل استخدام صور ذات التنسيق او اللاحقة Bmp في مثل هذه الأعمال.

على العموم يجب ان تجعل الخاصية Background Image للنموذج هذه الصورة.

انظر للشكل التالي :

هل ترى اللون بالخاصية BackColor عد إلى الصورة السابقة وانظر الى أطرافها وعند الزوايا سوف تجد إننا استخدمنا نفس هذا اللون.

والسبب هو إننا سوف نطلب من الفيجوال القيام بمسح هذا الجزء.

او بالأحرى سوف يقوم بمسح أي جزء يحتوي على هذا اللون.

أما الخاصية BackgroundImageLayout فيجب ان تكون None لتجنب تكرار رسم الصورة او تمددها وما شابه.

ان بيئة الـ .Net قد سهلت العمل كثيراً وكنت قديماً ستلجاء الى دوال API لتقوم بهذه الخطوة او هذه العملية.

الان لم يبقى الا البحث عن الخاصية TransparencyKey وجعل اللون لها نفس اللون الذي استخدمناه من الخلفية وبحواف الصورة.

وهو اللون الذي سوف يتم قطعه.

وألان سوف أتكبد عناء وضع صورة بحوالي 26 كيلوبايت فقط لاريك النتيجة أنظر للشكل التالي :

تم التخلص من الأجزاء الغير مرغوبة فيها وظهر النموذج بحواف دائرية.

طبعاً عليك اللجوء الى دوال API لتحريك النموذج .

الان أداة أخرى قمت ببرمجتها منذ فترة بعيدة تقوم بعرض صور وكتابة متحركة او منزلقة بأي اتجاه انظر للشكل التالي:

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

ويمكننا التحكم بالأداة عبر هذه الخصائص التالية:

الخاصية PictureScrool تحدد الصورة التي سوف نستخدمها كشريط منزلق

والخاصية ScrollMove تحدد الاتجاه هو هو أفقي ام عمودي.

أنشي مشروعاً جديدا وأضف أداة UserControl جديدة وضع عليها أداة PictureBox وأضف الأداة Timer .

تم قمت بكتابة هذا الكود :

Public Class UserControl1

    Public Enum myAligment

        LeftOrTop

        RightOrBottom

        Center

    End Enum

    Public Enum mdirctionn

        Forward

        Backward

    End Enum

    Public Enum mscrollmovveing

        Horizantl

        Vertical

    End Enum

    Dim mPictureScrool As Bitmap

    Dim mTimerTick As Integer

    Dim mScroolltick, mDirection, mScrollMove As Integer

    Dim mAligment, mSpace, mTopHide, mBottomHide As Integer

    Public Property PictureScrool() As Bitmap

        Get

            PictureScrool = mPictureScrool

        End Get

        Set(ByVal value As Bitmap)

            mPictureScrool = value

            PictureBox1.Image = mPictureScrool

            nmalging()

        End Set

    End Property

    Public Property TimerTick() As Integer

        Get

            TimerTick = mTimerTick

        End Get

        Set(ByVal value As Integer)

            mTimerTick = value

            Timer1.Interval = value

        End Set

    End Property

    Public Property Scroolltick() As Integer

        Get

            Scroolltick = mScroolltick

        End Get

        Set(ByVal value As Integer)

            mScroolltick = value

        End Set

    End Property

    Public Property Aligment() As myAligment

        Get

            Aligment = mAligment

        End Get

        Set(ByVal value As myAligment)

            mAligment = value

            nmalging()

        End Set

    End Property

    Public Property Space() As Integer

        Get

            Space = mSpace

        End Get

        Set(ByVal value As Integer)

            mSpace = value

        End Set

    End Property

    Public Property TopHide() As Integer

        Get

            TopHide = mTopHide

        End Get

        Set(ByVal value As Integer)

            mTopHide = value

        End Set

    End Property

    Public Property BottomHide() As Integer

        Get

            BottomHide = mBottomHide

        End Get

        Set(ByVal value As Integer)

            mBottomHide = value

        End Set

    End Property

    Public Property Direction() As mdirctionn

        Get

            Direction = mDirection

        End Get

        Set(ByVal value As mdirctionn)

            mDirection = value

        End Set

    End Property

    Public Property ScrollMove() As mscrollmovveing

        Get

            ScrollMove = mScrollMove

        End Get

        Set(ByVal value As mscrollmovveing)

            mScrollMove = value

        End Set

    End Property

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If mScrollMove = 0 Then

            If mDirection = 0 Then

                Dim op As Integer = PictureBox1.Height + mTopHide

                If PictureBox1.Top <= -op Then PictureBox1.Top = Me.Height + mBottomHide

                PictureBox1.Top -= mScroolltick

            Else

                Dim op As Integer = PictureBox1.Height + mTopHide

                If PictureBox1.Top >= Me.Height + mBottomHide Then PictureBox1.Top = -op

                PictureBox1.Top += mScroolltick

            End If

            '=============================

        Else

            If mDirection = 0 Then

                Dim op As Integer = PictureBox1.Width + BottomHide

                If PictureBox1.Left >= Me.Width + mTopHide Then PictureBox1.Left = -op

                PictureBox1.Left += mScroolltick

            Else

                Dim op As Integer = PictureBox1.Width + mTopHide

                If PictureBox1.Left <= -op Then PictureBox1.Left = Me.Width + mBottomHide

                PictureBox1.Left -= mScroolltick

            End If

        End If

    End Sub

    Private Sub UserControl1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter

        Timer1.Enabled = True

        If mScrollMove = 0 Then

            If mDirection = 0 Then

                PictureBox1.Top = Me.Height + BottomHide

            Else

                Dim op As Integer = PictureBox1.Height + mTopHide

                PictureBox1.Top = -op

            End If

            '===============================

        Else

            If mDirection = 0 Then

                PictureBox1.Left = Me.Width + BottomHide

            Else

                Dim op As Integer = PictureBox1.Width + mTopHide

                PictureBox1.Left = -op

            End If

        End If

    End Sub

    Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        nmalging()

    End Sub

    Private Sub nmalging()

        If mScrollMove = 0 Then

            If mAligment = 0 Then

                PictureBox1.Left = mSpace

            ElseIf mAligment = 1 Then

                PictureBox1.Left = (Me.Width - PictureBox1.Width) - mSpace

            ElseIf mAligment = 2 Then

                PictureBox1.Left = (Me.Width - PictureBox1.Width) \ 2

            End If

            '========================================

        Else

            If mAligment = 0 Then

                PictureBox1.Top = mSpace

            ElseIf mAligment = 1 Then

                PictureBox1.Top = (Me.Height - PictureBox1.Height) - mSpace

            ElseIf mAligment = 2 Then

                PictureBox1.Top = (Me.Height - PictureBox1.Height) \ 2

            End If

        End If

    End Sub

End Class

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


بداية البرمجة

المتغيرات

بداية يجب ان نتطرق الى كيف يمكننا التصريح عن المتغيرات.

يمكنك استخدام الكلمة Dim لتعريف المتغيرات كما بالمثال التالي:

Dim myvalue1 As Integer

Dim myvalue2 As String

كما تستطيع دمج عدة متغيرات في سطر واحد كالتالي:

Dim value1, value2, value3 As Integer

Dim value1, value2, value3 As String

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

Dim myvalue

اذا قمت باسناد قيمة له كما بالشكل التالي فسيتحول الى String

Dim myvalue = "any string"

ولكن من المفضل عدم استخدام هذه الطريقة فهي تسبب نوعاً من البطْ في التنفيذ.

وبالحديث عن المتغيرات سنجد انفسنا نذكر Option Explicit وهي تفيذ هل من الضروري الاعلان عن المتغيرات ام ليس ظروراً.

Option Explicit Off

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myvalue = "any value"

    End Sub

End Class

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

حسناً اين يمكن الاعلان عن المتغيرات...؟

في المثال السابق هذا المتغير محصور استخدامه بداخل الاجراء الذي هو فيه Form1_Load اما اذا وضعته تحت Public Class Form1 فسيكون متغيراً على مستوى هذه Class اي بين عبارة Class الى End Class راقب المثال التالي.

 Public Class Form1

    Dim myvalue As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        myvalue = "any value"

    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown

        myvalue = "any value"

    End Sub

End Class

كما ترى أمكننا ان نتصل به من عدة أماكن داخل هذه Class

كما لا يمكنك الإعلان عن متغير عام من داخل احد الإجراءات كما بالشكل التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Public myvalue2 = "any value"

    End Sub

End Class

وأنما يمكنك ذلك في قسم التصاريح العامة في بداية Class كما بالشكل التالي:

Public Class Form1

Public myvalue2 = "any value"

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

ان هذا المتغير يمكنك الوصول اليه من اي مكان في مشروعك من خلال هذه الـ Class وهي Form1 فتكون نتيجة ذلك كالتالي:

Public Class Form2

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Form1.myvalue2 = "anyvalue"

    End Sub

End Class

لاحظ أننا بداخل Form2 والمتغير في Form1 وأمكن البرنامج رؤية المتغير أنظر الشكل التالي:

ان متغيرنا موجود هنا ويمكننا الاتصال به.

وبالمثل اذا استخدمت هذه الطريقة بأي مكان ولنفرض بداخل Modules فان كان المتغير بداخل احد الإجراءات فسيكون بالإمكان استخدامه بداخل الإجراء فقط وان كان في قسم التصاريح العامة فسيكون على مستوى الـ Class وان استخدمت العبارة Dim في قسم التصاريح العامة فسيكون على مستوى Class اما Public فسيكون على مستوى المشروع ككل.

كما يمكنك استخدام نفس المتغير بداخل احد الإجراءات مع انك أعلنت عنه بقسم التصاريح العامة كما بالشكل التالي:

   Public Class Form2

    Dim k As Integer

    Dim value As String

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As String

        For k = 0 To 100

        Next

    End Sub

End Class

ولكن لا يمكنك استخدام هذه الطريقة أنظر الشكل التالي:

   Public Class Form2

    Dim k As Integer

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim value As String

        For k = 0 To 100

        Dim value As String

        Next

    End Sub

End Class

أي وهي الإعلان عن نفس المتغير بداخل نفس الإجراء.

كما يمكنك إسناد القيم لحظة الإعلان عن المتغير كما بالشكل التالي:

Public Class Form2

    Dim value As String = "any value"

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

كما يمكنك فعل هذا

  Public Class Form2

    Dim value1 As Integer = 4

    Dim value2 As Integer = 3 + value1

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

End Class

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

 Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim [new] As String

        [new] = "dfgd"

        MsgBox([new])

    End Sub

End Class

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

أنواع المتغيرات

هذه بعض انواع المتغيرات التي سوف تواجهك وتحتاج أليها.

نوع المتغير | نوعه | الحجم | Example
String | متغير نصي | 16-bit لكل حرف | Dim Value As String ="Any String"
Integer | متغير حرفي | 32-bit | Dim Value As Integer=34500000
Boolean | منطقي | 16-bit | Dim Value As Boolean=True
Decimal | عشري | 128-bit | Dim Value As Decimal = 457.103
Date | تاريخ | 64-bit | Dim value As Date = #11/17/1971#
Char | حرف | 16-bit | Dim Value As Char = "A"
Byte | عدد صحيح | 8-bit | Dim Value As Byte() = {&H0, &H12, &H34, &H56, &HAA, &H55, &HFF}
Long | عدد صحيح طويل جداً | 64-bit | Dim WorldPop As Long = 4800000004
Object | يقبل كل شئ ويكون اي شئ | 32-bit | Dim Value As Object = CreateObject("Word.Application")
Single | عشري ويمثل اعداد سالبة وموجبة صغيرة | 32-bit | Dim Price As Single = 899.99
Double | عدد عشري | 64-bit | Dim Pi As Double = 3.1415926535
Short | عدد صحيح | 16-bit | Dim Value As Short = 12500

كما توجد طريقة الاعلان عن المتغيرات في الفجوال بطريقة مختلفة وعن طريق بعض من الرموز أنظر للجدوال التالي:

رمز تعريف النوع | نوع المتغير | مثال
% | Integer | Dim L%
& | Long | Dim M&
@ | Decimal | Const W@ = 37.5
! | Single | Dim Q!
# | Double | Dim X#
$ | String | Dim V$ = "Secret"

طبعاً يمكنك التأكد من نوع المتغير عن طريق الدالة GetType كما بالشكل التالي:

Public Class Form1

    Dim L%

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        MsgBox(L.GetType.ToString)

    End Sub

End Class

والنتيجة ستكون System.Int32

كما لا توجد احرف خاصة لباقي المتغيرات مثل :

Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong, or UShort data


Web And Html Lesson

مجموعة من الدروس الجيدة والتي من الممكن ان تساعدك في عمل الكثير من الأمور في سرعة.

عند عرض الصفحات أحيانا تحتاج الى إظهار الأمثلة عن طريق النقر على رابط الإظهار كما بالشكل التالي :

عندما تقوم بالنقر على الرابط المحدد بمربع اخظر تحصل على شكل كما بالتالي :

كما تشاهد المثال مع زر تحته اذا نقرت عليه تم عرض النتيجة عملياً.

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

من هذه القائمة أختر View Source .

How to Fly Text in DHTML Exsmple

Measuring Element Dimension and Location

Controlling Presentation with Measurement and Location Properties

About Element Positioning

Language Codes

Color Table

HTTP Response Headers

HTML Elements

Behaviors Library

Finding Text in the Document

How to Add a Shortcut Icon to a Web Page

How To Create a Mouse Capture Drop-down Menu

Changing Element Styles

Introduction to Dynamic Styles

Using the Popup Object

Using the TextRange Object

Using IFRAME Elements

Using AutoComplete in HTML Forms

Introduction to Forms

Introduction to Filters and Transitions

Working with Windows, Frames, and Dialog Boxes

How to Change Text Color Character by Character

Visual Filters and Transitions Reference Exsmple

How to Animate a Sequence of Elements

background Attribute | background Property

CSS Reference

Introduction to Viewlink

About Data Binding Architecture

mediaBar Behavior


نافذة التصميم Desiner form

مواقع تفيدك Usefully Website

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

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

والموقع على العنوان التالي:

http://www.codeproject.com/

وهذه صورة له:

أيضا من المواقع الجيدة والتي تقدم مجموعة من الأدوات البرمجية الموقع:

http://www.tmssoftware.com

طبعاً يقدم أدوات لمختلف لغات البرمجة ومن ضمنها .Net Components

أيضا لدينا موقع أخر يقدم المئات من الأدوات البرمجية بعضها تجريبي والبعض الأخر مجاني وبعضها بمقابل وكذلك الاكواد والبرامج والمكتبات وغيرها وعنوان الموقع:

http://www.componentsource.com

أيضا موقع لشركة تقدم مكتبة كبيرة من الأدوات التي يمكن ان تغنيك عن الكثير من الأمور الأخرى وتسهل عملك بشكل كبير ويمكنك تحميل نسخة من الموقع وتجربتها على جهازك.

وعنوان الموقع هو:

http://www.devexpress.com

برامج تفيدك

أخترت لكم هذا البرنامج (Axialis IconWorkshop) والذي يقوم بتصميم الايقونات والصور مع مؤثرات كثيرة .

كالظلال واللمعات وغيرها وهو بحق يعتبر برنامجاً محترفاً يتسم بالسهولة والبساطة.

قد يقول شخص انا استخدم برنامجاً أكثر احترافية وهو الفوتوشوب ، ويكون كمن ذهب ليقتل ذبابة فاستخدم دبابة.

وهذه صورة عنه:


بعض الاوامر الشائعة الاستخدام Co

أستدعا دوال Windows API

ان الـ API مكتبات الربط الديناميكي (DLL) والتي هي جزء من نظام التشغيل.

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

ولكي اكون اكثر واقعية تحتوي على الالاف من الاجرءات او الدوال، كما انها قد تحتوي على صور وايقونات، او حتى بيانات.

والفرق بينها وبين الملفات التنفيذية انها لا تعمل الا عن طريق تطبيق أخر .

كما من ميزاتها انها من الممكن ان تعمل مع العديد من التطبيقات ، اي ملف واحد يؤدي مهام الى العديد من التطبيقات الاخرى.

انت ستستخدم هذه الدوال عندما يعجز او تعجز لغة البرمجة التي تستعملها عن تنفيذ عملية ما.

فعلى سبيل المثال الدالة FlashWindowEx والتي تمكنك من جعل شريط العنوان للنموذج يومض لا يمكنك فعلها من داخل الفجوال نت.

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

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

والمحور السيني والصادي وغيرها، كما ستستخدم احداث الفأرة وغيرها.

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

كانت دوال API جزء مهم للفجوال بيسك 6 ولكن مع الفجوال نت اصبحت نادرة الاعتماد.

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

ان الطريقة الاكثر شيوعاً لاستخدام دوال API هي باستخدام العبارة Declare كما بالمثال التالي :

Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( _

     ByVal hWnd As Integer, _

     ByVal txt As String, _

     ByVal caption As String, _

     ByVal Typ As Integer) _

     As Integer

وكما تشاهد كل دالة تملك أسم الاجراء والمكتبة وبعض البرامترات المطلوبة والتي سيتم تمريرها.

أحياناً تحتاج بعض الدوال الى ثوابت معينة لتعمل معها كما بالشكل التالي :

   Const MB_ICONQUESTION As Integer = &H20

   Const MB_YESNO As Integer = &H4

   Const IDYES As Integer = 6

   Const IDNO As Integer = 7

وطبعاً هناك الكثير من البرامج التي تقدم لك أي دالة مع كل ما يلزمها من متغيرات وتوابث وما الى ذلك.

والان هذا مثال كامل عن استخدام هذه الدالة مع الثوابت التي تخصها أنظر للشكل التالي :

Public Class Form1

    Const MB_ICONQUESTION As Integer = &H20

    Const MB_YESNO As Integer = &H4

    Const IDYES As Integer = 6

    Const IDNO As Integer = 7

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( _

     ByVal hWnd As Integer, _

     ByVal txt As String, _

     ByVal caption As String, _

     ByVal Typ As Integer) _

     As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' لحفظ القيمة العائدة

        Dim RetVal As Integer

        RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", _

            MB_ICONQUESTION Or MB_YESNO)

        ' التحقق من القيمة العائدة

        If RetVal = IDYES Then

            MsgBox("You chose Yes")

        Else

            MsgBox("You chose No")

        End If

    End Sub

End Class

هذا مثال بسيط فقط للتوضيح ليس أكثر، فلا اعتقد انك تريد إنشاء الرسائل بهذه الطريقة.

كما يمكن استدعاء هذه الدوال باستخدام DLLImport وهي تزودك بطريقة أخرى لعملية الاستدعاء.

أنظر للشكل التالي :

Imports System.Runtime.InteropServices

Public Class Form1

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, _

    CharSet:=CharSet.Unicode, ExactSpelling:=True, _

    CallingConvention:=CallingConvention.StdCall)> _

    Public Shared Function MoveFile(ByVal src As String,ByVal dst As String)As Boolean

        ' أترك هذا الاجراء هنا خالياً

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")

        If RetVal = True Then

            MsgBox("تم نقل الملف بنجاح")

        Else

            MsgBox("تعذر نقل الملف")

        End If

    End Sub

End Class

وتوجد العديد من المكتبات مثل :

للتعامل مع الجرافيكس مثل الرسم وما شابه | GDI32.Dll
للتعامل مع الذاكرة والمعالج الخ | Kernel32.Dll
للتعامل مع القوائم والنوافذ والرسائل الخ | User32.Dll

كما تحتوي بعض الملفات على صور وايقونات يمكننا استخدامها في برامجنا او ماشابه.

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

كما يمكنك ان تشاهد وضعت بعض الملفات الافتراضية التي يمكن الحصول منها على بعض الايقونات، كما يمكنك تحديد ملف معين أخر.

وطبعاً ويمكنك ان تشاهد رقم الفهرسة الدال على موقع الايقونة.

مثلاً يمكن للفجوال ستوديو جلب الايقونات من هذا الملف لاحظ الشكل التالي:

Dim MIcon As Icon

   MIcon = Drawing.Icon.ExtractAssociatedIcon("c:\windows\system32\shell32.dll")

Me.Icon = MIcon

طبعاً هذه طريقة ليست ذات جدوى لانها سوف تأتي بأول ايقونة وتجعلها هي الايقونة للنموذج.

وهناك طرق أخرى يمكننا بها تحديد ايقونة معينة.

وبما انني بدأت استعرض أعمالي فهذا البرنامج يمكنه ايضاً الكشف عن كل الدوال التي تصدرها الـ Dll أنظر للشكل التالي:

أطمح لان أجعله يكتب الدالة بالبارممترات التي تتبعها ويجلب كذلك كل المتغيرات او الثوابت التي تخصها.

كما يوجد هذا البرنامج (API-Guide) الذي يقدم لك الدالة على طبق من الذهب مع مثال عن طريقة الاستخدام ، وطبعاً هو يحتفظ بكل هذه المعلومات في ملف لقاعدة البيانات.

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

كما يوجد برنامج ياتي مع الفجوال بيسك 6 (API Viewer) ويؤدي نفس الغرض وهذه صورته وهو غني عن التعريف.

كما أنصح باستخدام Upgrade Visual Basic 6 Code والذي تجده تحت القائمة Tools كما بالشكل التالي :

واعتقد انني قراءت موضوعاً من قبل تتحدث فيه مايكروسوفت على انه ولاستخدام بعض دوال API او بالاحرى تم تغيير بعض المؤشرات .

واعتقد قالت ان المؤشر Any يجب تحويله ليكون Byte ولهذا نصحتك باستخدام هذه الطريقة ليكتشف الفجوال ستوديو ذلك ويحول لك بين انواع المؤشرات.

طبعاً بحال حصلت على خطاء في استخدام احدى الدوال.

وحقيقة لا ارتاح كثيرا لهذه الدوال ولاعطيك مثالا انظر لهذه الدالة التي تقوم بعملية رسم صورة .

'used with fnWeight

Const FW_DONTCARE = 0

Const FW_THIN = 100

Const FW_EXTRALIGHT = 200

Const FW_LIGHT = 300

Const FW_NORMAL = 400

Const FW_MEDIUM = 500

Const FW_SEMIBOLD = 600

Const FW_BOLD = 700

Const FW_EXTRABOLD = 800

Const FW_HEAVY = 900

Const FW_BLACK = FW_HEAVY

Const FW_DEMIBOLD = FW_SEMIBOLD

Const FW_REGULAR = FW_NORMAL

Const FW_ULTRABOLD = FW_EXTRABOLD

Const FW_ULTRALIGHT = FW_EXTRALIGHT

'used with fdwCharSet

Const ANSI_CHARSET = 0

Const DEFAULT_CHARSET = 1

Const SYMBOL_CHARSET = 2

Const SHIFTJIS_CHARSET = 128

Const HANGEUL_CHARSET = 129

Const CHINESEBIG5_CHARSET = 136

Const OEM_CHARSET = 255

'used with fdwOutputPrecision

Const OUT_CHARACTER_PRECIS = 2

Const OUT_DEFAULT_PRECIS = 0

Const OUT_DEVICE_PRECIS = 5

'used with fdwClipPrecision

Const CLIP_DEFAULT_PRECIS = 0

Const CLIP_CHARACTER_PRECIS = 1

Const CLIP_STROKE_PRECIS = 2

'used with fdwQuality

Const DEFAULT_QUALITY = 0

Const DRAFT_QUALITY = 1

Const PROOF_QUALITY = 2

'used with fdwPitchAndFamily

Const DEFAULT_PITCH = 0

Const FIXED_PITCH = 1

Const VARIABLE_PITCH = 2

'used with SetBkMode

Const OPAQUE = 2

Const TRANSPARENT = 1

Const LOGPIXELSY = 90

Const COLOR_WINDOW = 5

Const Message = "Hello !"

Private Type RECT

    Left As Long

    Top As Long

    Right As Long

    Bottom As Long

End Type

Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long

Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal nHeight As Long, ByVal nWidth As Long, ByVal nEscapement As Long, ByVal nOrientation As Long, ByVal fnWeight As Long, ByVal fdwItalic As Boolean, ByVal fdwUnderline As Boolean, ByVal fdwStrikeOut As Boolean, ByVal fdwCharSet As Long, ByVal fdwOutputPrecision As Long, ByVal fdwClipPrecision As Long, ByVal fdwQuality As Long, ByVal fdwPitchAndFamily As Long, ByVal lpszFace As String) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long

Private Declare Function MulDiv Lib "kernel32" (ByVal nNumber As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long

Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long

Private Declare Function GetSysColorBrush Lib "user32" (ByVal nIndex As Long) As Long

Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long

Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Dim mDC As Long, mBitmap As Long

Private Sub Form_Click()

    Unload Me

End Sub

Private Sub Form_Load()

    'KPD-Team 1999

    'URL: http://www.allapi.net/

    'E-Mail: KPDTeam@Allapi.net

    Dim mRGN As Long, Cnt As Long, mBrush As Long, R As RECT

    'Create a device context, compatible with the screen

    mDC = CreateCompatibleDC(GetDC(0))

    'Create a bitmap, compatible with the screen

    mBitmap = CreateCompatibleBitmap(GetDC(0), Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)

    'Select the bitmap nito the device context

    SelectObject mDC, mBitmap

    'Set the bitmap's backmode to transparent

    SetBkMode mDC, TRANSPARENT

    'Set the rectangles' values

    SetRect R, 0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY

    'Fill the rect with the default window-color

    FillRect mDC, R, GetSysColorBrush(COLOR_WINDOW)

    For Cnt = 0 To 350 Step 30

        'Select the new font into the form's device context and delete the old font

        DeleteObject SelectObject(mDC, CreateMyFont(24, Cnt))

        'Print some text

        TextOut mDC, (Me.Width / Screen.TwipsPerPixelX) / 2, (Me.Height / Screen.TwipsPerPixelY) / 2, Message, Len(Message)

    Next Cnt

    'Create an elliptical region

    mRGN = CreateEllipticRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)

    'Set the window region

    SetWindowRgn Me.hWnd, mRGN, True

    'delete our elliptical region

    DeleteObject mRGN

End Sub

Function CreateMyFont(nSize As Integer, nDegrees As Long) As Long

    'Create a specified font

    CreateMyFont = CreateFont(-MulDiv(nSize, GetDeviceCaps(GetDC(0), LOGPIXELSY), 72), 0, nDegrees * 10, 0, FW_NORMAL, False, False, False, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "Times New Roman")

End Function

Private Sub Form_Paint()

    'Copy the picture to the form

    BitBlt Me.hdc, 0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, mDC, 0, 0, vbSrcCopy

End Sub

Private Sub Form_Unload(Cancel As Integer)

    'clean up

    DeleteDC mDC

    DeleteObject mBitmap

End Sub

يمكنك فعل ذلك بالفجوال ستوديو كما بالشكل التالي:

Imports System

Imports System.Windows.Forms

Imports System.Drawing

Public Module modmain

   Sub Main()

      Dim theForm as MainForm = new MainForm()

      theForm.ShowDialog()

   End Sub

End Module

Public Class MainForm

Inherits Form

   Dim BackGround as new Bitmap")C:\Windows\Bubbles.bmp("

   Protected Overrides Sub OnPaint(e as PaintEventArgs(

      e.Graphics.DrawImage(BackGround, new Point(0, 0((

   End Sub

End Class


مكتبة للتعامل مع العتاد

مكتبة كاملة للتعامل مع عتاد الجهاز

هذه الاكواد قد تم تجميعها من اماكن متفرقة والان اضعها هنا للاستفادة وتكملة للدروس، فيمكنك ملاحظة طريقة عملها واستنباط افكار جديدة خاصة بك.

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

فتح سواقة الاقراص

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

    Public Sub OpenCDDriveDoor()

        Try

            Call mciSendString("Set CDAudio Door Open", 0, 0, 0)

        Catch ex As Exception

        End Try

إغلاق سواقة الاقراص

Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

    Public Sub CloseCdDriveDoor()

        Try

            Call mciSendString("Set CDAudio Door Closed", 0, 0, 0)

        Catch ex As Exception

        End Try

    End Sub

إيقاف الفأرة ولوحة المفاتيح

 Private Declare Function BlockInput Lib "user32" (ByVal fBlock As Boolean) As Boolean

        " Stop mouse & keyboard

        BlockInput(True)

        " Start mouse & keyboard

        BlockInput(False)

فتح خصائص الطابعة

 Public Declare Function ConnectToPrinterDlg Lib "winspool.drv" Alias "ConnectToPrinterDlg" (ByVal hwnd As Integer, ByVal flags As Integer) As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ConnectToPrinterDlg(Me.Handle.ToInt32, 2)

    End Sub

أصدارة نظام التشغيل

        MessageBox.Show("OS Version: " + Environment.OSVersion.ToString, "Operating System", MessageBoxButtons.OK, MessageBoxIcon.Information)

الوقت المنقضى على تشغيل الجهاز حتى الان

MsgBox(My.Computer.Clock.TickCount)

أسم نظام التشغيل

Public Function GetWinName() As String

        Dim a As String

        a = My.Computer.Info.OSFullName

        GetWinName = a

    End Function

مجلد النظام

   Public Function SystemDir() As String

        Dim a As String

        a = System.Environment.GetFolderPath(Environment.SpecialFolder.System)

        SystemDir = a

    End Function

أسم المستخدم

 Public Function UserName() As String

        Dim a As String

        a = System.Environment.UserName

        UserName = a

    End Function

مسار البرنامج

 Public Function CurrentDirectory() As String

        Dim a As String

        a = System.Environment.CurrentDirectory

        CurrentDirectory = a

    End Function

Company name

 Public Function Org() As String

        Dim a As String

        a = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization", "Error")

        Return a

    End Function

OwnerPC

 Public Function OwnerPC() As String

        Dim a As String

        a = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOwner", "Error")

        Return a

    End Function

عدد المعالجات

MsgBox(System.Environment.ProcessorCount)

حجم الذاكرة الفيزيائية

  MsgBox(My.Computer.Info.TotalPhysicalMemory)

حالة المفتاح CapsLock

  MsgBox(My.Computer.Keyboard.CapsLock)

أصدارة نظام التشغيل

        MessageBox.Show("OS Version: " + Environment.OSVersion.ToString, "Operating System", MessageBoxButtons.OK, MessageBoxIcon.Information)

WorkingSet يخص اعدادات العرض

  MsgBox(System.Environment.WorkingSet)

perfFreeMemory

 Dim perfFreeMemory As New PerformanceCounter("Memory", _

           "Available MBytes")

        MessageBox.Show("There are " & perfFreeMemory.NextValue & _

           "MB of memory available on your system. This program requires more.")

الطابعات المتوفرة

 Dim a As New PrintDialog

        Dim ar As String

        For Each ar In a.PrinterSettings.InstalledPrinters

            MsgBox(ar)

        Next

هل توجد طابعة متصلة

 Dim a As New PrintDialog

        If a.PrinterSettings.InstalledPrinters.Count = 0 Then

            MsgBox("Installed printer")

        Else

            MsgBox("No printer installed")

        End If

أسم الجهاز

 Public Function MachineName() As String

        Dim a As String

        a = System.Environment.MachineName

        MachineName = a

    End Function

UserDomainName

 Public Function UserDomainName() As String

        Dim a As String

        a = System.Environment.UserDomainName

        UserDomainName = a

    End Function

المتوفر من الذاكرة الفيزيائية

 MsgBox(My.Computer.Info.AvailablePhysicalMemory)

حالة المفتاح NumLock

MsgBox(My.Computer.Keyboard.NumLock)

أسماء الدول المتوفرة بالنظام

  Dim Col As System.Globalization.CultureInfo

        For Each Col In My.Application.UICulture.GetCultures(Globalization.CultureTypes.AllCultures)

            ComboBox1.Items.Add(Col.EnglishName)

        Next

أسم المعالج أو الشركة

 Dim a As Process

        For Each a In Process.GetProcesses

            MsgBox(a.ProcessName)

        Next

الخدمات

 Dim Ser As System.ServiceProcess.ServiceController

        For Each Ser In System.ServiceProcess.ServiceController.GetServices

            ComboBox1.Items.Add(Ser.ServiceName)

        Next

SystemInformation يمكنك الاستعلام عن العديد من العتاد فقط قم بتغيير Keyboardspeed الى شئ أخر

 MsgBox(SystemInformation.KeyboardSpeed)

DisableDesktopCleanupWizard اخفاء معالج تنظيف سطح المكتب او العكس

 Public Sub DisableDesktopCleanupWizard(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\CleanupWiz", "NoRun", 0, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\CleanupWiz", "NoRun", 1, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

ShowWindowsVersionOnDesktop

 Public Sub ShowWindowsVersionOnDesktop(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "PaintDesktopVersion", 1, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "PaintDesktopVersion", 0, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

تغيير حجم أيقونات سطح المكتب

 Public Sub ChangeDesktopIconSize(ByVal Size As Integer)

        If Size = Nothing Then Exit Sub

        My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "Shell Icon Size", Size, Microsoft.Win32.RegistryValueKind.String)

    End Sub

إلغاء مشاركة المجلدات على الجهاز

 Public Sub RemoveSharedDocumentsFromMyComputer(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoSharedDocuments", 0, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoSharedDocuments", 1, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

DisableFileMenu

 Public Sub DisableFileMenu(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoFileMenu", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoFileMenu", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

تغيير أسم الشركة

 Public Sub ChangeCompanyName(ByVal name As String)

        If Name = Nothing Then

            MsgBox("You dont select name:", MsgBoxStyle.Critical, "Error")

        Else

            My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization", Name)

        End If

    End Sub

RemoveUsernameFromTheStartMenu

 Public Sub RemoveUsernameFromTheStartMenu(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoUserNameInStartMenu", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoUserNameInStartMenu", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

تغيير أسم المستخدم

 Public Sub ChangeOwnerName(ByVal name As String)

        If Name = Nothing Then

            MsgBox("You dont select name:", MsgBoxStyle.Critical, "Error")

        Else

            My.Computer.Registry.SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOwner", Name)

        End If

    End Sub

إلغاء التحديث التلقائي

 Public Sub DisableWindowsUpdate(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoWindowsUpdate", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoWindowsUpdate", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

أخفاء لوحة التحكم

 Public Sub DisableControlPanel(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoControlPanel", "1", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoControlPanel", "0", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

التشغيل مع بداية أقلاع النظام

 imports(Microsoft.Win32)

        Imports System.Windows.Forms

    Public Sub RunatStartup(ByVal PutAtStartup As Boolean, ByVal ProgramName As String)

        Dim StartupPath As String = "Software\Microsoft\Windows\CurrentVersion\Run"

        Dim MyKey As RegistryKey = Registry.CurrentUser.OpenSubKey(StartupPath, True)

        If PutAtStartup Then

            MyKey.SetValue(ProgramName, Application.ExecutablePath)

        Else

            Try

                MyKey.DeleteValue(ProgramName, False)

            Catch ex As Exception

                ex = Nothing

            End Try

        End If

الحصول على كل البرامج ببدء التشغيل

 Dim Reg As Microsoft.Win32.RegistryKey

        Reg = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)

        Dim St() As String

        St = Reg.GetValueNames

        Dim ToList As String

        For Each ToList In St

            ListBox1.Items.Add(ToList & " Path : " & Reg.GetValue(ToList))

        Next

أخفاء جهاز الكمبيوتر من كل مكان

 Public Sub RemoveMyComputerFromAllThing(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\NonEnum", "{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\NonEnum", "{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

أفراغ سلة المحذوفات

 Private Declare Function SHEmptyRecycleBin Lib "shell32.dll" Alias "SHEmptyRecycleBinA" ( _

    ByVal hWnd As Integer, _

    ByVal pszRootPath As String, _

    ByVal dwFlags As Integer) As Integer

        Const SHERB_NOPROGRESSUI As Short = &H2S

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim retvaL As Integer

        retvaL = SHEmptyRecycleBin(Handle.ToInt32, "", SHERB_NOPROGRESSUI)

    End Sub

DisableContextMenuOfDesktop

 Public Sub DisableContextMenuOfDesktop(ByVal enable As Boolean)

        Select Case enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoViewContextMenu", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoViewContextMenu", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

حجم شريط المهام

 Public Sub TaskBarSize(ByVal Size As Short)

        My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarGroupSize", Size, Microsoft.Win32.RegistryValueKind.DWord)

    End Sub

RemoveRecentOnWindowsExit

 Public Sub RemoveRecentOnWindowsExit(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "ClearRecentDocsOnExit", "00000001", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "ClearRecentDocsOnExit", "00000000", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

RemoveMyDocumentsFromTheDesktop

 Public Sub RemoveMyDocumentsFromTheDesktop(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\ShellFolder", "Attributes", "0xf0400174 ", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\ShellFolder", "Attributes", "0xf0500174 ", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

DisablePropertiesMyComputer

 Public Sub DisablePropertiesMyComputer(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoPropertiesMyComputer", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoPropertiesMyComputer", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

HideTheInternetExplorerIcon

 Public Sub HideTheInternetExplorerIcon(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoInternetIcon", 0, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoInternetIcon", 1, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

ChangeTheRecycleBinIcons

 Public Sub ChangeTheRecycleBinIcons(ByVal EmptyIconFileName As String, ByVal FullIconFileName As String)

        If IO.File.Exists(EmptyIconFileName) = False Or IO.File.Exists(FullIconFileName) = False Then

            Exit Sub

        Else

            My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon", "Empty", EmptyIconFileName, Microsoft.Win32.RegistryValueKind.String)

            My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\DefaultIcon", "Full", FullIconFileName, Microsoft.Win32.RegistryValueKind.String)

        End If

    End Sub

LockTheSizeAndPositionOfTheTaskbar

 Public Sub LockTheSizeAndPositionOfTheTaskbar(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarSizeMove", 0, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "TaskbarSizeMove", 1, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

ShowHiddenOperatingSystemFiles

 Public Sub ShowHiddenOperatingSystemFiles(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "ShowSuperHidden", 1, Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "ShowSuperHidden", 0, Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

DisableCDBurning

 Public Sub DisableCDBurning(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoCDBurning", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", "NoCDBurning", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

ShowSendToContextMenu

 Public Sub ShowSendToContextMenu(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\Send To", "", "{7BA4C740-9E81-11CF-99D3-00AA004AE837}")

            Case False

                My.Computer.Registry.SetValue("HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\Send To", "", "empty")

        End Select

    End Sub

DisableAddRemovePrograms

 Public Sub DisableAddRemovePrograms(ByVal Enable As Boolean)

        Select Case Enable

            Case True

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system", "NoAddRemovePrograms", "0", Microsoft.Win32.RegistryValueKind.DWord)

            Case False

                My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system", "NoAddRemovePrograms", "1", Microsoft.Win32.RegistryValueKind.DWord)

        End Select

    End Sub

تشغيل أدوات لوحة التحكم

  'خيارات الوصول

System.Diagnostics.Process.Start("access.cpl")

    'أضافة جهاز

 System.Diagnostics.Process.Start("hdwwiz.cpl")

    'أضافة وإزالة برامج

  System.Diagnostics.Process.Start("appwiz.cpl")

    'تحديثات تلقائية

System.Diagnostics.Process.Start("appwiz.cpl")

    'خصائص العرض

System.Diagnostics.Process.Start("desk.cpl")

    'جدار الحماية

System.Diagnostics.Process.Start("firewall.cpl")

    'خصائص الأنترنيت

System.Diagnostics.Process.Start("inetcpl.cpl")

    'الخيارات الأقليمية وخيارات الغة

System.Diagnostics.Process.Start("intl.cpl")

    'أجهزة تحكم التسالي

System.Diagnostics.Process.Start("joy.cpl")

    'خيارات الماوس

System.Diagnostics.Process.Start("main.cpl")

    'خصائص الأصوات وأجهزة الأصوات

System.Diagnostics.Process.Start("mmsys.cpl")

    'أتصالات شبكة الأتصالات

System.Diagnostics.Process.Start("ncpa.cpll")

    'معالج شبكة الأتصالات

System.Diagnostics.Process.Start("netsetup.cpl")

    'حسابات المستخدمين

System.Diagnostics.Process.Start("nusrmgr.cpl")

    'إدارة مصار البيانات

System.Diagnostics.Process.Start("odbccp32.cpl")

    'خيارات الطاقة

System.Diagnostics.Process.Start("powercfg.cpll")

    'خصائص النظام

System.Diagnostics.Process.Start("sysdm.cpl")

    'خيارات الهاتف والمودم

System.Diagnostics.Process.Start("telephon.cpl")

    'خصائص التاريخ والوقت

System.Diagnostics.Process.Start("timedate.cpl")

    'مركز أمان ويندوز

System.Diagnostics.Process.Start("wscui.cpl")

    'التحديثات التقائية

System.Diagnostics.Process.Start("wuaucpl.cpl")

تغيير خلفية سطح المكتب

  Private Const SPI_SETDESKWALLPAPER As Integer = &H14

    Private Const SPIF_UPDATEINIFILE As Integer = &H1

    Private Const SPIF_SENDWININICHANGE As Integer = &H2

    Private Declare Auto Function SystemParametersInfo Lib "user32.dll" ( _

           ByVal uAction As Integer, ByVal uParam As Integer, _

           ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer

    Dim i As Double

    ' change this to whatever filename you want to use

    Const WallpaperFile As String = "MovieCollectionImage.bmp"

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim imageLocation As String

        imageLocation = My.Computer.FileSystem.CombinePath( _

            My.Computer.FileSystem.SpecialDirectories.MyPictures, WallpaperFile)

        Try

            pic1.BackgroundImage.Save(imageLocation, System.Drawing.Imaging.ImageFormat.Bmp)

            SystemParametersInfo(SPI_SETDESKWALLPAPER, -1, imageLocation, _

                SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

        Catch Ex As Exception

            MsgBox(Ex.Message, MsgBoxStyle.Critical, "Error")

        End Try

    End Sub

البرامج بادارة المهام

  Dim a As Process

        For Each a In Process.GetProcesses

            list1.Items.Add(a.ProcessName)

        Next

أيقاف خدمة كما يمكنك كتابة اسم اي خدمة غير Alert

  Dim Se As System.ServiceProcess.ServiceController

        For Each Se In System.ServiceProcess.ServiceController.GetServices

            If Se.DisplayName = "Alert" Then

                Se.Stop()

            End If

        Next

Class BaseBoard

 Public Class BaseBoard

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM win32_BaseBoard")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function Manufacturer()

        For Each getnow As ManagementObject In queryCollection

            Manufacturer = getnow("Manufacturer")

        Next

    End Function

    Public Function Version()

        For Each getnow As ManagementObject In queryCollection

            Version = getnow("Version")

        Next

    End Function

    Public Function HostingBoard()

        For Each getnow As ManagementObject In queryCollection

            HostingBoard = getnow("HostingBoard")

        Next

    End Function

    Public Function Product()

        For Each getnow As ManagementObject In queryCollection

            Product = getnow("Product")

        Next

    End Function

    Public Function SerialNumber()

        For Each getnow As ManagementObject In queryCollection

            SerialNumber = getnow("SerialNumber")

        Next

    End Function

    Public Function PoweredOn()

        For Each getnow As ManagementObject In queryCollection

            PoweredOn = getnow("PoweredOn")

        Next

    End Function

End Class

Class Com Port

 Public Class Com

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_SerialPort")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function PortUse() As System.Collections.ObjectModel.Collection(Of String)

        PortUse = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PortUse.Add(getnow("name"))

        Next

    End Function

    Public Function OnPort() As System.Collections.ObjectModel.Collection(Of String)

        OnPort = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            OnPort.Add(getnow("deviceid"))

        Next

    End Function

    Public Function MaxBaudRate() As System.Collections.ObjectModel.Collection(Of String)

        MaxBaudRate = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            MaxBaudRate.Add(getnow("MaxBaudRate"))

        Next

    End Function

End Class

كلاسس عن المعالج

  Public Class CPU

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim oqj As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_processor")

        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(mss, oqj)

        Dim queryCollection As ManagementObjectCollection = mos.Get

    Public Function GetName()

        For Each getnow As ManagementObject In queryCollection

            GetName = getnow("name").ToString

        Next

    End Function

    Public Function GetCaption() As String

        For Each getnow As ManagementObject In queryCollection

            GetCaption = getnow("Caption").ToString

        Next

    End Function

    Public Function GetManufacturer() As String

        For Each getnow As ManagementObject In queryCollection

            GetManufacturer = getnow("Manufacturer").ToString

        Next

    End Function

    Public Function GetSpeed() As String

        For Each getnow As ManagementObject In queryCollection

            GetSpeed = getnow("MaxClockSpeed").ToString

        Next

    End Function

    Public Function GetL2CacheSize() As String

        For Each getnow As ManagementObject In queryCollection

            GetL2CacheSize = getnow("L2CacheSize").ToString

        Next

    End Function

    Public Function SocketDesignation() As String

        For Each getnow As ManagementObject In queryCollection

            SocketDesignation = getnow("SocketDesignation").ToString

        Next

    End Function

    Public Function ProcessorId() As String

        For Each getnow As ManagementObject In queryCollection

            ProcessorId = getnow("ProcessorId").ToString

        Next

    End Function

    Public Function ExtClock() As String

        For Each getnow As ManagementObject In queryCollection

            ExtClock = getnow("ExtClock").ToString

        Next

    End Function

    Public Function CurrentVoltage() As String

        For Each getnow As ManagementObject In queryCollection

            CurrentVoltage = getnow("CurrentVoltage").ToString

        Next

    End Function

    Public Function Stepping() As String

        For Each getnow As ManagementObject In queryCollection

            Stepping = getnow("Stepping").ToString

        Next

    End Function

    Public Function Level() As String

        For Each getnow As ManagementObject In queryCollection

            Level = getnow("Level").ToString

        Next

    End Function

    Public Function Revision() As String

        For Each getnow As ManagementObject In queryCollection

            Revision = getnow("Revision").ToString

        Next

    End Function

    Public Function Version() As String

        For Each getnow As ManagementObject In queryCollection

            Version = getnow("Version").ToString

        Next

    End Function

End Class

كلاسس عن القرص الصلب

 Public Class HardDesk

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_diskdrive")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function GetName() As String

        For Each getnow As ManagementObject In queryCollection

            GetName = getnow("Caption").ToString

        Next

    End Function

    Public Function GetSize() As String

        For Each getnow As ManagementObject In queryCollection

            GetSize = getnow("size")

        Next

    End Function

    Public Function GetManufacturer() As String

        For Each getnow As ManagementObject In queryCollection

            GetManufacturer = getnow("Manufacturer").ToString

        Next

    End Function

    Public Function GetSerial() As String

        Dim HDinformation As New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")

        Dim HD As ManagementObject

        For Each HD In HDinformation.Get()

            GetSerial = HD("SerialNumber").ToString()

        Next

    End Function

    Public Function BytesPerSector() As String

        For Each getnow As ManagementObject In queryCollection

            BytesPerSector = getnow("BytesPerSector").ToString

        Next

    End Function

    Public Function Description() As String

        For Each getnow As ManagementObject In queryCollection

            Description = getnow("Description").ToString

        Next

    End Function

    Public Function MediaType() As String

        For Each getnow As ManagementObject In queryCollection

            MediaType = getnow("MediaType").ToString

        Next

    End Function

    Public Function Model() As String

        For Each getnow As ManagementObject In queryCollection

            Model = getnow("Model").ToString

        Next

    End Function

    Public Function TotalCylinders() As String

        For Each getnow As ManagementObject In queryCollection

            TotalCylinders = getnow("TotalCylinders").ToString

        Next

    End Function

    Public Function TotalSectors() As String

        For Each getnow As ManagementObject In queryCollection

            TotalSectors = getnow("TotalSectors").ToString

        Next

    End Function

    Public Function TotalHeads() As String

        For Each getnow As ManagementObject In queryCollection

            TotalHeads = getnow("TotalHeads").ToString

        Next

    End Function

    Public Function TotalTracks() As String

        For Each getnow As ManagementObject In queryCollection

            TotalTracks = getnow("TotalTracks").ToString

        Next

    End Function

End Class

كلاسس عن الاقراص الصلبة

 Public Class LogicalDisk

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim oqj As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_LogicalDisk")

        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(mss, oqj)

        Dim queryCollection As ManagementObjectCollection = mos.Get

    Public Function DiskCaption() As System.Collections.ObjectModel.Collection(Of String)

        DiskCaption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskCaption.Add(getnow("caption"))

        Next

    End Function

    Public Function DiskDeviceID() As System.Collections.ObjectModel.Collection(Of String)

        DiskDeviceID = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskDeviceID.Add(getnow("DeviceID"))

        Next

    End Function

    Public Function DiskDriveType() As System.Collections.ObjectModel.Collection(Of String)

        DiskDriveType = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskDriveType.Add(getnow("DriveType").ToString)

        Next

    End Function

    Public Function DiskFileSystem() As System.Collections.ObjectModel.Collection(Of String)

        DiskFileSystem = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskFileSystem.Add(getnow("FileSystem"))

        Next

    End Function

    Public Function DiskFreeSpace() As System.Collections.ObjectModel.Collection(Of String)

        DiskFreeSpace = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskFreeSpace.Add(getnow("FreeSpace"))

        Next

    End Function

    Public Function DiskMediaType() As System.Collections.ObjectModel.Collection(Of String)

        DiskMediaType = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskMediaType.Add(getnow("MediaType").ToString)

        Next

    End Function

    Public Function DiskSize() As System.Collections.ObjectModel.Collection(Of String)

        DiskSize = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskSize.Add(getnow("Size"))

        Next

    End Function

    Public Function DiskVolumeName() As System.Collections.ObjectModel.Collection(Of String)

        DiskVolumeName = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskVolumeName.Add(getnow("VolumeName"))

        Next

    End Function

    Public Function DiskVolumeSerialNumber() As System.Collections.ObjectModel.Collection(Of String)

        DiskVolumeSerialNumber = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DiskVolumeSerialNumber.Add(getnow("VolumeSerialNumber"))

        Next

    End Function

End Class

كلاسس عن الفأرة

 Public Class Mouse

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_PointingDevice")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function ConfigManagerUserConfig()

        For Each getnow As ManagementObject In queryCollection

            ConfigManagerUserConfig = getnow("ConfigManagerUserConfig")

        Next

    End Function

    Public Function Manufacturer()

        For Each getnow As ManagementObject In queryCollection

            Manufacturer = getnow("Manufacturer")

        Next

    End Function

    Public Function HardwareType()

        For Each getnow As ManagementObject In queryCollection

            HardwareType = getnow("HardwareType")

        Next

    End Function

End Class

Class pnpentity

 Public Class pnpentity

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_PnPEntity")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption() As System.Collections.ObjectModel.Collection(Of String)

        Caption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Caption.Add(getnow("Caption"))

        Next

    End Function

    Public Function Manufacturer() As System.Collections.ObjectModel.Collection(Of String)

        Manufacturer = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Caption.Add(getnow("Manufacturer"))

        Next

    End Function

End Class

كلاسس عن أجهزة الصوت

 Public Class Sound

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_sounddevice")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function DeviceID()

        For Each getnow As ManagementObject In queryCollection

            DeviceID = getnow("DeviceID")

        Next

    End Function

End Class

Object In queryCollection

                PrinterPortName.Add(getnow("PortName"))

            Next

        End Function

Public Function PrinterDeviceID() As System.Collections.ObjectModel.Collection(Of String)

    PrinterDeviceID = New System.Collections.ObjectModel.Collection(Of String)

    For Each getnow As ManagementObject In queryCollection

        PrinterDeviceID.Add(getnow("DeviceID"))

    Next

End Function

Public Function Hidden() As System.Collections.ObjectModel.Collection(Of String)

    Hidden = New System.Collections.ObjectModel.Collection(Of String)

    For Each getnow As ManagementObject In queryCollection

        Hidden.Add(getnow("Hidden"))

    Next

End Function

    End Class

كلاسس عن أجهزة الفيديو

 Public Class VideoCard

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_VideoController")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function GetName() As String

        For Each getnow As ManagementObject In queryCollection

            GetName = getnow("name").ToString

            Return GetName

        Next

    End Function

    Public Function VideoModeDescription() As String

        For Each getnow As ManagementObject In queryCollection

            VideoModeDescription = getnow("VideoModeDescription").ToString

        Next

    End Function

    Public Function VideoProcessor() As String

        For Each getnow As ManagementObject In queryCollection

            VideoProcessor = getnow("VideoProcessor").ToString

        Next

    End Function

    Public Function AdapterRAM() As String

        For Each getnow As ManagementObject In queryCollection

            AdapterRAM = getnow("AdapterRAM")

        Next

    End Function

    Public Function status() As String

        For Each getnow As ManagementObject In queryCollection

            status = getnow("status").ToString

        Next

    End Function

    Public Function AdapterCompatibility() As String

        For Each getnow As ManagementObject In queryCollection

            AdapterCompatibility = getnow("AdapterCompatibility").ToString

        Next

    End Function

    Public Function AdapterDACType() As String

        For Each getnow As ManagementObject In queryCollection

            AdapterDACType = getnow("AdapterDACType").ToString

        Next

    End Function

    Public Function DriverVersion() As String

        For Each getnow As ManagementObject In queryCollection

            DriverVersion = getnow("DriverVersion").ToString

        Next

    End Function

    Public Function InfFilename() As String

        For Each getnow As ManagementObject In queryCollection

            InfFilename = getnow("InfFilename").ToString

        Next

    End Function

    Public Function Monochrome() As String

        For Each getnow As ManagementObject In queryCollection

            Monochrome = getnow("Monochrome").ToString

        Next

    End Function

End Class

كلاسس عن حالة الشبكة

 Public Class Network

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim oqj As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(mss, oqj)

        Dim queryCollection As ManagementObjectCollection = mos.Get

    Public Function NewWorkCaption() As System.Collections.ObjectModel.Collection(Of String)

        NewWorkCaption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            NewWorkCaption.Add(getnow("caption"))

        Next

    End Function

    Public Function Description() As System.Collections.ObjectModel.Collection(Of String)

        Description = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Description.Add(getnow("Description"))

        Next

    End Function

    Public Function DHCPEnabled() As System.Collections.ObjectModel.Collection(Of String)

        DHCPEnabled = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            DHCPEnabled.Add(getnow("DHCPEnabled"))

        Next

    End Function

    Public Function ServiceName() As System.Collections.ObjectModel.Collection(Of String)

        ServiceName = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            ServiceName.Add(getnow("ServiceName"))

        Next

    End Function

    Public Function SettingID() As System.Collections.ObjectModel.Collection(Of String)

        SettingID = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            SettingID.Add(getnow("SettingID"))

        Next

    End Function

End Class

كلاسس عن القرص الليزري

 Public Class CD_ROM

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_cdromdrive")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function CdRomName() As System.Collections.ObjectModel.Collection(Of String)

        CdRomName = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            CdRomName.Add(getnow("name"))

        Next

    End Function

    Public Function CdRomManufacturer() As System.Collections.ObjectModel.Collection(Of String)

        CdRomManufacturer = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            CdRomManufacturer.Add(getnow("Manufacturer"))

        Next

    End Function

    Public Function Availability() As System.Collections.ObjectModel.Collection(Of String)

        Availability = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Availability.Add(getnow("Availability"))

        Next

    End Function

    Public Function Caption() As System.Collections.ObjectModel.Collection(Of String)

        Caption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Caption.Add(getnow("Caption"))

        Next

    End Function

    Public Function ConfigManagerErrorCode() As System.Collections.ObjectModel.Collection(Of String)

        ConfigManagerErrorCode = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            ConfigManagerErrorCode.Add(getnow("ConfigManagerErrorCode"))

        Next

    End Function

    Public Function Drive() As System.Collections.ObjectModel.Collection(Of String)

        Drive = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Drive.Add(getnow("Drive"))

        Next

    End Function

    Public Function MediaType() As System.Collections.ObjectModel.Collection(Of String)

        MediaType = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            MediaType.Add(getnow("MediaType"))

        Next

    End Function

    Public Function MediaLoaded() As System.Collections.ObjectModel.Collection(Of String)

        MediaLoaded = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            MediaLoaded.Add(getnow("MediaLoaded"))

        Next

    End Function

End Class

كلاسس عن لوحة المفاتيح

 Public Class keyboard

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_keyboard")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function KetBName()

        For Each getnow As ManagementObject In queryCollection

            KetBName = getnow("name")

        Next

    End Function

    Public Function KetBstatus()

        For Each getnow As ManagementObject In queryCollection

            KetBstatus = getnow("status")

        Next

    End Function

    Public Function KetBDeviceID()

        For Each getnow As ManagementObject In queryCollection

            KetBDeviceID = getnow("DeviceID")

        Next

    End Function

    Public Function Description()

        For Each getnow As ManagementObject In queryCollection

            Description = getnow("Description")

        Next

    End Function

End Class

كلاسس عن الذاكرة

 Public Class Memory

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_physicalmemory")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Names()

        For Each getnow As ManagementObject In queryCollection

            Names = getnow("name")

        Next

    End Function

    Public Function Capacity()

        For Each getnow As ManagementObject In queryCollection

            Capacity = getnow("Capacity")

        Next

    End Function

    Public Function DeviceLocator()

        For Each getnow As ManagementObject In queryCollection

            DeviceLocator = getnow("DeviceLocator")

        Next

    End Function

    Public Function TotalWidth()

        For Each getnow As ManagementObject In queryCollection

            TotalWidth = getnow("TotalWidth")

        Next

    End Function

End Class

كلاسس عن اللوحة الام

 Public Class MotherBoard

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_MotherboardDevice")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function PrimaryBusType()

        For Each getnow As ManagementObject In queryCollection

            PrimaryBusType = getnow("PrimaryBusType")

        Next

    End Function

    Public Function SecondaryBusType()

        For Each getnow As ManagementObject In queryCollection

            SecondaryBusType = getnow("SecondaryBusType")

        Next

    End Function

End Class

Class ParallelPort

 Public Class ParallelPort

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_ParallelPort")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption() As System.Collections.ObjectModel.Collection(Of String)

        Caption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Caption.Add(getnow.Item("caption"))

        Next

    End Function

    Public Function Availability() As System.Collections.ObjectModel.Collection(Of String)

        Availability = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Availability.Add(getnow.Item("Availability"))

        Next

    End Function

    Public Function PNPDeviceID() As System.Collections.ObjectModel.Collection(Of String)

        PNPDeviceID = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PNPDeviceID.Add(getnow.Item("PNPDeviceID"))

        Next

    End Function

    Public Function PowerManagementSupported() As System.Collections.ObjectModel.Collection(Of String)

        PowerManagementSupported = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PowerManagementSupported.Add(getnow.Item("PowerManagementSupported"))

        Next

    End Function

End Class

كلاسس عن الطابعة

 Public Class printer

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_printer")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function PrinterName() As System.Collections.ObjectModel.Collection(Of String)

        PrinterName = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PrinterName.Add(getnow("name"))

        Next

    End Function

    Public Function PrinterStatus() As System.Collections.ObjectModel.Collection(Of String)

        PrinterStatus = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PrinterStatus.Add(getnow("status"))

        Next

    End Function

    Public Function PrinterPortName() As System.Collections.ObjectModel.Collection(Of String)

        PrinterPortName = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PrinterPortName.Add(getnow("PortName"))

        Next

    End Function

    Public Function PrinterDeviceID() As System.Collections.ObjectModel.Collection(Of String)

        PrinterDeviceID = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PrinterDeviceID.Add(getnow("DeviceID"))

        Next

    End Function

    Public Function Hidden() As System.Collections.ObjectModel.Collection(Of String)

        Hidden = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Hidden.Add(getnow("Hidden"))

        Next

    End Function

End Class

Class SystemSlot

 Public Class SystemSlot

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim oqj As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_systemslot")

        Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(mss, oqj)

        Dim queryCollection As ManagementObjectCollection = mos.Get

    Public Function Caption() As System.Collections.ObjectModel.Collection(Of String)

        Caption = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            Caption.Add(getnow.Item("caption"))

        Next

    End Function

    Public Function PMESignal() As System.Collections.ObjectModel.Collection(Of String)

        PMESignal = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            PMESignal.Add(getnow.Item("PMESignal"))

        Next

    End Function

    Public Function SlotDesignation() As System.Collections.ObjectModel.Collection(Of String)

        SlotDesignation = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            SlotDesignation.Add(getnow.Item("SlotDesignation"))

        Next

    End Function

    Public Function VccMixedVoltageSupport() As System.Collections.ObjectModel.Collection(Of String)

        VccMixedVoltageSupport = New System.Collections.ObjectModel.Collection(Of String)

        For Each getnow As ManagementObject In queryCollection

            VccMixedVoltageSupport.Add(getnow.Item("VccMixedVoltageSupport"))

        Next

    End Function

End Class

كلاسس عن شذرة بدء التشغيل

  Public Class bios

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_bios")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Names()

        For Each getnow As ManagementObject In queryCollection

            Names = getnow("name")

        Next

    End Function

    Public Function status()

        For Each getnow As ManagementObject In queryCollection

            status = getnow("")

        Next

    End Function

    Public Function BiosCharacteristics()

        For Each getnow As ManagementObject In queryCollection

            BiosCharacteristics = getnow("BiosCharacteristics")

        Next

    End Function

    Public Function BIOSVersion()

        For Each getnow As ManagementObject In queryCollection

            BIOSVersion = getnow("BIOSVersion")

        Next

    End Function

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function CurrentLanguage()

        For Each getnow As ManagementObject In queryCollection

            CurrentLanguage = getnow("CurrentLanguage")

        Next

    End Function

    Public Function Description()

        For Each getnow As ManagementObject In queryCollection

            Description = getnow("Description")

        Next

    End Function

    Public Function InstallableLanguages()

        For Each getnow As ManagementObject In queryCollection

            InstallableLanguages = getnow("InstallableLanguages")

        Next

    End Function

    Public Function ListOfLanguages()

        For Each getnow As ManagementObject In queryCollection

            ListOfLanguages = getnow("ListOfLanguages")

        Next

    End Function

    Public Function PrimaryBIOS()

        For Each getnow As ManagementObject In queryCollection

            PrimaryBIOS = getnow("PrimaryBIOS")

        Next

    End Function

    Public Function ReleaseDate()

        For Each getnow As ManagementObject In queryCollection

            ReleaseDate = getnow("ReleaseDate")

        Next

    End Function

    Public Function SMBIOSBIOSVersion()

        For Each getnow As ManagementObject In queryCollection

            SMBIOSBIOSVersion = getnow("SMBIOSBIOSVersion")

        Next

    End Function

    Public Function SMBIOSMajorVersion()

        For Each getnow As ManagementObject In queryCollection

            SMBIOSMajorVersion = getnow("SMBIOSMajorVersion")

        Next

    End Function

    Public Function SMBIOSMinorVersion()

        For Each getnow As ManagementObject In queryCollection

            SMBIOSMinorVersion = getnow("SMBIOSMinorVersion")

        Next

    End Function

    Public Function SMBIOSPresent()

        For Each getnow As ManagementObject In queryCollection

            SMBIOSPresent = getnow("SMBIOSPresent")

        Next

    End Function

    Public Function TargetOperatingSystem()

        For Each getnow As ManagementObject In queryCollection

            TargetOperatingSystem = getnow("TargetOperatingSystem")

        Next

    End Function

    Public Function Version()

        For Each getnow As ManagementObject In queryCollection

            Version = getnow("Version")

        Next

    End Function

End Class

كلاسس عن الشاشة

 Public Class Monitor

        Dim con As ConnectionOptions = New ConnectionOptions

        Dim machineName As String = System.Environment.MachineName

        Dim mss As ManagementScope = New ManagementScope("\\" + machineName + "\root\cimv2", con)

        Dim ob As ObjectQuery = New ObjectQuery("SELECT * FROM Win32_DesktopMonitor")

        Dim moss As ManagementObjectSearcher = New ManagementObjectSearcher(mss, ob)

        Dim queryCollection As ManagementObjectCollection = moss.Get

    Public Function Caption()

        For Each getnow As ManagementObject In queryCollection

            Caption = getnow("Caption")

        Next

    End Function

    Public Function DeviceID()

        For Each getnow As ManagementObject In queryCollection

            DeviceID = getnow("DeviceID")

        Next

    End Function

    Public Function MonitorManufacturer()

        For Each getnow As ManagementObject In queryCollection

            MonitorManufacturer = getnow("MonitorManufacturer")

        Next

    End Function

    Public Function ScreenHeight()

        For Each getnow As ManagementObject In queryCollection

            ScreenHeight = getnow("ScreenHeight")

        Next

    End Function

    Public Function ScreenWidth()

        For Each getnow As ManagementObject In queryCollection

            ScreenWidth = getnow("ScreenWidth")

        Next

    End Function

End Class

معرفة مسار النظام ، كما يمكنك الاستعلام عن أي مسار أخر فقط غير System الى أي مسار ترغب فيه

 Public Function SystemDir() As String

        Dim a As String

        a = System.Environment.GetFolderPath(Environment.SpecialFolder.System)

        SystemDir = a

    End Function


بعض الاوامر الشائعة الاستخدام Co

XML File

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

أنشئ مشروعاً جديداً واختر من القائمة Project الخيار Add New Items تم أختر XML File لتطالعك النافذة التالية :

<?xml version="1.0" standalone="yes"?>

الباقي طبعاً يجب ان ننشئه بأنفسنا.

بداية علينا ان ننشئ جدر يحوي باقي الحقول، ولذلك أنقر بزر الفأرة الأيمن وأختر Insert Snippet كما بالشكل التالي:

بعدها انقر على الخيار Element

عندها ستحصل على الشكل التالي:

<?xml version="1.0" standalone="yes"?>

<element></element>

ببساطة غير الاسم إلى File و التركيبة إلى الشكل التالي :

<?xml version="1.0" standalone="yes"?>

<file>

</file>

هل ترى تلك العلامة حول كلمة File وهي علامة اكبر من واصغر من يطلقون عليه مصطلح وسم او وسوم كما بلغة الـ Html

وكل وسم او شئ لا بد وان يكون له بداية ونهاية.

بداية الـ File نهايته نفس الوسم ولكن مع العلامة / انها العلامة التي تأتي قبل الاسم معلنة نهاية الوسم.

أنقر بزر الفأرة الأيمن وأختر Insert Snippet بعدها انقر على الخيار Element كما تعلمت سابقاً وغير بالأسماء لتحصل على الشكل التالي :

<?xml version="1.0" standalone="yes"?>

<file>

<Name></Name>

<Phone></Phone>

</file>

ألان أصبح لدي حقلين بالأسماء Name وكذلك Phone ويمكننا وضع أي بيانات فيهما.

بالإمكان استخدام الفيجوال لعرض البيانات فقط انقر بزر الفأرة الأيمن وأختر View Data Grid

والبيانات يجب ان تكون بين الوسوم كما بالشكل التالي:

<?xml version="1.0" standalone="yes"?>

<file>

<Name>Mohamed</Name>

<Phone>12345</Phone>

</file>

واذا قمت باستعراض البيانات فيمكنك ان تجد القيم كما بالشكل التالي:

كما من الممكن ان تحصل على تركيب لوسوم متداخلة كما بالشكل التالي:

<?xml version="1.0" encoding="utf-8" ?>

<file>

  <Name>Mohamed</Name>

  <Phone>12345</Phone>

  <Address>

    <City>Zen</City>

    <Street>89</Street>

    <Country>Libya</Country>

  </Address>

</file>

إذا استعرضت هذا التركيب ستجده بالشكل التالي:

لاحظ علامة + التي تظهر هناك وتفيد بان هناك معلومات فرعية وهي تخص الوسم Address أنقر عليها لتشاهد الشكل التالي:

ستحصل على شكل شجري بعدد الوسوم الفرعية انقر على ما تريد منها ليطالعك شيئا مثل:

طبعا يمكنك من هنا إضافة بيانات جديدة او حذف بيانات او تعديلها كما تريد تماماً.

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

أولا وعن طريق الكائن سوف ننشئ الملف السابق ونحفظه على محرك الأقراص كما بالشكل التالي:

Public Class Form1

       Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim xmlData As New Xml.XmlTextWriter("C:\IntroToVB2.xml", System.Text.Encoding.UTF8)

        xmlData.WriteStartDocument()

        xmlData.WriteStartElement("File")

        xmlData.WriteStartElement("Name")

        xmlData.WriteString("Mohamed")

        xmlData.WriteEndElement()

        xmlData.WriteStartElement("Phone")

        xmlData.WriteString("12345")

        xmlData.WriteEndElement()

        xmlData.WriteStartElement("Address")

        xmlData.WriteStartElement("City")

        xmlData.WriteString("Zen")

        xmlData.WriteEndElement()

        xmlData.WriteStartElement("Street")

        xmlData.WriteString("89")

        xmlData.WriteEndElement()

        xmlData.WriteStartElement("Country")

        xmlData.WriteString("Libya")

        xmlData.WriteEndElement()

        xmlData.WriteEndElement()

        xmlData.Close()

    End Sub

End Class

كما تشاهد لكل وسم تريد ان تنشئه تبدءا بالعبارة WriteStartElement وتنتهي بالعبارة WriteEndElement وعندها سيمكنك التحكم في تشكيل هيئة الملف بالشكل الذي تريده أنت.

ان الكود السابق سينشئ ملفاً يحتوي على نفس البيانات التي أعددناها سابقاً بالفيجوال أنظر للشكل التالي:

<?xml version="1.0" encoding="utf-8" ?>

<file>

  <Name>Mohamed</Name>

  <Phone>12345</Phone>

  <Address>

    <City>Zen</City>

    <Street>89</Street>

    <Country>Libya</Country>

  </Address>

</file>

الان أنشئ مشروعاً جديداً وضع عليه زراً وأداة ListBox وبحدث النقر للزر أكتب كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

                Me.ListBox1.Items.Add(XmlFile.Value)

         Loop

     XmlFile.Close()

    End Sub

End Class

ان الـ Class هنا و بالاسم XmlTextReader سيمكنك من قراءة البيانات من ملف Xml المحدد بذلك المسار.

وأيضا استخدام تكرار مع الطريقة Read لقراءة الملف.

ان هذا الكائن يمتلك الخاصية XmlNodeType والتي تحدد ما نوع الوسم وبذلك يمكننا استخلاص بيانات معينة ومحددة كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

            If XmlFile.NodeType = Xml.XmlNodeType.Text Then

                Me.ListBox1.Items.Add(XmlFile.Value)

            End If

        Loop

     XmlFile.Close()

    End Sub

End Class

أنظر للشكل التالي لترى الخيارات المتاحة لهذه الخاصية:

كما يمكنك معرفة نوع القيمة نفسها كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

            If XmlFile.NodeType = Xml.XmlNodeType.Text Then

                Me.ListBox1.Items.Add(XmlFile.Value & " == " & XmlFile.ValueType.Name)

            End If

        Loop

    XmlFile.Close()

    End Sub

End Class

الخاصية ValueType تمكنك من تحديد نوع القيمة.

كما يمكنك من معرفة الصف الذي يحتوي على هذه البيانات كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

            If XmlFile.NodeType = Xml.XmlNodeType.Text Then

                Me.ListBox1.Items.Add(XmlFile.LineNumber & "=" & XmlFile.Value)

            End If

        Loop

  XmlFile.Close()

    End Sub

End Class

ايضا يمكنك ان تعرف ان كان الوسم يحتوي على بيانات او قيمة او لا كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

            If XmlFile.NodeType = Xml.XmlNodeType.Text Then

                Me.ListBox1.Items.Add(XmlFile.HasValue & "=" & XmlFile.Value)

            End If

        Loop

   XmlFile.Close()

    End Sub

End Class

كما يمكننا الحصول على كل الوسوم المتوفرة بداخل الملف كما بالشكل التالي:

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim XmlFile As New Xml.XmlTextReader("C:\IntroToVB.xml")

        Do While XmlFile.Read = True

            If XmlFile.NodeType = Xml.XmlNodeType.Element Then

                Me.ListBox1.Items.Add(XmlFile.Name)

            End If

        Loop

        XmlFile.Close()

    End Sub

End Class

على العموم اذا كنت تجيد التعامل مع الكائن DataSet فيمكنه التعامل مع هذا النوع من الملفات بكفاءة عالية.

ولنقوم بذلك أنظر انشئ مشروعاً جديداً واضف له الاداة DataGridView تم في حدث التحميل اكتب التالي :

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ds As New DataSet()

        ds.ReadXml("C:\IntroToVB.xml")

        Me.DataGridView1.DataSource = ds.Tables(0)

    End Sub

End Class

ويمكنك ان تلاحظ اننا حددنا الجدول الاول المفهرس برقم صفر وهو كما بالشكل التالي:

<?xml version="1.0" encoding="utf-8" ?>

<file>

  <Name>Mohamed</Name>

  <Phone>12345</Phone>

  <Address>

    <City>Zen</City>

    <Street>89</Street>

    <Country>Libya</Country>

  </Address>

</file>

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

<?xml version="1.0" encoding="utf-8" ?>

<file>

  <Name>Mohamed</Name>

  <Phone>12345</Phone>

  <Address>

    <City>Zen</City>

    <Street>89</Street>

    <Country>Libya</Country>

  </Address>

</file>

كما يمكنك التعامل مع الـ Rows في الــ DataSet كما بالشكل التالي :

أضف الأداة TextBox الى النموذج تم أكتب التالي:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ds As New DataSet()

        ds.ReadXml("C:\IntroToVB.xml")

        Me.DataGridView1.DataSource = ds.Tables(0)

        Me.TextBox1.Text = ds.Tables(0).Rows(0).Item(0).ToString

    End Sub

End Class

وهذه نتيجة عملنا السابق.

كما يمكنك بأي لحظة حفظ البيانات التي قمت بتغييرها كما بالشكل التالي:

أضف زرا جديدا الى المشروع واكتب في حدث النقر له التالي:

ds.WriteXml("C:\IntroToVB.xml")

كما قم تحويل تعريف المتغير للـ DataSet الى قسم التصاريح العامة ليكون الكود كاملا كما بالشكل التالي:

Public Class Form1

    Dim ds As New DataSet()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ds.ReadXml("C:\IntroToVB.xml")

         Me.DataGridView1.DataSource = ds.Tables(0)

         Me.TextBox1.Text = ds.Tables(0).Rows(0).Item(0).ToString

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ds.WriteXml("C:\IntroToVB.xml")

    End Sub

End Class

ان الطريقة WriteXml سوف تقوم بحفظ التغييرات التي تحدثها بالـ DataSet .

طبعا يمكنك إضافة أعمدة وصفوف وما إلى ذلك وحفظ هذه التغييرات.