صفحة جديدة 1

هذه هي الاصدارة الثانية، والمنقحة، وكانت الاصدارة الاولى تحتوي على ملف تروجان، لذلك ان أعتذر عن ذلك فبرنامج EbookWorkShop 4.1 المسئول عن اعداد الكتاب يقوم

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

مقدمة

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

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

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

وإنما ما تقرءونه نتيجة لخبرات اكتسبتها لأيام وشهور ونتيجة بحث كثير.

ما تعلمته انا في هذه المدة أضعه بين يديك في ليلة واحدة.

تعريف صغير بالكاتب

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

وثلاث لا أحب ان يشاركني فيها احد، النوم والطعام والصلاة.

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

البرامج التي استخدمتها في إعداد هذا الكتاب Visual Studio.NET 2005

Visual Basic 6

برنامج لتحرير والتقاط الصور SnagIT الاصدارة 8.2.3

MicroSoft FrontPage

WinCHM pro

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

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

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

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

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

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

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

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

وبرنامج ResHacker والذي يفيد كثيراً وخاصة في استخراج الإيقونات من الملفات.

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

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

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

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

كما يوجد قسم خاص بالأدوات Active-x وادوات مخصصة للـ .NET بعضها مجاني والبعض الأخر ليس كذلك، وهي أدوات أقوم بتجميعها وأكثر من رائعة حقيقة.

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

أما الجهاز الذي أستخدمه فحقيقة موافاته جيدة وهاهي بعضها واسم البرنامج الذي قراءها:

EVEREST Corporate Edition © 2003-2006 Lavalys, Inc.

Motherboard:
 | CPU Type | DualCore Intel Pentium D 925, 3000 MHz (12 x 250)
 | Motherboard Name | MSI 945PL Neo (MS-7236) (4 PCI, 1 PCI-E x1, 1 PCI-E x16, 4 DDR2 DIMM, Audio, Gigabit LAN)
 | Motherboard Chipset | Intel Lakeport i945PL
 | System Memory | 2048 MB (DDR2-667 DDR2 SDRAM)
 | BIOS Type | AMI (07/30/07)
Display:
 | Video Adapter | MSI NX7300 LE (NVIDIA GeForce 7300 LE) (512 MB)
 | 3D Accelerator | nVIDIA GeForce 7300 LE
 | Monitor | Samsung SyncMaster 740N [17" LCD] (HMBP329501)

Multimedia:

Audio Adapter

Realtek ALC888 @ Intel 82801GB ICH7 - High Definition Audio Controller [A-1]
Storage:
 | IDE Controller | Intel(R) 82801GB Serial ATA Storage Controllers - 27C0
 | IDE Controller | Intel(R) 82801GB Ultra ATA Storage Controllers - 27DF
 | Storage Controller | FVDSCSI (2003) SCSI Host Adapter
 | Disk Drive | HDS72808 0PLAT20 USB Device (80 GB, 7200 RPM, Ultra-ATA/133)
 | Disk Drive | SAMSUNG HD082GJ (74 GB, IDE)
 | Optical Drive | FvF-Inc CDDVD-2003-200x SCSI CdRom Device
 | Optical Drive | TSSTcorp CD/DVDW SH-S182F
 | SMART Hard Disks Status | OK
Partitions:
 | C: (FAT32) | 25990 MB (16294 MB free)
 | D: (FAT32) | 24987 MB (16061 MB free)
 | E: (FAT32) | 25293 MB (23960 MB free)
 | G: (FAT32) | 23552 MB (17029 MB free)
 | H: (FAT32) | 54951 MB (6070 MB free)
 | Total Size | 151.1 GB (77.6 GB free)
Input:
 | Keyboard | HID Keyboard Device
 | Mouse | HID-compliant mouse
Network:
 | Primary IP Address | 00-00-00-00
 | Primary MAC Address | 00-00-00-00
 | Network Adapter | Realtek RTL8169/8110 Family Gigabit Ethernet NIC
 | Network Adapter | TechniSat DVB-PC TV Star PCI (000.000.000.000)

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

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

هي بداية أصدارة أحدث من الاصدارة فجوال نت 2003 وفيها أمور لا توجد بالاصدارة 2003 كما أنني لا أعلم كثيراً عن الاصدارة 2008 والمعدة للعمل على Windows Vista

ولكن لا انصح بها ولسبب واحد وبرأيي هو كافً.

الاصدارة 2008 تستخدم Framework 3.5 والذي ليس له وجود على 90% من الاجهزة على الاقل حتى الان، والاصدارة 2005 تستخدم الـ Framework 0.2 والذي يوجد على 90% من الاجهزة تقريباً الموجودة الان، أي أنك لست حتى في حاجة الى ان ترفق الـ Framework مع مشروعك لدى تسلميه الى المستخدم.

حقيقة ان الاصدارة 2008 تحتاج الى المزيد من الوقت، ذلك الوقت الذي يصبح فيه Windows-xp كما الـ Windows 98 الان او الملينيوم.

مع ان هناك ملاحظة صغيرة وهي أنني صنعت برنامجاً يعتمد على الـ Framework 1.1 وعمل على أحسن مايرام على الاصدارة Framework 0.2 واعتقد ان استخدام برنامج على اصدارة الفجوال 2008 سوف تعمل طبيعياً على اصدارة الـ Framework 0.2 بحالة واحدة وهي عدم استخدام مكتبات جديدة لا توجد الا بالاصدارة Framework 3.5

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

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

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

لن اقول لك كما يفعل البعض أدعوا لي مقابل ما تقرأه، لأنني أؤمن بأنه لا ينفع ابن أدم إلا عمله، ولو كان الدعاء ينفع أحد لنفع دعاء الكثير من الرسل او الأنبياء إباءهم وأهليهم.

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

وان كنت ممن يستمتع بمدح الناس له بما هو ليس فيه فافعل وينال الثناء بسبب مجهود الآخرين فافعل، وأرجو منك ان تفعل.

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

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

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

عذراً ولكن ما اضر شئ بان تصلنا كتب ممتازة من على الانترنت الا لان الخبراء والمحترفين اغلبهم لا يحبذون نشر تعبهم ليلهو به الآخرين وينشرونه وينسبونه لهم.

ولو ان هؤلاء الناس نشروا علمهم لله أولاً وأخيرا لما همهم هذا الأمر، ولكن ومع ذلك لا نستطيع ان نلومهم.

هل تعلم لماذا يحب المبرمجين البرمجة، او ما الذي يشدك إليها...؟

أنه المنطق.

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

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

الدنيا كلها موجودة وتقوم على منطق، وكل شئ يحدث فيها يحدث بمنطق.

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

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

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

وكلما كان التسلسل دقيقاً ومعقداً وناجحاً كلما زادت متعتك في ذلك.

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

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

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

أحب ان يكون جهازي تحت سيطرتي.

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

وخاصة تلك الرسائل التي تظهر بكثرة وليس لك القدرة على إيقافها.

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

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

ومايكروسوفت تدرك هذا جيداً، وتحاول ولا زالت تحاول منح المزيد من التحكم والسيطرة، وهذا برأيي سر نجاحها الدائم، وهذا هو السبب وراء تجددها المستمر.

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

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

أفضل ما أحببته في Windows Vista هو قدرته الأمنية العالية.

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

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

حتى وان كنت لا أؤمن بالمستحيل، إلا في شئ واحد ، وهو انه لا يمكن ان يكون لهذا الكون خالقين أبداً.

لماذا لا يتم إتباع نفس الأسلوب على الأقل نتخلص من 99% من إزعاجات الفيروسات.

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

أعلم انها معضلة، ويتحكم فيها العتاد أيضاً، ولكن بالتأكيد هناك حل، وهو ليس Windows Vista

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

وكان الجهاز ملائماً جدا مع Windows Vista وعملت معه على أحسن ما يرام ومع ذلك لم أحبه قط.

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

تشعبت في الحديث عن Windows Vista ولكن أحببت ان انقل لكم بعض الأفكار فقط.

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

فأقول.

أنها مزركشة بالكثير من الصور، والخاصة المتحركة Gif وكذلك الفلاشات، ولكن أدائها سيئ للغاية، لا اعلم لماذا هل هو عدم الخبرة...؟

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

رأيت العديد من المواقع الأجنبية تمتلك تنظيم، وفعلاً تشعر ان وراء إعدادها دراسة وتنظيم، وقاموا بإعدادها بمساعدة بعض الأدوات Web User Control وقوائم الجافا.

ان التعليمات في Visual.net تحتوي العديد من هذه الأدوات الرائعة، والتي لم تترك مايكروسوفت خياراً لك لحفظ الصفحة ربما حتى لا تحصل عليها، ولكن يمكنك ذلك بالنقر على الصفحة التي تحتوي الجافا او بعض الأدوات المهمة بزر الفأرة الأيمن واختيار View Source ومن هناك يمكنك مشاهدة مسارات هذه الأدوات وأسمائها تحديداً.

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

لا اعرف هل مسموح لنا شرعاً ان نفعل ذلك ام لا، وحتى نعرف ذلك، توقف عن ذلك حالما تعلم ان هذا العمل غير شرعي .

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

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

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

الصور في المواقع يجب ان لا تكون بالكثرة التي تفسد كل شئ، ام ان المبرمجين تعجبهم الخطوط السريعة التي نملكها....!

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

ما هذا، هل أملك كل هذا الوقت حتى أرى موضوعاً قد لا أجد فيه ما يفيد....!

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

قلت من قبل لماذا أحب البرمجة ولماذا أنت كذلك تحب البرمجة، وفسرت لك الأمر الحقيقي وراء ذلك، حسناً.

لماذا جهاز الكمبيوتر...؟

أنه الحرية، وألا تقيد.

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

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

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

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

الكمبيوتر خير جليس، ففيه علماء وأطباء وخبراء كلهم يتحدثون إليك ويعرضون أفكارهم عليك، وتتعلم منهم.

مكتبة معلومات ضخمة، لو حولتها إلى كتب في رفوف لما وسعها منزلك.

أنه الأفضل وسيكون الأفضل.

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

من الممكن ان يقودك الى النور، ومن الممكن ان يقودك الى الظلام.

الأمر يتوقف عليك.

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

اول ما ستلاحظه فيه هو البطئ بعكس فجوال بيسك 6 او الدلفي، والبطئ ليس في أثناء التصميم وانما في وقت التشغيل ايضاً، فمثلاً لم تعد له السرعة

في قراءته للبيانات من قاعدة البيانات، واعتقد وان منصة العمل Framework هي السبب وراء ذلك.

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

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

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

ولم يكن قد سبق لي التعرف على الدلفي وعن قرب الا بعد تعمقي في الفجوال بيسك 6 ولو كنت على علم ببعض امكانيات الدلفي من اول الطريق

لكنت أخترت الدلفي بلا تردد.

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

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

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

حتى يعمل البرنامج وترى النموذج.

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

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

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

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

والسلام من السلام


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

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

شغل الفجوال نت تم أختر File وبعدها New Project ومن النافذة الجديدة أختر Windows Application تم أنقر Ok

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

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

TextBox1.Text = My.Computer.Info.OSFullName

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

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

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

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

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

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

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

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

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

وأنما بالمجلد Release المجلد المجاور للمجلد Debug

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

مثلاً:

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

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

End

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

والان أضف زراً جديداً، تم من القائمة Project أختر Add new Item تم من النافذة حدد الخيار Windows Forms تم أنقر على الزر Add

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

Form2.Show()

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

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

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

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

TextBox1.Text =

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

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

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

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

TextBox1.ForeColor = Color.Azure

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

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

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

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

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

ما الحل أذاً.

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

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

الان أريدك من تقوم بجعل هذه الاداة كبيرة ليس في العرض Width وأنما في الارتفاع 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 من الذاكرة

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

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

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

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

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

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

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

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


قوائم البرنامج

هنا سوف نتطرق الى أكثر الاوامر الموجودة بقوائم البرنامج واولها هو ملف 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 Class

Add new Item

من هنا يمكنك جلب اي قالب جاهز او نموذج او كلاسس او اضافة تقرير وغيره الكثير كما بالشكل التالي:

Add Existing Item لجلب ملف او قالب موجود بالفعل على جهاز الكمبيوتر.

وباقي الاوامر تطرقنا اليها في مواضيع أخرى جربها.

Build من هنا يمكنك انشاء الملف التنفيذي النهائي الذي يتم وضعه بالمجلد Release أحياناً لا ينشئ البرنامج الملف ألياً الا اذا قمت بالحث عليه من هنا.

واوامر من تسماياتها، أحدها للبناء والاخر لاعادة البناء ، والاخر لمسح الذي تم بناءه.

Debug دعك منه الان.

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 لتدخل الى هنا فانت شخص من ثلاث.

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

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

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


العمليات الحسابية

الرمز | الوظيفة
+ | الجمع
- | الطرح
* | الضرب
^ | رفع الرقم الاس 3 ^ 3
/ | القسمة ويمكن ان تعيد رقماً عشرياً من ناتج القسمة
\ | القسمة وتعود بعدد صحيح فقط
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

ويمكنك أتباع نفس الاسلوب مع باقي الاوامر.


بداية البرمجة

بداية يجب ان نتطرق الى كيف يمكننا التصريح عن المتغيرات.

كما بالفجوال بيسك 6 يمكنك استخدام الكلمة Dim لتعريف المتغيرات كما بالمثال التالي:

Dim myvalue as integer

Dim myvalue 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 فسيكون على مستوى المشروع ككل، فالـ Modules هي عبارة عن Class ايضاً.

كما يمكنك استخدام نفس المتغير بداخل احد الاجراءات مع انك اعلنت عنه بقسم التصاريح العامة كما بالشكل التالي:

   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 بدون الاقواس فستحصل على رسالة خطاء ولذلك اذا اردت ان تستخدم امر من الاوامر المحجوزة فأستخدم الاقواس كما بالمثال.

أنواع المتغيرات

هذه بعض انواع المتغيرات التي سوف تواجهك وتحتاج أليها.

نوع المتغير | نوعه
String | متغير نصي
Integer | متغير حرفي
Boolean | منطقي
Decimal | عشري
Date | تاريخ
Char | حرف
Byte | عدد صحيح
Long | عدد صحيح
Object | يقبل كل شئ ويكون اي شئ
Single | عشري
Short | عدد صحيح


الخصائص Properties

تم أيضا بالفجوال نت تعديل وإضافة بعض الخصائص الجديدة.

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

هذه هي نافذة الخصائص Properties الواقعة بالاسفل ويمكن مشاهدة نافذة Solution explorer والت يتم عرض كل النماذج والكلاسس وغيرها فيها وسوف نتطرق لها لاحقاً.

قبل كل شئ ومن الوهلة الاولى يمكننا ان نشاهد الاضافات على هذه النافذة أنظر الشكل التالي:

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

حقيقة لاوجد سواه وهو يقوم على اغلاق النافذة.

ويوجد الزر الذي يحمل علامة الدبوس: وهو يقوم باخفاء او طي النافذة لحين الحاجة اليها .

أما الزر الذي يحمل علامة السهم الصغير المتجه للاسفل فهو يقوم بعرض قائمة كما بالشكل التالي:

Floating | يقوم يتحرير النافذة من مكانها
Dockable | يقوم بمحاذة النافذة الى المكان المحدد او الذي تحدده
Tabbed Document | يقوم بنقل النافذة للعرض مع مصمم النماذج او نافذة الكود
Auto Hide | اخفاء تلقائي
Hide | اخفاء

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

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

كما تحت القائمة المنسدلة شريط قوائم قصير يحوي بعض الازرار كما بالشكل التالي:

من اليمين الى اليسار.

Property Page | سوف نتطرق الى هذا لاحقاً
Events | يقوم بعرض كل الاحداث التي يمكنك التنقل بينها وانشاءها من هنا.
Properties | عرض خصائص الاداة
Alphabetic | ترتيب الخصائص او الاحداث ترتيباً ابجدياً
Categorizes | ترتيب الخصائص او الاحداث حسب التصنيف الذي وضعت به.

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

كما ترى هذه النافذة تعرض كل الاحداث للنموذج Form1 وقمت هنا بتحديد الحدث Click .

اذا اردت القيام بانشاء الحدث Click فكل ما عليك هو النقر المزدوج عليه لتنتقل الى نافذة محرر الكود كما بالشكل التالي:

اذا كنت من مبرمجي دلفي فهذا المشهد وهذه الطريقة مألوفة لديك بالتأكيد.

واذا عدت الى وضع التصميم فسيمكنك ان تشاهد التالي بنافذة الاحداث.

هل تشاهد Form1_Click في الحدث Click هذا يعني ان الحدث Click للنموذج قد تم أنشاءه، واذا غيرت خصائص النافذة الى اداة أخرى ولنفرض احد الازرار فسوف يختفي هذا الحدث ولكن اذا قمت باستعراض محتويات الحدث Click فستجد انه موجود، وهذا يعني ان هناك حدثا هنا لا ينتمي الى الحدث الزر Buuton1 أنظر الشكل التالي:

هل تعلم تستطيع ان تختار من هنا Form1_click وهو يعني انك سوف تتشارك مع النموذج في الحدث Click ، او قم بالنقر مرتين لإنشاء حدث خاص بالزر.

ماذا لو ان لديك أكثر من 20 Textbox واردتها ان تتشارك في الحدث Click أو OnChang بالتأكيد تحتاج الى هذه النافذة لتفعل ذلك، وحقيقة كانت هناك خاصية ممتازة في الفجوال بيسك 6 وهي القدرة على فهرسة الأدوات بحيث انك لو وضعت زرا على النموذج تم قمت بنسخه ولصقه فان الفجوال يظهر لك رسالة تسألك اذا كنت تريد فهرسة الأداة ام انك تريد ان تعطيها اسماً مختلفاً كما بالشكل:

وبحال اخترت نعم فسيقوم باعطى كل اداة رقماً خاصاً بالخاصية Index كما بالشكل التالي:

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

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

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

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

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

بمعنى....!

في الفجوال بيسك 6 اذا اخترت على سبيل المثال أداة Text واداة Button وأردت ان يظهر في اداة النص الجملة (اختبار) وأردت ان تظهر جملة (اختبار) كعنوان لأداة Button فأنت ستضع الجملة لأداة النص في الخاصية Text وستضع الجملة لأداة الزر Button في الخاصية Caption ، لاحظ معي ان الخاصيتين متشابهتين من حيث العمل الذي تقوم به، ولتسهيل المهمة عليك وعدم أرباك المستخدم تم توحيد هذه الخاصية في الفجوال نت، ولتفعل ذلك ما عليك الا وضع الجملة لكلتا الأداتين في الخاصية Text

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

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 | قيمة الأداة الحالية


نافذة التصميم Desiner form

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

فمثلاً صار بامكانك ان تنتقل بين نافذة التصميم ونافذة الكود بكل سهولة ويسر وذلك عن طريق التبويب الموجود باعلى النافذة وشكله كالتالي:

أي نافذة تنشئها تحمل في التبويب أسمها واذا كان يتبع الاسم [desing] فهذا يعني نافذة في طور التصميم والا فان ذلك يعني ما تحتويه من كود.

ويمكنك ان تلاحظ هنا انه لذينا نموذج واحد ويحول الاسم Form1 وفي التبويب بالاعلى لذينا Form1.vb وهي نافذة الكود Form1.vb desing وهي النافذة في طور التصميم.

وبالنقر على التبويب Form1.vb سننتقل الى نافذة الكود كاتالي:

كما يمكنك التنقل بين طور التصميم وطور الكود او نافذة الكود بالنقر من خلال هذين الزرين بنافذة Solution explorer كما بالشكل:

وأيضاً يمكنك الانتقال الى طور التصميم عن طريق القائمة الفجائية وذلك بالنقر بزر الفأرة الايمن لتظهر لك كما بالشكل التالي:

من هذه القائمة يمكنك أختيار Veiw Desinger للانتقال الى طور التصميم، وسأترك لك اكتشاف باقي ما في هذه القائمة.

كما اذا نقرت بزر الفأرة الايمن على الفور يمكنك ان تطالع التالي:

لاحظ وجود الخيار View Code وهما ما يسمح ايضاً بالانتقال الى طور معالجة الكود.

Lock Controls | هو للقيام بقفل الادوات او بمعنى اصح منع التغيير في اطوالها واحجامها ومواقعها
Properties | وهو للانتقال الى خصائص الاداة التي نقرت عليها او النموذج وسوف نتطرق الى ذلك لاحقاً.

بينما في الفجوال بيسك 6 لم يكن متاحاً ذلك الا من خلال النافذة Project

أو من خلال النقر على النموذج بزر الفأرة الايمن كاتالي:

يمكننا ان نرى الخيار View Code وباقي الخيارات كما بالفجوال نت تماما وتقوم بنفس العمل.

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

ففي الفجوال بيسك 6 كنت مضطرا الى النقر المزدوج على النموذج الذي ترغب في التعامل معه، ومن تم النقر المزدوج مرة أخرى عليه للانتقال الى طور الكود او النقر على زر View code من نافذة Project ولكن بالفجوال نت صار بالإمكان الانتقال بين الاثنين من خلال التبويب، كما اذا حدث وفتحت العديد من النماذج بحيث لا يسعها التبويب يمكنك استعراضها في قائمة منسدلة بطرف الشريط وهي موجودة على الجانب الايمن كالتالي:

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

كما تم أضافة ميزة او خاصية جديدة الى نافذة الكود وهي امكانية اخفاء واظهار الاجراءات كيفما تشاء كالتالي:

مع بداية كل إجراء يوجد علامة + أو - وتعني الأولى بان الإجراء معروض بالكامل والثانية ان الإجراء مخفي.

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

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

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

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

أما القائمة التي على اليمين فتحتوي على كل الاحداث التي يمكنك قنصها ، وهما كما بالشكل التالي:

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

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

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

وهذه صورة لنافذة الادوات الموجودة على النموذج ويمكننا ان نرى وجود بعض الادوات مثل Button - listbox - textbox وغيرها.

لا ارغب حقيقة في المتابعة قبل ان اعرض هذه القوائم بالفجوال بيسك 6 اليكم هذه الصور.

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


Form Designer

من المهم حقاً ان تقوم بالاطلاع على محتويات هذا الملف للفهم وزيادة الخبرة، فهنا يتم كتابة كل الاسطر البرمجة بواسطة الفجوال نت ، فاي اداة تضيفها الى النموذج او اي خاصية تقوم بتغييرها يتم كتابة الكود الخاص بذلك هنا من نافذة Solution explorer قم بعرض كل الملفات كما تعلمنا سابقاً انقر بجانب العلامة الصغير + امام الملف 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

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


مدير المشروع 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 وأكمل الباقي لانه سوف يحدد لك الفضاءات الغير مستخدمة.

كما انك اذا كنت تستخدم ملفات واردت اضافتها الى المجال فأخر المجلد الذي هم فيه من خلال الزر Reference Path

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

ومن الخيارات بنافذة مدير المشروع ايضاً الزر Resource أنقر عليه لتطالعك النافذة التالية:

من هنا يمكنك اضافة اي ملفات تريدها الى المشروع صور اصوات ايقونات نصوص الى غير ذلك، اذا نقرت على القائمة String فوق ستطالعك القائمة التالية:

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

وكما بالصورة التي قبل هذه يوجد لدينا حقل نص، حيث Name هو الاسم الفريد اما Value فضع النص الذي تريده اما Comment فاضف اي تعليق تريد.

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

أنقر على القائمة الثانية Add resource لتطالعك القائمة الفرعية التالية:

من هنا يمكنك اضافة ما تريد، ولكن كيف يمكن الاتصال بهذا المخزن الذي اعددناه.

يمكنك ذلك من خلال الامر التالي:

My.Resources.String1

عند كتابتك my متبوعاً بنقطة أختر من القائمة Resources أتبعها بنقطة لتطالعك كل محتويات ملف الـ Resources


Solution explorer

حقيقة لا اعرف لها ترجمة مرضية ولكن لاحظ أنها مثل النافذة Project ي فجوال بيسك 6 وهي تقوم على استعراض كل ملفات المشروع كاملة، أي شئ تضيفه يتم استعراضه هنا.

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

من اليمين الى اليسار

الزر الأول: View Class Diagram سوف يقوم بإضافة برمجة مرئية خوارزمية تمكنك من استعراض والتعديل في كامل مشروعك.

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

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

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

وبالنقر على اي حقل او حدث او ما شابه يمكنك ان تستعرض ذلك في شكل قائمة قابلة للتحرير والتعديل أسف هذه الأشكال الخوارزمية انظر الشكل التالي:

حيث تحت الاسم Name يتم عرض كل ماتحتويه Class من أدوات وأحداث، اما Type فتعطيك النوع ماهو، أما Modifier فهل هو معرف عام ام محلي ، Hdie هل هو مخفي أم لا.

حسناً ماذا اذا نقرت بزر الفأرة الايمن على أحد هذه Class ، أنظر الشكل التالي:

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

دعنا بداية لا نناقش القوائم الفرعية.

Show Base Class

عند اختيار هذا الأمر سيتم عرض شكل خوارزمي أخر مفصل بكل الإحداث والحقول وغيرها انظر الشكل التالي:

يمكنك أستعراض الخصائص والاحداث وغيرها والتغيير فيها كذلك.

حقيقة الحديث عن كل شئ كبير جداً ومتشعب ولكن يمكنك الخوض بين هذه Class الخورازمية وتجربتها على مهل.

كما يوجد بالقائمة الامر Expand و Collapes وهما يقومان بتمدد الشكل الخوارزمي او تقلصه وهذا يعني انهما يقومان بنفس عمل السهم العلوي.

كما يوجد الخيار نسخ وقص ولصق يقومان بنسخ Class ولصقها وهذا لا يؤثر على الشكل الحقيقي للكود، فمثلاً اذا قمت بنسخ Class الخاص بالـ Form1 فلن يتم اضافة نموذج جديد الى المشروع وانما الى Class Diagram فقط.

الخيار Copy Image يقوم بنسخ الصورة للـ Class فهذه الاشكال الخورازمية ماهي الا صور في الاصل.

view code يجعلك تنتقل الى نافذة محرر الكود، أما Properties فعرض خصائص الـ Class المحدد، Class Details لعرض تفصيل لهذه الـ Class

أما اذا أردت أضافة خاصية جديدة او حدث جديد او حقل جديد فأختر من القائمة Add لتطالعك القائمة الفرعية التالية:

كل هذه الامور أو أكثرها سنناقشها لاحقاً ولكن بشكل مختلف.

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

حسناً لنعد الى بداية التقاطع كل هذه الجولة نقلنا اليها الزر الاول بهذه القائمة:

الزر الثاني: هو لتنشيط القائمة او اعادة أنعاشها.

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

لاحظ الملفات التي تم ظهورها كما هناك تفرع لها ولنفررض اننا قمنا بعمل تفرع للـ My project كالتالي:

كل هذه الملفات موجودة فعلاً في مجلد المشروع ولكن ليس هناك ضرورة الى استعراضها هنا حيث يمكنك الفجوال نت ومن اماكن مخصصة التحكم بها والتعديل فيها، واذا دخلت عليها وجدت تحذيراً لطيفاً يخبرك بذلك وينبهلك الى ظرورة عدم التغيير اليديوي فيها، أنظر الى ملف الـ Application.Designer.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.UserControl11 = New WindowsApplication1.UserControl1

        Me.SuspendLayout()

        '

        'UserControl11

        '

        Me.UserControl11.BackColor = System.Drawing.SystemColors.ControlDark

        Me.UserControl11.Location = New System.Drawing.Point(25, 22)

        Me.UserControl11.mycolor = System.Drawing.Color.Red

        Me.UserControl11.MyText = "asdasd"

        Me.UserControl11.Name = "UserControl11"

        Me.UserControl11.Size = New System.Drawing.Size(418, 242)

        Me.UserControl11.TabIndex = 0

        '

        'Form1

        '

        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)

        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font

        Me.ClientSize = New System.Drawing.Size(471, 381)

        Me.Controls.Add(Me.UserControl11)

        Me.Name = "Form1"

        Me.Text = "Form1"

        Me.ResumeLayout(False)

    End Sub

    Friend WithEvents UserControl11 As WindowsApplication1.UserControl1

End Class

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

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

لااعتقد انك تحتاج الى عمل شئ تحت القائمة Application.Designer.vb وان كنت انصح بدراستها عن كثب.

حسناً للنظر الى التالي:

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

دعنا نتوقف قليلاً هنا، أمام مصلح فضاء، يقولون انك اذا اردت ان تتعامل مع ملفات Xml مثلاً فأنت محتاج لاستيراد الفضاء التالي System.xml .

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

Dim MyButton As New System.Windows.Forms.Button

اذا قمت باستيراد الفضاء التالي:

Imports System.Windows.Forms

عندها يمكنك ان تكتب سطرك السابق كاتالي:

Dim MyButton As New Button

لماذا...؟

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

عليك ان تعلم ان الفضاءات التي يتحدوث عنها ما هي الا مجلدات فقط، فلو راقبت مكتية Framwork لوجدت مجلداً أسمه System بداخله مجلد Windows بداخله مجلد Forms وهذا الاخير يحتوي على ملف Dll وهذا الملف يحتوي على العديد من الـ Class والتي ماهي الا الأدوات.

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

المهم ان المشروع يعمل ضمن هذا الفضاء الذي تشاهده هنا في الـ References

أذا نقرت على احد هذه المجالات أنتقلت الى نافذة Opject Browser حيث يمكنك أستعراض كل ماتحتويه كما بالشكل:

تحت المجلد Bin سيمكنك ان تطالع التالي:

المجلد Debug وفيه الملف التنفيدي للمشروع وهي ليست النسخة النهائية ويستخدمها الفجوال نت في عمليات تتبع الاخطاء وغيرها بما يتلائم مع البرنامج وعمليات التعديل وتتبع التنفيذ سطر بسطر.

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

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


المصفوفات Array

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

Dim myvalue(5) As Integer

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

  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 او اي أداة أخرى لا فرق.


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

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

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

الأمر | 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 وهذه خياراته:

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

يمكنك تجربة باقي الخيارات.

الأمر | 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 ضرب عشرة.

الأمر | 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

الأمر | 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

الأمر | 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

الأمر | 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

واحدة للزر وواحدة لأداة النص

الأمر | 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

الأمر | 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

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

الأمر | 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 فهو أكثر عملية.

الأمر | 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

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

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

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

الأمر | 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


الاجراءات والدوال 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 الى المشروع وكتابة إجراءاتك فيه وسوف نناقش هذا لاحقاً

بقى شئ أخر وهو انك لا تستطيع ان تعرف وسيط لاستقبال ليس اختياري بعد وسيط اختياري، دع الوسيط الاختياري هو أخر شئ.


الأدوات Tolls

الأدوات Tools

لا تنسى لمعرفة خصائص هذه الأدوات راجع الدرس خصائص.

الأداة | 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"

الأداة | 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 تعود باللون المختار وهذا كل شئ

الأداة | 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 تعود بنوعية الخط المختار

الأداة | 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 تعود بمسار المجلد المحدد

الأداة | 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

ولمزيد من المعلومات عن الأحداث راجع الدروس

الأداة | 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 وراقب النتيجة.

الأداة | 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

الأداة | 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

الأداة | 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

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

الأداة | 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 بهذا الشكل سيظل المؤشر يتحرك دائماً وعندما يصل النهاية سيعود الى البداية من جديد وهكذا، ولكني لا احب هذه الطريقة، لان البرنامج قد يتوقف عن الاستجابة ولا يعلم المستخدم بذلك ويهدر كثير من الوقت حتى يفيق الى ان هناك امراً غير طبيعي بالبرنامج.

الأداة | 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

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

الأداة | 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.google.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 لمزيد من المعلومات يمكنك مراجعة التعليمات في Vs.net

الأداة | 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 كما بالكود السابق

الأداة | 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 والتي تمكنك من ترتيب العناصر، كما يمكنك تحويل الامثلة الى برنامج واقعي يحمل اسماء الملفات الحقيقة من النظام ويضع احجامها الحقيقة وانواعها، تحتاج القليل من الجهد فقط.

الأداة | 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.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 اذا تم وضع جملة بينه يتم تغييرها الى اللون الازرق

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

أضف ImageList وهذه الأداة الى النموذج ، قم بإضافة بعض الأيقونات 16-16 الى الأداة ImageList تم أنقر على الأداة TreeView وعلى السهم الصغير وعند ظهور القائمة من الخيار ListImage حدد الاداة ListImage الخاصة بنا.

وألان اكتب الكود التالي:

 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

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

الأداة | 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

ويمكنك تغيير موضع الإيقونة من الخاصية التالية:

 ErrorProvider1.GetIconAlignment = ErrorIconAlignment.BottomLeft

الأداة | 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 جعلنا العنوان للنموذج يتغير الى الوقت والتاريخ الحالي، وبهذا المكان يمكنك كتابة اي اوامر تريد تنفيذها شغل البرنامج الان.

الأداة | 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 وعند انشاء الاجراء الخاص به اكتب هناك ماتريد فعله.

الأداة | HelpProvider
وظيفته | تستخدم لعرض ملفات التعليمات من نوع CHM أو HTML
المثال على كيفية الاستخدام |

اضف الاداة الى النموذج ومن نافذة الخصائص حدد الخاصية التالية هكذا.

Help Namespace: htmlhelp.chm

حيث Htmlhelp.chm هو ملف المساعدة الذي تكون قد اعددته ببعض البرامج ومثل الملف الذي تقرأه الان وضعه بجانب الملف التنفيذي، ولفتحه أستخدم الامر التالي:

  Help.ShowHelp(Me, hpAdvancedCHM.HelpNamespace)

طبعاً هذا الامر سيفتح الملف على المحتويات واذا اردت ان يتم فتح الملف على الفهرس فاستخدم التالي:

 Help.ShowHelpIndex(Me, hpAdvancedCHM.HelpNamespace)

أما اذا اردت فتح الملف على جانب البحث فاستخدم التالي:

 Help.ShowHelp(Me, hpAdvancedCHM.HelpNamespace, HelpNavigator.Find, "")

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

لتجعل هذه الخاصية تظهر بالنموذج يجب ان بتفعيل هذه الخاصية للنموذج.

Help Button=True

كما عليك الغاء هذه الخاصيتين.

Maximize box=false

Minimize box=false

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


الرسم 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 يتم رسم الدائرة واكتشف بنفسك ما الذي تعنيه هذه الارقام.

وفي هذا المثال يمكنك رسم أيقونة.

 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 حتى تتمكن من فهم طريقة عمله.


الاحداث Events

الأحداث Events

لقد تحدث عن الاحداث من قبل عند الحديث عن نافذة الخصائص، يمكنك مراجعة المزيد عن ذلك في موضوع الخصائص.

ولكن ما هي الاحداث....؟

الاحداث هي نوعية البرمجة التي يقوم عليها نظام التشغيل 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

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

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


مجالات الأسماء Name Space

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

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

هذا هو مجال الاسماء وهذا بالضبط ما هو مطلوب منه ان يعمله.

ولتقوم بجلب مجال معين يجب استدعاءه قبل بداية 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

لاحظ كيف تم احاطة 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

وبهذا المثال اختم هذا الدرس.


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 يمكنك البحث بالانترنت عن اكواد جديدة

كما يمكنك فتح المجلدات واستعراض الكود الذي تحتويه.


أعادة التعريف 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 بها كل الامكانيات التي تحدثنا عنها، انشئ اداة UserControl جديدة وضع بها هذا الكود وجربها.


البناءات 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 ليصبح البناء عاماً.

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

الامر واضح صرت تفهم الطريقة بالتاكيد من الشرح السابق، مع ملاحظة انه لايمكننا اسناد القيمة من الاسم مباشرة أي File تم نقطة من احد الخيارات وانما من الضروري تعريف متغير ليحل محل التركيب انظر المثال بشكل واضح:

 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

ولكن حتى الان ستظهر الرسالة فارغة لان لاقيم يحملها هذا التركيب ولنفعل ذلك يهذه الطريقة:

 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

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

أنظر طريقة متداخلة:

 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


الملفات والمجلدات 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

القراءة من ملف ثنائي

التأكد من وجود ملف

 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 هو مسار الملف، تم اخبرنا البرنامج ان يضع هذه الايقونة للنموذج الحالي.

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

اختر Insert Snippet ستظهر القائمة التالي:

أختر الخيار المحدد بالصور ستظهر لك قائمة بكل الأوامر الجاهزة اختر منها ما تشاء.

وسوف نتحدث لاحقاً كيف يمكننا اضافة او تعديل او الحذف من والى هذه القائمة.


قواعد البيانات 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

        End Try

اضفنا العبارة Try لمزيد من المعلومات عن هذه العبارة راجع الدروس الاخرى.

حسناً الان نريد طريقة اضافة حقول جديدة.

   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

        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

        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

        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)

        End Try

الامر يتم عن طريق جملة Sql تلك، قم بالتغيير فيها على حسب ما تريد، ولاحظ ان FiledName يتم تحديده عن طريق TextBox7

وفي لغة Sql كل التعبيرات التي قد تحتاجها.

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

كما ساضيف شيئاً هنا وهو كيف يمكنك استخراج الصور من قاعدة البيانات وكيف يمكنك تخزينها فيها كذلك.

Dim PictureByte As Byte()

PictureByte = My.Computer.FileSystem.ReadAllBytes(OpenFileDialog1.FileName)

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

ويجب ان يكون الحقل من نوع بيانات ثنائية طويلة.

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

أنظر الى هذا المثال وهنا انا استخدم الاداة 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

            End If

        End Try

لاحظ ان الحقل الذي به الصورة أسمه PicImage، عرفنا متغير CV من النوع Byte ووضعنا به البيانات التي بالحقل، كما عرفنا متغير S من النوع MemoryStream لوضع البيانات فيه بالتنسيق المطلوب، واستخدمنا الامر For لرصف البيانات فيه، وأخيراً وضعنا الصورة التي بالذاكرة في اداة الصورة الخاصة بنا، والامر Using ليقوم بقتل الكائن عند الانتهاء منه حتى لا تبقى هذه البيانات بالذاكرة.

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

أما الان فدعنا نستعرض بعض جمل 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

        End Try

أنظر الى هذا اننا نستورد حقولاً بشرط معين، واذا كتبنا اسم الجدول فقط فهذا يعني أننا سنتورد كل الحقول وهذه تعني ايضاً كل الحقول Select * From TabelName


Data Sources

هذه النافذة تمكنك من الاتصال بالبيانات بشكل مرئي اذا كنت تحبذ هذه الطريقة وتحتوي على الاوامر التالية:

من اليمين الى اليسارك

الزر الاول: لتنشيط القائمة واعادة انعاشها.

الزر الثاني: اذا اردت اعادة التعديل في شكل البيانات المستورد او ما شابه.

الزر الثالث: اذا اردت ان تعدل في قاعدة البيانات مرئياً وباستخدام Designer

الزر الرابع: لاتصال بالبيانات ، أو انشاء اتصال بيانات جديد.

دعنا ننشئ اتصالاً جديدً وبعد النقر على الزر سترى النافذة التالي:

ما يهمنا هو الخيار المحدد حالياً Database وأنقر Next

أختر New Connection لتطالعك النافذة التالية:

يمكنك من هنا اختيار نوع قاعدة البيانات التي سوف تتعامل معها وبحالنا هذه سوف نستخدم Access وأنقر على الزر Continue

يوجد امام اداة النص بالعنوان Database File Name الزر Browse وهو الزر الذي يمكنك منه تحديد ملف قاعدة البيانات خاصتك.

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

User name-password وسوف نتحدث لاحقاً كيف يمكن انشاء قاعدة بيانات في Access وكيف يمكنك حمايتها بكلمة مرور واسم مستخدم.

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

بعدها انقر على Ok وانقر على Ok مرة أخرى ليتم نقلنا الى النافذة التالية:ك

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

يقولون انك تستخدم ملف قاعدة بيانات ليس موجوداً بمجلد المشروع خاصتك فهل تريد نسخ الملف الى المجلد، بالتاكيد أنقر على الزر Yes لتطالعك النافذة التالية:

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

هل تلاحظ التغيير الذي حدث في شيفرة الاتصال Connection String انظر الى ما بعد الامر Data Source لقد تم تغييرمسار قاعدة البيانات بالتالي:

|DataDirectory| وهي تعني مجلد المشروع، وكنا نستخدمها في الفجوال بيسك 6 App.path الامر شبيه بالتالي قد تحتاجها مستقبلاً او في اعدادات التقارير فلا تنساها.

حسناً أنقر Next تم Next مرة أخرى لتطالعك النافذة التالية:

هذه هي الجداول الموجودة في ملف قاعدة البيانات خاصتنا حدد انت الجداول التي تريد ان تتعامل معها تم أنقر على الزر 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

بعد ان تحدد هذه الحقول قم بسحبها واسقاطها على النموذج Form1 ليقوم البرنامج بباقي العمل كما بالشكل التالي:

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

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

اذا عدت الى النافذة Solution explorer فسوف تلاحظ ظهور ملف قاعدة البيانات و الـ Dataset وهي Class للتعامل مع قاعدة البيانات كما بالشكل التالي:

يمكنك ان تختار عرض كل الملفات كما تعلمت سابقاً لتطالعك النافذة كما بالشكل التالي:

أنقر على Dataset.designer لتتمكن من قراءة كامل الكود وتستفيد منه.


إعداد المشروع

إعداد المشروع 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 لتحصل على القائمة التالية:

مايهمك من الخيارات الشائعة الاستخدام.

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

Registy للقيام بقراءة قيمة او تسجيل او انشاء مفتاح جديد.

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

Custom Action من هنا يمكن تحديد ملف Exe او Dll او Vbs الذي تريد تنفيذه بمرحلة معينة من مراحل اعداد المشروع.

Install عند أنتهاء تحميل كل الملفات

Uninstall عند الانتهاء من عملية الغاء تنصيب الملفات

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

Commit أعتقد ان الامر سينفذ مع أخر عملية توزيع للملفات.

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

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

نلاحظ مثلاً هنا الصندوق Welcome الذي يظهر مرحباً بالمستخدم مع او تنفيذ برنامج الاعداد.

يمكنك حذف او اضافة اي من هذه الصناديق، كما يمكنك التغيير في القليل حقيقة من نافذة الخصائص.

مثل الصور والايقونات المستخدم، والنصوص التي يتم عرضها.

والان دعنا نعود الى النافذة File System لاضافة ملفات الى مجلد أنقر عليه بزر الفأرة الايمن وأختر Add وستظهر القائمة التالية:

Folder لاضافة مجلد.

File لاضافة الملفات.

Assemply لاضافة بعض مجمع الى البرنامج.

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

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

من Configuration أختر Release لانشاء النسخة الاخيرة.

ويمكنك تغيير مسار انشاء حزمة التثبيت من Output File Name كما يمكنك ان تتحكم هل تريد برنامج الاعداد في شكل ملف واحد مستقل ام يتم ذلك من خلال انشاء مجلد يحتوي على الملفات الضرورية، أنصحك بترك الخيار كما هو.

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

من المهم ان تتجه الى Prerequisites لتحدد لبرنامج الاعداد طريقة اعتماده على التنزيل هل هو Framework وبعدة اصدارات مختلفة او Windows Installer والاصدارة.

حقيقة لا اعلم ما الفرق بينهم ولكن أي منهم يفي بالغرض، حتى وان كانت اغلب البرامج التي اعرفها تتعامل مع WindowsInstaller في عمليات التنصيب.

لاحظ انك اذا اعتمدت FramWorks فانت بحاجة الى ان تكون الاصدارة فعلاً موجودة على الجهاز والا فان برنامج الاعداد لن يعمل.

واذا اردت استخدام WindowsInstaller فأختر الاصدارة 3.1 فهي الاصدارة الاحدث وانظمة التشغيل كلها تحتوي عليها حتى هذا التاريخ على الاقل.

اما البقية فلم يسبق لي التعامل معها.


بداية البرمجة

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

يمكننا التوسع أكثر وزيادة القدرة الاختزالية للنظام ولكن سيكون ذلك على حساب بعض المرونة


مكتبة للتعامل مع العتاد

مكتبة كاملة للتعامل مع عتاد الجهاز

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

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

فتح سواقة الاقراص

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