P. 1
دروس في الفيجول بايزيك دوت نيت

دروس في الفيجول بايزيك دوت نيت

|Views: 1,574|Likes:
أهم ما كتبت في لغة البرمجة فيجول بيزك دوت نيت في منتديات البرمجة مجمعة حتى تاريخ 16-4-2009 وذلك من الإصدارة 2002 حتى الإصدارة 2008. تم تحميل من قبل موقع برامج سوفت اكس جيم http://www.softxgame.com
أهم ما كتبت في لغة البرمجة فيجول بيزك دوت نيت في منتديات البرمجة مجمعة حتى تاريخ 16-4-2009 وذلك من الإصدارة 2002 حتى الإصدارة 2008. تم تحميل من قبل موقع برامج سوفت اكس جيم http://www.softxgame.com

More info:

Published by: أكبر مكتبة كتب عربية on Sep 10, 2009
حقوق الطبع:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

05/21/2013

pdf

text

original

ذ١ٔ دٚد ه٠ض١ث يٛغ١فٌا ٟف طٚسد

My Lessons In Visual Basic .net

تٌن تود كٌزٌب لوجٌف ةجمربلا ةؽل ًف تبتك ام مهأ
خٌرات ىتح ةعمجم 16 / 04 / 2009 ةرادصلا نم كلذو
2002 ىتحو 2008

ولس وبأ رماس دمحم


2



ذ١ٔ دٚد ه٠ض١ث يٛغ١فٌا ٟف طٚسد
My Lessons in Visual Basic .net





ٍُمث
ٍٛع ٛثأ شِبع ذّحِ


Samer.selo@yahoo.com
Samerselo2005@hotmail.com


3

ءاذ٘لا


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


صبخ شىش

ًتدلاوو يدلاو ىلإ
دحاو باتك ًف تلاقملا عٌمجت اوحرتقا نٌذلا ةوخلا ىلإ
ةسرهفلاو عٌمجتلا ًف ًندعاس نم لك ىلإ

4


خِذمِ

ةؽلب ةٌبرعلا ةجمربلا تاٌدتنم ًف ًتلاقمو ًعٌضاوم مهل عٌمجت وه باتكلا اذه Visual Basic .net نم ءادتبا ةفلتخملا اهتارادصإب 2002
ىتحو 2008 هأرقٌ نم لكل ةدبافلا اٌجار ةؽللا هذه عم لماعتٌ جمربم لك مهت هٌف ةدوجوملا عٌضاوملا نكلو ةؽلل لماكتم اعجرم لكشٌ ل وهو
نم اءدب ماسقلا ةءارق عٌطتست اذهل عوضوملاب ةهباشتملا تلاقملا نم ةعومجم مسق لك مضٌل ةعونتم ماسقأ ةدع ًف تلاقملا تعمج ثٌح
ةٌنقت مسق ةٌصوصخ ىلإ هابتنلا عم كبجعٌ يذلا عوضوملا وأ مسقلا Linq ةٌادب ًف اهنع هونملا عٌضاوملا ضعب ةسارد كٌلع بجوتٌ ثٌح
باتكلا ًف دراولا لسلستلاب هتعباتمو هب ءدبلا لبق مسقلا .
لوجٌفلا ةؽل تاٌساسأ نع ةدٌج ةٌفلخ كٌدل نوكت نأ بجٌف مهفلاو ةعباتملا عٌطتست ًك ةؽللا تاٌساسأ ضعب لقلا ىلع ؾرعت نأ لضفٌ امك
ةجمربب املم نوكت نأ اهمزلٌ ةمدقتملا عٌضاوملا ضعب نأ امك اهلاجمو تارٌؽتملا ؾٌرعتو ةٌطرشلا تاقلحلاو راركتلا تاقلح نم كٌزٌاب
تاملعتسا ةباتك ةقٌرطو تاناٌبلا دعاوق Select ـب صاخلا مسقلا ىلإ لقتنت امدنع ةصاخو Linq ماملإ ىلإ جاتحت عٌضاوم دوجو عم ةقٌرطب
ؾٌرعت ءاشنإو تابفلا Classes لضفٌ امك نأ نوكت كٌدل ةفرعم ئدابمب HTML و XML اهقلعتل ضعبب سوردلا ةدوجوملا ًف باتكلا


5


يٚلا ُغمٌا – ءبطخلا خغٌبؼِ



ةٌلاتلا عٌضاوملا مضٌو :
 ةجلاعم ءاطخلا
 حٌقنت ءاطخلا ًف كجمانرب
 تاءانثتسلا Exceptions داٌطصا ءاطخلا اهتجلاعمو

6

ءبطخلا خغٌبؼِ

ءبطخلا دبغٌبؼِ َذخزغٔ ٝزِ
رٌؼ مأ اعقوتم ؤطخلا كلذ ناك ءاوس جمانربلا ذٌفنت ؾقوٌ ؤطخ ثودحل لامتحا دلوٌ عضو يأ ًف ءاطخلا تاجلاعم مادختسا كنكمٌ
عقوتم . صرق وأ ةكبشلل لوصولا ًف لشفك جمانربلا ذٌفنت راسم ىلع رثإت دق ةٌجراخ ثادحأ ةرادل ءاطخلا تاجلاعم مدختست ماع لكشبو
ءاطخأ تاجلاعم ىلإ جاتحت ًتلا ةلمتحملا لكاشملا هذه نمو لثم نٌلؽشم رٌؼ ًبوض حسام وأ ةعباط وأ دوجوم رٌؼ طوؽضم :
 ةكبش / تنرتنا لاصتلا تازٌهجت وأ تامدخملا ًف ةلكشم
 تانايب دعاوق ام ؤطخ دٌعت تاناٌبلا ةدعاق نأ وأ ملعتسا ذٌفنت وأ لاصتا ءاشنإ ىلع ةردقلا مدع
 صارقلا تاقاوس دٌج لكشب لخدم رٌؼ ةلازلل لباق صرق وأ ةحٌحص رٌؼ ةروصب ؤٌهم وأ ؤٌهم رٌؼ صرق
الم صرق ىتح وأ ةفلات تاعاطق وأ
 تاراسملا لكاشم حٌحص رٌؼ وأ اطاخ راسم
 ةعباطلا لكاشم ام ببسل ةرفوتم رٌؼ وأ قرو نودب وأ ةؤفطم ةعباط
 تايجمرب لكاشم وأ ةحٌحص ةروصب ةبصنم رٌؼ وأ ةصقان ذٌفنتلل ؾلم اهٌلع دمتعٌ تابتكم وأ تانوكم
 تابتكملا ضعب نٌب ةٌقفاوت مدع وأ ضراعت دوجو
 نامأ لكاشم كلتمٌ ل جمانربلا لؽشٌ يذلا مدختسملا نأ وأ ةحومسم رٌؼ ةٌلمعب ماٌقلا لواحٌ جمانربلا
 ةٌلمعلا ذٌفنت مامتل ةٌفاكلا تاٌحلصلا
 ةركاذ لكاشم ةٌفاك رٌؼ ماظن رداصم
 ةظفاحلا لكاشم زودنٌو ةظفاح عم تاناٌبلا لدابت ًف لكاشم
 ةيقطنم لكاشم اهفشك مجرتملا عطتسٌ مل ةٌقطنم لكاشم وأ ةؽٌص لكاشم

خٍزو Try … Catch
ىعدت ذٌفنتلا نمز ءاطخأ ةجلاعمل مدختست ًتلا دوكلا ةلتك Try … Catch ةرابع ةباتك كنكمٌ ثٌح Try ةجلاعم ءارجإ نمض
ةرابع ةرشابم اهٌلتو ةلكشم دلوٌ نأ عقوتت يذلا دوكلا لبق ثدحلا Catch تارابعلا نم ةعومجم ذٌفنت متٌف ذٌفنتلا نمز ًف ؤطخ ثدح نإف
ةلتك نمض Catch ةلتك ًف ةٌراٌتخلا تارابعلا نم ةعومجم ذفنتس مث Finally تاكولب ةدع شٌشعت تلاحلا ضعب ًف نكمٌ امك Try …
Catch ةلتكل ةماعلا ةؽٌصلا نوكت و اهضعب لخاد Try … Catch
Try
Statements that might produce a run-time error
أطخ ذنٕر ٌأ ٍكًًنا داسبجؼنا
Catch
Statements to run if a run-time error occurs
أطخ سٔذؽ خنبؽ ٙف زفُر ٙزنا داسبجؼنا
Finally
Optional statements to run whether an error occurs or not
ل وأ أطخ سذؽ ٌإ زفُزع خٚسبٛزخا داسبجػ
End Try

ةرابع لكشت ثٌح Try تارابعلا نأ نٌح ًف ؤطخلا ةجلاعم ؾٌرعت ةٌادب Try و Catch و End Try ةرابعلاو ةٌرابجإ تارابع ًه Finally
ةٌراٌتخا . ًترابع نٌب دجاوتملا دوكلا ىعدٌو Try و Catch ببستت ل دوكلا كلذ نمض ةدلوتملا ذٌفنتلا نمز ءاطخأ نأ ببسب ًمحملا دوكلاب
لمعلا نع جمانربلا ؾقوت ًف
ةلتك نمض دوكلا كلذ عضو اننكمٌ ةروصلا قودنص ًف هلٌمحتو ةروص ؾلم حتف انلواح نإ لثمف Try … Catch نم جمانربلا ةٌامحل كلذو
ذٌفنتلا نمز ًف ثدحت دق ًتلا ءاطخلا
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
7

MsgBox("Please insert the disk in drive D")
End Try

لتك شٌشعت ةٌفٌك انل نٌبٌ ًلاتلا لاثملاو Try … Catch
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
MsgBox("Please insert the disk in drive D, Then Click Ok")
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
MsgBox("File Load feature disabled")
End Try
End Try

عشغٌا Err
ضرؽلا ةقباسلا كٌزٌاب لوجٌف خسن نم ةٌقابلا ةدٌفملا ةثوروملا ضارؼلا نم Err ةجلاعمل ةلصفم تامولعمب ةثدحملا هتخسنب
ضرؽلا لثم كروومٌرفلا ًف ءاطخلا ةرادل ثدحأ قرط كانه كلذ عمو جمانربلا ًف ثدحٌ ذٌفنت نمز ؤطخ لكل ءاطخلا Exception
صباصخلا لكشتو يوقلا Err.Number و Err.Description ًفنتلا نمز ءاطخأ دٌدحتل ةدافإ رثكلا صباصخلا ذ ةٌصاخلاف Err.Number
ةٌصاخلاو ارخإم ثدح ذٌفنت نمز ؤطخ رخآب صاخلا ؤطخلا مقر ىلع يوتحت Err.Description مقر قباطت ةرٌصق ةلاسر ىلع يوتحت
ًطعت دقو اهل ةبسانملا ةباجتسلا دٌدحتو ارخإم تثدح ًتلا ءاطخلا ىلع ؾرعتلا نم كانكمت ناتٌصاخلا كلتو ارخإم ثدح يذلا ؤطخلا
ةقٌرطلا ةطساوب ؤطخلا ػٌرفت كنكمٌ امك نٌعم ؤطخ ثودح ةلاح ًف ؾرصتٌ نأ نكمٌ ؾٌك نع ةلاسر مدختسملا Err.Clear نإ نكلو
ضرؽلا تمدختسا Err ةلتك لخاد Catch ةلتك ىلإ لوخدلا متٌ ل هنل ؤطخلا ػٌرفت يرورضلا رٌؼ نم حبصٌف Catch ؤطخ ثدح نإ لإ
ضرؽلا مادختساب ذٌفنتلا نمز ءاطخأ ةدع ىلع ؾرعتٌ ًلاتلا لاثملاو Err

Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch When Err.Number = 53 'If File Not Found Error
MsgBox("Check pathname and disk drive")
Catch When Err.Number = 7 'If File Out Of Memory Error
MsgBox("Is this really a bitmap", , Err.Description)
Catch
MsgBox("Problem loading file", , Err.Description)
End Try

حسبجؼٌا Exit Try
ةلتك نم جورخلل مدختست ًهو Try … Catch ارابعلل هباشم لكشب ت Exit For و Exit Sub اٌلك جرخت اهمادختساب ثٌح ةفولؤملا
ةلتك نم Try مسق ناك نإ نكلو Finally ةرابع نكلو هذٌفنت متٌسف ادوجوم Exit Try تارابع ةٌقب قوف زفقت كلعجت Try … Catch ةٌقابلا

Try
If PictureBox1.Enabled = False Then Exit Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\fileopen.bmp")
Catch
Retries +=1
If Retries <= 2 Then
MsgBox("Please insert the disc in drive D")
8

Else
MsgBox("File Load feature disabled")
Button1.Enabled = False
End If
End Try

خغِشجٌٍ خ١ػبفذٌا دب١ٕمزٌا غِ ءبطخلا دبغٌبؼِ خٔسبمِ
مدختست ةٌلاتلا دوكلا ةعطقف ذٌفنتلا نمز ءاطخأ ثودح نم كجمانرب ةٌامحل ةدٌحولا ةقٌرطلا تسٌل ءاطخلا تاجلاعم مادختسا
ةقٌرطلا File.Exists ءامسلا لاجم ًف System.IO هحتف ةلواحم لبق لعف دوجوم ؾلملا نأ نم دكؤتلل كروومٌرفلا تابف ةبتكم ًف

If file.Exists("D:\fileopen.bmp") Then
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\fileopen.bmp")
Else
MsgBox("Cannot find fileopen.bmp on drive D.")
End If

ةرابع ربتعت ل قباسلا دوكلا ًف If ةقٌرطف كلذ نع لدبو جمانربلا ذٌفنت ؾاقٌإ نم ذٌفنتلا نمز ؤطخ عنم عٌطتست ل اهنل ًقٌقح ؤطخ جلاعم
ةٌعافدلا ةجمربلاب ىعدت نٌجمربملا ضعب اهمدختسٌ ًتلا هذه ققحتلا . ةٌلمعلا نم دكؤتلل كروومٌرفلا تابف ةبتكم ًف ةدٌفم ةفٌظو مدختست ًهف
ةٌلعفلا هحتف ةلواحم لبق ؾلملا ىلع يرجتس ًتلا . ةقٌرطلا مادختساب ؾلملا دوجو نم دكؤتلاف ةصاخ ةلاحلا هذه ًفو File.Exists عرسأ ًه
ءاطخلا تاجلاعم مادختساب ذٌفنتلا نمز ؤطخ نم هتداعتساو ءانثتسلا قلطل كٌزٌاب لوجٌف راظتنا نم .
لاإس انٌدل رهظٌ انهو : هنأ وه باوجلا نوكٌو ؟ءاطخلا تاجلاعم مادختسا انٌلع بجٌ ىتمو ةٌعافدلا ةجمربلا ةقٌرط مادختسا انٌلع بجٌ ىتم
ةلمتحملا لكاشملا ةجلاعمل ةٌلاعف رثكلا ًه ةٌعافدلا ةجمربلا ةقٌرط نوكت ثٌح كدوك ًف نٌتقٌرطلا نم جٌزم مادختسا كٌلع بجٌ . امكو
ةقٌرطلاف اقباس انركذ File.Exists كولب نم عرسأ Try … Catch لجأ نم ةٌعافدلا ةجمربلا ةٌنقت مادختسا ًقطنملا نمف اذل ءاطخلا ةجلاعمل
دٌوزت دٌرتو هصحفل طرش نم رثكأ كٌدل ناك اذإ ءاطخلا ةجلاعمب ةصاخلا بٌكارتلا مادختساو رركتم لكشب اهثودح عقوتت ًتلا ءاطخلا
اهعقوتت ل دق ًتلا ءاطخلا ةجلاعم نم كنكمت امك ؤطخلا كلذل ةباجتساك تاراٌخلا نم ددعب كجمانرب مدختسم .


9

ح١مٕر ءبطخلا ٟف هغِبٔشث , Debugging Your Application

دنع رٌوطت قٌبطت ام هجاوٌ جمربملا لكاشم ءاطخأو رهظت ءانثأ ذٌفنتلا وأ ةمجرتلا مسقنتو هذه ءاطخلا ىلإ ةدع عاونأ : ؤطخ ةؽٌصلاب اذهو
لهسٌ هفاشتكا ثٌح نل موقٌ ـلا Compiler ةمجرتب عورشملا هذٌفنتو نإ دجو ؤطخ نم اذه عونلا دقو ضرتعت هٌلع ةبٌب رٌوطتلا ءانثأ كتباتك
ةرفشل جمانربلا - طخ رمحأ تحت ةرابعلا - ءاطخأو تقو ذٌفنتلا هذهو ءاطخأ ةبراط ثدحت ءانثأ ذٌفنت جمانربلا بجٌو اهتبقارم ًف ةرفٌشلا
انهو مدختسن ةرابع Try ... Catch رصحل كلت ءاطخلا اهزواجتو لثم امدنع لواحٌ جمانربلا حتف ؾلم دق نوكٌ رٌؼ رفوتم حتفلل بابسل
ةددعتم ةطبترم ةبٌبب لٌؽشتلا عونو رخآ ًهو ءاطخأ ةٌقطنم ًف دوكلا ثٌح ظحلت نأ ةؽٌص رماولا ةحٌحص نكلو جمانربلا ل موقٌ لمعلاب
امك بجٌ ًفف هذه ةلاحلا قرط زواجت نٌعونلا نٌقباسلا نم لكاشملا نل كدٌفت رطضتسو مادختسل تودأ حٌقنتلا Debugging tools رصحل
حٌحصتو كلت لكاشملا امٌفو ًلٌ ضعب طاقنلا ًتلا كدعاست ىلع مادختسا هذه تاودلا زواجتل لكاشملا نم عونلا رٌخلا
كنكمٌ عضو طاقن ؾقوتلا Break Points ؾاقٌل ذٌفنت جمانربلا دنع رطس نٌعم نكمٌو دعب ؾقوتلا ةعباتم ذٌفنت جمانربلا مادختساب F11
ةعباتملل رطس رطس وأ F5 ةعباتمل ذٌفنت جمانربلا نكمٌ ثٌح عضو طاقن ؾقوتلا وأ اهتلازإ راٌتخاب دنبلا Toggle Breakpoints نم ةمباق
Debug وأ طؽض حاتفملا F9 وأ رقنلا ىلع شماهلا يدامرلا بناجب رطسلا دارملا ؾقوتلا هدنع رهظتو ةرباد ءارمح بناجب رطسلا ةللد
ىلع عضو ةطقن ؾقوتلا هدنع
لٌؽشتل جمانربلا عم حٌقنتلا رتخا Start Debugging نم ةمباق Debug وأ طؽضا F5 هٌلؽشتلو نودب حٌقنت رتخا Start Without
Debugging وأ طؽضا Ctrl+F5
كنكمٌ طؽض حاتفملا F11 ءدبل جمانربلا عم حٌقنتلا رطس رطس
طؽضا F11 ىرتس كنأ دق تلقتنا لول رطس دوك متٌس هذٌفنت ةعباتملو ذٌفنت جمانربلا رطس رطس عبات طؽض F11 ىرتس ًف لك ةرم هنأ دق
ذفن ارطس رخآ نم جمانربلا ثٌح كنكمٌ مادختسا هذه ةقٌرطلا مهفلل قٌقدلا ةٌفٌكل ذٌفنت جمانربلا نأ امك F10 لمع سفنب موقت F11 لإ ابٌرقت
امك رطس رطس ءارجلا كلذ ذٌفنتب رورملا نود اروف ًلاتلا رطسلل ذٌفنتلا ررمت اهنإف هحٌقنت متٌ يذلا دوكلا نمض ءارجإ تهجاو اذإ اهنأ
لعفت F11 ءارجلل ًعدتسملا دوكلا ًقاب ذٌفنتل ةدوعلا لبق رطس رطس هذفنتو ءارجلا كلذل لقتنت ًتلا
كنكمٌ ؾاقٌإ ذٌفنت جمانربلا كلذو امإ طؽضلاب ىلع رز ؾقوتلا نم طٌرش تاودلا وأ Shift-F5
طؽضا F5 لٌؽشتل جمانربلا اذهبو أدبٌ لٌؽشت حقنملا رمتسٌو ذٌفنت دوكلا ىتح رمٌ ىلع ةطقن ؾقوت Break Point اهدنعو ؾقوتٌ دنع
رطسلا ددحملا ةطقنب ؾقوتلا ةددحملا اقباس امنٌبو تنأ ًف عضو ؾقوتلا كنكمٌ ةعباتم تاناٌب تابفلا ًف جمانربلا ربع ًتذفان Autos و
Locals
ةذفان locals كٌرت عٌمج تارٌؽتملا ةفرعملا نمض لاجم ذٌفنتلا ًلاحلا ثٌح كنكمٌ اهمادختسا ةٌإرل عٌمج صباصخ كلت تارٌؽتملا اهمٌقو
ةذفانو Autos لمعت ةقٌرطب ةهباشم اهنكلو انٌرت تارٌؽتم دق نوكت ل ةفرعم نمض لاجم ذٌفنتلا ًلاحلا
اذإ تفقوأ رشإم ةرؤفلا قوف رٌؽتم وأ ةٌصاخ ام تنأو ًف عضو ؾقوتلا ظحلتس روهظ ةذفان ةرٌؽص رهظت كل كلت ةٌصاخلا اهتمٌقو
كنكمٌو دنع ةجاحلا رٌٌؽت كلت ةٌصاخلا رقنلاب جودزملا اهٌلع ةباتكو ةمٌق ةدٌدج وأ طؽضلا ةرؤفلا رزب ًنٌمٌلا اهٌلع مث راٌتخا Edit Value
نم ةمباقلا رٌٌؽتو كلت ةمٌقلا ثٌح كنكمٌ اهدعب ةعباتم حٌقنتلا مادختساب F11
رٌٌؽتل رطسلا ًلاتلا يذلا متٌس ذٌفنت دوكلا هدنع طقف رقنا ةرؤفلا رزب ًنٌمٌلا ىلع ةٌصاخلا رتخاو نم ةمباقلا Set Next Statement
ظحلتس رٌؽت ناكم مهسلا رفصلا يذلا لدٌ ىلع رطسلا ًلاتلا يذلا متٌس هذٌفنت
امدنع ؾقوت رشإم ةرؤفلا ًف عضو ؾقوتلا قوف عون تاناٌب بكرم لثم Me ًتلا رٌشت ةبفلل ةٌلاحلا لثم وأ رٌؽتم رٌشٌ ىلإ ةبف وأ بٌكرت
ام وأ دق رٌشٌ ىلإ Dataset لثم كنكمٌ طؽضلاب ىلع تاراشإ + لقنتل ةٌإرو عٌمج صباصخ كلت ةبفلا وأ عون تاناٌبلا بكرملا وأ اهرٌٌؽت
كلذو سفنب ةقٌرطلا ًتلا اهمدختست لقنتلل نٌب رصانع TreeView
اذإ تدرأ ذٌفنت جمانربلا ىتح لصٌ رطسل نٌعم كنكمٌ لعف كلذ ةرشابم نودب طؽضلا ىلع F11 ذٌفنتلل كلذو طؽضلاب ةرؤفلا رزب ًنٌمٌلا
ىلع كلذ رطسلا راٌتخاو Run to Cursor ثٌح متٌس ذٌفنت جمانربلا ىتح كلذ رطسلا
ةبقارمل ةمٌق رٌؽتم لكشب رمتسم مدختسن Watch window ثٌح كنكمٌ رقنلا ةرؤفلا رزب ًنٌمٌلا ىلع كلذ رٌؽتملا راٌتخاو Add Watch
ثٌح كنكمٌ ةٌإر كلذ رٌؽتملا ةٌإرو هتمٌق وأ اهرٌٌؽت ةرشابم نم كلت ةذفانلا و سفنب ةقٌرطلا كنكمٌ اضٌأ ةفاضإ Watch دحل رصانعلا
ةبكرملا ةٌإرو وأ رٌٌؽت ةمٌق ىدحإ هصباصخ
ةلازل رٌؽتم نم ةذفان Watch طقف رقنا ةرؤفلا رزب ًنٌمٌلا هٌلع ًف كلت ةذفانلا رتخاو Delete Watch
امك كنكمٌ ةباتك مسا رٌؽتملا ةرشابم ًف ةذفان watch هتبقارمل
ًف ةلاح دوجو ةٌمك تاناٌب ةرٌبك وأ ةٌنب تاناٌب ةدقعم لخاد رٌؽتملا تاناٌبك XML لثم كنكمٌ ةظحلم ةنوقٌأ ةربكم بناجب كلت ةمٌقلا ثٌح
كنكمٌ امإ طؽضلا ىلع ةربكملا ةرشابم ضرعل تاناٌبلا وأ رقنلا ىلع مهسلا رٌؽصلا اهبناجب راٌتخل ةقٌرط ضرع كلت تاناٌبلا نم ةمباقلا
ثٌح كنكمٌ راٌتخا Xml Visualizer لثم ًف ةلاح تاناٌب نم عون XML
كنكمٌ مادختسا طاقن بقعتلا Trace Points موقٌل حقنملا ذٌفنتب لمع نٌعم دنع هلوصو هذهل ةطقنلا نود ؾاقٌإ ذٌفنت جمانربلا وأ عم ؾاقٌإ
ذٌفنتلا
عضول ةطقن بقعت Tracepoint رقنا ةرافلا رزب ًنٌمٌلا ىلع رطس دوكلا مث نم ةمباقلا ةٌعرفلا Breakpoint رتخا Insert Tracepoint
اذهو يدإٌ ىلإ روهظ عبرم راوح When Breakpoint Is Hit يذلا كنكمٌ نم دٌدحت اذام دٌرت نأ لعفٌ امدنع لصٌ ذٌفنتلا كلذل رطسلا
ثٌح رفوٌ كل ةٌناكمإ ةعابط ةلاسر وأ ذٌفنت وركام ةفاضلاب ىلإ راٌخ رارمتسل ذٌفنتلا وأ هفاقٌإ دنع كلذ رطسلا امك كنكمٌ مادختسا رٌباعت
ةنٌعم راهظل مٌق ةصاخ ًف رطس ةلاسرلا لثم TICK $ راهظل مادختسا جلاعملا وأ TNAME $ راهظل مسا راسم ذٌفنتلا ًلاحلا Current
Thread Name دنعو اهطبض ظحلتس روهظ نٌعم رمحأ بناجب رطسلا ةللد ىلع Trace Point اضوع نع ةربادلا ءارمحلا ًتلا رٌشت
ـل Break Point رهظتسو لباسرلا ةقلعتملا ـب Trace Point ًف ةذفان Output
10

داءبٕضزعلا Exceptions دب١ططا ءبطخلا بٙزغٌبؼِٚ

ٓ١ؼِ ءبٕضزعا ؽبمزٌا
لمعتسن ءانثتسا طاقتلل كولب Try ... Catch ءانثتسا دلوت دق ةنٌعم ةٌلمع جمانربلا ذفنٌ امدنع ماع لكشب وب موقن كلذ لمعلف ض ةرفٌشلا كلت ع
ًترابع نٌب ةٌجمربلا Try و Catch ةرابعلا دعب و Catch ةلصاحلا تاءانثتسلا ؾشكتسن

Try
C = A + B
Catch Ex as OverflowException

ءزجلا حٌتٌو Catch ؾاشتكا جمانربلل رفص ىلع ةمسقلا ءانثتسا طاقتلا اننكمٌ لثمف هٌلع درلاو نٌعم ءانثتسا Divided By Zero

Try
C = A Mod B
TextBox3.Text = C.ToString()
Catch Ex as DividedByZeroException
MsgBox("Devided By Zero.")
TextBox3.Text = "Infinity"
End Try

ناضٌف ءانثتسا ؾاشكتسا اننكمٌ ةقٌرطلا سفنبو Overflow Exception

Dim A, B, C As Integer

Try
A= TextBox1.text
B = TextBox2.Text

C = A + B
Catch Ex as OverflowException
MsgBox("Overflow.")
TextBox3.Text = "Infinity"
End Try

حلاص رٌؼ ؾلم مسا نع ؾشكلل همادختسا اننكمٌ اضٌأ ىتحو


Dim Fname As New String = "D:\Some Folder\FileName.ext"
Dim Sfl as new StreamReader
Try
Sfl = New StreamReader(Fname)
TextBox1.Text = Sfl.ReadToEnd()
Sfl.Close
Catch Ex As FileNotFoundException
MsgBox("File Not Found")
End Try

داءبٕضزعا حذػ ضحف
نأ نكمٌ امدنع نم ةلسلس دٌدحت كنكمٌ ةفلتخم تاءانثتسا ةدع ىلإ اهذٌفنتب موقت ًتلا ةٌلمعلا يدإت لمجلا Catch تاءانثتسلا كلت ةجلاعمل

Dim FileDB As New OpenFileDialog()
11


FileDB.Filter = "All files | *.* | Text files | *.txt"

FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.DefaultExt = "txt"

' Prevent dialog box from validating file
FileDB.CheckFileExists = False
FileDB.CheckPathExists = False

If (FileDB.ShowDialog() = DialogResult.OK) Then
Dim SourceFile As StreamReader

Try
SourceFile = New StreamReader(FileDB.FileName)

TextBox1.Text = SourceFile.ReadToEnd()
SourceFile.Close()
Catch Except As DirectoryNotFoundException
MsgBox("Error: " & Except.Message)
Catch Except As FileNotFoundException
MsgBox("Error: " & Except.Message)
Catch Except As Exception
MsgBox("Error: " & Except.Message)
End Try
Else
MsgBox("User selected Cancel")
End If

نٍٛث يبّؼزعبث داءبٕضزعلا خغٌبؼِ Catch َبػ
نم اعساو اقاطن دلوٌ دقف جمانربلا نع ةباٌن ةٌلمع نباك ذفنٌ امدنع ل دقو جمانربلا ذٌفنت رٌس ىلع ءانب تاءانثتسلا هذه ًه ام كمهت
ام ردقب تاءانثتسلا ل اننإف اهعون نع رظنلا ضؽب تاءانثتسلا ةجلاعملو ام ءانثتسا كانه لصح دق هنأ كمهٌ مدختسن لب انٌعم ءانثتسا ددحن

Catch Ex as Exception
لاثم

Try

..... Some Code Here

Catch Ex As Exception
MsgBox("Error: " & Ex.Message)
End Try
ءاشعئ ٟظٕزٌا ف سٚذح ذؼث ءبٕضزعا
كولبل كلامعتسا دنع Try ... Catch نم ةلسلس ىلع درلل كولب نمض ءانثتسا لك صخت تاٌلمع ةداع ذفنتس تاءانثتسلا Catch بسانملا
ىلع ءانبو معب ماٌقلا كٌلع كجمانرب اهب موقٌ ًتلا روملا ل ضؽب كلذو ءانثتسا ثودح دعب ةنٌعم تاٌ ضرؽلا اذهلو ءانثتسلا عون نع رظنلا
ةرابع مدختسن Finally كولب ةٌاهن ًف Try ... Catch نأ ةظحلم عم ءانثتسلا عون نع رظنلا ضؽب اهذٌفنت دٌرن ًتلا لمجلا ددحت تارابعلا
كولب نمض ةدوجوملا Finally ءانثتسا ثودح نع رظنلا ضؽب امود اهذٌفنت متٌس ل وأ

Dim FileDB As New OpenFileDialog()

12

FileDB.Filter = "All files | *.* | Text files | *.txt"

FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.DefaultExt = "txt"

' Prevent dialog box from validating file
FileDB.CheckFileExists = False
FileDB.CheckPathExists = False

If (FileDB.ShowDialog() = DialogResult.OK) Then
Dim SourceFile As StreamReader

Try
SourceFile = New StreamReader(FileDB.FileName)
Catch Except As Exception
MsgBox("Error: " & Except.Message)
End Try

If (Not SourceFile Is Nothing) Then
Try
TextBox1.Text = SourceFile.ReadToEnd()
Catch Except As Exception
MsgBox("Error: " & Except.Message)
Finally
MsgBox("In finally statements")
SourceFile.Close()
End Try
End If
Else
MsgBox("User selected Cancel")
End If

ل تاقوأ كانه نوكت دق تلاحلا ضعب ًفو ذٌفنت لامكتسا دٌرت كولبلا Try ... Catch ةرابعلا مدختست اهدنع Exit Try كولبلا نم جورخلل
ذفنٌس ثٌح ًلٌ دوك رطس لوأ اهدعب End Try

Try

.... Some Code

If SomeCondition Then Exit Try

Catch Ex as Exception

Exit Try

.... Rest of Try Block

هراءبٕضزعا قلؽئ خطبخٌا
لكب جاتحتس اهدنع كب صاخ ءانثتسا نٌوكتل اهٌف جاتحت تاقوأ كانه ةبف ءاشنل ةطاسب Class ةبفلا ثرت Exception - ىلعف لاثملا لٌبس
مساب ءانثتسا دٌلوت اننكمٌ InvalidEMailException ًلٌ امك

Public Class InvalidEMailException
13

Inherits System.Exception

Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
End Class

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

Throw New InvalidEMailException("Envalid Email Please Correct")
امٌفو رخآ لاثم ًلٌ

Public Class MyException
Inherits System.Exception

Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
End Class

Public Class Form1
Inherits System.Windows.Forms.Form

.....

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

Try
MsgBox("About to generate custom exception")
Throw (New MyException("** Custom Message **"))
Catch Ex As MyException
MsgBox("Custom Exception thrown " & Ex.Message)
End Try

End Sub

......

End Class
ُغل ٟف ءبطخلا ح١ششر CATCH نٍٛث ٟف TRY ءبطخلا دب١ططا ذٕػ
مسق انل رفوٌ Catch كولب ًف Try بجٌ انهو هداٌطصا دارملا ؤطخلا عون دٌدحتب ًه قرطلا هذه ىدحإو ءاطخلا حٌشرتل راٌخ نم رثكأ
مسق نأ امب ةٌمومع رثكلا عونلاب اٌهتنم ادٌدحت رثكلا عونلاب ءدبلا كٌلع Catch مادختسا نكمٌ امك هتباتك بٌترتب هذٌفنت متٌ When مسق ًف
Catch كجمانربل ةبسانملا ةقٌرطلا ىلع لوصحلل بٌلاسلا هذه جمد كنكمٌ ثٌح نٌعم ؤطخ مقر دٌدحت لثم ةقد رثكأ دٌدحتل
لاثم :
Try
' ندٛو ًّرحٌّا ْا ةثس٠ أطخ
Catch ex As System.IO.IOException
' دٛو ًػافرٌٍ غِ أطخٌا IOException
Catch ex As System.NullReferenceException
' دٛو ًػافرٌٍ غِ أطخٌا NullReferenceException
Catch ex As Exception When Err.Number = 5 Or Err.Number = 8
' دٛو ًػافرٌٍ اِذٕػ ْٛى٠ ُلس أطخٌا 5 ٚأ 8
Catch ex As Exception
' دٛو ًػافرٌٍ غِ ٞأ أطخ شخآ
14

End Try

بِٕٙ ًىٌ غ٠شع فطٚٚ ءبطخلا دبئف غؼث ٍٟ٠ بّ١ف

خئفٌا فطٌٛا
AmbiguousMatchException وذخزغٚ خناذنا ٍي خخغَ ٘أ ذٚذؾر ظيبَشجنا غطزغٚ ىن
ApplicationException خهربل شٛغنا ءبطخلا دبئف غًٛغن ةلا خئفنا ْٙ ِزْ . ٌٕكر ٌأ تؾٚ كث خطبخ ءبُضزعا خئف ُٙجر بيذُؼف
خئفنا ِزْ ٍي خصٔسٕي
ArgumentException خؾٛؾط شٛغ حسشًًنا خًٛمنا
ArgumentNullException ئشل بٓزًٛل كنر غئ ئشل ٌٕكر ٌأ ٍكًٚ ل حسشًًنا خًٛمنا
ArgumentOutOfRangeException لٕجمًنا لبغًنا طسبخ حسشًًنا خًٛمنا
ArithmeticException خٛثبغؽ خٛهًػ ٙف مٕٚؾر ٔأ دبُعإ أطخ
ArrayTypeMismatchException خفٕفظًنا ٙف ئطبخ عَٕ ٍي شظُػ لبخدئث وبٛمنا لٔبؾٚ ظيبَشجنا
ConfigurationException خؾٛؾط شٛغ داذػلا خًٛل
ConstraintException دبَبٛجنا حذػبل ٗهػ دٕٛمنا ٙف أطخ تجغر دبَبٛجنا خٛهًػ
DataException ـث خمهؼزًنا ءبطخلا دبئف غًٛغن ةلا خئفنا ADO .NET
DirectoryNotFoundException دٕعٕي شٛغ ةٕهطًنا ذهغًنا
DivideByZeroException شفط ٗهػ خًغمنا أطخ
DuplicateNameException خٛهًػ ADO .Net اسشكي بًعا ذٓعأ . بمثبع دٕعٕي لٔذع ذعٕٚ َّأ غي لٔذع ءبشَإ لٔبؾر كَأ مضي
ىعلا ظفَ كهًٚٔ
EvaluateException دبَبٛجنا حذػبل دًٕػ ٙف دٕعًٕنا شٛجؼزنا خًٛل ىٛٛمر ظيبَشجنا غٛطزغٚ ل بيذُػ سذؾٚ
FieldAccessException خؾٛؾط شٛغ خمٚشطث خئفهن خٛطبخ ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
FormatException ٙغُر ق ؼٛؾط شٛغ حسشًًنا خًٛمنا
IndexOutofRangeException شخآ ءإزؽا شظُػ ٘أ ٔأ خفٕفظًنا دٔذؽ طسبخ غمٚ شظُػ ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
InvalidCastException ؼٛؾط شٛغ عَٕ مٕٚؾزث وبٛمنا لٔبؾٚ ظيبَشجنا
InvalidOperationException بٓث ػًٕغي شٛغ بٛنبؽ خثٕهطًنا خٛهًؼنا
IOException مخذنا ءبطخأ دبئف غًٛغن ةلا خئفنا / طشخنا .
مخد أطخ / وبػ طشخ
EndOfStreamException مطٔ ـنا Stream ّزٚبَٓ ٗنإ
FileLoadException فهًنا مًٛؾر ءبُصأ أطخ
FileNotFoundException ةٕهطًنا فهًنا دبغٚإ ٍكًٚ ل
InternalBufferOverflowException ـنا ٙف ٌبضٛف سٔذؽ Buffer ٙهخاذنا
MemberAccessException خؾٛؾط شٛغ خمٚشطث خئف ٙف شظُػ ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
MethodAccessException خؾٛؾط شٛغ خمٚشطث خمٚشطنا ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
MissingFieldException خئفنا ٙف حدٕعٕي شٛغ خٛطبخ ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
MissingMemberException لإ لٕطٕنا لٔبؾٚ ظيبَشجنا ٖ خئفنا ٙف دٕعٕي شٛغ شظُػ
MissingMethodException خئفنا ٙف حدٕعٕي شٛغ خمٚشط ٗنإ لٕطٕنا لٔبؾٚ ظيبَشجنا
NotImplementedException خفشؼي شٛغ خثٕهطًنا خٛهًؼنا
NotSupportedException خيٕػذي شٛغ خثٕهطًنا خٛطبخنا
NullReferenceException عشغ ٗنإ غعشي واذخزعا لٔبؾٚ ظيبَشجنا Object ئشل ّزًٛل
OutOfMemoryException خٛفبك حشكار ذعٕرل
بٓعبزؾٛع ٙزنا حشكازنا ىغؾث ؤجُزنا كُكًٚ خًخض دبَبٛث خػًٕغي ذٛنٕر لٔبؾٚ وذخزغًنا ٌبك ٌإ لضًف
خٛفبك ٍكر ىن ٌإ ءبُضزعلا ازْ ٙيشث وٕمزف حشفٕزي ذَبك ٌإ سبجزخأ ظيبَشجنا
OverflowException خٛثبغؽ خٛهًػ ٙف ٌبضٛف أطخ
RankException دبؼثلا ٍي بئطبخ ادذػ كهًر خفٕفظي واذخزعا لٔبؾٚ ءاشعلا
ReadOnlyException ظمف حءاشمهن دبَبٛث مٚذؼر لٔبؾٚ ظيبَشجنا
ResourceException دٕمفي ةٕهطًنا سذظًنا
SyntaxErrorException خٛطبخن خًٛل دبُعإ ذُػ خغٛظنا ٙف أطخ
UnauthorizedAccessException دبٛؽلظنا خٚبفك وذػ تجغث لٕطٕنا غًُٚ وبظُنا

ك١جطزٌا ٟف خغٌبؼِ ش١غٌا داءبٕضزعلا ؽبمزٌا
ًف Application Events ثدحلا دجوٌ UnhandledException ةظحلم عم قٌبطتلا ًف ةجلاعم رٌؽلا تاءانثتسلا عٌمج لبقتسٌ يذلا
قٌبطتلا لخادل ذٌفنتلا راسم دوعٌ لو هإاهنإ متٌس قٌبطتلا نإف ثدحلا اذهل ءانثتسلا لصٌ امدنع هنأ

15


ٟٔبضٌا ُغمٌا - ـث خمٍؼزٌّا خغِشجٌا VBA ٚ VB6 ٚ
Microsoft Office



ةٌلاتلا عٌضاوملا مضٌو :
 تاقورفلا نٌب VB2008 و C# و VB6
 تاظحلم ةماه دنع ةٌقرت عٌراشم VB6 ىلإ VB 2008
 ةبتكم ةٌقفاوتلا ةصاخلا لوجٌفب كٌزٌاب 6
 له ًناعت نم ةلكشم ًف جلاعم ثٌدحت دوكلا نم VB6 ىلإ VB2005
 مادختسا دوك لوجٌف كٌزٌب تود تٌن ًف لوجٌف كٌزٌب 6
 ؾٌك اننكمٌ مادختسا لوجٌف كٌزٌاب 2008 ءاشنل تاحفص ةطرشأ ةٌفاضإ ـل
Excel 2007
 ةتمتأ دروو 2007 مادختساب لوجٌف كٌزٌاب تود تٌن
 ةباتك ةرفٌش ءاشنل Add-in متٌ هإاعدتسا نم VBA
 ؾٌك ًعدتسن قٌدانص راوحلا ةصاخلا تفوسوركٌامب دروو نم انجمانرب

16

ٓ١ث دبلٚشفٌا VB2008 ٚ C#3.0 ٚ VB6

كروومٌرفلا نمض اهمٌدقت مت ًتلا ةدٌدجلا ةجمربلا جذامن مدختستل اصٌصخ اهمٌمصت مت دق كٌزٌاب لوجٌف نم ةرادصلا هذه 3.5 مت دقو
نم لك مٌمصت VB و C# كروومٌرفلل لٌؽشتلا نمز تابتكم عم لمعلل CLR ةؽل مٌمصت مت ثٌح C# نٌذلا نٌجمربملا روهمج ؾادهتسل
ىلع نولمعٌ C++ كٌزٌاب لوجٌفلا مٌمصت مت امنٌب 2008 ةؽل نكمتت نأ لجأ نمو نٌقباسلا كٌزٌابلا ًجمربمل ضٌرعلا روهمجلا ؾادهتسل
كروومٌرفلا لبق نم ةمدقملا تازٌملا مادختسا نم كٌزٌبلا 3.5 هجوتلا ةٌضرؼ ةجمربلل ىوقلا معدلا نم ادٌزم مدقت نأ نم دبل ناك OOP
عاونلا نامأ تازٌمب اهظافتحا عم

ٓ١ث VB2008 ٚ C#
ةمدقملا ؾباظولاو تابفلا عٌمج ىلإ لوصولل امهنم اٌأ مادختسا نكمٌ ثٌح امهب هقٌقحت كنكمٌ امب قلعتٌ امٌف ناتقباطتم ناتؽللا ناتاه ربتعت
مادختساب اٌش يأ روطت نأ كنكمٌ ًساسأ لكشبو كروومٌرفلا لبق نم VB2008 مادختساب هتروط كنأ ول امك امامت C# نٌتاه ىدحإ نأ عم
تاقورفلا نع ثدحتن تنأ انل لهسلا نم هنأ دجنس نٌتؽللا نٌب ةنراقملا اندرأ نإو هلمعب موقت ام ىلع ادامتعا رثكأ ةٌباٌسنا كل مدقت دق نٌتؽللا
لثم ةؽلل ةدٌدجلا تافاضلا عٌمج نامعدت امهاتلكف امهنٌب ةكرتشملا ءاٌشلا نع ثدحتن نأ نم LINQ ادمل رٌباعتو ةلوهجملا عاونلا و
نأ ًف ًقٌقحلا قرفلا نمكٌو اهرٌؼو C#3.0 مدقت امنٌب نمآ رٌؼ دوك ةباتكل ةٌناكمإ مدقت VB رخؤتملا طبرلا ةٌناكمإ رٌؽلا دوكلا نوكٌ نٌح
ًف نمآ C# تاءاعدتسا ضعبل وأ ءادلاب قلعتت بابسل نمآ رٌؽلا دوكلا جاتحت امبرف ةرشابم ةركاذلا ةرادل تارشإملا مادختسا ربع
Windows API كنكمٌ ل هنل همادختساب حصنلا مدع عم تلاحلا ضعب ًف ادٌفم نمآ رٌؽلا دوكلا نوكٌ ثٌح ضفخنملا ىوتسملا تاذ
رداصم رٌرحتو ةركاذلا ًف ةدوجوملا ضارؼلا ةلازإ نم نكمتٌس تاٌافنلا عماج نأ نم دكؤتلا عٌطتست نل كنأ ىلإ ةفاضإ هنامأ نم دكؤتلا
ثٌح ةقباسلا خسنلا عم ةٌقفاوتلا لجأ نم كٌزٌاب لوجٌفلا ةؽل ًف رخؤتملا طبرلا ىلع ءاقبلا مت امنٌب ضارؼلا كلت لبق نم ةمدختسملا ماظنلا
عونلا نم تارٌؽتم ءاشنإب كل حمسٌ رخؤتملا طبرلا نأ OBJECT ةلادلا مادختساب وأ ام عون نم رٌؽتم ةطساوب اهنٌٌعت مث CreateObject
ضعب ؾاشتكا نم مجرتملا نكمٌ ل رخؤتملا طبرلا مادختسا نأ ىلإ ةفاضإ ءادلا ىوتسم عفرٌ هنل رخؤتملا طبرلا نع ركبملا طبرلا لضفٌو
لٌؽشتلا نمز ًف ءاطخأ ثودحل ةرٌبك ةٌناكمإ ًنعٌ امم ءاطخلا

ٓ١ث VB2008 ٚ VB6
نم ءادتبا ًلك لكشب كٌزٌاب لوجٌفلا ةؽل ةؼاٌص ةداعإ مت VB2002 معد لجأ نم كلذو CLR عم طقف اٌمسا اهبش لمحت ًهف VB6 ىنع امم
ةبٌب مادختساب حٌحص لكشب ةدٌدجلا ةٌجمربلا ةقٌرطلا قبطت امدنع لباقملاب نكلو نٌجمربملا نم دٌدعلل ةبسنلاب ملعتلا ًف ارٌبك افاطعنا
انل مدقٌو لضفأ تاٌجمرب كٌدل جتنٌ ةنسحملا رٌوطتلا CLR هجوتلا ةٌضرؼ ةجمربلاو عاونلا نامأو ةركاذلل ةنسحم ةرادإ كلذل ةفاضإ OOP
هجوتلا ةٌضرؼ ةجمربلل ةٌقٌقح ةؽل تحبصأ اهنأ ًه كٌزٌبلا ةؽل ىلع تأرط ًتلا ىربكلا تارٌٌؽتلا دحأو OOP عٌمج نأ ًنعٌ امم
نم ةثوروم ًه ضارؼلا System.Object نم لدبو VB Runtime و Win32 API ةلماك ةٌساسأ تابف ةبتكم انٌدل حبصأ BCL لمعتل
اهنوجاتحٌ ًتلا تابفلا نودجٌ نٌأ ةفرعمو كروومٌرفلا ربع راحبلا ًف ةدٌدجلا ةرادصلل اثٌدح نٌلقتنملا نٌجمربملل يدحتلا نمكٌو اهعم
ربتعٌ ثٌح عرسأو لضفأ جمارب ةباتك كناكمإب حبصأ كروومٌرفلا عم رثكأ افلآتم تحبصأ املكو BCL اعاونأ رفوٌ كروومٌرفلا نم اءزج
نمض لمعلل هتباتك متٌس دوك يأ ًف مدختست CLR لثم ءامسلا تلاجم نم دٌدعلا نمضتٌ اذهو System.Collections و System.IO و
System.Registry و System.Text و System.Drawing اهرٌؼو

17

غ٠سبشِ خ١لشر ذٕػ خِب٘ دبظحلِ VB6 ٌٝئ VB .net 2008

عٌراشم ةٌقرت ةٌلمع نأ نم مؼرلا ىلع VB6 رادصإ ىلإ 2008 اهذخأ بجاولا طاقنلا ضعب كانه هنأ لإ ةٌلآ ةروصب اهمظعمب متت
ةٌقرتلا ةٌلمعل رٌضحتلل رابتعلا نٌعب . اهلمعل رطضتس ًتلا تلٌدعتلا نم دٌدعلا ءاؽلإ وأ لٌلقت كنكمٌ انه درتس ًتلا تاظحلملا ةاعارمبو
ضارؼلاو قبارطلا ةفرعم كدٌفٌسو ةدٌج ةجمرب تاسرامم نع ةرابع تاٌصوتلا هذه نوكت تلاحلا مظعم ًفو ةٌقرتلا جلاعم ءاهتنا دعب
ةٌقرتلا ةٌلمع ًف تابفاكم اهل دجوٌ ل ًتلا . ةبٌب نمض ةدٌج ةروصب عورشملا لٌؽشتو ةمجرت ةٌلمع متت مل نإف ماع لكشبو VB6 عقوتت لف
بٌصنت حرتقٌ اذهل حاجنب ةٌقرتلا ةٌلمع متت نأ VB6 لوأ كانه هرابتخاو ةٌقرتلا ةٌلمع هٌلع متتس يذلا زاهجلا ىلع . جلاعم نأ ىلإ ةفاضإ
ىلإ ةٌقرتلا 2008 رادصلا نم ةٌقرتلاب موقٌ 6 نم تارادصلا ىلع عٌراشم كٌدل تناك نإف طقف 1 ىلإ 5 رٌوطت ةبٌب نمض اهحتف بجٌف
VB6 رادصلل ةٌقرتلا ةٌلمعب ءدبلا لبق سداسلا رادصلا ىلإ اهتٌقرتو 2008 راٌخلا مادختسا سنت لو upgrade Microsoft ActiveX
controls سداسلا رادصلل ةمٌدقلا تارادصلا عٌراشم ةٌقرت دنع .
رادصلا كلتمٌ 2008 ضعب دجوت كلذ عمو سداسلا رادصلا ًف ةدوجوملا كلت عم رٌبك لكشب ةقفاوتم اهتامكحتو ذفاونلا نم ةمزر
اهدرونس ًتلا تافلتخلا :
 رادصلا 2008 مكحتلا معدٌ ل Ole Container اهتٌقرت يونت ًتلا عٌراشملا ًف همادختسا بنجت كٌلع بجٌ اذل
 دجوٌ ل Shape Control رادصلا ًف 2008 تامكحت ىلإ تلٌطتسملاو تاعبرملا ةٌقرت متٌس ثٌح Label رباودلا امنٌب
اهمادختسا بنجت كٌلع بجٌ اذل اهتٌقرت نكمٌ ل ةٌجلٌلهلا لاكشلاو
 دجوٌ ل Line Control رادصلا ًف 2008 تامكحت ىلإ ةٌلوقاشلاو ةٌقفلا طوطخلا ةٌقرت متٌس ثٌح Label طوطخلا امنٌب
اهمادختسا مدع كٌلع بجٌ اذل اهتٌقرت متٌ نل ةلباملا
 رادصلا كلتمٌ 2008 ـل ةٌلاتلا قبارطلا لدبتست ةدٌدج ةٌموسر رماوأ Form ًهو Circle و Cls و PSet و Line و Point
ـلا نأ ببسبو Object Module قبارطلا هذه ةٌقرت نكمٌ ل اذل ةمٌدقلا نع ةفلتخم ةدٌدجلا
 مكحتلا لجأ نم Timer ةٌصاخلا طبض دنع Interval ةٌصاخلا ةمٌق طبض ةداعإ متٌس لب هلمع ؾقوتٌ ل مكحتلا نإف رفصلا ىلإ
ىلإ 1 مكحتلا لمع ؾاقٌلو دحاو Timer ةٌصاخلا طبض كٌلع بجٌ Enabled ىلإ False ةمٌق طبض نع اضوع Interval ىلإ
رفصلا
 رادصلا كلتمٌ 2008 امه مباوقلاب ناصاخ نامكحت MenuStrip و ContextMenuStrip كانه سداسلا رادصلا ًف امنٌب
ـك همادختسا نكمٌ دحاو مباوق مكحت Menu وأ ContextMenu مكحت ىلإ مباوقلا تامكحت عٌمج ةٌقرت متٌس اذل MenuStrip
ةدع كلتمٌ MenuItems ةٌقرت دنعو ةمباق مكحت لك لجأ نم ContextMenu تامكحتلا ؾذحو اهباشنإ ةداعإ كٌلع بجٌ
MenuStrip ةدبازلا
 رادصلا كلتمٌ ل 2008 ـل امعد Dynamic Data Exchange DDE
 رادصلا نأ نم مؼرلا ىلع 2008 ةفٌظول امعد كلتمٌ Drag And Drop ًف ةدوجوملا كلت نع رٌبك لكشب ؾلتخت اهنأ لإ
اهتٌقرت نكمٌ ل تلفلاو بحسلا ؾباظو نإف اذل سداسلا رادصلا
 رادصلا كلتمٌ 2008 ضرؽلل انسحم امعد Clipboard للخ نم My.Computer.Clipboard ؾباظول امعد مدقٌ ثٌح
ـل مدختسملا دوكلا ةٌقرت ةٌلمعب ماٌقلا نكمٌ لف ةرٌبكلا تافلتخلا ببسبو سداسلا رادصلا ًف ةدوجوملا كلت نم رثكأ ػٌصو
Clipboard ةٌلآ ةروصب
 رادصلا معدٌ ل 2008 ةٌصاخلا Name للخ نم نارودلا كٌلع بجٌ اذل لٌؽشتلا نمز ًف تامكحتلاو جذومنلل Controls
collection انٌعم امسا كلتمٌ مكحت نع كثحب دنع . ًف ةرفوتم ةفٌظولا هذهو .net Framework تابفلا للخ نم
System.Reflection
 رادصلا نإف تاناٌبلا دعاوقب قلعتٌ امٌفو 2008 نم ةنسحم ةخسن كلتمٌ ADO ًه ADO .net ًف تاناٌبلا لجأ نم ةنسحم
ةعزوملا تاقٌبطتلا . مادختسا كنكمٌ هنأ نم مؼرلا ىلعو RDO و ADO رادصلا ًف 2008 هنأ لإ ةطٌسبلا تلٌدعتلا ضعب عم
ـب ةصاخلا تاناٌبلا دعاوق عم طبرلا تاودأ معدٌ ل DAO و RDO اضٌأو Data Controls ىتح ل و RDO User
Connection . تامكحت مدختسٌ كجمانرب ناك اذإ هنأ حصنٌ اذل DAO و RDO ىلإ مهتٌقرت وأ سداسلا رادصلا ًف مهكرت امإب
تامكحت ADO رادصلل ةٌقرتلا ةٌلمعب ماٌقلا لبق 2008 نأ امب Windows Forms تامكحت معدٌ ADO
ياإع
ًف ةلاح ةٌقرتلا نم Vb.net 2002 وأ 2003 ىلإ Vb.net 2008 كانه ةٌلمع ةٌقرت ةٌباقلت له دجوت طورش وأ تلاح ةنٌعم بجٌ هبنتلا
اهٌلإ ًف ةلاح ةٌقرتلا
ةاٛغٌا
عٌراشمل ةبسنلاب 2002 و 2003 ةعجارم كٌلع ىقبتٌو ةٌلمعلا مظعم ةٌقرتلا جلاعم ىلوتٌس جلاعم اهعضٌ دق ًتلا تاظحلملا ةعباتمل دوكلا
ةطٌسبلا تاحٌحصتلا ضعب ءارجإو ةٌقرتلا ةسلسب ةٌقرتلا ةٌلمع متتس ماع لكشبو دوكلا نمض عٌراشمل ةبسنلابو 2005 ةٌقرتلا ةٌلمع متتس
لكاشم يأ نودو ةسلسب ركذت

عٛػّٛث كٍؼزر خظحلِ نبٕ٘ شوزٌا كحزغر خثشغزٌا خغ١زٔ دٛىٌا ساشمزعا
ةٌجراخ ةبتكم نم ءارجإ مدختسن امدنع user32 نكٌلو GetWindowLong ًف VB6 لكشلاب هفرعن انك
18


Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long

ًفو ـلا ةخسن 2002 ـلا و 2003 رٌوطتلا ةبٌب ضارتعا نودب ؾٌرعتلا سفن مادختسا عٌطتسن انك نٌب ؾلتخا دق تارٌؽتملا لاجم نأ مؼر
VB6 ـلا و .net عونلاف Long ًف vb6 افاكٌ Integer ًف .net ىلإ هحٌحصت بجٌ ناك قباسلا ؾٌرعتلاف هٌلع ءانبو

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer

انهو نم ءادتبا ةرادصلا 2005 لماعتلا دنع ذٌفنتلا نمز ًف ؤطخ دلوت رٌوطتلا ةبٌب تحبصأ مل ةٌجراخ تابتكم نم تاءارجل تافٌرعت عم
اذل ةقدب اهٌف تارٌؽتملا عاونأ ؾٌرعت متٌ ةٌلمع دعب ةحٌحص ةروصب كعورشم ذٌفنت متٌ ىتح تافٌرعت اذكه حٌحصت بجٌ ةٌقرتلا

ِٓ غ٠سبشٌّا خ١لشر ُزر ف١و VB6
 ىلع جمانربلا حتفا VB6 اقباس ةدراولا تاظحلملا قفو اهحٌحصت بجاولا طاقنلا ححصو ادٌج هربتخاو
 ةٌقرتلا ةٌلمعب ماٌقلا لبق امود عورشملا نم ةٌطاٌتحا ةخسن ظفحا
 رٌوطت ةبٌب ةطساوب عورشملا حتفا VB2008 ةطٌسبلا جلاعملا تاوطخ عبتاو

ياإع
 ىلع دوك ةعطق يدل VB6 وأ VBA لماك عورشم تسٌل اهنكلو اهتٌقرت دٌرأو

ةاٛغٌا
 هٌف ةٌقرتلا دعب دوكلا جاردإ ًف بؼرت ًتلا ةطقنلا ىلإ دوكلا ررحم ًف لقتنا مث هٌف دوكلا ةعطق مادختسا يونت يذلا كعورشم حتفا
 ةمباقلا نم Tools رتخا Upgrade Visual Basic 6 Code ةحفص ًف هتٌقرت دارملا دوكلا قصلأ Code عجارم ةٌأ ؾضأ مث
ةحفصلا نم دوكلا اهجاتحٌ امبر References رز طؽضا مث Upgrade ررحم ًف هجاردإو دوكلا ةٌقرت ةٌلمع متتف لٌلق رظتناو
كٌدل دوكلا


19

ه٠ض٠بث يٛغ١فث خطبخٌا خ١مفاٛزٌا خجزىِ 6.0

كٌزٌاب لوجٌف ربتعٌ 2008 كٌزٌاب لوجٌف نع ارٌبك اروطت 6 اننكمٌ امك كٌزٌابلا تاؽل ةلباع ًف ةدٌدج ةؽل هرابتعا اننكمٌ ثٌح
كٌزٌاب لوجٌف ًف اقباس ةدوجوم تناك ًتلا ضارؼلاو ةصصخملا عاونلاو تادادعتلاو ؾباظولا نم دٌدعلا داجٌإ 6 تودلا تابف تابتكم ًف
تٌن . كٌزٌاب لوجٌف عورشم يإ نإف ةقٌقحلا هذه ىلإ رظنلابو 2008 ىمسملا تٌن تودلا تاعمجم دحأ ىلإ اٌباقلت اعجرم نمضتٌ دٌدج
Microsoft.VisualBasic.dll كٌزٌاب لوجٌف نم ةثوروم ؾباظوب اندوزت عاونأ ددحٌ يذلا 6 نإف تٌن تودلا ًف رخآ عمجم يؤكو
Microsoft.VisualBasic.dll اهضعب عم ةعمجملا ءامسلا تلاجم نم دٌدعلا نم ؾلإم .
ؾلم لكل اٌباقلت ةرفوتم تاعمجملا هذه نوكتو vb دارٌتسلا حٌرصت ىلإ جاتحت ل كنأ ًنعٌ اذهو كعورشم ًف Import كلت ىلإ لوصولل
عاونلا . كٌزٌاب لوجٌف رصانع نم دٌدعلا نم ةدافتسلا كنكمٌ لازام اذهبو 6 ةفٌظولا لثم MsgBox لباسر قودنص راهظل ىعدتست ًتلا
لاثملا ًف امك طٌسب

' The Microsoft.VisualBasic namespaces
' are automatically referenced by a
' Visual Studio 2008 VB project
Module Module1
Sub Main()
MsgBox("Hello, old friend …")
End Sub
End Module

ةقٌرطلاو MsgBox ًف رصنع ًه Module كٌزٌاب لوجٌف ًف 2008 ىمست Interaction ءامسلا لاجم نمض ةفرعم ًهو
Microsoft.VisualBasic . ـلا نأ ظحلتسو Module كٌزٌاب لوجٌف ًف 2008 ؾلم لثامت bas كٌزٌاب لوجٌف ًف 6 رصانعلا نأ ًف
ـلا مسا مادختسا نودب مهإاعدتسا نكمٌ اهنمض ةاوتحملا Module ـلا مسا مادختسا تدرأ نإ كلذ عمو ةبدابك Module مادختسا دنع ةبدابك
ةقٌرطلا MsgBox ًلٌ امك قباسلا اندوك حبصٌ نأ نكمٌ

Module Module1
Sub Main()
Interaction.MsgBox("Hello, old friend …")
End Sub
End Module

كٌزٌاب لوجٌف ؾباظو نأ ةفرعمل نانبمطلاب رعشن اننأ عمو 6 كٌزٌاب لوجٌف عٌراشم نمض اهلٌثمت نكمٌ لازام 2008 بنجتب انه حصنٌف
كٌزٌاب لوجٌف معد ةلازلا ططخت تفوسوركٌام نل ارظن ناكملا ردق عاونلا هذه مادختسا 6 نأ نامض كنكمٌ ل هنأو نمزلا عم
لبقتسم عمجملا اذه رفوتس تفوسوركٌام . ةدوجوملا كلت نم رثكأ ؾباظو مدقت ًتلا ةرادملا عاونلا نم دٌدعلا ةٌساسلا تابفلا تابتكم رفوتو
كٌزٌاب لوجٌف ةؽل نم ةثوروملا ةبتكملا ًف 6 . كٌزٌاب لوجٌف عم ةٌقفاوتلا ةبتكم تادوجوم مادختسا نودب لمعلاب موقت ؾٌك ملعتت نأ بجٌو 6
تٌن تودلا تابف مادختساب روملاب ماٌقلاو .

20

ِٓ دٛىٌا ش٠ذحر ظٌبؼِ ٟف خٍىشِ ِٓ ٟٔبؼر ً٘ VB6 ٌٝئ VB2005

خٍىشٌّا حش٘بظ
مقر ؤطخ كل رهظٌو هذٌفنت متٌ ل جلاعملا 0x800706BE وأ 0x800706BA امهٌلك وأ

ةلكشملا هذه زواجت ًف دٌفت نأ نكمم ًتلا لولحلا نم ةعومجم كٌلإ مدقأ
يٚلا ًحٌا :
ًلاتلا لودجلا ًف ةدوجوملا تاؽللا دحأ ىلإ ةٌضارتفلا ةؽللا دادعإ تعضو دق تنك اذإ :

10241 0x2801 Arabic (Syria) ar-SY 1256 ARS
10249 0x2809 English (Belize) en-BZ 1252 ENL
10250 0x280a Spanish (Peru) es-PE 1252 ESR
11265 0x2c01 Arabic (Jordan) ar-JO 1256 ARJ
11273 0x2c09 English (Trinidad) en-TT 1252 ENT
11274 0x2c0a Spanish (Argentina) es-AR 1252 ESS
12289 0x3001 Arabic (Lebanon) ar-LB 1256 ARB
12297 0x3009 Windows 98/Me, Windows
2000 and later: English
(Zimbabwe)
en-ZW 1252 ENW
12298 0x300a Spanish (Ecuador) es-EC 1252 ESF
13313 0x3401 Arabic (Kuwait) ar-KW 1256 ARK
13321 0x3409 Windows 98/Me, Windows
2000 and later: English
(Philippines)
en-PH 1252 ENP
13322 0x340a Spanish (Chile) es-CL 1252 ESL
14337 0x3801 Arabic (U.A.E.) ar-AE 1256 ARU
14346 0x380a Spanish (Uruguay) es-UY 1252 ESY
15361 0x3c01 Arabic (Bahrain) ar-BH 1256 ARH
15370 0x3c0a Spanish (Paraguay) es-PY 1252 ESZ
16385 0x4001 Arabic (Qatar) ar-QA 1256 ARQ
16394 0x400a Spanish (Bolivia) es-BO 1252 ESB
17418 0x440a Spanish (El Salvador) es-SV 1252 ESE
18442 0x480a Spanish (Honduras) es-HN 1252 ESH
19466 0x4c0a Spanish (Nicaragua) es-NI 1252 ESI
20490 0x500a Spanish (Puerto Rico) es-PR 1252 ESU
31748 0x7c04 Chinese (Traditional) zh-Hant


ىلع ةؽللا عضو مهنكمٌ ةٌبرعلا ةؽللا ًمدختسمل ةبسنلابو ىرخأ ةؽل يأ ىلإ مكحتلا ةحول نم ةٌضارتفلا ةؽللا لٌدعت كٌلع بجٌف Arabic
(Saudi Arabia)

ٟٔبضٌا ًحٌا
ؾلملا نوكٌ امبر VBUpgrade.Engine.DLL رملا مادختساب اٌودٌ هلٌجست دعأ لجسم رٌؼ

regasm C:\Program Files\Microsoft Visual Studio 8\VB\VBUpgrade\VBUpgrade.Engine.DLL
21


شٌبضٌا ًحٌا
ؾلملا نوكٌ امبر Microsoft.VisualBasic.UpgradeExtensions.DLL ًف دوجوم هنأ ملعلا عم اٌودٌ هلٌجست دعأ لجسم رٌؼ
ةرادصلا 2005 راسملا ًف

C:\Program Files\Microsoft Visual Studio 8\VB\VBUpgrade\

شيلا واذخزعبث كنرٔ
regasm Microsoft.VisualBasic.UpgradeExtensions.DLL

غثاشٌا ًحٌا
دلجملا ًف ةدوجوملا تابتكملا عٌمج لٌجست دعأ مث هفذحب مق ًلاتلا حاتفملا هٌف ادوجوم ناك اذإ يرتسجٌرلا نم دكؤت C:\Program
Files\Microsoft Visual Studio 8\VB\VBUpgrade \ ةادلا ةطساوب Regasm

[HKEY_CLASSES_ROOT\CLSID\{A8220117-B52C-4012-8CB7-2E0202B3A624}\InprocServer32\8.0.1200.0]
"Class"="Microsoft.VisualBasic.UpgradeExtensions.ResUtil"
"Assembly"="Microsoft.VisualBasic.UpgradeExtensions,Version=8.0.1200.0,Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
"RuntimeVersion"="v2.0.40607"


22

َاذخزعا دٛو يٛغ١ف ه٠ض١ث ذ١ٔ دٚد ٟف يٛغ١ف ه٠ض١ث 6

ىلع ةٌنبملا جماربلل نكمٌ COM لثم VB6 لثم كروومٌرفلا نمض بوتكملاو كب صاخلا دوكلا عم لماعتلا Class - Interface - struct
- enum مت اذإ عابتإ ةٌلاتلا دعاوقلا لكشب ماع :
 ةهجاو ؾٌرعت تابفلا ىلع بجٌ
 مادختساب ؾٌرعتلا Public
 عاونلا Types ل ةدرجم دوكت نأ نكمٌ

ل وأ نكمٌ ناك اذإ امٌف دٌدحت كنكمٌ امك وأ ءارجلا ةٌإر نكمٌ ةبفلا وأ ... ًلمع نم خلا ة ـلا com مادختساب ةفصاولا
ComVisibleAttribute لاثملاك

Imports System.Runtime.InteropServices

<ComVisible(False)> _
Class SampleClass

Public Sub New()
'Insert code here.
End Sub

<ComVisible(False)> _
Public Function MyMethod(param As String) As Integer
Return 0
End Function

Public Function MyOtherMethod() As Boolean
Return True
End Function

<ComVisible(False)> _
Public ReadOnly Property MyProperty() As Integer
Get
Return MyProperty
End Get
End Property

End Class

عمجم لٌجست كٌلع بجٌو . net ـلا ءلمعـل Com مادختساب كلذو اهمادختسا نكمٌ ىتح Tlbexp.exe و RegAsm.exe ةٌلمعب ماٌقلل
ًلاتلا لكشلاب رماولا رطس نم مدختسٌو لٌجستلا

TlbExp AssemblyName /out:FileName

ـلا ءلمع و com ؾلم قٌرط نع كب صاخلا عمجملل نولصٌ . tlb نع كب صاخلا عمجملا لٌجست كٌلع بجٌ امك ةادلا هذه ةطساوب ؤشنملا
قٌرط Regasm.exe ؾلم دٌلوت هنكمٌ يذلاو tlb راٌخلا قٌرط نع اضٌأ / tlb : لكشلاب همادختسا نكمٌ يذلاو

23

RegAsm AssemblyName /tlb: FileName.tlb /codebase

عوضوملا ىلع ًلمع لثم لمعب موقن انعد
عون نم ادٌدج اعورشم أدباو رٌوطتلا ةبٌب حتفا Class Library همسو TestProj متٌف ءاشنإ Class1 اٌضارتفا مث ًف ًلاتلا دوكلا لخدا
Class1

Option Strict On

Public Class Class1
Public Function myFunction() As Integer
Return 100
End Function
End Class

 رزلا طؽضاو عورشملا صباصخ حتفا Assembly Information ةحفصلا نم Application بناجب ةراشإ عضو نم دكؤتو
Make Assembly COM-Visible طؽضا مث OK
 ةحفص نم Compile بناجب ةراشإ عضو نم دكؤت Register for COM Interop
 لمعب مق مث ظفحلاب مق Build عورشملل
 حتفا VB6 دٌدج ًضارتفا عورشم ءاشنإب مق مث
 ةمباق نم Project رتخا References نمو Available References انعورشم مسا رتخا TestProj طؽضا مث Ok
 ثدحلا ًف و دوكلا ررحم ىلإ كلقنٌل اجودزم ارقن هٌلع رقنا مث كعورشمب صاخلا جذومنلا ىلع رماوأ رز عض Button1_Click
ًلاتلا دوكلا لخدأ

Dim myObject As TestProj.Class1
Set myObject = New TestProj.Class1
MsgBox myObject.myFunction

هربتخاو كعورشم لؽش


24

ه٠ض٠بث يٛغ١ف َاذخزعا بٕٕىّ٠ ف١و 2008 ـٌ خ١فبػئ خؽششأ دبحفط ءبشٔل Excel 2007

 دٌدحتب كلذو دٌدج كٌزٌاب لوجٌف عورشم ءاشنإب مق Project Type ىلإ Office مث 2007 ـلا راٌتخا مث Template ًه Excel
2007 WorkBook
 ةمباق نم Project رتخا Add New Item مكحتلا رتخا مث Actions Pane Control طؽضا مث Add
 ـلا نم toolbox ـل اهدٌرت ًتلا تامكحتلا ؾضأ Actions Pane Controls لثم Label ىلإ هلخادب صنلا رٌؼو Actions
Pane 1
 عونلا نم رخآ امكحت ؾضأو ةٌلمعلا ررك Actions Pane Control مكحت هٌلع عضو Label ىلإ هلخادب صنلا رٌؼو Actions
Pane 2
 رتخا Add New Item ةمباق نم Project عونلا نم مكحت ؾضأ و Ribbon (Visual Designer) هتٌمست رٌٌؽت دعب عورشملل
نم Ribbon1 ىلإ MyRibbon رتخا مث Group1 ةٌصاخلا رٌؼو كل رهظٌ يذلا ررحملا نم Label ىلإ Actions Pane
Manager
 ـلا نم ToolBox مسق نمو Office Ribbon controls ؾضأ Button ةعومجملا لخاد ىلإ Actions Pane Manager
ةٌصاخلا رٌؼو Label ةمٌقلا لمحتل Show Actions Pane 1 ةٌصاخ رٌؼو رخآ ارز ؾضأو Label ىلإ هل Show Actions
Pane 2 عون نم ةعومجملا سفنل رخآ امكحت ؾضأ مث ToggleButton ةٌصاخ رٌؼو Label ىلإ Hide Actions Pane
 ـل ةٌفاضإ تاحفص ةفاضإ ةٌناكمإ ةظحلم اننكمٌ My Ribbon بناجب غارفلا ًف ًنٌمٌلا سواملا رزب رقنلاب كلذو TabAddIns
رملا راٌتخاو Add Ribbon Tab ةحفص ةفاضإ برج اقحل ىرنس امك اهٌلع تامكحتلا عضو مث اهدٌرت ًتلا تاحفصلا ةفاضإو
ىلإ دع مث ءاشت امك رثكأ وأ TabAddIns اعم لمعلا ةعباتمل
 نم solution Explorer ىلع ًنٌمٌلا سواملا رزب رقنا MyRibbon رملا رتخا مث View Code قاٌسلا ةمباق نم
 نٌٌلاتلا دوكلا يرطس لخدأ ةرشابم ةبفلا ؾٌرعت تحت

Dim ActionsPane1 As New ActionsPaneControl1
Dim ActionsPane2 As New ActionsPaneControl2

ًف تارٌؽتم ؾٌرعتل كلذو MyRibbon ىلإ رٌشت ActionsPaneControls اقباس امهانفضأ نٌذلا
 ثدحلا ةجلاعم ءارجل ًلاتلا دوكلا ؾضأ Load ـب صاخلا MyRibbon تامكحتلا ؾٌضٌس يذلا ActionsPane1 و
ActionsPane2 ةعومجم ىلإ ActionsPane امهءافخإ مث

Private Sub MyRibbon_Load(ByVal sender As System.Object, _
ByVal e As RibbonUIEventArgs) Handles MyBase.Load

' Add ActionsPane1 & ActionsPane2 to ActionPane Collection
Globals.ThisWorkbook.ActionsPane.Controls.Add(ActionsPane1)
Globals.ThisWorkbook.ActionsPane.Controls.Add(ActionsPane2)
' Hide Action Panes From View
ActionsPane1.Hide()
ActionsPane2.Hide()
Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = False
End Sub

 ثدحلا ةجلاعم ءارجإ نلا ؾٌضنس Click راهظإب موقٌس يذلا لولا رزلل ActionsPane1 ءافخإو ActionsPane2 نوكٌو
ًلاتلاك دوكلا

' Show Actions Pane 1 Button Event Handler
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button2.Click

Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
ActionsPane1.Show()
ActionsPane2.Hide()
25

End Sub

 ثدحلا ةجلاعم ءارجإ نلا ؾٌضنس Click راهظإب موقٌس يذلا ًناثلا رزلل ActionsPane2 ءافخإو ActionsPane1 نوكٌو
ًلاتلاك دوكلا

' Show Actions Pane 2 Button Event Handler
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _
Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button3.Click

Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
ActionsPane2.Show()
ActionsPane1.Hide()
End Sub

 ثدحلا ةجلاعم ءارجإ نلا ؾٌضنس Click ـل ToggleButton1 ًلٌ امك

' Hide Actions Pane Event Handler
Private Sub ToggleButton1_Click(ByVal sender As System.Object, ByVal e As _
Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles ToggleButton1.Click

If ToggleButton1.Checked Then
Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = False
Else
Globals.ThisWorkbook.Application.DisplayDocumentActionTaskPane = True
End If
End Sub

 ةحفص ىلإ لقتناو قٌبطتلا لؽش Add Ins تاحفص رخآ ًف اهارتس ةٌفاضإ تاحفص ةفاضإب تمق نإو انه جمانربلا رابتخل
تاودأ طٌرش Excel 2007

26

خزّرأ دسٚٚ 2007 َاذخزعبث يٛغ١ف ه٠ض٠بث دٚد ذ١ٔ

ةٌبادتبلا تاوطخلا ضعبل جاتحن لمعلا عٌطتسن ىتح
ةحفص نمو عورشملا صباصخ نم References رزلا طؽضا ADD ةحفصل لقتنا مث Com ةبتكملل عجرم ؾضأو Microsoft Word
12.0 Object Library مث لفسأ ةمباقلا نمو ةحفصلا لفسأ نم Imported References ىلإ لقتنا Microsoft.Office.Interop
عضو ةراشإ ةرفوتم نوكت ىتح اهبناجب راٌتخا مادختسل رطضتس لإو هلمكؤب عورشملل Imports ةتمتأ مدختستس ؾلم لك ةٌادب ًف ةٌلاتلا
هٌف دروو

Imports Microsoft.Office.Interop

و أ مدختستس تنك نإ ضارؼ Object ًف رصانعك اهفٌرعت لضفٌ تاٌبارجا ةدع ًف درووب ةصاخلا قٌبطتلا وأ قباثول كلتل يواحلا جذومنلا
تاٌبارجلا - جذومنلا ىوتسم ىلع ةماع تارٌؽتم - ل ىتح دقفت دروو عم كلاصتا

دسٚٚ ءبٙٔئٚ ءذث
رٌؽتم ؾرع ًلٌ امك جذومنلا ىوتسم ىلع ماع

Private axWord As Word.Application

ءدبل ًلاتلا دوكلا مدختسن دروو

axWord = New Word.Application
axWord.Visible = True

ًلاتلا دوكلا مدختسن دروو ءاهنل و

axWord.Quit()

كئبصٌٛا حزفٚ ءبشٔئ
مث لوأ دروو أدبا ةدٌدج ةقٌثو ءاشنل رملا مدختسا Application.Documents.Add

Dim axDoc As Word.Document
axDoc = axWord.Documents.Add

ةدوجوم ةقٌثو حتفل

Dim axDoc As Word.Document
axDoc = axWord.Documents.Open("c:\MyDocument.docx")

ةقٌثولا ظفحل

axDoc.SaveAs("C:\MyDocument.docx")

صٛظٌٕا طاسدئٚ حءاشل
دٌدعلا دجتس دروو ةتمتؤب موقت امدنع كلذ ىلع دٌج لاثم صوصنلا جاردإو ةءارق ةٌلمعو ةفٌظولا سفنب موقت ًتلا قبارطلا نم كنكمٌ ثٌح
ءاٌشلا نم دٌدعلا مادختساب كلذ لمع Objects وه امادختسا اهرثكأ نكلو Paragraph و Selection
27


paragraph object
نم دروو ةقٌثو نوكتت نم اءدب لسلستلاب ةبترم ًهو تارقفلا نم ةعومجم 1 ؾراحم ىتح صنلا لماك نمضتت ًهو عاجرلا نكمٌو
ىلولا ةرقفلا صن ىلع لوصحلا

Dim strText As String
strText = axDoc.Paragraphs(1).Range.Text

مدختسن ةرقفلا صن رٌٌؽتلو

axDoc.Paragraphs(1).Range.Text = "Hello from Visual Basic 2005"

Selection object
كمادختساب هٌبش وهو صوصنلا جاردل ةنورم رثكلا ةقٌرطلا وهو لوأ مدختستف ةقٌثول كتباتك دنع دروول Selection object ةطقن لقنل
ناكملل جاردلا ًف صن جاردإب موقٌ ًلاتلا دوكلاو بولطملا صنلا جاردإب موقت مث ةقٌثولا نمض بولطملا ثحبٌ مث اهتٌادب ًفو ةقٌثولا رخآ
اهدعب ةرشابم صن لخدٌو ةملك نع

'Activate the document first
axDoc.Activate()
'Move to the end and add text
axWord.Selection.EndKey(Word.WdUnits.wdStory)
axWord.Selection.TypeText("This is the end")
'Move to the beginning and add text
axWord.Selection.HomeKey(Word.WdUnits.wdStory)
axWord.Selection.TypeText("This is the beginning")
axWord.Selection.Find.ClearFormatting()
'Locate Foo, then add text following it
axWord.Selection.Find.ClearFormatting()
axWord.Selection.Find.Text = "Foo"
axWord.Selection.Find.Execute()
axWord.Selection.MoveRight(Word.WdUnits.wdCharacter, 1)
axWord.Selection.TypeText("This is Foo")

طاسدئ يٚاذغٌا
ةقٌرط نٌبٌ ًلاتلا دوكلا جاردإ ساٌقب لودج 5 × 5 قٌسنت ةفاضإ و لودجلا كلذ ًف ةددحم ةٌلخ ًف صن طبض مث لودجلل

Dim axTable As Word.Table
axTable = axDoc.Tables.Add(axWord.Selection.Range, 5, 5)
axTable.Style = "Table Grid 8"
axTable.Cell(3, 3).Range.Text = "Hello World"

خػبجطٌا
ةقٌرطلا مدختسن ةقٌثول ةعابطل PrintOut

axDoc.PrintOut()

ِٓ ذوأزٌا ْأ خحٛزفِ خم١صٌٛا
قلؼإ هنكمٌ مدختسملا نأ امب ةقٌرطلا مادختسا كنكمٌ هب اطبترم لازام كجمانرب نأ مؼر تقو يأ ًف دروولا وأ ةقٌثولا نم دكؤتلل ةٌلاتلا نأ
ةحوتفم تلازام ةقٌثولا
Dim strName As String
Dim blnIsAvailable As Boolean
Try
strName = axDoc.Name
blnIsAvailable = True
Catch ex As Exception
28

blnIsAvailable = False
End Try
MsgBox("Document is available: " & blnIsAvailable)

طاسدئ ِٓ يٚذع ADO .net
ةٌلاتلا ةقٌرطلا مادختسا كنكمٌ ردل ا دروو ةقٌثو ًف لودج ًف تاناٌب ةدعاق ًف لودج نم تاناٌب ج

Function AddDataTable(ByVal tbl As DataTable) As Boolean
Dim nRowCount, nColCount, nRow, nCol As Integer
Dim axTable As Word.Table
nRowCount = tbl.Rows.Count
nColCount = tbl.Columns.Count
axWord.Selection.EndKey(wdStory)
axTable = axDoc.Tables.Add(axWord.Selection.Range, nRowCount + 1, nColCount)
axTable.Style = "Table Grid 8"
For nCol = 1 To nColCount
axTable.Cell(1, nCol).Range.Text = tbl.Columns.Item(nCol - 1).Caption
Next
For nCol = 1 To nColCount
For nRow = 1 To nRowCount
axTable.Cell(nRow + 1, nCol).Range.Text = tbl.Rows(nRow - 1).Item(nCol - 1)
Next
Next
Return True
End Function

' To use this function
tbl = Me.CustomersDataSet.Tables(0)
WordDoc.AddDataTable(tbl)

دب٠ٛزحٌّا دبّىحر content controls
دروو مدقٌ 2007 قباثولا ًف تاناٌبلا جاردل ةدٌدج ةٌلآ تاٌوتحملا تامكحت ىعدت Content Controls نكمٌ لوقح نع ةرابع ًهو
وأ اٌودٌ اهرٌرحت ةقٌثو نم اهرشن وأ اٌجمرب اهإلم XML وأ صوصنلا قودنص لثم تامكحت ةدع نمضتت ًهو ةبكرملا ةمباقلا وأ روصلا
... للخ نم اهٌلإ لوصولا نكمٌو خلا ContentControls collection ًف Document objects لاثملا ًف امك

Dim ccCollection As Word.ContentControls
ccCollection = axDoc.ContentControls
ccCollection.Item(1).Range.Text = " Content Control Field"

ذ٠شجٌا ظِد
ةٌلمعلا قٌقحتل
ردصملا ةقٌثولا حتفا مث ةٌصاخلا طبضا Mail Merge DataSource مث ةدٌدج ةقٌثو ءاشنإ متٌ
ًلٌ امٌفو مدختسملا نم لخدت نود كلذ لمع ةٌفٌك نع لاثم

axDoc.Activate()
axDoc.MailMerge.MainDocumentType = _
Word.WdMailMergeMainDocType.wdFormLetters
axDoc.MailMerge.OpenDataSource(strDatabaseFilename, _
wdOpenFormatAuto, False, False, False, False, "", "", _
False, "", "", strConnectionString, strSQL, "", False,_
Word.WdMergeSubType.wdMergeSubTypeOAL)
axDoc.MailMerge.DataSource.FirstRecord = wdDefaultFirstRecord
axDoc.MailMerge.DataSource.LastRecord = wdDefaultLastRecord
axDoc.MailMerge.Destination = _
Word.WdMailMergeDestination.wdSendToNewDocument
axDoc.MailMerge.Execute(False)


29

ءبشٔل حشف١ش خثبزو Add-in ِٓ ٖؤبػذزعا ُز٠ VBA

ةؽلب ادٌدج اعورشم اشنأ Visual Basic عون نم Office مث 2007 رتخا مث Excel 2007 Add-in عورشملا ةٌمستب مقو
ExcelImportData دوك نم ةبفلا كلت قبارط ءاعدتسا اننكمٌ ثٌحب سٌفوأ لولحل اهفشكو ةبف ءاشنإ ًف انه انعورشم ةركف نمكت ثٌح
VBA مساب ةبف ءاشنإ متٌس ثٌح AddInUtilities ىعدت ةقٌرط كلتمت ImportData
مساب عورشملل ةدٌدج ةبف ؾضأ AddInUtilities ؾلملا ةٌادبل ةٌلاتلا تادارٌتسلا ؾضأو

Imports System.Data
Imports System.Runtime.InteropServices
Imports Excel = Microsoft.Office.Interop.Excel

ةبفلا مسج لدبتسا AddInUtilities ًلاتلا دوكلاب

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterf
aceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities

Public Sub ImportData() Implements IAddInUtilities.ImportData

' Create a new DataTable.
Dim ds As New DataSet()
Dim dt As DataTable = ds.Tables.Add("Customers")
dt.Columns.Add(New DataColumn("LastName"))
dt.Columns.Add(New DataColumn("FirstName"))

' Add a new row to the DataTable.
Dim dr As DataRow = dt.NewRow()
dr("LastName") = "Chan"
dr("FirstName") = "Gareth"
dt.Rows.Add(dr)

' Add a new XML map to the collection.
Dim activeWorkbook As Excel.Workbook = _
Globals.ThisAddIn.Application.ActiveWorkbook
Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _
"NewDataSet")

' Import the data.
If Not (xmlMap1 Is Nothing) Then
Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
After:=lastSheet), Excel.Worksheet)
newSheet.Name = "Imported Data"
activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
newSheet.Range("A1"))
End If
End Sub
End Class

30

ًعدت دوكلا ةٌادب ًف ةهجاو ؾٌرعتب موقت ثٌح IAddInUtilities ةٌصاخلا كلتمت ComVisible ىلإ ةطوبضم True ةٌصاخلاو
InterfaceType ةمٌقلا كلتمت IntetrfaceIsDispatch ضرعتو ققحت ؾوس ةٌساسلا ةبفلا نأ وه ةهجاولا هذه ةباتك ًف ببسلا نمكٌو
ةهجاولا IDispatch ىرخلا سٌفوأ لولح لبق نم ءاعدتسلل ةرفوتم اهلعجٌ امم

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
Public Interface IAddInUtilities
Sub ImportData()
End Interface

ةبفلا ؾرعتو AddInUtilities ةهجاولا ققحتل IAddInUtilities ةٌصاخلا قبطتو ComVisisble ةبفلا هذه ىلع

<System.Runtime.InteropServices.ComVisibleAttribute(True)> _
<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterf
aceType.None)> _
Public Class AddInUtilities
Implements IAddInUtilities

ةقٌرطلا ؾرعت مث ImportData ةقٌرطلا ققحت ًتلاو ImportData ةهجاولا ًف ةددحملا IAddInUtilities لوأ اشنتف دوكلا ةٌادب ًف
Dataset عم DataTable ؾاضٌ مث تاناٌبلا لودجل دٌدج رطس ؾاضٌ مث Xml Map ىلع ةٌنبم Dataset to the Collection of
XML maps مدختست مث ؾلملل ةدٌدج ةحفص ؾاضت مث Xml Map ـلا نم تاناٌبلا دارٌتسل Dataset ـلا ةحفص ىلإ Excel .
سٌفولا لولح ةٌقبل ةرفوتم رٌؼ تلازام اهنكلو تهتنا دق انتبف نوكت اذهبو . ةبفلل دوكلا ررحم حتفا نلا ThisAddIn زواجتب مقو
Override ةقٌرطلا RequestComAddInAutomationService ةبفلل اعجرم اهنم ادٌعم AddInUtilities دوكلا ًف امك

Private utilities As AddInUtilities
Protected Overrides Function RequestComAddInAutomationService() As Object
If utilities Is Nothing Then
utilities = New AddInUtilities()
End If
Return utilities
End Function

ـك هظفحب مق مث عورشملا لٌؽشتب مق رابتخللو Excel Macro-Enabled Workbook (*.xlsm) ةحفص ىلإ لقتنا مث developers مث
رقنا Visual Basic حتفاو دوكلا ررحم كل حتفٌل ThisWorkBook ًلاتلا دوكلا ؾضأو

Sub CallVSTOMethod()
Dim addIn As COMAddIn
Dim automationbject As Object
addIn = Application.COMAddIns("ExcelImportData")
automationObject = addIn.Object
automationObject.ImportData()
End Sub

ضرؽلل رٌشٌ ارٌؽتم ؾرعٌ يذلا ComAddIn ـلا لثمٌ يذلا ExcelImportData Add-in ةقٌرطلا ءاعدتسل مدختسٌ مث ImportData
ةقباسلا انتبف نم .
31

ـلا ؾلم ىلإ دع نلا Excel وركاملا لؽش مث CallVSTOMethod دجوت ل هنؤب دٌفت ةلاسر كل رهظتس امبرو وتلل هباشنإب انمق يذلا
Schema ـلا تاناٌبب ةطبترم XML ـلا نأو Excel مساب ةدٌدج ةقرو ءاشنإ ظحلتف انه ةلاسرلا ىلع ةقفاوملاب مق طقف كل اهباشنإب موقٌس
Imported Data ةٌلخلا ًف تاناٌب ةفاضإ مت دقو A1 ةٌلخلاو B1

32

بٕغِبٔشث ِٓ دسٚٚ ذفٛعٚشى٠بّث خطبخٌا ساٛحٌا ك٠دبٕط ٟػذزغٔ ف١و

مدختسملا نم لخد ىلع لوصحلل راوح قٌدانص راهظل جاتحت تاقوأ كٌتؤت دروو تفوسوركٌام عم لماعتت امدنع . دوجو مؼرو
نم اهٌلإ لوصولا اننكمٌ ًتلاو افلس ةدوجوملا راوحلا قٌدانص نم ةدافتسلا اضٌأ كنكمٌ هنأ لإ كب ةصاخلا راوحلا قٌدانص ءاشنل ةٌناكمإ
ةعومجملا للخ Dialogs ضرؽلا ًف Application نم رثكأ ًهو 200 تادادعت لكش ىلع اهمٌدقت مت راوح قودنص . ءاعدتسا انردأ اذإف
ةمٌقلا رٌرمتب كلذ لمع اننكمٌ لاثملا لٌبس ىلع دٌدج دنتسم ءاشنإ راوح قودنص Word.WdWordDialog.wdDialogFileNew ةلادلل
Application.Dialogs.Item عونلا نم اعورشم مدختسا ةبرجتللو ًلاتلا دوكلا ًف امك Word 2007 Document
Dim dlg As Word.Dialog = _
Application.Dialogs.Item(Word.WdWordDialog.wdDialogFileNew)
dlg.Show()
ةقٌرطلا مدختسن راوحلا قودنص رصانع ىلإ لوصوللو InvokeMember ةرهاظلا ةقٌرطلاب ؾلم حتف راوح قودنصل ؾلملا مسا دٌدحتل
عونلا ىلع لصحن ثٌح ًلاتلا دوكلاب Type ةقٌرطلا مادختساب ةبولطملا ةٌصاخلا ةمٌق طبضن مث همدختسن يذلا راوحلا قودنصب صاخلا
InvokeMember
Dim dlg As Word.Dialog = Application.Dialogs(Word.WdWordDialog.wdDialogFileOpen)
Dim dlgType As Type = GetType(Word.Dialog)

' Set the Name property of the dialog box.
dlgType.InvokeMember("Name", _
Reflection.BindingFlags.SetProperty Or _
Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.Instance, _
Nothing, dlg, New Object() {"Testing"}, _
System.Globalization.CultureInfo.InvariantCulture)

dlg.Show()

ةمٌقلا رٌرمتب كلذو ابٌرقت ةقٌرطلا سفنب دروو تفوسوركٌامب صاخ راوح قودنصل ةٌصاخ يأ ةمٌق ىلع لوصحلا اننكمٌ امك
GetProperty ةقٌرطلل InvokeMember ةمٌقلا نع لدب SetProperty ًلاتلا لاثملا كلذ انٌرٌ امك
' Show the Name property.
MessageBox.Show(dlgType.InvokeMember("Name", _
Reflection.BindingFlags.GetProperty Or _
Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.Instance, _
Nothing, dlg, Nothing, _
System.Globalization.CultureInfo.InvariantCulture))

نودب قٌدانصلا هذه مادختساب دروو تفوسوركٌام عم افلس ةنمضملا راوحلا قٌدانص مادختساب ةدقعملا تاءارجلا ضعبب ماٌقلا اننكمٌو
ةقٌرطلا ءاعدتساب كلذو مدختسملل اهراهظإ Execute ةقٌرطلا ءاعدتسا نودب راوحلا قودنصل Display بلطتٌ يذلا ًلاتلا لاثملا ًف امك
طبضلا مادختسا Option Strict Off ةبفلا نمض رصانع تسٌل انه اهعم لماعتن ًتلا صباصخلا مٌق نأ ببسب Dialog مدختست ًهو اساسأ
دادعتلا مٌٌقتب مجرتملا موقٌ امدنع لٌؽشتلا نمز ًف اٌكٌمانٌد اهإاشنإ متٌ ثٌح رخؤتملا طبرلا wdDialogFilePageSetup ءاشنإ متٌ ثٌح
دادعتلا مدختسٌ انه انلاثمو راوحلا قودنص ىلع رهظتس ًتلا تامكحتلل ةقباطم نوكتل صباصخلا هذه wdDialogFilePageSetup طبضل
ضرؽلا دوكلا مدختسٌ ثٌح مدختسملا نم لاخدلا بلط نودب ةحفصلل صباصخ ةدع Dialog ةحفصلل صصخم مجح طبضل
Friend Sub PageSetupDialogHidden()
Dim dlg As Word.Dialog = _
Application.Dialogs.Item(Word.WdWordDialog.wdDialogFilePageSetup)

' Set the properties of the dialog box.
' ControlChars.Quote() is used to represent the symbol for inches.
With dlg
33

.PageWidth = 3.3 & ControlChars.Quote
.PageHeight = 6 & ControlChars.Quote
.TopMargin = 0.71 & ControlChars.Quote
.BottomMargin = 0.81 & ControlChars.Quote
.LeftMargin = 0.66 & ControlChars.Quote
.RightMargin = 0.66 & ControlChars.Quote
.HeaderDistance = 0.28 & ControlChars.Quote
.Orientation = Word.WdOrientation.wdOrientPortrait
.DifferentFirstPage = False
.FirstPage = 0
.OtherPages = 0

' Apply these settings only to the current selection
' with this line of code:
.ApplyPropsTo = 3

' Apply the settings.
.Execute()
End With
End Sub


34

شٌبضٌا ُغمٌا - Silverlight ٚ WPF ٚ XAML



ةٌلاتلا عٌضاوملا مضٌو :
 ةباتك كقٌبطت لولا نم عونلا WPF Application
 ؾٌك قبطن رهظم ؾلتخم ىلع تامكحتلا ًف قٌبطت WPF
 ؾٌك اننكمٌ نٌمضت ةروص ردصمك ًف قٌبطت wpf مث اهراهظإ تقو ذٌفنتلا
 ؾٌك اننكمٌ قٌبطت رهظم صصخم ةذفانل جمانرب WPF ًف نمز لٌؽشتلا
 مادختسا تامكحت Windows Forms نم لخاد قٌبطت WPF
 مادختسا رصانع WPF نم لخاد قٌبطت Windows Forms
 ةباتك انقٌبطت لولا ةٌنقتب Silverlight
 تاودأ مكحتلا بٌترتب رصانعلا Silverlight and WPF
 ءاشنإ ةعاس ةٌلثامت مادختساب ةٌنقت SilverLight مادختساب دوكلا
 تاقورفلا ًف ةجلاعم xaml نٌب Silverlight و WPF
 ؾٌك مدختسن رصانع Style مكحتلل رهظمب قٌبطتلا
 صٌصخت رهظم تامكحتلا Silverlight

35

عٌٕٛا ِٓ يٚلا هم١جطر خثبزو WPF Application

قٌبطت مٌمصت WPF قٌبطت مٌمصت نع ارٌثك ؾلتخٌ ل Windows Forms كلذ عمو مٌمصتلا حطس ىلع تامكحتلا ةفاضإ كنكمٌ ثٌح
دوك ضرعت ةٌفاضإ ةذفان دجتس ةفولؤملا مٌمصتلا ذفاونل ةفاضلابف تافلتخلا ضعب كانهف XAML ةهجاو ءاشنل ةؽللا هذه مدختست ثٌح
مدختسملا . ـلا نم تامكحتلا بحسب موقت ةٌدٌلقتلا ذفاونلا تاقٌبطت رٌوطتب موقت امدنعف ToolBox كلت ءاشنل دوك ةباتك كنكمٌ تبؼر نإ وأ
قٌبطت ءاشنإب موقت امدنع هباشم لكشبو كلجأ نم اٌلآ دوكلا ءاشنإ متٌ جذومنلا ىلإ مكحتلا بحسب موقت امدنعف تامكحتلا WPF ءاشنإ كنكمٌ
دوك ةباتكب مكحتلا XAML ةذفان ىلإ مكحتلا بحسب وأ WPF .
ةؽلو XAML تافلم ةباتك ةقٌرطل ةهباشم ةٌرجش ةٌنبب رصانع ىلإ ةمظنم XML كانهو نٌداح نٌسوق نمض نمضم رصنعلا نأ دجت ثٌح
رصنع كٌدل نوكٌ دق لثمف رصنع لكل قلؼإ دٌدحتو حتف دٌدحت Button لكشلاب رهظٌ نأ نكمٌ <Button></Button> نأ كنكمٌو
صباصخلا طبضب رصنعلا كلذ ودبٌس ؾٌك ؾصت attributes ـك Location وأ Height وأ Width ةٌحاتتفلا ساوقلا لخاد رهظت ًهو
ةملعب نٌلوصفم ةمٌقو مسا جوز لكشب رصنعلل = لثم صٌصنت ًتملع نمض ةروصحم ةمٌقلا نوكت ثٌح

<Button Height="23"></Button>

تامكحت بحسب موقت امدنعو WPF ـلا نم ToolBox دوك رٌوطتلا ةبٌب دلوت ممصملا ةذفان ىلإ XAML متٌ ًلاتلا دوكلاف مكحتلا كلذل اٌلآ
عونلا نم مكحت ةفاضإ ةٌلمع ةجٌتن هدٌلوت System.Windows.Controls.Button

<Button Height="23" HorizontalAlignment="Left" Margin="10,10,0,0"
Name="Button1" VerticalAlignment="Top" Width="75">Button</Button>

اقباس درو ام ىلع اقٌبطت براجتلا ضعبب مقن انعد :
 عونلا نم ادٌدج اقٌبطت اشنأ WPF Application همس و WPFWindow طؽضا مث OK قٌبطت ءاشنإ متٌف WPF كلجأ نم دٌدج
مسق ىرتسو XAML تاقٌبطت دٌدج WPF ًلاتلاك هتاٌوتحم ودبتسو

<Window x:Class="Window1"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>

</Grid>
</Window>

 ىلع رقنا Window1 ررحم ةذفان ًفو اهراٌتخل XAML ةٌصاخلا ةمٌق رٌؼ Title ىلإ WPF Application صن رٌؽت ظحلنف
ىلإ ةذفانلا ناونع WPF Application ىرخلا صباصخلا ضعب ةمٌق رٌٌؽت بٌرجت كنكمٌ امك
 بحسب مق TextBox ـلا نم ToolBox صباصخلا ةذفان ًفو هراٌتخل هٌلع رقنا مث قٌبطتلا ةذفانل اٌلعلا ةٌنٌمٌلا ةٌوازلا ًف هعضو
ةمٌق طبضا HorizontalAlignment ىلإ Left ةٌصاخلا طبضب مق مث VerticalAlignment ىلإ Top ةٌصاخلاو Width
ىلإ 75 ةٌصاخلاو Height ىلإ 26
 ررحم ًف XAML ةٌصاخلا رٌٌؽتب مق Width ىلإ 140 رصنعلاو Margin ىلإ 30, 56, 0, 0 لاثملا ًف ودبٌ امك

<TextBox Height="26" HorizontalAlignment="Left" Margin="30,56,0,0"
Name="TextBox1" VerticalAlignment="Top" Width="140" />

 مكحت بحسب مق Button ثدحلا ةجلاعم ءارجإ ءاشنل هٌلع جودزملا رقنلاب مقو قٌبطتلا ةذفان حطس ىلإ Click مث هب صاخلا
ءارجلا ًف ًلاتلا دوكلا بتكا

MsgBox("Event handler was created by double-clicking the button.")


 مكحت ؾضأ Button مساب ةٌصاخ ةفاضإب مق مث هراٌتخاب مقو ةذفانلل رخآ Click رصنعلل Button دوك ررحم ًف XAML
ىلإ اهتمٌق طبضاو ButtonOKClicked اشنت امدنع هنأ ةظحلم عم دوكلا ًف ثدحلا ةجلاعم ءارجل هٌطعت ؾوس مسلا اذهو
36

ةٌصاخلا ةفاضإ متٌ ل جودزملا رقنلاب ثدحلا ةجلاعم ءارجإ Click دوك ىلإ XAML ةرابع دوكلا ًف مدختسٌ نكلو Handles
كلذ نع اضوع
 رتخاو مٌمصتلا ةذفان ىلع ًنٌمٌلا ةرؤفلا رزب رقنا ViewCode ًلاتلا ءارجلا ةفاضإب مق مث

Sub ButtonOKClicked(ByVal Sender As Object, _
ByVal e As RoutedEventArgs)

MsgBox("Event handler was created manually.")

End Sub

 طؽضا F5 هرابتخاو عورشملا ذٌفنتل

َاذخزعبث ُعس ظِبٔشث ًّػ WPF
دسٚ بِ ضعب ٍٝع بميبطح ظيسب ُسس جِبٔشب ًّع بٕٕىّي ٖلعأ
• عٌٕٛا ِٓ اذيذج بعٚششِ ئشٔأ WPF Application ّٗسٚ Ink Pad
• ٌٝإ كيبطخٌا ةزفبٔ ُجح ظبضا 550 ٚ بعبفحسا 370 ضئبظخٌا ُيل ظبضب هٌرٚ بضشع Height ٚ Width يٌاٛخٌا ٍٝع
• ةزفبٔ ْإٛع شيغ WPF ٌٝإ Ink Pad تيطبخٌا ظبضب هٌرٚ Title
• تيطبخٌا شيغ Background ةزفبٌٕ WPF ٌٝإ Brown سشحِ يف تيطبخٌا تّيل ظبض بٕٕىّي بّو XAML تفبضإب
ا تيطبخٌ Background دٛو حبظيف ةزفبٌٕا دٛىٌ XAML يٍي بّو ةزفبٌٍٕ
دوك
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="550" Width="370" Background="Brown">
<Grid>

</Grid>
</Window>

• ثاٚدلا قٚذٕط حخفا ToolBox شخخاٚ يٕيّيٌا ةسأفٌا سضب ٗيٍع شمٔا ُث Choose Items تحفظٌ ًمخٔا ُث تّئبمٌا ِٓ
WPF Components ساٛح قٚذٕط يف Choose ToolBox Items ٌٝإ تّئبمٌا شبع ًمخٔاٚ InkCanvas ب٘سبيخخبب ُلٚ –
عبشٌّا يف تِلع عضٚ ِٓ ذوأح – ظغضا ُث OK
• بحسا InkCanvas ثاٚدلا قٚذٕط ِٓ ToolBox تيٌبخٌا ُيمٌا ظبضاٚ ةزفبٌٕا حطس ٌٝإ :
o تيطبخٌا Width تيطبخٌا ٚ Height ٌٝإ Auto
o تيطبخٌا HorizontalAlignment تيطبخٌا ٚ Vertical Alignment ٌٝإ Stretch
o تيطبخٌا Margins ٌٝإ 9,9,9,68
o تيطبخٌا Background ٌٝإ LightYellow جِبٔشبٌا ًغشح بِذٕع شفطأ حبطأ تيفٍخٌا ٌْٛ ْأ ٜشخسٚ
• ًفسأ ةزفبٌٕا حطس ٌٝإ ثاٚدلا قٚذٕط ِٓ ٓيسص بحسا Ink Canvas عضٚ Button1 ٚ سبسيٌا ٌٝإ Button2
ٓيّيٌا ٌٝإ
37

• شخخا Button1 دٛو ظبضاٚ XAML ٌٝإ ٗب صبخٌا
دوك
<Button Height="23" HorizontalAlignment="Left" Margin="85,0,0,24"
Name="Button1" VerticalAlignment="Bottom" Width="75">Clear</Button>

• شخخا Button2 دٛو ظبضاٚ XAML ٌٝإ ٗب صبخٌا

<Button Height="23" HorizontalAlignment="Right" Margin="0,0,72,24"
Name="Button2" VerticalAlignment="Bottom" Width="75">Close</Button>

• دٛو حبظي ازٙبٚ XAML ةزفبٌٕ WPF يٍي بّو
دوك
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="550" Width="370" Background="Brown">
<Grid>
<InkCanvas Height="Auto" Margin="9,9,9,68" Name="InkCanvas1"
VerticalAlignment="Stretch" Width="Auto" HorizontalAlignment="Stretch"
Background="LightYellow" />

<Button Height="23" HorizontalAlignment="Left" Margin="85,0,0,24"
Name="Button1" VerticalAlignment="Bottom" Width="75">Clear</Button>

<Button Height="23" HorizontalAlignment="Right" Margin="0,0,72,24"
Name="Button2" VerticalAlignment="Bottom" Width="75">Close</Button>

</Grid>
</Window>
• سضٌا ٍٝع بجٚدضِ اشمٔ شمٔا Clear دذحٌا تجٌبعِ ءاشجإ يف يٌبخٌا دٛىٌا فضأ ُث Click سضٌٍ
دوك
Me.InkCanvas1.Strokes.Clear()

• دذحٌا تجٌبعِ ءاشجإ يف يٌبخٌا دٛىٌا فضأ تميشطٌا سفٕبٚ Click سضٌٍ Close

Me.Close

• ٖشبخخاٚ جِبٔشبٌا ًغش
38

ك١جطر ٟف دبّىحزٌا ٍٝػ فٍزخِ شٙظِ كجطٔ ف١و WPF

 قٌبطت اشنأ WPF دوكلا ؾضأ مث دٌدج Background="Azure" ـب أدبٌ يذلا رطسلا ةٌاهن ًف Title سوقلا لبقو > رٌٌؽتل
كلذب ماٌقلا ةٌفٌك نع ةركف ًطعنل اذه انلاقم ًف رارزلا رهظم رٌٌؽتب موقنسو حتافلا قرزلا ىلإ جذومنلا ةٌفلخ نول
 لدبتسا < Grid > ـب < StackPanel > و < Grid / > ـب < StackPanel / > ررحم ًف Xaml ـب صاخلا Window1
 دعب ًلاتلا دوكلا ؾضأ <StackPanel> ةفاضإب موقن ًكل ةرشابم ComboBox ةذفانلل
<ComboBox Width="100px" Height="Auto">
<ComboBoxItem>Item One</ComboBoxItem>
<ComboBoxItem>Item Tow</ComboBoxItem>
<ComboBoxItem>Item Three</ComboBoxItem>
</ComboBox>

 ؾٌضن ًك ةرشابم قباسلا دوكلا دعب ًلاتلا دوكلا ؾضأ StackPanel زكرملا وحن نوكٌس ؾافطصلا نأ دٌدحت عم ةذفانلل رخآ
ًقفأ هاجتلاو
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
</StackPanel>
 ـلا لخاد StackPanel رارزأ ةثلث ةفاضإب موقٌ يذلا ًلاتلا دوكلا ؾضأ ارخإم هانفضأ يذلا Add و Edit و Delete جذومنلل
<Button>Add</Button>
<Button>Edit</Button>
<Button>Delete</Button>

 دوك نوكٌ نأ بجٌ ةطقنلا هذه ىتح xaml لكشلا ىلع كٌدل ةذفانلاب صاخلا
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Background="Azure">
<StackPanel>
<ComboBox Width="100px" Height="Auto">
<ComboBoxItem>Item One</ComboBoxItem>
<ComboBoxItem>Item Tow</ComboBoxItem>
<ComboBoxItem>Item Three</ComboBoxItem>
</ComboBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button>Add</Button>
<Button>Edit</Button>
<Button>Delete</Button>
</StackPanel>
</StackPanel>
</Window>

 رزلاب صاخلا دوكلا لدبتسا رارزلا رهظم رٌؽتس ًتلا صباصخلا ضعب قٌبطتب نلا موقنس Delete ًلاتلا دوكلاب
<Button Margin="10,5,2,5">
<Button.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.25" Color="#FFFF1122"></GradientStop>
<GradientStop Offset="0.85" Color="#FFFFFFFF"></GradientStop>
</LinearGradientBrush>
</Button.Background>
Delete</Button>

39

 ةٌصاخلا انمدختسا ثٌح Margin ةاشرفلا انمدختسا مث رزلاب ةصاخلا شماوهلا دٌدحتل LinearGradientBrush نولب رزلا المل
ةٌصاخلا تددح ثٌح جردتم StartPoint و الملا ءدب ةطقن EndPoint مسق ددحو ةٌاهنلا ةطقن GradientStop ًناثلاو لولا
رزلا رهظم رٌؽت ةصاخلا هذه قٌبطت دعب ظحلن ثٌح نول لكب ةصاخلا ةحازلاو جردتلاب نٌصاخلا نٌنوللا Delete نول ىلإ
ضٌبلل رمحلا نم جردتم
 مسق ؾٌضن جذومنلا ًف رارزلا عٌمجل دحاو رهظم قٌبطت اندرأ نإو < Window.Resources > دوك ةذفان ىلعأ ًف xaml
مسق حتفن ثٌح جذومنلا ددحت ًتلا ةٌولعلا رطسلا دعبو Style وه رهظملا اذه نم ؾدهتسملا عونلا نأ ددحنو هلخادب Button
<Window.Resources>
<Style TargetType="Button">

</Style>
</Window.Resources>

 مسق لخادبو Style وه رخآ مسق حتفن Setter ًه ةفدهتسملا ةٌصاخلا نا هٌف ددحنو Background ًلٌ امك
<Setter Property="Background">

</Setter>
 رزلا عم اقباس انلعف امك رهظملا ددحن مث Delete مادختساب كلذو LinearGradientBrush حبصٌف امامت ةقباسلا ةقٌرطلا سفنبو
مسق دوك setter ًلٌ امك
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.3" Color="#FFFFFF55"/>
<GradientStop Offset="0.8" Color="#AA5555FF"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>

 مسق دعب ةرشابمو setter مسق ؾٌضنس وتلل هانفضأ يذلا Setter نوكٌسو رارزلاب ةصاخلا شماوهلا دٌدحت وه هنم ضرؽلا رخآ
ًلٌ امك هب صاخلا دوكلا
<Setter Property="Margin" Value="2,5,2,5"></Setter>
 دوك حبصٌ كلذبو xaml ًلٌ امك ةطقنلا هذه ىتح ةذفانلل لماكلا
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Background="Azure">

<Window.Resources>
<Style TargetType="Button">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.3" Color="#FFFFFF55"/>
<GradientStop Offset="0.8" Color="#AA5555FF"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="2,5,2,5"></Setter>
</Style>
</Window.Resources>

<StackPanel>
<ComboBox Width="100px" Height="Auto">
40

<ComboBoxItem>Item One</ComboBoxItem>
<ComboBoxItem>Item Tow</ComboBoxItem>
<ComboBoxItem>Item Three</ComboBoxItem>
</ComboBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button>Add</Button>
<Button>Edit</Button>
<Button Margin="10,5,2,5">
<Button.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.25" Color="#FFFF1122"></GradientStop>
<GradientStop Offset="0.85" Color="#FFFFFFFF"></GradientStop>
</LinearGradientBrush>
</Button.Background>
Delete
</Button>
</StackPanel>
</StackPanel>
</Window>

 نٌرزلا ىلع هقٌبطت مت دق جذومنلا ًف رارزلا عٌمجل ماع رهظمك هدٌدحتب انمق يذلا رهظملا نأ ظحلن ثٌح Add و Edit متٌ ملو
رزلا ىلع هقٌبطت Delete نٌرزلا نأ ببسب كلذو Add و Delete يذلا ماعلا رهظملا ناذخؤٌف امهب صاخ رهظم دٌدحتب مقن مل
رزلاب صاخ رهظم دٌدحتب انمق اننأ امبو جذومنلا ًف رارزلا عٌمجل ةٌادبلا ًف هدٌدحتب انمق Delete ذخؤٌ اذل ةرشابم هب قصتلم
هل برقلا رهظملا
 نكٌلو ادٌدج ارز ؾضأ Search رزلا لبقو جذومنلا رارزأ ةعومجم نمض add هل صصخم رهظم ةفاضإب نلا موقنسو ةرشابم
دٌدحت ًهو ىرخأ ةقٌرطب Key ةٌصاخلا مادختساب هٌلع هقٌبطتب بؼرن يذلا رزلا عم هطبرن ثٌح رهظملا اذه زٌمٌ Style كلذل
مسق دوك ةفاضإب مق كلذ لمعلو رزلا style مسق دعب ًلاتلا Style لبقو ةرشابم قباسلا < /Window.Resources >
<Style TargetType="Button" x:Key="MySearch">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.3" Color="#FF11FF11"/>
<GradientStop Offset="0.8" Color="#CCFFBB11"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="2,5,10,5"></Setter>
</Style>

 ةٌصاخلا ةفاضإ ظحلن ثٌح x:Key مسق ؾٌرعت ةٌادب ًف Style ثٌح ةٌصاخلا هذه عم رز يأ طبر اهللخ نم اننكمٌ ًتلاو
رزلا دوك لٌدعتب موقنس Search ًلٌ امك حبصٌل دٌدجلا رهظملا عم طبترٌل
<Button Style="{StaticResource MySearch}">Search</Button>
جمانرب ًف تامكحتلا رهظم رٌٌؽت ةٌفٌك نع ةٌبدبم ةركف انٌطؼ دق نوكن اذهبو WPF دوكل لماك درس ًلٌ امٌفو اٌجمرب Xaml اذهب صاخلا
انه اهحرط مت ًتلا راكفلا ةفاك نمضتم عوضوملا
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" Background="Azure">

<Window.Resources>
<Style TargetType="Button">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.3" Color="#FFFFFF55"/>
<GradientStop Offset="0.8" Color="#AA5555FF"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
41

<Setter Property="Margin" Value="2,5,2,5"></Setter>
</Style>
<Style TargetType="Button" x:Key="MySearch">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.3" Color="#FF11FF11"/>
<GradientStop Offset="0.8" Color="#CCFFBB11"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="2,5,10,5"></Setter>
</Style>
</Window.Resources>

<StackPanel>
<ComboBox Width="100px" Height="Auto">
<ComboBoxItem>Item One</ComboBoxItem>
<ComboBoxItem>Item Tow</ComboBoxItem>
<ComboBoxItem>Item Three</ComboBoxItem>
</ComboBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Style="{StaticResource MySearch}">Search</Button>
<Button>Add</Button>
<Button>Edit</Button>
<Button Margin="10,5,2,5">
<Button.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.25" Color="#FFFF1122"></GradientStop>
<GradientStop Offset="0.85" Color="#FFFFFFFF"></GradientStop>
</LinearGradientBrush>
</Button.Background>
Delete
</Button>
</StackPanel>
</StackPanel>
</Window>


42

ك١جطر ٟف سذظّو حسٛط ٓ١ّؼر بٕٕىّ٠ ف١و wpf ذلٚ ب٘سبٙظئ ُص ؟ز١فٕزٌا

 عونلا نم ادٌدج اعورشم اشنأ WPF Application
حتفا اهدٌرت ًتلا ةروصلا هٌلؼ خسناو عورشملا دلجم
ًف Solution Explorer ب رقنا ةرؤفلا رز رتخا مث كعورشم مسا ىلع ًنٌمٌلا Add مث existing Item عورشملا تافلمل
نم دكؤت ةٌصاخ نأ Build Action ىلع ةعوضوم Resource
مكحت ؾضأ image رزو Button ةذفانل عورشملا
ثدحلا ةجلاعمل ءارجإ ءاشنل رزلا ىلع اجودزم ارقن رقنا Click مث رزلل ةروصلا ؾلم مسا نأ ضارتفاب كلذو ًلاتلا دوكلا لخدأ
seatbelt.bmp
Me.Image1.Source = New BitmapImage(New
Uri("pack://application:,,,/seatbelt.bmp"))

 لؽش هربتخاو عورشملا
ةبفلا انمدختسا ثٌح URI ردصملا ىلع لوصحلل Resource دٌعت ًتلاو ضرؽل لٌثمت Object دحوم رداصم ددحمل uniform
Resource Identifier لوصولا لٌهستو ماسقل URI


43

ظِبٔشث حزفبٌٕ ضظخِ شٙظِ ك١جطر بٕٕىّ٠ ف١و WPF ً١غشزٌا ِٓص ٟف

قٌبطت اشنأ WPF دٌدج
دعب ًلاتلا دوكلا لاخدإب كلذو لولا مجح ؾعضب ًناثلا نوكٌ ثٌحب ةذفانلاب ةصاخلا ةكبشلا لخاد نٌدومع ءاشنإب ةٌادبلاب موقنس <Grid>
ررحم ًف كلذو ةرشابم XAML عورشملا ةذفانب صاخلا
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>

قباسلا دوكلا دعب ًلاتلا دوكلا لاخدإب كلذو اٌكٌمانٌد امهمجح دٌدحت جمانربلل كرتنس نكلو نٌرطس ىلإ ةكبشلا مسقب موقنس امك
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>

مكحت ةفاضإب أدبنسو جذومنلل تامكحتلا ضعب نلا ؾٌضنس Label هتاٌوتحم نوكت ثٌحب Street Address نٌمٌلل ًقفلا بناجتلا و
صنلا يوتحٌ صوصن قودنص ؾٌضنس امك طسولل ًلوقاشلاو Enter Street Address طسولل ًلوقاشلاو راسٌلل ًقفلا بناجتلا نوكٌسو
قباسلا دوكلا دعب ةرشابم ًلاتلا دوكلا لاخدإب كلذو
<Label Content="Street Address" HorizontalAlignment="Right" VerticalAlignment="Center"></Label>
<TextBox Text="Enter a street address" HorizontalAlignment="Left"
VerticalAlignment="Center"></TextBox>

نكٌلو صوصنلا قودنصل امسا نلا ددحنس txtAddress ةٌصاخلا ةمٌق دٌدحتب كلذو x:Name ًف هناكم ددحنس امك ةبولطملا ةمٌقلا ىلإ
نٌتٌصاخلا ةمٌق دٌدحتب اضٌأ ةكبشلا Grid.Column و Grid.Row لٌدعتلا دعب ًلاتلا لكشلا ىلع صوصنلا قودنصب صاخلا دوكلا حبصٌف
<TextBox Grid.Column="1" Grid.Row="0" x:Name="txtAddress" Text="Enter a street address"
HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>

ـلا ناكم دٌدحتب موقنس امك Label مادختساب ةكبشلا ًف Grid.Column و Grid.row موقنس اننأ ىلإ ةفاضإ ةقباسلا ةقٌرطلا سفنب كلذو
ـلا طبرب Lable ةٌصاخلا مادختساب صوصنلا قودنصب Target ـل Label ـب صاخلا دوكلا حبصٌف Label ًلاتلا لكشلا ىلع
<Label Grid.Column="0" Grid.Row="0" Target="{Binding ElementName=txtAddress,
Mode=OneWay}"
Content="Street Address" HorizontalAlignment="Right"
VerticalAlignment="Center"></Label>

ًلاتلا دوكلا مادختساب رماوأ رز ةفاضإب موقنس نلا
<Button Grid.Column="1" Grid.Row="1" Content="Save Street Address"
HorizontalAlignment="Left" VerticalAlignment="Top" />

ؾرحملا ؾضأ _ صن ةٌادب ًف Contenet ـب صاخلا Label ةٌصاخلا كلت ةمٌق حبصتل
Content="_Street Address"
ةٌصاخلا مادختسا اننكمٌ ىتح كلذو Target راصتخلا مادختساب صوصنلا قودنصل ةرشابم لاقتنلل Alt-S ؾرحملا انعضو اننأ امب _ لبق
ؾرحلا S
دوك حبصأ دق نوكٌو هربتخاو جمانربلا لؽش xaml ًلٌ امك ةذفانلاب صاخلا
<Window x:Class="Window1"
44

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test WPF Skinning" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Target="{Binding ElementName=txtAddress, Mode=OneWay}"
Content="_Street Address" HorizontalAlignment="Right"
VerticalAlignment="Center"></Label>
<TextBox Grid.Column="1" Grid.Row="0" x:Name="txtAddress" Text="Enter a street address"
HorizontalAlignment="Left" VerticalAlignment="Center"></TextBox>
<Button Grid.Column="1" Grid.Row="1" Content="Save Street Address"
HorizontalAlignment="Left" VerticalAlignment="Top" />
</Grid>
</Window>

ىلإ لقتنا Solution Explorer ؾلملا حتفب مقو Application.xaml رهظملا دٌدحتب أدبنسو انه انتاودؤب صاخلا رهظملا دٌدحتب موقن ًك
ـب صاخلا Label مسق جاردإب كلذو Style دعب ًلاتلا <Application.Resources> مجحو ًماملا نوللا ةمٌق دٌدحتب موقنس ثٌح ةرشابم
طخلا
<Style TargetType="{x:Type Label}" x:Key="LabelStyle">
<Setter Property="Foreground" Value="Blue"></Setter>
<Setter Property="FontSize" Value="12px"></Setter>
</Style>

كلذو نٌمكحتلا رهظم ىلع ًلاحلا تقولا ًف ابٌش ارٌؽٌ نل ثٌحب رماولا رزو صوصنلا قودنص لكل نٌؼراف نٌرهظم دٌدحتب نلا موقنسو
قباسلا دوكلا دعب ةرشابم ًلاتلا دوكلا لاخدإب
<Style TargetType="{x:Type TextBox}" x:Key="TextBoxStyle"></Style>
<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"></Style>

ـب صاخلا دوكلا حبصٌ اذهبو Application.xaml ًلاتلاك نلا ىتح
<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<Style TargetType="{x:Type Label}" x:Key="LabelStyle">
<Setter Property="Foreground" Value="Blue"></Setter>
<Setter Property="FontSize" Value="12px"></Setter>
</Style>
<Style TargetType="{x:Type TextBox}" x:Key="TextBoxStyle"></Style>
<Style TargetType="{x:Type Button}" x:Key="ButtonStyle"></Style>
</Application.Resources>
</Application>

دوكل دوعن تامكحتلا عم ةدٌدجلا رهاظملا هذه طبرلو xaml ةٌصاخلا ؾٌضنو ةذفانلاب صاخلا Style ـلا نم لكل Label قودنص و
لكشلا ىلع ةثلثلا تامكحتلاب صاخلا دوكلا حبصٌف رماولا رز و صوصنلا
<Label Grid.Column="0" Grid.Row="0" Target="{Binding ElementName=txtAddress, Mode=OneWay}"
Content="_Street Address" HorizontalAlignment="Right" VerticalAlignment="Center"
Style="{DynamicResource LabelStyle}"></Label>
<TextBox Grid.Column="1" Grid.Row="0" x:Name="txtAddress" Text="Enter a street address"
HorizontalAlignment="Left" VerticalAlignment="Center"
Style="{DynamicResource TextBoxStyle}"></TextBox>
<Button Grid.Column="1" Grid.Row="1" Content="Save Street Address"
HorizontalAlignment="Left" VerticalAlignment="Top" Style="{DynamicResource ButtonStyle}"/>

45

انمدختسا اننأ انه ظحلنو DynamicResource ةٌصاخلا ًف Style متٌ نأ نكمٌ ةٌصاخلا هذه نأ ددحن ثٌح دارملا لكشلا عم طبرل
انمدختسا ول امنٌب ادوجوم نوكٌ ل دقو ادوجوم نوكٌ دق بولطملا رهظملا نأو اٌكٌمانٌد لٌؽشتلا نمز ًف اهرٌٌؽت StaticResource ًف
هرٌٌؽت متٌ نل هنأو رهظملا كلذ دوجو عقوتن اننأ جمانربلا ربخنس ةطقنلا هذه
هربتخاو جمانربلا لؽش
ةٌصاخلا ؾضأ Click لكشلا ىلع نوكت ثٌحب رزلا ىلع رقنلا ثدح ةجلاعمل ءارجإ ةفاضل كلذو رزلا ؾٌرعتل
Click="Button_Click"
لكشلا ىلع ةٌاهنلا ًف رزلا ؾٌرعت حبصٌو
<Button Grid.Column="1" Grid.Row="1" Content="Save Street Address" Click="Button_Click"
HorizontalAlignment="Left" VerticalAlignment="Top" Style="{DynamicResource ButtonStyle}"/>

ؾلملاب صاخلا دوكلا ررحمل لقتنا مث Window1.xaml.vb ـل ادارٌتسا ؾضأو رزلا ىلع رقنلا ثدح ةجلاعم ءارجإ ؾضأو System.IO
ـل و System.Windows.Markup ًلاتلا دوكلا ًف رهظٌ امك رزلا ىلع رقنلا ثدحل اؼراف اءارجإ اشنأو ؾلملا ةٌادب ًف
Imports System.IO
Imports System.Windows.Markup

Class Window1
Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

End Sub
End Class

رتخا Add New Item ةمباقلا نم Project عونلا نم افلم ؾضأ مث WPF Resource Dictionary هتٌمستب مقو عورشملل
CrazyStyle.xaml ةٌصاخلا لٌدعتب مقو Copy to output directory ىلإ هب ةصاخلا Copy if newer ةٌصاخلا ةمٌق اضٌأو Build
Action ىلإ Content ؾلمك همدختسنس ثٌح Skin ةٌصاخلا مدختسنس اننأ ثٌحب ةذفانلل Dynamic Resources ًف WPF امك لمعتل
مدختسن اننأ ول Skin دوك تاٌوتحم لٌدعتب مقو عورشملل xaml ةصاخلا لاكشلا ىلع يوتحٌس ثٌح ًلاتلا دوكلا ًف امك حبصٌل هب صاخلا
لٌلق ذنم اهانمدختسا ًتلا ةقٌرطلا سفنبو عورشملا ةذفان تامكحتب
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Style TargetType="{x:Type Label}" x:Key="LabelStyle">
<Setter Property="Foreground" Value="Red" />
<Setter Property="FontSize" Value="16px" />
</Style>
<Style TargetType="{x:Type TextBox}" x:Key="TextBoxStyle">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset=".1" Color="AliceBlue" />
<GradientStop Offset=".5" Color="AntiqueWhite" />
<GradientStop Offset="1" Color="Aquamarine" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
<Setter Property="Foreground" Value="Blue" />
<Setter Property="FontSize" Value="16px" />
</Style>

</ResourceDictionary>
46


ثدحلا ةجلاعم ءارجإ ىلإ دع نلا Click رٌؽتملا ؾٌرعتب موقٌ يذلا ًلاتلا دوكلا ًف امك حبصٌل هلٌدعتب مقو اقباس هانؤشنأ يذلا رزلل rd
عونلا نم نوكٌل ResourceDictionary مدختسٌ مث FileStream ؾلملا حتفل CrazyStyle.xaml مدختسن مث ةءارقلل
XamlReader.Load ةلادلا نٌمدختسم ؾلملا تاٌوتحم ةءارقل CType ىلإ ءورقملا جتانلا عون لٌوحتل ResourceDictionary موقن مث
رٌؽتملا ًف ةمٌقلا كلت عضوب Rd ًلاحلا ردصملا نوكٌل هطبضنس يذلا Current Resource ىلإ هتمٌق دانسإب كلذو قٌبطتلل
Application.Current.Resources
Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim rd As ResourceDictionary = Nothing
Using fs As New FileStream("CrazyStyle.xaml", FileMode.Open,
FileAccess.Read)
rd = CType(XamlReader.Load(fs), ResourceDictionary)
End Using
Application.Current.Resources = rd
End Sub
هربتخاو قٌبطتلا لؽش

47

دبّىحر َاذخزعا Windows Forms ك١جطر ًخاد ِٓ WPF

تامكحت مادختسا نكمٌ Windows Forms قٌبطت لخاد نم WPF ةبفلا مادختسا للخ نم WindowsFormsHost Class
نمض اهفٌرعت نوكٌ ًتلاو Visual Basic ًلاتلاك
<ContentPropertyAttribute("Child")> _
Public Class WindowsFormsHost _
Inherits HwndHost _
Implements IKeyboardInputSink
اهمادختساو
Dim instance As WindowsFormsHost
ءامسلا لاجم نمض ةدوجوم ًهو System.Windows.Forms.Integration عمجملا ًفو WindowsFormsIntegration ًفو
ةبتكملا WindowsFormsIntegration.dll رصنعلا مادختسا ةٌفٌك ًلاتلا لاثملا انل نٌبٌ ثٌح WindowsFormsHost ةفاضتسل
تامكحت Windows Forms
<Window x:Class="HostingWfInWpf.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="HostingWfInWpf"
>
<Grid>
<WindowsFormsHost>
<wf:MaskedTextBox x:Name="mtbDate" Mask="00/00/0000"/>
</WindowsFormsHost>
</Grid>
</Window>

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="HostingWfInWpf">
<Grid>
<WindowsFormsHost>
<wf:MaskedTextBox x:Name="mtbDate" Mask="00/00/0000"/>
48

</WindowsFormsHost>
</Grid>
</Window>

مكحت ةفاضتسلو Windows forms قٌبطت نمض نم WPF مكحت دٌدحت كٌلع بجٌ Windows Forms ةٌصاخلا ىلإ Child كلذو
ةٌصاخلا مادختساب PropertyMap رصنعلا نٌب طبرلا دٌدحتل WindowsFormsHost مكحت و Windows Forms هنمض ؾاضتسملا
عونلا نم اقٌبطت اشنأ WPF Application همس و HostingWfInWpf ًفو Solution Explorer عمجملل اعجرم ؾضأ
WindowsFormsIntegration ىمسملاو WindowsFormsIntegration.dll حتفب مق مث Window1.xaml دوك لدبتساو xaml
ًلاتلا دوكلاب اٌباقلت دلوملا
<Window x:Class="HostingWfInWpf.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="HostingWfInWpf"
Loaded="WindowLoaded"
>
<Grid Name="grid1">

</Grid>
</Window>


<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="HostingWfInWpf" Height="300" Width="300"
Loaded="WindowLoaded"
>
<Grid Name="grid1">

</Grid>
</Window>

ؾلملا حتفا Window1.xaml.vb ًلاتلا دوكلاب دوجوملا دوكلا عٌمج لادبتساب مقو دوكلا ررحم ًف
Imports System
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Documents
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Windows.Shapes

Imports System.Windows.Forms

' Interaction logic for Window1.xaml
Partial Public Class Window1
Inherits Window

Public Sub New()
InitializeComponent()
End Sub

Private Sub WindowLoaded(ByVal sender As Object, ByVal e As
RoutedEventArgs)
' Create the interop host control.
49

Dim host As New System.Windows.Forms.Integration.WindowsFormsHost()

' Create the MaskedTextBox control.
Dim mtbDate As New MaskedTextBox("00/00/0000")

' Assign the MaskedTextBox control as the host control's child.
host.Child = mtbDate

' Add the interop host control to the Grid
' control's collection of child controls.
Me.grid1.Children.Add(host)

End Sub 'WindowLoaded

End Class

طؽضا F5 عورشملا رابتخل

50


شطبٕػ َاذخزعا WPF ك١جطر ًخاد ِٓ Windows Forms

رصانع مادختسا نكمٌ WPF قٌبطت لخاد نم Windows Forms ةبفلا مادختسا للخ نم ElementHost Class نوكٌ ًتلاو
نمض اهفٌرعت Visual Basic ًلاتلاك
<ContentPropertyAttribute("Child")> _
Public Class ElementHost
Inherits Control

اهمادختساو

Dim instance As ElementHost

ءامسلا لاجم نمض ةدوجوم ًهو Namespace ىمسملا System.Windows.Forms.Integration عمجملا ًفو
WindowsFormsIntegration ةبتكملا ًفو windowsformsintegration.dll ءامسأ لاجم مسا نوكٌو XML اهب صاخلا XML
Namespace وه http://schemas.microsoft.com/winfx/2006/xaml/presentation مادختسا ةٌفٌك ًلاتلا لاثملا انل نٌبٌو
مكحتلا ElementHost رصنع ةفاضتسل WPF
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
' Create the ElementHost control for hosting the
' WPF UserControl.
Dim host As New ElementHost()
host.Dock = DockStyle.Fill

' Create the WPF UserControl.
Dim uc As New HostingWpfUserControlInWf.UserControl1()

' Assign the WPF UserControl to the ElementHost control's
' Child property.
host.Child = uc

' Add the ElementHost control to the form's
' collection of child controls.
Me.Controls.Add(host)
End Sub

رصنع ةفاضتسلو WPF نمض Windows Form رصنع دٌدحت كٌلع بجٌ WPF ةٌصاخلا ىلإ Child مادختساب كلذو
ةٌصاخلا PropertyMap مكحتلا نٌب طبرلا دٌدحتل ElementHost رصنعو WPF مكحت ةفاضتسا اننكمٌ امك هنمض ؾاضتسملا
Windows Forms قٌبطت نمض WPF رصنعلا مادختساب WindowsFormsHost

عونلا نم دٌدج عورشم ءاشنإب مق WPF User Control Library همسو HostingWpfUserControlInWf ؾلملا حتفب مق مث
UserControl1.xaml ًف WPF Designer ًلاتلا دوكلاب دوجوملا دوكلا لماك لدبتساو
51

<UserControl x:Class="HostingWpfUserControlInWf.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>

<Grid>

<!-- Place a Label control at the top of the view. -->
<Label
HorizontalAlignment="Center"
TextBlock.TextAlignment="Center"
FontSize="20"
Foreground="Red"
Content="Model: Cone"/>

<!-- Viewport3D is the rendering surface. -->
<Viewport3D Name="myViewport" >

<!-- Add a camera. -->
<Viewport3D.Camera>
<PerspectiveCamera
FarPlaneDistance="20"
LookDirection="0,0,1"
UpDirection="0,1,0"
NearPlaneDistance="1"
Position="0,0,-3"
FieldOfView="45" />
</Viewport3D.Camera>

<!-- Add models. -->
<Viewport3D.Children>

<ModelVisual3D>
<ModelVisual3D.Content>

<Model3DGroup >
<Model3DGroup.Children>

<!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the
ModelVisual3D. -->
<DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" />

<!-- Define a red cone. -->
<GeometryModel3D>

<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="0.293893 -0.5 0.404509 0.475528 -0.5 0.154509 0 0.5 0 0.475528 -0.5
0.154509 0 0.5 0 0 0.5 0 0.475528 -0.5 0.154509 0.475528 -0.5 -0.154509 0 0.5 0
0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0 0.475528 -0.5 -0.154509 0.293893 -0.5 -0.404509
0 0.5 0 0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0 0.293893 -0.5 -0.404509 0 -0.5 -0.5 0
0.5 0 0 -0.5 -0.5 0 0.5 0 0 0.5 0 0 -0.5 -0.5 -0.293893 -0.5 -0.404509 0 0.5 0 -
0.293893 -0.5 -0.404509 0 0.5 0 0 0.5 0 -0.293893 -0.5 -0.404509 -0.475528 -0.5 -
0.154509 0 0.5 0 -0.475528 -0.5 -0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5 -0.154509 -
0.475528 -0.5 0.154509 0 0.5 0 -0.475528 -0.5 0.154509 0 0.5 0 0 0.5 0 -0.475528 -0.5
0.154509 -0.293892 -0.5 0.404509 0 0.5 0 -0.293892 -0.5 0.404509 0 0.5 0 0 0.5 0 -
0.293892 -0.5 0.404509 0 -0.5 0.5 0 0.5 0 0 -0.5 0.5 0 0.5 0 0 0.5 0 0 -0.5 0.5
0.293893 -0.5 0.404509 0 0.5 0 0.293893 -0.5 0.404509 0 0.5 0 0 0.5 0 "
Normals="0.7236065,0.4472139,0.5257313 0.2763934,0.4472138,0.8506507
0.5308242,0.4294462,0.7306172 0.2763934,0.4472138,0.8506507 0,0.4294458,0.9030925
0.5308242,0.4294462,0.7306172 0.2763934,0.4472138,0.8506507 -0.2763934,0.4472138,0.8506507
0,0.4294458,0.9030925 -0.2763934,0.4472138,0.8506507 -0.5308242,0.4294462,0.7306172
0,0.4294458,0.9030925 -0.2763934,0.4472138,0.8506507 -0.7236065,0.4472139,0.5257313 -
0.5308242,0.4294462,0.7306172 -0.7236065,0.4472139,0.5257313 -0.858892,0.429446,0.279071
-0.5308242,0.4294462,0.7306172 -0.7236065,0.4472139,0.5257313 -0.8944269,0.4472139,0 -
0.858892,0.429446,0.279071 -0.8944269,0.4472139,0 -0.858892,0.429446,-0.279071 -
0.858892,0.429446,0.279071 -0.8944269,0.4472139,0 -0.7236065,0.4472139,-0.5257313 -
0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -0.5308242,0.4294462,-
0.7306172 -0.858892,0.429446,-0.279071 -0.7236065,0.4472139,-0.5257313 -
0.2763934,0.4472138,-0.8506507 -0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-
0.8506507 0,0.4294458,-0.9030925 -0.5308242,0.4294462,-0.7306172 -0.2763934,0.4472138,-
0.8506507 0.2763934,0.4472138,-0.8506507 0,0.4294458,-0.9030925 0.2763934,0.4472138,-
0.8506507 0.5308249,0.4294459,-0.7306169 0,0.4294458,-0.9030925 0.2763934,0.4472138,-
0.8506507 0.7236068,0.4472141,-0.5257306 0.5308249,0.4294459,-0.7306169
0.7236068,0.4472141,-0.5257306 0.8588922,0.4294461,-0.27907 0.5308249,0.4294459,-0.7306169
0.7236068,0.4472141,-0.5257306 0.8944269,0.4472139,0 0.8588922,0.4294461,-0.27907
0.8944269,0.4472139,0 0.858892,0.429446,0.279071 0.8588922,0.4294461,-0.27907
0.8944269,0.4472139,0 0.7236065,0.4472139,0.5257313 0.858892,0.429446,0.279071
0.7236065,0.4472139,0.5257313 0.5308242,0.4294462,0.7306172 0.858892,0.429446,0.279071 "
52

TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
59 " />
</GeometryModel3D.Geometry>

<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush
Color="Red"
Opacity="1.0"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>

</GeometryModel3D>

</Model3DGroup.Children>
</Model3DGroup>

</ModelVisual3D.Content>

</ModelVisual3D>

</Viewport3D.Children>

</Viewport3D>
</Grid>

</UserControl>


 عورشم ؾضأ Windows Forms ـلل Solution همسو ًلاحلا WpfUserControlHost ًفو Solution Explorer ؾضأ
عمجملل اعجرم WindowsFormsIntegration ىمسملاو WindowsFormsIntegration.dll اعجرم ةفاضإب مق مث
Reference تاعمجمل WPF ةٌلاتلا PresentationCore و PresentationFramework و WindowsBase ؾضأ مث
ـل اعجرم HostingWpfUserControlInWf عورشملا طبضب مق مث عورشملا نمض WpfUserControlHost نوكٌل
Startup Project
 حتفا Form1 ًف Windows Forms Designer ىلع اجودزم ارقن رقنا مث form1 دوكلا لادبتساب مق مث دوكلا ررحم حتفل
ًلاتلا دوكلاب دوجوملا
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms

Imports System.Windows.Forms.Integration

Public Class Form1
Inherits Form

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

' Create the ElementHost control for hosting the
' WPF UserControl.
Dim host As New ElementHost()
host.Dock = DockStyle.Fill

' Create the WPF UserControl.
Dim uc As New HostingWpfUserControlInWf.UserControl1()

' Assign the WPF UserControl to the ElementHost control's
' Child property.
53

host.Child = uc

' Add the ElementHost control to the form's
' collection of child controls.
Me.Controls.Add(host)
End Sub

End Class

طؽضا F5 عورشملا رابتخل


انعد موقن لمعب لاثم اعم ةوطخ ةوطخ
اشنأ اعورشم ادٌدج نم عونلا Windows Forms Application همسو TestHostElement
رقنا رزب ةرؤفلا ًنٌمٌلا ىلع ـلا ToolBox رتخاو Choose Items نم ةمباقلا نمو ةحفص . net Framework Components رتخا
Element Host متٌل اهتفاضإ ـل ToolBox كٌدل مث بحسا مكحتلا ElementHost نم ـلا ToolBox هعضو ىلع ةذفانلا كٌدل مث ددح
ةمٌقلا Fill ةٌصاخلل Dock
ًف ـلا Solution Explorer رقنا رزب ةرؤفلا ًنٌمٌلا ىلع عورشملا رتخاو Add New Item نمو ةحفص WPF رتخا User Control
WPF مث ًف ررحم Xaml صاخلا ـلاب User Control ؾضأ دوكلا ًلاتلا ىتح موقن ةفاضإب مكحت Border مكحتلل كلذو دعب رطسلا
< Grid > ةرشابم ثٌح ددحت ةٌصاخلا Margin شماوهلا ةصاخلا مكحتلاب و BorderThikness ةكامس دودحلا
<Border Margin="1,0,0,78" Name="Border1" BorderThickness="0">

</Border>

موقنس صٌصختب لكش ةٌفلخلا مكحتلل Border كلذو مسرب ةٌفلخلا ةصاخلا هب مادختساب LinearGradientBrush امك ًف دوكلا ًلاتلا يذلا
هفٌضنس لخاد دوكلا قباسلا
<Border.Background>
<LinearGradientBrush StartPoint="0,0.1" EndPoint="0.3,1">
<GradientStop Offset="0.1" Color="Aquamarine"></GradientStop>
<GradientStop Offset="0.3" Color="Plum"></GradientStop>
<GradientStop Offset="0.6" Color="Gold"></GradientStop>
<GradientStop Offset="0.9" Color="Chocolate"></GradientStop>
<GradientStop Offset="1" Color="GreenYellow"></GradientStop>
</LinearGradientBrush>
</Border.Background>

لخدأ دوكلا ًلاتلا دعب دوكلا قباسلا لبقو /< Border > ةرشابم كلذو ةفاضل مكحت InkCanvas
<InkCanvas Margin="5,5,5,5" Name="InkCanvas1" Height="Auto" Width="Auto"
Background="AliceBlue"/>

ًك ؾٌضن رز حسمل تاٌوتحم InkCanvas ؾضأ دوكلا ًلاتلا دعب /< Border > ثٌح انمدختسا LinearGradientBrush مسرل ـلا
Foreground و ـلا Background نٌصاخلا رزلاب
<Button Height="25" Margin="100,0,100,25" Name="btnClear"
VerticalAlignment="Bottom" Content="Clear InkCanvas">
54

<Button.Foreground>
<LinearGradientBrush StartPoint="0.3,0.1" EndPoint="0.7,1">
<GradientStop Offset="0.1" Color="Red"></GradientStop>
<GradientStop Offset="0.9" Color="Blue" ></GradientStop>
</LinearGradientBrush>
</Button.Foreground>
<Button.Background>
<LinearGradientBrush StartPoint="0.3,0.1" EndPoint="0.7,1">
<GradientStop Offset="0.1" Color="#99FFFF"></GradientStop>
<GradientStop Offset="0.4" Color="#FF99FF"></GradientStop>
<GradientStop Offset="0.9" Color="#FFFF99" ></GradientStop>
</LinearGradientBrush>
</Button.Background>
</Button>

نم ةذفان ررحم ـلا UserControl رقنا ارقن اجودزم ىلع رزلا Clear InkCanvas ءاشنل ءارجإ ةجلاعم ثدحل رقنلا ىلع كلذ رزلا ثٌح
لقتننس انه ةرشابم ىلإ ررحم دوكلا – لخدأ رطس دوكلا ًلاتلا يذلا موقٌس حسمب تاٌوتحم ـلا InkCanvas ًف ءارجلا غرافلا
Me.InkCanvas1.Strokes.Clear

اذهبو نوكن دق انٌهتنا نم مٌمصت ـلا UserControl مق لمعب Build عورشملل
– لقتنا نلا ىلإ ررحم مٌمصت ةذفانلا Form1 رتخاو مكحتلا ElementHost رقناو ىلع مهسلا رٌؽصلا يذلا رهظٌ ىلعأ نٌمٌ مكحتلا
حتفل ةذفان صباصخلا ةعٌرسلا حتفاو ةمباقلا ةلدسنملا بناجب Select Hosted Content رتخاو مكحت WPF يذلا هانؤشنأ وتلل
UserControl1
لؽش جمانربلا هربتخاو

55

خ١ٕمزث يٚلا بٕم١جطر خثبزو Silverlight

عون نم نم ادٌدج اقٌبطت اشنأ Silverlight Application همسو HelloSilverlight رتخا مث Dynamically Generate an HTML
test page to host silverlight within this project
خٙعاٌٛا ُ١ّظر
حتفا Solution Explorer تافلملا ظحلو app.xaml و هلمكؤب قٌبطتلاب صاخلا دوكلاو رداصملا ىلع يوتحٌ يذلا page.xaml لثمٌ
ؾلم دجتس اهبناجب ةدقعلا تعسو اذإو بٌو عقوم ًف ةدوجوملا كلتل ةهٌبش ةحفص page.xaml.vb وأ page.xaml.cs ةجمربلا ةؽل بسحب
ـلا كتلل هباشت ًهو كب صاخلا رادملا دوكلا ىلع يوتحت ًهو اهمدختست ًتلا Model ـب ةصاخلا ASP .net
ةكبشلا رهظم دٌدحتل – ىلع اجودزم ارقن رقنا ةحوتفم ةحفصلا نكت مل نإ page.xaml ررحمل لقتنا مث اهحتفل xaml رصنع ددحو Grid
ـلا ؾٌرعتل ةٌادبلا مسق ًفو Grid رٌؼ Background ةٌصاخلا ددح كلذكو هبؼرت نول يأ ىلإ ShowGridLines ىلإ true ببستت ًتلا
ًلٌ امك مسقلا رهظٌل لكشلا مٌمصتب موقت امدنع كدٌفٌ يذلا رملا ةكبشلا ماسقأ حضوت ةطقنم طوطخ راهظإب
<Grid x:Name="LayoutRoot" Background="LightGreen" ShowGridLines="True" >
ةٌصاخلا نلا مدختسنس RowDefinition ةدمعلاو رطسلا دٌدحتل ةكبشلل
لخاد grid ـل ةٌاهنلاو ةٌادبلا ًمسق نٌب و Grid ؾٌرعت ودبٌ ثٌحب ًلاتلا دوكلا لخدأ Grid ًلٌ امك
<Grid x:Name="LayoutRoot" Background="LightGreen" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="220"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="325"/>
</Grid.ColumnDefinitions>

</Grid>

قٌبطتلل تامكحتلا ضعب ةفاضإب نلا موقن انعد
صوصن ةلتك بحسب مق TextBlock دوك ررحم لخاد ىلإ رٌوطتلا ةبٌب ًف تاودلا قودنص نم xaml دعب كلذو
/< Grid.ColumnDefinitions > ةٌصاخلا هل ؾضأو ةرشابم Text ةمٌقلاب Name: دوكلا ًف امك
<TextBlock Text="Name:"></TextBlock>
دوكلا ًف امك ةقٌرطلا سفنب نٌٌرخأ صوصن ًتلتك اشنأ مث
<TextBlock Text="Date:"></TextBlock>
<TextBlock Text="Message"></TextBlock>

طبضب انٌلع اهروهظ ناكم طبضلو ةكبشلا ًف ىلولا ةٌلخلا ًف ةبكارتم تحبصأ ةثلثلا صوصنلا قٌدانص نأ ضرعلا ةذفان ًف ىرتس
نٌتٌصاخلا Grid.Column ز Grid.row اهنكامأ ًف صوصنلا لتك روهظ تلٌدعتلا هذه دعب ظحلتس ثٌح دوكلا ًف امك هنم لكل
ةكبشلا نمض ةحٌحصلا
<TextBlock Text="Name:" Grid.Row="0" Grid.Column="0"> </TextBlock>
<TextBlock Text="Date:" Grid.Row="1" Grid.Column="0"></TextBlock>
<TextBlock Text="Message" Grid.Row="2" Grid.Column="0"
Grid.ColumnSpan="2" ></TextBlock>

56

صوصن قودنص بحسا textbox صوصنلا ةلتك دعب ةرشابم هتلفأو تاودلا قودنص نم Message دوكلا ًف امك هصباصخ طبضاو
<TextBox Text="Your Name" Grid.Row="0" Grid.Column="1"
Width="150" HorizontalAlignment="Left" ></TextBox>

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

<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical" >


</StackPanel>

لخاد StackPanel مكحت لخدأ Calendar ةٌقب نع ام اعون ؾلتخم هب صاخلا ةٌادبلا مسق نأ ظحلنس مٌوقتلا مكحت ؾٌضن امدنعو
ـب أدبٌ ثٌح تامكحتلا basics تامكحت نم امسق سٌل هنل ىرخأ ةبداب وأ Silverlight بجٌ اذل رخآ عمجم نمض ؾرعم وهو ةٌساسلا
ءامسأ لاجم ةفاضإ كٌلع xml دوك لخاد ىلإ مكحتلا بحسب موقن امدنعف عمجملل عجرمو xaml ةبسانملا عجارملا ةفاضإب رٌوطتلا ةبٌب موقت
دوكلا ًف امك مٌوقتلا صباصخ طبضب مق نلا انلجا نم اٌباقلت
<basics:Calendar SelectionMode="SingleDate"
HorizontalAlignment="Left"></basics:Calendar>

رز مكحت بحسا button دوكلا ًف امك هصباصخ طبضاو مٌوقتلا مكحت لفسأ
<Button Width="75" Height="25" HorizontalAlignment="Left"
Content="OK"></Button>

دوك ودبٌ نأ بجٌو ةهجاولا مٌمصت نم انٌهتنا دق نوكن اذهبو xaml ةطقنلا هذه دنع عورشملا ظفحب موقت نأ سنت ل دوكلا ًف امك كٌدل
<UserControl xmlns:basics="clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls"
x:Class="HelloSilverlight.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="LightGreen" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="220"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="325"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Name:" Grid.Row="0" Grid.Column="0"> </TextBlock>
<TextBlock Text="Date:" Grid.Row="1" Grid.Column="0"></TextBlock>
<TextBlock Text="Message" Grid.Row="2" Grid.Column="0"
Grid.ColumnSpan="2" ></TextBlock>
<TextBox Text="Your Name" Grid.Row="0" Grid.Column="1"
Width="150" HorizontalAlignment="Left" ></TextBox>
<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical" >
<basics:Calendar SelectionMode="SingleDate"
HorizontalAlignment="Left"></basics:Calendar>
<Button Width="75" Height="25" HorizontalAlignment="Left"
Content="OK"></Button>
57

</StackPanel>
</Grid>

</UserControl>


دٛىٌا خفبػئ
ررحم ًف xaml صوصنلا ةلتك ىلإ لقتنا Message ةٌصاخلا ؾضأ هل ةٌادبلا مسق ًفو x:name ةمٌقلاب Message1 ةٌصاخلا هذهو
ًلٌ امك ؾٌرعتلا حبصٌف دٌرف لكشب رصنعلا ؾٌرعتب موقت
<TextBlock Text="Message" Grid.Row="2" Grid.Column="0"
x:Name="Message1"></TextBlock>

ـل ةبسنلاب ةٌلمعلا ررك TextBox و Calendare و Button ةٌصاخلا ةفاضإب x:name ًلٌ امك اهل
x:Name="name1"
x:Name="cal1"
x:Name="okButton"
رزلل ةٌادبلا مسق ًف okButton بتكا click طؽضا مث tab ةٌصاخ قودنص كل رهظٌف Intellisense ىلع اجودزم ارقن رقنا New
Event handler ثدحلا ىلع ًنٌمٌلا سواملاب رقنا نلا دوكلا ؾلم ًف عضوٌو ًضارتفلا مسلاب ثدح ةجلاعم ءارجإ ءاشنإ متٌف click مث
رتخا navigate to Event Handler دوكلا ررحمل كلقن متٌ ثٌح
دوكلا ًف امك ودبٌ ثدحلا ةجلاعم ءارجإ لعجا
Private Sub okButton_Click(ByVal sender As System.Object, _
ByVal e As System.Windows.RoutedEventArgs)

Dim dateString As String
If cal1.SelectedDate Is Nothing Then
dateString = "<date not selected>"
Else
dateString = cal1.SelectedDate.ToString()
End If
message1.Text = "Hi " & name1.Text & vbCrLf & _
"Selected Date: " & dateString
End Sub
هربتخاو عورشملا لؽش

خ١ى١ِبٕ٠د خٙعاٌٛا ًؼع

ررحم ًف xaml ؾٌرعتل ةٌادبلا مسق نمضو UserControl نٌتٌصاخلا ؾذحا Width و height ؾٌرعت ًفو Grid.RowDefinitions
مٌق رٌؼ Height ًلٌ امك
<RowDefinition Height="Auto"/>
<RowDefinition Height="*" MinHeight="240"/>
58

<RowDefinition Height="Auto"/>

ةٌصاخ رٌؼو Width ـل Grid.ColumnDefinitions ًلٌ امك
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
ةٌصاخلا ؾضأ Margin صوصنلا لتك تامكحت نم لكل Name و Date و Message ًلٌ امك
Margin="10,5,10,5"
تامكحتللو TextBox و Calendar و Button ًلٌ امك
Margin="0,5,0,5"
ةٌصاخلا ؾضأو FontSize صوصنلا ةلتكل Message ًلٌ امك
FontSize="20"
دوك كٌدل نوكٌ نأ بجٌو هربتخاو عورشملا ظفحا xaml ًلٌ امك لماكلا
<UserControl xmlns:basics="clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls"
x:Class="HelloSilverlight.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid x:Name="LayoutRoot" Background="LightGreen" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*" MinHeight="240"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Name:" Grid.Row="0" Grid.Column="0"
Margin="10,5,10,5"> </TextBlock>
<TextBlock Text="Date:" Grid.Row="1" Grid.Column="0"
Margin="10,5,10,5"></TextBlock>
<TextBlock Text="Message" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"
x:Name="Message1" Margin="10,5,10,5" FontSize="20"></TextBlock>
<TextBox Text="Your Name" Grid.Row="0" Grid.Column="1" Margin="0,5,0,5"
Width="150" HorizontalAlignment="Left" x:Name="name1"></TextBox>
<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical" >
<basics:Calendar SelectionMode="SingleDate" Margin="0,5,0,5"
HorizontalAlignment="Left" x:Name="Cal1"></basics:Calendar>
<Button Width="75" Height="25" HorizontalAlignment="Left"
Content="OK" x:Name="okButton" Click="okButton_Click"
Margin="0,5,0,5"></Button>
</StackPanel>
</Grid>

</UserControl>



59

شطبٕؼٌا ت١رشزث ُىحزٌا داٚدأ Silverlight and WPF

انل رفوت Silverlight و wpf ةهجاو ىلع ةلوهسب رصانعلا عقوم دٌدحت نم نوممصملاو نوروطملا نكمٌ رصانعلا بٌترتل نرم ماظن
امدنع تامكحتلا عضومو مجح ددحٌ يذلا ًكٌمانٌدلا عضومتلا معدٌ امك تاددحملا ةطساوب عضومتلاو تباثلا عضومتلا معدٌ ثٌحب مدختسملا
ًه صوصخلا اذه ًف اندٌفت تاودأ ثلث انٌدل انهو ضرعتسملا مجح رٌؽتٌ Canvas و StackPanel و Grid

Canvas Panel
ـلا ربتعٌ Canvas Panel ـلا Layout Panel موقن نحنو ةحٌرص تاددحم مادختساب هٌف ةاوتحملا تامكحتلا عضومت معدٌ يذلا ًساسلا
مكحتلل ةبسنلاب اهعقوم دٌدحت نم كنكمت ًتلا ةطبترملا صباصخلا مادختساب هٌف تامكحتلا عضوم دٌدحتب Canvas هذهو اهل رشابملا بلا
لثم ةطبترملا صباصخلا دٌدحتبف هلخادب يذلا مكحتلل ةطبضملا صباصخلا عٌسوت نم بلا حوللا نكمت اهنل ةدٌفم ةطبترملا صباصخلا
Top و Left طابترا دٌدحتل ةٌناكمإ ؾٌضٌ نٌتٌساسلا Top و Left هذه ةفاضل ةجاحلا نودب ةهجاولا نمض رخآ رصنع يأ وأ رزلل
ـل نٌرز ةفاضإ اننكمٌف لكش يؤب رزلا ةبف لٌدعت وأ رزلا ةبفل ةٌصاخلا Canvas ةفاسمب امهعضوم طبضو 50 و راسٌلا نم لسكب 50 و
150 مادختساب ىلعلا نم لسكب xaml دوكلا ًف امك
<Canvas Background="Aquamarine" >
<Button Content="Button 1" Width="100" Height="50"
Canvas.Left="50" Canvas.Top="50"></Button>

<Button Content="Button 2" Width="100" Height="50"
Canvas.Left="50" Canvas.Top="150"></Button>

</Canvas>

ـلا نوكٌ امنٌبو Canvas ةهجاولل تامكحت ؾٌضن امدنع ةنورملا كلتب هدجت نل كنكلو ةهجاولا رصانع اهٌف كرحتٌ نل ًتلا تلاحلا ًف ادٌفم
مٌجحتلا ةداعإ وأ لقنلا دوك ةباتك كٌلع بجوتٌس تلاحلا هذه ًفف ةهجاولا تامكحت ضعب ناكم وأ مجح رٌٌؽت ىلإ اهٌف جاتحت عاضوأ جلاعتو
ـلا لخادب ءاٌشلا كٌرحتل كسفنب Canvas لثم ةهجاولل ؾلتخم بٌترت رصنع مادختساب وه ةلكشملا هذهل لضفلا لحلا نمكٌو StackPanel
وأ Grid
StackPanel
ءزج بٌترتل ةداع مدختسٌ وهو ًسأر وأ ًقفأ لكشب امإ هلخادب ًتلا تامكحتلا عضومت معدٌ ةهجاولا بٌترتل طٌسب مكحت نع ةرابع وه
دوكلا ًف امك ًلوقاش لكشب رارزأ ةثلث بٌترتل همدختسن ًلاتلا لاثملا ًفف كتهجاو نم رٌؽص
<StackPanel Background="Bisque" >
<Button Content="Button 1" Width="100" Height="50" Margin="10"/>
<Button Content="Button 2" Width="100" Height="50" Margin="10"/>
<Button Content="Button 3" Width="100" Height="50" Margin="10"/>
</StackPanel>

ةٌصاخلا طبض اننكمٌ وأ Orientation ىلإ هل Horizontal دوكلا ًف امك ًقفأ لكشب بٌترتلا طبضل
<StackPanel Background="Bisque" Orientation="Horizontal" >
<Button Content="Button 1" Width="100" Height="50" Margin="10"/>
<Button Content="Button 2" Width="100" Height="50" Margin="10"/>
<Button Content="Button 3" Width="100" Height="50" Margin="10"/>
</StackPanel>
Grid Panel
انهو ةدمعأ ةدعو رطسأ ةدعب تامكحتلا بٌترت معدٌ هنا امب ةهجاولا بٌترتب ةصاخلا تامكحت ثلثلا نٌب ةنورم رثكلا وه مكحتلا اذه ربتعٌ
نٌتٌصاخلا مادختساب ةدمعلاو رطسلا دٌدحت طقف كٌلع Grid.RowDefinitions و Grid.ColumnDefinitions امهفٌرعت متٌ ناتللا
60

مكحتلا تحت ةرشابم <Grid> ةطبترملا صباصخلا مادختسا كنكمٌو Attached Property ـلا نمض ةاوتحملا تامكحتلل Grid نٌأ دٌدحتل
ؾٌرعت اننكمٌ لثمف دومع وأ رطس يأ ًف مكحتلا عقٌ Grid دوكلا ًف امك اهلخادب رارزأ عبرأ عضوو ةدمعأ ةثلث و رطسا ةثلثب
<Grid Background="BlueViolet"
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="60"/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="110"/>
</Grid.ColumnDefinitions>
<Button Content="Button 1" Width="100" Height="50"
Grid.Column="1" Grid.Row="0">
</Button>
<Button Content="Button 2" Width="100" Height="50"
Grid.Column="0" Grid.Row="1">
</Button>
<Button Content="Button 3" Width="100" Height="50"
Grid.Column="3" Grid.Row="1">
</Button>
<Button Content="Button 4" Width="100" Height="50"
Grid.Column="1" Grid.Row="2">
</Button>
</Grid>

ـلا معد ىلإ ةفاضإ Grid مجحلاب ًللا مكحتلا اضٌأ معدت ًهف قباسلا انلاثم ًف امك ةتباث ةمٌق لكشب مجحلا دٌدحت Height=”Auto” امك
متٌ نأ معدت امك اهٌف ةدجاوتملا ةحفصلا مجحو اهتاٌوتحم ىلع ءانب ةدمعلاو رطسلا مجح ددحٌ ثٌحب ىصقأ مجحو ىندأ مجح دٌدحت معدت
مدختست امك هٌف ةنورملا نم رٌثكلا دجتس مكحتلا اذهل رركتملا كمادختسا عمو اهضعبل ةبسن ةدمعلاو رطسلا ساٌق عضو * مٌسقتلا لعجل
لثم ةنٌعم بسنب 2* وأ 3* لاثملا ًف امك
<Grid Background="BlueViolet">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Button Content="Button 1" Width="100" Height="50"
Grid.Column="1" Grid.Row="0">
</Button>
<Button Content="Button 2" Width="100" Height="50"
Grid.Column="0" Grid.Row="1">
</Button>
<Button Content="Button 3" Width="100" Height="50"
Grid.Column="3" Grid.Row="1">
</Button>
<Button Content="Button 4" Width="100" Height="50"
Grid.Column="1" Grid.Row="2">
</Button>
</Grid>


61

خ١ٕمر َاذخزعبث خ١ٍصبّر خػبع ءبشٔئ SilverLight دٛىٌا َاذخزعبث ؾمف

ىلإ جاتحنس لمعلا عٌطتسن ًكل Mic rosoft Silver Light Tools For Visual Studio 2008 طبارلا نم هلٌمحت نكمٌ يذلاو
http://go.microsoft.com/fwlink/?LinkId=94863
ةمباق نمو وٌدوتس لوجٌف حتفا File رتخا New Project ةجمربلا ةؽل رتخا مث Visual Basic رتخا مث Silverlight اشنأ مث
SilverLight Application هتٌمستب مقو دٌدج SilverLightClock نلا رتخا انل رهظٌ يذلا راوحلا قودنص نمو Automatically
Generate a test page to host silverlight at build time طؽضا مث ok
مسق ًف دوكلا لعجا xaml انمدختسا ثٌح ةعاسلا لظ لكشت ةٌدامر ةرباد مسرب موقنل كلذو ًلاتلا دوكلل لثامم Ellips اهبلمو ةرباد مسرل
نٌعم نولب
<UserControl x:Class="SilverlightClock.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480">

<Grid x:Name="LayoutRoot">

<!-- Shadow Ellipse -->
<Ellipse Margin="165,67,145,83" Fill="#FF000000" Width="330"
Height="330" Opacity="0.3"/>
</Grid>
</UserControl>

مسق ًف ًلاتلا دوكلا ؾضأ xaml لبقو </Grid> س١ح حػاسٌٍ ٟظساخٌا ساطلا ُسس ًظأ ِٓ هٌرٚ جششاثِ
إِذخرسا LinearGradientBrush ساطلٌ ٌٍٟٔٛا ضسذرٌا ُسس ًظأ ِٓ
<!-- Outer Rim -->
<Ellipse Height="330" Margin="156,58,154,92" Width="330" Stroke="#FF000000">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.84,0.87" StartPoint="0.164,0.129">
<GradientStop Color="#FFE4E5F4"/>
<GradientStop Color="#FFC0C0C0" Offset="0.254"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
مسق ًف قباسلا دوكلا دعب ًلاتلا دوكلا ؾضأ xaml ةقباسلا ةقٌرطلا سفنب مسرلا ةٌلمع تمت ثٌح ةعاسلا راطإ ؾاوح مسر لجأ نم كلذو
<!-- Bevel -->
<Ellipse Height="290" Margin="156,58,154,92" Width="290" Stroke="#FF000000">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.84,0.87" StartPoint="0.164,0.129">
<GradientStop Color="#FF2F2F32"/>
<GradientStop Color="#FFE4E5F4" Offset="0.987"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
مدختسنس Ellipse ةعاسلا هجو مسر لجأ نم ىرخأ ةرم – مسق ًف قباسلا دوكلا دعب ًلاتلا دوكلا لخدأ xaml
<!-- Clock Face -->
<Ellipse Height="270" Margin="176,78,174,112" Width="270"
Stroke="#FF000000" Fill="#FF000000"/>

مسق ًف ًلاتلا دوكلا لخدأ xaml ؾصتنملا ةربادو براقعلا مسر ةٌلمع لجأ نم مسرلا تاودأ نم اضعب مدختسنس ثٌح قباسلا دوكلا دعب
ةعاسلاب ةصاخلا
62

<!-- Central Clock Circle -->
<Ellipse Margin="306,208,304,0" VerticalAlignment="Top" Fill="#FF000000"
Stroke="#FF008000" StrokeThickness="8" Height="30"/>

<!-- Second Hand -->
<Rectangle Height="80" Margin="318.25,117.75,316.75,0" VerticalAlignment="Top"
Fill="#FFFF0000" Stroke="#FF000000" Width="5"
RenderTransformOrigin="0.5,1.312" >
<Rectangle.RenderTransform>
<RotateTransform x:Name="secondHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>

<!-- Minute Hand -->
<Rectangle x:Name="minuteHand" Height="80" Margin="316.75,117.75,315.25,0"
VerticalAlignment="Top" Fill="#FF008000" Stroke="#FF008000" Width="8"
RenderTransformOrigin="0.5,1.312" >
<Rectangle.RenderTransform>
<RotateTransform x:Name="minuteHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>

<!-- Hour Hand -->
<Rectangle x:Name="hourHand" Height="59" Margin="315.75,138.75,314.25,0"
VerticalAlignment="Top" Fill="#FF008000" Stroke="#FF008000"
Width="10"
RenderTransformOrigin="0.525,1.428">
<Rectangle.RenderTransform>
<RotateTransform x:Name="hourHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>
ةعاسلا ةكرح نلا ؾٌضنس
مسق ًف xaml ؾٌرعت دعب UserControl لبقو < Grid x:Name="LayoutRoot >" ةكرحلا نٌوكتب موقٌس يذلا ًلاتلا دوكلا لخدأ
ةعاسلل ةرهاظلا
<UserControl.Resources>
<Storyboard x:Name="clockStoryboard">

<!-- This animation targets the hour hand transform -->
<DoubleAnimation x:Name="hourAnimation"
Storyboard.TargetName="hourHandTransform"
Storyboard.TargetProperty="Angle"
Duration="12:0:0" RepeatBehavior="Forever" To="360" />

<!-- This animation targets the minute hand transform -->
<DoubleAnimation x:Name="minuteAnimation"
Storyboard.TargetName="minuteHandTransform"
Storyboard.TargetProperty="Angle"
Duration="1:0:0" RepeatBehavior="Forever" To="360" />

<!-- This animation targets the second hand transform -->
<DoubleAnimation x:Name="secondAnimation"
Storyboard.TargetName="secondHandTransform"
Storyboard.TargetProperty="Angle"
Duration="0:1:0" RepeatBehavior="Forever" To="360" />
</Storyboard>
</UserControl.Resources>
دذح٠ دٛىٌاف StoryBoard ءذثٌٚ حػاسٌا حوشح شٙظرس ٟرٌا حوشحرٌّا َٛسشٌا ٍٝػ ٞٛرح٠
زذحٌا َذخرسٕس ٖز١فٕذ Loaded حٌاذٌا ءاػذرسل Begin ـٌ StoryBoard زذحٌا از٘ ف١ضٕسٚ
ف٠شؼرٌ grid ٍٟ٠ اّو حثظ٠ س١حت
63

<Grid x:Name="LayoutRoot" Loaded="SetAndStartClock">

دٛو ْٛى٠ هٌزتٚ xaml ًِاىٌا
<UserControl x:Class="SilverLightClock.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480">

<UserControl.Resources>
<Storyboard x:Name="clockStoryboard">

<!-- This animation targets the hour hand transform -->
<DoubleAnimation x:Name="hourAnimation"
Storyboard.TargetName="hourHandTransform"
Storyboard.TargetProperty="Angle"
Duration="12:0:0" RepeatBehavior="Forever" To="360" />

<!-- This animation targets the minute hand transform -->
<DoubleAnimation x:Name="minuteAnimation"
Storyboard.TargetName="minuteHandTransform"
Storyboard.TargetProperty="Angle"
Duration="1:0:0" RepeatBehavior="Forever" To="360" />

<!-- This animation targets the second hand transform -->
<DoubleAnimation x:Name="secondAnimation"
Storyboard.TargetName="secondHandTransform"
Storyboard.TargetProperty="Angle"
Duration="0:1:0" RepeatBehavior="Forever" To="360" />
</Storyboard>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Loaded="SetAndStartClock">

<!-- Shadow Ellipse -->
<Ellipse Margin="165,67,145,83" Fill="#FF000000" Width="330"
Height="330" Opacity="0.3"/>

<!-- Outer Rim -->
<Ellipse Height="330" Margin="156,58,154,92" Width="330" Stroke="#FF000000">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.84,0.87" StartPoint="0.164,0.129">
<GradientStop Color="#FFE4E5F4"/>
<GradientStop Color="#FFC0C0C0" Offset="0.254"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>

<!-- Bevel -->
<Ellipse Height="290" Margin="156,58,154,92" Width="290" Stroke="#FF000000">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.84,0.87" StartPoint="0.164,0.129">
<GradientStop Color="#FF2F2F32"/>
<GradientStop Color="#FFE4E5F4" Offset="0.987"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>


<!-- Clock Face -->
<Ellipse Height="270" Margin="176,78,174,112" Width="270"
Stroke="#FF000000" Fill="#FF000000"/>


<!-- Central Clock Circle -->
<Ellipse Margin="306,208,304,0" VerticalAlignment="Top" Fill="#FF000000"
Stroke="#FF008000" StrokeThickness="8" Height="30"/>

64

<!-- Second Hand -->
<Rectangle Height="80" Margin="318.25,117.75,316.75,0" VerticalAlignment="Top"
Fill="#FFFF0000" Stroke="#FF000000" Width="5"
RenderTransformOrigin="0.5,1.312" >
<Rectangle.RenderTransform>
<RotateTransform x:Name="secondHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>

<!-- Minute Hand -->
<Rectangle x:Name="minuteHand" Height="80" Margin="316.75,117.75,315.25,0"
VerticalAlignment="Top" Fill="#FF008000" Stroke="#FF008000" Width="8"
RenderTransformOrigin="0.5,1.312" >
<Rectangle.RenderTransform>
<RotateTransform x:Name="minuteHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>

<!-- Hour Hand -->
<Rectangle x:Name="hourHand" Height="59" Margin="315.75,138.75,314.25,0"
VerticalAlignment="Top" Fill="#FF008000" Stroke="#FF008000" Width="10"
RenderTransformOrigin="0.525,1.428">
<Rectangle.RenderTransform>
<RotateTransform x:Name="hourHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>

</Grid>
</UserControl>


ِٓ Solution Exploere جذمػ غسٚ Page.xaml فٌٍّا حرفا ُش Page.xaml.vb ٗ١ف ًخدأٚ
ه٠شحرٌا ح١ٍّػ ءذت ًظأ ِٓ ٌٟارٌا دٛىٌا

Private Sub SetAndStartClock(ByVal sender As Object, ByVal e As EventArgs)

' Start the storyboard.
clockStoryboard.Begin()
End Sub
ْلا ح١حظٌا دلٌٛا شٙظذل اٙٔأ لإ بٍٛطٌّا ًىشٌات ًّؼذ دحثطأ حػاسٌا ْأ غِٚ ْ٢ا
ٌٟارٌا دٛىٌات كتاسٌا دٛىٌا يذثرسا
Private Sub SetAndStartClock(ByVal sender As Object, ByVal e As EventArgs)

' The current date and time.
Dim currentDate As Date = DateTime.Now

' Find the appropriate angle (in degrees) for the hour hand
' based on the current time.
Dim hourangle As Double = (((CType(currentDate.Hour, Single) / 12) * 360) + _
(currentDate.Minute / 2))

' The same as for the minute angle.
Dim minangle As Double = ((CType(currentDate.Minute, Single) / 60) * 360)

' The same for the second angle.
Dim secangle As Double = ((CType(currentDate.Second, Single) / 60) * 360)

' Set the beginning of the animation (From property) to the angle
' corresponging to the current time.
hourAnimation.From = hourangle

' Set the end of the animation (To property)to the angle
' corresponding to the current time PLUS 360 degrees. Thus, the
' animation will end after the clock hand moves around the clock
' once. Note: The RepeatBehavior property of the animation is set
65

' to "Forever" so the animation will begin again as soon as it completes.
hourAnimation.To = (hourangle + 360)

' Same as with the hour animation.
minuteAnimation.From = minangle
minuteAnimation.To = (minangle + 360)

' Same as with the hour animation.
secondAnimation.From = secangle
secondAnimation.To = (secangle + 360)

' Start the storyboard.
clockStoryboard.Begin()

End Sub
ًّػاٚ عٚششٌّا ظفحا Build ح١حط ًىشت ْ٢ا حػاسٌا ًّؼذ ْأ ةع٠ ٗتشظ ُش




66

خغٌبؼِ ٟف دبلٚشفٌا xaml ٓ١ث Silverlight ٚ WPF

مدختسٌ Silverlight برعمل اددحم افٌرعت xaml ـل ةدباعلا نوبزلا تابتكم نم ءزج وه برعملا اذه نأ امبو Silverlight ؾلتخٌ دق اذهل
نٌبو اهنٌب بارعلا ؾرصت WPF دوك رٌجهتب موقت امدنع ةدٌفم انه ةروكذملا تاقورفلا نوكت دقو اددحم افٌرعت اضٌأ كلتمٌ يذلاو xaml
لجأ نم لصأ بوتكم WPF ىلإ Silverlight
خغٌبؼِ ٟف دبلٚشفٌا xaml ٓ١ث WPF ٚ Silverlight
ءبّعلا دلبغِ
 تٌلرفلٌس معدٌ http://schemas.microsoft.com/client/2007 ىلإ ةفاضإ
http://schemas.microsoft.com/client/2006/xaml/presentation نوبزلا ءامسلا لاجمك
 مٌق ىلع ةٌلاتلا دوٌقلا تٌلرفلٌس عضٌ xaml
o ؾٌرعت ىلع يوتحٌ نأ امود بجٌ يرذجلا رصنعلا xaml ًضارتفلا
o نوكٌ نأ بجٌ ًضارتفا ؾٌرعت يأ http://schemas.microsoft.com/client/2007 وأ
http://schemas.microsoft.com/client/2006/xaml/presentation ءامسأ لاجم وأ XPS
o هب حومسم رٌؼ اقباس نٌروكذملا نٌلاجملا دحا مدختسٌ ل ًضارتفا رٌؼ ؾٌرعت يأ
 مٌق لجأ نم ءامسلا تلاجمو تاعمجملا مٌظنت ىلع ةٌلاتلا دوٌقلا تٌلرفلٌس مدقٌ xaml
o نوكٌ نأ امإ عمجملا ىلع بجٌ mscorlib ؾلم ًف عمجملا مسا نوكٌ نأ وأ xap ؾلم عمجملا نوكٌ نأ نكمٌ لف DLL
ةٌلك ةٌجراخ ةبتكم ىتح لو ًساسلا تٌلرفلٌس بٌصنت نم
o اهتٌاهن ًف ةبتكملا مسا نمضتٌ نأ نكمٌل .dll
دب١ٔبجٌا
 وه تٌلرفلٌس نم موعدملا دٌحولا ًنابلا xml:lang
 تاٌنابلا x: ًه تٌلرفلٌس لبق نم ةموعدملا x:Null و x:Name و x:Key و x:Class
 تاٌناب sys: ًه ةموعدملا sys:Double و sys:String و sys:int32
 ًناب mc: وه موعدملا دٌحولا mc:Ignorable
خغٌ xaml خ٠ش٘ٛغٌا
 ـل دودحم معد كانه Markup Extensions ـلاو تٌلرفلٌس ًف Markup Extensions ًه ةموعدملا x:Type و x:Null و
StaticResource و Binding و TemplateBindin g دجوٌ لو Markup Extensions ـب قلعتٌ امٌف لإ ةماع Binding
دجوٌ ل هنأ ًنعٌ امم Markup Extensions ةصصخم
 ادع امٌف Binding ـلا مدختست Markup Extensions صباصخلا ةؽٌصب attributes انه ضرؽلا رصنعل ةؽٌص دجوٌ لف
لثمف اهتٌمست نكمٌ ل تاٌنابلا تاددحمو {StaticResource aKey} نكلو ةحٌحص {StaticResource
ResourceKey=aKey} ةبطاخ
 ةفاضإ تٌلرفلٌس معدت ل extension مسا ةٌاهن ىلإ Markup Extension لثمف لٌدب مادختساك {x:Null} امنٌب حٌحص
{x:NullExtension} اطاخ
 تافرصت طورش ًف xaml تسٌل ًتلا ضارؼلا رصانعل تٌلرفلٌس ًف دودحم معد كانه DependencyObject
o تسٌل ًتلا ضارؼلا رصانع DependencyObject معدت ل x:Name
o تسٌل ًتلا ةٌلاتلا تابفلا DependencyObject قٌبطتلا عم اهلٌمحت مت ًتلاو عمجملا ًف ةفرعملا تابفلاك ةموعدم
تابفو sys: ًه Color و FontFamily
 ةٌصاخلا Name لثم لماعتو تٌلرفلٌس ًف ةٌعرفلا تابفلا عٌمج لبق نم ةموعدم x:Name ةٌعرفلا تابفلا ًفو
FrameworkElement ةٌصاخلا ةمٌق لدعٌس برعملا Name دوكلا ًف ماع طبار اهل نكٌ مل نإ ىتحو
 ًف رصانعلا ResourceDicitonary اهل نوكٌ امبر تٌلرفلٌس ًف x:Name ىلإ ةفاضإ وأ نع لدب x:Key نكت مل نإو x:Key
مدختسٌ ةددحم x:Name اهنع لدب
67

 ءانثتساب TextBlock و Run صن دقع ىلع يوتحت نأ نكمٌل تٌلرفلٌس ًف ضارؼلا رصانع xml صن ؾٌرعتل ةقٌرطك
لثمف ضرؽلل تاٌوتحملا <Button>Hello World</Button> هب حومسم رٌؼ
ٜشخلا دبفشظزٌا
 ـلا Framework Template ةٌصاخلا معدت ةٌعرفلا اهتابفو content ةٌصاخلا اهل نكٌ مل مولو ىتح Content
 UserControl.Content نأ تٌلرفلٌس برعمل نكمٌ ماع ؾرصتكو ةماعلا صباصخلا نم سكعلا ىلع ةٌمحم ةٌصاخ ًه
ةمٌق نأ املاط تاٌوتحملا هذه طبضٌ x:Class اهدٌدحت مت



68

شطبٕػ َذخزغغٔ ف١و Style ك١جطزٌا شٙظّث ُىحزٌٍ

دوك ةطساوب رزلا لكش رٌٌؽتب ًل قباس عوضوم ًف انمق Style ؾلملا ًف App.xaml وه دوكلا ناكو
<Style x:Key="RoundButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin=".2,.2">
<GradientStop Offset=".2" Color="White"/>
<GradientStop Offset="1" Color="Blue" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Content="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
دوكلا ةطساوب دٌدجلا لكشلا ذخأ ىتح رزلاب هطبرب انمقو
<Button Width="200" Height="200" Content="Hello VB"
Style="{StaticResource RoundButton}" FontSize="15">

</Button>

اندوزت ثٌح Silverlight و WPF امم مادختسلا ةداعل ةلباق رداصمك اهمادختساو مكحتلا صباصخ ؾٌلؽت نم اننكمت لاكشلل معد ةٌلآب
ةفاضإو قٌبطتلا ًف تاحفصلاو تامكحتلا نم دٌدعلا ربع اهمادختسا ةداعإو انتحفص نع ةلصفنم تافلم ًف رداصملا هذه نٌزخت نم اننكمٌ
لاكشلا هذهل نكمٌ ةٌساسلا صباصخلا دٌدحت ةٌناكمإ ىلإ Style ةداعإ نم اننكمٌ امم تامكحتلاب ةصاخلا لاكشلا بلاوق مادختسا دٌعت نأ
هدٌرن يذلا لكشلاب تامكحتلا هذه رهظم لماك لٌكشت
نامكحت انٌدل ناك نإف Border و TextBlock ًلٌ امك امهفٌرعت مت
<Border Grid.Column="0" Grid.Row="0" CornerRadius="30" Background="Blue"
Margin="10" Height="50">
<TextBlock Text="Test" Foreground="Yellow" Margin="3" FontSize="20"
HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Border>

لكش ءاشنإ اننكمٌف Style ؾلملا نمض app.xaml ًلٌ امك نٌمكحتلا لك تادادعإ ؾلؽٌل
<Style x:Key="MyBorder" TargetType="Border">
<Setter Property="CornerRadius" Value="30"/>
<Setter Property="Background" Value="Blue"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Height" Value="50"/>
</Style>

<Style x:Key="MyTextBlock" TargetType="TextBlock">
<Setter Property="Foreground" Value="Yellow"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="Margin" Value="3"/>
69

<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>

ًلٌ امك مكحت نم رثكأ عم لاكشلا هذه مادختسا ةداعإ انناكمإب نلا حبصأ ثٌح
<Border Grid.Column="0" Grid.Row="0" Style="{StaticResource MyBorder}">
<TextBlock Text="Test" Style="{StaticResource MyTextBlock}"></TextBlock>
</Border>
مادختسا اننكمٌ امك Style لثم ةكبشلا ىرخلا تامكحتلا نم دٌدعلا رهظمب مكحتلل
<Style x:Key="TopGrid" TargetType="Grid">
<Setter Property="Background" Value="#FF5C7590" />
</Style>

وأ StackPanel
<Style x:Key="DiggPanel" TargetType="StackPanel">
<Setter Property="Margin" Value="10"/>
<Setter Property="Width" Value="55"/>
<Setter Property="Height" Value="55"/>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFFFF098"/>
<GradientStop Color="#FFFFF9D4" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>

رزلا وأ
<Style x:Key="CloseButton" TargetType="Button">
<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="Width" Value="50"/>
<Setter Property="Height" Value="25"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border x:Name="brd1" Width="22" Height="22" CornerRadius="15">
<TextBlock x:Name="txt1" Foreground="#222" TextAlignment="center"
Text="r" FontSize="11" VerticalAlignment="center" FontFamily="Webdings"/>
<Border.Background>
<RadialGradientBrush GradientOrigin=".3, .3">
<GradientStop Color="#FFF" Offset=".15"/>
<GradientStop Color="#777" Offset="1"/>
</RadialGradientBrush>
</Border.Background>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
وأ HyperLinkButton
<Style x:Key="TitleLink" TargetType="HyperlinkButton">
<!--<Setter Property="TextWrapping" Value="Wrap"/>-->
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Foreground" Value="White"/>
70

<Setter Property="Width" Value="500"/>
<Setter Property="Grid.Row" Value="0"/>
<Setter Property="Grid.Column" Value="1"/>
<Setter Property="Grid.ColumnSpan" Value="2"/>
</Style>
هدٌرن مكحت يأ رهظم صٌصخت اننكمٌ بولسلا سفنبو
ياإع
نٌأ عضن لٌتسلا ًف سفن ؾلملا مأ ًف ؾلم ResourceDictionary ؟
ةاٛغٌا
ؾلملا ًف لٌاتسلا عضو متٌ App.xaml دعب كلذو <Application.Resources> لبق و </Application.Resources> لاثم

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SilverlightApplication5.App"
>
<Application.Resources>

<Style x:Key="MyBorder" TargetType="Border">
<Setter Property="CornerRadius" Value="30"/>
<Setter Property="Background" Value="Blue"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Height" Value="50"/>
</Style>

<Style x:Key="MyTextBlock" TargetType="TextBlock">
<Setter Property="Foreground" Value="Yellow"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="Margin" Value="3"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>

</Style>

</Application.Resources>
</Application>

71

دبّىحزٌا شٙظِ ض١ظخر Silverlight & WPF

ًف ةوق تازٌملا رثكأ ىدحإ SLiverlight و WPF نوروطملا نكمٌ امم اهمدختسن ًتلا تامكحتلا رهظم صٌصختل ةلماكلا ةٌناكملا ًه
موقنس ثٌح اهب نوبؼرٌ ًتلا ةهجاولا قٌقحتل ةرٌبك ةنورم مهل رفوٌ امم هنودٌرٌ يذلا لكشلاب تامكحتلا ةهجاو تحنل نوممصملاو
رزلا مكحت لوح هذه انتلاقم ًف ةٌناكملا هذه ضارعتساب Button تامكحتلا نم ارٌثك نأ عم هلعف اننكمٌ ام ضعب ضارعتسا لجأ نم
انه هب موقنس امل ةهباشم ةقٌرطب اهرهظم لٌدعت متٌ نأ نكمٌ ىرخلا
مسق ًف هفٌرعت مت رز تاقٌبطتلا دحأ ًف انٌدل هنأ ضرفنل XAML ًلٌ امك
<Button x:Name="btnTest" Content="Push ME!" Width="100" Height="50"
Click="btnTest_Click">


</Button>

ةٌصاخلا نأ وه اندٌفت ًتلا ءاٌشلا دحأ Contenet ل بجٌ ًتلا تامكحتلاو لاكشلا نم ةلسلس ةٌأ نوكت نأ اهنكمٌ لب امود ةٌصن نوكت نأ
نمضتت اهلعجب بؼرن دقف اهمادختساب بؼرن StackPanel نمضتٌ Image و TextBlock هلخادب لاثملا ًف امك
<Button x:Name="btnTest" Width="200" Height="100"
Click="btnTest_Click">
<Button.Content>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
VerticalAlignment="Center">
<Image Source="Samer.jpg" Height="75"></Image>
<TextBlock Text="Samer" FontSize="20" VerticalAlignment="Center"
Margin="15,10,10,10" ></TextBlock>
</StackPanel>
</Button.Content>

</Button>
مكحت لثم انب ةصاخلا لاكشلا مسرل لاكشلا تامكحت مادختسا اننكمٌ وأ Ellipse دوكلا ًف امك لثم
<Button x:Name="btnTest" Width="200" Height="100"
Click="btnTest_Click">
<Button.Content>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
VerticalAlignment="Center">
<Ellipse Margin="10" Width="50" Height="50">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.2,0.2">
<GradientStop Offset="0.2" Color="White" />
<GradientStop Offset="1" Color="Blue" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<TextBlock Text="Samer" FontSize="20" VerticalAlignment="Center"
Margin="15,10,10,10" ></TextBlock>
</StackPanel>
</Button.Content>

</Button>

لثم تامكحت نٌمضت اننكمٌ امك Calendar Controls يذلا خٌراتلا دٌدحتو مٌوقتلا مكحت نمض لقنتلا مدختسملل نكمٌ ثٌح رزلا نمض
دوكلا ًف امك هٌوتحٌ يذلا رزلا طؽضب ماٌقلا مث هب بؼرٌ
<Button x:Name="btnTest" Width="400" Height="200"
72

Click="btnTest_Click">
<Button.Content>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
VerticalAlignment="Center">
<basics:Calendar></basics:Calendar>
<TextBlock Text="Samer" FontSize="20" VerticalAlignment="Center"
Margin="15,10,10,10" ></TextBlock>
</StackPanel>
</Button.Content>

</Button>

ًف ةٌجمربلا تاٌناكملا اننكمت امك Silverlight و wpf انٌدل ثٌح مكحتلل ةٌلخادلا تاٌوتحملا لٌدعت درجم نم رثكأ ءاٌشؤب ماٌقلا نم
رازأ نم دٌرن لاثملا لٌبس ىلعف مكحتلل ًعٌبطلا ؾرصتلا ىلع رثإن نأ نودب هبؼرن اش يؤب مكحتلا رهظم لماك لادبتسل انه ةٌناكملا
ءاشنإب كلذ لمع اننكمٌ انهف يدٌلقتلا لٌطتسملا لكشلا نع اضوع ارٌدتسم لكش ذخؤت نأ انجمانرب Style ىعدٌ RoundButton همدختسنس
ةٌصاخلا زواجتنل Template مٌدقتو رازلل Template مكحتب يدٌلقتلا لٌطتسملا لكشلا لدبتست ىرخأ Ellipse هلخادب يوتحٌ
TextBlock
عورشم ًف Sliverlight ؾلملا حتفا كٌدل App.xaml كلذو انٌدل رازلا عم همادختسا دٌرن يذلا لكشلا اشنٌ يذلا ًلاتلا دوكلا ؾضأو
مسقلا نمض < Application.Resources > لمعا مث Build عورشملل
<Style x:Key="RoundButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Ellipse Width="200" Height="200">

<Ellipse.Fill>
<RadialGradientBrush GradientOrigin=".2,.2">
<GradientStop Offset=".2" Color="White"/>
<GradientStop Offset="1" Color="Blue" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<TextBlock Text="Push Me!"
FontSize="28"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ةٌصاخلا ؾضأ نلا Style ةمٌقلاب كلذو هلكش رٌٌؽتب بؼرن يذلا رزلل { StaticResource RoundButton } لاثملا ًف امك
<Button Width="200" Height="200" Style="{StaticResource RoundButton}">

</Button>

وه امود رزلا ًف ضورعملا صنلا نأ انه ظحلن Push Me! هب بؼرن يذلا صنلا ضرعٌ رز لك لعجو ةلكشملا هذه ىلع بلؽتللو
ةٌصاخلا مدختسن TemplateBinding ًلٌ امك قباسلا لكشلا لٌدعتب موقنس ثٌح هباشنإب انمق يذلا لكشلا عم مكحتلا صباصخ طبرل
<Style x:Key="RoundButton" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
73

<Grid>
<Ellipse Width="{TemplateBinding Width}"
Height="{TemplateBinding Height}">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin=".2,.2">
<GradientStop Offset=".2" Color="White"/>
<GradientStop Offset="1" Color="Blue" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Content="{TemplateBinding Content}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

لمعا build دوكلا ًف امك رزلا مكحت نم ةبوؼرملا صباصخلا طبضب مق مث لكشلا لٌدعت دعب عورشملل
<Button Width="200" Height="200" Content="Hello VB"
Style="{StaticResource RoundButton}" FontSize="15">

</Button>

لادبتساب انمق اننأ لكشلل قباسلا دوكلا نم ةظحلملا كنكمٌ TextBlock ـب ContenetPresenter يأ ضرع نم نكمتن نأ لجأ نم كلذو
لثم ةفلتخملا رزلا تلاح جلاعٌل هروطن نأ اننكمٌ رزلا رهظمب مكحتلا نم دٌزملا اندرأ نإو طقف صوصنلا سٌلو رزلا لخاد هدٌرن لكش
hover وأ focus وأ Pushed امامت اهدٌرن ًتلا لكشلا لٌكشت نم اننكمٌ امم



74

غثاشٌا ُغمٌا - دبفٌٍّاٚ َبظٌٕا



ةٌلاتلا عٌضاوملا مضٌو :
 لاثم ىلع ةٌلمع ءاشنإ Windows Service ءاشنإ جمانرب رٌفشت ًباقلت
تافلملل
 ؾٌك اننكمٌ دكؤتلا نم رٌرحت دراوم ماظنلا ًتلا اهمدختسٌ اندوك
 ةٌفٌك ةفاضإ دونب ىلإ ةمباق ماظنلا اٌجمرب
 ؾٌك اننكمٌ ثحبلا نع ؾلم ىوتحمب نٌعم نمض ةرجش تادلجم
 ؾٌك موقن ثحبلاب ًف لجس ماظنلا
 اولاعت لمعن اعم Task Manager طٌسب ةعرسبو
 بقعت ةفاضإ ةلازإو صارقلا ةطبترملا ربع ذفنم Usb
 لٌؽشت جمانرب نم نمض دوك لوجٌف كٌزٌاب تود تٌن
 تاوصلا ًف VB.net
 لاخدإ جارخإو صارقلا ةلباقلا عزنلل اٌجمرب
 تافلملا ماظن ةبقارم - مكحتلا FileSystemWatcher

75

ءبشٔئ خ١ٍّػ ٍٝػ يبضِ Windows Service – دبفٌٍٍّ ٟئبمٍر ش١فشر ظِبٔشث ءبشٔئ

عورشملا ةركف – ثٌحب سكعلل ةلباق رٌفشت ةٌبارجإ انه مدختسنسو نٌعم دلجم ىلإ هخسن دنع اٌباقلت ؾلم يأ رٌفشتب موقت زودنٌو ةمدخ ءانب
هرٌفشت كفب موقت دلجملا كلذل ؾلملا خسن ةداعإ ةٌلمع نأ
عون نم ادٌدج اعورشم اشنأ Windows Service هتٌمستب مقو AutoFileEncryptor ةٌمست رٌؼو Service1.vb ىلإ
AutoFileEncryptor.vb ـل مٌمصتلا ررحم حتفا مث ةبفلا ةٌمست ةداعإ كنم بلطت ًتلا ةلاسرلا ىلع قفاوو AutoFileEncryptor و
رصنعلا بحسا FileSystemWatcher ـب صاخلا دوكلا ررحم حتفا مث ةذفانلا عطس ىلع AutoFileEncryptor
ةبفلل ماعلا مسقلا ًف ًلاتلا ؾٌرعتلا ؾضأ AutoFileEncryptor
Private WatcPath = "d:\AutoFileEncryptor"
نٌثدحلا ءارجإ لدع OnStart و OnStop رصنعلل ةٌبادتبلا صباصخلا نٌٌعتل كلذو ًلاتلا دوكلا ًف امك اودبٌل FileSystemWatcher
Public Class AutoFileEncryptor
Private WatcPath = "d:\AutoFileEncryptor"

Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
Me.FileSystemWatcher1.Path = WatcPath
Me.FileSystemWatcher1.EnableRaisingEvents = True
End Sub

Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
Me.FileSystemWatcher1.EnableRaisingEvents = False
End Sub

End Class
انتبف ًف ةٌلاتلا ةماعلا تافٌرعتلا ةفاضل لوأ جاتحنس رٌفشتلا ةٌبارجإ ةباتكل
' This is the binary password.
Dim pwBytes() As Byte = {123, 234, 12, 9, 78, 89, 212}
' This is the extension used for temporary files.
Dim tempExt As String = ".$$$"
ؾلملا ةٌادب ًف ًلاتلا دارٌتسلا ؾضأ اضٌأو
Imports System.IO
رٌفشتلا ةٌبارجإ لثمٌ يذلا ًلاتلا دوكلا بتكا ةبفلا نمض
' This is the encryption/decryption routine.
Private Sub EncryptFile(ByVal Filename As String, ByVal pwBytes() As Byte)
' This is the size of each input block.
' (Files must be decrypted using the same block size.)
Const BLOCKSIZE = 8192
' Determine the name of the temporary file.
Dim tempFile As String = Filename & tempExt
' Open the source file as a binary input stream.
Dim inStream As New FileStream(Filename, IO.FileMode.Open)
' Open the temporary output file as a binary input stream.
Dim outStream As New FileStream(tempFile, IO.FileMode.Create)
' Determine the number of bytes to read.
Dim bytesLeft As Long = inStream.Length
' Prepare an input buffer.
Dim buffer(BLOCKSIZE - 1) As Byte
' Loop until there are bytes to read.
76

Do While bytesLeft > 0
' Read max 8 KB at a time.
Dim bytesToRead As Long = Math.Min(BLOCKSIZE, bytesLeft)
' Read into the input buffer.
inStream.Read(buffer, 0, bytesToRead)
' Encrypt this buffer.
EncryptArray(buffer, pwBytes)
' Output to the temporary file.
outStream.Write(buffer, 0, bytesToRead)
' We have fewer bytes to read now.
bytesLeft -= bytesToRead
Loop
' Close the two streams.
inStream.Close()
outStream.Close()
' Delete the source file.
File.Delete(Filename)
' Rename the temporary file as the original file.
File.Move(tempFile, Filename)
End Sub

' This routine encrypts an array of bytes.
Sub EncryptArray(ByVal buffer() As Byte, ByVal pwBytes() As Byte)
' This index points to the password array.
Dim i As Integer
' The max value for i
Dim maxval As Integer = pwBytes.Length
For index As Integer = 0 To buffer.Length - 1
' XOR each element with the corresponding element in the password.
buffer(index) = buffer(index) Xor pwBytes(i)
' Ensure that the index is always in the valid range.
i = (i + 1) Mod maxval
Next
End Sub

ثدحلل ةجلاعم ءارجإ ؾضأ Created رصنعلاب صاخلا FileSystemWatcher ًلاتلا دوكلا ًف امك حبصٌل هلدعو
Private Sub FileSystemWatcher1_Created(ByVal sender As Object, _
ByVal e As System.IO.FileSystemEventArgs) _
Handles FileSystemWatcher1.Created

' Ignore temporary files created by the encryption process.
If System.IO.Path.GetExtension(e.FullPath) = tempExt Then Exit Sub
' Encrypt the file being created.
EncryptFile(e.FullPath, pwBytes)
End Sub
ءارجلل ًلاتلا دوكلا ؾضأ OnStart لعف دوجوم دلجملا نأ ةمدخلا ةٌادب دنع دكؤتن ًك
If Not Directory.Exists(WatcPath) Then
Directory.CreateDirectory(WatcPath)
End If
لماك ءارجلا حبصٌف
Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
If Not Directory.Exists(WatcPath) Then
Directory.CreateDirectory(WatcPath)
End If
Me.FileSystemWatcher1.Path = WatcPath
Me.FileSystemWatcher1.EnableRaisingEvents = True
77

End Sub

ـل مٌمصتلا حطس ىلإ لقتنا AutoFileEncryptor ةٌصاخلا طبضاو ServiceName ـل AutoFileEncryptor ىلإ Auto File
Encryptor رملا رتخاو ًنٌمٌلا ةرؤفلا رز طؽضاو Add Installer صباصخ نمو قاٌسلا ةمباق نم ServiceInstaller1 اتلك طبضا
نٌتٌصاخلا DisplayName و ServiceName ىلإ Auto File Encryptor صباصخل لقتنا مث ServiceProcessInstaller1 طبضاو
ةٌصاخلا Account ىلإ Local Service رملا رتخا مث Save All ةمباق نم File
لمعب مق Build عورشملل
مساب اتقإم ادلجم اشنأ Temp ةقاوسلا ىلع D هٌلإ عورشملل يذٌفنتلا ؾلملا خسناو
مساب اٌصن افلم هٌف اشنأ مث Install.bat هتاٌوتحم نوكت ثٌحب
INSTALLUTIL AutoFileEncryptor.exe
مساب رخآ ًصن ؾلم اضٌأو Uninstall.bat هتاٌوتحم نوكت ثٌحب
INSTALLUTIL /U AutoFileEncryptor.exe
دلجم ىلإ لقتنا Visual Studio رملا لؽش و أدبا ةمباق ًف Visual Studio 2008 Command Prompt مادختساب هتلؽش كنأ نم دكؤتو
راٌخلا Run as Administrator ىلع طؽضلا عم اعابت ةٌلاتلا رماولا بتكا لوسنوكلا ةذفان نم مث اتسٌف زودنٌو ىلع لمعت امدنع Enter
رطس لك دعب
D:
CD\temp
Install
زودنٌو ًف ةمدخلا بٌصنت متٌف
ةذفان ىلإ لقتناو رٌوطتلا ةبٌب ىلإ نلا لقتناو ةحوتفم لوسنوكلا ةذفان كرتا Server Explorer ةدقعلا ىرت ىتح ةرجشلا عسوو Services
ةدقعلا ىلع رقنا Services رملا راتخا و ًنٌمٌلا ةرؤفلا رزب Launch Services Manager نع ةمباقلا نمض ثحبا Auto File
Encryptor ةمدخلا لٌؽشت ءدبب مق مث
دلجملا ىلإ ًصن ؾلم يأ خسنا ةمدخلا ةبرجتل d:\AutoFileEncryptor رٌفشت كفلو ةرفشملا ةؽٌصلاب اهارتس هتٌوتحم ةءارق لواحو
دلجملل هخسنا مث رخآ دلجم يأ ىلإ هلقنا ؾلملا d:\AutoFileEncryptor اٌباقلت هرٌفشت كف متٌل ةٌناث ةرم
جمانرب ىلإ دع ةمدخلا ةلازل Services Manager رملا ذفنو لوسنوكلا ةذفان ىلإ دع مث ةمدخلا ؾاقٌإب مقو Uninstall

78

بٔدٛو بِٙذخزغ٠ ٟزٌا َبظٌٕا دساِٛ ش٠شحر ِٓ ذوأزٌا بٕٕىّ٠ ف١و

كولب مدختست نأ كنكمٌ using كدوك نأ نم دكؤتلا لجأ نم مدختست امدنع اصوصخو اهمدختسٌ ًتلا ماظنلا رداصم نم امامت صلخت دق
بلطتت رماوأ نم جورخلل اهتمدختسا ًتلا ةقٌرطلا نع رظنلا ضؽب كلذو ةركاذلا نم ارٌبك اردق مادختسا كولب using دوكلا قلطأ ول ىتح
جلاعم رٌؼ ءانثتسا . انمق اننأ نم دكؤتن ًك لثمف هنٌمضت اننكمٌ تاناٌبلا ةدعاقب لاصتلا اهكلهتسٌ ًتلا ةركاذلا ةٌمك لماك نم صلختلاب نمض
كولب using كولب لخاد تاناٌبلا ةدعاق عم لماعتٌ يذلا دوكلا بتكنو using ًف امك لاثملا

Imports System.Data.SqlClient

Public Class Form1

Public Sub AccessSql(ByVal s As String)
Using sqc As New System.Data.SqlClient.SqlConnection(s)
MsgBox("Connected with string """ & sqc.ConnectionString & """")
End Using
End Sub

End Class

كولب نع حٌرصتلا دنع هفٌرعت مت يذلا رٌؽتملا نأ ةظحلم عم using رٌؽتملا لثم sqc ل انه انلاثم ًف كولب جراخ نم هٌلإ لوصولا نكمٌ
using هنل دٌدعلا لجأ نم كولبلا اذه مادختسا كنكمٌ امك كولبلا نم جورخلا روف هنم صلختلا متٌ ًلسلست ذفنم حتف لثم ماظنلا رداصم نم
اذه مدختست تنأ ماع لكشبو ؾلم ىلإ ةباتكلا وأ ءاهتنلا روف احاتم نوكٌ نأ بجٌ همدختست يذلا ردصملا نأ دكؤتت نأ دٌرت امدنع كولبلا هنم
. مادختساب ؾرعٌ يذلا رٌؽتملا نأ ملعلا عم Using نأ بجٌ ةهجاولا نمضٌ IDisposable

79

ب١غِشث َبظٌٕا خّئبل ٌٝئ دٕٛث خفبػئ خ١ف١و





لوأ – ةٌلاتلا تافٌرعتلا ؾٌضن ةماعلا تانلعلا مسق ًف :


اٌناث – رملا ةطساوب ماظنلا ةذفان ضبقم ىلع لوصحلاب موقن جذومنلل لٌمحتلا ثدح ًف GetSystemMenu ًتلا دونبلا ةفاضإب موقن مث
ةطساوب ماظنلا ةمباقل اهدٌرن AppendMenu





اثلاث – ـلا ًف Override ـل WndProc هرقن مت ةمباقلا نم دنب يأ ةفرعمل ًلاتلاب هٌبش دوك مدختسن



80

داذٍغِ حشغش ّٓػ ٓ١ؼِ ٜٛزحّث فٍِ ٓػ شحجٌا بٕٕىّ٠ ف١و

عونلا نم ادٌدج اعورشم اشنأ Windows Forms Application ةذفانلا ىلع عضو TextBox ددع 2 و Button ددع 2 و ListBox
ددع 1 ًلٌ امك ةقباسلا تامكحتلا ةٌمستب مق ًتاٌمستب ةعباتملا تببحأ نإو txtPath و txtContents و btnSelectFolder و
btnSearch و lstResults
ًلٌ امك دلجملا راٌتخا رز دوك لعجاو نٌرزلا لك ىلع رقنلا ثدحل جلاعم اشنأ نلا
Private Sub btnSelectFolder_Click() Handles btnSelectFolder.Click
' سا١رخا ذٍعٌّا
Dim sf As New FolderBrowserDialog
If sf.ShowDialog = Windows.Forms.DialogResult.OK Then
Me.txtPath.Text = sf.SelectedPath
End If
End Sub

رٌرمتب موقنس ثٌح ةنٌعم تادلجم ةرجش ًف ةدوجوملا تافلملاب ةمباق انل دٌعت ةفٌظو ىلإ جاتحنس ةبولطملا تافلملا نع ملعتسلا لجأ نم
عونلا نم ةعومجم انل دٌعٌ كنٌل ملعتسا انمدختسا ثٌح ًلاتلا لكشلا ىلع اهدوك نوكٌسو اهل دٌحو ددحمك هنم أدبنس يذلا دلجملا راسم
FileInfo ةلادلا امدختسم ةررمملا تادلجملا ةرجش ًف ةدوجوملا تافلملا ةمباقل GetFiles ةبولطملا تافلملا ةمباق ىلع لوصحلل
' جداػإ حّئال خافٌٍّات ّٓض جشعش خاذٍعِ حٕ١ؼِ
Function GetFiles(ByVal root As String) As _
System.Collections.Generic.IEnumerable(Of System.IO.FileInfo)

Return From file In My.Computer.FileSystem.GetFiles _
(root, FileIO.SearchOption.SearchAllSubDirectories, "*.*") _
Select New System.IO.FileInfo(file)
End Function

ىلع ةفٌظولا هذه دوك نوكٌسو ؾلملا كلذ راسم اهل ررمن ثٌح ملعتسلا دنع هأرقن يذلا ؾلملا تاٌوتحم انل دٌعت ىرخأ ةفٌظو جاتحنسو
ةلادلا انمدختسا ثٌح ًلاتلا لكشلا ReadAllText اهتداعإو ؾلملا تاٌوتحم ةفاك ةءارقل
' جءاشل خا٠ٛرحِ فٌٍّا
Function GetFileText(ByVal FileName As String) As String
' ْإ ْاو فٌٍّا ادٛظِٛ ذػأ ٗذا٠ٛرحِ لإٚ ذػأ اظٔ اغساف
If System.IO.File.Exists(FileName) Then
Return System.IO.File.ReadAllText(FileName)
Else
Return String.Empty
End If
End Function

ًلاتلاك ثحبلا رز دوك نوكٌسو
Private Sub btnSearch_Click() Handles btnSearch.Click
' ذوأرٌا ِٓ ساسٌّا طششٚ سحثٌا ًثل حؼتارٌّا
If Me.txtPath.Text <> String.Empty _
And Directory.Exists(Me.txtPath.Text) _
And Me.txtContents.Text <> String.Empty Then
' يٛظحٌا ٍٝػ حّئال خافٌٍّات
Dim fileList = GetFiles(Me.txtPath.Text)

' َاذخرسا َلؼرسا هٕ١ٌ يٛظحٌٍ ٍٝػ حّئال خافٌٍّات ٟرٌا كتاطذ طشش سحثٌا
Dim queryMatchingFiles = From file In fileList _
Where file.Extension = ".htm" _
81

Let fileText = GetFileText(file.FullName) _
Where
fileText.ToUpper.Contains(Me.txtContents.Text.ToUpper) _
Select file.FullName

' ساٙظإ طئارٌٕا ٟف قٚذٕط حّئامٌا
Me.lstResults.Items.Clear()
Me.lstResults.Items.AddRange(queryMatchingFiles.ToArray)

End If

MsgBox("Done.")
End Sub

ةرابع ةٌادبلا ًف انمدختسا ثٌح If تافلملا ةمباق ىلع لوصحلاب انمق مث ثحبلا ةٌلمع ذٌفنت لبق بولطملا راسملاو ثحبلا صن نم ققحتلل
رٌؽتملا ًف اهعضوو fileList نم ملعتسٌ كنٌل ملعتسا انمدختسا مث fileList مسق ًفو Where كلتمت ًتلا تافلملا ًف ثحبلا دٌرن اننأ انددح
ةقحللا htm مسقل رخآ اطرش انفضأ مث Where ةلادلا مادختساب انمقو طقف انٌعم اصن يوتحت ًتلا تافلملا ىلع لوصحلا دٌرن اننؤب
ToUpper صنلا ةلاح لهاجت لجأ نم نٌصنلا لك عم ) ةرٌؽص وأ ةرٌبك ؾورح ( ةمباقلا قودنص ًف ملعتسلا جباتن راهظإب انمق مث
ةرٌبك اهٌف ثوحبملا تادلجملا ةرجش تناك اذإ هنأ ًهو اهذٌفنت ًعوضوم ًعباتم دحأ نم رظتنأو انأ اهذفنأ نل نكلو عورشملا رٌوطتل ةركف
رخآ راسم ىلإ ملعتسلا ذٌفنت لقن بجٌ اذل لٌوط اتقو ذخؤٌس ثحبلاف Another Thread مادختساب ةٌلمعلا مدقتب رشإم راهظإو
ProgressBar ثحبلا دٌرٌ ًتلا تافلملا ةقحل ددحٌ انقٌبطت مدختسم لعجل ةذفانلا ىلع رخآ صوصن قودنص ةفاضإ نكمٌ امك ةذفانلا لفسأ
اهٌف

82

َبظٌٕا ًغع ٟف شحجٌبث َٛمٔ ف١و

خئفنا وذخزغَ عشغنا ازٓنٔ حدذؾي دبٕٚزؾي ٔأ خًٛل ٗهػ ٕ٘زؾٚ ػبزفي ٍػ وبظُنا مغع ٙف شؾجهن بَبٛؽأ طبزؾَ
Microsoft.Win32.Registry ٍئبكنا ٗهػ لٕظؾهن Microsoft.Win32.RegistryKey شؼهن ٘سزغنا ػبزفًنا مضًٚ ٘زنا
ٍئبكنا شطبُػ ٍٛيذخزغي وبظُنا مغع ٙف ّٛف شؾجنا دَٕ ٘زنا RegistryKey ِشطبُػ داذؼرٔ مغغنا ػبزفي خٚشغش شجػ ممُزهن
ػبزفًنا كنر ٙف حإزؾًنا ؼٛربفًنا ىٛلٔ ءبًعأ حءاشلٔ .
ٍئبك ٗهػ لٕظؾنا لٔأ بُٛهػ تغٚ بُْٔ RegistryKey ٍئبكنا خٚشغش شطبُػ شجػ ممُزهن ٙعبعلا ٖٕزغًنا مضًٚ
RegistryKey خئفنا بُن وذمر شٛؽ Registry مغع ؼٛربفًن ٙعبعلا ٖٕزغًنا مضًر خكشزشي دبٛطبخ خؼجع ٍي خفنؤي خػًٕغي
ْٙٔ وبظُنا
 ClassesRoot HKEY_CLASSES_ROOT
 CurrentConfig HKEY_CURRENT_CONFIG
 CurrentUser HKEY_CURRENT_USER
 DynData HKEY_DYN_DATA
 LocalMachine HKEY_LOCAL_MACHINE
 PerformanceData HKEY_PERFORMANCE_DATA
 Users HKEY_USERS
ٍئبكنا بُن شفٕٚ بًك My خئفنا My.Computer.Registry خٛفٛظٔ ظفَ شفٕر ضئبظخنا ٍي خمثبطي خػًٕغي ًٍضزر ٙزنا
خئفنا ٙف حدٕعًٕنا ضئبظخنا Microsoft.Win32.Registry ٍئبكنا ٗهػ كنٕظؽ ذؼثٔ RegistryKey ممُزنا كُكًٚ ٘سزغنا
خئفنا كُكًر ممُزنا ازْ ىػذنٔ خٛػشفنا ّؾٛربفي شجػ RegistryKey خمٚشطنا واذخزعا ٍي GetSubKeyNames ٗهػ لٕظؾهن
خمٚشطنا واذخزعا ىص خٛػشفنا ؼٛربفًنا غًٛع ءبًعأ ٗهػ ٕ٘زؾر خٛظَ خفٕفظي OpenSubKey ػبزفًهن غعشي ٗهػ لٕظؾهن
ذَبك ٌإ خٛمطُي خًٛل مجمزغٚ َٙبضنأ ظمف حءاشمهن ػبزفًنا كنر ؼزفٚ لٔلا ٌلًؾي ٌلكشث حشفٕزي ْٙٔ ٙػشفنا True ؼزفر ٙٓف
بضٚأ خثبزكنا خٛهثبل غي ػبزفًنا كنر .
ٍئبكنا ٗهػ مظؾر بًنبؽٔ RegistryKey واذخزعبث خٛػشفنا ىٛمنأ ؼٛربفًنا فزؽ ٗزؽ ٔأ شٚذؾر ٔأ حءاشل ٔأ ءبشَإ بْذُػ كُكًٚ
ٗهػ ذهظؽ ذل ٌٕكر ٌأ تغٚ ػبزفًنا دبٕٚزؾي ٗهػ دلٚذؼزنبث وٕمر ٙزنا كئاشطنا واذخزعا ذُػ َّأ خظؽلي غي خٛنبزنا كئاشطنا
ٍئبك RegistryKey خثٕهطًنا داشٛٛغزنبث وبٛمنا غٛطزغر ٗزؽ خثبزكهن مثبل
 CreateSubKey ٍئبك ذٛؼرٔ ٍٛؼي ىعبث ٙػشف ػبزفي ئشُر RegistryKey ادٕعٕي ػبزفًنا كنر ٌبك ٌئف خثبزكهن مثبل
ّن بؼعشي ذٛؼر ٙٓف
 DeleteSubKey ٌا ٍكًٚٔ خٛػشف ؼٛربفي خٚأ ٗهػ ػبزفًنا كنر ٕ٘زؾٚ ل ٌأ تغٚ شٛؽ دذؾي ىعبث ػبزفي فزؾث وٕمر
ءبُضزعا كهطٚ ٕٓف ّهشف خنبؽ ٙفٔ ىٛل ٗهػ ٕ٘زؾٚ System.InvalidOperationException
 DeleteSubKeyTree ًُّض ىٛمنأ خٛػشفنا ؼٛربفًنا غًٛع غي ػبزفًنا فزؾث وٕمٚ
 DeleteValue ٙنبؾنا ػبزفًنا ٙف دذؾي ىعبث خًٛل فزؾٚ وٕمٚ
 GetValue عُٕنا ٍي حدبؼًنا خًٛمنا ٌٕكرٔ ٙنبؾنا ػبزفًنا ٙف دذؾي ىعبث خًٛل ذٛؼٚ Object لأد واذخزعا تغٚ ىص
ذٛؼر ْٙٔ ةٕهطًنا دبَبٛجنا عَٕ ٗنإ بٓهٕٚؾزن عإَلا مٕٚؾر Nothing خهًؾي خمٚشط كهزًر ْٙٔ خًٛمنا دبغٚإ ىزٚ ىن ٌإ
ٍػ لذث حدبؼًنا خٛضاشزفلا خًٛمنا ذٚذؾر ٍي كُكًر Nothing
 GetValueKind داذؼزنا عَٕ ٍي حدبؼًنا خًٛمنا ٌٕكرٔ ٙنبؾنا ػبزفًنا ٙف حدذؾي خًٛل ّهًؾر ٘زنا دبَبٛجنا عَٕ ذٛؼر
Microsoft.Win32.RegistryValueKind
 GetValueNames ٌبك ٌإٔ ٙنبؾنا ػبزفًنا ٙف حإزؾًنا ىٛمنا غًٛع ءبًعأ ٗهػ ٕ٘زؾر خٛظَ خفٕفظي ذٛؼر ْٙٔ
ًٍض شظُؼك خغسبفنا خٛظُنا خهغهغنا ِزْ حدبػإ ىزٛف خغسبف خٛظَ خهغهغث خهضًي خٛضاشزفا خًٛل ٗهػ ٕ٘زؾٚ ػبزفًنا
حدبؼًنا خفٕفظًنا
83

 SetValue ٙف خَضخًنا دبَبٛجنا عَٕ ذٚذؾر ٍي بُُكًر خهًؾي خمٚشطث بَدٔضر ْٙٔ دذؾي ىعبث خًٛل مٚذؼر ٔأ ءبشَئث وٕمر
داذؼزنا خًٛل زخأر شٛؽ خًٛمنا كهر RegistryValueKind عَٕ ذٚذؾزث ىمَ ىن ٌإٔ خًٛمنا كهر عَٕ ذٚذؾزن شٛخأ دذؾًك
خًٛمنا كهر ظجضن سشًًنا ٍئبكنا عَٕ ٗهػ ادبًزػا بٛنآ بٓػَٕ ٗهػ للذزعلا ىزٛف خًٛمنا ِزْ
خئفنا ٌأ بًك RegistryKey خٓعإنا كمؾر IDisposable خمٚشطنا ءبػذزعا كٛهػ ازٓن IDispsable.Dispose سدبظي شٚشؾزن
ٍئبكنا واذخزعا ٍي ٙٓزُر بيذُػ وبظُنا RegistryKey .
شؼنا ٙف ُّػ شؾجنبث وٕمٚ ذٛؽٔ شيأأ شطع دذؾي زخأٚ ٙنبزنا لبضًنأ CurrentUser بًٓعا كثبطٚ ٙزنا ؼٛربفًنا ٍػ بضؽبث
لٕغَٕكنا خشبش ٗهػ ّٛف حإزؾًنا خٛظُنا ىٛمنا غًٛع سبٓظئث وٕمٚ خمثبطي بؾٛربفي ذغٚ بيذُػٔ سشًًنا دذؾًنا

Imports System
Imports Microsoft.Win32
Namespace Apress.VisualBasicRecipes.Chapter15

Public Class Recipe15_05

Public Shared Sub SearchSubKeys(ByVal root As RegistryKey, ➥
ByVal searchKey As String)
' Loop through all subkeys contained in the current key.
For Each keyName As String In root.GetSubKeyNames
Try
Using key As RegistryKey = root.OpenSubKey(keyName)
If keyName = searchKey Then PrintKeyValues(key)
SearchSubKeys(key, searchKey)
End Using
Catch ex As Security.SecurityException
' Ignore SecurityException for the purpose of this example.
' Some subkeys of HKEY_CURRENT_USER are secured and will
' throw a SecurityException when opened.
End Try
Next
End Sub

Public Shared Sub PrintKeyValues(ByVal key As RegistryKey)
' Display the name of the matching subkey and the number of
' values it contains.
Console.WriteLine("Registry key found : {0} contains {1} values", ➥
key.Name, key.ValueCount)
' Loop through the values and display.
For Each valueName As String In key.GetValueNames
If TypeOf key.GetValue(valueName) Is String Then
Console.WriteLine(" Value : {0} = {1}", valueName, ➥
key.GetValue(valueName))
End If
Next
End Sub

Public Shared Sub Main(ByVal args As String())
If args.Length > 0 Then
' Open the CurrentUser base key.
Using root As RegistryKey = Registry.CurrentUser
' Search recursively through the registry for any keys
' with the specified name.
SearchSubKeys(root, args(0))
End Using
84

End If
' Wait to continue.
Console.WriteLine(Environment.NewLine)
Console.WriteLine("Main method complete. Press Enter.")
Console.ReadLine()
End Sub

End Class
End Namespace

واذخزعأ كثبغنا لبضًنا مٛغشزث ٔ Environment ٗهػ مًؼَ بُك ٌإ ٙنبزنبث بٓٛجش بعشخ بُن شٓظٚ فٕغف شيأأ شطع دذؾًك
بزغٛف صٔذُٚٔ مغشٚ صبٓع

Registry key found : HKEY_CURRENT_USER\Environment contains 3 values
Value : TEMP = C:\Users\ Todd \AppData\Local\Temp
Value : TMP = C:\Users\Todd\AppData\Local\Temp
...
Main method complete. Press Enter.

85

اٌٛبؼر ًّؼٔ بؼِ Task Manager ؾ١غث خػشغثٚ


- يأ ةخسن نم لوجٌف وٌدوتس 2008 لمعتس انعم ىتح ـلا Express
- ىلع اٌلمع لاثم جمانربلا اذه ربتعٌ Linq To Object تاملعتسا مدختسن ثٌح Linq ةبولطملا تامولعملا ىلع لوصحلل

- اشنأ اعورشم ادٌدج همسو ام عض مث ءاشت ىلع جذومنلا DataGridView قبأو ىلع مسلا ًضارتفلا DataGridView1 اذإ تببحأ
ةعباتملا ًتاٌمستب مث عض نٌرز لفسأ ـلا DataGridView طعأو امهدحل امسا btnFill لعجاو ةٌصاخلا Text ةٌواسم ـل Fill و رخلا
همس btnKill لعجاو ةٌصاخلا Text ةٌواسم ـل Kill
- حتفا صباصخ MyProject و نم ةحفصلا Application طؽضا رز view UAC settings ًفو ررحم دوكلا يذلا رهظٌ كل لدبتسا
رطسلا

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

رطسلاب

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ًف ررحم دوكلا جذومنلل Form1 لخدأ دوكلا ًلاتلا يذلا نوكٌس وه دوكلا لماكلا انجمانربل
Public Class Form1

Private Bs As New BindingSource
Private Sub btnFill_Click() Handles btnFill.Click
Me.DataGridView1.DataSource = Bs
Dim pr = From a In Process.GetProcesses _
Order By a.ProcessName _
Select a.Id, a.ProcessName, a.MainWindowTitle, _
HandlesCount = a.HandleCount, ThreadsCount = a.Threads.Count

Me.Bs.DataSource = pr
End Sub

Private Sub btnKill_Click() Handles btnKill.Click
Dim pra = Bs.Current
Dim prk = From a In Process.GetProcesses _
Where a.Id = pra.Id _
And a.MainWindowTitle = pra.MainWindowTitle _
Select a

For Each p In prk
p.Kill()
Next

btnFill_Click()
End Sub

End Class

ًف ةٌادبلا انفرع ارٌؽتم Bs نم عونلا BindingSource يذلا همدختسنس طبرل ةجٌتن ملعتسلا عم DataGridView مث ًف دوك رزلا Fill
انمق طبرب Bs عم DatagridView مث انبتك ملعتسا Linq بلجٌل انل لوقحلا ًتلا اهدٌرن نم جتان ةقٌرطلا Process.GetProcesses انمقو
بٌترتلاب بسح ProcessName مث انرتخا لوقحلا ًتلا بؼرن اهراهظإب ًف ةكبش تاناٌبلا مث انمق طبضب ةمٌق ةٌصاخلا DataSource ىلإ
انملعتسا Pr امم ببسٌس راهظإ ةجٌتن ملعتسلا ًف ةكبش تاناٌبلا

ًفو دوك رزلا Kill انبلج لوأ ةمٌق رطسلا يذلا ؾقٌ هدنع رشإملا ًف ةكبش تاناٌبلا لوصحلاب ىلع ةمٌق ةٌصاخلا Current ـل Bs مث انبتك
املعتسا اهٌبش قباسلاب بلجٌ انل تاٌلمعلا ًتلا قفاوت انطرش ثٌحب نوكٌ ID و MainWindowTitle ناقباطم مث انمق نارودلاب للخ جباتن
ملعتسلا ربع ةقلح For ... Each انمدختساو ةقٌرطلا kill ءاهنل تاٌلمعلا ًتلا اهدٌعٌ ملعتسلا
86


اذإ اندرأ ةفاضإ رز ءافخإ راهظإو ةذفانلل ةٌسٌبرلا جمانربلل - ةٌلمعلا - ؾضأ نٌرز جذومنلل مساب btnHide و btnShow مث ًف مسق
تاحٌرصتلا ةماعلا نمض ةبفلا Form1 ؾضأ تاحٌرصتلا ةٌلاتلا

Public Declare Auto Function ShowWindow Lib "user32" _
(ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer

Public Const SW_HIDE = 0
Public Const SW_SHOW = 5
Public Const SW_SHOWNA = 8
Public Const SW_SHOWNORMAL = 1

نوكٌو دوك يرز راهظلا ءافخلاو

Private Sub btnHide_Click() Handles btnHide.Click
Dim pra = Bs.Current
Dim prk = From a In Process.GetProcesses _
Where a.Id = pra.Id _
And a.MainWindowTitle = pra.MainWindowTitle _
Select a

For Each p In prk
ShowWindow(p.MainWindowHandle, SW_HIDE)
Next

btnFill_Click()
End Sub

Private Sub btnShow_Click() Handles btnShow.Click
Dim pra = Bs.Current
Dim prk = From a In Process.GetProcesses _
Where a.Id = pra.Id _
And a.MainWindowTitle = pra.MainWindowTitle _
Select a

For Each p In prk
ShowWindow(p.MainWindowHandle, SW_SHOW)
Next

btnFill_Click()
End Sub
نمو لجأ لقن زٌكرتلا قٌبطتل جاتحن نٌعم ىلإ تافٌرعتلا ةٌلاتلا

Public Declare Auto Function SetForegroundWindow Lib "user32" _
(ByVal hwnd As Integer) As Boolean

ؾٌضنو رز مساب SetFocus نوكٌ هدوك امك ًلٌ

Private Sub btnSetfocus_Click() Handles btnSetfocus.Click
Dim pra = Bs.Current
Dim prk = From a In Process.GetProcesses _
Where a.Id = pra.Id _
And a.MainWindowTitle = pra.MainWindowTitle _
Select a

For Each p In prk
SetForegroundWindow(p.MainWindowHandle)
Next

btnFill_Click()
End Sub

87

تمؼر خفبػئ خٌاصئٚ صاشللا خطجرشٌّا شجػ زفِٕ Usb

لمعلا ةركف : ةبف ءانب Class ةلباقلا صارقلا عم لماعتلل ذفنم ربع بساحلا ىلإ اهلٌصوت متٌ ًتلاو ةلازلل USB
دباوفلا : ةجمربلا ىلع لاثم ثادحلا قلطإ ،صباصخلا ةفاضإ ،تابفلا ءانب ،هجوتلا ةٌضرؼ
ؾٌرعتب لوأ موقنس ةبف Class صباصخلا نم دٌدعلا مضت نأ بجٌ اهنم ًهتنن امدنعو انلمع مضتل تاءارجلاو ةدٌفملا

Public Class UsbDriveDetect

End Class

ـل عجرم ةفاضل جاتحنس ManagementEventWatcher عٌطتسن ىتح ثادحلا ةبقارمب موقٌ يذلاو زاهجلا لخاد ثدحٌ ام ةبقارم
ملعتسا ىلع ءانب ةقلطنملا ةملكلا مدختسنس و نٌعم WithEvents ةرداصلا ثادحلا بقعت عٌطتسن ىتح ؾٌرعتلا ًف هنع

Private WithEvents m_MediaConnectWatcher As ManagementEventWatcher

ًكلو ـل عجرم ةفاضل جاتحنس حٌحص لكشب لمعٌ System.Management نلا ةفاضإب مق System.Management ةمباق نم
Project دنب Add Reference ًلاتلا دارٌتسلا مدختسا مث اضٌأ ةبفلا ؾٌرعت لبق ىتحو ؾلملا ًف اش لك لبق

Imports System.Management

جاتحنس ةبفلا دٌشم ءانبل اضٌأ Sub New نم موقنس يذلاو انتبفل ةٌساسلا ةبٌهتلا طبضٌس يذلا صباصخ طبضب هللخ
ManagementEventWatcher انلجل لمعلاب موقٌ يذلا

Sub New()
Dim Query2 As New WqlEventQuery("SELECT * FROM __InstanceOperationEvent WITHIN 1 " _
& "WHERE TargetInstance ISA 'Win32_DiskDrive'")

Me.m_MediaConnectWatcher = New ManagementEventWatcher
Me.m_MediaConnectWatcher.Query = Query2
End Sub

صارقأ ةلازإو عضو بقعت ؾاقٌإو ءدبل تاءارجإ عضوب نلا موقنس USB

Public Sub StartDetection()
Me.m_MediaConnectWatcher.Start()
End Sub

Public Sub StopDetection()
Me.m_MediaConnectWatcher.Stop()
End Sub

نلا دٌرن ملعإ امدنع صاخ ثدح قلطإ قٌرط نع انتبف مدختسم ذفنم قٌرط نع صرق ةلازإ وأ عضو متٌ USB ءاشنإب موقنس زاهجلا ًف
نم ةقتشم ةبف System.EventArgs ةٌساسلا انتبف نمض ةٌعرف ةبفك كلذ و UsbDriveDetect اهمدختسن ىتح انثدح قلطل نكلو
مت له صرقلا ةلاح ةداعل ًلاتلا ؾٌرعتلل لوأ جاتحنس ةبفلا ؾٌرعت ةٌادب دعب ًلاتلا ؾٌرعتلا عض هتلازإ وأ هعضو

Public Enum EnUsbArrivedRemoved
88

Arrived
Removed
End Enum
ثدحلاب ةصاخلا ةبفلا صن ًلٌ امٌفو

Public Class UsbDriveEeventArgs
Inherits System.EventArgs

Private m_DeviceName As String
Private m_DriveLetter As String
Private m_ArrivedRemoved As EnUsbArrivedRemoved

Sub New(ByVal DeviceName As String, ByVal DriveLetter As String, _
ByVal ArrivedRemoved As EnUsbArrivedRemoved)

Me.m_DeviceName = DeviceName
Me.m_DriveLetter = DriveLetter
Me.m_ArrivedRemoved = ArrivedRemoved
End Sub

Public ReadOnly Property DeviceName() As String
Get
Return Me.m_DeviceName
End Get
End Property

Public ReadOnly Property DriveLetter() As String
Get
Return Me.m_DriveLetter
End Get
End Property

Public ReadOnly Property ArrivedRemoved() As EnUsbArrivedRemoved
Get
Return Me.m_ArrivedRemoved
End Get
End Property

End Class
ؾرعٌس يذلا ًلاتلا رطسلا عض ةبفلا ؾٌرعت ةٌادب دعب اضٌأ و هقلطإب موقنس يذلا ثدحلا

Public Event UsbDeviceArrivedRemoved(ByVal sender As Object, _
ByVal e As UsbDriveEeventArgs)

لبق ثدحلا مادختسا UsbDeviceArrivedRemoved صرق ةلازإ وأ عضوب مدختسملا ملعل USB بجٌ صرقلا كلذ ؾرح ىلع لوصحلا

Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
Dim oq_part, oq_disk As ObjectQuery
Dim mos_part, mos_disk As ManagementObjectSearcher
Dim obj_part, obj_disk As ManagementObject
Dim ans As String = ""

' WMI queries use the "\" as an escape charcter
Name = Replace(Name, "\", "\\")
89


' First we map the Win32_DiskDrive instance with the association called
' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
' instance with the assocation called Win32_LogicalDiskToPartition

oq_part = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" _
& Name & """} WHERE AssocClass = _
Win32_DiskDriveToDiskPartition")

mos_part = New ManagementObjectSearcher(oq_part)
For Each obj_part In mos_part.Get()

oq_disk = New ObjectQuery("ASSOCIATORS OF " _
& "{Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") _
& """} WHERE AssocClass = Win32_LogicalDiskToPartition")

mos_disk = New ManagementObjectSearcher(oq_disk)
For Each obj_disk In mos_disk.Get()
ans &= obj_disk("Name") & ","
Next
Next

Return ans.Trim(","c)
End Function

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

Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
Dim oq_part, oq_disk As ObjectQuery
Dim mos_part, mos_disk As ManagementObjectSearcher
Dim obj_part, obj_disk As ManagementObject
Dim ans As String = ""

' WMI queries use the "\" as an escape charcter
Name = Replace(Name, "\", "\\")

' First we map the Win32_DiskDrive instance with the association called
' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
' instance with the assocation called Win32_LogicalDiskToPartition

oq_part = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" _
& Name & """} WHERE AssocClass = _
Win32_DiskDriveToDiskPartition")

mos_part = New ManagementObjectSearcher(oq_part)
For Each obj_part In mos_part.Get()

oq_disk = New ObjectQuery("ASSOCIATORS OF _
{Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") _
& """} WHERE AssocClass = Win32_LogicalDiskToPartition")

mos_disk = New ManagementObjectSearcher(oq_disk)
For Each obj_disk In mos_disk.Get()
90

ans &= obj_disk("Name") & ","
Next
Next

Return ans.Trim(","c)
End Function

ثدحلا عبتتنس نلاو EventArrived ـب صاخلا ManagementEventWatcher صرق ةلازإ وأ عضو مت ىتم ؾرعن ىتح USB كلذو
عٌطتسن ًك قلطإ لبقتسملا ثدحلل اقفو بسانملا انثدح

Private Sub m_MediaConnectWatcher_EventArrived(ByVal sender As Object, _
ByVal e As System.Management.EventArrivedEventArgs) Handles _
m_MediaConnectWatcher.EventArrived

Dim mbo, obj As ManagementBaseObject
' the first thing we have to do is figure out if this is
' a creation or deletion event

mbo = CType(e.NewEvent, ManagementBaseObject)
' next we need a copy of the instance that was either created or deleted
obj = CType(mbo("TargetInstance"), ManagementBaseObject)
If obj("InterfaceType") = "USB" Then
Select Case mbo.ClassPath.ClassName
Case "__InstanceCreationEvent"
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), _
GetDriveLetterFromDisk(obj("Name")), EnUsbArrivedRemoved.Arrived)

RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
Case "__InstanceDeletionEvent"
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), "", _
EnUsbArrivedRemoved.Removed)

RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
End Select
End If
End Sub

كلذ نع تامولعملا ضعب دٌعٌ رٌؽتم ةفاضإب موقأ ؾوس صرقلا كلذلو ؾٌرعت ىلإ جاتحنس بٌكرت Structure تامولعملا كلت دٌعٌل

Public Structure DriveInfoStr
Dim DriveLetter As String
Dim Description As String
Dim FileSystem As String
Dim Size As UInt64
Dim FreeSpace As UInt64
Dim DriveType As DriveTypeEnum
Dim VolumeName As String
Dim VolumeSerialNumber As String
End Structure
ىلإ اضٌأو دادعت Enum صرقلا عون دٌعٌل

Public Enum DriveTypeEnum
Unknown = 0
NoRootDirectory = 1
RemovableDisk = 2
91

LocalDisk = 3
NetworkDrive = 4
CompactDisc = 5
RAMDisk = 6
End Enum
ىلإ كلذ ؾٌضنسو UsbDriveEeventArgs ةمٌقلا دٌعت ىتح

Private m_DriveInfoS As DriveInfoStr

Public ReadOnly Property DriveInformation() As DriveInfoStr
Get
Return m_DriveInfoS
End Get
End Property
لدعنسو Sub New ـل اضٌأ UsbDriveEeventArgs

Sub New(ByVal DeviceName As String, ByVal DriveLetter As String, _
ByVal ArrivedRemoved As EnUsbArrivedRemoved _
, ByVal DriveInformations As DriveInfoStr)

Me.m_DeviceName = DeviceName
Me.m_DriveLetter = DriveLetter
Me.m_ArrivedRemoved = ArrivedRemoved
Me.m_DriveInfoS = DriveInformations
End Sub
امٌفو تامولعملا ىلع لوصحلا ءارجإ ًلٌ

Private Function GetDriveInformation(ByVal DriveLetter As String) As
DriveInfoStr

Dim Query As String = "Select * from Win32_LogicalDisk WHERE DeviceID = '" _
& DriveLetter & "'"

Dim colDisks As New ManagementObjectSearcher(Query)
For Each objDisk As ManagementObject In colDisks.Get
Dim DrIn As DriveInfoStr
With DrIn
.DriveLetter = objDisk("DeviceID")
.FileSystem = objDisk("FileSystem")
.Size = objDisk("Size")
.FreeSpace = objDisk("FreeSpace")
.Description = objDisk("Description")
.DriveType = objDisk("DriveType")
.VolumeName = objDisk("VolumeName")
.VolumeSerialNumber = objDisk("VolumeSerialNumber")
End With
Return DrIn
Next
Return Nothing
End Function
دوك وهو هرٌٌؽتب موقنس رٌخأ اش قلطإ عم قفاوتٌل ثدحلا ةدٌدجلا تافاضلا

Dim DrL As String = GetDriveLetterFromDisk(obj("Name"))
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), DrL, _
EnUsbArrivedRemoved.Arrived, GetDriveInformation(DrL))

92

RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
امٌفو لماكلا ةبفلا صن ًلٌ

Public Class UsbDriveDetect

Private WithEvents m_MediaConnectWatcher As ManagementEventWatcher

Public Enum EnUsbArrivedRemoved
Arrived
Removed
End Enum

Public Event UsbDeviceArrivedRemoved(ByVal sender As Object, ByVal e As
UsbDriveEeventArgs)

Public Structure DriveInfoStr
Dim DriveLetter As String
Dim Description As String
Dim FileSystem As String
Dim Size As UInt64
Dim FreeSpace As UInt64
Dim DriveType As DriveTypeEnum
Dim VolumeName As String
Dim VolumeSerialNumber As String
End Structure

Public Enum DriveTypeEnum
Unknown = 0
NoRootDirectory = 1
RemovableDisk = 2
LocalDisk = 3
NetworkDrive = 4
CompactDisc = 5
RAMDisk = 6
End Enum

Sub New()
Dim Query2 As New WqlEventQuery("SELECT * FROM __InstanceOperationEvent" _
& " WITHIN 1 WHERE TargetInstance ISA 'Win32_DiskDrive'")

Me.m_MediaConnectWatcher = New ManagementEventWatcher
Me.m_MediaConnectWatcher.Query = Query2
End Sub

Public Sub StartDetection()
Me.m_MediaConnectWatcher.Start()
End Sub

Public Sub StopDetection()
Me.m_MediaConnectWatcher.Stop()
End Sub

Public Class UsbDriveEeventArgs
Inherits System.EventArgs

93

Private m_DeviceName As String
Private m_DriveLetter As String
Private m_ArrivedRemoved As EnUsbArrivedRemoved
Private m_DriveInfoS As DriveInfoStr

Sub New(ByVal DeviceName As String, ByVal DriveLetter As String, _
ByVal ArrivedRemoved As EnUsbArrivedRemoved _
, ByVal DriveInformations As DriveInfoStr)
Me.m_DeviceName = DeviceName
Me.m_DriveLetter = DriveLetter
Me.m_ArrivedRemoved = ArrivedRemoved
Me.m_DriveInfoS = DriveInformations
End Sub

Public ReadOnly Property DriveInformation() As DriveInfoStr
Get
Return m_DriveInfoS
End Get
End Property

Public ReadOnly Property DeviceName() As String
Get
Return Me.m_DeviceName
End Get
End Property

Public ReadOnly Property DriveLetter() As String
Get
Return Me.m_DriveLetter
End Get
End Property

Public ReadOnly Property ArrivedRemoved() As EnUsbArrivedRemoved
Get
Return Me.m_ArrivedRemoved
End Get
End Property

End Class

Private Sub m_MediaConnectWatcher_EventArrived(ByVal sender As Object, _
ByVal e As System.Management.EventArrivedEventArgs) Handles _
m_MediaConnectWatcher.EventArrived

Dim mbo, obj As ManagementBaseObject
' the first thing we have to do is figure out if this is
' a creation or deletion event
mbo = CType(e.NewEvent, ManagementBaseObject)
' next we need a copy of the instance that was either created or deleted
obj = CType(mbo("TargetInstance"), ManagementBaseObject)
If obj("InterfaceType") = "USB" Then
Select Case mbo.ClassPath.ClassName
Case "__InstanceCreationEvent"
Dim DrL As String = GetDriveLetterFromDisk(obj("Name"))
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), _
94

DrL, EnUsbArrivedRemoved.Arrived, GetDriveInformation(DrL))

RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
Case "__InstanceDeletionEvent"
Dim Ee As New UsbDriveEeventArgs(obj("Caption"), Nothing, _
EnUsbArrivedRemoved.Removed, Nothing)

RaiseEvent UsbDeviceArrivedRemoved(Me, Ee)
End Select
End If
End Sub

Private Function GetDriveLetterFromDisk(ByVal Name As String) As String
Dim oq_part, oq_disk As ObjectQuery
Dim mos_part, mos_disk As ManagementObjectSearcher
Dim obj_part, obj_disk As ManagementObject
Dim ans As String = ""

' WMI queries use the "\" as an escape charcter
Name = Replace(Name, "\", "\\")

' First we map the Win32_DiskDrive instance with the association called
' Win32_DiskDriveToDiskPartition. Then we map the Win23_DiskPartion
' instance with the assocation called Win32_LogicalDiskToPartition

oq_part = New ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" _
& Name & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")

mos_part = New ManagementObjectSearcher(oq_part)
For Each obj_part In mos_part.Get()

oq_disk = New ObjectQuery("ASSOCIATORS OF " & _
{Win32_DiskPartition.DeviceID=""" & obj_part("DeviceID") _
& """} WHERE AssocClass = Win32_LogicalDiskToPartition")

mos_disk = New ManagementObjectSearcher(oq_disk)
For Each obj_disk In mos_disk.Get()
ans &= obj_disk("Name") & ","
Next
Next

Return ans.Trim(","c)

End Function

Private Function GetDriveInformation(ByVal DriveLetter As String) _
As DriveInfoStr

Dim Query As String = "Select * from Win32_LogicalDisk WHERE " & _
DeviceID = '" & DriveLetter & "'"

Dim colDisks As New ManagementObjectSearcher(Query)
For Each objDisk As ManagementObject In colDisks.Get
Dim DrIn As DriveInfoStr
With DrIn
95

.DriveLetter = objDisk("DeviceID")
.FileSystem = objDisk("FileSystem")
.Size = objDisk("Size")
.FreeSpace = objDisk("FreeSpace")
.Description = objDisk("Description")
.DriveType = objDisk("DriveType")
.VolumeName = objDisk("VolumeName")
.VolumeSerialNumber = objDisk("VolumeSerialNumber")
End With
Return DrIn
Next
Return Nothing
End Function

End Class



امٌفو مادختسلا نع لاثم ًلٌ - ارٌؽتم ؾرع جذومنلا ةبف نمض انتبف ىلإ رٌشٌ اماع

Private WithEvents UsbMonitor As New UsbDriveDetect
ؾضأ بقعتلا ؾاقٌإو ءدبل رماوأ يرز

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

Me.UsbMonitor.StartDetection()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

Me.UsbMonitor.StopDetection()
End Sub
لثم ةلاسر راهظإ انتبف نع رداصلا ثدحلا جلاع

Private Sub UsbMonitor_UsbDeviceArrivedRemoved(ByVal sender As Object, _
ByVal e As UsbDriveDetect.UsbDriveEeventArgs) Handles

UsbMonitor.UsbDeviceArrivedRemoved
MsgBox(e.DeviceName & ControlChars.CrLf & e.DriveLetter _
& ControlChars.CrLf & e.ArrivedRemoved.ToString)
End Sub


96

ذ١ٔ دٚد ه٠ض٠بث يٛغ١ف دٛو ّٓػ ِٓ ٟعسبخ ظِبٔشث ً١غشر

خِذمِ
ماٌأ انك VB6 رملا مدختسن Shell دوكلا مدختسن انك ةبساحلا ةللا لٌؽشتل لثمف ًجراخ جمانرب لٌؽشتل
Shell("calc.exe")
قٌرط نع ًجراخ جمانرب لٌؽشتل ةدٌدج ةقٌرط مٌدقت مت تٌن تودلا مودق عمو كزٌابلا ةؽل روطت عم نكلو Process.Start اننكمٌ ثٌح
قباسلا دوكلل افاكم دوكبو ةدٌدجلا ةفٌظولا مادختساب ةبساحلا ةللا لٌؽشت
Process.Start("calc.exe")
رملا نأ ىلإ ةفاضإ Shell ءامسلا لاجم نمض دوجوم Microsoft.VisualBasic عم ةٌعجرملا ةٌقفاوتلا ضرؽب دوجوملا VB6
اننأ ىلإ ةفاضإ هٌف ةدوجوملا كلت نع ةوق رثكأو لضفأ لبادب رفوتل كلذو روكذملا ءامسلا لاجم ًف ةدوجوملا رماولا مادختساب حصنٌلو
عم ةٌقفاوتلا معد ءاؽلإب تفوسوركٌام موقت ىتم نمضنل VB6
تتأ اذهل نٌقباسلا نٌدوكلا نم يأ مادختساب هذٌفنت بعصلا نم هنؤب ًل نولوقتس عبطلاب دقعم وأ لٌوط رماوأ رطس ذٌفنتل انجتحا ول اذام نكلو
ةفٌظولا Process.Start ةفٌظولا نع ةلثملا ضعب ًلٌ امٌفو ةفلتخملا جمربملا تابلطتم ةٌبلتل كلذو لاكشأ ةدعب Start
' Start Internet Explorer. Defaults to the home page.
Process.Start("IExplore.exe")

' Start a Web page using a browser associated with .html and .asp files.
Process.Start("IExplore.exe", "C:\myPath\myFile.htm")

' Open web site using IE
Process.Start("IExplore.exe", "www.aya.sy")

' OpenWithStartInfo()
Dim startInfo As New ProcessStartInfo("IExplore.exe")
startInfo.WindowStyle = ProcessWindowStyle.Minimized
Process.Start(startInfo)
startInfo.Arguments = "www.northwindtraders.com"
Process.Start(startInfo)

انمقف هحتفٌل حفصتملل ؾلم رٌرمت دٌرن ًناثلا لاثملا ًفو هلٌؽشت متٌ ىتح ةفٌظولل طقف جمانربلا مسا رٌرمتب انمق اننأ لولا لاثملا نم ظحلن
جمانربلاب ةصاخلا رماولا رطس تاددحم عضن ًناثلا ددحملا ًفو ةفٌظولل لولا ددحملا ًف تنرتنلا حفصتمل يذٌفنتلا ؾلملا مسا رٌرمتب
هلٌؽشت دٌرن يذلا – تنرتنلا حفصتم - اهدنعف ددحم تنرتنا عقوم حتف دٌرن دقو لماكلا هراسم عم هحتف دٌرن يذلا ؾلملا مسا انه انلاثم ًفو
عونلا نم رٌؽتم رٌرمتب انمق رٌخلا لاثملا ًفو ثلاثلا لاثملا ًف امك عقوملا كلذ ناونع ىلإ ًناثلا ددحملا ةٌمق طبضن ProcessStartInfo
ةفٌظولل Start ةٌصاخلا ةمٌق دٌدحت مت مث ًنابلل ددحمك جمانربلا مسا رٌرمت مت دقف ةبسانملا صباصخلا طبض دعب كلذو دٌحو ددحمك
WindowStyle ىلإ Minimized ةٌصاخلا ةمٌق دٌدحت متو ةرؽصم ةذفانب جمانربلا لٌؽشت ىلإ يدإٌ كلذو Arguments مدختست ًتلا
هحتف دٌرن يذلا عقوملا ناونع ىلإ هلٌؽشت دارملا قٌبطتلا ىلإ رماولا رطس تاددحم رٌرمتل
خئفٌا ProcessStartInfo
ةفلتخملا ماهملاب ماٌقلا ىلع اندعاست ًتلا ةدٌفملا صباصخلا نم دٌدعلا كلتمت ًهو اهلٌؽشت دٌرن ًتلا ةٌلمعلا صباصخ دٌدحتل ةبفلا هذه مدختست
ةٌلمع لٌؽشت اهبلطتٌ ًتلا – جمانرب – ةبفلا هذه صباصخ مهل ضارعتسا ًلٌ امٌفو ام
ػٌص ةثلثب ًتؤٌ يذلا ةبفلا ًنابب لوأ أدبن
ProcessStartInfo()
ProcessStartInfo(String)
ProcessStartInfo(String, String)

97

عونلا نم رٌؽتم ءاشنل مدختست ىلولا ةؽٌصلاف ProcessStartInfo اهل ةدٌحو ةٌصن ةمٌق رٌرمت متٌ ةٌناثلاو اهل ةمٌق يأ رٌرمت متٌ نأ نود
مسا نع ةرابع لولا اهل نٌٌصن نٌددحم رٌرمت متٌ ةرٌخلا ةؽٌصلاو هلٌؽشت دارملا قٌبطتلل يذٌفنتلا ؾلملا وأ ةٌلمعلا مسا نع ةرابع ًه
هلٌؽشت دارملا قٌبطتلاب ةصاخلا رماولا رطس تاددحم نع ةرابع ًناثلا ددحملاو قٌبطتلل يذٌفنتلا ؾلملا وأ ةٌلمعلا . مهل درس ًلٌ امٌفو
ةبفلا صباصخ ProcessStartInfo
 Arguments هلٌؽشت دٌرن يذلا قٌبطتلل رماولا رطس تاددحم لثمت ةٌصن ةمٌق لمحت
 CreateNoWindow ةٌضارتفلا اهتمٌق نوكتو ةدٌدج ةذفان ًف قٌبطتلا لٌؽشت متٌ نأ بجٌ له ىلإ رٌشت ةٌقطنم ةمٌق ًه
False
 ErrorDialog ةٌلمعلا لٌؽشت نم نكمتلا مدع ةلاح ًف ؤطخ ةلاسر راهظإ بوجو ددحت ةٌقطنم ةمٌق نع ةرابع ًهو
 FileName اهلٌؽشت متٌس ًتلا ةقٌثولا وأ جمانربلا ؾلم مسا ددحت ةٌصن ةمٌق ًهو
 LoadUserProfile ماظنلا لجس نم مدختسملل ًبناجلا لٌكشتلا لٌمحت متٌ نأ بجٌ ناك اذإ امٌف ددحت ةٌقطنم ةمٌق ًهو
 Password ةٌلمعلا ءدبل ةمدختسملا رسلا ةملك ىلع يوحت ةٌصن ةلسلس ًهو
 UserName ةٌلمعلا ءدبل مدختسملا مدختسملا مسا يوحت ةٌصن ةمٌق ًهو
 UseShellExecute ماظنلا ةرشق مادختسا متٌس ناك اذإ امٌف ددحت ةٌقطنم ةمٌق ًهو System Shell اهتمٌقو ةٌلمعلا ءدبل
ةٌضارتفلا True
 Verb اهنوك ةلاح ًفو ةؼراف ةٌصن ةلسلس ةٌضارتفلا ةمٌقلاو ةٌلمعلا ءدب دنع هذٌفنت متٌس يذلا لمعلا ددحت ةٌصن ةمٌق ًهو
ؾلملا كلذب طبترملا ًضارتفلا لمعلا ذٌفنت متٌ ةؼراف
 Verbs ةٌصاخلا ًف ددحملا ؾلملا عم ةطبترملا لامعلاب ةمباق لكشت ةٌصن مٌق ةفوفصم نع ةرابع ًهو FileName
 WindowStyle ةمٌق لمحت ًهو ProcessWindowStyle مٌقلا ىدحإ اهل نوكٌو ةذفانلا راهظإ متٌس ؾٌك ددحت Normal وأ
Hidden وأ Minimized وأ Maximized
 WorkingDirectory هلٌؽشت متٌس يذلا قٌبطتلاب صاخلا لمعلا دلجم راسم نمضتت ةٌصن ةلسلس ًهو
ةبفلا صباصخ ًقاب ىلع علطلا كنكمٌو ProcessStartInfo ةبتكم نم MSDN عقوم نم وأ وٌدوتس لوجٌف عم ةقفرملا MSDN صاخلا
تفوسوركٌامب
َاذخزعا ProcessStartInfo غِ Process.Start ب١ٍّػ
ةٌصاخلا هٌف ددحن يذلا ًلاتلا دوكلا مادختسا اننكمٌ ةعباطلا ىلإ لثم ًصن دنتسم ةعابطل FileName ناكم ًف دجاوتم ًصن ؾلم مسا ىلإ
ةٌصاخلا ددحنو صرقلا ىلع ام Verb ةمٌقلا ىلإ Print ًعدتسن مث Process.Start
Dim Psi As New ProcessStartInfo
With Psi
.FileName = "D:\Temp\UNTITLED.TXT"
.Verb = "print"
End With
Process.Start(Psi)
فٌٍّا ازٙت حطثذشٌّا ياّػلا ساٙظلٚ
For Each ve In Psi.Verbs
MsgBox(ve.ToString)
Next
ح١طاخٌا حّ١ل ش١غٔ ٗرػاثط ٓػ اضٛػ فٌٍّا حرفٌٚ Verb ٌٝإ كتاسٌا دٛىٌا ٟف Open اّو
ٍٟ٠
Dim Psi As New ProcessStartInfo
With Psi
.FileName = "D:\Temp\UNTITLED.TXT"
.verb = "open"
End With
Process.Start(Psi)
دٛىٌا َذخرسٔ ش١ثىرٌا غضٚ ٟف جشىفٌّا جزفأ ًؼظٚ جشىفٌّا َاذخرسات ٟظٔ فٍِ حرفٌٚ
ٌٟارٌا
Dim Psi As New ProcessStartInfo
With Psi
.FileName = "Notepad.exe"
.Arguments = "D:\Temp\UNTITLED.TXT"
.WindowStyle = ProcessWindowStyle.Maximized
End With
98

Process.Start(Psi)
قٌبطتلل يذٌفنتلا ؾلملا مسا انددح ثٌح – انه ةركفملا – ةٌصاخلا ًف FileName ةٌصاخلا ًف هحتف دٌرن يذلا ؾلملا مسا انددحو
Arguments ةٌصاخلا ًف همسا روكذملا قٌبطتلل رماولا رطس تاددحمب ةصاخلا FileName ًف اهلٌؽشت متٌ نأ بجٌ ةركفملا نأ انددح مث
ةٌصاخلا طبضب كلذو ىصقلا دحلل ةذفانلا رٌبكت عضو WindowStyle ةمٌقلا ىلإ ProcessWindowStyle.Maximized ءدبب انمق مث
قٌبطتلا – ةركفملا – ةفٌظولا ءاعدتساب كلذو Process.Start وه ادٌحو اددحم اهل اررمم Psi عونلا نم هانفرع يذلا ProcessStartInfo
لوح شاقن ةوخلا دحأ نٌبو ًنٌب راد دقف انه ةدراولا تامولعملا مادختساب ةلوهسب هحرش نكمٌ نكلو لٌلق ادقعم ودبٌ دق رخآ لاثم ًلٌ امٌفو
رملا مادختساب وه لحلا ناكو رٌوطتلا ةبٌب ىلع دامتعلا نود عورشملل يذٌفنتلا ؾلملا ءانب MSBuild اذهو كروومٌرفلا عم ًتؤٌ يذلا
وه اذهو اهباهتنإ دعب ءانبلا ةٌلمع ةجٌتن ؾلم راهظإب موقن مث ًفخم لكشب ذٌفنتلاب موقن نأ دٌرنو لٌؽشتلا ءدب تاددحم نم دٌدعلا هل رملا
ةٌبرعلا ةؽللاب تاقٌلعتلا ضعبب امعدم دوكلا
' ةٍظ ذٍعِ صٚذٕ٠ٌٛا
Dim windir = System.Environment.ExpandEnvironmentVariables("%SYSTEMROOT%")

' ذ٠ذحذ ش١غرِ خاٍِٛؼِ ءذت ً١غشذ ح١ٍّؼٌا
Dim pri As New ProcessStartInfo
With pri
' ذ٠ذحذ ذٍعِ ًّؼٌا
.WorkingDirectory = "D:\Temp\DisksArchive"
' ذ٠ذحذ شِلا ٞزٌا دٛٔ ٖز١فٕذ
.FileName = windir & "\Microsoft.NET\Framework\v3.5\MSBuild.exe"
' ذ٠ذحذ خادذحِ شطس شِاٚلا ِٓ ءاشٔإ فٍِ حع١رٌٕات ذ٠ذحذٚ ُسا عٚششٌّا ٞزٌا ُررس ٗرّظشذ
.Arguments = "/l:FileLogger,Microsoft.Build.Engine;logfile=ActivityLog.txt DisksArchive.sln"
' ذ٠ذحذ ْأ جزفأ ً١غشرٌا ْٛىرس ح١فخِ ٟو ٜش٠ل َذخرسٌّا جزفأ يٛسٔٛىٌا
.WindowStyle = ProcessWindowStyle.Hidden
End With
' ءذت ً١غشذ ح١ٍّؼٌا
Dim pr = Process.Start(pri)
' ساظرٔا ح١ٍّؼٌا ٝرح ًّرى٠ ا٘ز١فٕذ ضشخذٚ
pr.WaitForExit()
' ش١١غذ خادذحٌّا ٟو شٙظٔ فٍِ طئارٌٕا
With pri
' ذ٠ذحذ ْأ طِأشثٌا ٞزٌا زفٕ١س ٛ٘ جشىفٌّا
.FileName = Environment.SystemDirectory & "\notepad.exe"
' ذ٠ذحذ ُسا فٌٍّا ٞزٌا دٛٔ ٗحرف
.Arguments = "ActivityLog.txt"
' ذ٠ذحذ ْأ جزفإٌا ةع٠ ْأ شٙظذ غضٌٛات ٟؼ١ثطٌا
.WindowStyle = ProcessWindowStyle.Normal
End With
' ءذت ً١غشذ ح١ٍّؼٌا
Process.Start(pri)

ةفٌظولا نأ وه انه ةحورشم رٌؽلا دوكلا اذه ًف ةدٌحولا ةطقنلا Process.Start عونلا نم ةمٌق دٌعت ةٌلمعلا لٌؽشت ءدب ًف اهحاجن دنع
System.Diagnostics.Process ةبفلا صباصخ نم ةدافتسلا نم اننكمٌ رٌؽتم ًف ةمٌقلا هذه عضن ثٌح Process انمدختسا انهو ةداعملا
ةفٌظولا WaitForExit اننكمٌ امك دوكلا رطسأ ًقاب ذٌفنت ةدواعم متٌ اهدعبو جرختو ذٌفنتلا نم ةٌلمعلا ًهتنت ىتح دوكلا ذٌفنت ؾقوت ًتلا
ةبفلل ىرخلا صباصخلا نم دٌدعلا نم ةدافتسلا Process لثم ExitCode اهباهتنا دنع ةٌلمعلا نم ةداعملا ةمٌقلا دٌعت ًتلا
ًضارتفلا حفصتملا مادختساب بٌولا ىلع عقوم حتف اندرأ اذإ

مادختساب Process.start ةرشابم كلذ لمع اننكمٌ

Process.Start("www.aya.sy")

ةقٌرطبو ProcessStartInfo

Process.Start(New ProcessStartInfo("www.aya.sy"))

ببسلاو ةفٌظولا نأ كلذ ًف Process.Start ؾلم يأ لٌؽشت اهنكمٌ ثٌحب ةٌكذ - لثم دروو ةقٌثو جمانربلا مادختساب تنرتنا عقوم ناونع وأ
ةرشابم هب طبترملا ًضارتفلا ًكلف ؾلم حتفب موقن docx ًضارتفلا جمانربلا مادختساب لثم ةطبترملا هذه ًف وهو هب ةلاحلا Word 2007
هل لماكلا راسملا عم ؾلملا مسا ررمن نأ ًفكٌ

Process.Start("C:\Users\SamerSelo\Documents\حػٕٛرِ قاثطأ.docx")
99


اذإ لثم ام دٌربل ًنورتكلا دٌرب لاسرإ اندرأ info@aya.sy مادختساب اضٌأ كلذ لمع اننكمٌ Process.Start دٌربلا ررحم انل حتفٌ يذلا
ناونع رٌرمت دنع ًضارتفلا ًنورتكللا لاثم ةفٌظولا كلتل ًنورتكللا دٌربلا

Process.Start("mailto:info@aya.sy")


100

ٟف داٛطلا VB .net


وٌدوتس لوجٌف لبق 2005 تاوصلا طسبأ ةفاضإ ةٌلمع تناك تابفلا نم ةلباه ةعومجم ةفاضإ تمت نكلو ام اعون اٌدحت ربتعت كجمانرب ىلإ
تلاجمو كروومٌرفلا ًف ءامسلا 2 اهضعبو كدعاسٌس ىلع ةرظنب موقأ ؾوسو كلذ لمع ًف لاجملا System.Media عوضوملا اذه ًف
قلطل ةرفاصلا توص beep جاتحنس ةبفلا مادختسل SystemSounds ةماع صباصخ سمخ اهل ًتلاو Asterisk, Beep,
Exclamation, Hand, Question لك ضرعب موقٌ صباصخلا هذه نم ضرؼ object دوعٌ ىلإ SystemSounds ةٌبارجإ ضرعٌو
Play توص لٌؽشتلو توصلا كلذ ردصٌ رتوٌبمكلا لعجل beep صاخلا مدختسن ماظنلاب
System.Media.SystemSounds.Beep.Play

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

System.Media.SystemSounds.Exclamation.Play()
MessageBox.Show("Visual Basic!", "Advanced Basics", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

تاوصلا لٌؽشت دٌزملا كانه نكلو ادٌفم ودبٌ ؾ ًفف رثكأ ةدقعم تاوصأ ضرع دٌرت امدنع System.Media ةبفلا دجتس SoundPlayer
ؾلم لٌؽشتب موقت ًتلا WAV ةفلتخم نكامأ نم كلذو نمض ةنمضم رداصم ىتح وأ تنرتنإ عقوم وأ بلصلا صرقلا ىلع ؾلمك exe
جمانربلا . لوأو موقت تنك اذإف ؾلملا لٌمحت ًه اهب موقت ةوطخ عقوم نم وأ ؾلم نم هلٌؽشتب امدنع امأ لوأ هلٌمحتب ماٌقلا كٌلع بجٌ تنرتنا
ةنمضم رداصم نم هلٌؽشت دٌرت مقت مل نإ كنع ةباٌنلاب هلٌمحتب موقتس لٌؽشتلا ةٌبارجإف هلٌمحتب لوأ نوكٌ اذهبو لاجم كٌدل رٌبك ةنورملا نم
نمازتملا رٌؼ وأ نمازتملا لٌؽشتلل .
ؾ دٌرت امدنع ؾلم لٌؽشت wav لٌؽشت تقوب لٌمحتلا لامتكا نامض عٌطتست لو لٌؽشتلا تقول بٌرق تقوب ءارجلا play كٌلع بجٌ اهدنع
نمازتملا لٌؽشتلا راٌتخا ؾوس كنأ وه هتبٌسو راسملا كلذ ًف قٌبطتلا ذٌفنت لامكتسا عنمت thread لٌمحتلا ءاهتنا ىتح لٌؽشتلاو رٌؼ
لثم تنرتنا ناونع لثم اطب ردصم نم لٌمحتلاب موقت امدنع ةصاخ لاعف نمازتملا لٌمحتلا مادختسا كٌلع بجٌ اهدنع ام اعون رٌبك ؾلملاو
نمازتم رٌؽلا يذلا متٌ ؾوسو ؾلملا لٌمحتب هٌف موقٌ يذلا تقولا سفنب ذٌفنتلا لامكتساب كجمانربل حمسٌس كملعإ قلطإب لٌمحتلا ءاهتناب
ثدحلا LoadCompleted ةلاح ًف كلذو كتبؼر ةٌصاخلا مادختسا كنكمٌ كلذ ىلإ ةفاضلاب رخآ لمع يأ ءارجإ وأ ةٌفاضإ ةجلاعم ءارجإب
IsLoadCompleted نأ نكمٌو لٌمحتلا ةلاح نم ققحتلل تقو يأ ًف ًف كدوك ودبٌ ًلاتلا دوكلاك نمازتم رٌؽلا لٌمحتلا ةلاح

Dim Player As New SoundPlayer
Player.SoundLocation = "C:\Program Files\Messenger\newemail.Wav"
Player.LoadAsync()

ؾلم لٌؽشتل زهاج تنأ نلا wav راٌخلا كٌدل اضٌأ انهو لٌمحتلاك امامت نمازتم رٌؽلا وأ نمازتملا لٌؽشتلاب . ربجٌ نمازتملا لٌؽشتلاف
مدختسم عامتسلا ىلع كقٌبطت رطضت نلو هذٌفنت راسم قٌبطتلا لمكٌ نأ لبق لماك ؾلملل تقولا كلذ ًف مدختسم وأ دوكل لخدت يأ ربع قلقلل
وأ ةٌناث كفلم لوط نوكٌ امدنعف ةلكشم كلذ لكشٌ نل نٌتنثا قٌبطتلل اقانتخا ببسٌس كلذ نم لوطأ نمز يأ نكلو ًف مدختسملا ككشٌ ؾوسو
عقاولا ًفو قٌبطتلا ىودج ءارجلا SoundPlayer.Play موقٌس لكشب ؾلملا لٌؽشتب ل ىتح نمازتم رٌؼ كجمانرب ذٌفنت قٌعٌ

Dim Player As New SoundPlayer
Player.SoundLocation = "C:\Program Files\Messenger\newemail.Wav"
Player.LoadAsync()
If Player.IsLoadCompleted Then Player.Play()

لٌؽشتلا ًف تبؼر اذإو ءارجلا ءاعدتسل رطضتس نمازتملا SoundPlayer.PlaySync جمانرب ذٌفنت اطبٌس اذه نكلو ءانثأ رٌبك لكشب
ًف تبؼر اذإو ؾلملا لٌؽشت موقٌ ىتح ؾلملا لٌؽشت رمتسٌ نأ اهدنع ةنٌعم ةٌجمرب ةٌلمع نم ًهتنت ىتح وأ ام رز طؽضب مدختسملا
ةٌبارجلا ًعدتستس PlayLooping لٌؽشتب كروومٌرفلا موقتسف نمازتم رٌؼ لكشب رمتسم لكشب ؾلملا ءاعدتساب موقت ىتح ةٌبارجلا
101

SoundPlayer.Stop ىلع ةرظن ءاقلإب انمق اذإو لاجملا My نمض دوجوم نلا ىتح هتشقانم تمت ام عٌمج نأ دجنس كروومٌرفلا ًف
My.Computer.Audio مادختسا كنكمٌ ؾلم لٌؽشتلف

My.Computer.Audio.Play("C:\Program Files\Messenger\newemail.Wav")

لو ءاشنإ لوح قلقلل ةجاح ضرؼ object ـل SoundPlayer ؾلم وأ تنرتنإ راسم نم لٌمحتلا وأ ... خلا
ةٌفٌك ملعت ىلإ ةفاضلاب ؟لكشلا اذهب رثكأ دوك ةباتكب انمق اذامل اذإ ةبفلا عم لمعلل جاتحت ؾوس كروومٌرفلا نمض كلذ ءارجإ
SoundPlayer جاتحتس تنك اذإ عم لماعتلل ةبفلا كلت اهقلطت ًتلا ةثلثلا ثادحلا نم يأ
ثدحلا لوأ LoadCompleted ؾلملل نمازتم رٌؽلا لٌمحتلا ةٌاهن ًف قلطٌ ؾوس اقباس هانركذ يذلا وأ تنرتنا ناونع نم لمحت تنك اذإف
ثدحلا اذه هنا دجتس ؾلم هطاقتلل ادج ماه نم ققحتت ؾوسو تاددحم حاجنب لٌمحتلا لامتكا نم ققحتلل ثدحلا

Private Sub Player_LoadCompleted(ByVal sender As Object, _
ByVal e As ComponentModel.AsyncCompletedEventArgs) _
Handles Player.LoadCompleted
If e.Error IsNot Nothing Then
' Handle error
isLoaded = False
Else
isLoaded = True
End If
End Sub

ثدحلا و SoundLocationChanged طبر متٌ امدنع هقلطإ متٌ ؾوس ـل دٌدج ًتوص ردصم SoundPlayer اهدنع ًك بؼرت امب موقت
رٌؼ لكشب دٌدجلا ؾلملا لٌمحتك كقٌبطت هجاتحٌ رخآ لمع يؤب ماٌقلا وأ ًلاحلا ؾلملا لٌؽشت ؾاقٌإ وأ نمازتم وه ماهلا رٌخلا ثدحلاو
StreamChanged لكشب دٌفم هنكلو قباسلا ثدحلل هباشم وهو صرقلا ىلع ؾلم وأ ةركاذلا نم ؾلملا لٌمحتب موقت امدنع صاخ
MemoryStream or FileStream ؾلم لٌؽشت نم رثكؤب ماٌقلا ًف تبؼر اذإو wav جراخ جورخلل رطضتس اهدنع دحأو كروومٌرفلا
ىلإ ءوجللا وه تاراٌخلا Windows Media Player لٌمحتبو Windows Media Player SDK تفوسوركٌام عقوم نم اناجم كنكمٌ
ؾلم ةؽٌص يأ ابٌرقت لٌؽشت اهدنع سب ةٌنببو ي لاجملـل ةهباشم ةط System.Media عم لماعتلا نأ دجتس Windows Media Player
لثمف ةٌاؽلل لهس ةطساوب هلٌؽشت نكمٌ ؾلم يأ لٌؽشتل ًلاتلاب هٌبش دوك مادختسا كنكمٌ Windows Media Player بٌصنت دعب كلذو
كجمانرب ًف اهل بسانملا عجرملا ةفاضإو ةروكذملا ةبتكملا

Dim WMP As New WMPLib.WindowsMediaPlayer
WMP.URL = "C:\My Music\Funky Cold Medina.wma"
WMP.controls.play()

ىلإ تاوصلا ةفاضل قرط ةثلث نلا كٌدل حبصأ دٌدجلا ءامسلا لاجم مادختساب ىلولا كجمانرب System.Media نم مادختسا وأ
لاجملا MY كٌزٌاب لوجٌفب صاخلا دٌدجلا تافلم لٌؽشت لجأ نم WAV مادختسا وأ Windows Media Player ػٌص عاونأ عٌمج معدل
تافلملا


102

يبخدئ طاشخئٚ صاشللا خٍثبمٌا عضٌٍٕ ب١غِشث Eject/Load Removable Media

ًلاتلا دوكلا مادختساب كلذ نكمٌ
Public Module EjectLoadRemovable

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" _
(ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, _
ByVal dwShareMode As Integer, ByRef lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes _
As Integer, ByVal hTemplateFile As Integer) As Integer

Private Declare Function DeviceIoControl Lib "kernel32" (ByVal hDevice As _
Integer, ByVal dwIoControlCode As Integer, ByRef lpInBuffer As Object, _
ByVal nInBufferSize As Integer, ByRef lpOutBuffer As Object, ByVal _
nOutBufferSize As Integer, ByRef lpBytesReturned As Integer, ByRef _
lpOverlapped As Object) As Integer

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject _
As Integer) As Integer

Private Const INVALID_HANDLE_VALUE As Short = -1
Private Const OPEN_EXISTING As Short = 3
Private Const FILE_FLAG_DELETE_ON_CLOSE As Integer = 67108864
Private Const GENERIC_READ As Integer = &H80000000
Private Const GENERIC_WRITE As Integer = &H40000000
Private Const IOCTL_STORAGE_EJECT_MEDIA As Integer = 2967560
Private Const IOCTL_STORAGE_LOAD_MEDIA As Integer = 2967564
Private Const IOCTL_STORAGE_LOAD_MEDIA2 As Integer = 2951180
Private Const VWIN32_DIOC_DOS_IOCTL As Short = 1

' To Eject Removable media just pass the drive letter to the sub
Public Sub EjectRemovable(ByVal EjectDrive As String)
Dim hDrive, DummyReturnedBytes As Integer
Dim DriveLetterAndColon As String

'Make it all caps for easy interpretation
DriveLetterAndColon = UCase(Left(EjectDrive & ":", 2))
hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or _
GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)

If hDrive <> INVALID_HANDLE_VALUE Then
'Eject media!
Call DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, _
0, DummyReturnedBytes, 0)

Call CloseHandle(hDrive) 'Clean up after ourselves
End If

End Sub

' To Load Removable media just pass the drive letter to the sub
Public Sub LoadRemovable(ByVal EjectDrive As String)
Dim hDrive, DummyReturnedBytes As Integer
103

Dim DriveLetterAndColon As String

'Make it all caps for easy interpretation
DriveLetterAndColon = UCase(Left(EjectDrive & ":", 2))
hDrive = CreateFile("\\.\" & DriveLetterAndColon, GENERIC_READ Or _
GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)

If hDrive <> INVALID_HANDLE_VALUE Then
'Eject media!
Call DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, _
0, DummyReturnedBytes, 0)

Call CloseHandle(hDrive) 'Clean up after ourselves
End If
End Sub

End Module

َاذخرسلا ٓػ ياصِ از٘ٚ
EjectRemovable("h:\")

LoadRemovable("h:\")

َاذخرسات ٜشخأ حم٠شط ٖز٘ٚ mciSendString

Module EjectLoadUsingMCI

<DllImport("winmm", EntryPoint:="mciSendStringA")> _
Private Sub mciSendString(ByVal lpszCommand As String, _
ByVal lpszReturnString As String, ByVal cchReturnLength As Integer, _
ByVal hwndCallback As Integer)

End Sub

Public Sub OpenCDDoor(ByVal Drive As String)
mciSendString("open cdaudio!" & Drive, "", 0, 0)
mciSendString("Set " & Drive & " door open wait", "", 0, 0)
End Sub

Public Sub CloseCDDoor(ByVal drive As String)
mciSendString("open cdaudio!" & drive, "", 0, 0)
mciSendString("Set " & drive & " door closed wait", "", 0, 0)
End Sub

End Module

عزنلل ةلباقلا صارقلا عاونأ عٌمجل ةحلاص اهنؤب ةٌناثلا نع ىلولا ةقٌرطلا زٌمتت نكلو Removable صارقلل ةحلاص ةٌناثلا ةقٌرطلا امنٌب
عونلا نم CDRom ةقٌرطلا سفن مادختساب لإ ةقاوسلا باب قلؼإو حتف اٌجمرب كناكمإب دوعٌ ل ةٌناثلا ةقٌرطلا مادختسا دنع هنأ امك طقف
زاهجلا علقإ دٌعت ىتح

104

دبفٌٍّا َبظٔ خجلاشِ - ُىحزٌا FileSystemWatcher


ةادلا كل رفوت FileSystemWatcher اهلخادب اش يأ لصحٌ امدنع تاهٌبنت ىلع لصحت ثٌحب تادلجم ةرجش وأ دلجم ةبقارم ةٌناكمإ
نم دٌدعلا ًف ةدباف تاذ ةادلا هذه ربتعت ثٌح ام دلجم صباصخ رٌؽتت امدنع وأ ؾلم وأ دلجم ةٌمست ةداعإ وأ ؾذح وأ ءاشنإ متٌ امدنع لثمف
علطتسا كٌلع بجوتٌس ةادلا هذه نودبف نٌعم دلجم ًف اهنٌزخت متٌ امدنع اٌلآ تافلملا رٌفشتب موقٌ جمانرب لمعب موقت تنك اذإف ؾورظلا
ةددحم ةٌنمز تارتف ىلع دلجملا كلذ – ـلا مادختساب ةداع Timer – رملا اذه كٌلع لهست ةادلا هذه نكلو . ةدٌفم ةادلا هذه نوكت نأ نكممو
رٌٌؽتب رخآ جمانرب ماق اذإ ةركاذلا ًف هلٌمحت ةداعل جاتحت كنكلو ةعرسب هٌلإ لوصولا لٌهستل ةركاذلا ًف تاناٌب ؾلم نٌزختب موقت امدنع
هتاٌوتحم .

ُىحزٌا ف٠شؼر FileSystemWatcher
مكحتلا ءاشنإ كنكمٌ FileSystemWatcher نم جذومنلا ىلإ تاودلا طٌرش نم اهبحسب وأ دوكلا قٌرط نع امإ نٌتقٌرط ىدحإب
ةلوهسب متٌ دوكلا قٌرط نع هإاشنإو اهلضفت ةقٌرط يأ مادختسا كنكمٌف امهنٌب ءادلا ًف ؾلتخا يأ دجوٌ لو جذامنلا ممصم للخ

' Use WithEvents to be able to trap events from this object.
Dim WithEvents fsw As New FileSystemWatcher()

صباصخلا ؾٌرعت لوأ كٌلع رصنعلا اذهل كمادختسا لبق Path و IncludeSubdirectories و Filter و NotifyFilter
ةٌصاخلاف Path هصباصخ ىلع تارٌٌؽتلاب سٌلو دلجملا لخاد تارٌٌؽتلاب كملعإ متٌس هنأ ظحل هتبقارمب بؼرت يذلا دلجملا راسم ددحت
ةٌصاخلاو IncludeSubdirectories ىلإ اهطبض بجٌ False ىلإ وأ طقف دلجملا كلذ لخاد تارٌٌؽتلاب كملعإب بؼرت تنك اذإ True اذإ
ةٌصاخلاب ددحملا دلجملا وه اهرذج نوكٌ ثٌحب دلجملا ةرجشل لماك ةبقارمب بؼرت تنك Path
ةٌصاخلاو Filter مادختساف كمهت ًتلا تافلملا ًه ام دٌدحت نم كنكمت *.* مادختسا امنٌب تافلملا عٌمج بقارت كلعجٌ *.txt بقارت كلعجٌ
ةقحللا كلمت ًتلا تافلملا txt ًه ةٌصاخلا هذهل ةٌضارتفلا ةمٌقلاو طقف Null قباطت ًهو *.*
ةٌصاخلاو NotifyFilter تبلا ىوتسم ىلع ةزمرم bit-coded ةمقرم مٌق نم رثكأ وأ دحاو نم ةلٌكشت دٌدحت كنكمٌ ثٌحب
enumerated ـك Attributes و CreationTime و DirectoryName و FileName و LastAccess و LastWrite و
Security و Size ًه اهل ةٌضارتفلا ةمٌقلا و LastWrite Or FileName Or DirectoryName تاهٌبنت ىقلتت نل ةلاحلا هذه ًفف
صباصخلا رٌؽتت امدنع
مكحت ؾٌرعت ةٌفٌك نع لاثم كٌلإو FileSystemWatcher دلجملا ةرجش ًف تارٌٌؽتلا لجأ نم C:\Windows

Dim WithEvents fsw As New FileSystemWatcher()

fsw.Path = "c:\windows"
fsw.IncludeSubdirectories = True ' Watch subdirectories.
fsw.Filter = "*.dll" ' Watch only DLL files.
' Add attribute changes to the list of changes that can fire events.
fsw.NotifyFilter = fsw.NotifyFilter Or NotifyFilters.Attributes
' Enable event notification.
fsw.EnableRaisingEvents = True

دبٙ١جٕزٌا ٍٝػ يٛظحٌا
اهٌبنتلا ىلع لصحتس ةحٌحص ةروصب رصنعلا اذه تفرع دق نوكت نأ دعب ت ةجلاعمب كلذ لٌعفت كنكمٌ ثٌح اش يأ ثودح روف
ةقٌرطلا مادختساب وأ ثادحلا WaitForChange
105


نم تاهٌبنتلا ىلع لوصحلل ةقٌرط طسبأو FileSystemWatcher ثادحلا هذه نكلو رصنعلا اذهب ةصاخلا ثادحلل تاجلاعم ةباتكب ًه
ةٌصاخلا طبضب موقت ىتح قلطنت نل EnableRaisingEvents ىلإ True ثادحلا لبقتست و Created و Deleted و Changed ددحملا
FileSystemEventArgs ناتماه ناتٌصاخ ضرعٌ يذلا Name و ثدحلا هٌلع عقو يذلا ؾلملا مسا FullPath لماكلا ؾلملا كلذ راسم

Private Sub fsw_Created(ByVal sender As Object, _
ByVal e As FileSystemEventArgs) Handles fsw.Created
Console.WriteLine("File created: {0}", e.FullPath)
End Sub

Private Sub fsw_Deleted(ByVal sender As Object, _
ByVal e As FileSystemEventArgs) Handles fsw.Deleted
Console.WriteLine("File deleted: {0}", e.FullPath)
End Sub

Private Sub fsw_Changed(ByVal sender As Object, _
ByVal e As FileSystemEventArgs) Handles fsw.Changed
Console.WriteLine("File changed: {0}", e.FullPath)
End Sub

ددحملا FileSystemEventArgs ةٌصاخ اضٌأ ضرعٌ ChangeType ةمقرم ةٌصاخ ًهو Enumerated يذلا ثدحلاب كربخت ثٌح
ةقباسلا ةثلثلا ثادحلل دٌحو ةجلاعم ءارجإ لمعل اهمادختسا كنكمٌ ثٌحب ؾلملا ىلع عقو

Private Sub fsw_All(ByVal sender As Object, ByVal e As FileSystemEventArgs) _
Handles fsw.Changed, fsw.Created, fsw.Deleted
Console.WriteLine("File changed: {0} ({1})", e.FullPath, e.ChangeType)
End Sub

ثدحلا Changed ثدحلاو ثدحلا قلطأ يذلا رٌٌؽتلا عون لوح تامولعم ةٌأ لبقتسٌ ل Renamed ددحملا لبقتسٌ
RenamedEventArgs امه ناتٌفاضإ ناتٌصاخ ضرعٌ يذلا OldName و مٌدقلا مسلا OldFullPath مٌدقلا لماكلا راسملا

Private Sub fsw_Renamed(ByVal sender As Object, ByVal e As RenamedEventArgs) _
Handles fsw.Renamed
Console.WriteLine("File renamed: {0} => {1}", e.OldFullPath, e.FullPath)
End Sub

نم رثكأ كٌدل نوكٌ نأ نكمٌو FileSystemWatcher كلذ دنعو دحاو ثدح ةجلاعم ءارجإ سفنب اعٌمج مهثادحأ ةجلاعم كنكمٌ دحاو
لولا ددحملا مادختسا كنكمٌ sender يأ ةفرعمل FileSystemWatcher ثدحلا قلطأ .
قلطٌ FileSystemWatcher تفذح اذإ لاثملا لٌبس ىلعف ام ؾلم ىلع عقٌ ثدح لكل لقتسم ثدح 10 ىقلتتس تافلم 10 ثٌحب ثادحأ
لقنب تمق نإ كلذكو هب صاخلا ثدحلا ؾلم لكل نوكٌ 10 ىقلتتس رخل دلجم نم تافلم 10 و ؾذح ثادحأ 10 ءاشنإ ثادحأ

خم٠شطٌا WaitForChanged
راسم نم تافلملا تارٌٌؽت ةبقارمب موقت كنأ وأ نٌعم دلجم ًف تارٌٌؽتلا راظتنا ىوس اش يأ لمعب موقٌ ل كجمانرب ناك اذإ
يوناث Secondary Thread ةقٌرطلا مادختساب ةٌلعاف رثكأو طسبأ دوك ةباتك كنكمٌ WaitForChanged ةنمازتم ًهو Synchronous
ددحملا تقولا ًهتنٌ وأ ام رٌٌؽت ثدحٌ ىتح دوعت ل اهنأ يأ timeout بٌكرتلا ربع ةجٌتنلا جمانربلا لبقتسٌ ةقٌرطلا هذه دوعت امدنعو
WaitForChangedResult Structure قلعتملا ؾلملا مساو عقو دق ام ثدح نأ وأ ةدملا تهتنا اذإ امٌف دٌدحت نم هصباصخ كنكمت يذلا
ثدحلاب

106

' Create a *new* FileSystemWatcher component with values from
' the txtPath and txtFilter controls.
Dim tmpFsw As New FileSystemWatcher(txtPath.Text, txtFilter.Text)
' Wait max 10 seconds for any file event.
Dim res As WaitForChangedResult = tmpFsw.WaitForChanged(WatcherChangeTypes.All, 10000)

' Check whether the operation timed out.
If res.TimedOut Then
Console.WriteLine("10 seconds have elapsed without an event")
Else
Console.WriteLine("Event: {0} ({1}), res.Name, res.ChangeType.ToString())
End If

ةقٌرطلا WaitForChanged ةٌصاخلا لهاجتتو هٌلإ راشملا دلجملا ًف تارٌٌؽتلا طقف بقارت IncludeSubDirectories ببسلا اذهلو
بٌكرتلاف WaitForChangedResult Structure لقح دٌعٌ Name لقحلا دٌعٌ لو طقف FullPath ىلإ هرٌرمتب موقت يذلا لولا ددحملاو
ةقٌرطلا WaitForChanged اهضارتعا دٌرت ًتلا ةٌلمعلا عون دٌدحت نم كنكمٌ

' Pause the application until the c:\temp\temp.dat file is deleted.
tmpFsw = New FileSystemWatcher("c:\temp", "temp.dat")
tmpFsw.WaitForChanged(WatcherChangeTypes.Deleted)

Buffer Overflows
رصنعلاف ةرٌصق ةرتف للخ ثادحلا نم دٌدعلا قلطنا ةجٌتن ةلمتحملا لكاشملا كاردإ كٌلع بجٌ FileSystemWatcher مدختسٌ
buffer نوكٌ ًضارتفلا عضولابو ةٌفاكلا ةعرسلاب ثادحلا كلت مٌدخت عٌطتسٌ ل جمانربلا ناك ول ىتح تافلملا ماظن لاعفأ عبتتٌل ًلخاد
ـلا مجح buffer وه 8KB ىتح نٌزخت هنكمٌو 160 ذخؤٌ ثدح لكف ثدح 16 ـل ةفاضإ تٌاب 2 تنك نإو ؾلملا مسا ًف ؾرحم لكل تٌاب
ـلا مجح ةداٌز كٌلعف رثكأ اطاشن عقوتت buffer ةٌصاخلا طبضب InternalBufferSize احٌحص اددع نوكٌ نأ بجٌ مجحلاو ربكأ ةمٌق ىلإ
Integer ماظنلا ةحفص مجحب ابورضم ) 4KB زودنٌو ةلاح ًف 2000 هلت امو ( ةٌصاخلا مادختسا كنكمٌ امك NotifyFilter ددع دٌدحتل
ثدحلا قلطت ًتلا رٌٌؽتلا تاٌلمع Changed ةٌصاخلا طبض وأ IncludeSubdirectories ىلإ False ةرجش ةبقارمل جاتحت ل تنك نإ
ةلماك دلجملا ) رصانع ةدع مادختسا كنكمٌ FileSystemWatcher تحت ةلماك ةرجشلا ةبقارمل جاتحت ل تنك نإ تادلجملا نم ددع ةبقارمل
نٌعم دلجم راسم ( ةٌصاخلا مادختسا كنكمٌ لو Filter عنمل Buffer Overflowing ـل اهتفاضإ متٌ نأ دعب اهتٌفصتب موقت اهنل Buffer
ـلا ًف ناضٌف ثدحٌ امدنعو buffer ؤطخ ثدح قلطنٌس

Private Sub fsw_Error(ByVal sender As Object, ByVal e As ErrorEventArgs) _
Handles fsw.Error
Console.WriteLine("FileSystemWatcher error: {0}", e.GetException().Message)
End Sub

ؾص ًف ثدحلا نٌزخت كنكمٌ لثمف كٌدل ثادحلا ةجلاعم ةٌجٌتارتسإ رٌٌؽت كٌلع بجٌف ثدحلا اذه ىقلتٌ كجمانرب نأ تظحل نإف
queue راسم ربع مهمٌدخت مث thread رخآ

ًوبشٌّا خغٌبؼِ
ثادحؤف ةٌضارتفلا ةلاحلا ًف FileSystemWatcher ماظنلا تاراسم ةكرب نم ذوخؤم راسم ىلع اهذٌفنت متٌ System thread
pool تامكحت نأ امبو Windows Forms تاراسملل ةنمأ تسٌل not thread safe وأ مكحت يأ ىلإ لوصولا لواحت ل نأ بجٌ كلذل
مكحتلا ثادحأ لخاد نم هسفن جذومنلا ىتح FileSystemWatcher مكحت رٌرمت كٌلعف لوبقم رٌؼ ؾرصتلا اذه تدجو نإو Windows
Forms ةٌصاخلل SynchronizingObject لاثملاك

' Use the Form object as the synchronizing object.
fsw.SynchronizingObject = Me

107

ًفو هسفن جذومنلا مدخٌ يذلا راسملا سفنب اهذٌفنت متٌ ثادحلا عٌمج نأ نم دكؤتٌ قباسلا دوكلاف Visual Studio 2005 مدختست امدنع
رصنعلا ءاشنل جذامنلا ممصم FileSystemWatcher مكحتلا مضٌ يذلا جذومنلل اٌباقلت ةٌصاخلا هذه طبض متٌ
مكحتلا عم لماعتلا دنع ةدٌفملا راكفلا ضعب ًلٌ امٌفو FileSystemWatcher همادختساب موقت امدنع اهلحل جاتحت دق ًتلا لكاشملا ضعبو
- ةٌصاخلا نوكت امدنع ثادحلا قلطإب ءدبلاب مكحتلا موقٌ Path ةٌصاخلاو ةؼراف رٌؼ EnableRaisingEvents ىلإ ةطوبضم True امك
نٌترابعلا نٌب كب ةصاخلا ةبٌهتلا رماوأ نٌمضتب جذومنلل لٌمحتلا روط للخ ثادحلا قلطإ نم هعنم كنكمٌ BeginInit و EndInit امك
اوجٌفب صاخلا جذامنلا ممصم لعفٌ ل وٌدوتس
- مادختساب ؾلم ءاشنإب موقت امدنع لثمف اهب ؾلملا ءاشنإ متٌ ًتلا ةقٌرطلا ىلع ادامتعا ؾلملل ءاشنإ ثدحأ ةدع لبقتست دق تلاحلا ضعب ًف
ةركفملا Notepad ثادحلا نم ةلسلس ظحلتس Created و Deleted و Created و Changed
- هلخاد ةدوجوملا تافلملا لوح تامولعم ىلع ظفاحٌ دلجملا نل اضٌأ بلا دلجملا ًف ًفاضإ ثدح اضٌأ دلوٌ ؾلم ًف رٌٌؽتلا
- ةٌصاخلل ةمٌقك ددحملا دلجملا ناك اذإ Path مكحتلا نإف هتٌمست ةداعإ تمت FileSystemWatcher نكلو ةحٌحص ةروصب لمعلاب رمتسٌ
عم لماعتٌ مكحتلا نأ ببسب ثدحٌ اذهو همادختسا دنع ؤطخ ىلع لصحت دق ًلاتلابو دلجملل مٌدقلا مسلا ةداعإب مكحتلا رمتسٌ ةلاحلا هذه ًف
دلجملا مسا رٌٌؽتب رٌؽتٌ ل يذلا دلجملا ضبقم
- ةٌصاخلا تناكو هتبقارم متت يذلا دلجملا نمض دلجم تؤشنأ اذإ IncludeSubdirectories ىلع ةطوبضم True دلجملا ةبقارم متتسف
اضٌأ دٌدجلا
- ةٌلمعلا لبق نم اكولمم لازٌ ام نوكٌ هنل ةرشابم ؾلملا لماك ةءارق عٌطتست ل دقف دلجملا نمض رٌبك ؾلم ءاشنإ متٌ امدنع Process ًتلا
ةقلح مادختساب ًلصلا ؾلملا ىلإ ةباتكلا ةٌامح كٌلع بجٌو ؾلملا كلذ ىلإ تاناٌبلا ةباتكب تماق Try ةلواحم كنكمٌ ؤطخ قلطإ مت نإف
ىرخأ ةٌناث ًلٌم عضب دعب ةٌلمعلا
- تافوذحملا ةلس دلجم ًف هإاشنإ متٌس ادٌدج افلم نإف دلجم ًف ؾلم ؾذحب مدختسملا موقٌ امدنع RecycleBin


108

ظِبخٌا ُغمٌا – ذٔشزٔلا



ةٌلاتلا عٌضاوملا مضٌو :
 ةفاضإ تلصو بٌو دٌربو ًنورتكلا كتذفانل
 لاصتلا تنرتنلاب اٌجمرب
 ؾٌك مدختسن My.Computer.Network عفرل لٌمحتو تافلم ًف Visual
Basic 2005
 عنم رٌٌؽت ةحفصلا ةٌضارتفلا تنرتنلل ررولبسكإ و اهرٌٌؽت اٌجمرب


109

ةادلا LinkLabel
ةفاضإ تلصو بيو ديربو ينورتكلا كتذفانل

كنكمت هذه ةادلا نم ةفاضإ تلصو بٌو كعورشمل امك كنكمٌ دٌدحت ةلصو وأ رثكأ نمض صنلا رهاظلا هٌف
 عض LinkLabel ىلع ةذفانلا ىتح موقن بٌرجتلاب
1 . طبضا ةٌصاخلا Text ـل LinkLabel ىلإ يأ ناونع عقوم لثم www.arabteam2000.com مث لقتنا ىلإ ررحم دوكلا ًفو
ةٌصاخلا LinkClicked مكحتلل LinkLabel بتكا دوكلا ًلاتلا ثٌح انمدختسا Process.Start ةؽٌصلاب
Process.Start (String) ًتلا موقت لٌؽشتب جمانرب وأ ةقٌثو بسح ةلسلسلا ةٌصنلا ةررمملا اهل حتفل عقوملا دارملا

Process.Start(Me.LinkLabel1.Text)
2 . دٌدحتلو ةلصو لاسرل دٌرب ًنورتكلا طبضا ةٌصاخلا Text ىلإ يأ ناونع دٌرب ًنورتكلا دٌرت لثم
someone@yahoo.com لدعو دوكلا قباسلا ىلإ

Process.Start("mailto:" & Me.LinkLabel1.Text)
3 . امك نكمٌ ةفاضإ دٌدعلا نم تلصولا ًف سفن مكحتلا كلذو لعجب ناتمٌقلا Start و Length نٌتطبترملا ةٌصاخلاب LinkArea
ىلإ رفصلا ةفاضإو تلصولا ىلإ ةٌصاخلا Links ثٌح اٌجمرب مدختسن ةقٌرطلا Add ةٌصاخلل Links مكحتلل LinkLabel
ةفاضل تلصولا مكحتلل ثٌح كلمت ةقٌرطلا Add ثلث قبارط Overloaded ًهو
 ةفاضإ ةلصو نم عون LinkLabel.Link

LinkLabel.Links.Add (LinkLabel.Link )
 ةفاضإ ةلصو دٌدحتب لاجم ؾراحم نم صنلا رهاظلا ًف مكحتلا

LinkLabel.Links.Add (Int32, Int32)
 ةفاضإ ةلصو دٌدحتب لاجم ؾراحم نم صنلا رهاظلا ًف مكحتلا مساك ةلصولل رٌرمتو ناونع ةلصولا رٌؽتمك Object

LinkLabel.Links.Add (Int32, Int32, Object)
4 . طبضا ةٌصاخلا text مكحتلل ىلإ Try at Yahoo or at Arab team or Email me و عض مٌقلا Start و Length
نٌتطبترملا ةٌصاخلاب LinkArea امهلك ىلإ رفصلا مث ًف ثدحلا Load جذومنلل عض دوكلا ًلاتلا ثٌح انمدختسا ةؽٌصلا
ةرٌخلا ةقٌرطلل Add

With Me.LinkLabel1
.Links.Add(7, 5, "www.yahoo.com")
.Links.Add(19, 9, "www.arabteam2000.com")
.Links.Add(32, 8, "mailto:someone@yahoo.com")
End With

5 . نلا لٌؽشتل لك ةلصو دنع رقنلا اهٌلع رٌؼ دوكلا دوجوملا نمض ثدحلا LinkClicked مكحتلل LinkLabel ىلإ

Dim Url As String = CStr(e.Link.LinkData)
Process.Start(Url)

انهو مل دعن مدختسن ةٌصاخلا Text مكحتلل امك انلعف ًف لاثملا لولا لب مدختسن صباصخ ددحملا e يذلا وه نم عونلا
LinkLabelLinkClickedEventArgs لوصحلل ىلع ناونع عقوملا وأ دٌربلا ًنورتكللا يذلا هدٌرن كلذو نم للخ ةٌصاخلا
e.Link.LinkData ًتلا ًه نم عونلا Object ثٌح موقن اهلٌوحتب ىلإ String لبق اهرٌرمت ةفٌظول Process.start ةمٌقك ةٌصن

110

ب١غِشث ذٔشزٔلبث يبظرلا

ذٔشزٔلبث يبظرلا ظ١عأر
خناذنا وذخزغَ ذَشزَلبث لبظرلا ظٛعأزن InternetAutodial نوكٌو زودنٌولل ًضارتفلا لاصتلا مادختساب لاصتلا سٌسؤتل كلذو
ًلاتلاك اهفٌرعت :
Private Declare Auto Function InternetAutodial Lib "wininet.dll" _
(ByVal dwFlags As Long, ByVal hwndParent As Integer) As Boolean

دذؾًهن ٍكًٚ شٛؽ dwFlags ةٌلاتلا مٌقلا ىدحإ لمحٌ نأ :
Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1
Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2
Private Const INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4
Private Const INTERNET_AUTODIAL_OVERRIDE_NET_PRESENT = 8

ةلادلا مادختسا نع لاثم اذهو :
If InternetAutodial(0, Me.Handle.ToInt32) Then
MsgBox("Internet is connected Now", MsgBoxStyle.Exclamation)
Else
MsgBox("Internet is not connected Now", MsgBoxStyle.Critical)
End If
ذٔشزٔلبث يبظرلا غطل
ٍٛزناذنا ٖذؽإ وذخزغَ ذَشزَلبث لبظرلا غطمن ( InternetAutodialHangup و InternetHangup ( ًلاتلاك امهفٌرعت نوكٌ ثٌح :
Private Declare Auto Function InternetAutodialHangup Lib "wininet.dll" _
(ByVal dwReserved As Long) As Boolean

Private Declare Auto Function InternetHangUp Lib "wininet.dll" _
(ByVal dwConnection As Long, ByVal dwReserved As Long) As Boolean

دذؾًنا ٌٕكٚ شٛؽ dwReserved رتمرابلاو رفصلل اٌواسم نٌتلادلا اتلك ًف dwConnection يذلا لاصتلا مقر لمحٌ ةٌناثلا ةلادلا ًف
هعطق دٌرن
يبظرلا ضئبظخ خفشؼِ
ةلادلا قٌرط نع تنرتنلاب ًلاحلا لاصتلا صباصخ نم دٌدعلا ةفرعم نكمٌ InternetGetConnectedStateEx اٙف٠شؼذٚ
ٌٟارٌاو ْٛى٠ :
Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" _
(ByRef lpdwFlags As Long, ByVal lpszConnectionName As String, _
ByVal dwNameLen As Integer, ByVal dwReserved As Long) As Boolean

دذؾًنأ lpdwFlags ةٌلاتلا مٌقلا نم رثكأ وأ ةدحاوب ةداعم ةمٌق لمحٌ :
Private Const INTERNET_CONNECTION_MODEM = &H1
Private Const INTERNET_CONNECTION_LAN = &H2
Private Const INTERNET_CONNECTION_PROXY = &H4
Private Const INTERNET_CONNECTION_MODEM_BUSY = &H8
Private Const INTERNET_RAS_INSTALLED = &H10
Private Const INTERNET_CONNECTION_OFFLINE = &H20
Private Const INTERNET_CONNECTION_CONFIGURED = &H40

111

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

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

ListBox1.Items.Clear()
Try
Dim sConnType As String = Space(256)
Dim Ret As Long

TextBox1.Text = InternetGetConnectedStateEx(Ret, sConnType, _
sConnType.Length, 0)

If Ret And INTERNET_CONNECTION_MODEM Then
ListBox1.Items.Add("MODEM")
End If
If Ret And INTERNET_CONNECTION_LAN Then
ListBox1.Items.Add("LAN")
End If
If Ret And INTERNET_CONNECTION_CONFIGURED Then
ListBox1.Items.Add("CONFIGURED")
End If
If Ret And INTERNET_CONNECTION_MODEM_BUSY Then
ListBox1.Items.Add("MODEM BUSY")
End If
If Ret And INTERNET_CONNECTION_OFFLINE Then
ListBox1.Items.Add("OFFLINE")
End If
If Ret And INTERNET_CONNECTION_PROXY Then
ListBox1.Items.Add("PROXY")
End If
If Ret And INTERNET_RAS_INSTALLED Then
ListBox1.Items.Add("RAS INSTALLED")
End If

TextBox2.Text = Hex(Ret)
TextBox3.Text = sConnType
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
ل َأ يبظرا ذعٛ٠ ً٘ خفشؼٌّ ٜشخأ خم٠شؽ
ةٌلاتلا ةٌبارجلا مادختسا كنكمٌ :
Public Function IsConnectionAvailable() As Boolean
' Returns True if connection is available
' Replace www.yoursite.com with a site that
' is guaranteed to be online - perhaps your
' corporate site, or microsoft.com
Dim objUrl As New System.Uri("http://www.yoursite.com/")
' Setup WebRequest
Dim objWebReq As System.Net.WebRequest
objWebReq = System.Net.WebRequest.Create(objUrl)
Dim objResp As System.Net.WebResponse
Try
' Attempt to get response and return True
objResp = objWebReq.GetResponse
objResp.Close()
objWebReq = Nothing
112

Return True
Catch ex As Exception
' Error, exit and return False
objResp.Close()
objWebReq = Nothing
Return False
End Try
End Function

113

َذخزغٔ ف١و My.Computer.Network ٟف دبفٍِ ً١ّحرٚ غفشٌ Visual Basic
2005

ضعِٛ
مادختسا ةٌفٌك ملعت My.Computer.Network كٌزٌاب لوجٌف ًف ةكبش نمض تافلملا لٌمحتو عفرل 2005 . لاثملا اذهو
موقٌ ؾٌك كٌرٌ تاوطخلاب دوك لاثم ىلع يوتحٌ My.Computer.Network تامهملا هذهب
ُ٠ذمر
مادختسا ةٌفٌك ؾصٌ لاقملا اذه My.Computer.Network كٌزٌاب لوجٌف مادختساب ةكبش ربع تافلملا لٌمحتو عفرل
2005 لوجٌف قٌبطت ًف ةٌلاتلا قبارطلا مدختستس كلذ لمعلو ًلحملا رتوٌبمكلل ةدٌعب ةكبش رداصم نم تافلملا لقن كنكمٌ همادختسابو
كٌزٌاب :
 My.Computer.Network.DownloadFile ىلع ددحملا عقوملا ًف ددحملا ناكملا ًف هظفحتو دٌعب ددحم ؾلم لمحت
ًلاحلا رتوٌبمكلا
 My.Computer.Network.UploadFile ددحم ؾٌضم ناونع ىلإ ًلحملا رتوٌبمكلا نم ددحم ؾلم لسرت

خم٠شطٌا َاذخزعا My.Computer.Network.DownloadFile دبفٌٍّا ً١ّحزٌ

Try
'' Without Progress
' My.Computer.Network.UploadFile("<LocalPath>", "<HostPath>")
My.Computer.Network.UploadFile("C:\Upload\test.txt", " \\Server\test.txt")

'' With Progress
' My.Computer.Network.UploadFile("<LocalPath>", "<HostPath>", _
' "", "", True, 500)
My.Computer.Network.UploadFile("C:\Upload\test.txt", " \\Server\test.txt", _
"", "", True, 500)

MessageBox.Show("File uploaded.")
Catch ex As Exception
MessageBox.Show("Access failed" & vbCrLf & ex.Message)
End Try

َاذخزعا My.Computer.Network.UploadFile دبفٌٍّا غفشٌ

Try
'' Without Progress
' My.Computer.Network.DownloadFile("<HostPath>", "<LocalPath>")
My.Computer.Network.DownloadFile("\\Server\test.txt", "
C:\Download\test.txt")

'' With Progress
' My.Computer.Network.DownloadFile("<HostPath>", "<LocalPath>", _
' "", "", True, 500, True)
My.Computer.Network.DownloadFile("\\Server\test.txt", "
C:\Download\test.txt", _
"", "", True, 500, True)

MessageBox.Show("File downloaded.")
Catch ex As Exception
114

MessageBox.Show("Access failed" & vbCrLf & ex.Message)
End Try

؟ً١ّحزٌا خ١ٍّؼٌ َذمر ششإِ سبٙظاث َٛمٔ ف١و
عضو كنكمٌ تافلم ةدع لٌمحتب موقت تنك اذإ max تنك اذإ امأ ةوطخ رشإملا مٌدقتب موقن ؾلم لٌمحت مت املكو تافلملا ددعب سرجوربلل
هسفن تاذ ؾلملل مدقتلا ةٌلمعل رشإم راهظإ دٌرت لٌمحتلا لجأ نمف رطسلا لدبتسا
دوك
My.Computer.Network.DownloadFile("\\Server\test.txt", " C:\Download\test.txt")

شطسٌبب
دوك
My.Computer.Network.DownloadFile("\\Server\test.txt", " C:\Download\test.txt", _
"", "", True, 500, True)

ٚ ا ًجأ ِٓ شطسٌا يذبخسا عفشٌ
دوك
My.Computer.Network.UploadFile("C:\Upload\test.txt", " \\Server\test.txt")

شطسٌبب
دوك
My.Computer.Network.UploadFile("C:\Upload\test.txt", " \\Server\test.txt", _
"", "", True, 500)


115

ب١غِشث ب٘ش١١غر ٚ سسٍٛجغوئ ذٔشزٔلٌ خ١ػاشزفلا خحفظٌا ش١١غر غِٕ

نٌكمتل ًلاتلا ءارجلا مدختسن / حفصتملل ةٌضارتفلا ةحفصلا رٌٌؽت نم مدختسملا نٌكمت مدع

Private Sub EnableDisableIEHomePageChange(ByVal EnHpCh As Boolean)
Try
Dim Key As String
Key = "HKEY_CURRENT_USER\Software\Policies\Microsoft\" _
& "Internet Explorer\Control Panel"

Dim Value As String = "HomePage"
If EnHpCh = True Then
' ٓىّ٠ ش١١غرٌا
My.Computer.Registry.SetValue(Key, Value, 0, _
Microsoft.Win32.RegistryValueKind.DWord)
Else
' ٓىّ٠ل ش١١غرٌا
My.Computer.Registry.SetValue(Key, Value, 1, _
Microsoft.Win32.RegistryValueKind.DWord)
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

ةطٌسولا ةمٌق عضوب كلذو EnHpCh ىلإ ءارجلل ةررمملا False ةٌضارتفلا ةحفصلا رٌٌؽت ةٌناكمإ ؾاقٌل و True لٌعفتل ةٌناكمإ رٌٌؽت
ةٌضارتفلا ةحفصلا لاثملا ًف امك

' ح١ضاشرفلا ححفظٌا ش١١غذ ح١ٔاىِإ فام٠ل
EnableDisableIEHomePageChange(False)

' ح١ضاشرفلا ححفظٌا ش١١غذ ح١ٔاىِإ ً١ؼفرٌ
EnableDisableIEHomePageChange(True)


ًلاتلا ءارجلا مادختساب اٌجمرب ؾشكتسملل ةٌضارتفلا ةحفصلا رٌٌؽت نكمٌ امك

Private Sub ChangeIEHomePage(ByVal NewUrl As String)
Try
Dim Key As String = "HKEY_CURRENT_USER\Software\Microsoft\" _
& "Internet Explorer\Main"

Dim Val As String = "Start Page"
My.Computer.Registry.SetValue(Key, Val, NewUrl, _
Microsoft.Win32.RegistryValueKind.String)
Catch ex As Exception
MsgBox(ex.Message)
116

End Try
End Sub

لاثم : حفصتملل ةٌضارتفلا ةحفصلا وه وهاٌ لعجل

ChangeIEHomePage("www.yahoo.com")

117

طدبغٌا ُغمٌا - خغِشث UAC بزغ١ف صٚذٕ٠ٛث صبخٌا



ةٌلاتلا عٌضاوملا مضٌو :
 UAC Security
 نٌكمت كجمانرب نم مادختسا تاٌحلص رٌدم ىلع اتسٌف
 ؾٌك موقن لعجب دحأ رارزلا ًف انجمانرب ذفنٌ رماوأ بلطتت تاٌحلص رٌدم ًف زودنٌو
اتسٌف

118

UAC Security

عاشؼزعا UAC
ةٌفاكلا تاٌحلصلا مدختسملا كلذ كلتمٌ مل نإف مدختسملا اهكلتمٌ ل تاٌحلص بلطتت لامعأ ةٌدؤت جمانربلل نكمٌ ل ماع لكشب
نم لامعأ ذٌفنت مدختسملل نكمٌ كلذ عمو اضٌأ تافلملا كلت ؾذحٌ نأ هلبق نم لؽشملا جمانربلل نكمٌ لف زودنٌولا دلجم ًف تافلم ؾذحل
اهنم عونمم هنأ ضرتفملا . نإف لمعلا مامتإ نم نكمتٌ ًكل تاٌحلصلا ضعب كلتمٌ نأ بجٌ قٌبطتلا نأ ةلٌوط ةدم ذنم نوملعٌ نوروطملاو
جمانربلا كلذ لٌؽشت مهنكمٌ تاٌحلصلا كلت نوكلتمٌ نٌذلا نومدختسملا مهدحوف تاٌحلصلا نم دٌدعلا بلطتٌ قٌبطتلا ناك . ظحلا ءوسلو
وأ ماظنلاب ةقلعتم قطانم ىلإ لوصولا وأ زودنٌولا دلجم ًف تافلم ؾذح وأ ءاشنإ ىلإ جاتحت ةٌوق لامعؤب موقت ًتلا تاقٌبطتلا نم دٌدعلا نإف
امم هلٌؽشت دنع تاٌحلصلا كلت كلتمٌ نأ بجٌ اهدنعف تاٌحلصلا كلت جاتحٌ قٌبطتلا ناك نإف ماظنلا لجسم وأ ةبٌبلا تارٌؽتم ىلع لٌدعتلا
جماربلا كلت لٌؽشت اوعٌطتسٌ ىتح ماظن رٌدم تاٌحلص كلتما نٌمدختسملا نم دٌدعلا ىلع هنأ ًنعٌ .
ناك ول ىتح ماظنلا راٌهناب ببستٌ دقف ؾرصتلا قٌبطتلا ءاسأ نإف ةٌفاضإ راطخأ عم ًتؤٌ ىوتسملا اذهب تاٌحلص عم لماعتلاو
موقٌ دقف رٌدم تاٌحلصب لخد دق نوكٌ امدنع ؤطخلا قٌرط نع ًثراك اش لمعب مدختسملا موقٌ دقف ةٌعٌبط ةروصب لمعٌ هسفن تاذ قٌبطتلا
تاٌحلصلا ىوتسم عفرب قٌبطتلل حامسلا وه ةلاحلا هذه ًف لثملا لحلا نوكٌو ماظنلا ةداعتسا لٌحتسملا نم اهعم حبصٌ ةماه تافلم ؾذحب
تاٌحلصلا هٌدل نوكٌ نلف دوكلا نم ةنٌعم ةٌبزجل هلٌؽشت دنع قٌبطتلا ؤطخا نإف ةٌوقلا ؾباظولا كلتل هتٌدؤت ءانثأ تقإم لكشب اهمدختسٌ ًتلا
ماظنلا ًف ةرمدملا ثداوحلا لامتحا نم انللق دق نوكن اذهبو مباد لكشب رٌدم تاٌحلص مدختسملل نوكٌ نلو رٌبك ررض لمعل ةٌفاكلا .
ابٌرقت اش يأ لمعب ماٌقلا نم نكمتتس اهدنع رٌدم تاٌحلص كلتمٌ مدختسمك لوخدلاب موقت امدنع اتسٌفل ةقباسلا زودنٌولا خسن ًف
ـلا نؤف اتسٌف زودنٌو ًف نكلو UAC نع ةرابع لولا نٌقش نع ةرابع كلوخد نوكٌ رٌدمك لخدت امدنعف لٌلق ةفلتخم ةقٌرطب ؾرصتٌ
مادختسا متٌ ثٌح يداع مدختسمك كلمع نوكٌ ةٌادبلا ًفف تاٌحلصلا ةفاك كلتمٌ ماظن رٌدم ًناثلاو ةدودحم تاٌحلص وذ يداع مدختسم
ـلاف ةٌفاضإ تاٌحلص ىلإ جاتحت ةٌلمعب ماٌقلا دٌرت امدنعف طقف ةجاحلا دنع ًناثلا قشلا UAC نإف ةقفاوملا كلؤسٌ راوح قودنص كل رهظٌ
ىلإ كتاٌحلص دوعت اهدنعو لمعلا كلذ ذٌفنت ًهتنٌ ىتح رٌدم ىوتسم ىلإ تقإم لكشب كتاٌحلص عفر متٌ لمعلا كلذ ذٌفنت ىلع تقفاو
تاٌحلصلا كلت بلطتٌ رمأ ذٌفنت كناكمإب لازامف رٌدم تاٌحلص كلتمٌ ل يداع مدختسم مساب تلخد دق تنك نإو ةٌناث يداع مدختسم
ـلا كل رهظٌ ثٌح ةعفترملا UAC كحنم متٌ اهدنع حاجنب رٌدمك لوخدلاب تمق نإف رٌدمك لوخدلا نم كنكمٌ يرٌذحت راوح قودنص
لمعلا كلذ ذٌفنت ًهتنٌ ىتح تقإم لكشب رٌدم تاٌحلص . ـلا نإف رٌدمك لخدت امدنعف اطٌسب نٌتلاحلا نٌب قرفلا نوكٌو UAC كتقفاوم كلؤسٌ
ـلا نإف رخآ مدختسمك تلخد نإو ةعفترملا تاٌحلصلاب لمعلا ىلع UAC رٌدملاب ةصاخلا رسلا ةملك لاخدإ كنم بلطٌ

ًعا ِٓ ُ١ّظزٌا UAC
ـلا موقٌ نل UAC اهدعب موقٌ نلو أدبٌ امدنع قٌبطتلا كلذل تاٌحلصلا دانسإب موقٌ وهف هلٌؽشت مت نأ دعب قٌبطتلا تاٌحلص عفرب
ءاطعإ بنجتلو أدبٌ امدنع تاٌحلصلا كلت ىلع لصحٌ نأ هٌلعف ةعفترم تاٌحلصب لمعلل قٌبطتلا جاتحا نإف تاٌحلصلا كلت رٌٌؽتب
لمعٌ نأ بجٌ ًسٌبرلا جمانربلاف تاٌحلصلا كلتل هجاٌتحا بسحب ءازجأ ىلإ كدوك مٌسقت كٌلع بجٌ مزللا نم رثكأ تاٌحلص قٌبطتلا
ةجاحلا دنع ةعفترم تاٌحلصب لمعت ىرخأ تاقٌبطت ذٌفنت هٌلع بجٌ اقحلو ةٌداع تاٌحلصب .
تاناٌب ةدعاق ًف تاناٌبلا ظفحب موقٌ قٌبطت انٌدل ناك نإ لثمف Sql Server ءاشنإ دارأ نإ كلذ عمو رٌدم تاٌحلصل جاتحٌ ل وهف
زودنٌولا دلجم ًف تاٌلمعلا صخلمب ؾلم – ًمحم دلجم – ءازجأ ةدع ىلإ قٌبطتلا مٌسقت اهدنع كنكمٌف رٌدم تاٌحلصل اهدنع جاتحٌسف
نم ًناثلا لٌؽشت لولا قٌبطتلل نكمٌ اهدنع ؾلملا كلذ ىلإ ةصلخلا تامولعم ةباتكب موقٌ رخآ قٌبطتو لمعلا مظعمب موقٌ ًسٌبرلا قٌبطتلاف
ؾلملا كلذ ًف تامولعملا ةباتك لجأ .
نوكت لاثملا لٌبس ىلع جماربلا نم دٌدعلاف ةعفترم تاٌحلص مادختسا بنجتل قٌبطتلا ةباتك دٌعت نأ لضفٌ ناكملاب نوكٌ امدنعو
دلجملا ًف ةبصنم Program Files دلجملا سفنب دجاوتم ؾلم ًف تامولعم نٌزخت ىلإ قٌبطتلا جاتحا نإ اذهبو ةٌمحملا تادلجملا نم اذهو
قٌبطتلا لعجب ةلكشملا هذه زواجت كنكمٌو ةٌلمعلا كلتب ماٌقلل ةٌفاضإ تاٌحلص ىلإ جاتحٌ ؾوسف قٌبطتلل يذٌفنتلا ؾلملا ىلع يوتحٌ يذلا
ًلاحلا مدختسملاب صاخلا دلجملا ًف ؾلملا كلذ بتكٌ . تادلجملا ىلإ ةباتكلا نمضتت ةعفترم تاٌحلصل جاتحت ًتلا ىرخلا تاٌلمعلاو
لثم ماظنلا لجس ًف ةٌمحملا ماسقلا لٌدعتو داتعلا عم رشابم لكشب لماعتلاو ةٌمحملا HKEY_LOCAL_MACHINE .
119

لقأ مادختسا نم قٌبطتلا نكمٌ ل تاٌحلصلا كلت بلطتت ل ىرخأو ةعفترم تاٌحلص بلطتت ماسقأ ىلإ قٌبطتلا مٌسقتو
قٌبطت ذٌفنتل ًلاتلاب هٌبش دوك مادختسا اننكمٌ لثمف حٌقنتلل لهسأ هلعجٌو كدوك ًف رطخلا مسقلا طسبٌ هنكلو بسحف ةنكمملا تاٌحلصلا
ةعفترم تاٌحلص بلطتٌ
Private Sub btnRun_Click() Handles btnRun.Click
Try
‘ Start the process.
Dim pro As System.Diagnostics.Process
pro = System.Diagnostics.Process.Start( _
txtProgram.Text, txtArguments.Text)
‘ Wait for the process to exit.
pro.WaitForExit()
‘ Display the process’s exit code.
MessageBox.Show(“Exit code: “ & pro.ExitCode)
Catch ex As System.ComponentModel.Win32Exception
‘ This happens if the user fails to elevate to Administrator.
MessageBox.Show(“Operation canceled”, _
“Canceled”, MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Try
End Sub

ةفٌظولا مدختسٌ قباسلا دوكلا System.Diagnostics.Process.Start هذٌفنت دٌرن يذلا قٌبطتلا راسم اررمم قٌبطتلا لٌؽشتل
ةلادلا مدختسٌ وهو اهب ةصاخلا رماولا رطس تاددحمو WaitForExit متٌ مث جمانربلا ذٌفنت نم ءاهتنلا ىتح رظتنت ًتلا داعملا ضرؽلا نم
ةٌصاخلا ربع دكؤتلا ExitCode ذفنملا قٌبطتلا نم ةداعملا ةمٌقلا نم .
ءارجلا ًلاتلا دوكلا لثمٌو main ىعدتسملا جمانربلا ًف
Function Main(ByVal cmdArgs() As String) As Integer
Dim frm As New frmChoices
‘ Display the arguments.
For Each str As String In cmdArgs
frm.lstArguments.Items.Add(str)
Next str
‘ Select the first item.
If frm.lstArguments.Items.Count > 0 Then
frm.lstArguments.SelectedIndex = 0
End If
‘ Return the index of the selected item.
If frm.ShowDialog() = DialogResult.Cancel Then
Return -1
Else
Return frm.lstArguments.SelectedIndex
End If
End Function
جذومن ءاشنإب قٌبطتلا أدبٌ ثٌح frmChoices ةمباقلا قودنص ىلإ رماولا رطس تاددحم ةفاضإو lstArguments راتخنو
رزلا ىلع طؽضلاب مدختسملا ماق نإف جذومنلا رهظن مث هنم لولا رصنعلا Cancel ةمٌقلا دٌعٌ قٌبطتلاف - 1 رزلا ىلع طؽض نإو OK وهف
ةٌصاخلا ةمٌق دٌعٌ Index ربع ةمٌقلا كلت لبقتسٌ قٌبطتلل ًعدتسملا دوكلاو اهنم هراٌتخا مت يذلا رصنعلل ةقفاوملاو ةمباقلا قودنص نم
ةٌصاخلا ExitCode .
ـل مدختسملا صباصخ نم ءزجكو UAC ـل ًساٌقلا عردلا ةطساوب همٌلعت متٌ نأ بجٌ ةعفترم تاٌحلص بلطتٌ لمع يؤف UAC
ةعفترم تاٌحلص بلطتٌ قٌبطت ذفنٌ هنؤب مدختسملا رٌذحتل هراهظإ بجٌ ثٌح . عردلا كلذ راهظل ةطٌسب ةقٌرط دجوت ل ًلاحلا تقولا ًفو
تلاد مدختسنس كلذل كٌزٌاب لوجٌف ًف API ةٌلاتلا دوكلا ةعطق ًف رهاظ وه امك عردلا كلذ رهظٌ رزلا لعجل
120

Imports System.Runtime.InteropServices

Module UacStuff
Declare Auto Function SendMessage Lib “user32.dll” _
(ByVal hWnd As HandleRef, ByVal msg As Int32, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Int32

‘ Make the button display the UAC shield.
Public Sub AddShieldToButton(ByVal btn As Button)
Const BCM_SETSHIELD As Int32 = & H160C
btn.FlatStyle = Windows.Forms.FlatStyle.System
SendMessage(New HandleRef(btn, btn.Handle), _
BCM_SETSHIELD, IntPtr.Zero, CType(1, IntPtr))
End Sub
End Module

ةلادلا ؾٌرعتب موقن ةٌادبلا ًفف SendMessage ةبتكملا ًف ةدجاوتملا User32.dll ءارجلا موقٌ ثٌح AddShieldToButton
ةٌصاخلا طبضب FlatStyle ىلإ رزلاب ةصاخلا System ةلادلا مدختسٌ مث SendMessage ةلاسرلا لاسرل BCM_SETSHIELD رزلا ىلإ
كلذب موقتسف رخأ مكحت ىلإ هتفاضإ تدرأ نإف رماولا رز رٌؼ ىرخأ تامكحتل عردلا ةفاضل ةقٌرط اٌلاح تفوسوركٌام انل رفوت لو
ماظنلاب ةصاخلا عردلا ةروص رٌٌؽت مت نإ رٌؽتت نل ةروصلا هذه نكلو كتامكحت ىلع ةطاسبب اهعضوو عردلل ةروص لمع كنكمٌ امك كدحول

ظِاشجٌا دب١حلط غفس
رملا راٌتخا ةطساوب هنمض قٌبطتلا ذٌفنت متٌ يذلا ىوتسملا عفر مدختسملل نكمٌ Run As Administrator ًتلا ةمباقلا نم
راوح قودنص راهظإب ماظنلا موقٌف قٌبطتلل يذٌفنتلا ؾلملا ىلع ًنٌمٌلا ةرؤفلا رزب طؽضلا دنع كل رهظت UAC موقٌ نأ دعبو صاخلا
جمربمك كنم لخدت بلطتت لو ةطٌسب ةقٌرطلا هذهو ةعفترملا تاٌحلصلا مادختساب جمانربلا ذٌفنت متٌ رٌدملا رس ةملك لاخدإب مدختسملا
امود لضفلا لحلا ًه ةركفلا هذه نوكت ل دق اذهلو ةٌفاضإ ةوطخب ماٌقلا مدختسملا نم بلطتت اهنكلو .
أدبٌ وهف مدختسملا اهمدختسٌ ًتلا ةقٌرطلا كلت هباشت ةقٌرطب ةعفترم تاٌحلص مادختساب نٌعم قٌبطت أدبٌ انقٌبطت لعج اننكمٌو
نأ عم ةعفترم تاٌحلصب رخآ قٌبطت لٌؽشتل ًلاتلاب هٌبش دوك مادختسا نكمٌ ثٌح رٌدم تاٌحلصب هلٌؽشت ماظنلا نم ابلاط قٌبطتلا لٌؽشت
هلٌؽشت ءدب دنع تاٌحلصلا كلت بلطٌ ل هتاذب قٌبطتلا كلذ
Try
‘ Use the runas verb to start the process.
Dim psi As New ProcessStartInfo
psi.Verb = “runas”
psi.UseShellExecute = True
psi.FileName = txtProgram.Text
psi.Arguments = txtArguments.Text
Dim pro As System.Diagnostics.Process
pro = System.Diagnostics.Process.Start(psi)
‘ Wait for the process to exit.
pro.WaitForExit()
‘ Display the process’s exit code.
MessageBox.Show(“Exit code: “ & pro.ExitCode)
Catch ex As System.ComponentModel.Win32Exception
‘ This happens if the user fails to elevate to Administrator.
MessageBox.Show(“Operation canceled”, _
“Canceled”, MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Try
121

ضرؽلا قباسلا دوكلا ًنبٌ ثٌح ProcessStartInfo ةٌصاخلا طبضب موقٌ ثٌح دوكلا هلؽشٌس يذلا قٌبطتلا افصاو Verb ىلإ
ةمٌقلا runas هب ةصاخلا لٌؽشتلا ءدب تاددحمو جمانربلا مسا طبضٌ امك رٌدمك هلٌؽشت متٌ نأ بجٌ قٌبطتلا نأ ماظنلل نٌبٌ ًكل .
هتاٌحلص عفر بلطٌ قٌبطتلا كلذ لعج كنكمٌ ةعفترم تاٌحلص مادختساب امود هلٌؽشت متٌ نأ بجٌ قٌبطتلا نأ ملعت تنك نإو
مادختساب كلذو هسفنب manifest ىلع اجودزم ارقن رقنا اهباشنلو قٌبطتلل يذٌفنتلا ؾلملا لخاد ةنمضم My Project ًف Solution
Explorer ةحفص ًفو Application رزلا ىلع رقنا View UAC Settings ؾلملا حتفب موقٌ يذلا app.manifest دوكلا رهظٌ ثٌح
ؾلملا كلذل ةٌبادتبلا تاٌوتحملا ًلاتلا
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"
xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-
com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC Manifest Options
If you want to change the Windows User Account Control level replace the
requestedExecutionLevel node with one of the following.

<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

If you want to utilize File and Registry Virtualization for backward
compatibility then delete the requestedExecutionLevel node.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>

نم بلطٌ قٌبطتلا لعجلو UAC رطسلا ةمٌق رٌؼ هتاٌحلص عفر requestExecutionLevel ىلإ requireAdministrator
لمعب موقت امدنع نلاو Compile يأ وأ مدختسملا موقٌ امدنعف رٌدم تاٌحلص ىلإ ةجاحب هنؤب قٌبطتلا مٌلعتب وٌدوتس لوجٌف موقٌ قٌبطتلل
ـب صاخلا راوحلا قودنص ارهظم هتاٌحلص عفر ةٌلآ ةروصب ماظنلا لواحٌس هلٌؽشتب رخآ جمانرب UAC ىلع ةقفاوملا هنم ابلاط مدختسملل
تاٌحلصلا كلت عفر

خطلخٌا
ةجمربل ةٌساسلا دعاوقلا UAC مادختسا قٌبطتلا ىلع بجٌو دارملا لمعلا ذٌفنتل تاٌحلصلا نم ىندلا دحلا مادختسا بلطتت
كلتمٌ لصفنم رخآ قٌبطت ذٌفنت هٌلع بجٌف ربكأ تاٌحلص بلطتت ةمهم ذٌفنت هٌلع ناك نإو انكمم كلذ نوكٌ امدنع يداع مدختسم تاٌحلص
ةعفترملا تاٌحلصلا كلت .
ةعفترم تاٌحلصب جمانربلا ءدبل قرط ةثلث ةلاقملا هذه ًف درو دقو : للخ نم كلذو كلذ لعف مدختسملا نم بلطلا ًه ىلولا
رملا راٌتخاو قٌبطتلا ىلع ًنٌمٌلا ةرؤفلا رزب رقنلا Run As Administrator ةلوبقم ىقبت اهنكلو ماع لكشب ةمبلملا ةقٌرطلاب تسٌل هذهو
نم لضفأ ةقٌرط هذهو ةعفترم تاٌحلصب رخلا قٌبطتلا أدبٌ قٌبطتلا لعج ًه ةٌناثلاو ةردان تارم قٌبطتلا كلذ لؽشٌس مدختسملا ناك نإ
نٌمضت ًه ةثلاثلاو اهجاتحٌ ًتلا تاٌحلصلا نودب قٌبطتلا لٌؽشت ناكملاب لازام هنكلو ىلولا manifest هلعجل ىعدتسملا قٌبطتلا نمض
هلٌؽشت اهٌف أدبٌ ةرم لك ًف ةعفترم تاٌحلص بلطٌ

122

ٓ١ىّر هغِبٔشث ِٓ َاذخزعا دب١حلط ش٠ذِ ٍٝػ بزغ١ف

 رٌدم تاٌحلصب لمعلا نم كجمانرب نٌكمتل رٌدم تاٌحلصب امود رٌوطتلا ةبٌب لؽش - رقنا ةرؤفلا رزب ةبٌب راصتخا ىلع ًنٌمٌلا
رملا رتخاو رٌوطتلا Run As Administrator -
 صباصخ حتفا My Project رز رقنا مث View UAC Settings ةحفص نم Application مث صباصخ ةذفان ًف UAC ًتلا
رطسلا لدبتسا كل رهظت

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

 رطسلاب

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

 رملا ذفن Build Solution ةمباق نم Build ىوتسم نمض لمعت تلازام رٌوطتلا ةبٌبو Administrator مدختست كنؤب دكؤت امك
لمعب موقت امدنع رٌدم تاٌحلصب رٌوطتلا ةبٌب ـلا جمانرب Setup اضٌأ

123

بزغ١ف صٚذٕ٠ٚ ٟف ش٠ذِ دب١حلط تٍطزر شِاٚأ زفٕ٠ بٕغِبٔشث ٟف ساسصلا ذحأ ًؼغث َٛمٔ ف١و

لبق نم اعنم هجاونس انهو اتسٌف زودنٌو ًف ةصاخ تاٌحلص بلطتت لامعؤب ماٌقلل ناٌحلا ضعب ًف جاتحن UAC صاخلا
رٌدم تاٌحلص ىوتسمب دوكلا كلذ ذٌفنت انٌلع بحٌ ةمهملا هذه ذٌفنت نم انجمانرب نكمتٌ ًكلو اتسٌف زودنٌوب Administrator موقنس ثٌح
ةبفلا نٌمدختسم اتسٌف زودنٌو ًف ناملا ماظن عم لماعتت ةبف ؾٌرعتب ةٌادبلا ًف WindowsIdentity يذلا زودنٌو مدختسم ىلع ؾرعتلل
ةبفلاو هٌلع لمعن WindowsPrincipal رٌدم تاٌحلصب لمعٌ هنأ نم ققحتن مث مدختسملا كلذ اهٌلإ بستنٌ ًتلا تاعومجملا ىلع ؾرعتلل
ءارجلا ًف امك
Friend Shared Function IsAdmin() As Boolean
Dim id As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim p As WindowsPrincipal = New WindowsPrincipal(id)
Return p.IsInRole(WindowsBuiltInRole.Administrator)
End Function
نكٌ مل نإف ةٌلاحلا ةٌلمعلا ءدب دٌعن انه رٌدم تاٌحلصب لمعٌ مدختسملا Restart Current Process مدختسملا تاٌحلص ىوتسم نٌعفار
ءارجلا ًف امك رٌدم ىوتسم ىلإ
Friend Shared Sub RestartElevated()
Dim startInfo As ProcessStartInfo = New ProcessStartInfo()
startInfo.UseShellExecute = True
startInfo.WorkingDirectory = Environment.CurrentDirectory
startInfo.FileName = Application.ExecutablePath
startInfo.Verb = "runas"
Try
Dim p As Process = Process.Start(startInfo)
Catch ex As System.ComponentModel.Win32Exception
Return 'If cancelled, do nothing
End Try

Application.Exit()
End Sub
ةلادلا مادختساب كلذ متٌ ثٌح بولطملا رماولا رز ىلإ رٌدم تاٌحلص مدختست ًتلا رارزلاب ةصاخلا عردلا ةنوقٌأ ةفاضإ انٌدل ًقب
SendMessage ةبتكملا ًف ةدوجوملا user32.dll ةلاسرلا لاسرإب موقت ًتلا BCM_SETSHIELD ءارجلا ًف امك بولطملا رزلا ىلإ
Friend Shared Sub AddShieldToButton(ByVal b As Button)
b.FlatStyle = FlatStyle.System
SendMessage(b.Handle, BCM_SETSHIELD, 0, &HFFFFFFF)
End Sub
ًلٌ امك رٌدم تاٌحلص بلطتت لامعأ ذٌفنت نم رزلا نٌكمت ةٌلمع ءارجل اهمدختسنس ًتلا ةبفلل لماكلا دوكلا حبصٌسو
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Windows.Forms
Imports System.Security.Principal

Public Class VistaSecurity
Private Declare Auto Function SendMessage Lib "user32.dll" _
(ByVal HWND As IntPtr, ByVal MSG As UInteger, ByVal WParam As UInt32, _
ByVal LParam As UInt32) As UInt32

Private Const BCM_FIRST = &H1600
Private Const BCM_SETSHIELD = (BCM_FIRST + &HC)

Friend Shared Function IsVistaOrHigher() As Boolean
124

Return Environment.OSVersion.Version.Major < 6
End Function

'/ <summary>
'/ Checks if the process is elevated
'/ </summary>
'/ <returns>If is elevated</returns>
Friend Shared Function IsAdmin() As Boolean
Dim id As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim p As WindowsPrincipal = New WindowsPrincipal(id)
Return p.IsInRole(WindowsBuiltInRole.Administrator)
End Function

'/ <summary>
'/ Add a shield icon to a button
'/ </summary>
'/ <param name="b">The button</param>
Friend Shared Sub AddShieldToButton(ByVal b As Button)
b.FlatStyle = FlatStyle.System
SendMessage(b.Handle, BCM_SETSHIELD, 0, &HFFFFFFF)
End Sub

'/ <summary>
'/ Restart the current process with administrator credentials
'/ </summary>
Friend Shared Sub RestartElevated()
Dim startInfo As ProcessStartInfo = New ProcessStartInfo()
startInfo.UseShellExecute = True
startInfo.WorkingDirectory = Environment.CurrentDirectory
startInfo.FileName = Application.ExecutablePath
startInfo.Verb = "runas"
Try
Dim p As Process = Process.Start(startInfo)
Catch ex As System.ComponentModel.Win32Exception
Return 'If cancelled, do nothing
End Try

Application.Exit()
End Sub
End Class

وتلل اهباشنإب انمق ًتلا ةبفلا اعم برجن انعد
ـب ةصاخلا ماظنلا ةمدخ بقارٌ وهو ًل مٌدق جمانرب نم ؾطتقم دوك ىلع ةبرجتلاب موقؤس SQl Server وأ ءدب دوك نأ امبو اهب مكحتٌو
ىلإ ةٌادبلا ًف جاتحنس ثٌح انه اندٌفت ًتلا دوكلا ةعطق طقف عضؤس اذل رٌدم تاٌحلص ىلإ جاتحت ًتلا روملا نم ربتعٌ ةمدخلا هذه ؾاقٌإ
ىلإ عجرم ةفاضإ System.ServiceProcess اضٌأ ؾلملا ةٌادب ًف ةٌلاتلا تادارٌتسلا ىلإو
Imports System.ServiceProcess
Imports Microsoft.Win32
دوكلا وه اذهو
Private SqlServiceCon As New _
System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")

Private Sub StopSQL()
Try
SqlServiceCon.Refresh()
If SqlServiceCon.CanStop = True Then SqlServiceCon.Stop()

Catch ex As Exception
MsgBox(ex.Message)
End Try
125

End Sub

Private Sub StartSql()
Try
SqlServiceCon.Refresh()
If SqlServiceCon.Status <> ServiceControllerStatus.Running And _
SqlServiceCon.Status <> ServiceControllerStatus.StartPending Then

SqlServiceCon.Start()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

ةقباسلا انتبف مدختسنس نلا VistaSecurity ةلادلا مادختساب ةبولطملا تاٌحلصلا كلتمٌ انجمانرب نأ نم لوأ ققحتلل IsAdmin كلتمٌ مل نإف
ةٌلمعلا ءدب دٌعن تاٌحلصلا كلت Process ةلادلا مادختساب بولطملا ىوتسملل تاٌحلصلا نٌعفار ةٌلاحلا RestartElevated دوكلا ًف امك
If VistaSecurity.IsAdmin = True Then
StartSql()
Else
VistaSecurity.RestartElevated()
End If
دوكلا مادختساب متت رماولا رز ىلإ عردلا ةنوقٌأ ةفاضإ ةٌلمعو
VistaSecurity.AddShieldToButton(Button1)
ةذفانلا دوكل لماك درس ًلٌ امٌفو Form1 رماوأ يرز كلتمت ًهو انه اهانمدختسا ًتلا Button1 و Button2
Imports System.ServiceProcess
Imports Microsoft.Win32

Public Class Form1

Private SqlServiceCon As New
System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")

Private Sub StopSQL()
Try
SqlServiceCon.Refresh()
If SqlServiceCon.CanStop = True Then SqlServiceCon.Stop()

Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub StartSql()
Try
SqlServiceCon.Refresh()
If SqlServiceCon.Status <> ServiceControllerStatus.Running And _
SqlServiceCon.Status <> ServiceControllerStatus.StartPending Then

SqlServiceCon.Start()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

126

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

If VistaSecurity.IsAdmin = True Then
StartSql()
Else
VistaSecurity.RestartElevated()
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

If VistaSecurity.IsAdmin = True Then
StopSQL()
Else
VistaSecurity.RestartElevated()
End If
End Sub

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

VistaSecurity.AddShieldToButton(Button1)
VistaSecurity.AddShieldToButton(Button2)
End Sub

End Class

ياإع
عم ةقٌرطلا هذه مادختسا حرش نكمملا نم له Windows XP
ةاٛغٌا
ـل ارصح ةصاخ ةقٌرطلا هذه Windows Vista عم اهلامعتسا نكمٌ لو Windows XP

127

غثبغٌا ُغمٌا – Linq



ةٌلاتلا عٌضاوملا مضٌو :
 ًف ةمدقم Linq
 تاملعتسا ةٌنب Linq
 تادوزم Linq – Linq Providers
 تاملعتسا ةٌنب Linq
 ةٌقرت عٌراشم 2005 لمعتل ىلع 2008 مث ةفاضإ معد Linq كلتل عٌراشملا
 Linq To Object تاٌساسأو تاملعتسا Linq
 Linq To DataSet
 لاثم ًلمع ىلع Linq To DataSet عم مادختسا Lambda Expressions
 ةمدقم ًف Linq to XML
 ضعب تامادختسا Linq TO XML
 ؾرعت ىلع Linq to SQL و O/R Designer
 Linq To Sql Master/Detail
 لاثم عٌرس نع ةٌفٌك ءاشنإ تابف Linq To SQL اٌودٌ
 ةلثمأ ىلع تاملعتسا Linq
 تاملعتسلا ةمجرتملا Compiled Queries
 ةفاضإ قبارط ةصصخم تاملعتسل كنٌل Linq

128

خ١ٕمزث خمٍؼزِ غ١ػاِٛ Linq بٙ١ٍػ علؽلا ِٓ ذثل

ةٌنقتب ةقلعتم ًهو باتكلا اذه ماسقأ ًف اهدجتس عٌضاوملا نم ةعومجم ءامسأ هذه Linq مسقلا ةعباتمل ةدوعلا مث لوأ اهٌلع علطت نا لضفٌ
ةٌنقتب قلعتملا Linq ًهو
 للدتسلا ًلحملا ىلع عونلا Local Type Inference
 عاونلا ةلوهجملا Anonymous Types
 Lambda Expressions
 رٌباعت ادمل ًف قمعلا
 Object Initializers

129

ٟف خِذمِ Linq

ؾٌضت Linq تاٌناكمإ ةٌملعتسا لوجٌفل ةٌوقو ةطٌسب تاٌناكمإب كٌزٌاب امدنع لماعتت عم دٌدعلا نم عاونأ تاناٌبلا ةفلتخملا
ةفاضلابف ىلإ لاسرإ ملعتسلا ىلإ ةدعاق تاناٌب ًك متت هتجلاعم وأ لمعلا عم ةؽٌص ةفلتخم ملعتسلل لكل عون نم عاونأ تاناٌبلا ًتلا موقت
ثحبلاب اهنع . مدقت Linq تاملعتسلا ءزجك نم ةؽل لوجٌف كٌزٌاب ةمدختسم ةؽٌص ةدحوم ضؽب رظنلا نع عون تاناٌبلا يذلا همدختست .
ًهو كنكمت نم ملعتسلا نع تاناٌبلا نم ةدعاق تاناٌب SQL Server وأ Xml وأ تاعومجملا تافوفصملاو ًف ةركاذلا وأ ADO .net
Datasets عم اهطبر نكمٌ تاناٌب ةدعاق يأ نم ملعتسلا ىلع ةرداق اهلعجٌ يذلا رملا DataSet وأ يأ ردصم تاناٌب ًلحم وأ دٌعب معدٌ
Linq ثٌح كنكمٌ لمع كلذ هلك مادختساب رصانع ةؽل لوجٌف كٌزٌاب ةعباشلا نل كتاملعتسا تحبصأ ةبوتكم ةؽلب لوجٌف كٌزٌاب جباتنو
ملعتسلا داعت ضارؼؤك عاونأ تاناٌب ةٌوق ةمعاد IntelliSense امم لعجٌ كتباتك دوكلل عرسأ كفاشتكاو ءاطخلل ًف تاملعتسلا دنع
ةمجرت عورشملا لدب نم تقو ذٌفنتلا امك نأ تاملعتسا Linq نكمٌ نأ نوكت اردصم تاملعتسل ةٌفاضإ دٌزمل نم ةقدلا ًف ثحبلا . امك
نكمٌ اهطبر عم تامكحتلا انكمم مدختسملا نم ضارعتسا لٌدعتو جباتن كملعتسا ةلوهسب .
اٌلاطٌإ ًف نٌدوجوملا نبابزلا تاكرش ةمباق دٌعٌ طٌسب ملعتسا نع لاثم اذهو
Dim itaCus = From cus In NwDs.Customers _
Where cus.Country = "Italy" _
Select cus.ContactName, cus.CompanyName

مهف ًف ةبوعص دجت نل رفرٌس لوكٌس تاملعتسا ةباتك نم انكمتم تنك نإ لاح لك ىلع ملعتسلا ةؽٌص صوصخب نلا قلقن ل انعد
ًلاتلا رفرٌس لوكٌس ملعتسا لثامٌ قباسلا ملعتسلاو اعبط تافلتخلا ضعب عم ةهباشم ةؽٌصلا نأ امب اهتؽٌص
SELECT COMPANYNAME FROM CUSTOMERS WHERE COUNTRY='Italy'
ملعتسا نوكٌ نأ نكمٌ امك Linq عقوملا بسح مهعٌمجت دٌعٌو نبابزلاب ةمباق دٌعٌ ًلاتلا دوكلاف دٌقعت رثكأ
Dim customers As List(Of Customer) = GetCustomerList()
Dim customersByCountry = From cust In customers _
Order By cust.Country, cust.City _
Group By CountryName = cust.Country _
Into RegionalCustomers = Group, Count() _
Order By CountryName
For Each country In customersByCountry
Console.WriteLine(country.CountryName & _
" (" & country.Count & ")" & vbCrLf)
For Each customer In country.RegionalCustomers
Console.WriteLine(vbTab & customer.CompanyName & _
" (" & customer.City & ")")
Next
Next
ملعتسا مادختسا اننكمٌ ثٌح Linq ًف هتجٌتن ضرع اننكمٌ لثم لولا لاثملاف لاكشأ ةدعب انجمانرب ًف DataGrid ةرشابم
Me.DataGridView1.DataSource = itaCus.ToList

ةقلح نمض هلاخدإ اننكمٌ وأ For…Each ةمباق راهظل لولا لاثملاب دراولا ملعتسلا مدختسن ًلاتلا لاثملا ًفف جباتنلا مادختساو لثم
ًف تاكرشلا ListBox
Me.ListBox1.Items.Clear()
For Each cust In itaCus
Me.ListBox1.Items.Add(cust.CompanyName)
Next
130



دادٚضِ Linq - LINQ Providers

دوزم موقٌ Linq تاملعتسا مٌظنتب Linq ملعتسا بتكت امدنعف همدختست يذلا تاناٌبلا ردصم بسحب كٌزٌاب لوجٌف ًف Linq دوزملا ذخؤٌ
جباتن لكشٌل ةٌردصملا ضارؼلا نم تاناٌبلا لٌوحتب اضٌأ موقٌو اهذٌفنت تاناٌبلا ردصم عٌطتسٌ رماوأ ىلإ همجرتٌو ملعتسلا كلذ
ردصملل تاثٌدحتلا لسرت امدنع تاناٌب ىلإ ضارؼلا لٌوحتب موقٌ ارٌخأو ملعتسلا . تادوزم كٌزٌاب لوجٌف مضٌو Linq ةٌلاتلا :
 Linq to Objects ةهجاولا معدٌ كضرؼ تناك اذإ ةركاذلا ًف تافوفصملاو تاعومجملا ًف ملعتسلا نم دوزملا اذه كنكمٌ
IEnumerable ةهجاولا وأ IEnumerable(T) دارٌتساب دوزملا اذه نٌكمت كنكمٌو اهنع ملعتسلا نم دوزملا كنكمٌ ثٌحب
لاجملا System.Linq كٌزٌاب لوجٌف عٌراشم ًف ًضارتفا لكشب ادروتسم نوكٌ يذلاو
 Linq to SQL تاناٌب دعاوق نم ملعتسلا نم دوزملا اذه كنكمٌ SQL Server ضارؼأ طبر لهسلا نم لعجٌو اهٌلإ ثٌدحتلاو
تاناٌبلا دعاوق ًف ضارؼلاو لوادجلا عم قٌبطتلا . عم لمعلا كٌزٌاب لوجٌف لهسٌو Linq to SQL مٌدقتب Object Relational
Designer ءاشنإ نم كنكمٌ يذلاو Object Model ـلا مدقٌو تاناٌبلا ةدعاق ًف ضارؼلا عم طبترٌ قٌبطتلا ًف O/R
Designer ضرؽلا تاءارجإو ةنزخملا ؾباظولاو تاءارجلا عم لماعتلا ةٌناكمإ DataContext ةدعاق عم لاصتلا رٌدٌ يذلا
ًلإافتلا تاناٌبلا مداصت لجأ نم ةلاحلا نزخٌو تاناٌبلا
 Linq to Xml نم ملعتسلا نم كنكمٌ Xml تاٌوتحم لٌدعت كنكمٌ ثٌحب اهٌلع لٌدعتلاو Xml كنكمٌ وأ ةركاذلا ًف ةدوجوملا
ؾلم لٌمحت Xml هظفح وأ
 Linq to Dataset نم ملعتسلا نم كنكمٌ ADO .net Datasets ةوق ةفاضإو اهٌلع لٌدعتلاو Linq مدختست ًتلا تاقٌبطتلل
Datasets ـلا ًف ثٌدحتلاو عٌمجتلاو ملعتسلا تاٌناكمإ عسوتو لهست Dataset كقٌبطت ًف

131

دبِلؼزعا خ١ٕث Linq

ملعتسا ىلإ ةداع راشٌ Linq تارٌؽتمو تاناٌبلا ردصم ددحت ًتلا ملعتسلا بٌكارت نم ةفٌلوت نم ؾلؤتٌ وهو ملعتسلا رٌبعتب
ىلع اهقٌبطت متٌل باسحلا وأ مضلا وأ عٌمجتلا وأ ةٌفصتلا وأ زرفلا لجأ نم تامٌلعت نمضتٌ نأ هنكمٌ امك ملعتسلاب ةصاخلا راركتلا
ـلا ةؽٌصل ةهباشم نوكت اهتؽٌصو ةٌردصملا تاناٌبلا SQL ةفولؤم ةؽٌصلا مظعم نأ دجتس اذهلو .
مسقب ملعتسلا أدبٌ From ىعدت ًهو لقتسم لكشب ةٌردصملا تاناٌبلا نم رصنع لك ىلإ رٌشت ًتلا تارٌؽتملاو تاناٌبلا ردصم ددحٌ يذلا
مسقو راركتلا تارٌؽتم وأ لاجملا تارٌؽتمب From عٌمجتلا تاملعتسا ًف لإ ملعتسلا لجأ نم بولطم Aggregate مسق نوكٌ ثٌح
From مسق ًف ملعتسلا ردصمو لاجم ؾٌرعت دعبو يراٌتخا اهٌف From مسق ًف وأ Aggregate ماسقأ نم بٌكرت يأ نٌمضت كنكمٌ
ملعتسلا . رٌؽتملاب نبابزلا تاناٌب نم ةعومجم ردصم ددحٌ ًلاتلا ملعتسلا لثمف Customers راركتلا رٌؽتمو cust
Dim queryResults = From cust In customers _
Select cust.CompanyName

كنكمٌ لثمف جباتنلا دٌدحتل ىرخأ ملعتسا ماسقأ ؾٌضت امدنع ىوقأ ملعتسلا حبصٌ كلذ عمو هسفن تاذب لوبقم ملعتسا لكشٌ لاثملا اذهو
مسق ةفاضإ Where ماسقأ ةفاضإ كنكمٌ ثٌحب دوكلا نم دحاو رطس نع ةرابع ملعتسلا رٌباعت نوكتو رثكأ وأ ةمٌق ىلإ جباتنلا ةٌفصتل
ؾرحملا مادختساب كدوك ةءارق نٌسحتل رطسأ ةدع ىلإ ملعتسلا لصف كنكمٌ امك ملعتسلا ةٌاهنل ةدٌدج ملعتسا _ ًلاتلا دوكلا لثمٌو
مسق مدختسٌ املعتسا Where
Dim queryResults = From cust In customers _
Where cust.Country = "USA"

مسق لثمٌو select تاملعتسا دٌعتو تاناٌبلا ردصم نم طقف ةراتخملا لوقحلا ةداعإ نم كنكمٌ ثٌح ملعتسلا ًف رخآ يوق مسق Linq
ةفورعم عاونأ وأ ةلوهجم عاونأ ةداعإ اهنكمٌ امك عونلا ةٌوقلا ضارؼلا نم ةٌدادعت ةعومجم . مسق مادختسا نكمٌو select لقحب ةدوعلل
لقحلا كلذ تاناٌب عون وه ةداعملا ةعومجملا عون نوكٌ اذه لعفت امدنعو تاناٌبلا ردصم نم طقف دحاو . مسق دٌعٌ امدنعو Select ةعومجم
عون نم لوقح عم ملعتسلا نم ةداعملا لوقحلا ةقباطم كنكمٌو لوهجملا عونلا نم ةداعملا ةعومجملا نوكت تاناٌبلا ردصم نم لوقحلا نم
تاناٌبلا ردصم نم ددحملا لقحلا نم تاناٌب عم اماقرأ مضت لوهجم اهعون ةعومجم دٌعٌ ملعتسا رٌبعت ًلاتلا دوكلا رهظٌو ددحم ؾورعم
Dim queryResults = From cust In customers _
Where cust.Country = "USA" _
Select cust.CompanyName, cust.Country

تاملعتسا مادختسا نكمٌ Linq مسق مادختساب اذه لمع نكمٌ ثٌح ةدحاو ةجٌتن ًف تاناٌبلا نم رداصم ةدع جمدل From وأ رثكأ وأ دحاو
ماسقأ مادختساب Join وأ Group Join تاناٌب مضٌ ملعتسا رٌبعت ًلاتلا دوكلا رهظٌو Customer و Order عون نم ةعومجم دٌعٌو
نم تاناٌب يوتحت لوهجم Customer و Order
Dim queryResults = From cust In customers, ord In orders _
Where cust.CustomerID = ord.CustomerID _
Select cust, ord

مسق مادختسا كنكمٌ Group Join ضارؼأ نم ةعومجم يوتحت ةٌرجش تاملعتسا ءانبل Customer ضرؼ لكو Customer كلتمٌ
ضارؼأ عٌمج نمضتت ةعومجم يوتحت ةٌصاخ order نوبزلا كلذل . تاناٌب جمدٌ ملعتسا رٌبعت ًلاتلا لاثملا رهظٌو Customer و
Order ةٌصاخلا نمضتٌ اعون ملعتسلا دٌعٌو لوهجم عون نم ةعومجم دٌعٌو ةٌرجش ةجٌتنك CustomerOrders ةعومجم ىلع يوتحت
تاناٌب نم ةعومجم ىلع يوتحت Order تاناٌبو Customer ةٌصاخلا اضٌأ نمضتتو OrderTotal تابلطلا ًلامجإ عومجم ىلع يوتحت
نوبزلا كلذل
Dim queryResults = From cust In customers _
Group Join ord In orders On _
cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
OrderTotal = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, OrderTotal
132

َلؼزعا دلِبؼِ Linq - Visual Basic LINQ Query Operators
لاجملا ًف تابفلا نمضتت System.Linq معدت ًتلا تلاجملاو Linq اهٌلوتو تاملعتسلا ءاشنل اهإاعدتسا كنكمٌ قبارط
ةعباشلا ملعتسلا ماسقل ةٌحاتفم تاملك كٌزٌاب لوجٌف نمضتٌو قٌبطتلا ةجاح بسحب
From Clause
مسقب ملعتسلا أدبٌ نأ بجٌ From وأ Aggregate مسق ددحٌو From ملعتسلل راركتلا رٌؽتم وأ ردصملا ةعومجملا
' Returns the company name for all customers for whom
' State is equal to "WA".
Dim names = From cust In customers _
Where cust.State = "WA" _
Select cust.CompanyName

Select Clause
ملعتسلل راركتلا تارٌؽتم نم ةعومجم ددحٌ يراٌتخا
' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers _
Select cust.CompanyName, cust.ID

مسق نكٌ مل نإ و Select مسق ًف ةددحملا كلت نم ملعتسلل راركتلا تارٌؽتم ؾلؤتتف ملعتسلا ًف ادوجوم From وأ Aggregate
Where Clause
ملعتسلل ةٌفصتلا طرش ددحٌو يراٌتخا
' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products _
Where product.Category = "Beverages" _
Select product.Name

Order By Clause
ملعتسلا ًف ةدمعلل زرفلا بٌترت ددحٌو يراٌتخا
' Returns a list of books sorted by price in
' ascending order.
Dim titlesAscendingPrice = From b In Books _
Order By b.Price
Join Clause
ةدحاو ةعومجم نمض نٌتعومجم جمدٌو يراٌتخا
Dim Intrst = From i In DsDesposits.InterestRates_
Join d In DsDesposits.Deposits_
On i.InterestID Equals d.InterestID_
Select i.InterestID, i.InterestRate, i.DepositPreiod
Group by Clause
ةعومجم لكل عٌمجت تاءارجإ قٌبطتل هلامعتسا نكمٌو ملعتسلا ةجٌتن رصانع عٌمجتب موقٌو يراٌتخا
' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orders = From order In orderList _
Order By order.OrderDate _
Group By OrderDate = order.OrderDate _
Into OrdersByDate = Group
133

Group Join Clause
ةدحاو ةٌرجش ةعومجم نمض نٌتعومجم عمجٌو يراٌتخا
' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers _
Group Join ord In orders On _
cust.CustomerID Equals ord.CustomerID _
Into CustomerOrders = Group, _
OrderTotal = Sum(ord.Total) _
Select cust.CompanyName, cust.CustomerID, _
CustomerOrders, OrderTotal

Aggregate Clause
مسقب امإ امود ملعتسلا ءدب بجٌ From مسق وأ Aggregate مسقو Aggregate ةعومجملا ىلع عٌمجتلا ؾباظو نم رثكأ وأ ةدحاو قبطٌ
مسق مادختسا نكمٌ لثمف Aggregate ملعتسلاب ةداعملا رصانعلا عٌمج عومجم باسحل
' Returns the sum of all order totals.
Dim orderTotal = Aggregate order In Orders _
Into Sum(order.Total)

مسق مادختسا كنكمٌ امك Aggregate مسق مادختسا نكمٌ لثمف ملعتسلا لٌدعتل Aggregate ملعتسا ةعومجم ىلع ةٌباسح ةٌلمع ءارجل
' Returns the customer company name and largest
' order total for each customer.
Dim customerMax = From cust In customers _
Aggregate order In cust.Orders _
Into MaxOrder = Max(order.Total) _
Select cust.CompanyName, MaxOrder

Let Clause
دٌدج رٌؽتم ًف اهعضٌو ةمٌق باسحب موقٌو يراٌتخا
' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products _
Let Discount = prod.UnitPrice * 0.1 _
Where Discount >= 50 _
Select prod.ProductName, prod.UnitPrice, Discount
Distinct Clause
ةرركم امٌق بلجٌ ل ثٌحب ملعتسلا نم ةداعملا مٌقلا طبضٌ وهو يراٌتخا
' Returns a list of cities with no duplicate entries.
Dim cities = From item In Customers _
Select customer.City_
Distinct

Skip Clause
ًقابلا دٌعٌو ةعومجملا ًف رصانعلا نم انٌعم اددع زواجتٌ يراٌتخا
' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers _
Skip 10

134

Skip While Clause
طرشلا ةمٌق املاط ةعومجملا رصانع زواجتٌ يراٌتخا True رصانعلا ًقاب دٌعٌ مث
' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers _
Skip While IsSubscriber(cust)

Take Clause
ةعومجملا ةٌادب ًف ةرواجتملا رصانعلا نم اددع دٌعٌو يراٌتخا
' Returns the first 10 customers.
Dim customerList = From cust In customers _
Take 10

Take While Clause
طرشلا ةمٌق املاط ةعومجملا رصانع نٌمضتب موقٌ يراٌتخا True رصانعلا ةٌقب لهاجتٌو
' Returns a list of customers. The query returns
' customers until the first customer for whom
' HasOrders returns false. That customer and all
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers _
Order By cust.Orders.Count Descending _
Take While HasOrders(cust)

ملعتسل ةٌفاضإ صباصخ مادختسا كنكمٌ امك Linq اهرفوٌ ًتلا اهنع ملعتسملا عاونلاو تاعومجملا رصانع ءاعدتساب Linq كنكمٌ ثٌح
ةقٌرطلا مدختسٌ ًلاتلا دوكلا لثمف ملعتسلا ةجٌتن ىلع ملعتسا لماعم ءاعدتساب ةٌفاضلا تاٌناكملا هذه مادختسا Union جتان جمدل
ةقٌرطلا مدختسٌو ةدحاو ملعتسا ةجٌتن ًف نٌملعتسا ToList(TSource) ةمباقك ملعتسلا جتان ةداعل
Public Function GetAllCustomers() As List(Of Customer)
Dim customers1 = From cust In domesticCustomers
Dim customers2 = From cust In internationalCustomers

Dim customerList = customers1.Union(customers2)
Return customerList.ToList()
End Function



135

غ٠سبشِ خ١لشر 2005 ٍٝػ ًّؼزٌ 2008 ُػد خفبػئ ُص Linq غ٠سبشٌّا هٍزٌ

 رٌوطت ةبٌب نمض كعورشم حتفا 2008 اٌباقلت ةٌقرتلا جلاعم كل رهظٌف – طؽضا next
 راٌخلا راتخنف ةمٌدقلا تافلملل ةٌطاٌتحا ةخسن لمع راٌخ جلاعملا كل رهظٌ Yes, create a backup before converting مث
ةملكلا تحت صوصنلا عبرم ًف هٌف ةٌطاٌتحلا ةخسنلا عضول اناكم حرتقٌ Location for backup طؽضلاب هرٌٌؽت كنكمٌ ثٌح
رزلا ىلع Browse وه امك هكرت وأ - طؽضا next ةٌقرتلا نع تامولعم كل رهظٌف - انه طؽضا Finish ةٌقرتلا ةٌلمعب ءدبلل
 راٌخ اهٌفو ةٌقرتلا ةٌلمع ءاهتناب كربخت ةذفان كل رهظت ءاهتنلا دعب Show the conversion log when the wizard is
closed طؽضا انه جلاعملا قلؼإ دعب لٌوحتلا ةٌلمع نع رٌرقت كل رهظٌ راٌخلا اذه لٌعفتبو Close
 ـلا رٌوطت ةبٌب عم اقفاوتم لازام ةطقنلا هذه ىتح لٌوحتلا دعب انعورشم نأ ةظحلم ردجت امك 2005
 نم Solution Explorer ىلع اجودزم ارقن يراسٌلا ةرؤفلا رزب رقنا My Project هصباصخ حتفل
 ةحفص حتفا Compile راٌخلا طبضب مقو Option Infer ىلإ On نم ةٌلحملا تارٌؽتملا عون ىلع لدتسٌ نأ جلاعملا ربخٌ يذلا
رٌؽتملا كلذ عونب هدوزن مل نإ رٌؽتملا كلذ ةمٌق طبضٌ يذلا رٌبعتلا - ةءارق كنكمٌ راٌخلا اذه لوح تامولعملا نم دٌزملو
للدتسلا ناونعب ىدتنملا ًف ًعوضوم ًلحملا ىلع عونلا Local Type Inference
 ةحفص لفسل لقتنا Compile رزلا طؽضا مث Advanced Compile Options ةمجرتلا تاراٌخب راوح قودنص انل رهظٌ يذلا
راٌخلا ةذفانلا هذه لفسأ ًف ىرن ثٌح ةمدقتملا Target framework ـلا ىلع اطوبضم لازام يذلاو Framework 2.0 ىتح
نم لدبف ةدحاو رٌوطت ةبٌب نمض ةدوجوملا كروومٌرفلا خسن نم ةخسن يأ ىلع لمعٌ دوك ةباتك نم راٌخلا اذه اننكمٌ ثٌح نلا
نم خسن ةدع بٌصنت Visual Studio نم رثكأ عم لمعلا ؾدهب زاهجلا سفن ىلع Framework كلذ لمع كناكمإب نلا حبصأ
ًه ةدحاو رٌوطت ةبٌب لخاد نم 2008 نٌكمت لجأ نمو Linq راتخنس Framework 3.5 ىلع طؽضا مث Ok رٌذحت انل رهظٌف
طؽضا انهو اٌباقلت ةظوفحم رٌؼ تارٌٌؽت ةٌأ ظفحب موقٌس هنأو اٌباقلت عورشملا حتفو قلؼإ متٌس هنؤب Yes
 ىلع اجودزم ارقن يراسٌلا ةرؤفلا رزب رقنا My Project ةحفصلل لقتناو هصباصخ حتفل References ةفاضإ مت دق هنأ ظحلنف
ةبتكملل اٌباقلت اعجرم system.core.dll ـلا نم Framework 3.5 ةٌقرتب انمق اننل كلذو عورشملل Target Framework
تاملعتسا نٌكمت لجأ نمو Linq دوزم ىلع ادامتعا ءامسلا تلاجم ضعب دارٌتساو عجارملا ضعب ةفاضإ انٌلع Linq يذلا
همادختسل جاتحن
 ـل عجرم ةفاضإ لجأ نمف Linq to Object لفسأ ةمباقلا نم راتخن Import Namespaces لاجملا System.linq اننكمٌ يذلا
تاملعتسا ةباتك نم Linq ًف تافلملا ءامسأ ىلع لوصحلل ًلاتلا ملعتسلا ةباتك انناكمإب حبصأ ثٌح ةفلتخملا ضارؼلا ىلع
ًلاحلا دلجملا
Dim MyFiles = From Files In My.Computer.FileSystem.GetFiles(CurDir()) _
Select Files

ةٌصاخ ببسب هنأ ظحلنو Option Infer ىلإ ةطوبضملا On رٌؽتملا عون طبض دق مجرتملا نأ MyFiles ىلإ
IEnumerable(Of String) رٌؽتملا قوف ةرؤفلا ةرٌشم رٌرمت دنع كلذو MyFiles
 تاملعتسا نٌكمت لجأ نمو Linq ـلا نم ملعتسلل Datasets صباصخ حتفا انهو ةٌفاضلا تاءارجلا ضعبل جاتحنس My
Project ةحفصلل دعو References رزلا طؽضاو Add ةحفص نمو .net ـل اعجرم ؾضأ
System.Data.DataSetExtensions طؽضا مث OK
 ـلا دٌلوت ةداعل نلا جاتحنس Dataset تاملعتسا عم اهمادختسا دٌرن ًتلا Linq ـلا ىلع ًنٌمٌلا ةرؤفلا رزب رقنن كلذ لمعلو
Dataset راتخن مث ةبسانملا Run Custom Tool ـلا دوك ةباتك ةداعإب رٌوطتلا ةبٌب موقت انهو ةمباقلا نم Dataset حبصتل
ـل ةمعاد ةبف نم ةثوروم اهنمض لوادجلا Linq ىمست TypedTableBase ءامسلا لاجم ةفاضل ةجاحلا ًعدتسٌ يذلا اذهو
System.Data.DataSetExtensions ـلا نم تاملعتسا ةباتك نلا انناكمإب حبصأو dataset ملعتسلا لثم

Dim MyCats = From category In Me.CategoryProductDataSet.Categories _
Where category.CategoryName Like "C*" _
Select category

رٌؽتملا عون طبض دق مجرتملا نأ اضٌأ انه ظحلنو MyCats ىلإ اٌباقلت هب ةطبترملا ملعتسلا ةلمج ىلع ءانب
EnumerableRowCollection
 تاملعتسا ةباتكلو Linq to XML ةحفص ىلإ دع References صباصخ ًف MyProject رزلا طؽضاو Add اعجرم ؾضأو
ـل System.Xml.Linq ةمباقلا ىلإ لقتنا مث Imported namespaces راٌتخاب مقو System.Xml.Linq ةباتك نم نكمتن ىتح
نم تاملعتسا XML
136

 دوزم وهو همادختسا دٌرن امبر رخآ دوزم دجوٌ امك Linq to Sql راٌتخاب مق طقف ةلوهسب هتفاضإ نكمٌ ثٌح Add New Item
ةمباق نم Project ةفاضإب مقو Linq to Sql Classes ثٌح انعورشمل ةبسانملا تادارٌتسلاو عجارملا ةفاضإب اٌباقلت موقٌس اذهو
ةحفص نم ظحلنس References صباصخ ًف MyProject ـل اعجرم ةفاضإ مت دق هنأ System.Data.Linq

مادختسا انناكمإب نلا حبصأ Linq ضارؼلا ىلع ملعتسلل Objects نم ملعتسلا ىلإ ةفاضلاب انعورشم ًف ةفلتخملا Dataset وأ
XML ىتح وأ Sql Databse

137

Linq To Object دب١عبعأٚ دبِلؼزعا Linq

دوزم مادختساب Linq to Object ةهجاولا معدت ًه املاط ةفلتخملا تٌن تود ضارؼأ نم ملعتسلا اننكمٌ IEnumerable ةهجاولا وأ
IEnumerable(T) ًلاحلا دلجملا ًف ةدوجوملا تافلملاب ةمباق ىلع لوصحلل ملعتسا ةباتك اننكمٌ لثمف
Dim Files = From Fi In My.Computer.FileSystem.GetFiles(CurDir()) _
Order By Fi
رٌؽتملا نع حٌرصتلاب انمق امدنع اننأ ةٌادب ظحلن Files ىلع لدتسٌ انه مجرتملا نل كلذو رٌؽتملا عون نع حرصن مل ملعتسلا ةٌادب ًف
ملعتسلا ةلاح ًفو عونلا نع ًلحملا للدتسلا صوصخب ًعوضوم تسرد دق كنأ ضرتفأ انهو هتمٌق طبضٌ يذلا رٌبعتلا نم هعون
رٌؽتملا قوف ةرؤفلا رشإم رٌرمتب تمق نإ قباسلا Files ىلإ هعون طبضب تماق رٌوطتلا ةبٌب نأ دجتس
System.Linq.IOrderedEnumeable(Of String) مسقلاب ملعتسلا ةباتكب أدبنو عونلا ىلع ًلحملا للدتسلا مادختساب From ثٌح
رٌؽتم انٌدل هنأ ددحن Fi ةملكلا ًلٌ يذلا نباكلا نم هتمٌق ىلع لصحٌ In انه انملعتسا ًفو
My.Computer.FileSystem.GetFiles(CurDir()) تاملعتسا نأ ىلإ ةظحلملا ردجت ثٌح Linq ةؽل ًف ادحاو ارطس نوكت اهعٌمج
ةعباتملا ؾرحم مادختساب رطسأ ةدع ىلع ةرابعلا مسقن لٌدعتلاو ةءارقلا ةٌلباقو قٌسنتلا لجأ نم اذل كٌزٌاب لوجٌف _ جرخن نأ انه دٌرنو
مسق مدختسن اذل تافلملا ءامسؤب ةبترم ةمباق OrderBy ًف هذه تافلملا ةمباق رهظن ًكو ملعتسلا نم ةداعملا تافلملا ءامسأ بٌترتب موقٌل
ListBox ةقلح مدختسن For … Each ةهجاولا ققحت اهنأ امب ملعتسلا نم ةداعملا ةعومجملا رصانع ربع نارودلل IEnumerable
لاثملا ًف امك ةمباقلا عبرمل ارصنع ارصنع اهتفاضإو
For Each f In Files
Me.ListBox1.Items.Add(f)
Next
ًلاتلا ملعتسلا ةباتك اننكمٌ قباسلا ملعتسلا نم ةداعملا تافلملا تامولعم ىلع لوصحللف رخآ ملعتسا نمض ملعتسلا مادختسا اننكمٌ امك
مسقلا ددحٌ ثٌح Select نم ةعومجم ًه ةداعملا ةجٌتنلا نأ FileInfo ةلادلا نم ةداعملا ةمٌقلا بسحب GetFileInfo
Dim FInfo = From File In Files _
Select My.Computer.FileSystem.GetFileInfo(File)
ًف ملعتسلا اذه ةجٌتن راهظإ اننكمٌو DataGridView ةٌصاخلا ةمٌق طبضب كلذو ةرشابم DataSource ةلادلا دباع ةجٌتن ىلإ ToList
ملعتسلا رٌؽتمب ةصاخلا FileInfo دوكلا ًف امك
Me.DataGridView1.DataSource = FInfo.ToList
مسق مادختسا اننكمٌ امك Select ةرابع ًف هلعفن انك امل هباشم لكشبو ملعتسلا نم ةداعملا تامولعملا صٌصختل Select ًف اهمدختسن ًتلا
تاملعتسا SQL صباصخ ةفاك ةداعإ نم لدبف FileInfo ءاشنلا تقوو ؾلملا مسا راهظل انملعتسا ةباتك اننكمٌ قباسلا ملعتسلا ًف امك
لاثملا ًف امك طقف
Dim MyInfo = From Fi In FInfo _
Select Fi.Name, Fi.CreationTime

ةطٌسب ةبف انٌدل ناك نإف ملعتسلل ةجٌتنك اٌباقلت هدٌدحت متٌ يذلا عونلا نم لدب انباشنإ نم ضرؼ نمض ملعتسلا اذه ةجٌتن ةداعإ اننكمٌ امك
مساب MyFiles نٌتٌصاخ كلتمت CreationTime عونلا نم Date و Name عونلا نم String لكشلاب انملعتسا ةباتك ةداعإ اهدنع اننكمٌ
Dim MyFiles = From Fi In FInfo _
Select New MyFiles() With {.Name = Fi.Name, .CreationTime = Fi.CreationTime}

ةعومجمك ةجٌتنلا ملعتسلا دٌعٌس ثٌح IEnumerable(Of MyFiles) ًعوضوم ةعجارم كنكمٌو Object Initializers صوصخب
ةبفلا ؾٌرعت ةؽٌص MyFiles ملعتسلا نمض
دادتملا لمحت ًتلا تافلملا ىلع لوصحلل ملعتسلا جتان صٌصخت اندرأ نإو exe مسق مدختسن لثم طقف where ءاقتنلا طرش ددحٌ يذلا
ةقٌرطلا نٌمدختسم ملعتسلا ةلمج ًف EndsWith ـب ًهتنٌ يذلا ؾلملا مسا راٌتخل .exe ًلاتلا لكشلاب ملعتسلا ةباتك اننكمٌ اهدنع
138

Dim ExeFiles = From Fi In My.Computer.FileSystem.GetFiles(CurDir()) _
Where Fi.EndsWith(".exe") _
Select My.Computer.FileSystem.GetFileInfo(Fi)

عونلا نم تافلملا موجح عومجم ىلع لوصحلا اندرأ نإو exe دٌدج ملعتسا ًف قباسلا ملعتسلا جتان مادختسا اننكمٌ
Dim ExeSize = Aggregate Fs In ExeFiles _
Into Sum(Fs.Length)

Me.TextBox1.Text = ExeSize
انمدختسا انهف Aggregate نم لدب From نم ةٌعٌمجت جباتن ىلع لوصحلل ةٌعٌمجتلا تلادلا مادختسا دٌرن امدنع ملعتسلا ةٌادب ًف
مسق ًفف ملعتسلا Into ةلادلا انمدختسا Sum موجحلا عومجم ىلع لوصحلل
مساب ةبف انٌدل هنأ انضرتفا اذإ Personnel صباصخلا كلتمت Name و Birthdate و Age و City و Salary يوتحت ةمباق ءاشنإب انمقو
تابفلا هذه عون كلتمت رصانع ةعومجم ىلع
Dim Pers As New List(Of Personnel)
لوح ةفلتخم تامولعم ىلع لوصحلل تاملعتسلا نم ةعومجم ةباتك اننكمٌ رصانعلا نم دٌدعلا ىلع يوتحت ةمباقلا هذه نأ ضارتفابو
نم رثكأ مهبتار نٌذلا صاخشلاب ةمباق اندرأ نإف ةمباقلا هذه رصانع 10000 جباتنلا بٌترتو بتارلاو رمعلاو مسلا طقف جتانلا ًف اندرأو
ًلٌ امك ملعتسلا ةباتك اننكمٌ بتارلا بسحب
Dim Prs = From p In Pers _
Where p.Salary > 10000 _
Order By p.Salary _
Select p.Name, p.Age, p.Salary

لكشلاب انملعتسا حبصٌس طقف قشمد ةنٌدم ًف نومٌقٌ نٌذلا صاخشلا طقف اندرأ نإو
Dim Prs = From p In Pers _
Where p.Salary > 10000 And p.City = "Damascus" _
Order By p.Salary _
Select p.Name, p.Age, p.Salary

نم رثكأ مهبتاور نٌذلا ةامحو قشمد ًتنٌدم ًف صاخشلا اندرأ اذإو 10000 ًلٌ امك انملعتسا حبصٌ
Dim Prs = From p In Pers _
Where p.Salary > 10000 _
And (p.City = "Damascus" Or p.City = "Hama") _
Order By p.Salary _
Select p.Name, p.Age, p.Salary, p.City

ملعتسلا ةباتك اننكمٌ بلح ًف نٌمٌقملا صاخشلا بتاور عومجم ىلع لوصحلا اندرأ نإو
Dim prs = Aggregate p In Pers _
Where p.City = "Aleppo" _
Into Sum(p.Salary)
بتار ىلعا ىلع لصحٌ يذلا صخشلا تامولعم ىلع لوصحلا اندرأ نإو
Dim pr = From p In Pers _
Aggregate pa In Pers _
Into a = Max(pa.Salary) _
Where p.Salary = a _
Select p
بلح ةنٌدم ًف بتار لقأ ىلع لصحٌ نم تامولعم اندرأ نإو
139

Dim pr = From p In Pers _
Aggregate pa In Pers _
Where pa.City = "Aleppo" _
Into a = Min(pa.Salary) _
Where p.Salary = a And p.City = "Aleppo" _
Select p

مساب ةٌناث ةبف انٌدل هنا ضارتفابو Branches صباصخلا كلتمت BranchName و City انمقو ءاشنإب ةمباق يوتحت ىلع ةعومجم رصانع
نم عون هذه تابفلا
Dim Brnch As New List(Of Branches)
هتنٌدم ًف ةرفوتملا عورفلاو صخشلا مسا ىلع لوصحلل ًلاتلا ملعتسلا ةباتك اننكمٌ
Dim BrnPer = From pe In Pers _
Join br In Brnch On pe.City Equals br.City _
Select PersonName = pe.Name, BranchName = br.BranchName, pe.City
انمدختسا ثٌح join انمدختسا مث ةنٌدملا مادختساب عورفلا ةعومجم عم صاخشلا ةعومجم طبرل Select اهجارخإ بولطملا لوقحلا دٌدحتل
ملعتسلا ةجٌتن ًف
لكشلاب انملعتسا حبصٌس كلذبو مهل ةرفوتملا عورفلا عم صاخشلا عٌمجب ةمباق راهظإ دٌرن نلا
Dim PreBr = From pe In Pers _
Group Join br In Brnch On pe.City Equals br.City _
Into AvBr = Group _
Select pe, AvBr

رٌؽتملا انرتخا ةٌادبلا ًف Pe صاخشلا ةمباق نم Pers انمدختسا مث Group Join ةنٌدملا لقح مادختساب عورفلا ةمباق عم ةمباقلا هذه طبرل
رٌؽتم ًف ةٌناثلا ةمباقلا نم طبرلا جتان انعضو مث AvBr مسق ًف Into مسق ًف انددح مث Select اهدٌرن ًتلا جباتنلا Pe و AvBr
ًف ملعتسلا جتان راهظإ اننكمٌو ListBox ًتقلح مادختساب For … Each ناتلخادتم
For Each a In PreBr
Me.ListBox1.Items.Add(a.pe.Name & ": " & a.pe.City)
For Each b In a.AvBr
Me.ListBox1.Items.Add(".... " & b.BranchName)
Next
Next

مادختسا اندرأ اذإ وأ DataGridView نامكحت ىلإ جاتحنس جباتنلا راهظل DataGridView نامكحت و BindingSource ًف كلذ لمعلو
عونلا نم جذومنلا ىوتسم ىلع ارٌؽتم ؾرعنس ةٌادبلا Dictionary ًلٌ امك عورفلا ًه مٌقلاو صاخشلا ًه حٌتافملا نوكت ثٌح
Private Gper As Dictionary(Of Personnel, IEnumerable(Of Branches))
انرٌؽتم ًف ملعتسلا جتان عضوب موقن مث Gper ادمل رٌباعت مدختسن ثٌح – ادمل رٌباعتب ةقلعتملا عٌضاوملا تسرد له - حٌتافملا ةفاضل
دوكلا ًف امك هٌلإ مٌقلاو
Gper = PreBr.ToDictionary(Function(x) x.pe, Function(y) y.AvBr)
تامكحت طبرب موقنس مث BindingSource تامكحت عم DataGridView دوكلا ًف امك
Me.DataGridView1.DataSource = Me.BindingSource1
Me.DataGridView2.DataSource = Me.BindingSource2
ةٌصاخ طبضب موقن مث DataSource ـل BindingSource1 حٌتافم مٌق ىلإ Gper
140

Me.BindingSource1.DataSource = Gper.Keys
ًف حٌتافملا مٌق راهظإ متٌ كلذبو DataGridView1 ًف صخش لكل ةرفوتملا عورفلا ةمباق راهظلو صاخشلا ةمباق رهظتس ًتلا
DataGridView1 ًف DataGridView2 ثدحلا ةجلاعمب موقن CurrentChanged ـل BindingSource1 ًلاتلا دوكلا رطس مادختساب
Me.BindingSource2.DataSource = Gper(CType(Me.BindingSource1.Current, Personnel))
ـلا ًف ةمٌقلا ىلع لصحٌ يذلا Dictionary ًف ًلاحلا لجسلل ةلباقملا BindingSource1 ـك اهطبضٌو DataSource ـل
BindingSource2 ًف اهضرع متٌف DataGridView2 ًف هٌلع رقنلا دنع صخشلا كلذل ةرفوتملا عورفلا ةمباق رهظتس ًتلا
DataGridView1


141

Linq To DataSet

تاناٌبلا ةدعاق نأ ضارتفاب Northwind ةذفان نم كزاهج ًف ةتبثم Data Sources دٌدج تاناٌب ردصم ؾضأ رٌوطتلا ةبٌب ًف
نٌلودجلا نمضتٌ كعورشمل Categories و Products لودجلا بحسا تلفلاو بحسلا ةقٌرط مادختسابو Categories ةذفانلا حطس ىلإ
ةفاضل غرافلا DataGridView ةذفان نم مث جذومنلل تامكحتلا ضعب عم DataSources لودجلا بناجب ةدقعلا عسو Categories
لودجلا بحساو Products لودجلا لخادب يذلا Categories ءاشنإ متٌل ةذفانلا حطس ىلإ DataGridView ةصاخ ىلولا لفسأ ةٌناث
لودجلاب Products نع ثدحتت انترودو تاناٌب دعاوق ةجمرب اهنأ امب رثكأ لٌصفتب ةٌلمعلا هذه حرشب موقأ نل اعبط Linq تهجاو نإف
نأ بجٌ ةعباتملا لبقو ةطقنلا هذه صوصخب ةٌمٌلعتلا تفوسوركٌم تاهوٌدٌف ةٌإر لواح وأ ىدتنملا ًف بسانملا مسقلا ًف ثحبا ةلكشم
ـلا نأو ادٌج لمعٌ كعورشم نأ دكؤتت DataGridView طقف ىلولا نم هراٌتخا مت امل ةلباقملا تاناٌبلا ضرعت ةٌناثلا .

ثدحلل ةجلاعم ءارجإ ءاشنإب مقو جذومنلل دوكلا ررحم ىلإ لقتنا CurrentChanged مكحتلل CategoriesBindingSource لوصحللو
ًلاتلا دوكلا مدختسن ًلاحلا رطسلا ىلع
Dim row As NorthwindDataSet.CategoriesRow
row = CType(CType(Me.CategoriesBindingSource.Current, _
DataRowView).Row, NorthwindDataSet.CategoriesRow)

ملعتسلا ةباتك اننكمٌ ارمتسم اهجاتنإ لازام ًتلاو ةبفلا كلت ًف عباضبلا ةمٌق ًلامجإ ىلع لوصحللو
Dim Total = Aggregate Product In NorthwindDataSet.Products _
Where Product.CategoryID = row.CategoryID _
AndAlso Product.Discontinued = False _
Into Sum(Product.UnitPrice * Product.UnitsInStock)

انمدختسا انهف ملعتسلا ةقٌرط ؾرعت تحبصأ ءدبلا ذنم ًعم عباتم كنأ ضارتفابو Aggregate مادختسا دٌرن اننأ امب ملعتسلا ةٌادب ًف
مسق ًف انددح مث ارمتسم اهجاتنإ لازام ًتلا عباضبلل ةٌلامجلا ةفلكلا عومجم ىلع لوصحلل ةٌعٌمجتلا تلادلا Where نأ دٌرن اننؤب طرشلا
ةددحملا ةبفلل ةقفاوملا تاجتنملا عٌمجت متٌ Product.CategoryID = row.CategoryID ارمتسم لاز ام اهجاتنإ نأو
Product.Discontinued = False مسق انمدختسا مث Into ددعلاو جتنملا ةمٌق ءادج رٌرمتب كلذو بولطملا ًلامجلا ىلع لوصحلل
ةٌعٌمجتلا ةلادلل دوجوملا Sum . عضول ًلاتلا دوكلا مدختساو جذومنلا ىلع صوصن قودنص عض جذومنلا ىلع ملعتسلا ةجٌتن راهظلو
رملا مدختسٌ يذلا هٌف ةمٌقلا Format ةلمع قٌسنتب ملعتسلا نم ةداعملا ةمٌقلا قٌسنتل
Me.TextBox1.Text = Format(Total, "c")
رقنلا ثدح ءارجإ ًفو جذومنلا ىلعأ ًف دوجوملا تاودلا طٌرش ىلإ رزو صوصن قودنص مكحت ؾضأ تابفلا ىلع ةٌفصتلا ضعب ذٌفنتل
ًلاتلا ملعتسلا لخدأ رزلا ىلع
Dim SelCat = From Cat In Me.NorthwindDataSet.Categories _
Where Cat.CategoryName.ToLower Like Me.ToolStripTextBox1.Text.ToLower & "*" _
Select Cat

Me.CategoriesBindingSource.DataSource = SelCat.AsDataView
مادختساب انمق ثٌح Like مسق ًف Where طبضب موقن مث تاناٌبلا دعاوق تاملعتسا ًف لعفن امك امامت ملعتسلا نم ةداعملا جباتنلا ةٌفصتل
ةٌصاخ DataSource ـل CategoriesBindingSource ةقٌرطلا نأ ثٌح ملعتسلا جباتن انل رهظٌ ًكل AsDataView ةصاخلا
ضرؼ دٌعت ملعتسلاب DataView ـل معاد Linq ملعتسا لثمٌ Linq to DataSet
ؾضأو لٌلق كعورشم ةذفان عسو ىرخلا تاملعتسلا ضعب يرجن انعد DataGridView اندوك مدختسنس مث اهٌلع نادٌدج رماوأ رزو
ًف ًلاحلا لجسلا لمحٌ رٌؽتم ىلع لصحٌ يذلا قباسلا CategoriesBindingSource مت يذلا ًلاحلا لجسلا تامولعم ىلع لوصحلل
ًف هراٌتخا CategoriesDataGridView ثدحلا ةجلاعم ءارجإ ةٌادب ًف كلذو Click رماولا رزل
142

Dim row As NorthwindDataSet.CategoriesRow
row = CType(CType(Me.CategoriesBindingSource.Current, _
DataRowView).Row, NorthwindDataSet.CategoriesRow)

راهظإو اٌلاح اهنم دوجوملل ًلامجلا رعسلا عم جاتنلا دٌق تلازام ًتلا تاجتنملاب ةمباق ىلع لوصحلل ًلاتلا ملعتسلا ةباتك اننكمٌ نلا
ًف ةجٌتنلا DataGridView1 تابفلاب ةصاخلا ةكبشلا نم اهراٌتخا مت ًتلا ةبفلا نم ًتلاو
Dim Prods = From pr In NorthwindDataSet.Products _
Where pr.CategoryID = row.CategoryID _
And pr.Discontinued = False _
Select pr.ProductName, pr.UnitPrice, _
pr.UnitsInStock, Total = (pr.UnitPrice * pr.UnitsInStock)

Me.DataGridView1.DataSource = Prods.ToList

ةمٌقلاو تاٌمكلا عومجمو ةدوجوملا تادحولا رعس طسوتم باسحل دٌدج ملعتسا ءاشنإب موقنس ثٌح ةذفانلا ىلإ صوصن قٌدانص ثلث ؾضأ
قباسلا ملعتسلا ًف اهجباتن انرهظأ ًتلا ةبفلا سفن لجأ نم كلذو ةٌلامجلا
Dim ProdSums = Aggregate pr In NorthwindDataSet.Products _
Where pr.CategoryID = row.CategoryID _
And pr.Discontinued = False _
Into UntiSum = Sum(pr.UnitsInStock), PriceAvg = Average(pr.UnitPrice), _
TotalValue = Sum(pr.UnitPrice * pr.UnitsInStock)

Me.TextBox2.Text = ProdSums.PriceAvg.ToString("#,###.00")
Me.TextBox3.Text = ProdSums.UntiSum
Me.TextBox4.Text = ProdSums.TotalValue

تاملعتسا ةباتك ةقٌرط نأ ظحل Linq تاملعتسا ةباتك ةقٌرط نم ادج ةبٌرق select ًف SQL ةؽٌص نأو بٌترتلا ًف ؾلتخلا ضعب عم
دوزم ؾلتخا امهم ةهباشتم تاملعتسلا هذه Linq سردلا ًف تدرو ًتلا ملعتسلل ةفلتخملا لاكشلا مادختسا اننكمٌ ثٌح هعم لماعتن يذلا
ـب قلعتملا قباسلا Linq to Object ـب رملا قلعتٌ امدنع اضٌأ انه Linq to Dataset نع ثدحتن امدنع ةٌلبقتسملا سوردلا ًفو Linq to
xml و Linq to Sql


143

ٍٝػ ٍّٟػ يبضِ Linq To DataSet َاذخزعا غِ Lambda Expressions

لاثملا نم ؾدهلا
1 . تاناٌب ظفح DataSet ؾلم ًف xml تاناٌب ةدعاق دوجول ةجاحلا نودب اهعم لماعتلاو هنم اهتداعتساو
2 . ـلا نم ملعتسلا DataSet مادختساب Linq ةرابع مادختساو ملعتسلا ةلمج ًف تاباسحلا ضعب لاخدإو لودج نم رثكأ نمو
Join تاناٌبلل اطاخلا راركتلا عنمل
3 . مادختسا Lambda Expressions تارٌؽتملا عفر ةزٌم نم ةدافتسلاو انلجأ نم تاباسحلاب ماٌقلل
4 . ملعتسا ةجٌتن راهظإ Linq ًف DataGridView ةرشابم
تاناٌبلا ةعومجم نأ امبو ماع عوضوملا كرت لجأ نم DataSet ةعومجم ىلع لمعلاب موقؤس تاناٌب ةدعاق يأ عم اهطبر نكمٌ
يأ عم اهطبر نكمٌ تاناٌب ةدعاق يأ ىلع انه ةدراولا راكفلا قٌبطت كنكمٌ ثٌح تاناٌب ةدعاق عم ةطوبرم رٌؼ تاناٌب DataSet نوكٌسو
لجل عبادولاب ىعدت ةٌفرصم ةمدخ ىلع دمتعم انه هٌلع رٌسنس يذلا ًلاثم
وٌدوتس لوجٌف نم رادصإ يأ حتفا 2008 عون نم ادٌدج اعورشم اشنأو Windows Forms Application ةمباق نم مث Project رتخا
رملا Add New Item ؾضأو DataSet اهتٌمستب مقو عورشملل MyDataSet رقنا تاناٌبلا ةعومجمل ًموسرلا مٌمصتلا ررحم ًف مث
رملا رتخاو ًنٌمٌلا ةرؤفلا رزب DataTable ةمباق نم Add همسا حبصٌل هتٌمست ةداعإب مق مث قاٌسلا ةمباق ًف Customers ؾضأ مث
لودجلل Customers اهنم لك بناجب ةحضوملا صباصخلا عم ةٌلاتلا لوقحلا
لقحلا ID ةٌصاخلا AutoIncrement ةمٌقلاب True ناتٌصاخلاو AutoIncrementSeed و AutoIncrementStep امهاتلك لإ ى
ةمٌقلا 1 تاناٌبلا عون و System.Int32 لقحلا ىلع ًنٌمٌلا ةرؤفلا رزب رقنا مث ID رملا رتخاو Set Primary Key قاٌسلا ةمباق نم
ًساسأ حاتفمك لقحلا دٌدحتل
لقحلا CustomerName تاناٌبلا عون System.String و MaxLength ةمٌقلاب 25
لقحلا CurrentAccountNumber عون تاناٌبلا System.String و MaxLength 25
ثٌح نأ لقحلا ID وه ؾرعم نوبزلا و CustomerName وه مسا لقحلاو نوبزلا CurrentAccountNumber باسحلا مقر وه
ؾرصملا ىدل يراجلا
مساب تاناٌبلا ةعومجمل رخآ لودج ؾضأ Wadaeaa ةٌلاتلا لوقحلا هل ؾضأو عم صباصخلا ةحضوملا بناجب لك اهنم
لقحلا WadeaaNumber تاناٌب عونب String
لقحلا CustomerID تاناٌب عونب Int32
لقحلا InterestRate تاناٌب عونب Decimal و NullValue ـل ةٌواسم 7.5
لقحلا WadeeaPeriod تاناٌب عونب Int16 و BullValue ـل ةٌواسم 3
لقحلا StartDate تاناٌب عونب DateTime
لقحلا WadeaaAmount تاناٌب عونب Int32 و NullValue ةمٌقب 10000
ثٌح WadeaaNumber و ةعٌدولا مقر وه CustomerID و نبابزلا لودجب طبترم لقح وه InterestRate و ةدبافلا ةبسن
WadeeaPeriod و رهشلاب ةعٌدولا ةرتف StartDate و ةعٌدولا حتف خٌرات WadeaaAmount ةعٌدولا ةمٌق
نٌلودجلا نٌب ةقلع نلا ؾٌضنس : لودجلا ىلع ًنمٌلا ةرؤفلا رزب رقنا Customers ةٌعرفلا ةمباقلا نمو Add رتخا Relation طبضا مث
Parent Table ىلإ Customers و Child Table ىلإ Wadaeaa رتخا مث Key Columns لقحلا مضٌل ID و طقف Foreign Key
Columns لقحلا مضٌل CustomerID راٌخلا رتخا مث طقف Both Relations And Foreign Key Constraint طؽضا مث Ok لجأ نم
رملا رتخا مث ةقلعلا ظفح Save All ةمباقلا نم File
144

ـب صاخلا جذامنلا ررحم ىلإ لقتنا Form1 ةحاسم لعجاو Form1 ـل عستتل ةٌافك ةرٌبك 2 × DataGridView ضعبو تاودأ طٌرش عم
ةذفانل لقتنا مث اقحل اهفٌضنس ًتلا ىرخلا تامكحتلا Data Sources لودجلا بحساو Customers حطس ىلع هقلأ مث Form1 متٌف
ةفاضإ DataGridView ةذفانلل تاودأ طٌرش و
ةذفان نم Data Sources ةراشإ رقنا + لودجلا بناجب Customers نم ةخسن دوجو ظحلن امك هب ةصاخلا لوقحلاب ةمباق كل رهظتل
لودجلا Wadaeaa نمض ًعرف لودجك Customers لودجلا بحسب مق نلا نٌلودجلا نٌب اهباشنإب انمق ًتلا ةقلعلا ببسب كلذو
Wadaeaa ـل ًعرف لودجك دوجوملا Customers حطس ىلإ ًجراخلا لودجلا سٌلو Form1 ءاشنإ متٌل DataGridView ىلع ىرخأ
ـلا نأ نم دكؤتو دٌج لكشب ةذفانلا قٌسنتب مق مث ةذفانلا DataGridView ـب ةصاخلا Customers لفسلا ًف ىرخلا و ىلعلا ًف
رتخا CustomersDataGridView رملا رتخاو اٌلعلا ةٌنٌمٌلا اهتٌواز ًف رهظٌ يذلا رٌؽصلا مهسلا ىلع رقناو Edit Columns طبضاو
ةٌصاخلا Visible لقحلل ID ىلإ False لقحلل ةبسنلاب ةٌلمعلا ررك مث CustomerID ًف WadaeaaDataGridView
ظفحلا رز ىلع ًنٌمٌلا ةرؤفلا رزب رقنا ىلعلا ًف تاودلا طٌرش ًف – صرق ةنوقٌأ كلتمٌ – رملا رتخاو Enabled هٌلع رقنا مث هلٌعفتل
ةفٌظولا مدختسن ثٌح ظفحلا رز ىلع رقنلا ثدح ًف ًلاتلا دوكلا لخدأ مث دوكلا ررحم ىلإ لقتننل اجودزم ارقن WriteXml نٌزختل
ؾلم ًف تاناٌبلا ةعومجم تاٌوتحم xml
Try
MyDataSet.WriteXml("d:\TestData.xml")
Catch ex As Exception
MsgBox(ex.Message)
End Try

ثدحلا ةجلاعمل ءارجإ اشنأ Load ؾلم نم تاناٌبلا لٌمحتب موقٌس يذلا ًلاتلا دوكلا هٌف لخدأو جذومنلل xml دنع ؤطخ ةلاسر روهظ ظحل
كولب مادختسا ًف ببسلا اذهو دعب هإاشنإ متٌ مل تاناٌبلا ؾلم نأ ثٌح تاناٌبلا ظفح لبقو ةرم لول جمانربلا لٌؽشت Try … Catch لجأ نم
ةفٌظولا انمدختسا دقو جمانربلا ءدب ةٌلمع لاشفإ بنجتو ؤطخلا داٌطصا ReadXml ؾلم نم تاناٌبلا لٌمحتل xml تاناٌبلا ةعومجم ىلإ
Try
MyDataSet.Clear()
MyDataSet.ReadXml("d:\TestData.xml")
Catch ex As Exception
MsgBox(ex.Message)
End Try

ـلا لك ًف تاناٌبلا ضعب هٌف لخدأو جمانربلا لؽش DataGridView تاناٌبلا ًتكبش اتلك ًف لوقحلا عٌمج ةببعتب تمق دق كنأ نم دكؤتو
هبتناو ىلإ نأ لقحلا WadeeaPeriod وه ةرابع نع ددع رهشأ ةرتف ةعٌدولا اذل لواح مازتللا مٌقلاب 1 وأ 3 وأ 6 وأ 12 ةمٌقك اذهل لقحلا
نم لجأ ةبرجت ةٌبارجإ باستحلا اقحل حٌحص لكشب تمت دق ظفحلا ةٌلمع نأ نم دكؤتلل دٌدج نم هحتف دعأ مث جمانربلا قلؼأو ظفحلاب مقو
ةٌناثلا ةرملل جمانربلا لٌؽشت دنع اهظفحب انمقو تاناٌب انلخدأ نأ دعب ةرم لول جمانربلا حتف دنع ترهظ ًتلا ؤطخلا ةلاسر روهظ مدع ظحل
ةعٌدولا هذه قاقحتسا خٌرات كلذكو اهٌلع رورملا دنع ةعٌدو لكب ةصاخلا تاباستحلا مٌق راهظإ نلا دٌرن
ةٌلاتلا ءامسلا اهطعأو تاناٌبلا ًتكبش لفسأ اهبترو ةذفانلل ةٌصن لوقح ةعبرأ ؾضأ txtEndDate و قاقحتسلا خٌراتل txtInterest ةمٌقل
و ةدبافلا txtRayaa و عٌرلا ةبٌرضل txtIdara دوكلا ؾلم ةٌادب ًف ًلاتلا دارٌتسلا ؾضأو دوكلا ررحمل لقتنا مث ةٌلحملا ةرادلا ةبٌرضل
ـب صاخلا Form1 ءامسلا لاجم ًف ةدوجوملا ؾباظولا مادختسا نم اننٌكمت لجأ نم Math
Imports ma = System.Math
ـب ةقلعتملا ًسورد تعبات دق نوكت نأ وجرأ انهو باستحلل ةٌبارجإك ًلاتلا ءارجلا ؾضأ مث Lambda Expressions ًف ساسلا اهنل
باستحلا ةٌبارجإ
Private Sub DisplayWaeaaCalcs(ByVal Amount As Integer, ByVal StartDate As Date, _
ByVal EndDate As Date, ByVal Interest As Decimal)

Dim DaysNum = DateDiff(DateInterval.Day, StartDate, EndDate)
Dim Rayaa As Decimal

Dim Rayya_Calc = Function(Intrst As Decimal) ma.Ceiling(Intrst * 7.5 / 100)
145

Dim Idara_Calc = Function() ma.Ceiling(Rayaa * 10 / 100)
Dim Intrst_Calc = Function() _
ma.Ceiling(Amount * DaysNum * Interest / 36500)

Dim Intr = Intrst_Calc()
Rayaa = Rayya_Calc(Intr)
Dim Ida = Idara_Calc()

Me.txtEndDate.Text = EndDate.ToString("dd/MM/yyyy")
Me.txtInterest.Text = Intr.ToString("#,###.00")
Me.txtRayaa.Text = Rayaa.ToString("#,###.00")
Me.txtIdara.Text = Ida.ToString("#,###.00")
End Sub
ةلادلا ةٌادبلا ًف انمدختسا ثٌح DateDiff خٌرات و ػلبملا مٌق انررم دق انكو اهنع باستحلاب موقنس ًتلا ةرتفلا ماٌأ ددع ىلع لوصحلل
عٌرلا ةبٌرض ةمٌق باستحاب موقٌ ادمل رٌبعت انفرع مث باستحلا ةٌبارجل تاددحمك ةدبافلا ةبسنو ةٌاهنلا خٌراتو ةٌادبلا Rayya_Calc ءانب
انهو باستحلا لجأ نم ًلحم رٌؽتم تمدختسا اهنكلو ةمٌق اهل ررمن مل ىرخلا ةبٌرضلاو ادمل رٌبعت ًفو هل ةررمملا ةدبافلا ػلبم ىلع
رٌخلا ادمل رٌبعتو نلا ىتح هتأرق دق نكت مل نإ ادمل رٌباعتب ةقلعتملا ًعٌضاوم ًف تارٌؽتملا عفر مسق ةعجارمب كحصنأ Intrst_Calc
رٌباعتلا هذه مادختساب موقن مث ةعوفرم تارٌؽتمك ءارجلل ةررمملا تاددحملا مدختسٌ انه هنكلو تارٌؽتملا عفر ةٌصاخ اضٌأ مدختسٌ
ةبسانملا صوصنلا قٌدانص ًف مٌقلا رهظن مث باستحلل
ثدحلل ةجلاعم ءارجإ لمعب موقنس اهٌلع رورملا دنع ةعٌدو لكل ةقفاوملا مٌقلا باستحاب موقن نأ لجأ نم CellEnter تاناٌبلا ًتكبش لكل
دحاو ءارجإب – ثدحلا ةجلاعمل ءارجإك ًلاتلا دوكلا لخدأ CellEnter ةرابع دعب ام ظحل نٌتكبشلا لكل Handles مسج ؾٌرعت ةٌادب ًف
اهمادختسل جاتحأ نل ًننأ نم دكؤتم ًننأ امب كلذ لعف ًننكمٌ ثٌح ثدحلا ةجلاعم ءارجل تاددحم ةٌأ رٌرمتب مقأ مل ًننأ اضٌأو ءارجلا
Private Sub WadaeaaDataGridView_CellEnter() _
Handles WadaeaaDataGridView.CellEnter, CustomersDataGridView.CellEnter

Try
Dim EdDat = From a In MyDataSet.Wadaeaa _
Where a.CustomerID = Me.CustomersDataGridView.CurrentRow.Cells(0).Value _
And a.WadeaaNumber = Me.WadaeaaDataGridView.CurrentRow.Cells(0).Value _
Select a.WadeaaNumber, a.WadeaaAmount, a.StartDate, _
EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate), _
a.InterestRate

If EdDat.Count > 0 Then
DisplayWaeaaCalcs(EdDat.First.WadeaaAmount, EdDat.First.StartDate, _
EdDat.First.EndDate, EdDat.First.InterestRate)
End If
Catch ex As Exception
Me.txtEndDate.Text = String.Empty
Me.txtInterest.Text = String.Empty
Me.txtRayaa.Text = String.Empty
Me.txtIdara.Text = String.Empty
End Try
End Sub
ملعتسا ءاشنإب انمق ةٌادبلا ًف Linq رٌؽتملا نأ ثٌح اهٌلع ؾقن ًتلا ةعٌدولاب ةصاخلا مٌقلا ىلع لوصحلل a لودجلا نم ناٌك وه
Wadaeaa مسق ًف مث Where ةمٌق نأ نم دكؤتلا قٌرط نع نٌعم نوبزب ةصاخلا عبادولا طقف ملعتسلا بلجٌ ثٌحب طرشلا انطبض
لقحلا CustomerID ةمٌقل ةٌواسم ID سفنبو طرشلل ةمتتو ًلاحلا رطسلا ًف ةبسانملا ةٌلخلا ةمٌق ةءارق للخ نم نوبزلاب ةصاخلا
مسق ًتؤٌ مث دارملا مقرلا تاذ ةعٌدولا بلجٌ ًك طرشلا طبضب انمق ةقٌرطلا Select ظحل اهٌلع لوصحلا دٌرن ًتلا لوقحلا ةمباق هٌف ددحنل
بوسحملا لقحلا دوجو EndDate ةفٌظولا مادختساب ملعتسلا نم ةداعملا لوقحلا نم هتمٌق باسح متٌ يذلا DateAdd ةرتف ؾٌضت ًتلا
ملعتسلا اهدٌعٌ ًتلا لوقحلا ةمباق عم هتمٌق داعتو دٌدجلا خٌراتلا ةمٌق دٌعتو اهل ررمم خٌرات ىلإ اهل ةررمملا تاددحملا بسح ةنٌعم ةٌنمز
ةٌصاخلا ةمٌق نم ققحتلاب لعف جباتن بلج دق هنأ نم دكؤتن ملعتسلا دعبو Count ةفٌظولا ًعدتسن مث DisplayWaeaaCalcs ماٌقلل
جباتنلا راهظإو تاباسحلاب
امك اهظفحب تمق تاناٌب كٌدل تناك اذإ تاناٌبلا ًتكبش لك ًف لقنتلا دنع صوصنلا تاعبرم ًف تاباستحلا مٌق روهظ ظحلو جمانربلا لؽش
اقباس كنم تبلط
مساب عورشملل رخآ جذومن ؾضأ اهراهظإو نٌعم خٌراتب أدبت ًتلا عبادولا راهظإ لجأ نم Form2 ؾضأ مث DataGridView طبضاو هل
ةٌصاخلا Dock ةمٌقلل Fill ةجتانلا تاناٌبلا ضرعل ةٌافك ارٌبك نوكٌ ثٌحب جذومنلا قسن مث جذومنلا ةحاسم لماك لمت تاناٌبلا ةكبش لعجل
جذومنلل ارز ؾضأ مث ملعتسلا نع From1 ًلاتلا دوكلا لثامٌ هٌلع رقنلا ثدح ةجلاعم ءارجإ لعجاو
146

Private Sub Button1_Click() Handles Button1.Click
Dim d As Date = CDate(InputBox("Enter Date"))
Dim Dawa = From a In MyDataSet.Wadaeaa _
Join B In MyDataSet.Customers On _
a.CustomerID Equals B.ID _
Where a.StartDate = d _
Select B.CustomerName, B.CurrentAccountNumber, _
a.WadeaaNumber, a.WadeaaAmount, a.WadeeaPeriod, a.StartDate, _
EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, _
a.StartDate)

Dim c As New Form2
c.DataGridView1.DataSource = Dawa.ToList
c.DataGridView1.Update()
c.ShowDialog()
End Sub

جاتحأ نل ًننأ نٌقٌ ىلع تنك نإ ام ثدح ةجلاعم ءارجإ تاددحم ؾذح نم ًننكمت وٌدوتس لوجٌف ًف ةدٌدج ةزٌم تمدختسا ًننأ ظحل
تمدختسا ًننأ ظحلت ملعتسلا ةلمج ًفو اهمادختسل Join ةرركم تاناٌب روهظ ةلكشم بنجتن ًك ملعتسلا ةٌلمع دنع لوادجلا نٌب طبرلل
ثٌح نم نٌلودجلا نٌب ةٌادبلا ًف اهباشنإب انمق ًتلا ةقلعلا بولسأ سفن انمدختسا ثٌح رخلا لودجلا روطس عٌمج لجأ نم لوادجلا دحأ نم
لقحلا طبر CustomerID لودجلا ًف Wadaeaa لقحلاب ID لودجلا ًف Customer مسق ًف انمدختسا و Where جباتن ةٌفصتل طرش
ةرابع مدختسن مث نٌعم خٌراتب أدبت ًتلا عبادولا ىلع لصحن ثٌحب ملعتسلا Select ملعتسلل جباتنك اهراهظإ دٌرن ًتلا لوقحلا دٌدحتل
ًف جباتنلا راهظإ لجأ نمو Form2 ةمٌق انطبض مث ةذفانلا كلت عون نم رٌؽتم ءاشنإب انمق DataSource كلذ ىلع ةدوجوملا تاناٌبلا ةكبشل
ةقٌرطلا نٌمدختسم ملعتسلا نم ةداعملا ةجٌتنلا ىلإ جذومنلا ToList لجأ نمو تاناٌبلا ةكبش ًف هراهظإ نكمٌ لكش ىلإ جباتنلا لٌوحتل
مسق ًف طٌسب لٌدعت دعب قباسلا دوكلا سفن مادختسا اننكمٌ نٌعم خٌراتب ًهتنت ًتلا عبادولا ىلع لوصحلا Where امك دوكلا حبصٌ ثٌحب
ًلٌ
Private Sub Button2_Click() Handles Button2.Click
Dim d As Date = CDate(InputBox("Enter Date"))
Dim Dawa = From a In MyDataSet.Wadaeaa _
Join B In MyDataSet.Customers On _
a.CustomerID Equals B.ID _
Where DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate) = d _
Select B.CustomerName, B.CurrentAccountNumber, a.WadeaaNumber, _
a.WadeaaAmount, a.WadeeaPeriod, a.StartDate, _
EndDate = DateAdd(DateInterval.Month, a.WadeeaPeriod, a.StartDate)

Dim c As New Form2
c.DataGridView1.DataSource = Dawa.ToList
c.DataGridView1.Update()
c.ShowDialog()
End Sub

مسق ًف ؾلتخلا ظحل Where نٌرٌخلا نٌءارجلا نٌب . ؟؟؟؟ كسفنب ًناثلا ءارجلا لمع حرش كنكمٌ له


147

ٟف خِذمِ Linq to XML


Linq to Xml ةجمرب ةهجاو ًه xml معدت ةركاذلا ًف Linq تاناٌب عم لمعلا نم كنكمت xml ـلا ةجمرب ةؽل لخاد نم ةفلتخملا .net
Framework ـل ةهباشم ًهو Document Object Model اراصتخاو DOM ـلا عضت ًتلا xml نم ملعتسلا كنكمٌ ثٌح ةركاذلا ًف
ؾلتخت نكلو لٌدعتلا دعب اهلاسرإ وأ اهظفح كنكمٌ مث اهٌلع لٌدعتلا وأ ةقٌثولا Linq to xml نع DOM ًضرؼ جذومن دوزت اهنأ ًف
Object Model ـلا ًف ةؽللا تارٌوطت نم دٌفتست ًهو هٌلع لمعلا دنع لهسأو ؾخأ 2008
اهمدقت ًتلا مهلا ةزٌملا نمكتو Linq to Xml عم لماكتلا ًه Linq ةقٌثو نم تاملعتسا ةباتك نم كنكمٌ يذلا xml لوصحلل ةركاذلا ًف
لمشتل دتمت ًتلا تافصلاو رصانعلا نم ةعومجم ىلع xPath و Xquery ةمجرتلا تقو ًف ءاطخلا ؾاشتكا لثم ةٌفاضإ تازٌم كل مدقتو
ققدملل لضفأ معدو Debugger تاٌنابل طباسوك تاملعتسلا جباتن مادختسا ةٌناكمإو ىوقأ زٌمرت ىلإ ةفاضإ XElement وأ XAttribute
راجشأ ءاشنل ةلهس ةقٌرط رفوت xml ىعدت ًهو Functional Construction راجشأ لٌوحت نم ةلوهسب نٌروطملا نكمت ًتلا xml
رخآ ىلإ لكش نم ةلوهسب .
تاٌناكمإ كنكمتو Linq ًف Linq to xml نم تاملعتسا ةباتك نم xml ؾلم كٌدل نوكٌ دقف xml ًلاتلاك تاٌرتشم بلط لثمٌ
PurchaseOrder.xml
<?xml version="1.0"?>
<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
<Street>123 Maple Street</Street>
<City>Mill Valley</City>
<State>CA</State>
<Zip>10999</Zip>
<Country>USA</Country>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
<Street>8 Oak Avenue</Street>
<City>Old Town</City>
<State>PA</State>
<Zip>95819</Zip>
<Country>USA</Country>
</Address>
<DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
<Items>
<Item PartNumber="872-AA">
<ProductName>Lawnmower</ProductName>
<Quantity>1</Quantity>
<USPrice>148.95</USPrice>
<Comment>Confirm this is electric</Comment>
</Item>
<Item PartNumber="926-AA">
<ProductName>Baby Monitor</ProductName>
<Quantity>2</Quantity>
<USPrice>39.98</USPrice>
<ShipDate>1999-05-21</ShipDate>
</Item>
</Items>
</PurchaseOrder>

مادختسابف Linq to xml ةفصلل ةلباقملا ةمٌقلا ىلع لوصحلل ملعتسا لٌؽشت كنكمٌ PartNumber تاٌرتشملا بلط ًف رصنع لك لجأ نم
Dim purchaseOrder As XElement = XElement.Load("PurchaseOrder.xml", LoadOptions.SetBaseUri
Or LoadOptions.SetLineInfo)

Dim partNos = _
From item In purchaseOrder...<Item> _
Select item.@PartNumber

148

مادختساب ةبترم ةمباق ىلع لوصحلا دٌرت دقو PartNumber نم رثكأ ةمٌقلا لمحت ًتلا رصانعلاب 100 تامولعملا هذه ىلع لوصحللو
ملعتسلا ةباتك اننكمٌ
Dim partNos = _
From item In purchaseOrder...<Item> _
Where (item.<Quantity>.Value * _
item.<USPrice>.Value) > 100 _
Order By item.<PartNumber>.Value _
Select item

مادختسابو Linq to xml تاناٌب ءاشنإ وأ صرقلا ىلإ ؾلم نٌزخت وأ صرقلا نم ؾلم لٌمحتك ءاٌشلا نم دٌدعلا لمع كنكمٌ xml نم
مادختساب ملعتسلا وأ رفصلا Xpath راجشأ عم لماعتلا ىتح وأ xml راجشأ ةحص نم دكؤتلاو لٌدعتلاو ؾذحلاو ةفاضلا ثٌح نم xml
مادختساب XSD راجشأ لٌوحتل انه درو امم ةعومجم مادختسا وأ xml رخآ ىلإ لكش نم
راجشأ ءاشنل ناتقٌرط كانهو xml ًف Visual Basic ؾٌرعتب امإ xml مادختساب وأ دوكلا ًف ةرشابم Linq APIs اتلكو ةرجشلا ءاشنل
ةٌنب سكع نم دوكلا نانكمت نٌتقٌرطلا xml رصنع اشنٌ لثم ًلاتلا دوكلاف ةلماك ةٌرجش xml
Dim contact1 As XElement = _
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
</contact>

ةٌنب ربع لقنتلل صباصخ ةدع كٌزٌاب لوجٌف مدقٌو xml تافصو رصانع ىلإ لوصولا نم كنكمت ًتلاو xml رصنع مسا دٌدحت قٌرط نع
xml قبارط ءاعدتسا كنكمٌ وأ نبلا Linq رصنعل ءانبلا رصانعلا دٌدحتل xml صباصخ مدختسٌ لثم ًلاتلا دوكلاف xml ىلإ ةراشلل
رصنعل ءانبلا رصانعلاو تافصلا xml ملعتسا امدختسم Linq رصنعك مهجارخإو ءانبلا رصانعلا ىلع لوصحلل xml
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1

Sub SampleTransform()

' Create test by using a global XML namespace prefix.

Dim contact = _
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>

Dim phoneTypes = _
<phoneTypes>
<%= From phone In contact.<ns:phone> _
Select <type><%= phone.@ns:type %></type> _
%>
</phoneTypes>

Console.WriteLine(phoneTypes)
End Sub

End Module

كنكمٌو Visual Basic راعتسم مسا دٌدحت نم Alias ءامسأ لاجمل Xml ةرابع مادختساب Imports ؾٌك انٌرٌ يذلا ًلاتلا دوكلا ًف امك
ةرابعلا مادختسا اننكمٌ Imports ءامسأ لاجم دارٌتسل XML
Imports <xmlns:ns="http://someNamespace">

صباصخ ىلإ لوصولل راعتسملا مسلا اذه مادختسا كنكمٌ ثٌح xml ؾراحم دٌدحتلو xml رصانعو ةقٌثو لجأ نم xml لوصحلا اننكمٌو
ضرؼ ىلع XNamespace لماعملا مادختساب ءامسأ لاجم ةبداب يأ لجأ نم GetXmlNamespace لاثملا ًف امك
149

' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">

Module GetXmlNamespaceSample

Sub RunSample()

' Create test by using a global XML namespace prefix.

Dim contact = _
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>

ShowName(contact.<ns:phone>(0))
End Sub

Sub ShowName(ByVal phone As XElement)
Dim qualifiedName = GetXmlNamespace(ns) + "contact"
Dim contact = phone.Ancestors(qualifiedName)(0)
Console.WriteLine("Name: " & contact.<ns:name>.Value)
End Sub

End Module

ءاشنإ ةٌفٌك ًلاتلا لاثملا انٌرٌو XElemnt ماعلا ءامسلا لاجم مادختساب ns
Dim contact1 As XElement = _
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone type="home">206-555-0144</ns:phone>
<ns:phone type="work">425-555-0145</ns:phone>
</ns:contact>

Console.WriteLine(contact1)

ؾراحم ةمجرتب كٌزٌاب لوجٌف مجرتم موقٌو xml ءامسأ تلاجمل ةراعتسملا ءامسلا يوتحت ًتلا Xml مدختسٌ يذلا افاكملا دوكلا ىلإ
نٌودت Xml ةفصلا مادختسابو تلاجملا كلت ًف مدختسملا xmlns دوكلا هدلوٌ يذلا يذٌفنتلا دوكلا سفن دلوٌ قباسلا دوكلاو ةمجرتلا دنع
ًلاتلا
Dim contact2 As XElement = _
<ns1:contact xmlns:ns1="http://someNamespace">
<ns1:name>Patrick Hines</ns1:name>
<ns1:phone type="home">206-555-0144</ns1:phone>
<ns1:phone type="work">425-555-0145</ns1:phone>
</ns1:contact>

Console.WriteLine(contact2)


ءامسأ تلاجم مادختسا نكمٌ Xml صباصخ عم ةماعلا Xml ًلاتلا لاثملا ًف امك
Console.WriteLine("Contact name is: " & contact1.<ns:name>.Value)


150

دبِاذخزعا غؼث Linq TO XML

مادختسا اننكمٌ Linq قباثو ءاشنل xml ةقٌثو ءاشنإب موقٌ يذلا ًلاتلا دوكلا رظنا كزٌاب لوجٌف ًف xml تاٌلمعلا نع تامولعم يوتحت
ماظنلا ًف ةٌراجلا
Dim xmlProc = <MyProcesses>
<%= From proc In System.Diagnostics.Process.GetProcesses() _
Select <process id=<%= proc.Id %>>
<name><%= proc.ProcessName %></name>
<threads><%= proc.Threads.Count %></threads>
</process> %>
</MyProcesses>

My.Computer.FileSystem.WriteAllText("d:\temp\processes.xml", xmlProc.ToString, False)
Process.Start("d:\temp\processes.xml")

ةدقعلا انؤشنأ ثٌح MyProcesses مسق ًف مث اهٌف ملعتسلا ةٌادب اهٌف انلخدأو select موقٌل ملعتسلا ةٌقب انلخدأو ةٌعرفلا دقعلا انؤشنأ
دقعلا كلت مٌق طبضب . ةقٌثو ًف دقعلا نع تامولعم ىلع لوصحلا نم كٌزٌاب لوجٌف اننكمٌ امك xml ًلاتلا دوكلا مدختسن ثٌح ةلوهسب
ًف اقباس اهباشنإب انمق ًتلا ةقٌثولا نم تامولعم راهظل ListBox
Dim xmlprocs1 = xmlProc...<process>
For Each a In xmlprocs1
Me.ListBox1.Items.Add(a.<name>.Value & " " & a.@id)
Next
تاملعتسا مادختساب ةقباسلا ةجٌتنلا سفن ىلع لوصحلا اننكمٌ وأ Linq ةقٌثو نم ملعتسلل xml دوكلا ًف امك
Dim xmlprocs1 = From pr In xmlProc...<process> _
Select pr.<name>.Value, pr.@id

For Each a In xmlprocs1
Me.ListBox1.Items.Add(a.name. & " " & a.id)
Next
ةقٌثو ءاشنإ دٌرن دقو xml قباثو نم ملعتسلا نأ ىلإ هابتنلا بجٌو صرقلا ىلع اقباس ةدوجوم ةقٌثو نم ملعتسل ةجٌتنك xml ساسح
ؾرحلا ةلاحل
Dim myCusts = XDocument.Load("c:\MyCustomers.xml")

Dim ukCustomers = <ukCustomers>
<%= From cust In myCusts...<Customer> _
Where cust.<Country>.Value = "UK" _
Select cust %>
</ukCustomers>
ةقٌثو نم رشابم ملعتسا ةباتك اننكمٌ وأ xml ًلٌ امك
Dim xmlPlant = XDocument.Load(CurDir() & "\plants.xml")

Dim qa = From p In xmlPlant...<PLANT> _
Select name = p.<COMMON>.Value _
Order By name
نم رثكأ ؾلكت ًتلا تاتابنلا ىلع لصحنل ؾلملا كلذ نم ملعتسا ةباتك دٌرن دقو 5
Dim qb = From p In xmlPlant...<PLANT> _
Where CInt(p.<PRICE>.Value) > 5 _
Select name = p.<COMMON>.Value

151

ملعتسا نم لسكإ ةقٌثو ءاشنإ دٌرن دقو Linq To xml حتفا اذل Excel ةٌلاتلا تاملكلا لولا رطسلا نم ىلولا اٌلخ ثلثلا ًف لخداو
لسلستلاب Name و Phone و Country مسقلا دٌدحت ًف همدختسن ًك ةبٌرجتلا تاناٌبلا نم ارطس اهتحت لخدأ مث اكٌمس طخلا لعجا مث
ةؽٌصب ؾلملا ظفحا مث اقحل انتاناٌب هٌف عضنس يذلا XML SpreadSheet ةطساوب وتلل هتؤشنأ يذلا ؾلملا حتفب مق مث Notepad خسناو
بتكاو رٌوطتلا ةبٌب ًف دوكلا ررحم ىلإ دع مث هتاٌوتحم عٌمج Dim Sheet = اهٌبش ابٌش كٌدل حبصٌف ةظفاحلا تاٌوتحم اهدعب قصلأ مث
ًلاتلاب
Dim Sheet = <?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>SamerSelo</Author>
<LastAuthor>SamerSelo</LastAuthor>
<Created>2008-09-19T20:31:43Z</Created>
<Version>12.00</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>7140</WindowHeight>
<WindowWidth>15255</WindowWidth>
<WindowTopX>120</WindowTopX>
<WindowTopY>150</WindowTopY>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Arial" x:CharSet="178" x:Family="Swiss" ss:Size="11"
ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<Worksheet ss:Name="حلسٚ1" ss:RightToLeft="1">
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="2" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Row>
<Cell><Data ss:Type="String">Name</Data></Cell>
<Cell><Data ss:Type="String">Phone</Data></Cell>
<Cell><Data ss:Type="String">Country</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">Test</Data></Cell>
<Cell><Data ss:Type="Number">123456</Data></Cell>
<Cell><Data ss:Type="String">Syr</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<Selected/>
<DisplayRightToLeft/>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>1</ActiveRow>
<ActiveCol>2</ActiveCol>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="حلسٚ2" ss:RightToLeft="1">
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
152

<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<DisplayRightToLeft/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="حلسٚ3" ss:RightToLeft="1">
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<DisplayRightToLeft/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>

ةقٌثو ةٌادب ًف ظحلن xml ـب ةصاخلا ءامسلا تلاجم ضعب دوجو وتلل اهانقصلأ ًتلا xml اندوك ةٌادب ًف اهدارٌتسل جاتحنسو اهتٌادب ًف
ملعتسلا ةباتك دنع رصانعلا ءامسأ ةفرعم ًف اندعاست ىتح ةٌلاتلا تادارٌتسلا لخدأ ؾلملا ةٌادب ًف تادارٌتسلا مسق ًف اذل
Imports <xmlns="urn:schemas-microsoft-com:office:spreadsheet">
Imports <xmlns:o="urn:schemas-microsoft-com:office:office">
Imports <xmlns:x="urn:schemas-microsoft-com:office:excel">
Imports <xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

نوكٌس ًلاثم ةلاح ًفو هصقب مق مث ةٌبٌرجتلا تاناٌبلا لثمٌ يذلا ءزجلا نع ثحبا دوكلا ررحم نم
<Row>
<Cell><Data ss:Type="String">Test</Data></Cell>
<Cell><Data ss:Type="Number">123456</Data></Cell>
<Cell><Data ss:Type="String">Syr</Data></Cell>
</Row>
رٌؽتملا لبق ًلاتلا ملعتسلا نلا لخدأ sheet ملعتسلا جتان لكش لٌكشتل ةصوصقملا صنلا ةعطق هٌف مدختسنس ثٌح اقباس هانفرع يذلا
Dim Customers = From Customer In db.Customers _
Order By Customer.CompanyName _
Select <Row>
<Cell><Data ss:Type="String"><%= Customer.CompanyName %></Data></Cell>
<Cell><Data ss:Type=" String"><%= Customer.Phone %></Data></Cell>
<Cell><Data ss:Type="String"><%= Customer.Country %></Data></Cell>
</Row>
ةعطق هنم انصصق يذلا ناكملل لقتنا مث xml ناكملا سفن ًف ًلاتلا رطسلا لاخدإب مقو اقباس
<%= Customers %>
رطسلا لدعو لٌلق ىلعلا ىلإ لقتنا
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="2" x:FullColumns="1"
ىلإ
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount=<%= Customers.Count + 1 %> x:FullColumns="1"
ًلاتلا دوكلاب متٌ اذهو ؾلملا ضرعو ظفحلا وه ىقبت ام لكو
153

Sheet.Save("d:\temp\customers11.xml")
Process.Start("d:\temp\customers11.xml")

154

ٍٝػ فشؼر Linq to SQL ٚ O/R Designer

مادختسا ةٌفٌك انل ضرعٌ طٌسب جمانرب ءاشنإب انه موقنس O/R Designer ءاشنل Entity Classes تاناٌب ةدعاق عم رشابملا لماعتلل
ًف ةدوجوم SQL Server تاناٌب ةدعاق ىلع اٌلاح دمتعؤسو NorthWind عقوم نم ةلوهسب اهٌلع لوصحلا كنكمٌ ًتلا ةرٌهشلا
ةذفان ًف رٌوطتلا ةبٌب لخاد نم ةدعاقلا كلتل لاصتا ءاشنإ كٌلع بجوتٌ امك كٌدل اهتٌبثتو تفوسوركٌام Server Explorer انٌلع لهسٌ ىتح
ًتلا تاٌساسلا ضعب كٌدل هنأ ضرتفأو انترود لاجم نع جراخ لاصتلا ءاشنإو تاناٌبلا ةدعاق بٌكرت عوضوم لاح لك ىلع لمعلا
ةبتكم ةعجارم كنكمٌو رومأ اذكه عم لماعتلا ًف كدعاست MSDN هذه ًف ةدعاسمل تجتحا نإ ةٌمٌلعتلا تفوسوركٌام تاهوٌدٌف ضعبو
روملا
نم Solution Explorer رتخا ةمباقلا نمو كعورشم ىلع ًنٌمٌلا ةرؤفلا رزب رقنا Add New رتخا راوحلا قودنص نمو Linq To SQL
Classes ةدٌدجلا ةبفلا ةٌمستب مق مث NorthWind.dbml طؽضا مث Add ةهجاو كل حتفٌف O/R Designer ةقلؽم تناك نإو ةؼرافلا
ىلع جودزملا رقنلا كنكمٌ NorthWind.dbml اهحتفل لحلا ؾشكتسم نم
تاناٌبلا ةدعاقب صاخلا لاصتلا عسو Northwind نم Server Explorer لودجلا بحساو Customers ةهجاو ىلإ O/R Designer مث
ةذفان ىلإ لقتنا اهدعبو ظفحلاب مق Data Sources طؽضا Add New Data Source راتخنس هذه انتلاح ًفو ؾولؤملا جلاعملا كل حتفٌف
Object طؽضن مث انه انلمعل بسانملا هنأ امب Next رتخاو جلاعملا ةذفان ًف دقعلا عسو مث Customer طؽضا مث Next مث Finish
لودجلا بحسب مقو جذامنلا ررحم ىلإ دع Customer ةهجاو نم DataSources و تاودأ طٌرش ءاشنإ متٌف ةذفانلا حطس ىلإ
DataGridView نٌمٌ ىلعأ رٌؽصلا مهسلا حتفا كلجأ نم DataGridView راٌخلا طبضاو Dock in parent Container ةكبش لعجل
تامكحتلل ءاشنإ نم انه روملا نم رٌثكلا انٌلع لهست رٌوطتلا ةبٌب نأ انه ظحلت امكو جذومنلا ًف ةؼرافلا ةحاسملا ةفاك لمت تاناٌبلا
لمعلا نم رٌثكلا انٌلع رفوٌ امم اهنٌب طبرلاو تابفلاو
ثدحلل جلاعم اشنأو جذومنلاب صاخلا دوكلا ررحمل لقتنا اذل دوكلا ضعب ةباتكل جاتحنس جذومنلا ىلع تاناٌبلا راهظإ لجأ نم Load
ثدحلا ؾٌرعت ةٌادب لبقو جذومنلل Load رٌؽتملا نأ ثٌح جذومنلا ىوتسم ىلع اماع نوكٌ ثٌحب ًلاتلا رٌؽتملا لخدأ جذومنلاب صاخلا Db
نم ناٌك وه انه NorthWindDataContext ـل ةبسنلاب ةٌسٌبرلا لوخدلا ةطقن اهنأ امب تاناٌبلا ةدعاق عم ًلعفلا انلاصتا لكشت ًتلاو Linq
To SQL
Private Db As New NorthWindDataContext
ثدحلا ًف Load ملعتسا عضنس جذومنلل Linq اهراهظإ متٌس ًتلا تاناٌبلاب اندوزٌ
Dim AllCustomers = From cust In Db.Customers _
Order By cust.CustomerID _
Select cust
ملعتسا اذه Linq ملعتسا يؤك يداع Linq ةٌصاخلا ةمٌق طبض وه تاناٌبلا راهظل انٌلع ام لك نلا ىتح ةرودلا ةٌادب ذنم همادختساب انمق
DataSource ـل CustomerBindingSourec انملعتسا ىلإ AllCustomers لؽش مث ملعتسلا دعب ةرشابم ًلاتلا رطسلا لخدأ
تاناٌبلا روهظ نم دكؤتو جمانربلا
Me.CustomerBindingSource.DataSource = AllCustomers
تاودلا طٌرش ىلع دوجوملا ظفحلا رز لعجاو جذامنلا ررحم ىلإ دع تاناٌبلا ةدعاق ىلإ اهب موقنس امبر ًتلا تلٌدعتلا ظفح لجأ نم
Enabled نم تاناٌبلا ظفحب موقٌس يذلا ًلاتلا دوكلا لخدأو دوكلا ررحمل لاقتنلاو هٌلع رقنلا ثدحل جلاعم ءاشنل اجودزم ارقن هٌلع رقنا مث
انلجأ
Me.Validate()
Me.CustomerBindingSource.EndEdit()

Try
Db.SubmitChanges()
MsgBox("Changes Saved")
Catch ex As Exception
MsgBox(ex.Message)
155

End Try

انمدختسا ثٌح Me.Validate ةقٌرطلا انٌعدتسا مث اهمٌق نم ققحتت نأ جذومنلا ىلع تامكحتلا عٌمج لعجل لوأ EndEdit ـل ةدباعلا
CustomerBindingSource ةقٌرطلا انمدختسا مث اهإاهنإ مت دق تاناٌبلا ىلع رٌرحتلا تاٌلمع عٌمج نأ نم دكؤتلا لجأ نم
SubmitChanges ـل ةدباعلا DataContext كولب انمدختساو تاناٌبلا ةدعاق ىلإ اٌلعف تاناٌبلا ظفحب موقتس ًتلا Try … Catch لجأ نم
ةقٌرطلا انمدختسا اننأ عمو ظفحلا ةٌلمع ءانثأ هفداصن امبر ؤطخ يأ طاقتلا SubmitChanges اهمادختسا نكمٌ هنأ لإ تاددحم نودب انه
دادعتلا عون نم دٌحو ددحم رٌرمتب ConflictMode نٌتٌمٌق ىدحإ كلتمٌ يذلا FailOnFirstConflict تاناٌبلا ثٌدحت ةٌلمع ؾقوت ًتلا
و ةٌضارتفلا ةمٌقلا ًهو براضت لوأ لوصح دنع تاناٌبلا ةدعاق ىلإ ContinueOnConflict تثدح ول ىتح ظفحلا ةٌلمع عباتت ًهو
تاناٌبلا ةدعاق ىلإ تاناٌبلا ثٌدحت ةٌلمع ءاهتنا دعب اهدٌعتو تابراضتلا هذه عٌمجتب موقتو تابراضت
لكاشم ةٌأ نودب تاناٌبلا ؾذحو لٌدعتو ةفاضإ عٌطتست كنأ نم دكؤتلاو جمانربلا لٌؽشت ةطقنلا هذه دنع كنكمٌ
ًف تاودلا طٌرش ىلإ رماوأ رزو صوصن قودنص ةفاضإب مق ضرؽلا اذهلو جذومنلا ًف تاناٌبلا ىلع ةٌفصتلا ضعب ةفاضإ نلا دٌرن
يذلا ًلاتلا ملعتسلا نلا لخدأ هٌلع رقنلا ثدح ةجلاعم ءارجإ ًفو دوكلا ررحمل لقتنن ىتح رزلا ىلع اجودزم ارقن رقناو جذومنلا ىلعأ
ةٌصاخلا ثٌدحت دوكب هانعبتأ DataSource ـل CustomerBindingSource جباتنلا راهظل دٌدجلا ملعتسلا ىلإ
Dim CustNameQuery = From cust In Db.Customers _
Where cust.ContactName Like _
Me.ToolStripTextBox1.Text & "*" _
Order By cust.CustomerID _
Select cust

Me.CustomerBindingSource.DataSource = CustNameQuery

ةظحلم : هذه ةباتك ةقٌرطو ةؽٌص عم افلآتم تحبصأو ةٌادبلا ذنم ًعم زاتمم عباتم كنأ ضارتفاب انه تاملعتسلا حرشب موقأ ل انأ
ةقباسلا سوردلا ًف انلعف امك امامت انه لكش يؤبو انه اهدٌرت تاملعتسا ةٌأ ةباتك كنكمٌ امك تاملعتسلا

156


Linq To Sql Master/Detail

ةفاضإب مقو دٌدج كٌزٌاب لوجٌف عورشم حتفا Linq To SQL Classes اهمسو قباسلا سردلا ًف انلعف امك امامت هٌلإ NorthWind.dbml
نم مث Server Explorer تاناٌبلا ةدعاق لاصتا ةدقع عسو NorthWind نٌلودجلا راٌتخاب مقو Orders و Customers امهبحسب مقو
ةذفان ىلإ اعم O/R Designer ىعدت ىلولا انلجأ نم نٌتبف اشنٌ يذلا رملا Customer ةٌناثلا و Order تماق رٌوطتلا ةبٌب نأ ىرنو
ةدعاق ًف نٌدوجوملا نٌلودجلا ًف ةدوجوملا لوقحلا امامت لثامت نٌتبفلا اتلك صباصخ عٌمج نأ ظحلن امك اٌباقلت امهنٌب ةقلعلا طبضب
ةعباتملا لبق نلا عورشملا ظفحب مق تاناٌبلا
ةذفان ىلإ لقتنا Data Sources رتخاو Add New Data Source هب لاصتلا دٌرن يذلا عونلا نأ جلاعملا ًف ىلولا ةحفصلا نم رتخاو
وه Object طؽضا مث Next لودجلا راٌتخاب مقو دقعلا عسو مث جلاعملا نم ةٌلاتلا ةحفصلل لاقتنلل Customer طقف نودب لودجلا راٌتخا
Order طؽضا مث Next مث Finish ةذفان ًف ظحلتسو Data Sources ةبفلا جاردإ مت دق هنأ Customer ةبفلا رهظتو Orders نباكك
راٌتخاب انمق اذهلو اهنم ًعرف Customer جلاعملا ًف طقف
بحسا Customer ءاشنإ متٌل ةذفانلا حطس ىلإ DataGridView تاودأ طٌرشو ةذفانلا ىلع BindingNavigator مق مث ةذفانلا ىلعأ ًف
بحسب Orders ءاشنل ةذفانلا حطس ىلإ DataGridView ىلولا لفسأ ىرخأ
ثدح ةجلاعمل ءارجإ ءاشنإب مقو جذومنلاب صاخلا دوكلا ررحم ىلإ لقتنا Load رٌؽتملا لاخدإب مق ةرشابم ءارجلا ؾٌرعت لبقو جذومنلل
نم اناٌك نوكٌل جذومنلا ىوتسم ىلع ًلاتلا ماعلا NorthWindDataContext ًتلاو لكشت انلاصتا ًلعفلا عم ةدعاق تاناٌبلا امب اهنأ ةطقن
لوخدلا ةٌسٌبرلا ةبسنلاب ـل Linq To SQL
Private Db As New NorthWindDataContext
ثدحلا ءارجإ ًف ًلاتلا دوكلا لخدأ نٌتكبشلا اتلك ًف رهظت تاناٌبلا لعجلو Load جمانربلا ةبرجتب مقو جذومنلل
Me.CustomerBindingSource.DataSource = Db.Customers
تاناٌب نأ دجتس جمانربلا ةبرجت دنعو Orders انلجأ نم هب موقت اذهو اهبلج مت دق Linq to Sql نٌب ةدوجوملا ةقلعلا ببسب ةٌفلخلا ًف
انؤشنأ امدنع نٌلودجلا Entity Classes ةطساوب لمعلا ةٌادب ًف O/R Designer نم لجس راتخت امدنع كنأ وه اٌلعف ثدحٌ يذلاو
Customers تاناٌب بلجٌ ملعتسا اٌباقلت دلوتٌ Orders تاناٌبلا ةكبش ًف اهرهظٌو نٌلودجلا نٌب ةقلعلا بجومب لجسلا اذهب ةطبترملا
ةٌناثلا
ًف طٌرشلا ىلع دوجوملا ظفحلا رز لعجاو جذامنلا ررحم ىلإ دع تاناٌبلا ةدعاق ىلع اهب موقن تافاضإ وأ تلٌدعت ةٌأ ظفح عٌطتسن ًكل
جذومنلا ىلعأ Enabled ظفحلا دوك نوكٌسو دوكلا ررحمل لاقتنلاو هٌلع رقنلا ثدحل ةجلاعم ءارجإ ءاشنإ لجأ نم اجودزم ارقن هٌلع رقناو
قباسلا سردلا ًف هانمدختسا يذلا دوكلاب اهٌبش
Me.Validate()
Me.OrdersBindingSource.EndEdit()
Me.CustomerBindingSource.EndEdit()

Try
Me.Db.SubmitChanges()
MsgBox("Changes Saved.")
Catch ex As Exception
MsgBox(ex.Message)
End Try
لمعت ةفاضلاو لٌدعتلاو ؾذحلا تاٌلمع عٌمج نأ نم دكؤتو جمانربلا برج
ؾضأو جذامنلا ررحم ىلإ لقتنا ComboBox عٌطتسن ىتح ةرفوتملا لودلا ءامسؤب هبلمب موقنس يذلا جذومنلا ىلعأ ًف تاودلا طٌرشل
ثدحلا تاٌوتحم لماك لدبتساو دوكلا ررحمل نلا لقتنا ةنٌعم ةلود ًف نٌدوجوملا نبابزلا راٌتخا Load موقٌس يذلا ًلاتلا دوكلاب جذومنلل
157

مادختسا ظحل لودلا ءامسؤب ةمباقلا قودنص المب distinct جباتن كانه نوكت امدنع ةرركم جباتن انل بلجٌ ل ًك ملعتسلا ةرابع ًف
تاناٌبلا ةدعاق نم ةداعم ةهباشتم
Dim CusCountry = From co In Db.Customers _
Where co.Country <> String.Empty _
Order By co.Country _
Select co.Country Distinct

Me.ToolStripComboBox1.Items.Clear()

For Each co In CusCountry
Me.ToolStripComboBox1.Items.Add(co)
Next

ثدحل ةجلاعم ءارجإ اشنأ SelectedIndexChanged ـل ToolStripComboBox1 راهظإ متٌ ًكل ًلاتلا ملعتسلا دوك هٌف لخدأو
ةبكرملا ةمباقلا قودنص نم اهراٌتخا دنع ةنٌعم ةلود ًف ةدوجوملا نبابزلا
Dim CustQuery = From co In Db.Customers _
Where co.Country = Me.ToolStripComboBox1.SelectedItem.ToString _
Select co

Me.CustomerBindingSource.DataSource = CustQuery
ثدح ةجلاعمل ءارجإ اشنأ مث جذومنلا لفسأ صوصن قودنص ؾضأ ددحملا نوبزلا تابلطل نحشلا روجأ عومجم ىلع لوصحللو
CurrentChanged ـب صاخلا CustomerBindingSource ًلاتلا دوكلا هٌف لخدأو
Dim ro = CType(Me.CustomerBindingSource.Current, Customer)

Dim FriSum = Aggregate ord In Db.Orders _
Where ord.CustomerID = ro.CustomerID _
Into Sum(ord.Freight)

Me.TextBox1.Text = FriSum.ToString
ًف ًلاحلا لجسلا تامولعم ىلع لوأ انلصح ثٌح CustomerBindingSource مادختسل انررطضا انهو CType ةٌصاخلا جتان لٌوحتل
Current بولطملا عونلا ىلإ امب اهنأ دٌعت ةمٌق نم عونلا Object رٌؽتملا عون ددحن مل اننأ امبو ro ةباٌن كلذب موقتسف هنع حٌرصتلا دنع
ملعتسا انمدختسا مث عونلا ىلع ًلحملا للدتسلا ةزٌم انع aggregate ًلاحلا نوبزلاب ةصاخلا تابلطلا نحش روجأ عومجم باسحل
ًتكبش نٌب طابترلا دقفنل ًكلو نٌعم خٌرات دعب ددحملا نوبزلا تابلط راهظإ عٌطتسن ىتح جذومنلا ىلإ صوصن قودنصو ارز ؾضأ
ثدحلا ةجلاعم ءارجإ ىلإ لقتنا تاناٌبلا CurrentChanged ـب صاخلا CustomerBindingSource دوكلا لبق ًلاتلا دوكلا هٌف لخدأو
ـل ةحٌحصلا مٌقلا طبض دٌعن ًك هٌف دوجوملا OrdersBindingSource انملعتسا ذفننس امدنع اقحل اهرٌؽنس اننأ امب
Me.OrdersBindingSource.DataSource = CustomerBindingSource
Me.OrdersBindingSource.DataMember = "Orders"
Me.TextBox2.Text = String.Empty

ًلاتلا دوكلا هٌف لخدأو جذومنلل هانفضأ يذلا رزلا ىلع رقنلا ثدح ةجلاعمل ءارجإ اشنأ
Dim ro = CType(Me.CustomerBindingSource.Current, Customer)

If IsDate(Me.TextBox2.Text) Then
Dim SpOrd = From ord In Db.Orders _
Where ord.CustomerID = ro.CustomerID _
And ord.OrderDate >= CDate(Me.TextBox2.Text) _
Select ord

Me.OrdersBindingSource.DataSource = SpOrd
Else
Me.OrdersBindingSource.DataSource = CustomerBindingSource
Me.OrdersBindingSource.DataMember = "Orders"
158

Me.TextBox2.Text = String.Empty
End If

ـل ةبسنلاب ًلاحلا لجسلا تامولعم ىلع ةٌادبلا ًف انلصح ثٌح Customers رٌؽتملا ًف ro ةرابع انمدختسا مث If ةلادلا و CDate ققحتلل
مٌق طبض دٌعن احٌحص اخٌرات نكٌ مل نإو ملعتسلاب ةعباتملا لبق حٌحص خٌرات لاخدإب ماق دق مدختسملا نأ نم OrdersBindingSource
تابلطلا بلجب موقٌ ملعتسا اشنن احٌحص اخٌرات لخدا دق ناك نإو صوصنلا قودنص ًف دوجوملا صنلا ػٌرفتب موقنو ةٌلصلا مٌقلا ىلإ
مسق ًف رهاظ وه امك ًلاحلا نوبزلاب ةصاخلاو صوصنلا قودنص ًف دوجوملا خٌراتلا دعب اهخٌرات ًتلا Where موقن مث ملعتسلا ًف
ةٌصاخلا طبضب DataSource ـل OrdersBindingSource تاناٌبلا ةكبش ًف ملعتسلا نم ةداعملا تاناٌبلا ضرع متٌ ًك انملعتسا ىلإ
ةٌناثلا

159

دبئف ءبشٔئ خ١ف١و ٓػ غ٠شع يبضِ Linq To SQL ب٠ٚذ٠

ـلا نأ ؾٌك ةقباسلا سوردلا ًف انٌأر O/R Designer تابف ءاشنإب موقٌ Linq To SQL اضٌأ ىعدت امك وأ Entity Classes نم ةلوهسب
اشلاب ملعلا لجأ نم كلذ لمع ةٌفٌكل عٌرس ضارعتساب سردلا اذه ًف موقؤسو اٌودٌ كلذب ماٌقلا اننكمٌ كلذ عمو انلجأ
اشنأ اعورشم ادٌدج نم عونلا Console Application همسو LinqConsoleApp
• نم ةمباق Project رتخا Add Reference نمو ةحفص . net رتخا System.Data.Linq مث طؽضا Ok
• ًف ةٌادب ؾلملا ًف ىلعأ ررحم دوكلا ؾضأ تادارٌتسلا ةٌلاتلا
Imports System.Data.Linq
Imports System.Data.Linq.Mapping

ؾٌضنس نلا Entity Class يذلاو نع ةرابع نع ةبف ةمظنم قفو لودج ةدعاق تاناٌب ءاشنلو هذه ةبفلا ؾٌضن ةفصلا Table لبق ؾٌرعت
ةبفلا تلاو كلتمت ةٌصاخلا Name ًتلا ددحت مسا لودجلا ًف ةدعاق تاناٌبلا مث نوكٌس انٌلع ةفاضإ ةبسانملا صباصخلا لثمتل ةدمعأ لودجلا
متٌو دٌدحت طبرلا عم ةدمعلا ًف ةدعاق تاناٌبلا مادختساب ةفصلا Column ًتلاو كلتمت ةدع صباصخ ؾٌرعتل دومعلا لثم IsPrimaryKey
ًتلا كلتمت ةٌقطنم ةمٌق ددحت امٌف اذإ ناك دومعلا حاتفم ًساسأ مأ ل ةٌصاخلاو Storage ًتلا ددحت مسا لقحلا صاخلا يذلا نزخٌس ةمٌق
ةٌصاخلا – ؾضأ ةبفلا ةٌلاتلا دعب ؾٌرعت ـلا Module لبقو Sub Main لودجلا لثمتس ًتلاو Customers اعبط تاناٌبلا ةدعاق ًف
تررق نإو انه راصتخلا لجا نم كلذو لوقحلا عٌمج سٌلو انه لودجلا ًف ةدوجوملا لوقحلا ضعب لجأ نم صباصخلا ضعب تفرع
هلثمت يذلا لودجلل امامت ةقباطم نوكت ثٌحب ةبفلا ؾٌرعت كٌلع اٌلمع ةقٌرطلا هذه مادختسا
<Table(Name:="Customers")> _
Public Class Customer

Private _CustomerID As String
<Column(IsPrimaryKey:=True, Storage:="_CustomerID")> _
Public Property CustomerID() As String
Get
Return Me._CustomerID
End Get
Set(ByVal value As String)
Me._CustomerID = value
End Set
End Property

Private _City As String
<Column(Storage:="_City")> _
Public Property City() As String
Get
Return Me._City
End Get
Set(ByVal value As String)
Me._City = value
End Set
End Property

Private _ContactName As String
<Column(Storage:="_ContactName")> _
Public Property ContactName() As String
Get
Return Me._ContactName
End Get
Set(ByVal value As String)
Me._ContactName = value
End Set
End Property

End Class

160

جاتحنس ىلإ ءاشنإ لاصتا عم ةدعاق تاناٌبلا NorthWind ًتلا اهمدختسنس اذل جاتحنس ىلإ ؾٌرعت ضرؼ DataContext يذلاو ربتعٌ
ةانقلا ةٌسٌبرلا ةءارقل تاناٌبلا اهنٌزختو ًف ةدعاق تاناٌبلا – لخدأ رطس دوكلا ًلاتلا ًف ءارجلا Sub Main ةدعاق نأ رابتعاب كلذو
ؾلملا ًف ةدوجوم تاناٌبلا NORTHWND.MDF دلجملا ًف دوجوملا D:\TEMP لاثملا اذه ةبرجت دنع يدل
Dim db As New DataContext("D:\TEMP\NORTHWND.MDF")
مث موقنس ءاشنإب نباك Table(of Customer) ًك همدختسن ًف ملعتسلا نم لودجلا Customers لخدأ دوكلا ًلاتلا ةرشابم دعب دوكلا
قباسلا
Dim Customers As Table(Of Customer) = _
db.GetTable(Of Customer)()

ؾضأ رطسلا ًلاتلا نم دوكلا يذلا عبطٌس ىلع ةذفان لوسنوكلا رماوأ Sql ًتلا متٌس اهذٌفنت ىلع ةدعاق تاناٌبلا
db.Log = Console.Out
بتكنس نلا ملعتسا Linq ملعتسٌل يأ نم نبابزلا نٌدوجوم ًف ندنل – لخدأ دوك ًلاتلا ملعتسلا دعب دوكلا ةرشابم قباسلا
Dim custQuery = From cust In Customers _
Where cust.City = "London" _
Select cust

جباتن ىلع لوصحللو ملعتسلا ةقلح مدختسنس For Each ةذفان ىلع اهتعابط مث ةقباسلا سوردلا ًف انٌأر امك ملعتسلا جباتن ربع نارودلل
لوسنوكلا


Console.WriteLine("Number Of Records: " & custQuery.Count.ToString)

For Each CustObj In custQuery
Console.WriteLine(CustObj.CustomerID.ToString & ", " & _
CustObj.City & ", " & CustObj.ContactName)
Next

Console.ReadLine()


عورشملل لماكلا دوكلا وه اذهو
Imports System.Data.Linq
Imports System.Data.Linq.Mapping

Module Module1

<Table(Name:="Customers")> _
Public Class Customer

Private _CustomerID As String
<Column(IsPrimaryKey:=True, Storage:="_CustomerID")> _
Public Property CustomerID() As String
Get
Return Me._CustomerID
End Get
Set(ByVal value As String)
Me._CustomerID = value
End Set
End Property

Private _City As String
<Column(Storage:="_City")> _
161

Public Property City() As String
Get
Return Me._City
End Get
Set(ByVal value As String)
Me._City = value
End Set
End Property

Private _ContactName As String
<Column(Storage:="_ContactName")> _
Public Property ContactName() As String
Get
Return Me._ContactName
End Get
Set(ByVal value As String)
Me._ContactName = value
End Set
End Property

End Class

Sub Main()
Dim db As New DataContext("D:\TEMP\NORTHWND.MDF")

Dim Customers As Table(Of Customer) = _
db.GetTable(Of Customer)()

db.Log = Console.Out

Dim custQuery = From cust In Customers _
Where cust.City = "London" _
Select cust

Console.WriteLine("Number Of Records: " & custQuery.Count.ToString)

For Each CustObj In custQuery
Console.WriteLine(CustObj.CustomerID.ToString & ", " & _
CustObj.City & ", " & CustObj.ContactName)
Next

Console.ReadLine()

End Sub

End Module


162

دبِلؼزعا ٍٝػ خٍضِأ Linq

قرط ىلإ قرطتأ نلو تاملعتسلا هذه ةباتك بولسأ ىلع رثكأ ؾرعتن ًك ةفلتخم تاملعتسا ىلع ةلثملا ضعب دروؤس سردلا اذه ًف
ةقلح مادختساب نارودلاب امإ ةقباسلا سوردلا ًف ةدراولا ةلثملا للخ نم كلذ لمع نكمٌ ؾٌك انٌأر اننأ امب تاملعتسلا هذه مادختسا For …
Each ًف راهظلا وأ مكحت وأ رٌؽتمل رشابملا دانسلاب وأ DataGridView
مٌق ةعومجم ىلع يوتحٌ لقحل ىمظعلا ةمٌقلا ىلع لوصحلل ملعتسلا ًف ةٌعٌمجتلا تلادلا مادختسا ىلع طٌسب لاثم
Dim Wod = Aggregate Wdt In ads.WorkingDate _
Into Mdt = Max(Wdt.WorkingDate)

نٌلقح حرط ةٌلمع جتان عومجم ىلع لوصحلل ةٌعٌمجتلا تلادلا مادختسا ىلع رخآ لاثم
Dim TempBal = Aggregate AccBa In AccMov _
Into Bal = Sum(AccBa.DebitAmmount - AccBa.CreditAmmount)

مدختسٌ رخآ طٌسب لاثم Like مسق ًف Where ةددحم جباتن ةعومجم ىلع لوصحلل ملعتسلا ًف
Dim AccMov = From AccBal In Accds.AccountMovements _
Where AccBal.AccountNumber Like (AccNum & "*") _
Select AccBal

ةلادلا مدختسٌ لاثم ToLower مسق ًف Where ؾرحلا ةلاحب ةٌفصتلا طرش رثؤتٌ ل ثٌحب ملعتسلا جباتن ىلع لوصحلل
Dim Qts = From cu In Db.Customers _
Where cu.Country.ToString.ToLower Like "po*".ToLower _
Select cu

مدختسٌ رخآ طٌسب لاثم Order By اٌدعاصت جباتنلا بٌترتل
Dim ParentList = From ParLst In AccountsDataSet.Accounts _
Where ParLst.IsChildAccount = False _
Order By ParLst.AccountNumber _
Select ParLst
ةفاضإب كلذو ًلٌ امك ملعتسلا حبصٌ اٌلزانت بٌترتلا لجأ نمو Descending مسق ًف زرفلا لقح دعب Order By
Dim ParentList = From ParLst In AccountsDataSet.Accounts _
Where ParLst.IsChildAccount = False _
Order By ParLst.AccountNumber Descending _
Select ParLst

مادختسا عم تاناٌب ةدعاق ًف نٌنزخم ةٌنمز ةرتفو خٌرات نم بستحم خٌرات ةداعإب موقٌ لاثملا اذه Join مٌقلا ىلع لوصحلل نٌلودج طبرل
امهنم
Dim Edat = From de In DsDesposits.Deposits _
Join Dp In DsDesposits.InterestRates _
On de.InterestID Equals Dp.InterestID _
Select EndDate = DateAdd(DateInterval.Month, _
intrst.First, DepDet.First.StartDate)

163

مدختسٌ ملعتسا نع رخآ لاثم Join ملعتسلا مادختسا مث ملعتسلل ةجٌتنك ةددحم لوقح راٌتخا مث امهنم ملعتسلا لجأ نم نٌلودج طبرل
مادختسا مث ةٌفاضإ ةجٌتن ىلع لوصحلا لجأ نم رخآ ملعتسا لخاد Join جباتنلا ىلع لوصحلل لودجو ملعتسا طبر ةجٌتن نم ملعتسلل
ةبوؼرملا
Dim MovNam = From Acc In SampleDatabaseDataSet.ACCOUNTS _
Join Mov In SampleDatabaseDataSet.ACCOUNTS_MOVEMENTS _
On Acc.ACC_NUMBER Equals Mov.ACC_NUMBER _
Select Mov.MOVMENT_DATE, Mov.ACC_NUMBER, Acc.ACC_NAME, _
Mov.DEBIT_AMOUNT, Mov.CREDIT_AMOUNT

Dim AccBal = From AcBa In MovNam _
Group By acc_number = AcBa.ACC_NUMBER _
Into Balance = Sum(AcBa.DEBIT_AMOUNT - AcBa.CREDIT_AMOUNT)


Dim AccBalName = From ab In AccBal Join ac In SampleDatabaseDataSet.ACCOUNTS _
On ab.acc_number Equals ac.ACC_NUMBER _
Select ab.acc_number, ac.ACC_NAME, ab.Balance

مدختسٌ لاثملا اذه Join ةفلتخم لوادج ةعبرأ نم ملعتسلا ةجٌتن جباتنلا انٌطعٌ ملعتسا ءاشنل
Dim ViewData = From Cu In DsDesposits.Customers _
Join Dp In DsDesposits.Deposits On Dp.CustomerID _
Equals Cu.CustomerID _
Join DepPer In DsDesposits.InterestRates On DepPer.InterestID _
Equals Dp.InterestID _
Join CaDp In DsDesposits.CalculatedDepsits On CaDp.DepositID _
Equals Dp.DepositID _
Where CaDp.CalculationReason = 2 _
And CaDp.CalculationDate >= FromDate _
And CaDp.CalculationDate <= ToDate _
Select Cu.Name, Dp.DepositNumber, Dp.DepositAmount, Dp.StartDate, _
CaDp.CalculationDate, DepPer.DepositPreiod

صوصخب ىلولا نٌتطقن هٌف لاثملا اذه in تاملعتسا ًف ةمدختسملا sql موقن اذل انه ةدوجوم رٌؼ ًهف مٌق ةمباق نم ةجٌتن ىلع لوصحلل
مدختسن مث ةفوفصم ًف مٌقلا عضوب Contains ملعتسا ةجٌتن مادختسا عٌطتسن اننأ ًه ةٌناثلاو ةجٌتنلا سفن ىلع لوصحلل ملعتسلا ًف
رخآ ملعتسل لخدك
Dim Vlu() As Byte = {0, 3, 4, Nothing, 6}
Dim DepDet = From De In DsDesposits.Deposits _
Where De.DepositID = Dr.DepositID _
And Vlu.Contains(De.DepositStatus)

Dim Intrst = From Irs In DsDesposits.InterestRates _
Where Irs.InterestID = DepDet.First.InterestID _
Select Irs.DepositPreiod, Irs.InterestRate

مدختسٌ رخآ لاثم Join اعم ةفوفصملا ةقٌرطو
Dim Vlu() As Byte = {0, Nothing, 3, 4, 6}
mDep = From d In DsDesposits.Deposits _
Join i In DsDesposits.InterestRates On d.InterestID Equals i.InterestID _
Where DateAdd(DateInterval.Month, i.DepositPreiod, d.StartDate)_
<= Now.Date _
And Vlu.Contains(d.DepositStatus) _
Select d.DepositID

164

مسق ًفف نٌلخادتم نٌملعتسا مدختسٌ لاثملا اذه select ةقٌرطلا انمدختسا لولا ملعتسلا ةٌاهن ًف Except نم ةداعملا جباتنلا ءانثتسل
ةقٌرطلل ددحمك ررمملا ًناثلا ملعتسلا Except
Deps = (From d In DsDesposits.Deposits _
Join i In DsDesposits.InterestRates _
On i.InterestID Equals d.InterestID _
Where (d.StartDate <= New Date(Ryear, 12, 31) _
And vlu.Contains(d.DepositStatus)) _
And DateAdd(DateInterval.Month, i.DepositPreiod, d.StartDate)_
>= New Date(Ryear, 12, 31) _
Select d.DepositID).Except( _
From ca In DsDesposits.CalculatedDepsits _
Where ca.EndDate = New Date(Ryear, 12, 31) _
Select ca.DepositID)

165

خّعشزٌّا دبِلؼزعلا Compiled Queries

ةمجرت ربع ءادلا ةداٌز كنكمٌ تارملا نم دٌدعلا ةهباشتم تاملعتسا مدختسٌ قٌبطت انٌدل نوكٌ امدنع Compile مث ةدحاو ةرم ملعتسلا
نٌدوجوملا نبابزلا عٌمج نع ملعتسلاب موقٌ قٌبطت كٌدل نوكٌ دقف ةرم لك ًف ةفلتخم تاددحم رٌرمت ربع اقحل تارملا نم دٌدعلا هذٌفنت
معدت انهو مدختسملا لبق نم ذٌفنتلا تقو ًف ةنٌدملا مسا رٌرمت متٌ ثٌحب ةددحم ةنٌدم ًف Linq to Sql اذهل ةمجرتملا تاملعتسلا مادختسا
ضرؽلا
ةبفلا كروومٌرفلا انل رفوت ثٌح CompiledQuery هذهو مادختسلا لجا نم تاملعتسلل تقإملا نٌزختلاو ةمجرتلا ةٌناكمإب اندوزت ًتلا
ءامسلا لاجم ًف ةدجاوتم ةبفلا System.Data.Linq ًه ةدٌحو ةٌصاخ كلتمت ًهو Expression ادمل رٌبعتك ملعتسلا دٌعت ًتلا
Lambda Expression ةقٌرطلا ًه انه اهمادختسا متٌ ًتلاو مهلا ةقٌرطلا نكلو قرطلا ضعب كلتمت ًهو Compile ةدع كلتمت ًتلا
ةهباشتم ةلمحم لاكشأ
Public Shared Function Compile(Of TArg0 As DataContext, TArg1, TResult) ( _
query As Expression(Of Func(Of TArg0, TArg1, TResult)) _
) As Func(Of TArg0, TArg1, TResult)


Public Shared Function Compile(Of TArg0 As DataContext, TArg1, TArg2, TResult) ( _
query As Expression(Of Func(Of TArg0, TArg1, TArg2, TResult)) _
) As Func(Of TArg0, TArg1, TArg2, TResult)


Public Shared Function Compile(Of TArg0 As DataContext, TArg1, TArg2, TArg3, TResult) ( _
query As Expression(Of Func(Of TArg0, TArg1, TArg2, TArg3, TResult)) _
) As Func(Of TArg0, TArg1, TArg2, TArg3, TResult)


Public Shared Function Compile(Of TArg0 As DataContext, TResult) ( _
query As Expression(Of Func(Of TArg0, TResult)) _
) As Func(Of TArg0, TResult)


تاددحملا لثمت ثٌح TArg ضوفملل ررمملا ددحملا عون Delegate ةقٌرطلا نم داعملا ضوفملا ذٌفنت متٌ امدنع Compile ددحملا و
TResult عونلا نم وه IEnumerable(T) ةقٌرطلا نم داعملا ضوفملا ذٌفنت دنع داعملا Compile
نٌزخت ةٌلمع نوكت تلاحلا هذه ًفف ًلاحلا ذٌفنتلا راسم لاجم جراخ تاملعتسلا مادختسا ةداعإ ًف بؼرت امبر تلاحلا نم دٌدعلا ًف
ةنكاس تارٌؽتم ًف ةمجرتملا تاملعتسلا Static Variables ةبف انٌدل دجوت ًلاتلا دوكلا ًفف ةلاعف ةركف Queries لجأ نم ةممصم
تاناٌب ةدعاق نم ملعتسلل مدختست ةمجرتملا تاملعتسلا نٌزخت NorthWind ةقٌرطب Linq to Sql
Class Queries

Public Shared CustomersByCity As _
Func(Of NorthWindDataContext, String, IQueryable(Of Customer)) = _
CompiledQuery.Compile(Function(db As NorthWindDataContext, _
city As String) _
From c In db.Customers Where c.City = city Select c)

Public Shared CustomersById As _
Func(Of NorthWindDataContext, String, IQueryable(Of Customer)) = _
CompiledQuery.Compile(Function(db As NorthWindDataContext, _
id As String) _
db.Customers.Where(Function(c) c.CustomerID = id))

End Class
ًلٌ امك مجرتملا ملعتسلا مدختست ةفٌظو ؾٌرعت اننكمٌ ثٌح
Public Function GetCustomersByCity(ByVal city As String) As _
166

IEnumerable(Of Customer)

Return Queries.CustomersByCity(db, city)
End Function
ًف ملعتسلا جباتن ضرعل ةفٌظولا هذه مادختسا مث DataGridView ًلٌ امك
Me.DataGridView1.DataSource = GetCustomersByCity("London").ToList
ًف ةرشابم ملعتسلا ةجٌتن رهظن ثٌحب مجرتملا ملعتسلل رشابملا مادختسلا ىتح وأ DataGridView
Me.DataGridView1.DataSource = Queries.CustomersByCity(db, "London").ToList



167

هٕ١ٌ دبِلؼزعل خظظخِ كئاشؽ خفبػئ Linq

ةهجاولل ةعسوم ؾباظو ةفاضإب كنٌل تاملعتسا عم اهمادختسا كنكمٌ ًتلا قبارطلا ةعومجم عٌسوت كنكمٌ IEnumerable(T) ىلإ ةفاضإف
ةلاد ءاشنإ كنكمٌ امك مٌق ةلسلس نم ةدٌحو ةمٌق باسحل ةٌعٌمجت ةلاد ةفاضإ لثم اننكمٌ ىصقلا دحلا وأ ًطسولا لثم ةٌدٌلقتلا تاٌلمعلا
ةهجاولا عٌسوتب موقت امدنعف ىرخأ ةلسلس ىلإ تاناٌبلا نم ةنٌعم ةلسلس لٌوحتل وأ صصخم حشرم لكشت IEnumerable(T) ؾٌضت تنؤف
دادعتلل ةلباق ةعومجم يل ةصصخم تلاد .
ىعدت ةعسوم ةقٌرط ءاشنإ ةٌفٌك انٌرٌ ًلاتلا لاثملاف Median عونلا نم ماقرأ ةلسلس ًطسو باسحل Double
Imports System.Runtime.CompilerServices

Module LINQExtension

' Extension method for the IEnumerable(of T) interface.
' The method accepts only values of the Double type.
<Extension()> _
Function Median(ByVal source As IEnumerable(Of Double)) As Double
If source.Count = 0 Then
Throw New InvalidOperationException("Cannot compute median for an empty
set.")
End If

Dim sortedSource = From number In source _
Order By number

Dim itemIndex = sortedSource.Count \ 2

If sortedSource.Count Mod 2 = 0 Then
' Even number of items in list.
Return (sortedSource(itemIndex) + sortedSource(itemIndex - 1)) / 2
Else
' Odd number of items in list.
Return sortedSource(itemIndex)
End If
End Function
End Module
انٌرٌو ةٌعٌمجتلا تلادلا ءاعدتساب اهب موقت ًتلا ةقٌرطلا سفنب دادعتلل ةلباق ةعومجم يأ نم ةعسوملا ةقٌرطلا هذه ءاعدتسا كنكمٌ ثٌح
ةفوفصم عم ةقباسلا ةقٌرطلا مادختسا ةٌفٌك ًلاتلا لاثملا double
Dim numbers1() As Double = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}
Dim query1 = Aggregate num In numbers1 Into Median()
MsgBox("Double: Median = " & query1)
ةمٌقلا جتنٌ نأ بجٌ قباسلا ملعتسلاف 4.85 لخدلا مٌق بسحب
ةلمحم ةعسوم ؾباظو ؾٌضن نأ نكمٌ امك Overloaded تاناٌبلا عاونأ نم عون لك لجأ نم
' Integer overload
<Extension()> _
Function Median(ByVal source As IEnumerable(Of Integer)) As Double
Return Aggregate num In source Select CDbl(num) Into med = Median()
End Function

لثامم اهمادختسا نوكٌو
Dim numbers1() As Double = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}
Dim query1 = Aggregate num In numbers1 Into Median()
MsgBox("Double: Median = " & query1)

Dim numbers2() As Integer = {1, 2, 3, 4, 5}
168

Dim query2 = Aggregate num In numbers2 Into Median()
MsgBox("Integer: Median = " & query2)

ةماع اضارؼأ لبقت ةلمحم ةعسوم ةقٌرط ةفاضإ اننكمٌ امك Generic Objects اضوفم ذخؤت ًهو Delegate لٌوحتل همدختستو ددحمك
ـل ةلمحم ةقٌرط ًلاتلا دوكلا انٌرٌو ددحملا عونلل ماعلا عونلا نم ضارؼلا ةسلس Median ذخؤت Func(T, TResult) اذهو ضوفم ددحمك
ماع عون نم ضرؼ ذخؤٌ ضوفملا T عونلا نم ضرؼ دٌعٌو Double
' Generic overload.
<Extension()> _
Function Median(Of T)(ByVal source As IEnumerable(Of T), _
ByVal selector As Func(Of T, Double)) As Double
Return Aggregate num In source Select selector(num) Into med = Median()
End Function

ةقٌرطلا مادختسا كنكمٌ ثٌح Median اهدنع كٌلع بجٌف ةلمحملا هتفٌظو عونلل نكٌ مل اذإ عون يأ نم ضارؼلا نم ةلسلس لجا نم
ضوفم ددحم رٌرمت Delegate Parameter ادمل رٌباعت مادختسا كنكمٌ امك Lambda Expressions لوجٌف ًف كنكمٌ امك ضرؽلا اذهل
مسق مادختسا طقف كٌزٌاب Aggregate وأ Group By مسقلا لاجم نمض رٌبعت وأ ةمٌق يأ رٌرمت كنكمٌ ثٌح ةقٌرطلا ءاعدتسا نم لدب
ةقٌرطلا ءاعدتسا ةٌفٌك ًلاتلا لاثملا انٌرٌو Median لجأ نم integer وأ String ًف صوصنلا لوط بستحٌ صوصنلا لجأ نمف
رٌرمت ةٌفٌك ىرن ثٌح ةفوفصملا Func(T, TResult) ةقٌرطلل Median ةلاح لك لجأ نم
Dim numbers3() As Integer = {1, 2, 3, 4, 5}

' You can use num as a parameter for the Median method
' so that the compiler will implicitly convert its value to double.
' If there is no implicit conversion, the compiler will
' display an error message.

Dim query3 = Aggregate num In numbers3 Into Median(num)
MsgBox("Integer: Median = " & query3)
Dim numbers4() As String = {"one", "two", "three", "four", "five"}

' With the generic overload, you can also use numeric properties of objects.

Dim query4 = Aggregate str In numbers4 Into Median(str.Length)
MsgBox("String: Median = " & query4)

' This code produces the following output:
' Integer: Median = 3
' String: Median = 4

عٌسوت اننكمٌ ةهجاولا IEnumerbale(T) نم ةعومجم ةداعإ انٌلع بجٌ ةلاحلا هذه ًفو مٌقلا نم ةلسلس دٌعت ةصصخم ملعتسا ةقٌرطب
عونلا IEnumerable(T) لاثملا انٌرٌو مٌقلا نم ةلسلس ىلإ تاناٌب لٌوحت وأ حٌشرت لجا نم ركذ امل ةلثامم ةقٌرط مادختسا نكمٌ ثٌح
ىعدت ةعسوم ةقٌرط ءاشنإ ةٌفٌك ًلاتلا AlternateElements لولا رصنعلا نم اءدب ةعومجملا ًف ىرخلا رصانعلا عٌمج دٌعت
' Extension method for the IEnumerable(of T) interface.
' The method returns every other element of a sequence.
<Extension()> _
Function AlternateElements(Of T)(ByVal source As IEnumerable(Of T)) _
As IEnumerable(Of T)
Dim list As New List(Of T)
Dim i = 0
For Each element In source
If (i Mod 2 = 0) Then
list.Add(element)
End If
169

i = i + 1
Next
Return list
End Function

نم ىرخأ ةقٌرط يأ ًعدتست امدنع لعفت امك امامت دادعتلل ةلباق ةعومجم يأ لجأ نم ةعسوملا ةقٌرطلا هذه ءاعدتسا كنكمٌ ثٌح
ةهجاولا IEnumerbale(T) دوكلا ًف ىرن امك
Dim strings() As String = {"a", "b", "c", "d", "e"}
Dim query = strings.AlternateElements()
For Each element In query
MsgBox(element)
Next

' This code produces the following output:
' a
' c
' e





170

ِٓبضٌا ُغمٌا - ءبّعلا دلبغِٚ دبٙعاٌٛاٚ دبئفٌا



ةٌلاتلا عٌضاوملا مضٌو :
 ةبزجت ةبفلا وأ بٌكرتلا ىلع ةدع تافلم
 Overriding WndProc
 تاهجاولا Interfaces
 قٌقحت ةهجاولا IEnumerable
 ةرادإ رداصملا ةهجاولاو IDisposable
 Using Generics with Interfaces
 ةرظن نمض لاجم ءامسلا MY
 ؾٌك موقت ةفاضإب كتاءارجإ ةصاخلا ىلإ لاجم ءامسلا My
 ؾٌك عٌطتست قلطإ كثادحأ ةصاخلا RaiseEvent Tutorial
 قبارطلا ةعّ س َ وُ ملا Extension Methods
 ةقٌرطلا Main
 لٌمحتلا دبازلا تلماعملل Operators Overloading
 ءاشنإ ةبتكم ؾٌضت ؾباظو ةدٌدج تامكحتلل ةدوجوملا نودب مادختسا ةثارولا
 عٌسوت لاجم ءامسلا My مادختساب My Extensibility
 لعج قودنص صوصنلا لبقٌ تاٌلمعلا ةٌباسحلا نودب مادختسا ةٌصاخلا Text
لاودو لٌوحت عاونلا

171

خئضغر ت١وشزٌا ٚأ خئفٌا دبفٍِ حذػ ٍٝػ


نٌفلم هٌلإ ؾضأ و ادٌدج اعورشم اشنأ Code File
نع ةرابع وه يذلا ًلاتلا دوكلا لخدأ لولا ؾلملا ًف اهمسا ةبف Person

Public Class Person

Public Property FirstName() As String
Get
Return _FirstName
End Get
Set(ByVal value As String)
_FirstName = value.Trim
End Set
End Property

Public Property LastName() As String
Get
Return _LastName
End Get
Set(ByVal value As String)
_LastName = value.Trim
End Set
End Property

Public Sub New()
_FirstName = "John"
_LastName = "Doe"
End Sub

End Class

نع ةرابع وه يذلا ًلاتلا دوكلا لخدأ ًناثلا ؾلملا ًف نلا ةمتت ةبفلا person اهسفن


Partial Public Class Person

Private _FirstName As String
Private _LastName As String

Public Sub New(ByVal FirstName As String, ByVal LastName As String)
_FirstName = FirstName.Trim
_LastName = LastName.Trim
End Sub

Public ReadOnly Property FullName() As String
Get
Return _FirstName & " " & _LastName
End Get
End Property
172

End Class

ؾٌرعت لبق ًناثلا ؾلملا ًف ظحل ةبفلا ةملكلا مادختسا Partial ةبزجت نم اننكمت ًتلا ًهو ةبفلا Class وأ بٌكرتلا Structure ةدع ىلإ
تافلم

Partial Public Class Person

ؾٌرعت كٌزٌاب لوجٌف مدختسٌ ةٌبزجلا ةبفلا لصفل ةلصفنم تافلم ىلع مدختسملا لبق نم بوتكملا دوكلا نم اٌباقلت دلوملا دوكلا . ىلعف لٌبس
تابف ددحٌ جذامنلا ممصم لاثملا Class جذومنلا لثم تامكحتلل ةٌبزج From. كٌلعو تامكحتلا هذهل اٌباقلت دلوملا دوكلا لدعت لأ . لاثم اذهو
رخآ

Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class

Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
مادختسا ىقبٌو ةبفلا انك امك دحاو ؾلم نمض ناك ول امك وه امك اقباس لعفن


173

Overriding WndProc


لٌؽشتلا ماظن لسرٌ – زودنٌولا – ذفاونلا ةبٌب ًف تارٌٌؽتلا نع اهربخت ًتلاو تاقٌبطتلل لباسرلا عاونأ عٌمج . ربخت لباسرلا هذهو
ةبٌب ًف تارٌٌؽتلل ةباجتسلا ىلإ ةفاضلاب قلؼلاو ،رٌؽصتلا ،ءافخلا ،مٌجحتلا ةداعإ ،لقنلا ،مسرلا ةداعإك ءاٌشأ ةدعب ماٌقلاب جذومنلا
ذفاونلاب قلعتم رخآ اش يؤب ماٌقلا وأ ذفاونلا . ًف ءارجلا اذه ىعدٌو لباسرلا كلتل ةباجتسلل هقلطإ متٌ ءارجإ ذفاونلا تاقٌبطت عٌمجل نوكٌو
ةداعلا WindowProc ىعدٌ ءارجإ ًف لباسرلا هذه تٌن تود كٌزٌاب لوجٌف جلاعٌو WndProc ءاٌشأ لمعل هزواجت كنكمٌ يذلا
ةنٌعم لباسرل كجمانرب لابقتسا دنع ةصصخم .
ءارجلا زواجتب موقن ثٌحب ةهجاولا تاساٌق بسن سفنل ةذفانلا ءاقبإ جمانربلا نمضٌ ؾٌك رهظٌ ًلاتلا دوكلا لثمف WndProc
ةلاسرلا نع ثحبلاو جذومنلاب صاخلا WM_SIZING جذومنلا مجح رٌٌؽتل اهرجب مدختسملا موقٌ ًتلا ةفاحلا نمضتت تاددحم لبقتست ًتلا
عونلا نم بٌكرتو Rect بٌكرتلا دٌدحتب دوكلا أدبٌو نٌدٌدجلا همجحو هناكم جذومنلل ًطعٌ Rect ءارجلل زواجت ءارجإ نع نلعٌ مث
WndProc ءارجلا ددحٌ مث جذومنلل ةٌساسلا مٌقلا لمحت ًتلا ةنكاسلا تارٌؽتملاو تباوثلا ضعب ددحٌ يذلاو WndProc ةلاسرلا عون
تناك نإف اهتجلاعمب موقٌ ًتلا WM_SIZING ةفٌظولا مدختست PtrToStructure خسنل m.LParam بٌكرتلا ىلإ Rect متٌ يذلا
امهنٌب ةبسنلاو جذومنلل نٌدٌدجلا لوطلاو ضرعلا باسحل همادختسا . ذٌفنت متٌ ًتلا ىلولا ةرملا ًه هذه تناك نإف WndProc نوكتف اهٌف
نكاسلا رٌؽتملا ةمٌق كلذب fixed_aspect_ratio ضرعلاو لوطلا ةبسن نٌزختب موقٌ رفصلل ةٌواسم هتمٌق نأ ىرٌ امدنعو رفصلل ةٌواسم
موقٌ مث رٌؽتملا كلذ ًف جذومنلل نٌٌلاحلا WndProc اهرٌٌؽت مت نإف ةٌلصلا ةمٌقلا نع ةفلتخم جذومنلاب ةصاخلا ةبسنلا تناك اذإ امٌف دٌدحتب
دعب يأ ررقٌ ) ضرع وأ لوط ( نٌدعبلا يأ باسحب ءارجلا موقٌ اٌاوزلا ىدحإ نم بحسلاب موقٌ مدختسملا ناك نإف هظفح متٌس ) وأ لوط
ضرع ( جذومنلاب ةصاخلا ضرعلل لوطلا ةبسن ققحٌ يذلا رخلا دعبلا ةمٌق باسحب موقٌ مث ربكلا وه . دحأ بحسب موقٌ مدختسملا ناك نإو
مادختساب بحسلاب موقٌ ناك نإ كلذكو ةبسنلا بسح بسانملا عافترلا باسحب موقٌو دٌدجلا ضرعلا ىلع ظافحلاب جمانربلا موقٌ ؾارطلا
افترلا تٌبثتب موقٌ ةٌلفسلا وأ ةٌولعلا نٌتفاحلا ىدحإ ع بجٌ ناك اذإ امٌف رٌرقتب جمانربلا موقٌ مث ةبسنلا بسح مبلملا ضرعلا باسحب موقٌو
مٌق رٌؽٌ جمانربلاف ىلفسلا ةٌراسٌلا ةٌوازلا بحسٌ مدختسملا ناك نإ لثمف هبحسب مدختسملا موقٌ يذلا ؾرطلا كرحٌ ثٌحب جذومنلا لقن هٌلع
موقٌ مث ةتباث ىنمٌلا ةٌولعلا ةٌوازلا ىقبت ثٌحب لفسلاو راسٌلا WndProc ءاعدتساب Marshal.StructureToPtr بٌكرتلا خسنٌل Rect
ىلإ اددجم m.LParam موقٌ ارٌخأو WndProc ءاعدتساب MyBase.WndProc ءارجلل لاجملا كرتٌل WndProc مٌقلا مادختسل بلا
جذومنلا مجح رٌٌؽتل ةدٌدجلا . ءارجلا ءاعدتساو WndProc اهتجلاعم متٌ مل ةلاسر لكل هباعدتساب حمانربلا مقٌ مل نإف ادج ماه بلاب صاخلا
لكاشم ةدع كلذ نع جتنٌ امم اهب ةصاخلا لباسرلا عٌمج ةجلاعمب موقت نل ةذفانلاف ةجٌتنلابو اهتجلاعم متٌ نل ةلاسرلا كلت نإف لماك لكشب
جذومنلاب ةصاخلا روملا نم اهرٌؼ وأ مباوقلا راهظإ وأ كٌرحتلا وأ اهسفن مسر ةداعإ ىلع اهتردق مدعك ةفلتخم

Imports System.Runtime.InteropServices

Public Class Form1

Public Structure Rect
Public left As Integer
Public top As Integer
Public right As Integer
Public bottom As Integer
End Structure

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_SIZING As Long = &H214
Const WMSZ_LEFT As Integer = 1
Const WMSZ_RIGHT As Integer = 2
Const WMSZ_TOP As Integer = 3
Const WMSZ_TOPLEFT As Integer = 4
Const WMSZ_TOPRIGHT As Integer = 5
Const WMSZ_BOTTOM As Integer = 6
Const WMSZ_BOTTOMLEFT As Integer = 7
Const WMSZ_BOTTOMRIGHT As Integer = 8
Static fixed_aspect_ratio As Double = 0
Dim new_aspect_ratio As Double
If m.Msg = WM_SIZING And m.HWnd.Equals(Me.Handle) Then
' Turn the message’s lParam into a Rect.
174

Dim r As Rect
r = DirectCast( _
Marshal.PtrToStructure(m.LParam, GetType(Rect)), _
Rect)
' Get the current dimensions.
Dim wid As Double = r.right - r.left
Dim hgt As Double = r.bottom - r.top
' Get the new aspect ratio.
new_aspect_ratio = hgt / wid
' The first time, save the form’s aspect ratio.
If fixed_aspect_ratio = 0 Then
fixed_aspect_ratio = new_aspect_ratio
End If
' See if the aspect ratio is changing.
If fixed_aspect_ratio <> new_aspect_ratio Then
' To decide which dimension we should preserve,
' see what border the user is dragging.
If m.WParam.ToInt32 = WMSZ_TOPLEFT Or _
m.WParam.ToInt32 = WMSZ_TOPRIGHT Or _
m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Or _
m.WParam.ToInt32 = WMSZ_BOTTOMRIGHT Then

' The user is dragging a corner.
' Preserve the bigger dimension.
If new_aspect_ratio > fixed_aspect_ratio Then
' It’s too tall and thin. Make it wider.
wid = hgt / fixed_aspect_ratio
Else
' It’s too short and wide. Make it taller.
hgt = wid * fixed_aspect_ratio
End If
ElseIf m.WParam.ToInt32 = WMSZ_LEFT Or _
m.WParam.ToInt32 = WMSZ_RIGHT Then

' The user is dragging a side.
' Preserve the width.
hgt = wid * fixed_aspect_ratio
ElseIf m.WParam.ToInt32 = WMSZ_TOP Or _
m.WParam.ToInt32 = WMSZ_BOTTOM Then

' The user is dragging the top or bottom.
' Preserve the height.
wid = hgt / fixed_aspect_ratio
End If
' Figure out whether to reset the top/bottom
' and left/right.
' See if the user is dragging the top edge.
If m.WParam.ToInt32 = WMSZ_TOP Or _
m.WParam.ToInt32 = WMSZ_TOPLEFT Or _
m.WParam.ToInt32 = WMSZ_TOPRIGHT Then

' Reset the top.
r.top = r.bottom - CInt(hgt)
Else
' Reset the bottom.
r.bottom = r.top + CInt(hgt)
End If
' See if the user is dragging the left edge.
If m.WParam.ToInt32 = WMSZ_LEFT Or _
m.WParam.ToInt32 = WMSZ_TOPLEFT Or _
m.WParam.ToInt32 = WMSZ_BOTTOMLEFT Then

' Reset the left.
175

r.left = r.right - CInt(wid)
Else
' Reset the right.
r.right = r.left + CInt(wid)
End If
' Update the Message object’s LParam field.
Marshal.StructureToPtr(r, m.LParam, True)
End If
End If
MyBase.WndProc(m)
End Sub

End Class

كٌزٌاب لوجٌف ًف 6 ءارجإ تٌبثت جمانربلل نكمٌ هل ةقباسلا خسنلاو WindowProc ةٌلمعلا هذه ىعدتو ةبوعصب تاٌلمعلا سفن لمعل صاخ
ـب subclassing مسلا سفن مدختست هجوتلا ةٌضرؼ ةجمربلا نل قفوم رٌؼ مسلا ربتعٌو subclassing ىرخأ نم ةبف ءاشنإ ىلإ ةراشلل
ةرابعلل انمادختسا دنع لعفن امك Inherits زواجت ةٌلمع نوكتو WndProc ةقٌرطلا نم انمأ رثكأو رٌثكب لهسأ تٌن تود كٌزٌاب لوجٌف ًف
كٌزٌاب لوجٌف ًف ةمدختسملا 6 لٌوحتل عدخلا ضعبل ةجاحب تلزام كنكلو لاثملا ًف ظحلت امك IntPtr ًف نزخملا m.LParam ىلإو نم
ةبسانم بٌكارت . مٌق نم يأو اهضارتعاب موقتس لباسرلا نم يأ رٌرقت كٌلع نوكٌ امك m.LParam و m.WParam كنكمٌ ؾٌكو ذخؤت
نامؤب مهٌلع رٌثؤتلا . ءارجلا جاردإ وه لباسرلا هذه ملعتل قرطلا ىدحإو WndProc هتسارد دٌرت يذلا لمعلاب ماٌقلا مث ًلاتلا ) مجح رٌٌؽت
لاثملا لٌبس ىلع جذومنلا (

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Debug.Print(m.ToString)
MyBase.WndProc(m)
End Sub

ةلاسرلا لجأ نم ةجٌتنلا نٌبٌ ًلاتلا رطسلاو WM_SIZING مسا رهظٌ لقلا ىلعو همجح رٌٌؽتب مدختسملا موقٌ امدنع جذومنلا ىلإ ةلسرملا
ةلاسرلا WM_SIZING ةٌرشع تسلا اهتمٌقو 0x214

msg=0x214 (WM_SIZING) hwnd=0x30b8c wparam=0x2 lparam=0x590e29c result=0x0

مٌق ىنعم لثم اهتفرعمل جاتحت ىرخأ تامولعم ةداعلا ًف كٌطعٌ ىرخلا ةجمربلا عقاومو تفوسوركٌام عقوم ًف ةلاسرلا مسا نع ثحبلاو
m.WParam و m.LParam نأ ةظحلم ردجٌ امك Form class ءارجلا ثرٌ WndProc نم Control class ةٌقب هثرت ًتلاو
ءارجلا زواجت عٌطتست كنأ ًنعٌ يذلا و اهرودب جذومنلا ىلع تامكحتلا WndProc اهتافرصتب مكحتلا كنكمٌ كلذبو اهنم مكحت يؤب . لثمف
ةبفلا لمعت ؾٌك ةٌلاتلا دوكلا ةعطق انٌرت NoCtxMnuTextBox مكحتلا نم ةقتشملاو TextBox ءارجلا موقٌ ثٌحب WndProc صاخلا
ةلاسرلا صحفتب اهب WM_CONTEXTMENU لاشفإب ماٌقلابو ىرخلا لباسرلا عٌمج لجأ نم بلا ةبفلاب صاخلا ءارجلا ًعدتسٌ مث
ةلاسرلا ةجلاعم WM_CONTEXTMENU رقنت امدنع قصللاو خسنلا لثم رماوأ مضت ًتلاو مكحتلاب ةصاخلا ةقثبنملا ةمباقلا راهظإ عنمن
اهٌلع ًنٌمٌلا سواملا رزب

Public Class NoCtxMnuTextBox
Inherits System.Windows.Forms.TextBox
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_CONTEXTMENU As Integer = &H7B
If m.Msg <> WM_CONTEXTMENU Then
MyBase.WndProc(m)
End If
End Sub
End Class


176

دبٙعاٌٛا Interfaces

اهعم لماعتلاو اهباشنإو تابفلا نع ةٌارد هل نوكت نأ ًعم عباتٌ نمب ضرتفأ
ًتلا تابفلا اهنمضتت نأ بجٌ ةنٌعم رصانع ددحت ًهو ةنٌعم ةٌلمع معدت اهنأ نامضل ىرخلا عاونلا همدختست ًعجرم عون ًه ةهجاولا
تابفلاك امامت ثادحأ رصانعو صباصخو قبارط ىلع يوتحت ًهو تاهجاولا هذه ققحت
ةماعلا ةؽٌصلا
[ <attributelist> ] [ accessmodifier ] [ Shadows ] _
Interface name [ ( Of typelist ) ]
[ Inherits interfacenames ]
[ [ modifiers ] Property membername ]
[ [ modifiers ] Function membername ]
[ [ modifiers ] Sub membername ]
[ [ modifiers ] Event membername ]
[ [ modifiers ] Interface membername ]
[ [ modifiers ] Class membername ]
[ [ modifiers ] Structure membername ]
End Interface

تافصاو ةهجاولا نع حٌرصتلا قبسٌف ةماعلا ةؽٌصلا نم ىرن امكو Attributes لثم لاجملا دٌدحت تاملكو Public ةملكلا وأ Shadows
سفن ىلع يوتحت ًهو تابفلاك امامت ىرخأ نم ةهجاو ةثارو نكمٌ امك مسلا سفنبو ةدوجوم ةهجاو ؾٌرعت دٌعت ةهجاولا هذه نأ ًنعت ًتلا
صباصخو تلادو ؾباظو نم تابفلا نمض اهباوتحا نكمملا رصانعلا ... نودب طقف صباصخلاو ؾباظولا هذه ؾٌرعت ددحت اهنكلو خلا
نكمٌو ةهجاولا هذه نمض ةدوجوملا رصانعلا ةفاكل ًلمعلا دوكلا رفوت نأ ةنٌعم ةهجاو ققحت ةبف يأ ىلع بجٌو اهلمع ددحٌ يذلا دوكلا
ىوتسم ىلع ةهجاولا ؾٌرعت Namespace وأ Module اننكمٌ امك نٌعم ءارجإ نمض روصحم رٌؼو اماع اهفٌرعت نوكٌ نأ بجٌ يأ
ةملكلا مادختساب ةٌضارتفا ةٌصاخ دٌدحت نكمٌ امك ىرخأ ةهجاو نمضتت نأ نكمم ةهجاو ةٌأ نأ ثٌحب تاهجاولا شٌشعت Default نكمٌ لو
لثم لوصولا تاددحم مادختسا Public وأ Private مادختسا نكمٌ نكلو ةهجاولا رصانع نع حٌرصتلا دنع Overloads وأ Shadows
لوصولا ددحم مادختساب ةبفلا هذه رصانع نع نلعلا متٌ ةبف نمض ةهجاو مدختست امدنعو Public هرٌٌؽت كنكمٌ يذلا رملا اٌضارتفا
ؾرحلاب امود مسلا أدبٌ نأ لضفٌ تاهجاولا ةٌمست دنعو ةهجاولا نمض تارٌؽتم نع حٌرصتلا نكمٌ ل امك ةبفلا كلت ىوتسم ىلع اقحل I

تاهجاولا نع ةلثملا ضعب نلا ىرنل
ًلٌ امك صباصخلا ضعب ىلع يوتحت صاخشل ةهجاو ؾرعن نأ نكمٌ
Interface IPerson
Property Name() As String
Property Birthdate() As Date
ReadOnly Property Age() As Integer
End Interface

ةٌباسحلا تاٌلمعلا ضعبل ةهجاو ؾٌرعت اننكمٌ وأ
Interface ISomeMath
Function AddNumbers(ByVal a As Integer, ByVal b As Integer) As Integer
Function AddNumbers(ByVal a As Double, ByVal b As Double) As Double
Function Multiply(ByVal a As Integer, ByVal b As Integer) As Double
End Interface


177

ًلٌ امك صاخشلا ةهجاو ثرت ؾتاوهلا رتفدل ةهجاو ؾرعن نأ نكمٌ امك
Interface IPhonebook
Inherits IPerson

Property Phone() As String
Property Address() As String
Sub ShowInformations()
End Interface

ةهجاولا ققحت نأ اهنم دٌرن ؾتاوهلل ةبف انٌدل تناك نإ نلا Phonebook ةملكلا مدختسن Implements ةبفلا كلت نع حٌرصتلا دعب امامت
ةدٌدجلا ةبفلا ىلإ ةهجاولا كلت رصانعل ًساسلا لكٌهلا ؾٌضتس رٌوطتلا ةبٌب نأ ىرنسو
Public Class Phones
Implements IPhonebook

Public ReadOnly Property Age() As Integer Implements IPerson.Age
Get

End Get
End Property

.......

End Class

ةدحاولا ةبفلا نمض ةهجاو نم رثكأ مادختسا نكمٌ امك
Class SomeTest
Implements IPerson
Implements ISomeMath

Public ReadOnly Property Age() As Integer Implements IPerson.Age
Get

End Get
End Property

.......


Public Function AddNumbers(ByVal a As Double, ByVal b As Double) As Double _
Implements ISomeMath.AddNumbers

End Function

.......


End Class

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

اهضعب لخادب تاهجاولا شٌشعت ىلع لاثم اذهو
Interface IPhonebook
178

Interface IPersone
Property Name() As String
Property Birthdate() As Date
ReadOnly Property Age() As Integer
End Interface

Property Phone() As String
Property Address() As String
Sub ShowInformations()
Event SomeEvent(ByVal a As Int16)
End Interface

ةبفلا نمض اهمادختساو
Class test
Implements IPhonebook
Implements IPhonebook.IPersone

.......

End Class

ياإع :
ةقٌقحلا ل دجأ تاهجاولا ىوس اهنأ ربجت اهمدختسم ىلع ؾٌرعت ءاضعأ ةهجاولا ) صباصخ وأ لاود وأ ؾباظو ( لخادب ةبفلا . ةرابعب ىرخأ
دروتست لكٌه ةبف نم نود يأ دوك !!
اذامف دٌفتسؤس نم اذه رملا ؟
ةاٛغٌا
اذإ تلقنت ًف ضعب تابفلا تاهجاولاو ًف msdn دجتس نأ تفوسوركٌام كمزلت مادختساب ةهجاو ةنٌعم ءادل ضرؼ نٌعم ) يأ نامض نأ
كتبف نمضتت رصانع ةنٌعم ةمزل مامتل ةمهملا ًتلا تنأ ددصب ماٌقلا اهب ( ةرابع مدختست امدنع لثمف Using نأ بجٌ رٌؽتم نع حٌرصتلل
ةهجاولل ةققحم اهعون نم رٌؽتملا اذه ؾرعن ًتلا ةبفلا نوكت IDisposable نل كلذو Using ًف ةرفوتم نوكت نأ ةنٌعم رصانع ىلإ جاتحت
ةهجاولا ةبفلل اهرفوت رصانعلا هذهو هفرعت يذلا رٌؽتملا IDisposable


179

خٙعاٌٛا ك١محر IEnumerable(Of T)

ةهجاولا ؾٌرعت متٌ IEnumerable(T) ةداعإ نم ةدبافلا نمكتو ةمٌق ةمٌق لسلستم لكشب مٌقلا نم ةلسلس ةداعإ عٌطتست تابف ةطساوب
ةٌفاك ةركاذ مدختست تنؤف اهٌلع لمعلا لجأ نم ةركاذلا ًف تاناٌبلا نم ةلماك ةعومجم لٌمحت كٌلع بجٌ ل هنأ ًه ةقٌرطلا هذهب تاناٌبلا
ةهجاولا ققحت ًتلا تابفلا مادختسا نكمٌو تاناٌبلا نم دحاو رصنع لٌمحتل IEnumerbale(T) تاقلح عم For … Next تاملعتسا عم وأ
كنٌل Linq
كنٌل تاملعتسا قٌبطتلا مدختسٌف نٌعم ثحب راٌعم قفاوت ًتلا ؾلملا رطسأ دٌعٌو رٌبك ًصن ؾلم نم ةءارقلا نٌعم قٌبطت ىلع ناك نإف
تاٌوتحم لٌمحت قٌبطتلا ىلع بجٌ كنٌل ملعتسا ةطساوب ؾلملا تاٌوتحم نع ملعتسللو نٌعم ثحب راٌعم قباطت ًتلا رطسلاب ةدوعلل
نع لدبو ةركاذلا نم ارٌبك اردق كلهتست ةعومجم وأ ةفوفصم نمض هلمكؤب ؾلملا لٌمحت ةٌلمع نكلو ةعومجم وأ ةفوفصم نمض ؾلملا
دادعتلل ةلباق ةبف مادختساب ؾلملا تاٌوتحم نع ملعتسلا كنٌل ملعتسل نكمٌ كلذ Enumerable Class طرش قباطت ًتلا مٌقلا كلت طقف دٌعت
ةركاذلا نم رٌثكب لقأ اردق كلهتست ةقباطم مٌق ةعضب دٌعت ًتلا تاملعتسلاف ثحبلا
ةهجاولا ققحت ةبف ءاشنإ كنكمٌو IEnumerable(T) ةهجاولا ققحت ًتلا كتبفو دادعتلل ةلباق تاناٌبك ةٌردصملا تاناٌبلا مدقتل
IEnumerable(T) ةهجاولا ققحت ةٌناث ةبف ىلإ جاتحتس IEnumerator(T) ناتبفلا ناتاه كنكمت ثٌحب ةٌردصملا تاناٌبلا لوح نارودلل
ةهجاولا ققحت ىلولا ناتبف ءاشنإب موقنس لاثملا اذه ًفو ددحم عون نم لسلستم لكشب تاناٌبلا رصانع ةداعإ نم IEnumerbale(Of
String) ةهجاولا ققحت ةٌناثلاو IEnumerator(Of String) ةرم لك ًف دحاو رطس ًصن ؾلم نم ةءارقلل نامدختست ثٌحب
عونلا نم ادٌدج اعورشم اشنأ Class Library هتٌمستب مقو StreamReaderEnumerable نم مث Solution Explorer ةداعإب مق
ؾلملا ةٌمست Class1.vb ىلإ StreamReaderEnumerable.vb ىلإ ةبفلا مسا رٌٌؽت لبقا رٌوطتلا ةبٌب كتلؤس نإو
StreamReaderEnumerable عورشملا ىلع ًنٌمٌلا ةرؤفلا رزب رقنا مث StreamReaderEnumerable رتخاو Add مث New item
مث Class ؾلملا ةٌمستب مقو StreamReaderEnumerator.vb
ؾلملا حتفا StreamReaderEnumerable.vb لخدا ةبفلا ؾٌرعت دعب ماعلا مسقلا ًفو
Implements IEnumerable(Of String)
طؽضا مث Enter ةهجاولا قٌقحتل ةٌرورضلا رصانعلا ةفاضإب اٌباقلت كٌزٌاب لوجٌف موقٌف IEnumerable(Of String) interface ىلإ
ؾلملا راسم وه دحاو ددحم ذخؤٌ ةبفلل ماع ًناب ةفاضإب نلا موقنسو كدوك
Private _filePath As String

Public Sub New(ByVal filePath As String)
_filePath = filePath
End Sub

ةفٌظولل بسانملا دوكلا ةفاضإب نلا موقنس GetEnumerator ةبفلل ادٌدج ادجاوت دٌعت ثٌحب StreamReaderEnumerator نكمٌو
ةهجاولا رصانع ضرع دٌرت كنل اصاخ ةفٌظولا هذه ؾٌرعت لعج IEnumerable(Of String) ًلاتلل اقباطم ةفٌظولا دوك لعجا طقف
Public Function GetEnumerator() _
As System.Collections.Generic.IEnumerator(Of String) _
Implements System.Collections.Generic.IEnumerable(Of String).GetEnumerator

Return New StreamReaderEnumerator(_filePath)
End Function

Public Function GetEnumerator1() _
As System.Collections.IEnumerator _
Implements System.Collections.IEnumerable.GetEnumerator

Return Me.GetEnumerator()
End Function

180

ؾلملا حتفا StreamReaderEnumerator.vb ةبفلل ماعلا مسقلا ًفو StreamReaderEnumerator طؽضا مث ًلاتلا رطسلا لخدأ
Enter
Implements IEnumerator(Of String)
ةهجاولا قٌقحتل ةٌرورضلا رصانعلا ةفاضإ متٌف IEnumerator(Of String) موقتس ًتلا ةبفلا ًناب لكشٌس يذلا ًلاتلا دوكلا ؾضأ كدوكل
ؾلملا راسم وه ادٌحو اددحم ذخؤٌ ثٌحب هٌلع جرخلاو لخدلا تاٌلمع ذٌفنتو ؾلملا حتفب
Private _sr As IO.StreamReader

Public Sub New(ByVal filePath As String)
_sr = New IO.StreamReader(filePath)
End Sub

صباصخلا ةٌلاحلا تاهجاولـل IEnumerator(Of String) و IEnumerator دٌعت رصنعلا ًلاحلا نم ؾلملا ًصنلا صنك نكمٌو لعج
ؾٌرعت ةٌصاخلا Current ةهجاولا صباصخ ضرع كٌلع هنل اصاخ IEnumerable(Of String) ةٌصاخلا دوك لعجا نلا طقف
Current ًلاتلل اقباطم
Private _current As String

Public ReadOnly Property Current() As String _
Implements IEnumerator(Of String).Current

Get
If _sr Is Nothing OrElse _current Is Nothing Then
Throw New InvalidOperationException()
End If

Return _current
End Get
End Property

Private ReadOnly Property Current1() As Object _
Implements IEnumerator.Current

Get
Return Me.Current
End Get
End Property

ةقٌرطلا لقنتت MoveNext ةهجاولل IEnumerator ةٌصاخلا نم ةداعملا ةمٌقلا ثدحتو ًصنلا ؾلملا ًف ًلاتلا رصنعلل Current مل نإو
ةقٌرطلا دٌعت ىرخأ رصانع ةٌأ دجوٌ دعٌ MoveNext ةمٌقلا False ةمٌقلا دٌعت ؾوسف لإو True دوك لعجا نلا MoveNext ًلٌ امك
Public Function MoveNext() As Boolean _
Implements System.Collections.IEnumerator.MoveNext

_current = _sr.ReadLine()
If _current Is Nothing Then Return False
Return True
End Function

ةقٌرطلا هجوتو Reset ةهجاولل IEnumerator ةٌصاخلا ةمٌق غرفتو ًصنلا ؾلملل ةٌادبلا ةطقن ىلإ لاقتنلاب راركتلا ةطقن
CurrentItem
ةقٌرطلا دوك لعجأ Reset ًلٌ امك
181

Public Sub Reset() _
Implements System.Collections.IEnumerator.Reset

_sr.DiscardBufferedData()
_sr.BaseStream.Seek(0, IO.SeekOrigin.Begin)
_current = Nothing
End Sub

ةقٌرطلا نمضتو Dispose ةهجاولل IEnumerator يذلا ؾلملا ضبقمف راركتلا رٌمدت لبق اهرٌرحت متٌس ةرادم رٌؽلا رداصملا عٌمج نأ
ضرؽلا لبق نم مدختسٌ StreamReader يذلا دوكلا لدبتسا راركتلا دجاوت رٌمدت متٌ نأ لبق هقلؼإ متٌ نأ بجٌو ةرادم رٌؼ دراوم وه
ةقٌرطلا لجأ نم دلو Dispose ًلاتلا دوكلاب
Private disposedValue As Boolean = False

Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' Dispose of managed resources.
End If
_current = Nothing
_sr.Close()
_sr.Dispose()
End If

Me.disposedValue = True
End Sub

Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub

Protected Overrides Sub Finalize()
Dispose(False)
End Sub

عونلا نم دٌدج عورشم ةفاضإب مق اهباشنإب انمق ًتلا تابفلا ةبرجت لجأ نم Windows Application ىلإ Solution
StreamReaderEnumerable تابفلا ةبتكمل عجرم ةفاضإب مق مث StreamReaderEnumerable ىلع نمٌلا ةرؤفلا رزب رقنلاب كلذو
راٌتخا مث دٌدجلا عورشملا Add Reference ةحفص نمو Projects ةروكذملا تابفلا ةبتكم رتخا
جذومنلا ىلع ؾضأ ListBox و Button ًلٌ امك جذومنلا دوك لعجاو
Imports StreamReaderEnumerable

Public Class Form1

Private Sub Button1_Click() Handles Button1.Click
Dim adminRequests = _
From line In New
StreamReaderEnumerable.StreamReaderEnumerable("c:\ipconfig.txt") _
Where line.Contains("Display")

Me.ListBox1.Items.Clear()
Me.ListBox1.Items.AddRange(adminRequests.ToArray)
End Sub

End Class

182

ةبفلا انمدختسا ثٌح StreamReaderEnumerable ؾلملا نم روطسلا بلجٌ كنٌل ملعتسا ًف c:\ipconfig.txt ىلع يوتحت ًتلا
ةملكلا Display


183

خٙعاٌٛاٚ سدبظٌّا حسادئ IDisposable


مدقٌ Visual Basic .net رداصملا ةرادإ ًف ةدٌدج ةفاطعنا . ـلا رفوٌ ثٌح CLR تاٌافنلا عمج مساب ؾرعت رداصملا ةرادل ةٌنقت Garbage
Collection ةركاذلا ةرادإ ماهم مظعم نم روطملا رٌرحتل كلذو . ةرادإ عم لماعتلا نم لماك لكشب كررحٌ لو نمث نودب ًتؤٌ ل اذه نكلو
ةركاذلا . اٌودٌ اهنم صلختلاب موقت نأ بجٌ ًتلا رصانعلا صوصخب رثكأ اكردم نوكت نأ ىلع تاٌافنلا عماج كربجٌ تلاحلا ضعب ًفف
ةبسانم ةقٌرطب اهرٌرحت مت دق رداصملا نأ نم دكؤتلاو . ءاٌشلا رٌمدت متٌ ىتم لوح قلقلل رطضت نل تلاحلا بلؼأ ًف نكلو .
ًف Visual Basic 6.0 اش ىلإ رٌشت ًتلا تارٌؽتملا عٌمج حبصت امدنع Object ىلإ ةنٌعم نٌعم Nothing ةركاذلا رٌرحت متٌ اهدنع
يروف لكشب تارٌؽتملا هذهب ةطبترملا . ـلا ذخؤٌو CLR نٌسحت ىلع زٌكرتلا نم نٌروطملا نكمٌ امم رداصملا ةرادإ لوح ةٌلوإسملا هذه نلا
ةركاذلا ةرادإ ةرفٌش نم رٌثكلا ةباتك نع اضوع مهجمارب .
ةرفٌشلا ةباتك تاسرامم ًف تارٌٌؽت بلطتٌ اذهو . ىلإ ام رٌؽتم طبضت امدنع لثمف Nothing اشلا رٌمدت متٌ ل Object نكلو ةرشابم
تاٌافنلا عماج هددحٌ ام اذهو اقحل هرٌمدت متٌ ؾوس . جمانربك تلاحلا ضعب ًف نكلو كقٌبطت ىلع اذه رثإٌ نأ بجٌ ل تلاحلا بلؼأ ًفو
ةنورملاو ءادلا ًتٌحان نم ةٌقٌقح ةلضعم لكشٌ نأ نكمٌ ةحاتملا ماظنلا رداصم ةلق طؽض تحت عقٌ . ءادلا اهٌف نوكٌ ًتلا تلاحلا ًفف
اهمادختسا نم كؼارف روف ماظنلا رداصم غارفإ كتامامتها لوأ نم نوكٌ ًساسأ .
ةفلكم تاٌافنلا عماج تارود نأ كنهذ ًف قبأ . كفلخ ؾٌظنتلاب تمق املكف ارٌثك رركتم لكشب لمعلا نم تاٌافنلا عماج عنم ًف نمكت ةركفلاو
كجمانرب ءادأ نٌسحتب موقت كلذبو هلمعل تاٌافنلا عماجل لقأ لمع تكرت املك .

دب٠بفٌٕا غِبع The Garbage Collector
ةرادم رٌؼ رداصم مدختسٌ قٌبطتلا ناك اذإ Unmanaged Resources رصانع وأ تافلملا تارشإم وأ ةصاخ ةركاذ دٌدحتك
ىلع ارداق نوكٌ دق هنأ نم مؼرلابو رداصملا كلت رٌرحت ةٌفٌك نع ةركف هٌدل نوكٌ نل ةداعلا ًف تاٌافنلا عماج نإف ماظنلا رداصم نم ىرخأ
يرود لكشب مهؽٌرفت يرورضلا نم نوكٌ نل امبرو رداصملا هذه ضعب عم لماعتلا . ةصاخو يودٌلا ؾٌظنتلا ضعبب موقت نأ ماهلا نمو
زاهجلا ىلع رداصملا ضعب لثمٌ ام عم ةرشابم لماعتت امدنع .
زواجت Override ةقٌرطلا Object.Finalize امب هبتنا نكلو ابٌش لعفت ل ةقٌرطلا هذه ةٌضارتفلا ةلاحلا ًفف كانه رداصملا ضعب ررحو
ةقٌرطلا مادختساب لمعٌ تاٌافنلا عماج نأ Finalize اهمادختسل ةجاحب اقح تنك اذإ لإ اهمادختساب مقت لف ءادلا ىلع رثإٌس كلذ نإف . ىتحو
زواجت متٌ امدنع Override ةقٌرطلا Finalize عمجلا ةٌلمع ءدبب تاٌافنلا عماج موقٌ ىتمب مكحتلا كنكمٌ ل رداصملا رٌرحتو . كنكمٌ هنأ عم
ءاعدتسا امود System.GC.Collect جاتنلا ةبٌب ًف كلذب ماٌقلا كٌلع بجٌ ل نكلو . رداصم ةرادإف CLR ىتم ؾرعٌ عماجلاو ةدقعم ةٌلمع
عمجلا ةرود ءدبل بسنلا تقولا نوكٌ . ءاعدتساب تأدب اذإ اس لكشب رثؤتٌس كقٌبطت ءادأ نأ امك System.GC.Collect قبأو رركتم لكشب
ةرادملا رٌؼ رداصملاب ًقٌقح مكحت هٌدل سٌلو ةرادم ةركاذل ةجاح كانه نوكٌ امدنع أدبٌ تاٌافنلا عماج نأ كنهذ ًف . ـلا كل رفوت ثٌح
Framework ةهجاولا ًهو ةلكشملا هذهل لح IDisposable

خٙعاٌٛا IDisposable
اشلا ناك اذإ ةفرعم كنكمٌ ؾٌك اذإ Object تابفلا عٌمجف ادج لهس باوجلا ةقٌقحلا ًف ؟ًفاضإ ؾٌظنت ىلإ جاتحٌ Classes
ةهجاولا ققحت نأ اهٌلع بحٌ ةرشابم اهؽٌرفت بجٌ رداصم صٌصختب موقت ًتلا IDisposable ةدٌحو ةقٌرط ىلع يوتحت ًهو
Public Interface IDisposable
Sub Dispose()
End Interface

ةبفلا تناك اذإ Class ءاعدتسا كٌلع بجٌ ةهجاولا هذه ققحت اهمدختست ًتلا Dispose اهنم ًهتنت امدنع . ام نكلو ؟كلذك سٌلأ طٌسب رمأ
ةهجاولا نم دباوفلا ًه IDisposable ةهجاولا ؟ IDisposable تابفلا عٌمج دٌدحت نكمملا نم لعجت Classes ةنٌمث رداصم صصخت ًتلا
رداصملا هذه عٌمج رٌرحتل اهٌلع دامتعلا نكمٌ ةطسبم ةٌلآ رفوت ًهو . ـلا ًف تابفلا نم دٌدعلا اقباس انركذ امكو Framework ققحت
ةهجاولا IDisposable ةبفلا مدختسٌ لاثم اذهو SqlConnection
184


Dim conn As New SqlConnection()
' Do Stuff
conn.Dispose()

ءاعدتسا عضو بجٌ اذهل امباد اعقوتم تاءانثتسلاو ءاطخلا ثودحف اقوثوم اذه نوكٌ نأ ةرورضلاب سٌل نكلو Dispose مسق ًف Finally
ةقلح ًف Try … Catch ةرفٌشلا ةباتك ةداعإ نكمٌ كلذبو ام ءانثتسا وأ ؤطخ ثودح دنع ىتح امباد ؾٌظنتلاب موقتس كترفٌش نأ نمضٌ امم
لكشلاب ةقباسلا

Dim conn As SqlConnection
Try
conn = New SqlConnection()
' Do Stuff
Catch ex as Exception
' Handle Exception Here
Finally
conn.Dispose()
End Try

ةهجاولا قٌقحتل انجتحا اذإ اذام نكلو IDisposable ؟

خٙعاٌٛا ك١محر IDisposable
مامتهلل رٌثم لاإس كٌلإ : ةهجاولا ققحت نأ ةبفلا ىلع بجٌ ىتم IDisposable قٌقحت اهٌف كٌلع بجٌ ةماع تلاح ثلث هذه ؟
ةهجاولا IDisposable كتبف ًف :
 ةهجاولا ققحت ىرخأ تابف ىلع كتبف يوتحت امدنع IDisposable
 ءاٌشل تاهجاو ىلع كتبف يوتحت امدنع COM
 ضبقم ىلع كتبف يوتحت امدنع Handle رداصمل Win32 ةلاعف

ةهجاولل قٌقحت طسبأو IDisposable لكشلا ىلع نوكٌ نأ نكمٌ

Public Class MyDisposableClass
Implements IDisposable

' Other members

Public Overloads Sub Dispose() Implements IDisposable.Dispose
'Release Your Resources Here
End Sub

End Class

ةٌقوثو رثكلا امباد نوكٌ ل قٌقحت طسبأ نكلو . لكشلا ىلع لامتكا رثكأ قٌقحت ودبٌ نأ نكمٌو

Public Class MyDisposableClass
Implements IDisposable
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me) ' No need call finalizer
End Sub

Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
185

If disposing Then
' Free managed resources
End If
' Free unmanaged resources
End Sub

Protected Overrides Sub Finalize()
Dispose(False)
End Sub
End Class

مادختساب تاقٌبطتلا رٌوطت ةٌلمع نم ماه ءزج دراوملا ةرادإ ىقبت ضعبلا هدقتعٌ دق امم مؼرلاب Visual Basic .net ىلع هنأ ضرتفت امبرو
ناٌحلا بلؼأ ًف احٌحص رملا اذه نوكٌ ثٌحب كلجأ نم ةركاذلا ةرادإو ؾٌظنتلا تاٌلمع عٌمجب ماٌقلا تاٌافنلا عماج . انه ةلكشملا نمكتو
اهعم لماعتلا تاٌافنلا عماجل نكمٌ ل ةنٌعم رداصم مدختسٌ نأ نكمٌ قٌبطتلا نأ ًف . ةرادإ رومأ مظعم عم لماعتلا هنكمٌ تاٌافنلا عماج نأ عم
ًفاضإ لمعب ماٌقلل رطضت دق تلاحلا ضعب ًف هنأ لإ كقٌبطتل ةركاذلا
ءاٌشأ ةٌأ لوح تانامض ةٌأ دجوت ل ثٌح ةلكشم رهظت دٌدحتلل ةلباق رٌؽلا تاٌافنلا عماج ةعٌبط ببسب و Objects ةٌاهنلا ًف اهفٌظنت متٌس .
ءاٌشأ عم ةمراص ءادأ رٌٌاعم جزمت امدنع ةلكشم رملا اذه لكشٌ ثٌح Objects تاٌموسرو تافلملا ضباقمك ةرادم رٌؼ ةركاذ مدختست
GDI+ و ذفاونلا ضباقمو COM Objects ذفنتست دقف ةهباشملا تابلطلا نم رٌثكلا عم لماعتت ةمدخ وأ قٌبطت كٌدل ناك اذإف ىرخأ ءاٌشأو
ةعرسب مهنم صلختت مل نإ رٌصق تقوب ماظنلا دراوم . زواجتٌو تاٌافنلا عماج اهب موقٌ ًتلا ؾٌظنتلا ةٌلمع كقٌبطت قبسٌ دق ىرخأ تاملكبو
ةلمعتسم رٌؽلا ءاٌشلا ؾٌظنتب تاٌافنلا عماج موقٌ نأ لبق ماظنلا لبق نم ةحاتملا رداصملا .
لكشب ؾٌظنتل جاتحت ًتلا ءاٌشلا دٌدحتب نكلو اهتاذب ؾٌظنتلا ةٌلمعب طقف سٌل ةٌقٌقح ةلكشم لكشٌ نأ نكمم رملا اذه نأ حضاولا نم
يروف . ـلا لح نوكٌو CLR ةهجاولا همٌدقتب ةلكشملا هذهل IDisopsable ةدٌحو ةلاد دٌدحتب ةهجاولا هذه موقت ثٌح
IDisposable.Dispose ةهجاولا ةركف نوكت ثٌح IDisposable كبٌش ناك نإف ادج ةطٌسب Your Object ةرادم رٌؼ رداصم مدختسٌ
اشلا كلذ ةاٌح ةرتف لاوط رمتست Object ةهجاولا قٌقحت كٌلع بجٌ IDisposable ةصاخلا كتابف ىلع ةدعاقلا هذه قبطنتو Your
Classes ـلا نمض افلس ةدوجوملا تابفلا ىلع اضٌأو Framework
نأ ةظحلم ردجت امك Visual Basic .net ـلا وأ CLR ةهجاولا قٌقحت وأ ةصاخلا كتابف ًف ةرادم رٌؽلا دراوملا ؾٌظنتب ماٌقلا ىلع كربجٌ
IDisposable ؾٌظنت ةٌلمع ىلإ جاتحت تابفلا يأ نوملعٌس نٌرخلا نٌروطملا نأ نمضت ًلاتلابو اهب حصنٌ ًتلا ةسرامملا ًه هذه ربتعتو
ةٌفاضإ


186

Using Generics with Interfaces

Using Generic Interface
تاهجاولل نكمٌ Interfaces نوكت نأ Generics متٌ امدنع ددحملا عونب لمت ًتلا تاددحملا نم رثكأ وأ دحاو عون دٌوزت اهنكمٌ ثٌحب
ًلاتلا لاثملل رظنا ةهجاولا مادختسا

Option Strict Off
Interface IGeneric(Of T)
Sub SomeMethod(ByVal x As T)
End Interface

Class A
Implements IGeneric(Of Integer)

Public Sub SomeMethod(ByVal x As Integer) _
Implements IGeneric(Of Integer).SomeMethod
Console.WriteLine("A.SomeMethod received " + x.ToString())
End Sub
End Class

Class B
Implements IGeneric(Of Double)

Public Sub SomeMethod(ByVal x As Double) _
Implements IGeneric(Of Double).SomeMethod
Console.WriteLine("B.SomeMethod received " + x.ToString())
End Sub
End Class

Public Class EntryPoint
Shared Sub Main()
Dim ca As IGeneric(Of Integer) = New A()
Dim cb As IGeneric(Of Double) = New B()
ca.SomeMethod(123.456)
cb.SomeMethod(123.456)
End Sub
End Class

ةهجاولاف IGeneric(Of T) عونلا ددحم مدختست قباسلا لاثملا ًف T ةبفلا و ةقٌرطلاو ةهجاولا لك ًف Class A ةهجاولا ققحت IGeneric
عونلا امدختسم Integer ةفٌظولا ددحم حبصٌ ًلاتلابو SomeMethod عونلا نم Integer ةبفلا ًفو Class B عونلا نم اهققحٌ
Double هجوملا دوجوبو Option Strict عضولا ىلع Off عونلا نم ةمٌقلا لوحٌل قٌٌضت لٌوحتب حمسٌ Double عونلا ىلإ Integer

Using a Generic Method in an Interface
تاهجاولا نوكت نأ اٌرورض سٌل Generic رصانع اهل نوكٌ ىتح Generic ًلاتلا لاثملا رظنا

187

Option Strict On
Interface INonGeneric
Sub SomeMethod(Of T)(ByVal x As T)
End Interface

Class A
Implements INonGeneric

Public Sub SomeMethod(Of T)(ByVal x As T) _
Implements INonGeneric.SomeMethod
Console.WriteLine("A.SomeMethod received " + x.ToString())
End Sub
End Class

Public Class EntryPoint
Shared Sub Main()
Dim ca As INonGeneric = New A()
ca.SomeMethod(123.456)
ca.SomeMethod("123 point 456")
End Sub
End Class

ةهجاولا INonGeneric تسٌل قباسلا لاثملا ًف Generic ةقٌرطلا نكلو SomeMethod(Of T) قباسلا لاثملا سكعو كلذك ًه
هجوملا مدختسٌ لاثملا اذهو ةهجاولا كلت ققحت ةنٌعم ةبف لجأ نم ددحم عونب دودحم تسٌل ةقٌرطلاف Option Strict عضولا ىلع On دحٌل
تاددحمك لوبقم ةفلتخملا عاونلا نأ تبثٌو قٌٌضتلا تلٌوحت نم

188

ءبّعلا يبغِ ّٓػ حشظٔ MY

My Namespace
دوزٌ ان ءامسلا لاجم My اعٌرس مهفلل ةلباق ةموهفم ةٌرجش ةٌنب تاٌبارجل لكشب اهجاتحت ًتلا ماهملا نم ةعومجم ؾدهتست كروومٌرفلا
رركتم نمض لحلا نوكٌ ًصن ؾلم ةءارق دٌرن امدنعف Framework 1.1 - VB2003 ًلاتلاك

Dim sr As New IO.StreamReader("c:\mytextfile.txt")
contents = sr.ReadToEnd
sr.Close()

ًف ادٌج لمعٌ دوكلا اذهو VB2005 ًلاتلا دوكلاك عرسأ لكشب هتباتك كنكمٌ نكلو
دوك
contents = My.Computer.FileSystem.ReadAllText("c:\mytextfile.txt")

ةبفلا My.Computer.FileSystem ةؽللا دادتما نمض تابف دع نم ةدحاو ًه My امو اهٌلع ؾرعتلا وه هلمعت نأ ضرتفٌ اٌش لوأ اذل
كل هرفوت داجٌإف اهنمضن رركتم لكشب ةنكمأ ةدع ًف اهمدختسن ةٌلمع ذٌفنت دٌرن امدنعف ةجمربلا ًف ًنٌتور لمع ًه ةحٌحصلا ةٌلمعلا ذٌفنتو
نمض ءارجإ اذهو ةٌلمعلا ذٌفنتل دعاسم ءارجلا وه دعاسملا ءارجإ ةدع ذخؤٌ تاددحم موقٌو كل ةمهم ذٌفنتب لهسٌ امم اهٌلع ءانب ام لمع
اهب ماٌقلا جماربلا يروطم ىلع بجٌ ةٌلمع هذهو ةجمربلا ةٌلمع . ءامسلا لاجمو My ةماهلا ؾباظولا نم رٌثكلا مٌدقتل ةركفلا هذه مدختسٌ
نٌسحتل ةلماك ةبتكم اهرابتعا كنكمٌ ثٌح عٌمجلل ثٌح ةٌجاتنلا ءامسلا لاجم مدقٌ My نم دٌدعلا نمض ةفنصم تاٌبارجلا نم دٌدعلا
ةفلتخملا تابفلا My.Application, My.Computer, My.Forms, My.Resources ، My.Settings, My.User,
My.WebServices دحا نمض تامولعملل لهس لوصو مدقٌ ةداعلا ًفو ةٌساسأ تافٌنصت ًف كروومٌرفلا My.Application ،
My.Computer, My.User عورشملا و My.Forms, My.Resources ، My.Settings,My.WebServices
My.Application
ؾصولاو ناونعلاو قٌبطتلا تامولعمك تامدخلاو قٌبطتلا لوح تامولعم نٌروطملل رفوٌ ... ـف خلا OpenForms لوح تامولعم رفوٌ
و ًلاحلا عورشملا ًف ةحوتفملا ذفاونلا Log رفوٌ تاٌناكمإ دوكلا رظنا جمانربلا ًف ةلصاحلا ءاطخلل لجس لٌجستك تلجسلا عم لماعتلل
ًلاتلا لاثمك

Dim winINIFile As String
Try
winINIFile = My.Computer.FileSystem.ReadAllText("c:\windows\wind.ini")
Catch ex As IO.FileNotFoundException
My.Application.Log.WriteException(ex, TraceEventType.Error,
"Error Accessing INI File")
End Try

ةعومجم و OpenForms تفاضأ ةٌناكمإ ًف ادوجوم ناك امل ةهٌبش VB6 ةحوتفملا ذفاونلا عٌمج ربع لقنتلل ةلهس ةلٌسو لثم رفوت ثٌح
دوكلا رظنا لوأ ةماع تارٌؽتم لمع ءانع نود نم قٌبطتلا ًف
دوك
189

For Each f As Form In My.Application.OpenForms
Debug.WriteLine(f.Text)
f.WindowState = FormWindowState.Minimized
Next
My.User And My.Computer
My.Compute ةبفلاف ؾٌضملا رتوٌبمكلا لوح تامولعملاو تامدخلا ربع لقنتلا نم كنكمٌ FileSystem رفوت إ لمعلل ةلهس تاٌبارج
دلجم ًف ةدوجوملا روصلا عٌمج خسنل اهمدختسٌ ًلاتلا دوكلا لثمف تافلملا لوح ملعتسلاو My Pictures ىلإ ًلاحلا مدختسملاب صاخلا
دلجملا C:\Desktop Wallpaper ةلٌلق تاظحل نم رثكأ اتقو ذخؤت خسنلا ةٌلمع تناك نإ مدقت رشإم ضرعٌو
دوك
Dim myPics As String = _
My.Computer.FileSystem.SpecialDirectories.MyPictures

My.Computer.FileSystem.CopyDirectory( _
myPics, "C:\Desktop Wallpaper", _
FileIO.UIOption.AllDialogs, _
FileIO.UICancelOption.DoNothing)

MessageBox.Show(My.Computer.FileSystem.GetFiles( _
myPics, FileIO.SearchOption.SearchAllSubDirectories, _
"*.jpg", "*.bmp").Count)


ةبفلا My.Computer.Ports نمض ةبعصلا تاٌلمعلا نم ربتعت هذهو ةطٌسب ةٌلمع ًلسلستلا لخدملا نم ةباتكلاو ةءارقلا ةٌلمع لعجت
طتٌ ناك ًلاتلا دوكلا ةفٌظو سفن لمعلف كروومٌرفلا ل اقباس دوكلا نم رٌثكلا ةباتك ب
دوك
Dim comport As IO.Ports.SerialPort
comport = My.Computer.Ports.OpenSerialPort("COM1")
AddHandler comport.ReceivedEvent, AddressOf DataReceived


My.Computer.Audio ماظنلا تاوصأ دحأ وأ مدختسملاب صاخ ؾلم ؾزع نم كنكمٌ
دوك
Dim musicFile As String
musicFile = My.Computer.FileSystem. _
GetFiles("C:\WINDOWS\Media", _
FileIO.SearchOption.SearchAllSubDirectories, _
"*.wav")(0)
My.Computer.Audio.Play(musicFile)


My.Computer.Network نم اعساو لاجم رفوٌ تاءاعدتسا ةكبشلا لاسرإك لابقتساو ping وأ تافلملا لٌمحتو عفر وأ ةدٌعب ةلآ نم
ضعبو كلاصتا عضو دٌدحت ٜشخلا يبّعلا
دوك
190

If My.Computer.Network.IsAvailable Then
If My.Computer.Network.Ping("www.duncanmackenzie.net") Then
Debug.WriteLine("Site Available")

My.Computer.Network.DownloadFile( _
"http://www.duncanmackenzie.net/Articles/", _
System.IO.Path.Combine( _
My.Computer.FileSystem.SpecialDirectories.MyDocuments, _
"articles.html"))
End If
End If


لثم مامتهلل ةرٌثملا تابفلا نم دٌدعلا كانهو My.Computer.Keyboard ، My.Computer.Registry, My.Computer.Screen
كسفنب اهفاشكتسا ةلواحم كنكمٌ
My.User
لاجملا نمض تابفلا طسبأ نم My قٌبطتلل ًلاحلا مدختسملا لوح ةماه تامولعمل لوصولا رفوت ًهف كلذ عمو
دوك
If My.User.IsAuthenticated Then
If My.User.IsInRole("BUILTIN\Administrators") Then
MsgBox("tsk, tsk... running as Admin are we?")
End If
End If

عشػ داداذػلا هم١جطر ِٓ ٜشخأ ءب١شأٚ
لاجملا نمض كقٌبطت ىلع زكرٌ يذلا مسقلا My نمضتٌ Settings, Resources ، WebServices, Forms عم نلماعتٌ نلولا نانثلا
ـلا طبض ًتلاح ًفو ةفلتخملا رداصملا رصانع نم دٌدعلا طبض كنكمٌ رٌوطتلا ةبٌب نمض نمف كقٌبطتب ةطبترملا تاناٌبلا Resources وأ
Settings ربع اهٌلإ رشابملا لوصولا كنكمٌ كعورشمل My ورشمل اهتفاضإ روفف ع تابفلا رفوت ك My.Settings , My.Resources
ةبفلا مدختسٌ مث مدختسملل دادعإ ةمٌق لدعٌو أرقٌ ًلاتلا دوكلاف تامولعملا كلت عم لهس لماعت My.Resources صصخم صن ةءارقل
دوك
Dim lastRun As Date My.Settings.LastRun
My.Settings.LastRun = Now()

Dim myMessage As String = _
String.Format(My.Resources.LastRunMessage, _
lastRun.ToShortDateString)

MsgBox(myMessage)

ةفاضلاب ةبفلا نمض ةدوجوم كعورشم ًف ذفاونلا عٌمج كلذ ىلإ My.Forms ةبفلا نمض ةدوجوم بٌو تامدخ يأ و
My.WebServices ةمدخل اطبر تلمع اذإف ةرشابم مهٌلإ لوصولا نكمٌ هنأ ًنعٌ اذهو WeatherForecast نم webservicex.net
دوكلاك ةرارحلا ةجرد ةءارق كنكمٌ لثم
دو
191

Dim tempService As New net.webservicex.www.WeatherForecast()
Dim wf As net.webservicex.www.WeatherForecasts
wf = tempService.GetWeatherByZipCode("98052")
MsgBox(wf.ToString())
ًلٌ امك روملا طٌسبت كنكمٌو
دوك
MsgBox(My.WebServices.WeatherForecast.GetWeatherByZipCode("98052").ToString())

My.Forms ٓع فٍخخي My.Application.OpenForms طشش ْٚذب هجربّٔ ثبئف ِٓ تئف ًىٌ اذجاٛح شفٛي ٗٔأ ببسب
جِشبِ جٕو ارإف بيٌبح تحٛخفِ ْٛىح ْأ VB6 يبثٌّبو اشيثو ةذيفِ بٙٔأ ذجخس بمببس
دوك
Private Sub showForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles showForm2.Click
My.Forms.Form2.Show()
End Sub

Private Sub updateForm2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles updateForm2.Click
My.Forms.Form2.Text = "Updated..."
End Sub

ءبّسلا يبجِ شفٛي َبخخٌا يفٚ My يف VB2005 ّٓض تميّع فئبظٚ ٌٝإ يٛطٌٍٛ تٍٙسٚ تعيشس تميشط
تّيذمٌا ُي٘بفٌّا ضعب ةدبعخسا ٌٝإ تفبضلبب ششببِ ًىشب نسّٚٛيشفٌا َاذخخسا ْٚذب نسّٚٛيشفٌا


192

ءبّعلا يبغِ ٌٝئ خطبخٌا هراءاشعئ خفبػاث َٛمر ف١و My


ةفاضل ةدٌدج ةبف ءامسلا لاجم ىلإ My ةلتك ةفاضإ وه هلمع كٌلع ام لك Namespace مسا لمحت My ةفاضإ اندرأ اذإف ىلإ ةدٌدج ةبف
ءامسلا لاجم My لثم TestClass ةلاد ىلع يوتحٌ JustForTest ًلاتلا دوكلا ةباتكب ةطاسبب موقنس

Namespace My

Public Class TestClass

Public Shared Function JustForTest(ByVal SomeText As String) As String
Return SomeText & ", " & Now.ToString("dddd")
End Function

End Class

End Namespace

وملا تابفلا ةٌقبك همادختسا انناكمإب نلا حبصأ و ج ءامسلا لاجم ًف اقباس ةدو My

TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(

نوكت نأ بجٌ انه اهمدختستس ًتلا تلادلا نأ انه ةظحلملا ردجت نكلو Shared ًف اهنٌمضتب موقت نأ وأ Module لدب نم Class كلذو
ًف دوجوملا صباصخلاو تلادلا عٌمج نل Module نوكت Shared امباد .
ةٌبزجلا تابفلا ًهو ةدٌدجلا ةزٌملا ىلع دامتعا كنكمٌ امك Partial Class لاجم تابف ضعبل ىرخأ رصانع ةفاضإ اضٌأ ءامسلا My ثم ل
ةبفلا My.Computer ةبفلا وأ My.Application دٌرن ًتلا ةدٌدجلا رصانعلا ةفاضإو حٌحصلا مسلاب ةٌبزج ةبف ءاشنإب موقن كلذ لعفلو
ثٌح مادختساب ةبفلا هذه ؾٌرعت كٌلع بجٌ Friend اقباس ةدوجوملا ةٌلصلا ةبفلا عم قباطتت ىتح
Namespace My

' Extend My.Application Class
Partial Friend Class MyApplication

Public Function AppTest() As String
Return "For Test Purposes"
End Function

End Class


End Namespace

اقباس ةدوجوملا تابفلا ةٌقبك اضٌأ همادختساو

TextBox3.Text = My.Application.AppTest

ًلاتلاك انه انلاثمل لماكلا دوكلا حبصٌ اذهبو
193

Public Class Form1

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

TextBox2.Text = My.TestClass.JustForTest(TextBox1.Text(
TextBox3.Text = My.Application.AppTest
End Sub

End Class

Namespace My

' Add New Class
Public Class TestClass

Public Shared Function JustForTest(ByVal SomeText As String) As String
Return SomeText & ", " & Now.ToString("dddd dd/MM/yyyy")
End Function

End Class

' Extend My.Application Class
Partial Friend Class MyApplication

Public Function AppTest() As String
Return "For Test Purposes"
End Function

End Class

End Namespace

ءامسلا لاجم عٌسوت نلا كنكمٌو My شنإ كنكمٌ ثٌح نٌعم قٌبطتب ادودحم سٌل اذهو كتجاح بسحب ا ةبتكم ء Class Library كب ةصاخ
ءامسلا لاجمل ءاٌشلا ضعب ؾٌضت My قٌبطتلا لخاد نم ةبتكملا هذهل عجرم ةفاضإب كلذو كتاقٌبطت ًف اهمادختساو

194

ف١و غ١طزغر قلؽئ هصاذحأ خطبخٌا RaiseEvent Tutorial

همسو ادٌدج اعورشم اشنأ RaiseEventsTest هل ؾضأ مث Class ًضارتفلا مسلا لبقاو Class1
قلطن ىتح انثادحأ مزتلنو ةصاخلا لثم تامكحتلاب ةصاخلا ثادحلا ًف اهدهاشن ًتلا ةؽٌصلاب

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

ثٌح دجن نأ ًه امود ناتمٌق ثدح لكل sender و ثدحلل لسرملا e ةطساوب ةررمملا مٌقلا ثدحلا
ةبفلا نم ةبف قاقتشاب لوأ موقنس System.EventArgs ًتلا مٌقلا اهنمضنو اذه ةدبافو اهرٌرمت دٌرن ءارجلا امدنع اقحل جمانربلا ةنورم وه
اذإف لٌدعتلا دٌرت ةبفلا صن اذه و انه اهتفاضل ىوس جاتحت نل اهرٌرمت متٌل ةدٌدج ةمٌق ةفاضإ تدرأ ةدٌدجلا
دٌدجلا ؾلملا ًف دوكلا اذه لخدأ class1

Public Class CustomEventArgs
Inherits System.EventArgs

Private m_Member1 As String
Private m_Member2 As Integer

Public ReadOnly Property Member1() As String
Get
Return m_Member1
End Get
End Property

Public ReadOnly Property Member2() As Integer
Get
Return m_Member2
End Get
End Property

Public Sub New(ByVal M1 As String, ByVal M2 As Integer)
m_Member1 = M1
m_Member2 = M2
End Sub
End Class

نٌتٌصاخ انفرع ثٌح member1 و member2 ًتلا مٌقلا ادٌعتل انؤشنأ و اهدٌرن sub new لبق مٌقلا ةبٌهتل لاسرلا ؾٌرعت دعب نلا
class1 ًلٌ امك هقلطإ دٌرن يذلا ثدحلا ؾٌرعت لخدأ

Public Class Class1

Public Event TestEvent(ByVal sender As Object, ByVal e As CustomEventArgs)

مث لخاد نم هدٌرن يذلا ثدحلا قلطنل ءارجإ ؾٌضنس class1 مٌقلا ررمن ثٌح ًلاتلا دوكلاك دٌرن ًتلا اهلاسرإ تاددحمك دٌشملل
constructor ةبفلاب صاخلا customeventargs مث رملا مدختسن raiseevent ثدحلا قلطل

Public Sub DoTestEvent()
195

Dim e As New CustomEventArgs("Member No 1", 1500)
RaiseEvent TestEvent(Me, e)
End Sub
ءاشنإ نم انٌهتنا دق نوكن اذهبو class1 نأ ىوس قبٌ ملو هربتخن هل لماكلا صنلا اذهو

Public Class Class1

Public Event TestEvent(ByVal sender As Object, ByVal e As CustomEventArgs)

Public Class CustomEventArgs
Inherits System.EventArgs

Private m_Member1 As String
Private m_Member2 As Integer

Public ReadOnly Property Member1() As String
Get
Return m_Member1
End Get
End Property

Public ReadOnly Property Member2() As Integer
Get
Return m_Member2
End Get
End Property

Public Sub New(ByVal M1 As String, ByVal M2 As Integer)
m_Member1 = M1
m_Member2 = M2
End Sub

End Class

Public Sub DoTestEvent()
Dim e As New CustomEventArgs("Member No 1", 1500)
RaiseEvent TestEvent(Me, e)
End Sub

End Class

هانلعف ام رابتخل و بهذا ىلإ form1 هٌلع رقناو ارز اهٌلع عضو دوكلا ررحمل لقتنتف اجودزم ارقن ثٌح ىلإ رٌشٌ رٌؽتم ؾٌرعتب موقنس
class1 كلذو ةبفلا ًف ةماعلا تافٌرعتلا ةقطنم ًف رزلا ىلع رقنلا ثدح ءارجإ جراخ

Private WithEvents cls As New Class1

ظحل ةرابعلا مادختسا withevents ـل رٌشٌ يذلا رٌؽتملا ؾٌرعت ًف class1 عٌطتسن ىتح اهقلطٌ ًتلا ثادحلا عم لماعتلا مث ةمباقلا نم
ررحم قوف ةٌراسٌلا ةلدسنملا رتخا دوكلا cls ثدحلا رتخا ةٌنٌمٌلا ةلدسنملا ةمباقلا نم مث testevent ررحم ؾٌضٌف عم لماعتلا ءارجإ دوكلا
حبصٌل ةرفٌشلا ررحم نمض دوكلا لخدأ انب صاخلا ثدحلا ءارجلا ًلاتلاك دٌدجلا

Private Sub cls_TestEvent(ByVal sender As Object, _
ByVal e As Class1.CustomEventArgs) Handles cls.TestEvent
196


MsgBox(e.Member1 & ControlChars.CrLf & e.Member2)
End Sub
ًلاتلاك حبصٌل هلدعو رزلا ىلع رقنلا ثدح ىلإ لقتنا نلا

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

cls.DoTestEvent()
End Sub


197

خؼ
ّ
ع
َ
ٛ
ُ
ٌّا كئاشطٌا Extension Methods

كٌزٌاب لوجٌف مدقٌ 2008 ةعّ س َ وُ ملا قبارطلا Extension Methods عاونل ةصصخم ؾباظو ةفاضإ نم روطملا نكمت ًتلا
قتشم دٌدج عون ءاشنإ نود نم اقباس ةفرعملا تاناٌبلا . دوجوملا عونلا نمض نم تناك ول امك ىعدتست نأ نكمٌ ةقٌرط ةباتك نم كنكمٌ امم .
ءارجإ نوكت نأ نكمٌ ةعسوملا ةقٌرطلاو Sub ةفٌظو وأ Function ةٌصاخ نوكت نأ نكمٌ لو Property لقح وأ Field ثدح وأ
Event ةفصلاب اهمٌلعت بجٌ ةعسوملا قبارطلا عٌمجو <Extension()> ءامسلا لاجم نم System.Runtime.CompilerServices
ةقٌرطلا قلطٌس يذلا دارملا تاناٌبلا عون ةعسوملا قبارطلا ًف ىلولا ةطٌسولا ددحتو .
ةقٌرطلا دٌدحت متٌ ًلاتلا لاثملا ًف Print تاناٌبلا عون عٌسوتل string مدختست ًتلاو Console.WriteLine ثٌح صنلا راهظل
طٌسولا سسإٌ aString ةقٌرطلا نأ Print ةبفلا عسوت String
Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

End Module

ةفصلاب ددحم ةعسوملا ةقٌرطلا ؾٌرعت نأ ظحل <Extension()> ـلا مٌلعت نوكٌو Module لك نكلو يراٌتخا ةقٌرطلل ةٌواحلا
ءامسلا لاجم دارٌتسا بجٌ امك ةروكذملا ةفصلاب اهمٌلعت متٌ نأ بجٌ ةعسوم ةقٌرط System.Runtime.CompilerServices ىتح
ةفصلا كلت ىلإ لوصولا نم نكمتن . نمض لإ ةعسوملا قبارطلا ؾٌرعت نكمٌ لو module ـلا سفن ًف ةعسوملا ةقٌرطلا ؾرعت اٌجذومنو
Module ـلا دعبف هٌف اهمادختسل جاتحنس يذلا ناكملا ًف اهدارٌتسا متٌ كلذ نع لدبو اهٌعدتستس ًتلا Module ةقٌرطلا ىلع يوتحت ًتلا
Print لثم طباسو ذخؤت ل ةقٌرط كانه نوكٌ امدنع ةقٌرطلا ءاعدتسا نكمٌ ToUpper
Imports ConsoleApplication2.StringExtensions

Module Module1

Sub Main()

Dim example As String = "Hello"
' Call to extension method Print.
example.Print()

' Call to instance method ToUpper.
example.ToUpper()
example.ToUpper.Print()

End Sub

End Module

نوكت ًلاتلا لاثملا ًفو PrintAndPunctuate عونلل ىرخأ ةعسوم ةقٌرط String ىلولا نٌتطٌسو كلتمت ةرملا هذه ًفو aString ددحت
عونلا عسوت ةقٌرطلا نأ String ةٌناثلا ةطٌسولا نوكتو punc ًتلا ةقٌرطلا ءاعدتسا دنع ررمتس ًتلا مٌقرتلا تاملع نم ةلسلس نع ةرابع
مٌقرتلا تاملعب اعوبتم اصن رهظت
<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

198

ـل ةٌصن ةطٌسو رٌرمتب ةقٌرطلا ءاعدتسا متٌ ثٌح punc لثم example.PrintAndPunctuate(".")
و رهظٌ ءاعدتساو دٌدحت ًلاتلا لاثملا Print و PrintAndPunctuate دارٌتساو System.Runtime.CompilerServices يذلا
ةعسوملا قبارطلا ددحت ًتلا ةفصلا ىلإ لوصولا نم نكمٌ
Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

End Module

ةعسوملا قبارطلا ءاعدتسا متٌ مث
Imports ConsoleApplication2.StringExtensions
Module Module1

Sub Main()

Dim example As String = "Example string"
example.Print()

example = "Hello"
example.PrintAndPunctuate(".")
example.PrintAndPunctuate("!!!!")

End Sub
End Module

تناك نإف دوكلا ةٌإر لاجم نمض نوكت نأ ًه هذهك ةعسوم قبارط لٌؽشت هبلطتٌ ام لك Module ةٌبرم ةقٌرطلا نوكتسف لاجملا نمض
لبق نم IntelliSense ةٌداٌتعلا قبارطلا نمض نم تناك ول امك اهإاعدتسا نكمٌو .
ةطٌسولاف ىلولا ةطٌسولل مٌق رٌرمت متٌ ل ةعسوملا قبارطلا ءاعدتسا متٌ امدنع هنا ظحل aString اهنأ ددحت ةقباسلا ةقٌرطلا ًف
عونلا نم ىعدتست نأ بجٌ string ةطٌسولا كلتل ةمٌقك ًصنلا رٌؽتملا مدختسٌس مجرتملاو
ًلاتلا انمضتم طباسولا ةمباق نمض كٌزٌاب لوجٌف ًف اهمادختسا نكمٌ ًتلا عاونلا مظعم ىلع ةعسوم قبارط دٌدحت نكمٌو :
 تابفلا ) ةٌعجرملا عاونلا ( Classes (Reference Types)
 بٌكارتلا Structures
 تاهجاولا Interfaces
 ةضوفملا تاءارجلا Delegates
 طباسو ByRef و ByVal
 عاونلا طباسو Generic
 تافوفصملا Arrays
اهذخأ بجٌ ًتلا طاقنلا ضعب كانه حاجنب مهمادختسا نكمٌ ًك كلذ عمو دوجوم عون عٌسوتل ةٌوقو ةحٌرم ةقٌرط ةعسوملا قرطلا رفوت
تابفلا تابتكم يروطم ىلع سٌبر لكشب قبطنت ًهو رابتعلا نٌعب Class Libraries مدختسٌ قٌبطت يأ ىلع رثإت نأ نكمٌ اهنكلو
ةعسوملا قبارطلا . دوجول اهٌلع مكحتلا كلمت ًتلا كلت نم ؾعضأ نوكت اهكلمت ل ًتلا عاونلل اهفٌضت ًتلا ةعسوملا قبارطلاف ماع لكشبو
ةعسوملا كتقٌرط لمع عم قبارطلا كلت لخادتت نأ نكمٌف اهكلمت ل ًتلا عاونلل ةعسوم قبارط ؾاضت امدنع ثدحت دق ًتلا ءاٌشلا نم ددع
199

 قٌٌضت لٌوحت ثودح نودب ًعدتسملا رٌبعتلا طباسو عم اقفاوتم اعٌقوت كلمٌ ةبفلا ًف وضع رصنع دوجو دنع narrowing
Conversion صباصخلا ضعب ةفاضإ دنع نكمٌ كلذل ةعسوملا كتقٌرط ىلع ةٌلضفلا رصنعلا كلذ كلمٌف طباسولا نم بولطم
ةعسوملا كتقٌرطل لوصولا ناكملاب دوعٌ ل نأ ةبفلل
 هتقٌرط عم ضراعتت ةعسوم قبارط ةباتك نم نٌرخلا نٌجمربملا ةعسوملا ةقٌرطلا بتاك عنمٌ نأ نكمٌ ل
 ءامسأ لاجم نمض اهعضوب ةعسوملا كتاءارجإ ةوق نٌسحت كنكمٌ namespace نم كتبتكم ًمدختسم نٌكمتل مهب صاخ
ةبتكملا ءامسأ تلاجم نم بسانملا راٌتخا وأ ءامسلا لاجم لماك داعبتسا وأ دارٌتسا
 نوكٌ تاهجاولا عٌسوت Interfaces تابفلا عٌسوت نم نمآ Classes رٌٌؽت لكف ةبفلا وأ ةهجاولا كلت كلمت ل تنك اذإ ةصاخو
ةهجاولا ًف ةدوجوملا قبارطلا ًف رٌؽٌ ام لٌلق جمربملاف كلذل اهٌلع دمتعت ًتلا تابفلا عٌمج ىلع رثإٌس ةهجاو ًف
 قبارطلا نم تلامتحلا نم تاقبط كانه نوكت ىرخأ عاونأ هنم قتشت اعون عسوت امدنعف ناكملا ردق اددحم اعون عٌسوتب مق
كتقٌرط عم لخادتت دق ًتلا ةعسوملاو ةٌداعلا
ةٌداع ةقٌرط عٌقوت قباطتٌ امدنع Instance Method ةعسوم ةقٌرط عم Extension Method لوصولا نكمٌ ل لاجملا سفن ًف
ةجٌتنلاب ةعسوملا ةقٌرطلل . سفن كلتما ةعسوملا قبارطلل نكمٌ كلذ عمو ةٌداع ةقٌرط لادبتسل ةعسوم ةقٌرط مادختساب موقن نأ نكمٌ ل اذهل
ةبفلا تناك نإ لثمف ؾلتخم عٌقوتلا نأ املاط ناترفوتم ناتقٌرطلا اتلك نوكتف ؾلتخم عٌقوت عم نكلو ةٌداعلا قبارطلا عم مسلا
ExampleClass ةقٌرط ىلع يوتحت exampleMethod نكلو دجاوتت نأ مسلا سفن كلتمت ةعسوم ةقٌرطل نكمٌ طباسو ةٌأ ذخؤت ل
ؾلتخم عٌقوتب
Imports ConsoleApplication2.ExtensionExample
Module Module1

Sub Main()
Dim ex As New ExampleClass
' The following statement calls the extension method.
ex.exampleMethod("Extension method")
' The following statement calls the instance method.
ex.exampleMethod()
End Sub

Class ExampleClass
' Define an instance method named exampleMethod.
Public Sub exampleMethod()
Console.WriteLine("Instance method")
End Sub
End Class

End Module
Imports System.Runtime.CompilerServices

' Define an extension method named exampleMethod.
Module ExtensionExample
<Extension()> _
Sub exampleMethod(ByVal ec As ExampleClass, _
ByVal stringParameter As String)
Console.WriteLine(stringParameter)
End Sub

End Module


ًلٌ امك نوكٌ قباسلا دوكلا نع جتانلا جرخلاو
Extension method
Instance method

هذه دٌدحت متٌ ثٌح اٌلعلا ةٌقبسلا كلمت ًتلا ةقٌرطلا ءاعدتسا متٌ لوصولا لاجم سفن ًف ناقباطم ناعٌقوت نٌتعسوم نٌتقٌرطل نوكٌ امدنع
ًلاتلا ةٌقبسلا لسلست ةٌلاتلا ةمباقلا لثمتو لاجملا نمض ةقٌرطلا هذه لاخدإ ةقٌرط ربع ةٌقبسلا :
200

1 . ـلا سفن نمض اقباس ةدوجوملا ةعسوملا قبارطلا Module
2 . ةٌقبسأ ءانبلا ءامسلا تلاجم كلمت ثٌح هبابآ دحأ وأ ًلاحلا ءامسلا لاجم ًف تاناٌبلا عاونأ نمض ةفرعملا ةعسوملا قبارطلا
ءابلا ىلع
3 . ًلاحلا ؾلملل هدارٌتسا مت عون يأ نمض ةفرعملا ةعسوملا قبارطلا
4 . ًلاحلا ؾلملا نمض دروتسم ءامسأ لاجم يأ نمض ةدوجوملا ةعسوملا قبارطلا
5 . عورشملا ىوتسم ىلع دروتسم عون يأ نمض ةفرعملا ةعسوملا قبارطلا
6 . عورشملا ىوتسم ىلع دروتسم ءامسأ لاجم يأ نمض ةفرعملا ةعسوملا قبارطلا
ةقٌرطلا تناك نإف اهباعدتساب موقت ًتلا ةقٌرطلا دٌدحتل ةعسوملا ةقٌرطلل لماكلا مسلا مادختسا اهدنع كنكمٌ ةلكشملا ةٌقبسلا كلت لحت مل نإف
Print ـلا نمض ةددحم قباسلا لاثملا ًف Module ةامسملا StringExtensions وه ةعسوملا ةقٌرطلل لماكلا مسلا نوكٌ
StringExtensions.Print(example) نع لدب example.Print().

201

خم٠شطٌا Main

عٌٕٛا Module
لوجٌف معدٌ ىعدت ةٌجمرب ءانب ةدحو وٌدوتس Module ةملكلا مادختساب اهنع حٌرصتلا متٌ ًتلاو ةزوجحملا Module ءاشنإب موقت امدنعف
ؾلم ءاشنإ متٌ لثم لوسنوك قٌبطت vb كلجأ نم ًلاتلا دوكلا ىلع يوتحٌ :

Module Module1
Sub Main()

End Sub
End Module

ـلا نإف عقاولا ًفو Module ةبف نع ةرابع ًه Class ضعب عم ةماع ةفٌظو وأ ءارجإ يؤف ةحضاولا تافلتخلا Public نمض اهفٌرعت متٌ
ـلا Module كرتشم رصنع نوكت Shared Member قٌبطتلا ءاحنأ عٌمج نم ةرشابم هٌلإ لوصولا نكمٌ ارطضم تسل تنؤف كلذبو
ـلا مسا ةباتكل Module اهرصانع مادختسا دٌرت امدنع

Module Module1
Sub Main()
' Show banner.
DisplayBanner()
' Get user's name and say howdy.
GreetUser()
End Sub

Sub DisplayBanner()
' Get the current color of the console text.
Dim currColor As ConsoleColor = Console.ForegroundColor
' Set text color to yellow.
Console.ForegroundColor = ConsoleColor.Yellow
Console.WriteLine("******* Welcome to FunWithModules *******")
Console.WriteLine("This simple program illustrates the role")
Console.WriteLine("of the Module type.")
Console.WriteLine("*****************************************")
' Reset to previous color of your console text.
Console.ForegroundColor = currColor
Console.WriteLine()
End Sub

Sub GreetUser()
Dim userName As String
Console.Write("Please enter your name: ")
userName = Console.ReadLine()
Console.WriteLine("Hello there {0}. Nice to meet ya.", userName)
End Sub
End Module

ةقٌرطلا نأ قباسلا لاثملا ًف ظحل Main ءاعدتسا اهنكمٌ ةقٌرطلا GreetUser ـلا سفن نمض ةفرعم اهنل Module ةباتكل ارطضم تسلو
ـلا مسا Module اهٌف رصنع ءاعدتسا دنع ةبدابك . نم رثكأ ىلع يوتحٌ يذلا قٌبطتلا ًفو Module يأ مسا ةباتكل ارطضم تسل تنأ
Module كلت ًف ةاوتحملا رصانعلا ءاعدتسا دنع ةبدابك ـلا Modules نم رثكأ ًف قبارط ةدع كانه تناك اذإ لإ Module سفن لمحت
مسلا .
امك ـلا نأ Module ةملكلا مادختساب رٌؽتم نع حٌرصتلا دنع عونك اهمادختسا متٌ نأ نكمٌ ل ةزوجحملا New ءاشنلل ةلباق رٌؼ اهنل Non
Creatable دوكلاب اهٌبش ادوك تمدختسا نإو ؤطخ كٌطعٌس مجرتملا نإف ًلاتلا
202


' Nope! Error, can't allocated modules!
Dim m as New Module1()

ـلل نكمٌ امك Module ىرخأ رصانع ىلع يوتحت نأ لاثملا ًف امك لثم تاناٌبلا لوقحك تاءارجلاو ؾباظولل ةفاضإ

Module MyModule
Public UserName As String

Sub GreetUser()
Console.WriteLine("Hello, {0}.", UserName)
End Sub

End Module

نمض رخآ رصنع يؤكو Module لقحلا مادختسا اننكمٌ UserName ةرشابم

Sub Main()
...
' Set user's name and call second form of GreetUser().
UserName = "Fred"
MyModule.GreetUser()
...
End Sub
خم٠شطٌا Main
قٌبطت يأ Vb2008 ةقٌرطلا ددحٌ عون ىلع يوتحٌ نأ بجٌ Main نوكت ًهو قٌبطتلل لوخدلا ةطقن لكشت ًتلا نمض ةداع ةدوجوم
Module امود ةكرتشم ةقٌرط ًهو Shared method دجاوتت نأ نكمٌ هنا عم ةبف نمض Class اهنع حٌرصتلا كٌلع بجٌ اهدنع
ةزوجحملا ةملكلا مادختساب Shared. دوكلاب دلوملا دوكلا لماك لدبتساو دٌدج لوسنوك قٌبطت اشنأ كلذ ىلع لاثمكو ًلاتلا

Class Program

' Unlike Modules, members in a class are not
' automatically shared. Thus, we must declare Main()
' with the Shared keyword.
Shared Sub Main()

End Sub

End Class

هنؤب ؤطخ ىقلتت ؾوسف ةطقنلا هذه دنع جمانربلا لٌؽشت تلواح نإف ةقٌرطلا داجٌإ نكمٌ ل Main ةبفلا دٌدحت كٌلع بجٌ ةلكشملا هذه لحلو
Program رصنعك ًف كلذو قٌبطتلل ءدب Startup Object ةحفصلا نم Application صباصخ ًف MyProject

شِاٚلا شطع دادذحِ خغٌبؼِ
ىدحإ ةقٌرطلل ةٌسٌبرلا ماهملا Main اهرٌرمت متٌ ًتلا رماولا رطس تاددحم ةجلاعم ًه رماولا رطس مجرتم لثمف قٌبطتلل vbc.exe
لثم تاراٌخلا نم دٌدعلا كلتمٌ target و out ةقٌرط ءاشنإ دٌرت امدنعف اهرٌؼو Main ةررمملا رماولا رطس تاددحم ةجلاعمب موقت
كلذب ماٌقلل قرط ةدع كٌدل هنأ دجتس قٌبطتلل . و اذهل اهمادختسا اننكمٌ ةقٌرط لوأ ةقٌرطلا مادختسا وه ضرؽلا GetCommandLineArgs
لاجملا نمض ةفرعملا System.Envitronment ا عونلا نم رصانعلا نم ةفوفصم دٌعت ًتل String هذه ًف رصنع لوأو وه ةفوفصملا
رطس تاددحم ةفوفصملا رصانع ًقاب لكشت امنٌب قٌبطتلل يذٌفنتلا ؾلملا مسا قٌبطتلل ةررمملا رماولا

Class Program

Shared Sub Main()
203

Console.WriteLine("***** Fun with Main() *****")
' Get command-line args.
Dim args As String() = Environment.GetCommandLineArgs()
Dim s As String

For Each s In args
Console.WriteLine("Arg: {0}", s)
Next
End Sub

End Class
ةفوفصم دٌدحت كنكمٌ ةقباسلا ةقٌرطلا مادختساب بؼرت مل نإو String ةقٌرطلل لخدك Main دوكلا ًف امك

Shared Sub Main(ByVal args As String())
Console.WriteLine("***** Fun with Main() *****")
' Get command-line args.
Dim s As String
For Each s In args
Console.WriteLine("Arg: {0}", s)
Next
End Sub
َاذخزعا Main ذغ١ٌٚ خف١ظٛو ءاشعئ
ؾٌرعت اضٌأ اننكمٌ Main عونلا نم ةمٌق دٌعت ةفٌظوك Integer رملا ةؽل نم تاثوروملا نم دعٌ يذلا C ةمٌقلا جمانربلا دٌعٌ ثٌح 0 دنع
ةروصب هباهتنا ءاهتنا ىلإ ىدأ يذلا ؤطخلل امقر وأ ام اجرخ لثمت ىرخأ ةمٌق يأ ةداعإ نكمٌ وأ ةٌعٌبط دوكلا ًف امك جمانربلا

Shared Function Main(ByVal args As String()) As Integer
Console.WriteLine("***** Fun with Main() *****")
Dim s As String
For Each s In args
Console.WriteLine("Arg: {0}", s)
Next
' Return a value to the OS.
Return 0
End Function

ؾٌرعتب اهٌف موقن ًتلا ةقٌرطلا نع رظنلا ضؽبو Main ءارجإك لكشت ًتلا عاونلا عم لماعتلا وه اهنم ًساسلا ؾدهلا ىقبٌ ةفٌظو وأ
جمانربلا ةٌفٌظو دنع هنأ امود ركذتو ءاهتنا Main امتح هإاهنإ متٌس جمانربلا نإف اهنم جورخلا وأ ةجٌتنلاب

خئ١ث ًخاد ِٓ شِاٚلا شطع دادذحِ ش٠شّر ش٠ٛطزٌا
دنع قٌبطتلل رماولا رطس تاددحم رٌرمت نم وٌدوتس لوجٌف اننكمٌ امل رابتخلا ةٌلمع انٌلع لهسٌ يذلا رملا رٌوطتلا ةبٌب لخاد نم هرابتخا
انٌلع رفوٌ ًف اهلاخدإب رابتخلا ءانثأ اهرٌرمت اننكمٌ ثٌح اٌودٌ تاددحملا كلت رٌرمت ءانع نم عبرم Command Line Arguments ًف
ةحفصلا Debug صباصخ نم MyProject


204

دلِبؼٌٍّ ذئاضٌا ً١ّحزٌا Operators Overloading




ةٌقٌقحلا وأ ةٌقطنملا لثم تاناٌبلل ةٌساٌقلا عاونلا مدختست ًتلا رٌباعتلل تلماعم كٌزٌاب لوجٌف ؾرعٌ . ةصاخلا تلماعملا ضعب ددحت ًهو
ضارؼلاب Objects لثم Is وأ IsNot لثم تلماعملا ضعب نكلو * و Mod ماع لكشب ضارؼلا كلتل ةبسنلاب ابٌش ًنعت ل .
تلماعم ؾٌرعت كنكمٌ كلذ عمو Operators بٌكارتلل ةبسنلاب Structures تابفلاو Classes لماعملل ةماعلا ةؽٌصلا نوكت ثٌحب
Operator ًلٌ امك

[ <attributes> ] Public [ Overloads ] Shared [ Shadows ] _
[ Widening | Narrowing ] Operator symbol ( operands ) As type
...
End Operator
ًلٌ امك ةماعلا ةؽٌصلا هذه ماسقأ نوكتو :
 Attributes لماعملا صباصخ
 Public و Shared لوصولا ددحم مادختساب اهفٌرعت بجٌ تلماعملا عٌمج Public وأ Shared
 Overloads لماعملا زواجتت كنأ ًنعٌ ةلاحلا هذه ًفو ةقتشم ةبفو ةٌساسأ ةبف نم نٌددحم ذخؤٌ لماعم انٌدل نوكٌ امدنع همدختسن
ةٌساسلا ةبفلا ًف دوجوملا
 Shadows ةٌساسلا ةبفلا ًف دوجوم لثامم لماعم لدبتسٌ لماعملا
 Widening رشإم طاقتلا هٌلع بجٌ لماعملا اذهف ًلاتلابو لٌؽشتلا نمز ًف امود حجنٌ ضٌرعت لٌوحت ددحٌ لماعملا نأ نٌبٌ
اهثودح نكمملا ءاطخلا عٌمجل . لماعملاو CType نٌتٌساسلا نٌتملكلا دحأ ىلع يوتحٌ نأ بجٌ Widening وأ Narrowing
 Narrowing لٌؽشتلا نمز ًف لشفٌ امبر قٌٌضت لٌوحت ددحٌ لماعملا نأ نٌبٌ . لماعملاو CType دحأ ىلع يوتحٌ نأ بجٌ
نٌتٌساسلا نٌتملكلا Widening وأ Narrowing
 Symbol ةٌلاتلا مٌقلا دحأ نوكٌ نأ بجٌو لماعملا زمر : ،=> ،=< ،> ،< ،>< ،= ،>> ،<< ،& ،^ ،\ ،/ ،* ،- ،+ Mod ،
Not, And, Or, Xor, Like, IsTrue, IsFalse, CType
 Operands تلماعملا ذخؤت ثٌحب لماعملا لبق نم اهتجلاعم متت ًتلا ضارؼلا ؾٌرعت ،- ،+ Not, IsTrue, and IsFalse
تلماعملاو دحاو ددحم ،& ،^ ،\ ،/ ،* ،- ،+ ،=> ،=< ،> ،< ،>< ،= ،>> ،<< Mod, And, Or, Xor, Like, CType
نٌددحم ذخؤت
 Type داعم تاناٌب عون اهل نوكٌ نأ بجٌ تلماعملا عٌمج

طباوض ةدعب اددحم نوكٌ تلماعملل دبازلا لٌمحتلاو
 ًهو رخلا ؾٌرعت كٌلع بجٌ اهنم دحاو ؾٌرعتب تمق نإو جاوزأ لكش ىلع ًتؤت تلماعملا ضعب :
o = و <>
o < و >
o >= و <=
o IsTrue و IsFalse
 لماعملا ًف لماعملل ةفرعملا ةبفلا رهظت نأ بجٌ ةٌقطنملاو ةٌداعلا تلماعملا ًف . وأ ةبفلا ىلع بجٌ عونلا لٌوحت تلماعم لجأ نمو
ةداعملا ةمٌقلا وأ لماعملا ًف روهظلا بٌكرتلا
 نلماعملا IsTrue و IsFalse ةٌقطنم ةمٌق ادٌعٌ نأ بجٌ
 ـل ًناثلا لماعملا << و >> حٌحص ددع نوكٌ نأ بجٌ

205

ةراشإب اعوبتم لماعملا كلذ ةجلاعم كٌزٌاب لوجٌف عٌطتسٌ لماعم تفرع اذإ = لماعملا تفرع نإف ًباقلت لكشب + مهفٌ كٌزٌاب لوجٌف نإف
لماعملا += اٌباقلت
نٌلماعملا مادختسا كنكمٌ ل هنأ املاط IsTrue و IsFalse لماعملا ؾٌرعتب تمق نإف رشابم رٌؼ لكشب امهمادختسا كنكمٌف رشابم لكشب
IsTrue ةمٌقك ضرؽلا كلذ مادختسا ناك اذإ امٌف دٌدحتل كٌزٌاب لوجٌف اهمدختسٌ ام ةبفل True ًقطنملا رٌبعتلا ًف . لاثملا لٌبس ىلعف
ضرؽلا ناك اذإ امٌف دٌدحتل ةٌلاتلا ةرابعلا مدختست c1 هرابتعا نكمٌ True

If c1 Then …

نلماعملا تفرع نإو And و IsFalse لماعملا ةجلاعمل امهمادختساب كٌزٌاب لوجٌف موقٌف AndAlso بجٌ اذه لمعٌ نأ لجأ نمو اضٌأ
لماعملا ىلع And اهنمض هتفرع يذلا بٌكرتلا وأ ةبفلا عون سفن ةداعإ . تفرع كنأ انضرتفا نإف And و IsFalse ةبفلا ًف Composite
تارٌؽتملاو C1 و C2 و C3 تادجاوت ًه Instances ةرابعلا رظنا ةبفلا كلتل

C3 = C1 AndAlso C2

لماعملا كٌزٌاب لوجٌف مدختسٌ انهف IsFalse مٌٌقتل C1 لماعملا داعأ نإف IsFalse ةمٌقلا True ةمٌق مٌٌقتب هسفن جمانربلا جعزٌ نلف C2
ًه ةلماك ةرابعلا ةمٌق نأ ضرتفٌو False ةمٌقلا دٌعٌو False نل كلذو هلماكب رٌبعتلل ةبسنلاب IsFalse ةمٌقلا تداعأ True ـل ةبسنلاب C1
ةمٌق تناك اذإ هنأ اٌباقلت كٌزٌاب لوجٌف ؾرعٌو C1 ًه False ةمٌق لعجٌف C3 ةمٌقل ةٌواسم C1 لعجٌ اممو شٌوشتلا ضعب ببسٌ اذهو
لماعملا مدختست ًتلا ةٌقطنملا رٌباعتلا مٌقٌ كٌزٌاب لوجٌف نؤب رٌكفتلا وه رثكأ اٌقطنم رملا AndAlso يداعلا . ؾٌرعت نكمٌ هباشم لكشبو
نٌلماعملا Or و IsTrue لماعملاب اندٌوزتب اٌباقلت كٌزٌاب لوجٌف موقٌف OrElse
تلماعمل ةبسنلاب طقف كلذ لمع نكمٌ نكلو ةداعملا ةمٌقلاب طقف نافلتخٌ كٌزٌاب لوجٌف ًف نٌءارجإ لمع كنكمٌ ل ماع لكشب كنأ املاط
CType عونل هتفرعمب همادختسا هٌلع بجٌ لماعم يأ دٌدحت هنكمٌ عاونلا نٌب لٌوحتلا جمانربلا لواحٌ امدنعف عاونلا نٌب لٌوحتلاب ةصاخلا
ةداعملا ةمٌقلا
ةبفلا ىرن ًلاتلا دوكلا ًفو Complex تلماعملا ددحتو دقعم مق ر لثمت ًتلا + و – و * ماقرلل برضلاو حرطلاو عمجلا تاٌلمع ؾٌرعتل
تلماعملا اضٌأ ددحٌو ةدقعملا = و <> عونلا نم ةداعم ةمٌقل دقعملا مقرلا لوحت ًتلا لٌوحتلا تلماعمو Double اهتٌمهأ اهباطعل

Public Class Complex
Public Re As Double
Public Im As Double

' Constructors.
Public Sub New()

End Sub

Public Sub New(ByVal real_part As Double, ByVal imaginary_part As Double)
Re = real_part
Im = imaginary_part
End Sub

' ToString.
Public Overrides Function ToString() As String
Return Re.ToString & " + " & Im.ToString & "i"
End Function

' Operators.
206

Public Shared Operator *(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex( _
c1.Re * c2.Re - c1.Im * c2.Im, _
c1.Re * c2.Im + c1.Im * c2.Re)
End Operator

Public Shared Operator +(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex( _
c1.Re + c2.Re, _
c1.Im + c2.Im)
End Operator

Public Shared Operator -(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex(c1.Re - c2.Re, c1.Im - c2.Im)
End Operator

Public Shared Operator =(ByVal c1 As Complex, ByVal c2 As Complex) As Boolean
Return (c1.Re = c2.Re) AndAlso (c1.Im = c2.Im)
End Operator

Public Shared Operator <>(ByVal c1 As Complex, ByVal c2 As Complex) As Boolean
Return (c1.Re <> c2.Re) OrElse (c1.Im <> c2.Im)
End Operator

Public Shared Operator -(ByVal c1 As Complex) As Complex
Return New Complex(c1.Im, c1.Re)
End Operator

Public Shared Narrowing Operator CType(ByVal c1 As Complex) As Double
Return System.Math.Sqrt(c1.Re * c1.Re + c1.Im * c1.Im)
End Operator

End Class


207

ءبشٔئ خجزىِ ف١ؼر فئبظٚ حذ٠ذع دبّىحزٌٍ حدٛعٌّٛا ْٚذث َاذخزعا خصاسٌٛا

عونلا نم ادٌدج اعورشم اشنأ Windows Forms Application هٌلع لمعلاب موقن ًك مث ةمباق نم File ةٌعرفلا ةمباقلا نمو ADD
عونلا نم ًلاحلا عورشملل ادٌدج اعورشم ؾضأ Class Library هتٌمستب مقو TestExtendingLib و ؾضأ ةبتكملاب صاخلا دوكلا ؾلم ًف
ًف تفضأ دق كنأ نم دكؤتلا دعب انه انلاثم لمعل ةٌرورضلا ةٌلاتلا عجارملا هتٌادب ةحفص نم اهل ةبسانملا عجارملا References نم
صباصخ My Project

Imports System.Runtime.CompilerServices
Imports System.Math
Imports System.Drawing
Imports System.Windows.Forms
ؾٌرعتلا لدبتسا

Public Class Class1


End Class
ؾٌرعتلاب

Public Module TestExtending

End Module
ةفاضل نٌزهاج انحبصأو نلا ةبٌهتلا ةٌلمع تهتنا انتاعسوت

أدبؤس 1 ةفٌظولا ةفاضإب Alert نول لوحتس ًتلا صوصنلا قودنصل اهباعدتسا دنع رفصلا ىلإ ةباتكلاو رمحلا ىلإ هل ةٌفلخلا - لخاد
ـلا ؾٌرعت Module ًلاتلا دوكلا لخدأ قباسلا

<Extension()> _
Sub Alert(ByVal TxtBx As TextBox)
TxtBx.Font = New Font(TxtBx.Font, FontStyle.Bold)
TxtBx.ForeColor = Color.Yellow
TxtBx.BackColor = Color.Red
End Sub

عونلا عٌسوتل ىرخأ ةفٌظو ؾٌضنسو String ةمٌقلا لوحت ثٌحب ىلإ ةٌصنلا ةلسلسلا ًف ةدوجوملا Double ررمملا ددعلاب اهبرضت مث
جتانلا دٌعتو

<Extension()> _
Function Multiply(ByVal InString As String, _
ByVal Multply As Double) As Double

Return CDbl(InString) * Multply
End Function

لمعب مق Build ةبتكملل TestExtending
لجأ نم طؽضا مث ةٌادبلا ًف هانؤشنأ يذلا زودنٌو قٌبطت ىلع ًنٌمٌلا ةرؤفلا رزب رقنا ةبرجتلا Add Reference ةبتكملل اعجرم ؾضأو
ًف ًلاتلا دارٌتسلا ؾضأ مث وتلل هانؤشنأ ًتلا جذومنلا دوك ةٌادب

Imports TestExtendingLib.TestExtending

ؾضأ TextBox و Button و ListBox ثدح ءاشنل رزلا ىلع اجودزم ارقن رقنا مث جذومنلل رابتخل ًلاتلا دوكلا لخدأ مث هٌلع رقنلا
اقباس امهانفضأ ناتللا نٌتفٌظولا

Me.TextBox1.Text = "123.456"
Me.TextBox1.Alert()
208

Dim s As String = Me.TextBox1.Text
MsgBox(s.Multiply(13))
رظناو رزلا ىلع طؽضاو جمانربلا لؽش ةجٌتنلا
ىمست اقباس ةدوجوم نكت مل ةدٌدج ةفٌظو صوصنلا قودنصل انفضأ ىرت امك Alert اننكمٌ صوصن قودنص يأ ىلع اهقٌبطتو اهنم ةدافتسلا
ةبتكملا ةفاضإب طقف هدٌرن عورشم يأ ًف ةفٌظولا اضٌأ انفضأ امك اقباس انٌأر امك بسانملا دارٌتسلاو Multiply تاناٌبلا عونل String
ةقٌرطلا سفنب عورشم يأ ًف اضٌأ همادختسا نكمٌو

ةفاضإ اضٌأ اننكمٌ ـل ةفٌظو ListBox ةفاضإ كنكمٌ ثٌح ةقٌرطلا سفنب لثم تاناٌبلا ضعبب اهبلمو اهؽٌرفتل لمع مث ةبتكملل ًلاتلا دوكلا
ReBuild كلتمٌ حبصأ ةمباقلا قودنص نأ ؾٌك ةبرجتو اهل ةدٌدجلا ةفٌظولا

<Extension()> _
Sub ClearAndFillComputerCorp(ByVal LstBx As ListBox)
LstBx.Items.Clear()

LstBx.Items.Add("Micrsoft")
LstBx.Items.Add("Sun")
LstBx.Items.Add("Intel")
LstBx.Items.Add("IBM")
LstBx.Items.Add("Borland")
LstBx.Items.Add("CyberLink")
LstBx.Items.Add("Nvidia")
LstBx.Items.Add("Gigabyte")
LstBx.Items.Add("MSI")
End Sub
مكحتلل ةفٌظو ةفاضإ اضٌأ اننكمٌ امك Button هرهظم نم رٌؽت ةقٌرطلا سفنب

<Extension()> _
Sub YellowOnDarkBlue(ByVal Btn As Button)
Btn.Font = New Font(Btn.Font, FontStyle.Bold)
Btn.ForeColor = Color.Yellow
Btn.BackColor = Color.DarkBlue
End Sub

وأ تامكحتلل اهتفاضإ كنكمٌ اهمدختست ةرركتم ؾباظو يأ نلا ةبتكملا ءاشنإب كلذو ةٌساسأ ؾباظو هنؤكو تحبصأو ةدوجوملا تابفلا
كب ةصاخلا عورشملل اهدارٌتساو
ةبتكملاب صاخلا دوكلا ؾلم ًف TestExtendingLib ًف ًلاتلا رطسلا لادبتساب مق طقف ؾلملا ةٌادب

Public Module TestExtending
رطسلاب

<Global.Microsoft.VisualBasic.HideModuleName()> _
Public Module TestExtending
لدبتست نأ كنكمٌ ةبتكملا مادختسا دنع كلذبو ًلاتلا دارٌتسلا رطس

Imports TestExtendingLib.TestExtending
رطسب ًلاتلا دارٌتسلا

Imports TestExtendingLib

حرشو نمض ةبتكملا ًف اندوك نأ امب وه لٌدعتلا Module ةدوجوملا تلادلا مادختسا اننكمٌو ـلا ًف Module انفضأ اذل طقف اهمساب
ةفصاولا HideModuleName مسا ءافخإ ببست ًتلا ـلا Module ةبتكملا ءاعدتسا دنع دارٌتسلا راصتخا ًلاتلابو
دعب اعبط ل لٌدعتلا لمع سنت Rebuild ةدٌدجلا تلٌدعتلا يرست ىتح ةبتكملل
209

ءبّعلا يبغِ غ١عٛر My َاذخزعبث My Extensibility


ءامسلا لاجم مٌدقت مت My نم اءدب Visual Basic 2005 تاءاعدتساو قبارطلل تاراصتخا رفوٌل API تقولا كلذ ذنمو ةعباشلا
ءامسلا لاجمل ةصاخلا مهتاعسوت ةباتك نٌمدختسملل نكمٌ ناك My مهب ةصاخلا دوكلا تابتكم هل نٌفٌضم . مدق دقو My Extensiility دٌدجك
ًف Visual Basic 2008 لاجملا عٌسوت لهس امم My . ةزٌم عمو My Extensibility لٌعفت ءاؽلإو لٌعفت ناكملاب حبصأ ةدٌدجلا My
Extensibility رٌوطت ةبٌب عٌسوت ةٌلمع لعج يذلا رملا عورشملا ًف عمجمل عجرم ةلازإ وأ طبر متٌ امدنع وأ عٌراشملا ممصم للخ نم
Visual studio ةطاسب رثكأ .
يبغٌّا غ١عٛر قشؽ My
لٌلقلا كانه لاجملا عٌسوتل اهمادختسا نكمٌ ًتلا دوكلا جذامن نم My . اقباس اهفرعن ًتلا كلت ًه كلذ لمعل لهسلا ةقٌرطلاو
لاجملل اش يأ ةفاضإ ةٌلمعف My لاثملا ًف امك رخآ ءامسأ لاجم يل اش يأ ةفاضإ ةٌلمعل ةلثامم ةٌلمع ًه

Namespace My.HandyStuffForMy
<Global.Microsoft.VisualBasic.HideModuleName()> _
Friend Module HandyStuffForMyModule
Sub Foo()
...
End Sub

Property Bar()
...
End Property
End Module
End Namespace

ءارجلا لعجٌ يذلا Foo ةٌصاخلا و Bar لاجملا نمض نارهظٌ HandyStuffForMy لاجملا نمض My . ةفصاولا انمدختسا ثٌح
attribute ةامسملا HideModuleName ـلا مسا عنمت ًتلا module هنمض ةاوتحملا رصانعلا ىلإ لوصولل هجاتحت ل كنل روهظلا نم .
لاجملل رصانعلا هذه ةفاضإ تدرأ نإو My حبصٌل قباسلا دوكلا ًف لاجملا مسا لدع ًعرف لاجم ءاشنإ نودب My ًلٌ امك طقف

Namespace My
<Global.Microsoft.VisualBasic.HideModuleName()> _
Friend Module HandyStuffForMyModule
Sub Foo()
...
End Sub

Property Bar()
...
End Property
End Module
End Namespace

لاجملا نمض افلس دوجوم لاجم مسا تمدختسا نإو My ـك Resources ةنورم كٌطعٌ امم لاجملا كلذل اهتفاضإ متٌس رصانعلا هذهف لثم
كتاعسوت ىلإ لوصولا ةٌفٌك ًف ةرٌبك . لوصولا ددحمف لوصولا ددحم وه هٌلإ هابتنلا بجٌ يذلا اشلاو Friend تاعمجملا عنمب موقٌس
لوصولا ددحم تمدختسا نإو رصانعلا هذه ىلإ لوصولا نم ىرخلا Public عٌراشملا ًف ةفرعم زومر عم رصانعلا هذه براضتت امبر
لاجملا مدختست ًتلا ىرخلا My
210


حدشفٌّا خلسٌٛا َاذخزعبث غ١عٛزٌا Singleton
My.Computer و My.Settings و My.Application ةقرولا ةدٌحو تادجاوت ًه Singleton Instances تابفلل
My.MyComputer و My.MySettings و My.MyApplication ةزٌم مادختساب ةلوهسب تابفلا هذهل رصانع ةفاضإ اننكمٌ ثٌح
ةأزجملا تابفلا Partial Class ىعدٌ ءارجإ ؾٌضٌ ًلاتلا دوكلا لثمف Shutdown ضرؽلل My.Computer

Namespace My
Partial Class MyComputer
Sub Shutdown()
...
End Sub
End Class
End Namespace

عٌسوتل دوكلا اذه مادختسا نكمٌ امك My.Application و My.Settings ىلإ رصانع ةفاضإ نم ةأزجملا تابفلا ةزٌم كنكمت ثٌح اضٌأ
لثم تابف نمضتٌ اذهو رخآ ناكم ًف ةفرعم تابف MyComputer عٌراشم ًف Visual Basic متٌ نأ لبق تابفلا نقحب مجرتملا موقٌ ثٌح
دوكلا ةمجرت .
طقف ةءارقلل ةٌصاخ ةفاضإ كٌلع بجٌ ةروكذملا تابفلا لثم ةدرفم ةقروك اهٌلإ لوصولا نكمٌ اهتفاضإب تمق ًتلا كرصانع لعج تدرأ اذإو
لاجملل My نم دوزملا كلذ لثامٌ اماع ادجاوت دٌعت ThreadSafeObjectProvider(Of T) ىلع ةبفلا كلت نم ةروص ءاشنإب موقٌ يذلا
كلسملا ىوتسم Thread ةفاضإ ةٌفٌك انٌرٌ ًلاتلا دوكلاو My.CustomMyObject هرصانع عم

Namespace My
<Global.System.ComponentModel.EditorBrowsable _
(Global.System.ComponentModel.EditorBrowsableState.Never)> _
Partial Friend Class MyCustomMyObject
Public Sub Foo()
...
End Sub

Public Property Bar()
...
End Property
End Class

<Global.Microsoft.VisualBasic.HideModuleName()> _
Friend Module CustomMyObjectModule
Private instance As ThreadSafeObjectProvider(Of MyCustomMyObject)

ReadOnly Property CustomMyObject() As MyCustomMyObject
Get
Return instance.GetInstance()
End Get
End Property
End Module
End Namespace

211

غعٛزٌا خثبزو
لٌؽشتب أدبنس Visual Studio هتٌمستو دٌدج لوسنوك قٌبطت ءاشنإو MyValidation ةفاضأو Module عورشملل ةدٌدج
اهتٌمستو MyValidation.vb ًلاتلا دوكلاب دوجوملا دوكلا لماك لدبتسا مث

Imports System.Text.RegularExpressions
Imports System
Imports System.Linq
Imports Microsoft.VisualBasic

Namespace My.Validation
<Global.Microsoft.VisualBasic.HideModuleName()> _
Public Module MyValidationMod
Public Function IsEmpty(ByVal value As Object) As Boolean
If (value Is Nothing) OrElse _
(value Is System.DBNull.Value) OrElse _
(value.ToString = String.Empty) OrElse _
(TypeOf value Is Date AndAlso CDate(value) = Date.MinValue) _
Then
Return True
Else
Return False
End If
End Function

Public Function IsAlphaNumeric(ByVal value As String, _
Optional ByVal emptyOK As Boolean = False, Optional ByVal _
whitespaceOK As Boolean = False) As Boolean
If IsEmpty(value) Then Return emptyOK

Dim expr As String
If whitespaceOK Then
expr = "^[a-zA-Z0-9\s]+$"
Else
expr = "^[a-zA-Z0-9]+$"
End If

Return Regex.IsMatch(value, expr)
End Function

Public Function IsCanadianProvince(ByVal st As String) As Boolean
Dim allProv = "|AB|BC|MB|NB|NL|NT|NS|NU|ON|PE|QC|SK|YT"
Return st.Length = 2 AndAlso allProv.IndexOf("|" & st) <> -1
End Function

Public Function IsUSAState(ByRef st As String) As Boolean
Dim allStates = "|AL|AK|AZ|AR|CA|CO|CT|DE|FL|GA|HI|ID|IL|IN|IA|" & _
"KS|KY|LA|ME|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|" & _
"OK|OR|PA|RI|SC|SD|TN|TX|UT|VT|VA|WA|WV|WI|WY"
Return st.Length = 2 AndAlso allStates.IndexOf("|" & st) <> -1
End Function

212

Public Function IsUSAPostalCode(ByVal zip As String) As Boolean
If String.IsNullOrEmpty(zip) Then Return False

Return Regex.IsMatch(zip, "^\d{5}(-\d{4})?$")
End Function

Public Function IsCanadianPostalCode(ByVal zip As String) As Boolean
If String.IsNullOrEmpty(zip) Then Return False

Return Regex.IsMatch(zip, "^[A-Z]\d[A-Z] \d[A-Z]\d$")
End Function

Public Function IsNorthAmericanPhone(ByRef phone As String) As Boolean
If String.IsNullOrEmpty(phone) Then Return False

Dim expr As String = "^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}" & _
"(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$"

Return Regex.IsMatch(phone, expr)
End Function

Public Function IsEmail(ByRef email As String) As Boolean
If String.IsNullOrEmpty(email) Then Return False

Dim localPartCharset = "[0-9a-zA-Z!#$%*/?|\^{}`~&'+\-=_]"
Dim domainPartCharset = "[0-9a-zA-Z\-]"
Dim expr = String.Format("^{0}+(\.{0}+)*@{1}+(\.{1}+)*", _
localPartCharset, domainPartCharset)

Return Regex.IsMatch(email, expr)
End Function
End Module
End Namespace


بلاق ءاشنإب موقت امدنع ارذح نوكت نأ كٌلع My Extension ىلإ صاخ لكشب هابتنلا كٌلع بجٌف عورشم يأ ؾٌرعت ًف مدختسٌ نأ نكمٌ
ـل ةلمتحملا مٌقلا Option Explicit و Option Strict و Option Compare و Option Infer نمض لمعٌل كدوك ةباتك كنكمٌ اهدنع
لضفلا رملا ربتعٌ يذلا كتعسوت ًف دوك ؾلم لك ةٌادب ًف صاخ لكشب ؾٌرعت لك دٌدحت وأ ةنورم لقلا ؾٌرعتلا .
لٌدعت كٌلع انهو عورشملا ىوتسم ىلع ةفرعملا زومرلا ًف براضتلا بنجتل عٌراشملا ًف ةفلتخملا تادارٌتسلا ةٌناكمإ ذخؤت نأ بجٌ امك
ةزوجحملا ةملكلاب كبلاق ًف ةفرعم رٌؼ زومر يأ Global وأ My مادختسا نم لدب لثمف Text.Encoding مدختسا
Global.Text.Encoding تمدختسا نإف Text.Encoding تاقٌبطت ًف كبلاق لمعٌ نلف طقف Windows Forms اهدنع دروتستس ًتلا
ناٌمسم ءامسأ ًلاجم Text تفذح نإف Global طقف تمدختساو System.Text.Encoding ءامسأ لاجم ددحٌ يذلا كبلاق لمعٌ نل امبرف
ىعدٌ System . ذشت لو ةدٌجلا راكفلا نم نٌرخلا ىلع هعٌزوت لبق ادٌج كدوك رابتخا ربتعٌو My Extensions ةدعاقلا هذه نع .
ـلا مدختسن انعد Module مساب اٌلآ اهإاشنإ مت ًتلا Module1 ـل ةبرجت ةباتكل My Extensions نم نوكٌس هنا ىلإ هابتنلا ردجٌو
ةبباش دجت امدنع تاعسوتلا دارٌتسا ةداعإ بعصلا bug ةربتخم اهنأ نم دكؤتلاو ناكملا ردق لماك لكشب لمعت ةعسوتلا لعج ةلواحم كٌلع اذل
ىلولا ةرملل اهرٌدصتب موقت نأ لبق ادٌج . حتفب مق Module1.vb ًف اهٌلع جودزملا رقنلاب كلذو Solution Explorer دوكلا لدبتساو
طؽضا مث ًلاتلا دوكلاب دوجوملا F5 عورشملا لٌؽشتل

213

Module Module1
Private testNumber As Integer
Private testGroup As String

Sub StartTestGroup(ByVal name As String)
testGroup = name
testNumber = 0
End Sub

Sub Test(ByVal result As Boolean, ByVal expected As Boolean)
testNumber += 1

If result <> expected Then
Console.WriteLine("Test #{0} of group {1} FAILED.", _
testNumber, testGroup)
End If
End Sub

Sub Main()

StartTestGroup("IsAlphaNumeric")
Test(My.Validation.IsAlphaNumeric("123HH2", True, True), True)


StartTestGroup("IsCanadianPostalCode")
Test(My.Validation.IsCanadianPostalCode("H0H 0H0"), True)


StartTestGroup("IsCanadianProvince")
Test(My.Validation.IsCanadianProvince("ON"), True)


StartTestGroup("IsEmail")
Test(My.Validation.IsEmail("a@b.com"), True)

Console.WriteLine _
("Tests are finished. No FAILED messages indicates success.")
Console.WriteLine("Press any key to continue.")

Console.ReadKey(True)
End Sub
End Module


تٌاٛمو دبؼعٛزٌا ت١ػٛر
بلاقك اهبٌضوتل تقولا ناح لماك لكشب تربتخاو ةعسوتلا ةباتك تمت نأ دعب My Extension . عورشملا كرتا كلذ لمعلو
رملا رتخاو احوتفم Export Template ةمباقلا نم File جلاعم كل رهظٌف Export Template راتخنس ثٌح item Template نم
طؽضا مث هنم بلاقلا ردصنس يذلا عورشملا مسا راٌتخل لفسلا ًف راٌخ كل رفوتٌ امك جلاعملا ةذفان next ةمباق نمو Item to export
رتخا MyValidation.vb طؽضا مث next رتخا عورشملا اذه لجأ نمو كبلاق لمعل ةٌرورضلا عجارملا عٌمج اراٌتخا كٌلع مث
214

System.Core طؽضا مث next لما مث Template Description راٌخلا نع ةراشلا ةلازإب مقو Automatically import the
template into Visual Studio طؽضا مث هرٌدصت دعب ةرشابم بلاقلا دارٌتساب موقت ل رٌوطتلا ةبٌب لعجٌ يذلا Finish

My Extensions as Templates
بلاق ًف My Extension بلاوق عٌمج ًف لاحلا وه امك Visual Studio نع ةرابع ًهو ةرفوتم بلاقلا تاددحم عٌمج نوكت
دوك نمض اٌلآ اهجاردإ نكمٌ ةصاخ ةٌصن لسلس My Extension ـف عورشملل اهتفاضإ متٌ امدنع $clrversion$ مقرب اهلادبتسا متٌ
ـل ةٌلاحلا ةخسنلا clr بلاقلا ةلاح ًفو Mu Extension لادبتسا متٌس $safeitemname$ رصنعلا ةمٌقب <DefaultName> ؾلملا ًف
ةقحللا لمحٌ يذلا vstemplate هتقحل نودب بلاقلا دوك يوحٌ يذلا ؾلملا مسا يواسٌ يذلاو .
بلاقلا ًف هلمع كنكمٌ ًماظن بلاق ًف هلمع نكمٌ رخآ اش يأو My Extension ةمٌقلا طبضف <Hidden> ؾلملا ًف vstemplate ىلإ
False راوحلا قودنص ىلإ بلاقلا ةفاضإ نم كنكمٌ Add New Item تاعمجم ةفاضإ رابجإ كنكمٌ امك عورشملل رصانعلا ؾٌضت امدنع
مسقلا نمض كلذو بلاقلا ةفاضإ دنع عورشملل <References> لبق نم اهإاشنإ متٌ ًتلاك اهباهتنا دنع دوكلا تافلم نم ةلباع ةفاضإ نكمٌو
مدختسملا دوك ىلإ ةفاضلاب اذ زودنٌو جذامن ررحم .
بلاوقو ةٌساسلا بلاوقلا نٌب ةٌساسلا تافلتخلا ضعب دجوت امك My Extensibility رصنعلا بلاق نكمت ًكلف Item Template ًك
ةحفص لبق نم اهترادإ متٌ My Extensions عٌراشم ممصم ًف Visual Basic مبلم لكشب اهفٌرعتل تاوطخ ةدعب ماٌقلا كٌلع بجٌ .
رصنعلا ةفاضإ كٌلع بجٌ ةٌادبلا ًف <CustomDataSignature> ؾلملل MyTemplate.vstemplate ؾلم ًف دجاوتملا zip مت يذلا
ـك هتلماعم بجٌ رصنعلا بلاق نأ ىلإ رٌشٌ يذلا هرٌدصت My Extension هتفاضإ متٌ امدنع ًلآ لكشب حتفلا نم بلاقلا عنم كٌلع بجٌ امك
رصنعلل تافصلا ضعب ةفاضإب كلذو عورشملل <ProjectItem> دوك نأ ببسب MyExtension امك مدختسملل ًبرم رٌؼ نوكٌ نأ بجٌ
رصنعلا ةفاضإ كٌلع بجٌ <Hidden> ؾلملل MyTemplate.vstemplate راتخٌ امدنع ةتبثملا بلاوقلا ةمباق نمض بلاقلا رهظٌ ل ًك
راوحلا قودنص للخ نم هعورشمل رصانع ةفاضإ مدختسملا Add New Item ةقحللاب ؾلم ةفاضإ كٌلع ارٌخأو customdata ةمزرلل
لثم ةٌساٌقلا بلاوقلا ىلع قبطنت ل تامولعم رٌفوتل كلذو unique Id و Version number و trigger assembly . كٌلع اذه لمعلو
ةقحللا وذ ؾلملا كف zip ةٌناث ةٌرورضلا تافلملا طؽض ةداعإ مث ةبسانملا تلٌدعتلاب ماٌقلاو .
ؾلملا حتفا مث غراف دلجم ىلإ اقباس هرٌدصتب انمق يذلا بلاقلا تاٌوتحم كفب مق ةٌادبلا ًف myTemplate.vstemplate امك تلٌدعتلاب مقو
دوكلا ًف

<VSTemplate Version="2.0.0"
xmlns=http://schemas.microsoft.com/developer/vstemplate/2005
Type="Item">
<TemplateData>
<DefaultName>MyValidation.vb</DefaultName>
<Name>MyValidation</Name>
<Description>Extends the My namespace with a set of string
validation methods.</Description>
<ProjectType>VisualBasic</ProjectType>
<SortOrder>10</SortOrder>
<Icon>TemplateIcon.ico</Icon>

<!-- Configures the template to not be shown as an option
when the user selects to add an item template to his project -->
<Hidden>true</Hidden>

<!-- Indicates it is to be treated as a My Extension. -->
<CustomDataSignature>Microsoft.VisualBasic.MyExtension
</CustomDataSignature>

215

</TemplateData>
<TemplateContent>
<References>
<Reference> <Assembly>System.Core</Assembly> </Reference>
</References>
<ProjectItem SubType="Code" TargetFileName="$fileinputname$.vb"
ReplaceParameters="true" OpenInEditor="false"
OpenInWebBrowser="false" OpenInHelpBrowser="false">MyValidation.vb
</ProjectItem>
</TemplateContent>
</VSTemplate>

ادٌدج افلم اشنأ - اقحل ةمزرلل هفٌضن ؾوس - همسو MyValidation.customdata ـلا ةطساوب هحتفاو Notepad دوكلا هٌلإ ؾضأو
ًلاتلا

<VBMyExtensionTemplate
ID="MyValidationMyNamespaceExtension"
Version="1.0.0.0" />

ةفصاولاو AssemblyFullName ةوعد متٌ ؾوسف عورشملل عمجملا اذه ةفاضإ متٌ امدنع هنأ ىلإ رٌشت لاثملا اذه ًف اهفذح مت ًتلا
ةفاضل مدختسملا My Extension ةلازل مدختسملا ةوعد متٌ ؾوسف عورشملا نم عمجملا لازٌ امدنعو My Extension عمجم ةفاضلو
حدق Trigger Assembly ؾلملل ًلاتلاك مسق ةفاضإ نكمٌ customdata

<VBMyExtensionTemplate
ID="MyValidationMyNamespaceExtension"
Version="1.0.0.0"
AssemblyFullName="System.Windows.Forms" />

ؾلملا لخادل تافلملا عٌمج خسن ةداعإب نلا مق zip مادختساب Windows Explorer

فٌٍّا vbproj
عم لماعتلا My Extension موقٌ ًكلو ةٌلآ ةٌفخم ةٌلمع وه Visual Studio نم لٌلق لخد مادختساب ةسلسب اهتجلاعمب
ةقحللا وذ ؾلملا حتفب تمق اذإ اهتٌإر كنكمٌ ًتلا ةدٌدجلا تافصلا ضعب ةعسوتلا ىلع يوتحٌ يذلا عورشملا ؾلمل حبصأ مدختسملا
vbproj ةفاضإب تمق يذلا عورشملاب صاخلا ةعسوتلا MyValidation ًلاتلاب اهٌبش ابٌش ىرت ؾوسف ًصن ررحم يؤب هٌلإ

<ItemGroup>
...
<Compile Include="My Project\MyExtensions\MyValidation.vb">
<VBMyExtensionTemplateID>
MyValidationMyNamespaceExtension
</VBMyExtensionTemplateID>
<VBMyExtensionTemplateVersion>
1.0.0.0
</VBMyExtensionTemplateVersion>
</Compile>
...
</ItemGroup>
216


ؾلملا لثم ًساسأ دوك ؾلمب صاخلا مسقلا ىلع ةرظن تٌقلأ اذإ نكلو Module1.vb ىرت ؾوسف

<ItemGroup>
<Compile Include="Module1.vb" />
</ItemGroup>

ؾلملاف تافلتخلا ضعب كانه ىرت امكو MyValidation.vb ًبرم رٌؼ نوكٌ ؾوس هنأ ًنعٌ اذهو عورشملا دلجم ًف هنٌزخت متٌ ؾوس
راٌخ تلعف اذإ لإ Show All items ًف Solution Explorer ؾلملا ًف ةفاضملا مٌقلا قفاوت تاناٌبلا نم ناتٌفاضإ ناتعطق هل نأ دجتسو
MyValidation.customdata . ـل نكمٌ تامولعملا هذه نٌزختبو Visual studio نم تاعسوتلا ةلازإو ةفاضإب مدختسملل حمسٌ نأ
ةحفص My Extensions موقٌسف هتلازإ تمتو حداق عمجمل رشإم كانه ناك نإو يودٌ لكشب ؾلملا ةفاضإ نع لدب عورشملا صباصخ ًف
ـل Visual Studio نأ نم مدختسملا رٌذحتب My Extension ةخسن نم رثكأ دجاوت نم عنمت امك هتلازل اراٌخ هٌطعٌو لمعلا عٌطتسٌ نل
عورشملا سفن ًف ةعسوتلا نم .

217

ًؼع قٚذٕط صٛظٌٕا ًجم٠ دب١ٍّؼٌا خ١ثبغحٌا ْٚذث َاذخزعا خ١طبخٌا Text
ياٚدٚ ً٠ٛحر عاٛٔلا

موهفم ىلع اقٌبطت عوضوملا اذه ربتعٌ ناونعب لٌمحتلا دبازلا تلماعملل Operators Overloading روكذملا عوضوملا ةعجارم ىجرٌف
هٌلع علطإ كٌدل نكٌ كل نإ
برض ةٌلمعب ماٌقلا دٌرت تنك نإف ـب صوصنلا قودنص لخاد دجوٌ ام ةمٌق 10 ؾ لثم عٌمجلا لبقت نل رٌوطتلا ةبٌب نأ لوقٌس ًلاتلا دوكلا

a = TextBox1 * 10

ًفو م ًلاق م ىلع اقٌبطت هلوبقب رٌوطتلا ةبٌب عانقإب موقؤس اذه تلماعملل دبازلا لٌمحتلا موهف
طقف رماوأ رز و صوصن قودنص هٌف عضو ادٌدج اعورشم اشنأ مث ةمباق نم Project رتخا رملا Add Class ةدٌدجلا ةبفلا مس و
MyTextBox اهتثاروب موقنس ثٌح يداعلا صوصنلا قودنص نم مدختسملا مث دوكلا نوكٌس يذلا ةدٌدجلا ةبفلا ًف ًلاتلا دوكلا لخدأ
لماكلا ةبفلل

Public Class MyTextBox
Inherits TextBox

Public Shared Operator *(ByVal Op1 As MyTextBox, ByVal op2 As Integer) As
Integer
Return (CInt(Op1.Text) * op2)
End Operator

Public Shared Operator *(ByVal op2 As Integer, ByVal Op1 As MyTextBox) As
Integer
Return (CInt(Op1.Text) * op2)
End Operator

End Class

لمعا build عورشملل

ًف Solution Explorer رزلا طؽضا Show All Files ةدقعلا عسو مث Form1.vb ؾلملاب صاخلا دوكلا ررحم حتفاو
Form1.Designer.vb صنلا لدبتساو System.Windows.Forms.TextBox درو امنٌأ روكذملا ؾلملا ًف انتبف مساب ةدٌدجلا
MyTextBox مث ررحم حتفب مق مث ةحوتفملا تافلملا ةفاك قلؼأو ظفحلاب مق ـب صاخلا جذامنلا Form1 متٌل رزلا ىلع اجودزم ارقن رقناو
ىلع رقنلل ثدح جلاعم ةفاضإ ًلاتلا دوكلا هٌف عضو رماولا رز

Dim a As Integer = TextBox1 * 34
Dim b As Integer = 65 * TextBox1

MsgBox(a.ToString & vbCrLf & b.ToString)

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


Public Class MyTextBox
Inherits TextBox

Public Shared Operator *(ByVal Op1 As MyTextBox, ByVal op2 As Integer) _
As Integer

Return (CInt(Op1.Text) * op2)
End Operator

Public Shared Operator *(ByVal op2 As Integer, ByVal Op1 As MyTextBox) _
As Integer

Return (CInt(Op1.Text) * op2)
End Operator

Public Shared Operator +(ByVal a As MyTextBox, ByVal b As Integer) _
As Integer

Return (CInt(a.Text) + b)
End Operator

Public Shared Operator +(ByVal b As Integer, ByVal a As MyTextBox) _
As Integer

Return (CInt(a.Text) + b)
End Operator

Public Shared Operator -(ByVal a As MyTextBox, ByVal b As Integer) _
As Integer

Return (CInt(a.Text) - b)
End Operator

Public Shared Operator -(ByVal b As Integer, ByVal a As MyTextBox) _
As Integer

Return (b - CInt(a.Text))
End Operator

Public Shared Operator /(ByVal a As MyTextBox, ByVal b As Integer) As Double
Return (CInt(a.Text) / b)
End Operator

Public Shared Operator /(ByVal b As Integer, ByVal a As MyTextBox) As Double
Return (b / CInt(a.Text))
End Operator

End Class


219

غعبزٌا ُغمٌا - داسبغٌّا دذؼر



ةٌلاتلا تاعوضوملا ىلع يوتحٌو :
 Threading in Windows Forms Applications
 مادختسا ةرٌحب تاراسملا Using the Thread pool
 نمازت تاراسملا Thread Synchronization
 ةٌفٌك ذٌفنت ةٌلمع ًف راسم رخآ راهظإو ةجٌتنلا ًف تامكحتلا ىلع جذومنلا

220

Threading in Windows Forms Applications


ضارؼأ ًف ةلكشملا نمكت Windows Forms نم اٌرصح مهٌلإ لوصولا بجٌ هنأ وه هسفن تاذ جذومنلاو تامكحتلا نأ وه
ضارؼأ لك ةقٌقحلا ًفو مهباشنإب ماق يذلا راسملا للخ Windows Forms ىلع دمتعت STA Model ىلع ةدمتعم اعٌمج اهنأ ببسب كلذو
لباسر ةٌلكٌه Win32 ةفرؽلا تاراسم ثرت ًتلاو Apartment-Threaded راسم يأ ىلع مكحتلا وأ جذومنلا ءاشنإ كنكمٌ هنأ ًنعٌ امم
راسملا سفن نم اهإاعدتسا بجٌ هب ةطبترملا قرطلا عٌمج نكلو هدٌرت . تٌن تودلا ماسقأ نأ ببسب لكاشملا نم دٌدعلا روهظ ىلإ يدإٌ امم
مدختست ىرخلا Free-Threading model ًف حضاو لكشب راسم ءاشنإب مقت مل ول ىتحو ةبٌس ةركف ربتعت ةمكح نودب نٌعونلا لك جزمو
مدختسم ةهجاو رصنع ىلإ لوصولا لواحت امدنع لثمف لاوحلا عٌمج ًف لكاشملا ضعب كل رهظتس امبر كدوك UI Element للخ نم
ةقٌرطلا Finalize ةقٌرطلا نأ ملعن نحنو ام عونل Finalize ًسٌبرلا راسملا نع ؾلتخم راسم ىلع اهذٌفنت متٌ

The ISynchronizeInvoke Interface
ةهجاولا للخ نم مهضرع متٌ نٌذلا مه رخآ راسم نم مهإاعدتسا كنكمٌ ًتلا ةدٌحولا مكحتلا رصانع ISynchronizeInvoke
قبارطلا كلتمت ًتلا BeginInvoke و EndInvoke ةٌصاخلا و InvokeRequired طقف ةءارقلل ةلباقلا . ةٌصاخلا دٌعت ثٌح
InvokeRequired ةمٌقلا True ؾلتخم راسم ىلع ًعدتسملا لمعٌ امدنع كلذو ةرشابم مكحتلا ىلإ لوصولا عٌطتسٌ ل ًعدتسملا ناك اذإ
ةقٌرطلا ءاعدتسا ًعدتسملا ىلع بحٌ ةلاحلا هذه ًفف هٌف مكحتلا ءاشنإ مت يذلا راسملا نع Invoke مكحتلاب صاخ رصنع يأ ىلإ لوصولل
راسم لمكٌ ىتح ًعدتسملا راسملا ؾاقٌإ متٌ اذهل ةنمازتم ةقٌرطلا هذهو UI ةقٌرطلا ذٌفنت . قبارطلا مادختسا ًعدتسملا راسملل نكمٌ وأ
BeginInvoke و EndInvoke نمازتم ل لكشب ةٌلمعلا ذٌفنتل .
ةقٌرطلا ذخؤت Invoke ةقٌرط ىلإ رٌشٌ ضوفم ءارجإ ) Sub وأ Function ( عونلا نم ةفوفصم ذخأ هنكمٌو Object تناك اذإ ًناث ددحمك
راسملا ًف هذٌفنت متٌ ضوفملا هٌلإ رٌشٌ يذلا ءارجلا نأ زودنٌو جذامن ةٌلكٌه نمضتو تاددحملا نم رثكأ وأ دحاو عقوتت ةقٌرطلا UI اذهل
جذومنلا ىلع مكحت يأ ىلإ لوصولا نامؤب هنكمٌ .
ةقٌرطلا مادختسا اننكمٌ ؾٌك ىرنس Invoke راسملا رٌؼ راسم نم مكحت ىلإ لوصولل UI ةراٌز اننكمٌ ؾٌك ًلاتلا لاثملا انل رهظٌ ثٌح
مكحت ًف دلجملا مسلا راهظإ متٌ امنٌب يوناث راسم نم دلجم ةرجش نمض تادلجملا عٌمج Label ةقٌرط دٌدحت وه هلمعب موقنس اش لوأو
طٌسب ءارجإ درجم نوكت نأ اهنكمٌ ًتلا بولطملا راهظلا لمعب موقت

' This method must run in the main UI thread.
Sub ShowMessage(ByVal msg As String)
Me.lblMessage.Text = msg
Me.Refresh()
End Sub

نٌب هتكراشم متت ًك جذومنلا ىوتسم ىلع افرعم نوكٌ ضوفملا كلذل نباك لمحٌ رٌؽتمو ةقٌرطلا كلتل رٌشٌ ضوفم ءارجإ دٌدحتب موقن مث
جذومنلا نمض قبارطلا عٌمج

' A delegate that can point to the ShowMessage procedure
Delegate Sub ShowMessageDelegate(ByVal msg As String)
' An instance of the delegate
Dim threadSafeDelegate As ShowMessageDelegate

ثدحلا ةجلاعم ءارجإ لثم يوناثلا راسملا أدبت ةقٌرطل جاتحتسو Click رماوأ رزل Button

' Parse the c:\Windows directory when the user clicks this button.
Private Sub btnSearch_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnSearch.Click
Dim t As New Thread(AddressOf SearchFiles)
t.Start("c:\windows")
End Sub

مكحتلل لوصولا عٌطتسٌ نأ دوكلا كلذل يرورضلا نم هنأ ثٌح يوناثلا راسملا ىلع لمعٌس يذلا دوكلا ةباتكب موقت ارٌخأو lblMessage
ةقٌرطلا ءاعدتساب ShowMessage ةقٌرطلا للخ نم متٌ اذهو Invoke جذومنلا ةبف ًف Form Class ةقٌرطلا وأ Invoke مكحت يل
امامت اهل ةبفاكم نوكت ًتلاو جذومنلا ىلع دوجوم

' (This method runs in a non-UI thread.)
221

Sub SearchFiles(ByVal arg As Object)
' Retrieve the argument.
Dim path As String = arg.ToString()
' Prepare the delegate
threadSafeDelegate = New ShowMessageDelegate(AddressOf ShowMessage)
' Invoke the worker procedure. (The result isn't used in this demo.)
Dim files As List(Of String) = GetFiles(path)
' Show that execution has terminated.
Dim msg As String = String.Format("Found {0} files", files.Count)
Me.Invoke(threadSafeDelegate, msg)
End Sub

' A recursive function that retrieves all the files in a directory tree
' (This method runs in a non-UI thread.)
Function GetFiles(ByVal path As String) As List(Of String)
' Display a message.
Dim msg As String = String.Format("Parsing directory {0}", path)
Me.Invoke(threadSafeDelegate, msg)
' Read the files in this folder and all subfolders.
Dim files As New List(Of String)
For Each fi As String In Directory.GetFiles(path)
files.Add(fi)
Next
For Each di As String In Directory.GetDirectories(path)
files.AddRange(GetFiles(di))
Next
Return files
End Function

ةقٌرطلا مادختسل انجتحا نإ رثكأ ةٌلمعلا دقعتتسو ShowMessage ةقٌرطلاف تاراسملا عٌمج ىلع GetFiles نم اهإاعدتسا نكمٌ لثم
راسملا UI ةقٌرطلا مادختساب ءاعدتسلا لمع ةلاحلا هذه ًفو Invoke ةمٌق صحف انٌلع بجٌ كلذل هبنجت بجٌ روملل اقابتسا ؾٌضٌ
ةٌصاخلا InvokeRequired ةمٌقلا دٌعت تناك نإ ةٌداعلا ةقٌرطلا مادختساو False

' (Inside the SearchFiles and GetFiles methods)
If Me.InvokeRequired Then
Me.Invoke(threadSafeDelegate, msg)
Else
ShowMessage(msg)
End If

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

' This method can run in the UI thread or in a non-UI thread.
Sub ShowMessage(ByVal msg As String)
' Use the Invoke method only if necessary.

If Me.InvokeRequired Then
Me.Invoke(threadSafeDelegate, msg)
Return
End If

Me.lblMessage.Text = msg
Me.Refresh()
End Sub

مكحتلا ىلع ةلاسر راهظل جاتحتس دوكلا نم ةعطق يأ رٌٌؽتلا اذه دعبف lblMessage ءاعدتسل طقف جاتحتس ShowMessage قلقلا نودب
هٌلع دوكلا ذٌفنت متٌ راسم يأ لوح
كٌزٌاب لوجٌف ًف ؾورظلا ضعب ًفو 2005 مقر كروومٌرفلا وأ 2 راهظلا راسم رٌؼ راسم قٌرط نع مكحتلل لوصولاب قٌبطتلا موقٌ
non-UI thread لثم ةطٌسب تامكحت ىلإ لوصولا لواحت امدنع لثم كلذ ثودح نكمٌف لكاشم ةٌؤب ببستلا نودب Label موقت امدنع وأ
222

لباسر لاسرإ ببست ل تاٌلمعب Win32 كلذو لكاشمب ببستلا نودب اهلٌدعت سٌلو اهتءارق نكمٌ صباصخلا نم دٌدعلا نأ امك ةٌفلخلا ًف
تٌن تودلا مكحت نمض رصنع ًف ةنزخم صباصخلا كلت ةمٌق نل

The BackgroundWorker Component
ةهجاولا نأ نم مؼرلا ىلع ISynchronizeInvoke زودنٌو جذامن تاقٌبطت ًف تاراسملاب ةقلعتملا لكاشملا ًف عوقولا نم كبنجت
نمآ بولسؤب ةنمازتم رٌؼ ةقٌرط ءاؽلل ةطٌسب ةقٌرطل لثم جاتحت تنؤف ءاطخأ لقأو لضفأ ةقٌرطل كٌزٌاب لوجٌف يروطم مظعم جاتحٌ
ًباقلت لكشب ةروكذملا ةهجاولا هرفوت ل يذلا اشلا . نوكملا ةفاضإب تفوسوركٌام تماق ببسلا اذه لجأ نمو BackgroundWorker ىلإ
تاراسملا ةددعتم زودنٌو تاقٌبطت ءاشنإ ةٌلمع لهسٌ امم ادج لهس همادختساو تاودلا قودنص .
نوكملا كلتمٌ BackgroundWorker ةٌصاخلاف مامتهلل ناترٌثم ناتٌصاخ WorkerReportsProgress اهتمٌق نوكت True قلطأ اذإ
ثدحلا نوكملا ProgressChanged ةٌصاخلاو WorkerSupportsCancellation اهتمٌق نوكت True ةقٌرطلا معدٌ نوكملا ناك اذإ
CancelAsync نٌتقٌرطلا لكل ةٌضارتفلا ةمٌقلا نوكتو False ىلإ مهتمٌق طبض كٌلع بجٌ اذل True اٌازم عٌمج نم ةدافتسلا تدرأ اذإ
ىلإ نٌتمٌقلا اتلك طبض مت دق هنأ ضرتفٌ انه حرطٌس يذلا لاثملاو مكحتلا اذه True نوكملا مادختسا بلطتٌو BackgroundWorker
ةٌلاتلا تاٌلمعلا ماع لكشب :
1 . ثدحلل ةجلاعم ءارجإ ءاشنإ DoWork متٌ امدنع دوكلا اذه لٌؽشت متٌو يوناثلا راسملا ىلع هذٌفنت متٌ نأ دٌرت يذلا دوكلاب اهإلمو
ةقٌرطلا ءاعدتسا RunWorkerAsync ثدحلا ةجلاعم ءارجل هرٌرمت متٌ اددحم لبقت ًهو DoWork دوكلل نكمٌ ل ثٌح
رخآ راسم ًف لمعٌ هنل جذومنلا ىلع تامكحتلل ةرشابم لوصولا كانه دوجوملا
2 . ةقٌرطلا مدختسا ReportProgress ثدحلا لخاد نم DoWork ةقٌرطلا هذهو جذومنلا ىلع رصنع ىلإ لوصولا دٌرت امدنع
ثدحلا قلطت ProgressChanged ةٌصاخلا ةمٌق تناك اذإ Worker-ReportsProgress ًه True ءانثتسا قلطإ متٌس لإو
Worker-ReportsProgress اهتمٌق نوك ةلاح ًف False ثدحلا ةجلاعم ءارجإ ًف دوكلاو ProgressChanged ًف لمعٌ
راسملا سفن UI جذومنلا تامكحت نم يل نامؤب لوصولا هنكمٌ اذهلو
3 . ةقٌرطلا مدختسا CancelAsync مكحتلل BackgroundWorker طبض ًعدتست ةقٌرطلا هذهو ةرشابم يوناثلا راسملا ؾاقٌل
ةٌصاخلا WorkerSupportsCancellation ىلإ True ءانثتسا قلطإ متٌس لإو InvalidOperationException ةلاح ًف
اهتمٌق نوك False ًف دوكلا ىلع بجٌو DoWork ةٌصاخلا نم اٌرود ققحتلا CancellationPending امدنع نامؤب جورخلاو
اهتمٌق حبصت True
4 . ثدحلل ةجلاعم ءارجإ ةباتك RunWorkerCompleted امإ يوناثلا راسملا لمع ًهتنٌ امدنع لامعأ ةٌؤب ماٌقلا دٌرت تنك نإ
راسملا ًف لمعٌ ثدحلا اذه ةجلاعم ءارجإ ًف دوكلاو ءاؽللا ةطساوب وأ ًعٌبط لكشب UI رصانع عٌمجل لوصولا عٌطتسٌ اذل
جذومنلا
ثدحلا جلاعم ًف دوكلاف ماع لكشبو DoWork ىلعف ةبفلا ىوتسم ىلع لقح ًف ةمٌقلا هذه نٌٌعت نم لدب ًساسلا راسملل ةمٌق دٌعٌ نأ بجٌ
ةٌصاخلل ةمٌقلا هذه نٌٌعت دوكلا Result ضرؽلل DoWorkEventArgs ةٌصاخلا ةطساوب ًساسلا راسملل ةرفوتم ةمٌقلا هذه نوكتف
Result ضرؽلل RunWorkerCompletedEventArgs ثدحلل ررمملا RunWorkerCompleted مدختسٌ ًجذومن دوك اذهو
رصنعلا BackgroundWorker

' The button that starts the asynchronous operation
Private Sub btnStart_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnStart.Click
Dim argument As Object = "abcde" ' The argument

BackgroundWorker1.RunWorkerAsync(argument)
' Disable this button, and enable the "Stop" button.
btnStart.Enabled = False
btnStop.Enabled = True
End Sub

' The button that cancels the asynchronous operation
Private Sub btnStop_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnStop.Click
BackgroundWorker1.RunWorkerAsync(argument)
End Sub
223


' The code that performs the asynchronous operation
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
' Retrieve the argument.
Dim argument As Object = e.Argument
Dim percentage As Integer = 0

' The core of the asynchronous task
Do Until BackgroundWorker1.CancellationPending

' Report progress when it makes sense to do so.
BackgroundWorker1.ReportProgress(percentage)
Loop
' Return the result to the caller.
e.Result = primes
End Sub

' This method runs when the ReportProgress method is invoked.
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
ByVal e As ProgressChangedEventArgs) Handles _
BackgroundWorker1.ProgressChanged

' It is safe to access the user interface from here.
' For example, show the progress on a progress bar or another control.
ToolStripProgressBar1.Value = e.ProgressPercentage
End Sub

' This method runs when the asynchronous task is completed (or canceled).
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
ByVal e As RunWorkerCompletedEventArgs) Handles _
BackgroundWorker1.RunWorkerCompleted
' It is safe to access the user interface from here.

' Reset the Enabled state of the Start and Stop buttons.
btnStart.Enabled = True
btnStop.Enabled = False
End Sub

رصنعلا مادختسا نكمٌ ؾٌك ًلاتلا لاثملا كل رهظٌ BackgroundWorker ةلكشملا سفن ًهو نمازتم رٌؼ راسم ًف تافلملا نع ثحبلل
نع ثٌدحلا دنع تحرط ًتلا The ISynchronizeInvoke Interface ةلوهسب نٌتقٌرطلا ةنراقم كنكمٌ اذهبو اقباس عوضوملا اذه ًف .
ىلع ةدمتعملا ةدٌدجلا ةخسنلا نوكتسو BackgroundWorker نمازتم رٌؼ لمعل ءاؽللا معدت اهنأ ببسب لٌلقب ادٌقعت رثكأ
' The result from the SearchFiles procedure
Dim files As List(Of String)
' We need this variable to avoid nested calls to ProgressChanged.
Dim callInProgress As Boolean

' The same button works as a Start and a Stop button.
Private Sub btnStart_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnStart.Click
If btnStart.Text = "Start" Then
lstFiles.Items.Clear()
Me.BackgroundWorker1.RunWorkerAsync("c:\windows")
Me.btnStart.Text = "Stop"
Else
Me.BackgroundWorker1.CancelAsync()
End If
End Sub

' The code that starts the asynchronous file search
Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
224

ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork

' Retrieve the argument.
Dim path As String = e.Argument.ToString()
' Invoke the worker procedure.
files = New List(Of String)
SearchFiles(path)
' Return a result to the RunWorkerCompleted event.
Dim msg As String = String.Format("Found {0} files", files.Count)
e.Result = msg
End Sub

' A recursive function that retrieves all the files in a directory tree.
Sub SearchFiles(ByVal path As String)
' Display a message.

Dim msg As String = String.Format("Parsing directory {0}", path)
' Notice that we don't really use the percentage;
' instead, we pass the message in the UserState property.
Me.BackgroundWorker1.ReportProgress(0, msg)

' Read the files in this folder and all subfolders.
' Exit immediately if the task has been canceled.
For Each fi As String In Directory.GetFiles(path)
If Me.BackgroundWorker1.CancellationPending Then Return
files.Add(fi)
Next
For Each di As String In Directory.GetDirectories(path)
If Me.BackgroundWorker1.CancellationPending Then Return
SearchFiles(di)
Next
End Sub


Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, _
ByVal e As ProgressChangedEventArgs) _
Handles BackgroundWorker1.ProgressChanged
' Reject nested calls.
If callInProgress Then Return
callInProgress = True
' Display the message, received in the UserState property.
Me.lblMessage.Text = e.UserState.ToString()
' Display all files added since last call.
For i As Integer = lstFiles.Items.Count To files.Count - 1
lstFiles.Items.Add(files(i))
Next
Me.Refresh()
' Let the Windows operating system process message in the queue.
' If you omit this call, clicks on buttons are ignored.
Application.DoEvents()
callInProgress = False
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, _
ByVal e As RunWorkerCompletedEventArgs) _
Handles BackgroundWorker1.RunWorkerCompleted
' Display the last message and reset button's caption.
Me.lblMessage.Text = e.Result.ToString()
btnStart.Text = "Start"
End Sub

ثدحلا ءارجإ ادعام هسفن حرشٌ انه دوكلاو ProgressChanged ةقٌرطلل ءاعدتسا دوكلا نمضتٌ نأ بجٌ ثٌح
Application.DoEvents رزلا ىلع رقنلا ثدح لثم ةقلطنملا ثادحلا ةجلاعم نم قٌبطتلا نكمتٌ نل لإو Stop نكمم رخآ لمع يأ وأ
225

ءارجلل ةششعم تاءاعدتسا ببسٌس ةقٌرطلا هذه ءاعدتساف كلذ عمو ةهجاولل هتفاضإ ProgressChanged ءانثتسا قلطإ ببسٌ دق امم
StackOverflowException دعاسم ًقطنم لقح مادختسا متٌ اذه ثودح مدع لجأ نمو callInProgress هذه لثم ثودح بنجتل
ةششعملا تاءاعدتسلا
ةقٌرطلا مدختسٌو ًسٌبرلا راسملل مدقتلا ةبسن نع ملعلل جاتحٌ ل قٌبطتلا اذه نأ اضٌأ ظحل ReportProgress نم ءزج ذٌفنتل طقف
ةٌصاخلل اهرٌرمت متٌ راهظلل ةٌلعفلا ةلاسرلاو جمانربلل ًسٌبرلا راسملا ًف دوكلا UserState مدختسٌ كقٌبطت ناك نإو progress bar وأ
ةقٌرطلا ءاعدتسا بنجت كٌلع بجٌ مدقتلل رخآ رشإم يأ ReportProgress ارٌثك ةفلكم نوكتو تاراسملا لٌدبتب ببستت اهنل ًعاد نودب
ثودح ةلاح ًف طقف ةقٌرطلا ءاعدتساو ةبفلا ًف لقح ًف مدقتلا رشإم نٌزخت كٌلع بجٌ ةلاحلا هذه ًفو ةجلاعملا تقوب رملا قلعتٌ امدنع
ًلعف مدقت

Dim currentPercentage As Integer

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, _
ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork

Const TotalSteps = 5000
For i As Integer = 1 To TotalSteps

' Evaluate progress percentage.
Dim percentage As Integer = (i * 100) \ TotalSteps
' Report to UI thread only if percentage has changed.
If percentage <> currentPercentage Then
BackgroundWorker1.ReportProgress(percentage)
currentPercentage = percentage
End If
Next
End Sub



226

داسبغٌّا حش١حث َاذخزعا Using the Thread pool


تابس ةلاح ًف اهتقو مظعم تاراسملا هذه ؾرصت امدنع ةصاخو ةعرسب ماظنلا ءادأ ضافخنا ببسٌ دق تاراسملا نم دٌدعلا ءاشنإ
راهظلا ثٌدحت وأ ام ردصم ةءارق ضرؽب ةٌرود ةروصب اهلٌؽشت داعٌوأ . لكشب تاراسملا ةرٌحب بٌترت ةداعإ كنكمٌ كدوك ءادأ نٌسحتلو
ضارؼلا ضعب مادختساب دراوملل مادختسا ؤفكأ نمضٌ Objects ءامسلا لاجم ًف ةدوجوملا System.Threading تاراسملا ةرٌحب

The ThreadPool Type
ةلادلا ءاعدتساب موقت امدنع تاراسملا ةرٌحب ءاشنإ متٌ ThreadPool.QueueUserWorkItem ضوفم ءارجل جاتحت ًتلاو
WaitCallback delegate ضرؼو Object ىلإ رٌشٌ نأ بجٌ ضوفملا ءارجلاو راسملل تاناٌبلا رٌرمتل مدختسٌ يراٌتخا Sub ررمٌ
عونلا نم دٌحو ددحم هل Object وأ راسملل اهرٌرمت دٌرن ًتلا تاناٌبلا ىلع ةٌوتحم هتمٌق نوكت ثٌحب Nothing تاناٌب دجوت ل امدنع
ةبف ًف ءارجإ ءاعدتسل تاراسملا نم رٌبك ددع مادختسا كنكمٌ ؾٌك كل نٌبت ةٌلاتلا دوكلا ةعطقو اهرٌرمت دٌرن Class

For i As Integer = 1 To 20
' Create a new object for the next lightweight task.
Dim task As New LightweightTask()
' Pass additional information to it. (Not used in this demo.)
task.SomeData = "other data"
' Run the task with a thread from the pool.
' (Pass the counter as an argument.)
ThreadPool.QueueUserWorkItem(AddressOf task.Execute, i)
Next

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

Class LightweightTask
Public SomeData As String

' The method that contains the interesting code
' (Not really interesting in this example)
Sub Execute(ByVal state As Object)
Console.WriteLine("Message from thread #{0}", state)
End Sub
End Class

ةٌصاخلا ةمٌق يرحتب ل مأ تاراسملا ةرٌحب نم ذخأ دق ناك اذإ امٌف دٌدحت هنكمٌ لماعلا راسملاو
Thread.CurrentThread.IsThreadPoolThread ةنكاسلا ةقٌرطلا ءاعدتساب ةكربلا ًف تاراسملل ىصقلا ددعلا ةفرعم كنكمٌو
ThreadPool.GetMaxThreads ةنكاسلا ةقٌرطلا ءاعدتساب اٌلاح ةحاتملا تاراسملا ددعو ThreadPool.GetAvailableThreads .
ةدٌدج ةقٌرط ةفاضإ مت امك SetMaxThreads كروومٌرفلا ًف 2 . NET Framework 2.0 تاراسملل ىصقلا ددعلا رٌٌؽت نم كنكمت
ةكربلا ًف ةدوجوملا

' Maximum 30 worker threads and maximum 10 asynchronous I/O threads in the pool
ThreadPool.SetMaxThreads(30, 10)

تاراسملا ةرٌحب نم هرٌعتسأ مأ ًسفنب راسملا ءاشنإب موقأ له لإاست ةطقن ًف راتحت دق ناٌحلا ضعب ًف . ةدٌج ةدعاق انه رهظتو : مدختسا
تاراسملا ةبف Thread class اهذٌفنت متٌ لو تقولا كلهتست ةٌلمعب ماٌقلا دٌرت امدنع وأ تقو عرسؤب اهذٌفنت دٌرت ةٌلمع ذٌفنت دٌرت امدنع
تاراسملا ةرٌحب مادختسا كٌلع بجٌ ماع لكشب تلاحلا مظعم ًفو ارٌثك .
227


The Timer Type
هفعضو هتوق طاقن كلتمٌ اهنم لك تاتقإملا نم عاونأ ةدع كروومٌرفلا مدقت . مكحتلا مادختسا كٌلع بجٌ لثمف
System.Windows.Forms.Timer عونلا نم قٌبطت ىلع لمعلاب موقت امدنع Windows Forms applications كجمانرب نكٌ مل نإو
ةبفلا مادختسا اهدنع كٌلع بجٌ مدختسملل ةهجاو كلتمٌ System.Threading.Timer ةبفلا وأ System.Timers.Timer ناتاه ربتعتو
ىلع ًلاتلا حرشلاو ابٌرقت لمعلا ًف نٌتٌواستم ناتبفلا System.Threading.Timer ىلع اضٌأ قبطنٌ System.Timers.Timer

ةبفلا Timer ءامسلا لاجم ًف System.Threading مادختسا كنكمٌ ثٌح ةددحم ةٌبارجإ ًعدتسٌ تقإمل ةطٌسب ةقٌرط مدقٌ
تقإملا ًنابو قوف امف ةدحاو ةرم نم ءادتبا نكٌ امهم هجاتحت يذلا راركتلاب هذٌفنت نكمٌو لبقتسملا ًف نٌعم تقو ًف لمع ةلودجل ةبفلا هذه
تاددحم ةعبرأ ذخؤٌ :
 ضوفم ءارجإ TimerCallback delegate اذه نوكٌ نأ بجٌو تقإملا نمز ًهتنٌ امدنع ىعدتسٌ يذلا ءارجلا ىلإ رٌشٌ
عونلا نم ءارجلا Sub عونلا نم دحاو ددحم ذخؤٌ Object
 ضرؼ Object وأ ةفوفصم وأ ةٌصن ةلسلسك عاونأ ةدع نم نوكٌ نأ نكمٌو ضوفملا هٌلإ رٌشٌ يذلا ءارجلل هرٌرمت متٌ
ةعومجم Collection مٌق رٌرمتل جاتحت نكت مل نإو ءارجلل اهرٌرمت متٌس ًتلا تاناٌبلا ىلع يوتحٌ رخآ تاناٌب عون يأ وأ
مدختسا Nothing ةطاسب لكب
 عونلا نم ةمٌق TimeSpan عونلا نم ةمٌق مادختساب اهدٌدحت نكمٌ امك هدعب ءارجلا ءاعدتسا متٌس يذلا تقإملا نمز ددحت Long
وأ UInteger ةٌناث ًللٌملاب نمزلا ساقٌ ةلاحلا هذه ًفو ) 1 / 1000 ةٌناثلا نم ( رٌرمت دنعو Timeout.Infinite متٌ ل ةمٌقك
ةمٌقلا وأ ادبأ تقإملا قلطإ 0 ةرشابم تقإملا قلطل رفص
 عونلا نم ةمٌق TimeSpan ىلولا ةرملا دعب تقإملا قلطإ راركت نمز ددحت اهرودب ًتلاو تقإملا نمز ددحت . نكمٌ اضٌأ هذهو
عونلا نم ةمٌقب اهدٌدحت Long وأ UInteger ةمٌقلا رٌرمت كنكمٌو ةٌناث ًللٌملاب اساقم تقولا حبصٌ اضٌأ انهو 1 وأ
Timeout.Infinite طقف ةدحاو ةرم تقإملا قلطل .
صباصخك ةرفوتم رٌؼ تقإملا ًنابل اهررمت ًتلا مٌقلا هذهو . ةقٌرطلا مادختساب طقف مٌقلا هذه رٌٌؽت كنكمٌ تقإملا لٌؽشت دعبو Change
method كلتمٌو تقإملا نمز ةرتفو لٌؽشتلا تقو ناددحٌ نٌددحم ذخؤت ًتلاو Timer object ءارجإ Stop تقإملا ؾاقٌإب موقٌ يذلا
ءارجلا ءاعدتسا ربع هفاقٌإ متٌ يذلا Dispose تقإملا لوح هنع انثدحت امع لاثم ةٌلاتلا دوكلا ةعطق انٌرتو

Sub TestThreadingTimer()
' Get the first callback after one second.
Dim dueTime As New TimeSpan(0, 0, 1)
' Get additional callbacks every half second.
Dim period As New TimeSpan(0, 0, 0, 0, 500)
' Create the timer.
Using t As New Timer(AddressOf TimerProc, Nothing, dueTime, period)
' Wait for five seconds in this demo, and then destroy the timer.
Thread.Sleep(5000)
End Using
End Sub

' The callback procedure
Sub TimerProc(ByVal state As Object)
' Display current system time in console window.
Console.WriteLine("Callback proc called at {0}", Date.Now)
End Sub

تارٌؽتملاب مكحتلا كٌلع بجٌ اذل تاراسملا ةكرب نم ذوخؤم راسم ىلع هذٌفنت متٌ ىعدتسملا ءارجلا نأ ةظحلم ردجت ةٌاهنلا ًفو
تاراسملا نمازتب ىعدٌ ام مادختسا ربع جمانربلل ًسٌبرلا راسملا لبق نم ةمدختسملا ىرخلا رداصملاو

228

داسبغٌّا ِٓاضر Thread Synchronization

The SyncLock Statement
ةٌساق ةٌلمع تاعطاقم نودب لٌؽشتلا ةٌلمع نوكتو تاعطاقم نودب ًماظن لكشب دوكلا رٌسٌ نأ كل نمضٌ اش دجوٌ ل لٌؽشتلا نمز للخ
جمانربلا نمض ةقدلاب اعناق نوكتس اهجاتحتس ًتلا تلاحلا مظعم ًفو ماهملا ةددعتم ةبٌب نع ةرابع نوكٌ امدنع ةصاخو لٌؽشتلا ماظن ىلع
ةنٌعم ةعطق ذٌفنت عٌطتسٌ ًلاحلا قٌبطتلا نمض دحاو ذٌفنت راسم نأ نامض كل اٌفاك نوكٌ لاثملا لٌبس ىلعف دوكلا ةجلاعم دنع كلذو دحاولا
ةلتك نمض كلت دوكلا ةعطق نٌمضتب كلذ قٌقحت كنكمٌو ددحم تقو ًف دوكلا نم SyncLock…End SyncLock رٌؽتم ىلإ جاتحٌ يذلاو
ةٌلاتلا تابلطتملا اققحم هل ددحمك :
 ةٌصاخلا نودبو ةبفلا ىوتسم ىلع رٌؽتم ةداعلا ًف نوكٌو تاراسملا عٌمج نٌب كرتشم نوكٌ نأ بجٌ ThreadStatic
 لثم ًعجرم عون نم نوكٌ نأ بجٌ String وأ Object ةمجرتلا ًف ؤطخ هنع جتنٌ ةمٌقلا عاونأ مادختساو
 ةمٌقلا ىلع يوتحٌ ل نأ بجٌ Nothing ةمٌقلا رٌرمت لاح ًفو Nothing ذٌفنتلا نمز ًف ءاطخأ ببسٌس
ةلتك نع لاثم ًلٌ امٌفو SyncLock

' The lock object. (Any non-Nothing reference value will do.)
Private consoleLock As New Object()

Sub SynchronizationProblem_Task(ByVal obj As Object)
Dim number As Integer = CInt(obj)
' Print a lot of information to the console window.
For i As Integer = 1 To 1000
SyncLock consoleLock
' Split the output line in two pieces.
Console.Write(" ")
Console.Write(number)
End SyncLock
Next
End Sub

رٌؽتملا مدختسٌ قباسلا دوكلاو consoleLock ضرؽلل لوصولاب مكحتلل Console عٌمج نٌب كرتشملا دٌحولا ردصملا لكشٌ وهو
لتك نم دٌدعلا يوحت نأ نكمٌ ةٌقٌقحلا تاقٌبطتلاو هلجأ نم نمازتلا قٌقحت كٌلع بجٌ يذلا ردصملا وهف اذهلو لاثملا ًف تاراسملا
SyncLock ارٌؽتم مادختسا كٌلع بجٌ انهو ةمصبلا ؾلتخا لجأ نم ةفلتخم تارٌؽتم ةدع وأ ًلحملا رٌؽتملا سفن مدختست نأ نكمٌ ًتلاو
نمض اهذٌفنت بجٌ ًتلا رٌباعتلا ةعومجم لجأ نم وأ اهلجا نم نمازتلا لمع بجٌ ًتلا ةكرتشملا رداصملا عاونأ نم عون لك لجأ نم ازٌمم
تقولا سفن ًف راسملا .
ةلتك مدختست امدنعو SyncLock ةلتك اٌباقلت دوكلا نمضتٌ Try…End Try قلطإ مت اذإ حٌحص لكشب لفقلا رٌرحت نامض لجأ نم ةٌفخم
ةلتكلا لخاد ةرابعل زفقلا كنكمٌ ل اذه لجأ نمو ءانثتسا SyncLock . ةلتكلا تناك نإو SyncLock دجاوتب صاخ ءارجإ لخاد ةعوضوم
Instance دجاوتلا كلذ ًف ءارجإ نمض ةلماعلا تاراسملا عٌمجو ام ةبفل Instance رٌرمت كنكمٌ ةبفلل Me ـلا ةرابعل SyncLock كلذو
تابلطتملا لك ققحٌ ضرؽلا اذه نأ ببسب ) تاراسملا عٌمج نم هٌلإ لوصولا نكمٌ – ةٌعجرم ةمٌق وهو – سٌل وه دٌكؤتلابو Nothing (

Class TestClass
Sub TheTask()
SyncLock Me
' Only one thread at a time can access this code.

End SyncLock
End Sub
End Class

ةظحلم : مادختسا كنكمٌ Me لوسنوكلا ةذفان وأ لثم ددحم ؾلمك دٌحو ردصم ىلع نمازتلا لمع دٌرت تنك نإ طقف ةقٌرطلا هذهب Console
Window ةلتكل تاددحمك تارٌؽتم ةدع ًباقلت لكشب مدختستس رداصم ةدع ًمحت ًتلا نمازت لتك ةدع كٌدل ناك نإو SyncLock . اشلاو
229

مادختسا كٌلع بجٌ هنأ وه ركذ امم ربكأ ةٌمهأ هل يذلا Me نكمٌ كلذ ادع ًلاحلا عمجملا جراخ ةٌبرم رٌؼ ةبفلا تناك اذإ طقف ددحمك
دجاوتلا سفن مادختسا رخآ قٌبطتل Instance ةلتك نمض ةبفلل SyncLock ًقٌقح ببس نودب دوكلا نم لتك ةدع ذٌفنت متٌ نلف اذهبو ةفلتخم
ضرؼ مادختسا كٌلع بجٌ ل ماع لكشبو ددحم Object ةلتكل ددحمك ىرخأ تاعمجم نم ًبرم ماع SyncLock . نأ ةظحلملا ردجتو
لماعلا مدختست تنرتنلا ىلع اهارت ًتلا داوكلا نم دٌدعلا GetType لفقلل مدختسملا ضرؽلا عون ىلع لوصحلل lock object كلذو
ةنكاسلا ةقٌرطلا ةٌامحل .
تارابع مدختست امدنع SyncLock هل تجتحا امنٌأ قباطتم شٌشعت لسلست مادختسا يرورضلا نم ةفلتخم ضارؼل نمازتلاب ماٌقلل ةششعم
ةدعاقلا هذهو قٌبطتلا ءازجأ نم دٌدعلا للخ ةتٌملا لافقلا ةلاح ىلإ لوصولا كبنجٌ هتاذ قباطملا لسلستلاب لافقلا نع يرحتلاف كقٌبطت ًف
ىلع يوتحت ةلاد موقت امدنع اضٌأ قبطنت SyncLock ىلع يوتحت ىرخأ ةلاد ءاعدتساب SyncLock

' Always use this sequence when locking objLock1 and objLock2.
SyncLock objLock1
SyncLock objLock2

End SyncLock
End SyncLock

يٛغىٌا ذعاٛزٌاٚ ءادلا داسبجزػا Performance Considerations and Lazy Instantiation
ةلتك نمض ةكرتشم تارٌؽتم مدختست ًتلا داوكلا عٌمج نٌمضت SyncLock لكشب هإادأ ضٌفخت وأ ارٌثك كقٌبطت ءاطبإ ىلإ يدإٌ
ةلتك مادختسا بنجت تعطتسا نإف تاجلاعملا ددعتم بساح ىلع هلٌؽشت متٌ امدنع صاخ لكشبو ظوحلم SyncLock لماكت ضٌرعت نودب
لوسك دجاوتب دٌحو طمن مدختست كنأ لٌخت لثمف اٌعطق هب ماٌقلا كٌلع بجٌ رطخلل تاناٌبلا lazy instantiation تاراسملا ةددعتم ةبٌب ًف

Public Class Singleton
Private Shared m_Instance As Singleton
Private Shared sharedLock As New Object()

Public Shared ReadOnly Property Instance() As Singleton
Get
SyncLock sharedLock
If m_Instance Is Nothing Then m_Instance = New Singleton
Return m_Instance
End SyncLock
End Get
End Property
End Class

صاخلا رٌؽتملا نل كلذو نمازت ىلإ جاتحٌ ل ةٌصاخلل تلوصولا مظعم نأ قباسلا دوكلا ًف ةلكشملا نمكت m_Instance ةرم هنٌٌعت متٌ
بولطملا ؾرصتلا قٌقحتل لضفأ ةقٌرط ًلٌ ام ًفو ةٌصاخلا ةءارق اهٌف متٌ ًتلا ىلولا ةرملا ًف ةدحاو

Class Singleton
Private Shared m_Instance As Singleton
Private Shared sharedLock As New Object

Public Shared ReadOnly Property Instance() As Singleton
Get
If m_Instance Is Nothing Then
SyncLock sharedLock
If m_Instance Is Nothing Then m_Instance = New Singleton()
End SyncLock
End If
Return m_Instance
End Get
End Property
End Class
230


خِٕاضزٌّا عاشغلا Synchronized Objects
تٌن تودلا ضارؼأ عٌمج سٌل نأ ًه تٌن تودلا ًف تاراسملاب ةقلعتم ىرخأ ةلكشم . NET object ربع نامؤب ةكراشملل ةلباق
تاراسملا not all .NET objects are thread-safe دكؤتلل قباثولا نم امود دكؤتلا كٌلع بجٌ تاراسملا ددعتم قٌبطت ةباتكب موقت امدنعف
تابفلل ةنكاسلا قرطلا عٌمج لاثملا لٌبس ىلعف تاراسملا ربع مادختسلل ةنمآ اهمدختست ًتلا قبارطلاو ضارؼلا نأ نم Regex و Match
لثم تٌن تودلا ضارؼأ ضعب كلذكو ؾلتخم راسم نمض اهمادختسا مدع بجٌف ةنمآ رٌؼ ةنكاس رٌؽلا قرطلا نكلو تاراسملا ربع ةنمأ
Windows Forms objects and controls اهصباصخو اهقرط ءاعدتسا هنكمٌ اهؤشنأ يذلا راسملا طقف لعجت ًتلا دودحلا نم دٌدعلا اهل

خِٕاضزٌّا ذ١ٔ دٚد عاٛٔأ Synchronized .NET Types
لثم اهتعٌبطب تاراسملا ربع ةنمآ رٌؽلا ضارؼلا نم دٌدعلا ArrayList و Hashtable و Queue و SortedList و Stack و
TextReader و TextWriter و تاراسملل نمأ ضرؼ دٌعت نمازتلل ةلباق ةنكاس ةقٌرط مدقت ةٌماظنلا رٌباعتلا thread-safe object
ةٌصاخلا ضرعٌ اهمظعم نأ امك هرٌرمت مت يذلل افاكم IsSynchronized دٌعت ًتلا True تاراسملا ربع ةنمآ ةخسن عم لماعتت امدنع

' Create an ArrayList object, and add some values to it.
Dim al As New ArrayList()
al.Add(1): al.Add(2): al.Add(3)
' Create a synchronized, thread-safe version of this ArrayList.
Dim syncAl As ArrayList = ArrayList.Synchronized(al)
' Prove that the new object is thread-safe.
Console.WriteLine(al.IsSynchronized) ' => False
Console.WriteLine(syncAl.IsSynchronized) ' => True
' You can now share the syncAl object among different threads

نم ةلسلس ربع رمت ةقٌرط لك نأ ببسب كلذو ةنمازتم رٌؽلا ةخسنلا نم ؤطبأ نوكٌ ةنمازتملا ةخسنلا هذه عم لماعتلا نأ امباد ركذت
ةٌداعلا تاعومجملاو تافوفصملا تمدختسا اذإ رثكأ لاعف دوك ةباتك كنكمٌ تلاحلا مظعم ًفو ةٌلخادلا تاصوحفلا regular arrays and
collections ةلتك مادختساب اهرصانع ةنمازمب تمقو SyncLock ةٌداعلا

The Synchronization Attribute
ةٌصاخلا مادختسا System.Runtime.Remoting.Contexts.Synchronization لوصولا قٌقحتل ةقٌرط طسبأ ًه
ضرؽلل نمازتملا Object نكلو ةبفلا مادختسا عٌطتسٌ راسم يأ كلذبو هقبارطو هلوقح ىلإ لوصولا طقف دحاو راسم عٌطتسٌ كلذبو هلمكؤب
ةبفلا نمض ادوك ذفنت ةقٌرطلا تناك اذإ هقبارط دحأ ذٌفنت عٌطتسٌ طقف دحاو راسم Class راظتنلا هٌلع ةبفلا هذه مادختسا لواحٌ راسم يأو
لتك كانه نؤكو ىرخأ تاملكبو SyncLock لافقلا رٌؽتم سفن ةمدختسم ةبفلا قبارط ةفاك ؾلؽت . ةبف ةنمازم كنكمٌ ؾٌك نٌبٌ ًلاتلا دوكلاو
ةٌصاخلا مادختساب Synchronization attribute نم اهتثارو متٌ نأ بجٌ ةبفلا نأ اضٌأ ظحل ContextBoundObject ـك اهمٌلعت متٌل
context-bound object

System.Runtime.Remoting.Contexts.Synchronization()> _
Class Display
Inherits ContextBoundObject

End Class

نمازتلا ةٌصاخ و Synchronization attribute نمازتلا رفوت ل اهنكلو قرطلاو صباصخلاو لوقحلا عٌمجل نمازتملا لوصولا نمضت
نٌنكاسلا ءاضعلل static members هتمٌق نوكت نأ نكمٌ اٌراٌتخا اددحم ذخؤت ًهو True وأ False ةبفلا اهرفوت ًتلا تباوثلا دحأ وأ
SynchronizationAttribute ةبتكم نم اهٌلع علطلا كنكمٌ ًتلاو MSDN

231

The MethodImpl Attribute
كنكمٌ ثٌح تلاحلا مظعم ًف اٌفاك نوكٌ ةبفلا كلت ًف قبارطلا ضعب ةٌامحو قٌبطتلا لتقتس ةلماك ةبف ةنمازم تلاحلا مظعم ًف
ةلتكب ةقٌرطلا دوك ؾٌلؽتب اذه قٌبطت SyncLock ةفصلا ىلع ةٌنبم طسبأ ةٌنقت مادختسا كنكمٌ وأ
System.Runtime.CompilerServices.MethodImpl

Class MethodImplDemoClass
' This method can be executed by one thread at a time.
<MethodImpl(MethodImplOptions.Synchronized)> _
Sub SynchronizedMethod()

End Sub
End Class

ةفصلا قٌبطتف MethodImpl ةلتكب قبارطلا كلت لماك ؾٌلؽت نم ضرؽلا سفن يدإٌ ةبفلا ًف قبارط ةدع ىلع SyncLock مدختست ًتلاو
Me ةٌصاخلاب ةملعم ةقٌرط ًعدتسٌ راسم يأ ىرخأ تاملكبو لافقإ رٌؽتمك MethodImpl ءاعدتسا نم رخآ راسم يأ عنمٌ ؾوس
ةٌصاخلاب ةملعملا ةقٌرطلا MethodImpl مدختسٌ يذلا ضرؽلا رٌؽتم نوكٌو ةنكاسلا قبارطلا ىلع ةٌصاخلا هذه مادختسا كنكمٌ امك
ةبفلل ىرخلا قبارطلا لفقل مدختسملا ضرؽلا رٌؽتم نع ؾلتخم ةنكاسلا قبارطلا لفقل اٌنمض instance methods يذلا راسملاف اذهبو
ةفصلاب ةملعم ةنكاس ةقٌرط ًعدتسٌ MethodImpl ةنكاس رٌؽلا قبارطلا ءاعدتسا نم رخآ راسم عنمٌ ل instance methods ةملعملاو
ةفصلا سفنب

حش١غزٌّا خثبزىٌاٚ حءاشمٌا دب١ٍّػ Volatile Read and Write Operations
ءاطخأ ثودح لامتحا عضو كٌلع بجٌ تاجلاعملا ددعتم بساح ىلع لمعٌ قٌبطتلاو تاراسم ةدع ربع رٌؽتم ةكراشم متت امدنع
ةبف ًف لقح ىلع ةباتكلاب تمق اذإف اذهلو هب صاخلا شاكلا جلاعم لكل نأ ًف تاجلاعملا ددعتم ماظنلا ًف ةلكشملا نمكتو نابسحلا ًف ةٌفاضإ
ثٌحب تاجلاعملا ةٌقبب صاخلا شاكلا ىلإ ةرشابم اهرشن متٌ لو ًلاحلا جلاعملا عم طبترملا شاكلا ًف ةدٌدجلا ةمٌقلا ةباتك متٌس راسم ىلع
ةدٌدجلا ةمٌقلا ةٌإر اعٌمج مهنكمٌ . جلاعملا تاذ ةمظنلا ًف ةهباشم ةلكشم ثدحت امك 64 تارابع لتك ذٌفنت بٌترت ةداعإ هنكمٌ يذلا تب
اءزج مدختسٌ دحاو راسم لجأ نم نلا ىتح رهاظ رٌثؤت اهل نكٌ مل بٌترتلا ةداعإ ةٌلمعو ةركاذلا ًف ةباتكلاو ةءارقلا تاٌلمع انمضتم دوكلا
تاراسم ةدع ةطساوب ةركاذلا نم ءزجلا سفن ىلإ لوصولا متٌ امدنع ةلكشم كلذ ببسٌس امبر نكلو ةركاذلا نم انٌعم . كروومٌرفلا رفوتو
قبارطلا نم جزو امهو ةلكشملا هذهل نلح VolatileRead و VolatileWrite ةقٌرطلاو MemoryBarrier عونلا اعٌمج اهرفوٌو
Thread
ةقٌرطلا كنكمت VolatileWrite لو تاجلاعملا عٌمج نٌب ةكرتشملا ةركاذلا ًف اٌلآ اهتباتك متٌ ةدٌدجلا ةمٌقلا نأ نم دكؤتلاو رٌؽتم ةباتك نم
ةقٌرطلا كنكمت لثملابو تاراسملا ةٌقب نع ةٌفخم نوكت ثٌح جلاعملاب صاخلا لجسملا ًف ىقبت VolatileRead ةقٌرطب رٌؽتملا ةءارق نم
ادباز لٌمحت ناتلمحم ناتقٌرطلا لكو ةٌلمعلا ذٌفنت لبق ةدوجوملا شاكلا ركاوذ عٌمج ػٌرفت ىلع ماظنلا ربجت اهنل ةنمآ Overloaded ثٌحب
ةٌضرؼ وأ ةٌمقر تارٌؽتم ذخؤت Object ةٌلاتلا دوكلا ةعطق ًف امك عجرملابو

Class TestClass
Private Shared sharedValue As Integer

Function IncrementValue() As Integer
Dim value As Integer = Thread.VolatileRead(sharedValue)
value += 1
Thread.VolatileWrite(sharedValue, value)
Return value
End Function
End Class

ةٌضرؽلا وأ ةٌمقرلا تارٌؽتملا عم لماعتن امدنع دٌج لكشب نلمعت ناتروكذملا ناتقٌرطلاو Object لجأ نم امهمادختسا نكمٌ ل نكلو
عونلا نم رٌؽتم ذخؤت ًتلا ةلادلا ةخسن مادختسا كنكمٌ ل هنل تارٌؽتملا نم ىرخأ عاونأ Object ةٌلمع ىلع دامتعلا ةٌناكمإ مدع ببسب
ةقٌرطلا ىلإ اندوقٌ امم عجرملاب اررمم رٌؽتملا نوكٌ امدنع لٌوحتلا MemoryBarrier شاكلا ركاوذ عٌمج تاٌوتحم ػٌرفتب موقت ًتلا
232

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

Class Singleton
Private Shared m_Instance As Singleton
Private Shared sharedLock As New Object()

Public Shared ReadOnly Property Instance() As Singleton
Get
If m_Instance Is Nothing Then
SyncLock sharedLock
If m_Instance Is Nothing Then
Dim tempInstance As Singleton = New Singleton()
' Ensure that writes related to instantiation are flushed.
Thread.MemoryBarrier()
m_Instance = tempInstance
End If
End SyncLock
End If
Return m_Instance
End Get
End Property
End Class

ةقٌرطلا ءاعدتسا كٌلع بجٌو MemoryBarrier نم دكؤتلا متٌ قباسلا لاثملا ًفو تاراسملا ةٌقب ىلإ ةدٌدجلا ةمٌقلا رشن متٌ نأ لبق ةرشابم
رٌؽتملا ًف ةمٌقلا عضو لامتكا tempInstance تاراسملا ربع هتكراشم متتس يذلا رٌؽتملا ًف عضوت نأ لبق

The Monitor Type
ةلتك رفوت SyncLock عم لماعتت ةقٌرط مادختسل ةلهس ةقٌرط تلاحلا نم دٌدعلا ًف ةمبلم رٌؼ نوكت اهنكلو نمازتلا لباسم
ةلتك ًف دوك رابتخا راسملل نكمٌ ل لثمف SyncLock ةلتك ذفنٌ رخآ راسم ناك اذإ كلذ نم هعنم بنجتو SyncLock سفن عم ةطبترم
ضرؽلا Object لتكو SyncLock ةطساوب اٌلخاد ةفرعم Monitor objects رثكأ ةنورم ىلع لوصحلل ةرشابم اهمادختسا نكمٌ ًتلا
دوكلا ًف دٌقعتلا ةداٌز باسح ىلع كلذ متٌو . مادختسا كنكمٌ لو Monitor object قرط عٌمج ةقٌقحلا ًفو دٌحو Monitor type ًتلا
ربتعتو ةنكاس قبارط ًه اهضرع متٌس Enter عونلا نم ددحم ذخؤت ًهو مهلا ةقٌرطلا ًه Object ةلتكل ررمملا ددحملاك لمعٌ يذلا
SyncLock ةمٌقلا لمحٌ نأ نكمٌ لو كرتشمو ًعجرم عون نم هنوك نم طورشلا سفن هل نوكتو Nothing تاراسملا كلتمت مل نإو
ىلإ دادعلا ةمٌق طبضٌو لفقلا كلذ بلطب ًلاحلا راسملا موقٌف ضرؽلا اذه ىلع لفق ىرخلا 1 راسملا ىلع بجٌ لفقلا رخآ راسم كلتما نإو
ةقٌرطلل ءاعدتسا لك يدإٌ اساسأ لفقلا كلتمٌ بلاطلا راسملا ناك نإو ارفوتم حبصٌ ىتح لفقلا رٌرحتب رخلا راسملا موقٌ نأ راظتنا بلاطلا
Monitor.Enter دادعلا ةمٌق ةداٌز ىلإ . ةقٌرطلا ذخؤتو Monitor.Exit لفقلا ضرؼ lock object امدنعو دادعلا ةمٌق صقنتو اهل ددحمك
ةقٌرطلا ءاعدتسا نٌب ةنزاوملا متٌ نأ بجٌو هٌلع لوصحلا نم تاراسملا ةٌقب انكمم لفقلا رٌرحت متٌ رفصلل دادعلا ةمٌق لصت
Monitor.Enter ةقٌرطلاو Monitor.Exit ادبأ لفقلا رٌرحت متٌ نل وأ

' A non-Nothing module-level object variable
Dim objLock As New Object()

Try
' Attempt to enter the protected section;
' wait if the lock is currently owned by another thread.
Monitor.Enter(objLock)
' Do something here.

Finally
' Release the lock.
Monitor.Exit(objLock)
End Try
233


ناتقٌرطلا نٌب ةدوجوملا تارابعلا قلطت نأ ًف لامتحا كانه ناك اذإ Enter و Exit ةلتك نمض دوكلا لماك عضو اهدنع كٌلع بجٌ ءانثتسا
Try…End Try ةقٌرطلا لخاد رظتنت رخآ راسم ىلع ةقٌرط راسم بلط نإو امود لفقلا رٌرحتب موقت نأ يرورضلا نم هنل
Monitor.Enter ءانثتسا راسملا كلذ لبقتسٌ ؾوس ThreadInterruptedException ةلتك مادختسل اٌفاضإ اببس ربتعٌ يذلا
Try…End Try ناتقٌرطلاو Enter و Exit ـب نٌتصاخلا Monitor Object ةلتك لادبتساب كل ناحمسٌ SyncLock كل نامدقٌ ل امهنكلو
ةبفلل ةدبازلا ةنورملا ىرت ؾوسو ةٌفاضإ دباوف ةٌأ Monitor ةقٌرطلا قبطت امدنع TryEnter ةقٌرطلل ةهباشم ًهو Enter جرخت اهنكلو
دٌعتو False ىلع لوصحلا ةلواحم كنكمٌ لثمف ةددحم ةٌنمز ةرتف للخ لفقلا ىلع لوصحلا نكمٌ ل ناك اذإ Monitor للخ 10 ًللٌم
ىلع دمتعملا قباسلا لاثملا ةباتك ةداعإب ًلاتلا دوكلا موقٌو ةددحم رٌؼ ةدم ًلاحلا راسملا ؾقوت نأ نود كلذ نع ًلختلا مث ةٌناث SyncLock
امدختسم Monitor object لفقلا ىلع لوصحلل ةلشافلا تلواحملا كل رهظٌو

Try
Do Until Monitor.TryEnter(consoleLock, 10)
Debug.WriteLine("Thread " + Thread.CurrentThread.Name + _
" failed to acquire the lock")
Loop
' Split the output line in pieces.
Console.Write(" ")
Console.Write(Thread.CurrentThread.Name)
Finally
' Release the lock.
Monitor.Exit(consoleLock)
End Try

The Mutex Type
عونلا رفوٌ Mutex ـلا نأ ثٌح نمازتلل رخآ أدبم Mutex وه Windows kernel object دحاو راسم لبق نم هكلتما نكمٌ
ةراشإ ةلاح ًف نوكٌو هسفن تقولا ًف طقف a signaled state راسم يأ هكلتمٌ ل امدنع . ـلا ةٌكلم راسملا بلطٌو Mutex مادختساب
ةنكاسلا ةقٌرطلا Mutex.WaitOne ةنكاسلا ةقٌرطلا مادختساب اهرٌرحت متٌو ةٌكلملا قٌقحت متٌ نأ دعب لإ دوعت ل ًتلاو
Mutex.ReleaseMutex ةٌكلم بلطٌ يذلا راسملاو Mutex object بجٌف ةٌكلملا ىلع لوصحلا نم هسفن عنمٌ ل افلس هلبق نم كولمملا
ءاعدتسا ةلاحلا هذه ًف كٌلع ReleaseMutex مادختساب نمازتم مسق ؾٌرعت ةٌفٌك نع لاثم اذهو تارملا نم يواسم ددعب Mutex
object

' This Mutex object must be accessible to all threads.
Dim m As New Mutex()

Sub WaitOneExample()
m.WaitOne()
' Enter the synchronized section.

' Exit the synchronized section.
m.ReleaseMutex()
End Sub

ةلتك مادختسا كٌلع ةٌقٌقحلا تاقٌبطتلا ًفو Try ءاعدتسا عضوو ءاطخلا نم كدوك ةٌامحل ReleaseMutex مسق ًف Finally تمق نإو
ةقٌرطلل يراٌتخا ددحم رٌرمتب WaitOne ددحملا تقولا ًهتنٌ امدنع وأ حاجنب ةٌكلملا قٌقحت متٌ امدنع راسملل مكحتلا دٌعتسف ءاهتنا نمزك
نأ ثٌح ةداعملا ةمٌقلا رابتخاب نٌتجٌتنلا نٌب قرفلا ةفرعم نكمٌو True و ةٌكلملا قٌقحت ًنعت False تقولا ءاهتنا ًنعت

' Attempt to enter the synchronized section, but give up after 0.1 seconds.
If m.WaitOne(100, False) Then

' Enter the synchronized section.

' Exit the synchronized section, and release the mutex.
234

m.ReleaseMutex()
End If

عونلا رفوٌ ةقٌرطلا هذه مادختسا دنع Mutex ةقٌرطلل ةبفاكم ةٌلآ Monitor.TryEnter ةٌإر كنكمٌو ةٌفاضإ صباصخ ةٌأ مٌدقت نودب
عونلل ةٌفاضلا ةنورملا Mutex نٌتنكاسلا نٌتقٌرطلا ىرت امدنع WaitAny و WaitAll ةقٌرطلاو هب نٌتصاخلا WaitAny ةفوفصم ذخؤت
نم Mutex objects نم دحاو ةٌكلم ققحت امدنع دوعتو Mutex objects ـلا حبصٌ ةلاحلا هذه ًفو ةمباقلا كلت نم Mutex ةلاح ًف
نم ةفوفصم نع ةرابع نوكت ةداعملا ةمٌقلاو يراٌتخلا ددحملاب ددحملا تقولا ًهتنٌ امدنع وأ ةراشإ Mutex objects ًف تحبصأ ًتلا
ًه ةصاخ ةمٌق وأ ةراشإ ةلاح 258 ددحملا تقولا ًهتنٌ امدنع . نم ةفوفصم مدختستو Mutex objects نم دودحم ددع انٌدل نوكٌ امدنع
ـلا حبصٌ ةلاحلا هذه ًفو ارفوتم ردصملا كلذ حبصٌ املاح راسمب اهنم دحاو لك طبرن نأ دٌرنو دراوملا Mutex objects ةلاح ًف يذلا
ةقٌرطلا مادختسا كنكمٌ ذبدنع رفوتم قفاوملا ردصملا نأ ًنعٌ ةراشإ Mutex.WaitAny ـلا نم ادحاو حبصٌ ىتح ًلاحلا راسملا عنمل
Mutex objects عونلا و ةراشإ ةلاح ًف Mutex ةقٌرطلا ثرٌ WaitAny نم WaitHandle قٌبطتل لكٌه اذهو بلا هتبفب ةصاخلا
ةٌنقتلا هذه مدختسٌ

' An array of three Mutex objects
Dim mutexes() As Mutex = {New Mutex(), New Mutex(), New Mutex()}

Sub WaitAnyExample()
' Wait until a resource becomes available.
' (Returns the index of the available resource.)
Dim mutexNdx As Integer = Mutex.WaitAny(mutexes)
' Enter the synchronized section.
' (This code should use only the resource corresponding to mutexNdx.)

' Exit the synchronized section, and release the resource.
mutexes(mutexNdx).ReleaseMutex()
End Sub

ةنكاسلا ةقٌرطلاو WaitAll نم ةثوروم اضٌأ WaitHandle نم ةفوفصم ذخؤت ثٌح بلا ةبفلاب ةصاخلا Mutex objects مكحتلا دٌعتو
دق ةٌقابلا تاراسملا عٌمج نوكت امدنع لإ ةعباتملا كنكمٌ ل امدنع صاخ لكشب ةدٌفم ًهو ةراشإ ةلاح ًف مهعٌمج حبصٌ امدنع طقف قٌبطتلل
اهلمع تهنأ
' Wait until all resources have been released.
Mutex.WaitAll(mutexes)

ةقٌرطلاب ةقلعتم ةرٌؽص ةلكشم كانهو WaitAll ةدٌحولا ةفرؽلا راسم قٌبطت ًف ًسٌبرلا راسملا نم اهإاعدتسا نكمٌ ل هنأ ًه Single
Thread Apartment (STA) application لوسنوكلا قٌبطت لثم Console application زودنٌو جذامن قٌبطت وأ Windows
Forms application قٌبطتل ًسٌبرلا راسملا ًفف STA ـلا نم ةعومجم رٌرحت متٌ ىتح ؾقوتلا كٌلع بجٌ Mutex كٌلع بجٌ اهدنع
مادختسا WaitAll ةقٌرطلا مادختسا مث لصفنم راسم نم Thread.Join ةقٌرطلا دوعت ىتح ًسٌبرلا راسملا ؾاقٌل راسملا كلذ ىلع
WaitAll كٌزٌاب لوجٌف ًفو 2005 ةخسنلاو 2 ةدٌدجلا ةنكاسلا ةقٌرطلا دجوٌ كروومٌرفلا نم SignalAndWait عضو نم كنكمت
Mutex object راظتناو ةراشإ ةلاح ًف Mutex object رخآ

' Signal the first mutex and wait for the second mutex to become signaled.
Mutex.SignalAndWait(mutexes(0), mutexes(1))

ـل نكمٌ نلا ىتح اهركذ مت ًتلا نمازتلا ضارؼأ عٌمجل افلخو Mutex objects هذهل اٌازملا مهأ نم دعٌ يذلا رملا مساب طبترٌ نأ
ضارؼؤف ضارؼلا Mutex objects دجاوت ءاشنإ كنكمٌو تاٌلمعلا ربع اهتكراشم نكمٌ مسلا سفن كلتمت ًتلا Instance ًلٌ امك اهل

Dim m As New Mutex(False, "mutexname")

235

ءاشنإ متٌس لإو هل عجرم ىلع ًعدتسملا لصحٌ ماظنلا ًف اقباس ادوجوم مسلا ناك نإو Mutex object نم ةٌللا هذه كنكمت ثٌحب دٌدج
ةكراشم Mutex objects مت دقو ةفلتخملا رداصملل لوصولا تاٌلمع ةنمازم نم تاقٌبطتلا هذه نكمتت اذهبو ةفلتخم تاقٌبطت ةدع ربع
كروومٌرفلا ًف دٌدج ًناب ةفاضإ 2 كٌزٌاب لوجٌفو 2005 ـلا ةٌكلم ًعدتسملا راسملا حنم مت دق ناك اذإ رابتخا نم كنكمٌ Mutex

Dim ownership As Boolean
Dim m As New Mutex(True, "mutexname", ownership)
If ownership Then
' This thread owns the mutex.

End If

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

Sub Main()
Dim ownership As Boolean
Dim m As New Mutex(True, "DemoMutex", ownership)
If ownership Then
Console.WriteLine("This app got the ownership of Mutex named DemoMutex")
Console.WriteLine("Press ENTER to run another instance of this app")
Console.ReadLine()
Process.Start(Assembly.GetExecutingAssembly().GetName().CodeBase)
Else
Console.WriteLine("This app is waiting to get ownership of Mutex named
DemoMutex")
m.WaitOne()
End If
' Perform the task here.

Console.WriteLine("Press ENTER to release ownership of the mutex")
Console.ReadLine()
m.ReleaseMutex()
End Sub

ةنكاسلا ةقٌرطلاو OpenExisting كروومٌرفلا ًف اضٌأ ةدٌدج 2 حتفل ىرخأ ةقٌرط مدقتو Mutex ماظنلا ىوتسم ىلع named
system-wide Mutex object ـلا ًناب سكعبو Mutex ـلا ىلع اهدٌرت ًتلا مكحتلا ةجرد دٌدحت نم ةقٌرطلا هذه كنكمت Mutex

Try
' Request a mutex with the right to wait for it and to release it.
Dim rights As MutexRights = MutexRights.Synchronize Or MutexRights.Modify
Dim m As Mutex = Mutex.OpenExisting("mutexname", rights)
' Use the mutex here.

Catch ex As WaitHandleCannotBeOpenedException
' The specified object doesn't exist.
Catch ex As UnauthorizedAccessException
' The specified object exists, but current user doesn't have the
' necessary access rights.
Catch ex As IOException
' A Win32 error has occurred.
End Try

كٌزٌاب لوجٌف ًفو 2005 كروومٌرفلاو 2 عونلا ًف مهلا ةدٌدجلا ةزٌملا رهظت Mutex لوصولاب مكحتلا مباوقل لوصولا ةٌناكمإ ًهو
access control lists (ACLs) ضرؽلا ربع جذومنلا ًف System.Security.AccessControl.MutexSecurity object ثٌح
236

دٌدحت كنكمٌ ACL ضرؼ اشنت امدنع Mutex ةقٌرطلا امدختسم دٌدج GetAccessControl ضرؼ ىلع لوصحلل MutexSecurity
ـب طبترملا Mutex قٌبطتو ددحم ACL ةقٌرطلا مادختساب دٌدج SetAccessControl

Dim ownership As Boolean
Dim m As New Mutex(True, "mutexname", ownership)
If Not ownership Then
' Determine who is the owner of the mutex.
Dim mutexSec As MutexSecurity = m.GetAccessControl()
Dim account As NTAccount = DirectCast(mutexSec.GetOwner( _
GetType(NTAccount)), NTAccount)
Console.WriteLine("Mutex is owned by {0}", account)
End If

The Semaphore Type
كروومٌرفلا مدقت 2 وهو ادٌدج اعون تٌن تود كٌزٌاب لوجٌف و Semaphore type ىلع زكترٌ يذلا Win32 semaphore
object ةبتكملا ًف ةدوجوملا تاراسملا ضارؼأ ةٌقبل افلخو mscorlib ةبتكملا ًف هفٌرعت مت عونلا اذهف system.dll امدنع مدختسٌ وهو
ىصقأ دح دٌدحت دٌرت ) ددع N ( اٌبادتبا اددع كلتمٌو نٌعم ردصم ىلإ لوصولل وأ دوكلا نم نٌعم ءزج ًف اهذٌفنت نكمٌ ًتلا تاراسملا نم
هٌنابل مٌقلا هذه رٌرمت كٌلع بجٌو ىصقأ اددعو

' A semaphore that has an initial count of 1 and a maximum count of 2.
Dim sem As New Semaphore(1, 2)

ـلا ةٌكلم ذخأ راسملا لواحٌ semaphore ةقٌرطلا ءاعدتساب WaitOne ةقٌرطلا دوعتو هصاقنإ متٌ رفصلا نم ربكأ ًلاحلا ددعلا ناك نإو
رخآ راسم ررحٌ ىتح رظتنت لإو ةرشابم semaphore راسملا ررحٌو يراٌتخلا ددحملاب ددحملا تقولا ءاضقنإ وأ semaphore
ةقٌرطلا ءاعدتساب Release رادقمب ددعلا دٌزٌ امم 1 قباسلا ددعلا ةمٌق دٌعٌو ةددحم ةمٌقب وأ

Dim sem As New Semaphore(2, 2)
' Next statement brings count from 2 to 1.
sem.WaitOne()

' Next statement brings count from 1 to 2.
sem.Release()
' Next statement attempts to bring count from 2 to 3, but
' throws a SemaphoreFullException.
sem.Release()
ضرؽلا مدختستس ًساسأ لكشبو Semaphore ًلٌ امك

' Initial count is initially equal to max count.
Dim sem2 As New Semaphore(2, 2)

Sub Semaphore_Example()
' Wait until a resource becomes available.
sem2.WaitOne()
' Enter the synchronized section.

' Exit the synchronized section, and release the resource.
sem2.Release()
End Sub

237

ةلتكلا مادختسا امود ركذت Try…Finally ـلا نأ نم دكؤتلل semaphore ـلاك امامتو ام ءانثتسا ثدح ول ىتح هرٌرحت مت دق mutexes نكمٌ
ـلل semaphores ضرؼ ءاشنإ لواحت امدنعو تاٌلمعلا ربع هتكراشمو مسا كلتما semaphores دحلاو ددعلا لهاجت متٌ اقباس دوجوم
ىصقلا
Dim ownership As Boolean
Dim sem3 As New Semaphore(2, 2, "semaphoreName", ownership)
If ownership Then
' Current thread has the ownership of the semaphore.

End If

ضرؽلا معدٌو Semaphore ـلا اضٌأ ACLs ةقٌرطلا ةطساوب ةءارقلا متت ثٌح ًنابلل اهرٌرمت نكمٌ ًتلا GetAccessControl لٌدعتلاو
ةقٌرطلا ةطساوب SetAccessControl رورضلا نمو ي عونلا نأ ظحلت نأ Mutex عونلاو Semaphore ةٌساسلا ةبفلا نم امهتثارو متت
WaitHandle ةنكاسلا قبارطلل تاددحمك امهرٌرمت نكمٌ اذل WaitAny و WaitAll و SignalAndWait عونلل WaitHandle امم
دوكلا ًف امك ضارؼلا هذه نم اٌأ ةطساوب ةٌمحم نوكت ًتلاو ةلوهسب رداصملا ةنمازم نم كنكمٌ

' Wait until two mutexes, two semaphores, and one event object become signaled.
Dim waitHandles() As WaitHandle = {mutex1, mutex2, sem1, sem2, event1}
WaitHandle.WaitAll(waitHandles)

The ReaderWriterLock Type
وأ ةددعتم تاءارق ةعومجم امإ بلاؽلا ًف معدت ًهو اهٌلإ ةباتكلا وأ اهنم ةءارقلا امإ نكمٌ ًقٌقحلا ملاعلا ًف رداصملا نم دٌدعلا
ةباتكلا تمت نإ نكلو تاناٌب ةدعاق ًف لودج وأ تاناٌب ؾلم نم ةءارقلا ءلمع ةدعل نكمٌ لثمف ةنٌعم ةظحل ًف اهذٌفنت متٌ ةدٌحو ةباتك ةٌلمع
ةللدب تاءارق ةدع وأ ةدحاو ةباتكل لفق ؾٌرعت كنكمٌ ثٌح ردصملا كلذ ىلع ةباتك وأ ةءارق تاٌلمع يأ ثودح نكمٌ لف لودجلا وأ ؾلملل
ضرؽلا ReaderWriterLock اهٌلع بجٌ نٌعم ردصم مادختسا دٌرت ًتلا تاراسملا لكف ماملا ىلإ ةٌإر ربتعٌ ضرؽلا اذه مادختساو
ضرؽلا سفن مادختسا ReaderWriterLock ةقٌرطلا امإ ءاعدتسا راسملا ىلع بجٌ ردصملا كلذ ىلع ةٌلمع يؤب ماٌقلا ةلواحم لبقو
AcquireReaderLock ةقٌرطلا وأ AcquireWriterLock راسملا ؾاقٌإب موقت قبارطلا هذهو اهذٌفنت متٌ ًتلا ةٌلمعلا ىلع ادامتعا كلذو
ةقٌرطلا ءاعدتسا راسملا ىلع ارٌخأو ردصملا كلذ ىلع لوصحلا متٌ ىتح ًلاحلا ReleaseReaderLock ةقٌرطلا وأ
ReleaseWriterLock ءاشنإب موقٌ ًلاتلا لاثملاو ردصملا كلذ ىلع ةباتكلا وأ ةءارقلا ةٌلمع ًهنت امدنع 10 وأ ةءارق ةٌلمعب موقت تاراسم
كرتشم ردصم ىلع ةباتك

Dim rwl As New ReaderWriterLock()
Dim rnd As New Random()

Sub TestReaderWriterLock()
For i As Integer = 0 To 9
Dim t As New Thread(AddressOf ReaderWriterLock_Task)
t.Start(i)
Next

End Sub

Sub ReaderWriterLock_Task(ByVal obj As Object)
Dim n As Integer = CInt(obj)
' Perform 10 read or write operations. (Reads are more frequent.)
For i As Integer = 1 To 10
If rnd.NextDouble < 0.8 Then
' Attempt a read operation.
rwl.AcquireReaderLock(Timeout.Infinite)
Console.WriteLine("Thread #{0} is reading", n)
Thread.Sleep(300)
Console.WriteLine("Thread #{0} completed the read operation", n)
rwl.ReleaseReaderLock()
Else
238


' Attempt a write operation.
rwl.AcquireWriterLock(Timeout.Infinite)
Console.WriteLine("Thread #{0} is writing", n)
Thread.Sleep(300)
Console.WriteLine("Thread #{0} completed the write operation", n)
rwl.ReleaseWriterLock()
End If
Next
End Sub

نكمٌو ىرخلا تاراسملا عٌمج ؾقوٌ ةباتكلاب موقٌ يذلا راسملاو تقولا سفنب ةءارقلا اهنكمٌ تاراسم ةدع نأ ىرتس دوكلا اذه لؽشت امدنعو
ناتقٌرطلل AcquireReaderLock و AcquireWriterLock ءاهتنا نمز نع ةرابع ددحم ذخأ timeout عونلا نم ةمٌقب كلذو
TimeSpan صباصخلا مادختساب حاجنب لفقلا ىلع لوصحلا مت اذإ امٌف رابتخا كنكمٌو ةٌناث ًللٌملا نم ددعب وأ IsReaderLockHeld و
IsWriterLockHeld رٌؼ ةمٌق تررم اذإ طقف ةءارقلل ةلباقلا Timeout.Infinite

' Attempt to acquire a reader lock for no longer than 1 second.
rwl.AcquireWriterLock(1000)
If rwl.IsWriterLockHeld Then
' The thread has a writer lock on the resource.

End If

ةقٌرطلا ءاعدتساب ةباتكلل لفق ىلإ ةٌقرتلا هنكمٌ ةءارقلا لفق كلتمٌ يذلا راسملاو UpgradeToWriterLock ةءارقلا عضول ةٌناث ةدوعلاو
ةقٌرطلا مادختساب Downgrade-FromWriterLock ضارؼلا صوصخب عبارلا اشلاو ReaderWriterLock ةفٌفخ ضارؼأ اهنأ ًه
قبارطلا نأ امبو ظوحلم لكشب ءادلا ىلع رثإت نأ نود تارملا نم ارٌبك اددع اهمادختسا نكمٌ ثٌحب AcquireReaderLock و
AcquireWriterLock لفق ةلاح لوصح نكمٌ كلذ عمو ةتٌم لافقأ نم ًناعٌ ل نأ بجٌ دٌج لكشب ممصملا قٌبطتلاف ءاهتنا تقو ناذخؤت
ةٌراجلا ةٌلمعلا ءاهتنا ىتح هرٌرحتب موقٌ ل راسم لبق نم ازوجحم اردصم نارظتنٌ ناراسم نوكٌ امدنع تٌم

The Interlocked Type
عونلا اندوزٌ Interlocked قبارط طقف ضرعت ةبفلا هذهو كرتشم رٌؽتم ةمٌق صاقنإ وأ ةداٌزل ةقٌقد تاٌلمعب ماٌقلل ةقٌرطب
ةنكاس ) نم هتثارو تمت ام انه بستحن ل Object ( ًلاتلا دوكلا ىلإ رظنا

' Increment and Decrement methods work with 32-bit and 64-bit integers.
Dim lockCounter As Integer

' Increment the counter and execute some code if its previous value was zero.
If Interlocked.Increment(lockCounter) = 1 Then

End If
' Decrement the shared counter.
Interlocked.Decrement(lockCounter)

ةقٌرطلاو ADD كروومٌرفلا ًف ةدٌدج 2 ةٌقٌقح دادعأ ةداٌز نم كنكمت ًهو Integer راٌع نم 32 وأ 64 ةددحم ةمٌقب تب

If Interlocked.Add(lockCounter, 2) <= 10 Then…

ةبفلا رفوتو Interlocked ةقٌرطلا ناٌرخأ ناتنكاس ناتقٌرط Exchange عونلا نم تارٌؽتم ىلإ كراٌتخا نم ةمٌق دٌدحت نم كنكمت ًتلا
Integer وأ Long وأ Single وأ Double وأ IntPtr وأ Object نم اددحم ذخؤت ادباز ةلمحم ةخسن اهل نأ امبو ةقباسلا ةمٌقلا دٌعتو
عونلا Object عونلاك ًعجرم عون يل لمعت اهلعجت نأ كنكمٌ اذهل String لاثملا ًف امك
239


Dim s1 As String = "123"
Dim s2 As String = Interlocked.Exchange(s1, "abc")
Console.WriteLine("s1={0}, s2={1}", s1, s2)

ةقٌرطلاو CompareExchange اهل اهرٌرمت متٌ ةددحم ةمٌقل يواسم ةركاذلا عقوم ناك اذإ طقف لٌدبتلاب موقت اهنكلو ةهباشم بولسؤب لمعت

The ManualResetEvent, AutoResetEvent, and EventWaitHandle Types

هباشتم لكشب لمعت ةثلثلا تابفلا هذه ManualResetEvent و AutoResetEvent و EventWaitHandle ةرٌخلا ةبفلاو
كروومٌرفلا ًف اهتفاضإ تمت دقو نلولا ناتبفلل بلا ةبفلا ًه 2 نأ نم مؼرلا ىلع ManualResetEvent و AutoResetEvent مل
ةدٌدجلا ةبفلاب امهلادبتسا كنكمٌ لمعلا ءانثأو دعب امهلامهإ متٌ EventWaitHandle لماعتلا دنع ةنورملا نم ادٌزم كٌطعت ًتلا . ناعونلاو
ManualResetEvent و AutoResetEvent رخآ راسم انربخٌ ىتح تقإم لكشب رثكأ وأ راسم ؾاقٌإ دٌرت امدنع صاخ لكشب نادٌفم
راسم ًف ثدحلا ةجلاعم ءارجإ لثم راسم ظاقٌل امهمدختستو ةعباتملا نم عنام ل هنؤب دوجوب عدخنت ل نكلو ؾقوتم Event امهبامسأ ًف
ضارؼلا هذه عم ةٌدٌلقتلا ثدحلا ةجلاعم تاءارجإ مادختسا كنكمٌ لف . مدع وأ ةراشإ ةلاح ًف نوكٌ نأ نكمٌ نٌعونلا نٌذه دحأ نم نباكو
ةراشإ Signale/UnSignaled لٌؽشت ةلاحك اهرابتعا كنكمٌ ثٌحب صاخ ىنعم يأ كلمت ل ةمٌقلا هذهو / ةٌبادتبلا ةلاحلا ررمتس ثٌح ؾاقٌإ
ىلإ ةلاحلا كلت طبض هنكمٌ ضرؽلا كلذل لوصولا عٌطتسٌ راسم يأو ًنابلل Signaled ةقٌرطلا مادختساب Set ةقٌرطلا مدختسٌ وأ Reset
ىلإ ةلاحلا ةداعل UnSignaled ةقٌرطلا مادختسا ىرخلا تاراسملل نكمٌو WaitOne ةراشإ ةلاح ًف حبصت ىتح راظتنلل Signaled وأ
راظتنلا ةرتف ءاهتنا ىتح

' Create an auto reset event object in nonsignaled state.
Dim are As New AutoResetEvent(False)
' Create a manual reset event object in signaled state.
Dim mre As New ManualResetEvent(True)

ناضرؽلا نٌب دٌحولا ؾلتخلاو ManualResetEvent و AutoResetEvent اٌلآ هسفن طبض دٌعٌ رٌخلا نأ وه ) مدع ةلاح ًف حبصٌ
ةراشإ Unsignaled ( ةقٌرطلا أدبت امدنع راسملا دص متٌ نأ دعب ةرشابم كلذو WaitOne ضرؽلا ظقوٌو AutoResetEvent دحاو طقف
ضرؽلا امنٌب ةراشإ ةلاح ًف حبصٌ امدنع ةرظتنملا تاراسملا نم ManualResetEvent متٌ نأ بجٌو ةرظتنملا تاراسملا عٌمج ظقوٌ
نٌضرؽلا لادبتسا كنكمٌ اقباس ركذ امكو همسا نم رهاظ وه امك ةراشإ مدع ةلاح ىلإ اٌودٌ هطبض ةداعإ ManualResetEvent و
AutoResetEvent ضرؽلاب EventWaitHandle ًلاتلا دوكلاب رهظٌ امك

' These statements are equivalent to the previous code example.
Dim are As New EventWaitHandle(False, EventResetMode.AutoReset)
Dim mre As New EventWaitHandle(True, EventResetMode.ManualReset)

ـلا ضارؼأ نوكتو Event وأ تاناٌبلا ضعب مٌٌقتب موقٌ راسم ًف دٌحو ءارجإ كٌدل نوكٌ امبرف كلهتسملاو جتنملا تلاح ًف ةصاخ ةدٌفم
ةقٌرطلا ًعدتسٌو اهرٌؼ وأ ًلسلست ذفنم وأ صرقلا نم ةءارقلاب Set كلت ةجلاعمل رثكأ وأ راسم لٌؽشت ةداعإ متٌف نمازتم ضرؼ ىلع
ضرؽلا مادختسا كٌلع بجٌو تاناٌبلا AutoResetEvent ضرؽلا وأ EventWaitHandle راٌخلا عم AutoReset راسم كانه ناك اذإ
ضرؽلا مادختسا كٌلع بجٌ امك تاناٌبلا كلت ةجلاعمب موقٌس دٌحو كلهتسم ManualResetEvent ضرؽلا وأ EventWaitHandle عم
راٌخلا ManualReset ةكلهتسملا تاراسملا عٌمج مادختساب تاناٌبلا ةجلاعم بجٌ ناك اذإ .
نكلو تقولا سفن ًف ةفلتخم تادلجم ةدع ًف ؾلم نع ثحبلا ةٌلمعب موقت ةجتنم تاراسم ةدع كٌدل نوكٌ نأ نكمٌ ؾٌك ًلاتلا لاثملا نٌبٌو
ضرؽلا لاثملا مدختسٌو تاراسملا كلت نم جباتنلا عمجب موقٌ دٌحو كلهتسم راسم دجوٌ AutoResetEvent امدنع كلهتسملا راسملا ظاقٌل
ةمباقلل دٌدج ؾلم مسا ةفاضإ متٌ List(Of String) ةبفلا اضٌأ مدختسٌو Interlocked راسملا ملعٌ ىتح ةلماعلا تاراسملا ددع ةرادل
اهكلهتسل ىرخأ تاناٌب يأ دجوت دعت مل هنأ ًسٌبرلا

' The shared AutoResetEvent object
Public are As New AutoResetEvent(False)
240

' The list where matching filenames should be added
Public fileList As New List(Of String)()
' The number of running threads
Public searchingThreads As Integer
' An object used for locking purposes
Public lockObj As New Object()

Sub TestAutoResetEvent()
' Search *.zip files in all the subdirectories of C.
For Each dirname As String In Directory.GetDirectories("C:\")
Interlocked.Increment(searchingThreads)
' Create a new wrapper class, pointing to a subdirectory.
Dim sf As New FileFinder()
sf.StartPath = dirname
sf.SearchPattern = "*.zip"
' Create and run a new thread for that subdirectory only.
Dim t As New Thread(AddressOf sf.StartSearch)
t.Start()
Next

' Remember how many results we have so far.

Dim resCount As Integer = 0
Do While searchingThreads > 0
' Wait until there are new results.
are.WaitOne()

SyncLock lockObj
' Display all new results.
For i As Integer = resCount To fileList.Count - 1
Console.WriteLine(fileList(i))
Next
' Remember that you've displayed these filenames.
resCount = fileList.Count
End SyncLock
Loop
Console.WriteLine("")
Console.WriteLine("Found {0} files", resCount)
End Sub

ضرؼ نمض لمعٌ ًبارجإ راسم لكو FileFinder دوكلا ًف ةددحم ةماع تارٌؽتم ىلإ لوصولا ىلع ارداق نوكٌ نأ بجٌ يذلا ؾلتخم
قباسلا

Class FileFinder
Public StartPath As String ' The starting search path
Public SearchPattern As String ' The search pattern

Sub StartSearch()
Search(Me.StartPath)
' Decrease the number of running threads before exiting.
Interlocked.Decrement(searchingThreads)
' Let the consumer know it should check the thread counter.
are.Set()
End Sub

' This recursive procedure does the actual job.
Sub Search(ByVal path As String)
' Get all the files that match the search pattern.
Dim files() As String = Directory.GetFiles(path, SearchPattern)
' If there is at least one file, let the main thread know about it.
If files IsNot Nothing AndAlso files.Length > 0 Then
241

' Ensure found files are added as an atomic operation.
SyncLock lockObj
' Add all found files.
fileList.AddRange(files)
' Let the consumer thread know about the new filenames.
are.Set()
End SyncLock
End If

' Repeat the search on all subdirectories.
For Each dirname As String In Directory.GetDirectories(path)
Search(dirname)
Next
End Sub
End Class

ةخسنلاو 2 كٌزٌاب لوجٌفو كروومٌرفلا نم 2005 مدختست EventWaitHandle نع لدب AutoResetEvent وأ
ManualResetEvent ىرخلا تاٌلمعلا عم هتكراشم نكمٌ ماظنلا ىوتسم ىلع ىمسم ضرؼ ءاشنإ ةٌناكمإ ًهو ةماه ةزٌم كٌطعٌ امم
ًنابل ةماعلا ةؽٌصلاو EventWaitHandle ةبفلاب ةصاخلا كلتل ةهباشم Mutex

Create a system-wide auto reset event that is initially in the signaled state.
Dim ownership As Boolean
Dim ewh As New EventWaitHandle(True, EventResetMode.AutoReset, "eventname",
ownership)
If ownership Then
' The event object was created by the current thread.

End If

ةقٌرطلا مادختسا كنكمٌ امك OpenExisting دوجوم ثدح ضرؼ حتفل

' This statement throws a WaitHandleCannotBeOpenedException if the specified
' event doesn't exist, or an UnauthorizedAccessException if the current
' user doesn't have the required permissions.
ewh = EventWaitHandle.OpenExisting("eventname", _
EventWaitHandleRights.FullControl)


ثادحلا ضارؼأ ًف ةماهلا ىرخلا ةزٌملاو event objects كروومٌرفلا ًف 2 معد ًه ACLs قبارطلا مادختساب SetAccessControl
و GetAccessControl عونلا نم نباك دٌعتو ذخؤت ًتلاو EventWaitHandleSecurity مادختسا ةقٌرط سفنب همادختسا كنكمٌ ثٌح
ضرؽلا ًف اهتلٌثم Mutex معدت ًتلا ىرخلا تٌن تودلا ضارؼأو ACLs




242

طرٌّٕٛا ٍٝػ دبّىحزٌا ٟف خغ١زٌٕا سبٙظئٚ شخآ سبغِ ٟف خ١ٍّػ ز١فٕر خ١ف١و

هنأ انضرتفا اذإف جذومنلا ىلع ةجٌتنلا راهظإ هتلواحمو رخآ راسم ىلع ةنٌعم ةٌلمع ذٌفنت دنع هتهجاو ةلكشم نع ةوخلا دحأ ًنلؤس
رخآ راسم ىلع هانذفنو ام ةٌلمع ذفنٌ اطٌسب ءارجإ انٌدل Thread ءارجلا كلذ نأو جمانربلا تاٌلمع هٌلع ذفنت يذلا ًسٌبرلا راسملا رٌؼ
ةٌصاخلا ةمٌق طبضب موقٌ دوك ىلع يوتحٌ Text ؤطخ ةلاسر ىلع لصحتس دوكلا ذٌفنت دنعف جذومنلا ىلع صوصن قودنصل
Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was
created on.
مث ًلٌ امل اقباطم جذومنلا دوك لعجاو رزو صوصن قودنص هٌلع عض ادٌدج اعورشم اشنأ كسفنب قباسلا ؤطخلا ةلاسر دٌلوت تدرأ اذإو
ةقباسلا ؤطخلا ةلاسر ىلع لصحتسو جمانربلا لٌؽشتب مق
Imports System.Threading

Public Class Form1

Private Sub Button1_Click() Handles Button1.Click

Dim th As New Thread(AddressOf DoLongOperation)
th.Start()

End Sub

Private Sub DoLongOperation()
Me.TextBox1.Text = "Something"
End Sub

End Class

ةبف ءاشنإ وه ةلكشم اذكه لحل ةداع همادختساب موقأ يذلا لحلا Class للخ نم جذومنلل ةجٌتنلا دٌعتو ًناثلا راسملا ىلع ةٌلمعلا ذٌفنتب موقت
ىلع ًتقٌرط اهنكلو تلاحلا عٌمج ًف لضفلا ةقٌرطلا ًه هذه نوكت ل امبرف جذومنلل ةجلاعملا ةٌلمع نع ةجتانلا مٌقلا دٌعٌ ثدح قلطإ
امبرف تقولل طٌسب دادع ذٌفنت ربع اهحرطؤسو ةلكشملا هذه زواجتل ىرخأ لولح ةٌأ ةبرجتو شاقنلا اننكمٌ مث اهحرشب موقؤسو لاح لك
ةدٌحو ةمٌق دٌعٌ لاثم ترتخا انه ًننكلو لٌوط اتقو قرؽتست ةدقعم ةجلاعم تاٌلمع ذٌفنت وأ تافلم نع ثحبلل ةقٌرطلا هذه تنأ مدختستس
ناكملا ردق اطٌسب نوكٌ ثٌحب
ةبف ةفاضإب موقؤس نلا Class اهتٌمستب موقؤسو رخآ راسم ىلع اهذٌفنت دٌرن ًتلا ةلٌوطلا ةٌلمعلا ذٌفنت هربع متٌ عورشملل دٌدج
MyStopWatch ةبفلا ؾٌرعت لبق ًلاتلا دارٌتسلل جاتحنس تاراسملا عم لماعتنس اننأ امبو ًلاحلا تقولا ًف
Imports System.Threading
ةبفلا لخاد ةٌعرف ةبف ؾٌرعتب موقؤس MyStopWatch مساب ReturnValueEventArgs دٌعٌس يذلا ثدحلا قلطل اقحل اهمدختسؤس
ةبفلا نم ةثوروم نوكت نأ بجٌ هذهو جذومنلا ىلإ ةجٌتنلا EventArgs ؾرعؤسو هقلطإ متٌس يذلا ثدحلا مٌق ةداعإب ةصاخ ةبف اهنأ امب
ةدٌحو ةٌصاخ اهٌف ReturnVlaue ررمٌ ةبفلل ًنابو ةمٌقلا دٌعت ةبفلا ًناب للخ نم لإ اهتمٌق طبضل جاتحن نل اننأ امب طقف ةءارقلل نوكتس
ةبفلا دوك نوكٌ اذهبو ةداعملا ةمٌقلا لثمت ةدٌحو ةٌصن ةمٌق هل ReturnValueEventArgs ًلٌ امك
Public Class ReturnValueEventArgs
Inherits EventArgs

Private _ReturnValue As String

Public ReadOnly Property ReturnVlaue() As String
Get
Return _ReturnValue
End Get
End Property
243


Public Sub New(ByVal RetVal As String)
_ReturnValue = RetVal
End Sub

End Class

ةبفلا دوك نمض MyStopWtach ةبفلا ؾٌرعت ةٌاهن دعبو ReturnValueEventArgs دٌعٌل هقلطإب موقنس يذلا ثدحلا ؾٌرعتب موقن
ةبفلا ؾٌرعتب انمق تابفلاو تامكحتلا ًف ىرن امك ثادحلا قٌسنتب مازتللا لجأ نمو جذومنلا ىلإ ةمٌقلا ReturnValueEventArgs اذهبو
ةبفلا ًف ةماعلا تارٌؽتملا ؾٌرعت مسق ًف ثدحلا ؾٌرعت نوكٌ MyStopWatch ًلٌ امك
Public Event ReturnValue(ByVal sender As Object, ByVal e As ReturnValueEventArgs)
ةبفلا ىوتسم ىلع اماع ارٌؽتم ؾرع MyStopWtach مساب _MyTimer عونلا نم وهو Stopwatch ًلٌ امك
Private _MyTimer As Stopwatch
ثٌحب رخلا راسملا ىلع هذٌفنت متٌس يذلا ةجلاعملا ءارجإ نمض اهتداعإ متٌل ةمٌق ىلع لوصحلا لجأ نم تقولل دادعك همدختسنس ثٌح
ًلٌ امك ًناثلا راسملا ىلع ذفنٌس يذلا ةجلاعملا ءارجإ دوك نوكٌس
Private Sub DoProcessing()
Do
Dim Ret = _MyTimer.Elapsed.Hours & ":" & _
_MyTimer.Elapsed.Minutes & ":" & _
_MyTimer.Elapsed.Seconds & ":" & _
_MyTimer.Elapsed.Milliseconds

RaiseEvent ReturnValue(Me, New ReturnValueEventArgs(Ret))
Loop Until _MyTimer.IsRunning = False
End Sub

ًصن رٌؽتم ًف دادعلا ةمٌق انعضو ثٌح Ret ةلادلا انمدختسا مث RaiseEvent ثدحلا قلطل ReturnValue ةمٌقلا ثٌح Me رٌشت ًتلا
ثدحلل لوأ رتمرابك ةٌلاحلا ةبفلل ReturnValue ناٌك نع ةرابع ثدحلل ًناثلا ددحملا نوكٌ Instance ةبفلا نم
ReturnValueEventArgs رٌؽتملا اهٌنابل ررمن ًتلا Ret ةٌصاخلا نم ةداعملا ةمٌقلا لكشٌ يذلا ReturnVlaue ةبفلل ةدباعلا
ReturnValueEventArgs جذومنلا نم اهلبقتسنس امدنع
مساب ًناثلا راسملا ىلع تقإملا ذٌفنت ءدبل ءارجإ انٌدل نوكٌسو StartTimer لكشلا ىلع هدوك نوكٌ ثٌحب
Public Sub StartTimer()
_MyTimer.Reset()
_MyTimer.Start()

Dim th As New Thread(AddressOf DoProcessing)
th.Start()
End Sub

ادٌدج اراسم انفرع مث هبدبو دادعلا رٌفصتب انمق ثٌح th ءارجلا ذٌفنتب موقٌ DoProcessing ءارجل جاتحنس دادعلا ؾاقٌإ لجأ نمو
StopTimer لكشلا ىلع هدوك نوكٌ
Public Sub StopTimer()
_MyTimer.Stop()
End Sub

244

نوكٌو اقحل صوصن قودنص ًف اهضرعب موقنس ةٌصن ةمٌق دٌعتو ًناث راسم ىلع ةجلاعملا ةٌلمعب موقتس ًتلا انتبف تلمتكا دق نوكت اذهبو
ةبفلا هذهل لماكلا دوكلا كلذب
Imports System.Threading

Public Class MyStopWtach

Public Class ReturnValueEventArgs
Inherits EventArgs

Private _ReturnValue As String

Public ReadOnly Property ReturnVlaue() As String
Get
Return _ReturnValue
End Get
End Property

Public Sub New(ByVal RetVal As String)
_ReturnValue = RetVal
End Sub

End Class

Public Event ReturnValue(ByVal sender As Object, _
ByVal e As ReturnValueEventArgs)

Private _MyTimer As New Stopwatch

Public Sub StartTimer()
_MyTimer.Reset()
_MyTimer.Start()

Dim th As New Thread(AddressOf DoProcessing)
th.Start()
End Sub

Private Sub DoProcessing()
Do
Dim Ret = _MyTimer.Elapsed.Hours & ":" & _
_MyTimer.Elapsed.Minutes & ":" & _
_MyTimer.Elapsed.Seconds & ":" & _
_MyTimer.Elapsed.Milliseconds

RaiseEvent ReturnValue(Me, New ReturnValueEventArgs(Ret))
Loop Until _MyTimer.IsRunning = False
End Sub

Public Sub StopTimer()
_MyTimer.Stop()
End Sub


End Class

رٌؽتم ؾٌرعتب موقنس ثٌح ةدٌدجلا ةبفلا ةبرجتب ماٌقلل هٌلع نٌرزو صوصن قودنص دوجول جاتحن يذلا عورشملاب صاخلا جذومنلل دوعن
مساب جذومنلا ىوتسم ىلع صاخ MyTimer انتبف عون نم MyStopWtach ةرابعلا مادختسابو WithEvents لابقتسا نم اننكمتس ًتلا
انتبف اهقلطتس ًتلا ثادحلا
Private WithEvents MyTimer As New MyStopWtach
245

ًلٌ امك ةقباسلا انتبف مادختساب تقإملا ؾاقٌإو ءدب لجأ نم نٌرزلا دوك نوكٌسو
Private Sub Button1_Click() Handles Button1.Click
MyTimer.StartTimer()
End Sub

Private Sub Button2_Click() Handles Button2.Click
MyTimer.StopTimer()
End Sub

ثدحلل جلاعم اشنأ نلا ReturnVlaue رٌؽتملل دباعلا MyTimer جمانربلا لٌؽشت برج مث ًلاتلاك هٌف دوكلا نوكٌ ثٌحب هلعجاو
لاقملا ةٌادب ًف ةلاسرلل ةهباشم ةلاسر ىلع لصحتسف
Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles MyTimer.ReturnValue

Me.TextBox1.Text = e.ReturnVlaue

End Sub

لمعل جاتحنس ؤطخلا ةلاسر نم صلختلاو ةطقنلا هذه ةجلاعملو Invoke ءارجلل MyTimer_ReturnValue مٌقلا مادختسا عٌطتسن ىتح
ةٌصاخلا انه انتلاح ًفو جذومنلا ىلع تامكحتلا صباصخ مٌق طبض ًف هنم ةداعملا Text ًلٌ امك متتس ةطاسبب ةٌلمعلاو صوصنلا قودنصل
ضوفم ءارجإ ؾٌرعتب موقنس جذومنلا ًف ةماعلا تارٌؽتملا مسق ًف Delegate ءارجلا عٌقوت سفن لمحٌ MyTimer_ReturnValue
ًلٌ امك ءارجلل مسج نودبو
Private Delegate Sub MyTimer_ReturnValueDelegate(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs)

ًلٌ امك ةحٌحص ةروصب ةمهملا ذفنٌس يذلا دوكلا نوكٌو
Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles MyTimer.ReturnValue

If Me.TextBox1.InvokeRequired = True Then
Dim d As New MyTimer_ReturnValueDelegate(AddressOf MyTimer_ReturnValue)
Me.Invoke(d, New Object() {sender, e})
Else
Me.TextBox1.Text = e.ReturnVlaue
End If
End Sub

طقف ةءارقلل ةلباقلا ةٌصاخلا ةمٌق انصحف ثٌح InvokeRequired ناك نإف صوصنلا قودنصل False ةٌصاخلا ةمٌق طبضب موقن Text
تناك نإو لكاشم يأ نودب ةرشابم ثدحلا نم ةداعملا ةمٌقلا مادختساب True ؤطخلا ىلع لصحن ل ًك ةرشابم ةمٌقلا طبض عٌطتسن نل اهدنع
رٌؽتم ؾرعنس اهدنع لاقملا ةٌادب ًف دراولا d ضوفملا ءارجلا عون نم MyTimer_ReturnValueDelegate ناونع هل ررمنو
ءارجلا MyTimer_ReturnValue ةقٌرطلا انمدختسا مث Invoke ثدحلا نم ةنمآ ةخسن ذٌفنتل جذومنلل ةدباعلا
MyTimer.ReturnValue رٌؽتملا رٌرمتب كلذو تامكحتلا ىلإ ةداعملا مٌقلا طبض نم اننكمت d ةٌصاخلل لوأ ددحمك Invoke نوكٌو
ةٌصاخلل ًناثلا ددحملا Invoke عونلا نم ةفوفصم وه Object ءارجلا تاددحم رٌرمت متٌ MyTimer_ReturnValue اهل رصانعك
جذومنلل لماكلا دوكلا ًلٌ امٌفو
Public Class Form1

Private Delegate Sub MyTimer_ReturnValueDelegate(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs)

246

Private WithEvents MyTimer As New MyStopWtach

Private Sub Button1_Click() Handles Button1.Click
MyTimer.StartTimer()
End Sub

Private Sub Button2_Click() Handles Button2.Click
MyTimer.StopTimer()
End Sub

Private Sub MyTimer_ReturnValue(ByVal sender As Object, _
ByVal e As MyStopWtach.ReturnValueEventArgs) Handles _
MyTimer.ReturnValue

If Me.TextBox1.InvokeRequired = True Then
Dim d As New MyTimer_ReturnValueDelegate( _
AddressOf MyTimer_ReturnValue)

Me.Invoke(d, New Object() {sender, e})
Else
Me.TextBox1.Text = e.ReturnVlaue
End If
End Sub

End Class


247

ششبؼٌا ُغمٌا - غ٠سبشٌّاٚ دبؼّغٌّا



ةٌلاتلا عٌضاوملا مضٌو :
 تاعمجم تودلا تٌن Dot net Assemblies
 ةٌوقلا ءامسلا تاذ تاعمجملا Strong Named Assemblies
 Friend Assemblies
 مجرتم رطس رماولا صاخلا لوجٌفب كٌزٌاب 2008
 لماعتلا عم تاددحم رطس رماولا CommandlineArgs
 تادادعلا نم ةهجو رظن VB .net نم 2002 ىتح 2005
 ApplicationEvents
 ةٌفٌك مادختسا ؾلم ؾٌرعتلا صاخلا قٌبطتلاب ؾادهتسل ةخسن ةنٌعم نم
كروومٌرفلا
 ؾٌك موقن عٌزوتب انعورشم مادختساب ةٌنقت Click Once
 رشن كعورشم مادختساب SetupWizard

248

ذ١ٔ دٚذٌا دبؼّغِ Dot net Assemblies
غّغٌّا ٛ٘ بِ
متٌس هبتكت ؾوس دوك يؤف قٌبطتلل مجرتملا دوكلا لثمٌ وهو ؾلم نع ةرابع تلاحلا بلؼأ ًف نوكٌو عٌزوت ةدحو وه عمجملا
ؾلم ًف ةٌاهنلا ًف هنٌزخت EXE ؾلم وأ اقٌبطت ناك نإ DLL لٌمحتل تٌن تودلا هجاتحٌ ام لك ىلع عمجملا يوتحٌو اعسوت وأ ةبتكم ناك نإ
قٌبطتلا لٌؽشتو .
ةماع نوكت تاعمجملاو Public ةصاخ وأ Private . كانه نكٌ مل نإو طقف درفم قٌبطت نمض مادختسلل ةممصم نوكت ةصاخلا تاعمجملاف
تابتكم ةٌأ DLL يذٌفنتلا عمجملاف EXE اهب صاخلا دلجملا ًف ةصاخلا تاعمجملا رهظتو قٌبطتلا نوكٌ – قٌبطتلاب صاخلا بٌصنتلا دلجم
ةبتكملا وأ – مدختسٌ عمجم لك نأ املاط احٌحص اذه نوكٌو رخلا امهدحأ جعزٌ نأ نودب تقولا سفنب نٌصاخ نٌعمجم لٌؽشت كنكمٌو
مساب ةبف نافلتخم ناقٌبطت كلتما نإف هٌف ةدوكملا رصانعلا لجأ نم تابفلاو ءامسلا تلاجم نم ةبٌكرتلا سفن
WindowsApplication1.Class1 صاخ ًنعٌ صاخلاف نٌصاخ امهنل نٌقٌبطتلا لك لٌؽشت متٌ امدنع امهنٌب لخادت ثدحٌ نلف .
ةماعلا تاعمجملا تممصو Public نٌتطقنب ةصاخلا نع ةماعلا تاعمجملا ؾلتختو تٌن تود تاقٌبطت ةدع ربع اهتكراشم متٌل :
 ةٌوق ءامسأ امود كلتمت ةماعلا تاعمجملا strong Names ىتأ هنأ نامضل كلذو عمجملاب طبترم رفشم ًمقر عٌقوت ىلإ ةفاضإ
ىوقلا مسلا ىنبٌو اٌرورض سٌل كلذ نكلو اٌوق امسا كلتمت نأ ةصاخلا تاعمجملل نكمٌ امك ىمسملا ردصملا وأ عزوملا كلذ نم
ةٌوقلا ءامسلا دٌلوتل ةادأ كروومٌرفلا نمضتتو ًمقرلا عٌقوتلاو ةفاقثلا تامولعمو رادصلا مقرو عمجملا ةخسن لجأ نم sn.exe
ةمجرتلا ةٌلمع للخ ًمقرلا عٌقوتلا ةفاضإ نم كنكمٌ اراٌخ وٌدوتس لوجٌف نمضتٌو ةٌلمعلا هذه ًف اندعاست
 تاعمجملل ماعلا نزخملا ًف ةماعلا تاعمجملا نزختو GAC ًف ةكرتشملا كتانوكم نم ةخسن عضو نم كعنمٌ ل كلذ نكلو ةداع
ـلا لخاد اهعضو متٌ امدنع لإ قحب ةكرتشم تاعمجملا هذه حبصت نلو كقٌبطتب صاخلا بٌصنتلا دلجم GAC ـلا دجاوتٌو GAC
ىمسم دلجم ًف assembly ـلا ىلإ هتفاضإ كنكمٌ تٌن تودلا عمجمل يوق مسا ةفاضإ تمت هنأ املاطو زودنٌولا دلجم لخاد GAC
دلجملل هخسنب امإ assembly ةادلا مادختساب وأ gacutil.exe
للخ نم تقولا سفنب تارادصلا هذه عٌمج مادختساو ماظنلا سفن ًف عمجملا سفن نم تارادصإ ةدع بٌصنتب تٌن تودلا كل حمست امك
ىعدت ةٌلمع versioning تاقٌبطتلا ىلع قبطنٌ اذهو EXE تابتكملاو DLL ـلا ًف ةكرتشملاو ةصاخلا تاعمجملاو GAC حتفا كلذ ةنٌاعملو
دلجملل لقتناو زودنٌو ؾشكتسم assembly عمجملا مسا بسح اهزرف دعب تافلملا حفصتبو زودنٌولا دلجم لخاد – حضوأ لكشب كلذ رهظٌ
كروومٌرفلا بٌصنت دنع 3.5 – رادصإ مقرب ةرم لك ةرم نم رثكأ ةرركم تافلملا ضعب نأ دجتس كانه ةدوجوملا تافلملا ضارعتسا دنعف
ؾلتخم .
ةدع نم نوكم عمجملا اهٌف نوكٌ ًتلا تلاحلا نم دٌدعلا كانه هنأ لإ تاعمجملاو تافلملا نٌب دحاو ىلإ دحاو ةقلع كانه ةداعلا ًف هنأ عمو
كلذب كملعإ متٌ ؾوسف اهٌلع لٌدعت يأ أرط نإف رمتسم لكشب تافلملا هذه ةبقارمب تٌن تودلا موقتو تافلم .

غّغٌّا ًخاد ذعٛ٠ اربِ
ؾلملا EXE وأ DLL لومحم ذٌفنت ؾلم وه عمجملل PE ىلع ةدمتعم رٌؽلاو عونلا سفن تاذ تافلملل ةؽٌصلا سفن كلتمت تافلملا هذهو
تافلم لعجٌ امو كروومٌرفلا PE ةفلتخم ءازجأ ةدع عٌمجت وه عمجملاف ةماع ةملككو اهلخادب اهدجت ًتلا ةٌفاضلا ءاٌشلا كلت ًه ةفلتخم
ؾلم نوكتٌو اصٌصخ تٌن تودلل ةممصم ًه تٌن تودلا تاعمجم ًف ةفلتخملا ءازجلا كلتو ةدحاو ةدحو ًف PE ةٌسٌبر ماسقأ ةثلث نم :
 ةسٌورتلا PE Header : تافلم عٌمجل ةبولطم ًهو PE ؾلملل ىرخلا ماسقلا عقوم مسقلا اذه ددحٌ ثٌح
 مسق MSIL : ةطٌسولا تفوسوركٌام ةؽلب حبصٌ ثٌحب مجرتم ؾصن لكشب نزخم عمجملاب طبترملا ًلعفلا دوكلا وهو MSIL نكلو
تاجلاعم Intel و AMD دوك ةجلاعم عٌطتست ل كبوساح ًف MSIL ًف امامت مجرتم ةنمضتم كروومٌرفلا تتأ اذهلو ةرشابم
تقولا JIT Compiler ةؽلل ةٌنلا ةمجرتلاب موقٌ يذلا MSIL جلاعملا همهفٌ دوك ىلإ
 مسق Metadata نأ ثٌح ًساسلا مسقلا اذه ًف نزخت كعمجم ةفرعمل تٌن تودلا اهجاتحٌ ًتلا ةٌفاضلا لٌصافتلا كلت لك
لكشت اهعمج دنع رصانعلا هذه ضعب Assembly Manifest يوتحت ثٌح ملاعلل ماع لكشب عمجملا ؾصت قباثولا نم عون ًهو
ـلا Metadata ةٌلاتلا رصانعلا ىلع - : عمجملا مسا – رادصلا مقر – يوقلا مسلا تاٌوتحم – ةؽللاو ةفاقثلا تادادعإ – درس
عمجملا تافلم ءامسأ – ةردصملا عاونلا تامولعم – ةطبترملا عجارملا – ةٌلخادلا عاونلا تامولعم –
249

 ـلاو Masinfest ـلا نم مهلا ءزجلا ًه Metadata ـلا ىلإ رظنت امدنعف عمجملا نع ماعلا رٌبعتلا ًهو Mainfest ةحملب ملعتس
هلٌؽشتو هلٌمحتب موقت نأ لبق هتابلطتم ًه امو عمجملا يوتحٌ اذام ىلع .
ـلا ضعب ىلع يوتحت ةٌذٌفنتلا تافلملاو تابتكملا تناك تٌن تودلا دوجو لبق ىتحو Metadata نٌب لوصولا قٌسنتل مدختست نكت مل اهنكلو
ـلا تءاجو ةعسوملاو ةٌساسلا تامولعملا مٌظنتب موقت لو قٌبطتلا ماسقأ ؾلتخم Metadata رصانعلا هذه عٌمج مضتل تٌن تودلا ًف
ـلا نم لك دوجوو MSIL ـلا و Metadata دلو يذلا رملا ةبسانملا تاودلا مادختساب مهفلاو ةءارقلل ةلباق تافلملا هذه لعجٌ عمجم لك ًف
مهتافلم ىلع ةٌسكعلا ةسدنهلا نم عون يأ لوصحب بؼرت لو تاقٌبطتلا رٌوطت دوهجم ًف لاملاو تقولا نم رٌثكلا رمثتست تاكرشلاف ةلكشم
مهرارسأو مهداوكأ صلختساو . تاٌجمرب نٌرخلا اهءاكرشو تفوسوركٌام تمدق تٌن تودلا تاعمجمل ةٌباوشعلا ةءارقلا عنملو
obfuscator تودلل ةبسنلاب ةبوعص ةٌأ لكشٌ ل كلذ نكلو مهفلاو ةءارقلا رشبلا ىلع بعصٌ يذلا رملا عمجملا تاٌوتحم طلخب موقت ًتلا
كروومٌرف تٌن .


250

خ٠ٛمٌا ءبّعلا دار دبؼّغٌّا Strong Named Assemblies

يوقلا مسلا وذ عمجملا نمضتٌ Mainfest هنم ققحتلا رخآ جمانربل نكمٌ ًمقر عٌقوت ىلإ ةفاضلاب عمجملا اهٌوتحٌ ًتلا تافلملا ددحت
هباشنإ ذنم هب بعلتلا متٌ مل عمجملا نأ دكإٌ يذلا رملا ًمقرلا عٌقوتلا ةحص نم دكؤتلل كلذو . وه عمجملا نأ دٌكؤتلاب نمضٌ ل كلذ نكلو
اهب ثبعلا متٌ مل مجاهملا ةخسن نأ ةفرعم كنكمٌ عٌقوتلا نم تدكؤت نإو اٌمقر هعٌقوتب ماٌقلا مث دٌدج عمجم ءاشنإ مجاهمل نكمٌف هنظت ام سفن
ةٌلصلا تاسورٌفلا ًه عمجملا نمض ةاوتحملا تاسورٌفلا نأو اهتباتك تمت نأ ذنم .
ءامسلا نمضت ىرخأ ةهج نمو هب قوثولا نكمٌ دوكلا اذه نأ ام ةلٌسوب نمضت ًهو اهتٌوه نمضٌ ةٌوق ءامسؤب كتاعمجم دٌوزتف كلذ عمو
ءانب لوقعم لكشب ةٌقوثولا رارق دٌدحت نكمٌ كلذ عمو اهتباتكب تمق كنأ ةرورضلاب نمضٌ ل كلذ نكلو دٌرف لكشب تاعمجملا ةٌوه ةٌوقلا
اش ل نم لضفأ عٌقوتلا ربتعٌ ةلكشملا هذه مؼرو ادٌج ؾورعم عمجملا اذه نؤب كدوز هنل اهدحول يوقلا مسلا ةٌوه ىلع .
عورشملا ؾشكتسم ًفو ةداعلاك دٌدج كٌزٌب لوجٌف عورشم اشنأ عمجم عٌقوتل Project Explorer ىلع اجدوزم ارقن رقنا My Project
ةحفص حتفا مث عورشملا صباصخ حتفل Signing راٌخلا دٌدحتب مق مث Sign the assembly ـب ةصاخلا ةلدسنملا ةمباقلا حتفا مث Key File
رتخا و <New…> رقنا مث يراٌتخا لكشب رس ةملك لاخدإ كنكمٌ امك ؾلملل هدٌرت يذلا مسلا رتخا كل رهظٌ يذلا راوحلا قودنص ًفو
OK . ؾلم ءاشنإب وٌدوتس لوجٌف موقٌ ةظحللا هذه ًف Key عمجملا ءانبب موقت امدنعف عمجملا عٌقوتل ةمزللا تامولعملا عٌمج ىلع يوتحٌ
ؾلملا وٌدوتس لوجٌف مدختسٌ Key جتانلا عمجملا عٌقوتل .
عمجملا مادختسا يذٌفنت ؾلم يأ دٌرٌ امدنعو – ةبتكم ناك نإ Dll لثم - رٌشهتلا لوادج اشنٌو هلٌمحتب موقٌ Hash اهنأ نم دكؤتٌو ةمزللا
همادختسا ضفرٌو ؾلات هنأ وأ هب ثبعلا مت دق عمجملا نأ ضرتفٌ جمانربلاف اقباطم نكٌ مل نإو عٌقوتلا قباطت .
دوكلا نأ نانبمطلا ضعب كٌطعٌ اذهف كسفنب عمجملا ءانبب تمق نإف هإاشنإ مت نأ ذنم هب ثبعلاب ماق دق دحأ ل نأ عمجملا عٌقوت انل نمضٌو
نمآ . رشانلا هعضو يذلا لصلا ىلع يوتحٌ عمجملا نأ كل نمضٌ عٌقوتلاف بٌولا ىلع هعضوو عمجملا ءانبب رخآ صخش ماق نإ كلذ عمو
ًلصلا عمجملا لادبتساب مقٌ مل ام اركاه نأ اضٌأ كل نمضٌ لو عمجملا كلذ ًف سورٌاف جاردإب مقٌ مل رشانلا كلذ نأ كل نمضٌ ل هنكلو
هعٌقوت نم ىرخأ ةخسنب . تاداهشلا ةطلس مادختساب انامأ رثكأ عمجملا لعج كنكمٌ نٌرخلا عم هتكراشم دٌرت عمجم ةباتكب تمق نإف .
تاداهشلا ةطلسو Certificate Authority كتٌوه دكإت ةكرشلا هذهو عقوملا دوكلا ةعطق ةلاصأ نمضت ًتلا ةٌمقرلا عٌقاوتلا عٌبت ةكرش ًه
ةداهش كٌطعت ًهف نوكت نأ ًعدت نم لعف كنؤب نورخلا دكؤتٌ كلذبو Certificate دحأ مدختسٌ امدنعو تاعمجملا عٌقوتل اهمادختسا كنكمٌ
هنأ ىلإ ةفاضإ هتباتكب تمق نأ ذنم هب ثٌعلا متٌ ملو هباشنإب تمق يذلا ًلصلا عمجملا وه كعمجم نأ نم دكؤتلا هل نكمٌ اقحل كعمجم ام
كتٌوه ةحص نم دكؤتٌ .
مهتقحلمو مهبقعت نم كنكمٌ امم مهٌلع ؾرعتلا ىلع ةرداق ةطلسلا نم لعجٌ كلذ نل تاسورٌفلا رشنل تاداهشلا ةطلس ركاهلا مدختسٌ لو
ةروطخ لكشٌ دوكلا نأ نٌبت لاح ًف ةٌدامتعا لكشت اهنكلو نمآ هسفن تاذ دوكلا نأ نمضت ل لازت ل ةداهشلاف كلذ عمو اٌباضق

251

Friend Assemblies

ـلا Friend Assembly عمجم وه Assembly ددحم مادختساب اهفٌرعت مت ًتلاو رخآ عمجم ًف ةدوجوملا رصانعلا مادختساب هل حومسم
لوصولا Friend ـك كٌزٌاب لوجٌف ًف ام عمجم دٌدحتب تمق نإف Friend Assembly كلذ ًف عاونلاو رصانعلا ؾٌرعت ابجوتم دعٌ مل
لوصولا ددحم مادختساب عمجملا Public نٌتلاح ًف ةحٌرم ةٌنقتلا هذه ربتعتو ىرخلا تاعمجملا نم مهتٌإر متت ًك :
 مادختساب مهفٌرعت مت هصحف متٌ يذلا عمجملا ًف رصانع ىلإ لوصولل جاتحٌ هنكلو ؾلتخم عمجم ًف لمعٌ دوك صحفب موقت امدنع
لوصولا ددحم Friend
 تابف ةبتكم رٌوطتب موقت امدنع Class Library لوصولا بلطتت اهنكلو ةفلتخم تاعمجم ًف ةدوجوم ةبتكملا كلتل تافاضإ كانهو
لوصولا ددحم مادختساب مهفٌرعت مت ةدوجوملا تاعمجملا ًف رصانعل Friend
ةفصلا مادختسا كنكمٌ InternalsVisibleToAttribute ـلا نم رثكأ وأ ةدحاو دٌدحتل friend assemblies ددحم عمجمل . كنكمٌ لثمف
ةفصلا نٌمضت InternalsVisibleToAttribute عمجملا ًف A عمجملا دٌدحتو B ـك friend assembly عمجملا ناكمإب نوكٌسف B
عمجملا ًف رصانعلاو عاونلا عٌمجل لوصولا A لوصولا ددحم مادختساب اهفٌرعت مت ًتلا Friend ًلاتلا لاثملا ًف رهظٌ امك
Imports System.Runtime.CompilerServices

<Assembly: InternalsVisibleTo("FriendAssembliesB")>

' Friend class.
Friend Class FriendAssembliesA
Public Sub Test()
MsgBox("Friend Assemblies Sample Class")
End Sub
End Class

' Public class with a Friend method.
Public Class FriendAssembliesClassA
Friend Sub Test()
MsgBox("Friend Assemblies Sample Method")
End Sub
End Class

ـك حضاو لكشب اهفٌرعت متٌ ًتلا تاعمجملا عٌمجف Friend رصانعلاو عاونلا ىلإ لوصولا اهنكمٌ Friend عمجملا ناك نإ لثمف B وه
Friend عمجملل A عمجملا و C عمجملا ىلإ عجرم هل B نٌعمجملا لكل نكٌ نلف B و C عاونلل لوصولا قح Friend عمجملا ًف A
ـل ًساسأ ًقٌقدت لمعب مجرتملا موقٌو Friend Assemblies ةفصلل اهمسا رٌرمت مت ًتلا InternalsVisibleToAttribute ناك نإف
عمجملا A عمجملا ؾرعٌ B ـك Friend Assembly ًلٌ امك ققحتلا دعاوق نوكت :
 عمجملا ناك اذإ A عمجملا ىلع بجٌ اٌوق امسا كلتمٌ B اضٌأ اٌوق امسا كلتمٌ نأ . ـلا مساف Friend Assembly ىلإ ررمملا
ماعلا حاتفملاو عمجملا مسا ىلع يوتحٌ نأ بجٌ ةفصلا Public Key يوقلا مسلل Strong-Name Key عٌقوتل مدختسا يذلا
عمجملا B . ـلا مساو friend assembly ةفصلل هرٌرمت متٌ يذلا InternalsVisibleToAttribute مسلا نوكٌ نأ نكمٌ ل
عمجملل يوقلا B ءانبلاو ةفاقثلاو عمجملل ةخسنلا مقر نمضت ل كنأ ثٌح architecture ماعلا حاتفملا زمرو و
 عمجملا كلتمٌ مل نإو A ـلا مسا يوتحٌ نأ بجٌ اٌوق امسا Friend Assembly طقف عمجملا مسا ىلع
 عمجملل ناك نإو B ـلا ددحت نأ بجٌ اٌوق امسا strong-name key عمجملل B رطس قٌرط نع وأ عورشملا صباصخ مادختساب
مجرتملا راٌخ مادختساب رماولا /Keyfile

252

اٛغ١فث صبخٌا شِاٚلا شطع ُعشزِ ي ه٠ض٠بث 2008

اٛغ١فث صبخٌا شِاٚلا شطع ٗعِٛ ي ٛ٠دٛزع 2008
بٌصنتب موقن امدنع .Net Framework 3.5 SDK خسن ىدحإ وأ Visual Studio 2008 تادلجملا نم ةعومجم ءاشنإ متٌ
دٌرت تنك نإف رماولا رطس نم اهذٌفنت متٌ تاودلا هذه نم دٌدعلاو تٌن تودلا رٌوطت تاودأ نم ةعونتم ةعومجم ىلع يوتحت ًتلا ةدٌدجلا
ةبٌبلا رٌؽتم نمض تادلجملا هذه لٌجست اهدنع كٌلع بجٌف زودنٌولا ًف رماوأ رطس ةذفان ةٌأ نم تاودلا هذه لٌؽشت PATH ماظنل دباعلا
لٌؽشتو كسفن ىلع ءانعلا رٌفوت كنكمٌ هنأ لإ اٌودٌ كسفنب رٌؽتملا كلذ ثٌدحت كنكمٌ هنأ مؼرو لٌؽشتلا Visual Studio 2008
Command Prompt دلجملا نم Visual Studio Tools دلجملا ًف نباكلا Microsoft Visual Studio 2008 أدبا ةمباق ًف .
تودلل ةدباعلا رٌوطتلا تاودأ عٌمج ىلإ لوصولا نم كنكمٌل افلس اطوبضم هنوك ًف ةقٌرطلا هذهب رماولا رطس هجوم حتف نم ةدبافلا نمكتو
عٌراشم ةمجرت ةادؤب ةصاخلا ةدعاسملا ةٌإر اندرأ نإف اٌودٌ ماظنلاب ةصاخلا ةبٌبلا تارٌؽتم لٌدعتب ماٌقلل جاتحت نأ نودب تٌن VB2008
وٌدوتس لاوجٌفب صاخلا رماولا رطس هجوم نم ًلاتلا رملا ذٌفنت كنكمٌ 2008
Vbc -?
اٛغ١فث صبخٌا شِاٚلا شطع ُعشزِ ي ه٠ض٠بث 2008 vbc.exe
كٌزٌاب لوجٌفل يردصملا دوكلا ةمجرتل اهمادختسا كنكمٌ ًتلا تاٌنقتلا نم دٌدعلا كانه 2008 ضعبو رٌوطتلا ةبٌبل ةفاضلابف
تاعمجم ءاشنإ كنكمٌ تٌن تودلا ةهجاو عم لماعتت ىرخأ تاكرش نم تاودلا assemblies صاخلا رماولا رطس مجرتم مادختساب
كٌزٌاب لاوجٌفب 2008 نأ يرورضلا نم ىقبٌ هنأ لإ رماولا رطس مجرتم مادختساب عساو ىوتسم ىلع جماربلا ءانبب موقت نل امبر هنأ عمو
عونلا نم كتافلم ةمجرت كنكمٌ ؾٌك مهفت *.vb ةٌلمعلا هذهب مامللل كجاٌتحا بابسأ ضعب ركذ انه اننكمٌو اٌودٌ :
 وٌدوتس لوجٌف نم ةخسن كٌدل نوكٌ ل امبر هنأ ةقٌقح وه لولا حضاولا ببسلا 2008
 ةٌموسرلا رٌوطتلا تاهجاو مادختساب دوكلا دٌلوت نم كعنمت ةٌمٌلعت ةسسإم ًف نوكت دق
 تٌن تودلل ةٌلآ ةمجرت تاودأ ءاشنإ دٌرت دق
 ـل كمهف قٌمعت دٌرت دق VB2008 انمض مدختست تنؤف ةٌموسرلا رٌوطتلا تاهجاو مادختساب موقت امدنعف vbc.exe اذهب تنأو
ةمجرتلا ةٌلمع دنع سٌلاوكلا ءارو ثدحٌ ام ىلع ؾرعتت
 رماولا رطس هجوم نم لمعت ًتلا تٌن تودلا تاودأ مادختسا عم احاترم حبصت كنأ ًهو ةٌفاضإ ةدباف
ه٠ض٠بث يٛغ١ف دبم١جطر ءبٕث 2008 َاذخزعبث vbc.exe
دحاو ؾلم نم ؾلإم عمجم ءانبب موقنس ةٌموسرلا رٌوطتلا ةهجاو مادختسا نودب تٌن تود قٌبطت ءانب ةٌفٌك ضارعتسل
TestApp.exe كٌزٌاب لاوجٌفب صاخلا رماولا رطس مجرتم مادختساب كلذو 2008 ـلا عم Notepad ضعبل انه ةٌادبلا ًف جاتحنسو
ـلا حتفب مق ضرؽلا اذهلو يردصملا دوكلا notepad ًلاتلا دوكلا لخدأو
' A Simple Vb 2008 application
Imports System
Module TestApp
Sub Main()
Console.WriteLine("Testing! 1, 2, 3")
End Sub
End Module
مساب ؾلملا ظفحا كباهتنا دعبو TestApp.vb لثم مبلم دلجم ًف C:\VbcExample
مجرتمل ةٌساسلا تاراٌخلا ىلع ؾرعتن نلا انعد VB2008 ثٌح هإاشنإ متٌس يذلا عمجملا مسا دٌدحت ًه ىلولا مامتهلا ةطقن نوكت ثٌح
ىلإ ةررمم ةمٌقب لثمم لامتحا لك نوكٌ vbc.exe اهحرشو تاراٌخلا هذه مهأ ًلٌ امٌفو رماولا رطس تاددحم ربع
 /out ؾلملا مسا ًه ةٌضارتفلا ةمٌقلا نوكت ثٌح هإاشنإ متٌس يذلا عمجملا مسا *.vb لولا
 /target:exe ًضارتفلا راٌخلا وهو يذٌفنت لوسنوك قٌبطت ءانبب موقٌ
 /target:library ؾلم ءانبب موقٌ *.dll دٌحو
 /target:module ءانبب موقٌ module تافلملا ةددعتم تاعمجملا نٌوكت ةدحو ًهو
253

 /target:winexe يذٌفنت زودنٌو قٌبطت ءانبب موقٌ
مادختساب زودنٌو تاقٌبطت ءانب كنكمٌ هنأ مؼرو target:exe مادختسا نأ لإ target:winexe لٌؽشت دنع روهظلا نم لوسنوكلا ةذفان عنمٌ
جمانربلا . ةمجرتلو TestApp.vb مساب لوسنوك قٌبطت ىلإ TestApp.exe وٌدوتس لاوجٌفب صاخلا رماولا رطس هجوم حتفا 2008
هٌف روكذملا ؾلملا ظفحب تمق يذلا دلجملا ىلإ لقتناو
cd C:\VbcExample
ًلاتلا رملا لاخدإب مق مث
vbc /target:exe TestApp.vb
راٌخلا مدختسن مل انهو out يذٌفنتلا ؾلملا ةٌمست متٌس اذهل TestApp.exe ةٌمست اندرأ نإف لخدملا يردصملا دوكلا ؾلم مسا قفاوٌل اٌباقلت
رماولا رطس دنع ًلاتلا رملا لاخدإ اننكمٌ ؾلتخم مساب يذٌفنتلا ؾلملا
vbc /target:exe /out:MyFirstApp.exe TestApp.vb
مجرتم تاراٌخ ضعب نأ ةظحلم ردجت امك VB2008 لثم ةرصتخم ةخسن اهل نوكٌ t نم لدب target ىلع لاخدلا راصتخا كنكمٌ اذل
ًلاتلا لكشلاب حٌتافملا ةحول
vbc /t:exe TestApp.vb
لثم ةٌضارتفا تاراٌخلا هذه ضعب نأ امبو t:exe ؾلملا ةمجرت نكمٌ ًلاتلابو اهفذح نكمٌ اذل TestApp.vb ًلٌ امك
vbc TestApp.vb
َاذخزعبث خ١عسبخ دبؼّغِ ٌٝئ يٛطٌٛا vbc.exe
ؾلملا لٌدعتب موقنس ةٌجراخ تاعمجم ىلإ لوصولا ةٌلمع ضارعتسل TestApp.vb صاخلا لباسرلا قودنص ضرعب موقٌل
ؾلملا حتفا اذه لمعلو زودنٌو جذامنب TestApp.vb ًلاتلاك هتاٌوتحم حبصتل هلدعو
'A simple vb2008 appilication
Imports System

'Add This
Imports system.Windows.Forms

Module TestApp
Sub Main()
Console.WriteLine("Testing! 1, 2, 3")

'Add This
MessageBox.Show("Hello!")
End Sub
End Module

ءامسلا لاجمل عجرم ةفاضل هنأ ظحل System.Windows.Forms ًف VB2008 ةزوجحملا ةملكلا مادختسا متٌ Imports رطس دنعو
ملعإ كٌلع رماولا vbc.exe ةبفلا مادختسا عٌطتست ًك اذهلو ةدروتسم ءامسأ تلاجم ىلع يوتحٌ عمجم يأ نع MessageBox بجٌ
راٌخلا مادختسا كٌلع reference عمجملل عجرم دٌدحتل System.Windows.Forms.DLL ًلٌ امك
vbc /r:System.Windows.Forms.dll TestApp.vb
ؾاضملا ءامسلا لاجم ًف ىوتحملا لباسرلا قودنص روهظ ظحلتس نلا قٌبطتلا لٌؽشتب تمق نإف .
254

مادختساب ةٌجراخ تاعمجم ةدع ىلإ لوصولل ةجاحب تنك نإو vbc.exe رماولا رطس نمض ةمباقب تاعمجملا كلت ءامسأ ركذ كٌلع اهدنع
لاثملا ًف امك ةلصافب ةلوصفم
vbc /r:System.Windows.Forms.dll, System.Drawing.dll *.vb
َاذخزعبث خ٠سذظِ دبفٍِ حذػ خّعشر vbc.exe
قٌبطتلا نم ةٌلاحلا ةخسنلا ءاشنإ مت TestApp.exe ؾلم ةطساوب *.vb نم ةفلإم نوكت عٌراشملا مظعم نأ ًه ةقٌقحلاو دٌحو
تافلم ةدع *.vb ؾلملا ًف ةدوجوم ةٌفاضإ ةبف كٌدل هنأ ضرتفنسو امٌظنتو ةنورم رثكأ دوكلا ًقبٌ كلذو HelloMsg.vb ؾلملا تاٌوتحمو
ًلٌ امك تناك
Imports System
Imports System.Windows.Forms

Class HelloMessage
Sub Speak()
MessageBox.Show("Hello Again")
End sub
End class
ؾلملا ظفحب تمق كنأ ضارتفابو HelloMsg.vb ؾلملا ظفحب تمق يذلا دلجملا سفن ًف TestApp.vb هٌف . ًف دوكلا لٌدعتب مق
TestApp.vb ًلٌ امك ةدٌدجلا ةبفلا مدختسٌل
'A simple vb2008 appilication
Imports System

'Don't need This any More
'Imports system.Windows.Forms

Module TestApp
Sub Main()
Console.WriteLine("Testing! 1, 2, 3")

'Don't need This any More either
'MessageBox.Show("Hello!")

'Exercise the HelloMessage Class!
Dim hello as new HelloMessage()
hello.Speak()
End Sub
End Module
تافلم ةمجرت نلا كنكمٌ *.vb ًلٌ امك
vbc /r:System.Windows.Forms.dll TestApp.vb HelloMsg.vb
مجرتم كنكمٌ امك VB2008 ةلٌدبلا ؾراحملا مادختسا نم * رابخل رماولا رطس ًف ؟ و vbc.exe تافلم عٌمج مادختسا دٌرت كنؤب *.vb
ًلٌ امك عورشملا دلجم ًف ةاوتحملا
vbc /r:System.Windows.Forms.dll *.vb
ـث خطبخٌا خثبغزعلا دبفٍِ غِ ًّؼٌا vbc.exe
قٌبطت ءانب دٌرت تنك اذإ VB2008 تافلمو تاعمجملا ددع نوكٌ امدنع ةصاخو ابعص رماولا رطس مادختسا اهدنع حبصٌ دقعم
*.vb ةباجتسلا تافلم مادختساب انه كٌلع رملا لٌهست مت دقو ارٌبك response files ًف مدختستس ًتلا تامٌلعتلا عٌمج ىلع يوتحت ًهو
ةقحللا كلتمت تافلملا هذهو ةٌلاحلا ءانبلا ةٌلمع rsp رطسأ نأ ةظحلم عم ةٌلاتلا تاٌوتحملاب قباسلا انقٌبطتل ةباجتسا ؾلم ءاشنإ اننكمٌو
ؾرحملاب أدبت تاقٌلعتلا #
255

# This is the response file
#for the TestApp.exe app

#External assembly references.
/r:System.Windows.Forms.dll

#output and files to compile (using wildcards syntax).
/t:exe /out:TestApp.exe *.vb

ةباتكب كلذو ةباجتسلا ؾلم مادختساب عورشملا ةمجرتب ماٌقلا اننكمٌ اهدنع دلجملا سفنب ةقباسلا تافلملا عم هظفح مت دق هنأ ضرتفنسو @
رماوأ رطس ًف ةباجتسلا ؾلم مسا اهعبتٌ vbc.exe
vbc @TestApp.rsp
لخدك ةباجتسا تافلم ةدع دٌدحت كنكمٌ امك
vbc @FirstFile.rsp @SecondFile.rsp @ThirdFile.rsp
ؾلم ًف رمأ يؤف اذهلو اهدورو بٌترت سفنب رماولا رطس تاددحم مدختسٌ مجرتملا نأ ةظحلم كٌلع بجٌ ةقٌرطلا هذه مدختست امدنعف
rsp تافلم ًف ةدوجوم تاراٌخ زواجتٌ دق قحل rsp ؾوس ةباجتسلا ؾلم لبق رماولا رطس ًق ةبوتكملا تاددحملا نأ اضٌأ ظحلو ةقباس
ؾلم ًف ةدوجوملا رماولا مادختساب اهزواجت متٌ rsp لاخدإب تمق نإف اذهلو
vbc /out:MyCoolApp.exe @TestApp.rsp
عمجملا مسا ىقبٌ ؾوسف TestApp.exe ؾلملا ًف ةدوجوملا تاددحملا ببسب كلذو TestApp.rsp ؾلم دعب تاددحملا عضوب تمق نإو
rsp ؾلم ًف ةدوجوملا رماولا زواجتب تاددحملا كلت موقتسف رماولا رطس ًف rsp مسا حبصٌ ؾوسف ًلاتلا رطسلا لاخدإب تمق نإف
جتانلا عمجملا MyCoolApp.exe
vbc @TestApp.rsp /out:MyCoolApp.exe
ٟػاشزفلا خثبغزعلا فٍِ
مجرتم نأ وه انه اهنع ثدحتلا متٌس ةطقن رخآ VB2008 همسا ًضارتفا ةباجتسا ؾلمب طبترم vbc.rsp سفن ًف دجاوتم وهو
هٌف دوجوملا دلجملا vbc.exe مادختساب هتاٌوتحم ىلع علطلاو هحتف كنكمٌ ثٌح notepad قٌبطت ءانبب موقت امدنعف VB2008 مادختساب
vbc.exe ل ام ببسل تنك نإو ةصصخم ةباجتسا تافلم مادختساب موقت امدنع ىتح عجرمك ًضارتفلا ةباجتسلا ؾلم مادختسا متٌ ؾوسف
راٌخلا مادختسا كنكمٌ ًضارتفلا ةباجتسلا ؾلم مادختساب بؼرت noconfig ًلٌ امك
vbc @TestApp.rsp /noconfig
خّربخ
رماوأ رطس مجرتم كلتمٌ امك VB2008 دنعو دلوملا تٌن تود عمجمب مكحتلل اهمادختسا نكمٌ ًتلا ىرخلا تاراٌخلا نم دٌدعلا
قباثولا للخ نم اهٌلع علطلا كنكمٌ ًتلا تاراٌخلا ًقاب مادختسا نم كنكمت ًتلا تاٌساسلاب املم تحبصأ دق نوكت نأ بجٌ ةطقنلا هذه
رٌوطتلا ةبٌب عم ةقفرملا

256

شِاٚلا شطع دادذحِ غِ ًِبؼزٌا CommandlineArgs

خ١طبخٌا CommandLineArgs
ةٌصاخلا للخ نم رماولا رطس تاددحم عم لماعتلا اننكمٌ CommandLineArgs طقف ةءارقلل ةٌصن ةعومجم دٌعت ًتلا ReadOnly
Collection Of String لكشلا ىلع ةماعلا اهتؽٌص نوكتو رماولا رطس تاددحم ىلع يوتحت
Public ReadOnly Property CommandLineArgs() As ReadOnlyCollection(Of String)
عمجملا ًف ةدجاوتم ًهو Microsoft.VisualBasic.dll ءامسلا لاجم نمضو Microsoft.VisualBasic.ApplicationServices
لوسنوكلا تاقٌبطتل ةبسنلاب ًهو ConsoleApplicationBase.CommandLineArgs زودنٌولا تاقٌبطتل ةبسنلابو
My.Application.CommandLineArgs
اهٌف جمانربلا لٌؽشت مت ةرم لوؤب ةصاخلا مٌقلا دٌعت ةٌصاخلا هذه نإف دحاو نآ ًف قٌبطتلا نم خسن ةدع لٌؽشت دنع هنأ ةظحلم ردجتو
ثدحلا ةجلاعم انٌلع اهٌف جمانربلا لٌؽشت مت ًتلا ةٌلاتلا تارملل رماولا رطس تاددحم ىلع لوصحللو
My.Application.StartupNextInstance ةٌصاخلا صحفو CommandLine ـل ةدباعلا StartupEventArgs – كحصنأ انهو
قٌبطتلا ثادحأ ًعوضوم ةعجارمب – ةٌصاخلا نٌب ؾلتخلا ةظحلم ردجتو CommandLineArgs رماولا رطس تاددحم دٌعت ًتلا
ةٌصاخلاو طقف CommandLine قٌبطتلل يذٌفنتلا ؾلملا مسا هٌف امب لماك قٌبطتلا هللخ نم ذفت ًتلا رماولا رطس دٌعت ًتلا و هذه
دجاوتلا دٌحو جمانربلاب ةصاخ ةظحلملا Single Instance Application جمانربلا يأ هنم طقف ةدحاو ةخسن لٌؽشت ضرتفملا
دٌحو جمانرب لمعب موقن نحن ةبسانملابو بناجب عبرملا ًف ةراشإ عضوب دجاوتلا Make Single Instance Appliocation ةحفص ًف
Application صباصخ ًف My Project
طقف ةٌلاتلا تاقٌبطتلا عاونل ةرفوتم ًهف اهإاشنإ كنكمٌ ًتلا تاقٌبطتلا عاونأ عٌمجل ةرفوتم تسٌل ةٌصاخلا هذهو Windows
Application و Console Application و Windows Service ةبفلل تلاحلا ضعب ًف جاتحت دقو طقف EnvironmentPermission
لقتسم عوضوم لمعب لبقتسم موقؤس امبرو ةٌصاخلا هذه للخ نم رماولا رطس تاددحم ةءارقل ةٌفاكلا تاٌحلصلا ىلع لوصحلا لجأ نم
ةبفلا نع EnvironmentPermission
َاذخزعلا ٓػ خٍضِأ
رماولا رطس ربع ررمٌ نأ ضرتفملا ام ددحم ةجلاعم اندرأ اذإ /input= ةررمملا ةمٌقلا ةٌقب راهظل ًلاتلا دوكلا مادختسا اننكمٌ لثم
Private Sub ParseCommandLineArgs()
Dim inputArgument As String = "/input="
Dim inputName As String = ""

For Each s As String In My.Application.CommandLineArgs
If s.ToLower.StartsWith(inputArgument) Then
inputName = s.Remove(0, inputArgument.Length)
End If
Next

If inputName = "" Then
MsgBox("No input name")
Else
MsgBox("Input name: " & inputName)
End If
End Sub

رماولا رطسل تاددحم ةدع ةجلاعمل ءارجإ لمع اننكمٌ وأ

257

For Each cr In My.Application.CommandLineArgs
HandleArgs(cr.ToUpper)
Next

Private Sub HandleArgs(ByVal carg As String)
Select Case carg
Case "/S"
' حعٌاؼِ دذحٌّا /S

Case "/T"
' حعٌاؼِ دذحٌّا /T
Case Else
' حعٌاؼِ ٞأ دذحِ شخآ

End Select
End Sub

ثدحلا ةجلاعم نع لاثم اذه دحاو نآ ًف قٌبطتلا نم خسن ةدع لٌؽشت ةلاح ًفو StartupNextInstance نم ثدحلل لوصولا اننكمٌ ثٌح
صباصخ حتف للخ My Project ةحفص نمو Application رزلا طؽضا View Application Events بسانملا دوكلا ررحمل كلقنٌل
Private Sub MyApplication_StartupNextInstance( _
ByVal sender As Object, ByVal e As _
Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs _
) Handles Me.StartupNextInstance

Dim inputArgument As String = "/input="
Dim inputName As String = ""

For Each s As String In e.CommandLine
If s.ToLower.StartsWith(inputArgument) Then
inputName = s.Remove(0, inputArgument.Length)
End If
Next

If inputName = "" Then
MsgBox("No input name")
Else
MsgBox("Input name: " & inputName)
End If
End Sub



258

داداذػلا ِٓ خٙعٚ شظٔ VB .net ِٓ 2002 ٝزح 2005

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

داداذػئ حدبؼزعاٚ ؾجػ َذخزغٌّا
راٌتخاب كقٌبطت لخاد دادعإ ؾلم ءاشنإ ًه ةوطخ لوأ Add New Item ةمباق نم Project راٌتخا و Application Configuration
File كرتا و ؾلملل ًضارتفلا مسلا App.Config هتٌمست ةداعإو هلقن متٌس ثٌح رٌٌؽت نود وه امك كماٌق دنع بسانملا لكشلاب اٌباقلت
دٌدحت كنكمٌ دٌدجلا ؾلملا ًفف قٌبطتلا ءانبب مسقلا نمض ةصاخلا كتادادعإ ةفاضإ وأ ةصصخم تادادعإ appSettings ةرابع نوكت ثٌح
نع مسا جاوزأ / ًلاتلاب اهٌبش افلم جتنٌ دق ةطٌسبلا تامولعملا ضعب نٌزختو ةمٌق

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Company Name" value="Java Jitters" />
<add key="Database Server" value="BigSQLServer" />
</appSettings>
</configuration>

للخ نم ةجاحلا دنع مٌقلا هذه ةداعتسا لهسلا نمو قاطنلا نمض ةدوجوملا تاءارجلاو تابفلا System.Configuration نل كنأ ىتحو
جاتحت بسانملا مسلا لمحٌ ناك نإ اٌباقلت هلٌمحتو هفاشتكا متٌس ثٌح كسفنب ؾلملا لٌمحتل بسانملا ناكملا ًف اعوضومو

Dim companyName As String _
= ConfigurationSettings.AppSettings("Company Name")

َذخزغرل اربٌّ App.Config ؟
لمعأ ؾٌك لاإسلا ىرن ام ارٌثك ؾلم App.Config ؾٌرعتلا ؾلم اومدختسا نأ دعب ًب صاخلا اوأرو ةلهسلا ةجمربلا ةٌلمع هب ةقلعتملا
ل اذامل تادادعإ نٌزختل ؾلملا سفن مادختسا مهنكمٌ مدختسملا مهب ةصاخلا نأ مهفاشتكا دعب كلذو تادادعلل نٌتفلتخم نٌتقٌرط دجوٌ اذامل
لاجملا System.Configuration ل ؾلملا ةباتكل ةقٌرط مدقٌ app.config ةباثمب ربتعت ًتلاو جمربملا مامأ اقباع ؾقت نل اهنكلو رٌذحت
نوموقٌ ةداعلا ًف ثحبلا دعبو ممصملا وأ يداع ؾلم مادختساب XmlDocument لو ةدٌج رٌؼ ةركف ربتعت هذهو كقٌبطت ىلع بجٌ ةباتك
ؾلملا نوكو نٌمدختسملا لزع مدع ،تاٌحلصلا اهنم بابسأ ةدعل تافلملا هذه app.config بابسلا هذهل قٌبطتلا دادعإ تافلم نم اءزج
سأو ب ل ىرخأ ابا كٌلع بجٌ ؾلملا مادختسا app.config ل نكلو مدختسملا تادادعإ نٌزخت ضرؽل تادادعإ نٌزختف قلقت سٌل مدختسملا
ةبوعصلا كلتب
259


ٍٝػ بٕٙ٠ضخرٚ داداذػئ خئف ءبشٔئ صشمٌا
ءاشنل حاتفملا تادادعإ ةبف ءاشنإ وه كب ةصاخلا مدختسملا Class كب ةصاخلا مدختسملا تادادعل كتهجاو نوكٌس ثٌح تاناٌبلا عٌمج لثمت
بجٌ اش لوأ ًهو لثم ةٌلاتلا ةبفلاك تامولعم ةٌأ نٌزخت دٌرت امدنع هإانب كٌلع

Imports System.Drawing
Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Environment
Imports System.Collections.Specialized

Public Class Settings

Private m_BackgroundColor As String
Private m_RecentFiles As New StringCollection
Private m_LastWindowBounds As Rectangle _
= New Rectangle(0, 0, 200, 200)
Private m_LastWindowState As Windows.Forms.FormWindowState _
= FormWindowState.Normal

<Xml.Serialization.XmlIgnore()> _
Public Property LastWindowBounds() As Rectangle
Get
Return m_LastWindowBounds
End Get
Set(ByVal Value As Rectangle)
m_LastWindowBounds = Value
End Set
End Property

Public Property LastWindowPos() As Point
Get
Return m_LastWindowBounds.Location
End Get
Set(ByVal Value As Point)
m_LastWindowBounds.Location = Value
End Set
End Property

Public Property LastWindowSize() As Size
Get
Return m_LastWindowBounds.Size
End Get
Set(ByVal Value As Size)
m_LastWindowBounds.Size = Value
End Set
End Property

Public Property LastWindowState() As Windows.Forms.FormWindowState
Get
Return m_LastWindowState
End Get
Set(ByVal Value As Windows.Forms.FormWindowState)
m_LastWindowState = Value
End Set
260

End Property

Public Property RecentFiles() As StringCollection
Get
If m_RecentFiles Is Nothing Then
m_RecentFiles = New StringCollection
End If
Return m_RecentFiles
End Get
Set(ByVal Value As StringCollection)
If Value Is Nothing Then
m_RecentFiles = New StringCollection
Else
M_RecentFiles = Value
End If
End Set
End Property

Public Property BackgroundColor() As String
Get
Dim colorToReturn As String

If m_BackgroundColor Is Nothing OrElse _
m_BackgroundColor = String.Empty Then
colorToReturn = ColorTranslator.ToHtml( _
Color.FromKnownColor(KnownColor.Control))
Else
colorToReturn = m_BackgroundColor
End If
Return colorToReturn
End Get
Set(ByVal Value As String)
If Not ColorTranslator.FromHtml(Value).IsEmpty Then
m_BackgroundColor = Value
Else
m_BackgroundColor = String.Empty
End If

End Set
End Property

End Class

ةبولطملا كتادادعل ةبسانملا ةبفلا ةباتك نم كإاهتنا دعب اهتباتك ًه ةٌلاتلا ةوطخلا نوكتس اهتءارقو قرطلا ىدحإو صرقلا ىلع ؾلم نم
ةبسانملا نٌتبفلا ًه System.Xml.XmlReader و System.Xml.XmlWriter لهسلا نم نوكٌ هنكلو لسلست مادختسا XML
Serialization دجاوت ءاشنل تاٌرورضلا عٌمج لفكٌ ثٌح ؾلم ًف ةبفلل XML عم لماعتلا عٌطتسٌ ثٌحب يوق وهو هنم اهتداعتسا و
تامولعملا هنأ حضتٌ اذهبو لبقتسم اهتفاضإ متٌ نأ نكمٌ ًتلا ةٌفاضلا صباصخلا ىتحو ةصوقنملا ةبفلل دجاوت نٌزخت كنكمٌو دٌج راٌخ
ةبفلا مادختساب صرقلا ىلع System.Xml.Serialization.XmlSerializer ةداعتسلل ةبفلا سفن مادختسا كنكمٌ امك لاثملا رظنا اقحل

Public Sub SaveSettings()
Dim xs As New XmlSerializer(GetType(Settings))

Dim sw As New IO.StreamWriter("C:\settings.xml")
xs.Serialize(sw, currentSettings)
sw.Close()
261


Dim sr As New IO.StreamReader("C:\settings.xml")
currentSettings = CType(xs.Deserialize(sr), Settings)
sr.Close()

End Sub

تادادعلا ةبف ًف ًلعف دوك عضو دٌرن طٌسبلا لاثملا اذه ًف ضعب تدوز دقو ةفلتخملا قرطلاو تاءارجلا نم دٌدعلا نٌب جمدك انب ةصاخلا
تاراٌخلا قفدتلا نمض اهمٌدقت متٌل ةفلتخملا stream ةٌلمعو صرقلا ىلع اهظفحب متهٌس ثٌح لسلستلا / ءاؽلإ لسلستلا serializing or
deserializing لوأ بلطتت ءاشنإ ةبفلل دجاوت XmlSerializer

Dim xs As New XmlSerializer(GetType(Settings))

جاتحتسو ـل دجاوت ىلإ اضٌأ TextWriter, or XmlWriter وأ TextReader, or XmlReader لثمتل لٌمحتلاو ظفحلا ةٌلمع

Dim sw As New IO.StreamWriter("C:\settings.xml")

ناكمو قٌبطتلا تاناٌب دلجم حرتقأو ةماهلا تاشاقنلا نم ربتعٌ صرقلا ىلع ؾلملا نٌزخت راٌخلا ربتعٌو رخآ لوزعم ناكم يأ وأ مدختسملل
ىلع لوصحلا كنكمٌ ثٌح لضفلا وه لولا مادختساب لماكلا هراسم Application.UserAppDataPath وأ
System.Environment.GetFolderPath نم دٌدعلاب بولطملا راسملا ىلع لوصحلا نكمٌ ثٌح ةقٌرطلا هذه نأ دقتعأ ًنكلو قرطلا
ةٌافك دٌج لكشب لمعت

Dim filePath As String
filePath = Path.Combine(GetFolderPath( _
SpecialFolder.ApplicationData), Application.CompanyName)
filePath = Path.Combine(filePath, Application.ProductName)
filePath = Path.Combine(filePath, FILENAME)
Dim settingsFile As New FileStream(filePath, FileMode.Create)

ٓ٠ضخزٌا ًظفٌّٕا
ناكم هل نوكٌ ثٌح لصفنملا نٌزختلا وه رخلا ًلاثملا ناكملا و ادٌرف تافلم رفوٌ يذلا مدختسملل قٌبطتلا تاناٌب دلجم نمض صاخ
طوبرم ا ضعببو مدختسملاب نمض ةدوجوملا تابفلا مادختسا كنكمٌ ثٌح قٌبطتلا لوح تامولعملا System.IO.IsolatedStorage ءاشنل
ةقطنملا كلت ًف دوجوم رخآ حتف وأ ؾلم

Dim ifs As IsolatedStorageFile
ifs = IsolatedStorageFile.GetUserStoreForAssembly()
Dim settingsFile As New IsolatedStorageFileStream( _
FILENAME, FileMode.Create, ifs)
Return settingsFile

ًخاد ِٓ ً١ّحزٌاٚ عفحٌا ك١جطزٌا
نم تادادعلا ؾلم لٌمحتل جاتحتس كقٌبطتل ًسٌبرلا جذومنلا ًف ًتلا تاٌبارجلا لكو هتٌاهن دنع اهظفحو كقٌبطت ءدب دنع صرقلا
ًف ةدوجوم اهجاتحتس كلت عم لمعلا كلذ بلطتٌسو كتبف تاٌبارجلا اهدٌرت ًتلا تادادعلا رٌرحتل ةبفلا ًف ةدحاو ةذفانب طٌسب قٌبطت ًفف
لجأ نمو دوكلا نم روطس ةعضبب اذه زاجنا لهسلا نم نوكٌس لٌمحت تادادعلا لاثملا ىلإ رظنلا كنكمٌ قٌبطتلا ءدب دنع

Dim currentSettings As Settings

Public Sub LoadSettings()
Try
Me.currentSettings = Settings.Load()
With Me.currentSettings
Me.Bounds = .LastWindowBounds
Me.BackColor = ColorTranslator.FromHtml(.BackgroundColor)
262

Me.WindowState = .LastWindowState
End With
UpdateRecentFileMenu()
Catch ex As Exception
Me.currentSettings = New Settings
End Try
End Sub

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call
LoadSettings()

End Sub

لاثملل رظنلا كنكمٌ اهلٌمحتلو

Protected Overrides Sub OnClosing(ByVal e As _
System.ComponentModel.CancelEventArgs)
SaveSettings()
End Sub

Private Sub SaveSettings()
With Me.currentSettings
.LastWindowBounds = Me.Bounds
.BackgroundColor = ColorTranslator.ToHtml(Me.BackColor)
.LastWindowState = Me.WindowState
.PersistMe()
End With
End Sub

ه٠ض٠بث يٛغ١ف ٓػ اربِ 2005
ًف انشقان ًف نكلو كتادادعإ نٌزختب موقت نٌأو ؾٌك عوضوملا اذه VB2005 تمت لباسملا هذه نم رٌثك تمت ثٌح كلجأ نم اهتجلاعم
اهمادختسا كنكمٌ قٌبطتلا صباصخ ًف تادادعلل ررحم ةفاضإ ةلوهس لكب قٌبطتلا تادادعإ و مدختسملا تادادعإ نم لك طبضل ةلوهسب
كماٌق دعبو ةلوهس لكب اهتءارق كنكمٌ بسانملا لكشلاب اهطبضب

Me.Text = My.Settings.CompanyName
If My.Settings.StartMaximized Then
Me.WindowState = FormWindowState.Maximized
End If

كروومٌرفلا ًف 2 ةلوهس ظحلتس ءاشنإ تادادعلا ؾلم حتف يرورضلا نم دعٌ مل ثٌح كلذ نع لدب ةصاخلا كتادادعإ لاخدإو دادعلا
تادادعلا ممصم ىلإ هجوتلا كنكمٌ مدختسم مأ قٌبطت اهلاجم نكٌ امهم كتادادعإ ةفاضإو ةرشابم . ىلع تادادعلا نوكت ثٌح ىوتسم
ةنزخم نوكتو قٌبطتلا ًف نٌمدختسملا عٌمج نٌب ةكرتشم ًهو طقف ةءارقلل قٌبطتلا ؾلملا ًف app.config مسقلا ًف
<applicationSettings> مسقلا نع ؾلتخٌ يذلاو <appSettings> كروومٌرفلا ًف دوجوملا 1 ؾلملا نوكٌس لٌؽشتلا تقو ًفو
app.config دلجملا ًف Bin ىلع لاثمكو جمانربلا مسل اقفو هتٌمست ةداعإ متٌ ؾوسو ةدعاق ةلصو ؾٌرعت قٌبطتلا ىوتسم ىلع تادادعإ
ناونع وأ بٌو ةمدخ ناونع وأ تاناٌبلا مقلم ... خلا

<applicationSettings>
263

<MySettingsDemo.MySettings>
<setting name="SMTPServerIP" serializeAs="String">
<value>127.0.0.1</value>
</setting>
<setting name="MyServicesURL" serializeAs="String">
<value>http://localhost/myservices.asmx</value>
</setting>
</MySettingsDemo.MySettings>
</applicationSettings>

تادادعلا نوكت مدختسملا ىوتسم ىلع نوكتو قٌبطتلا دوك للخ نم نامؤب اهطبض ةداعإو اهتءارق نكمٌو مدختسم لكل ةصصخم ًف ةنزخم
ؾلم user.config نافلم كانه نٌقٌقد نوكن ًكلو user.config لكل مدختسم لكل كلذ عمو ةكراشم نودب دحاوو ةكراشملل دحاو قٌبطت
قباثو صنت VB2005 ؾلملا نأ ىلع user.config ًف هنٌزخت متٌس ثٌح اقٌقد سٌل اذه نكلو مدختسملا مسل اعبت هتٌمست متٌس راسملا

<c:\Documents and Settings>\<username>\[Local Settings\]Application


Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>

ثٌح

<c:\Documents and Settings> َذخرسٌّا خأا١ت ذٍعِ
<username> َذخرسٌّا ُسا
<companyname> حوششٌا ُسا
<appdomainname> Application Domain
<eid> َذخرسٌّا فشؼِ
<hash> hash
<version> ك١ثطرٌا حخسٔ ُلس

لاثمكو

C:\Documents and Settings\Emad.BROKENOAK\Local Settings\Application
Data\MySettingsDemo\MySettingsDemo_9cfe5ef1\1.0.0.0

ءاشنإ متٌ ثٌح ؾلملا user.config مٌقلاو دٌدج مدختسم ةطساوب قٌبطتلا لٌؽشت اهٌف متٌ ةرم لوأ ًف ًف اهعضو متٌ ؾوس ةٌضارتفا رٌؽلا
ًف ةدوجوملا مٌقلا امنٌب مدختسملا ىوتسم ىلع ؾلم app.config مسقلا ًف <userSettings> هذهل ةٌضارتفلا مٌقلا ًه تادادعلا ًهو
ؾلملا ًف اضٌأ ةددحم app.config امٌفو نكمٌ ؾٌك ًلٌ نأ ؾلملا ودبٌ app.config

<userSettings>
<MySettingsDemo.MySettings>
<setting name="LastSearchedItem" serializeAs="String">
<value />
</setting>
<setting name="FormSize" serializeAs="String">
<value>400, 400</value>
</setting>
<setting name="FormLocation" serializeAs="String">
<value>0, 0</value>
</setting>
</MySettingsDemo.MySettings>
</userSettings>

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



داذػئ ءبشٔئ
انٌدل هنأ ضرتفنل اهنع ثحبلا مت مٌق رخآ نٌزخت دٌرت تنأو كقٌبطت ًف ثحب قودنص
1 . لحلا ؾشكتسم ًف عورشملا صباصخ ضرعل عورشملا ىلع اجودزم ارقن رقنا
2 . ةحفص رقنا Settings ضرعل تادادعلا ممصم
3 . مسلا لخدأ Name عونلاو Type لاجملاو Scope دادعلل بولطملا
4 . ةمٌقلا لقح ًف Value دأ خ كلذل ةٌضارتفلا ةمٌقلا ل دادعلا


ذٙشٌّا ءاسٚ
ادٌدج ادادعإ ؾٌضت امدنع ؾلملا ًف دٌدج لخدم ةفاضإ متٌ لوأ ةٌفلخلا ًف ءاٌشأ ةدع يرجت تادادعلا ممصم ًف app.config اذه دٌدحتل
دادعلا

<configSections>
<sectionGroup
name="applicationSettings"type="System.Configuration.ApplicationSettingsGroup,
System,
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="MySettingsDemo.MySettings"
type="System.Configuration.ClientSettingsSection, System,
Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</configSections>

هتفاضإ متٌ هسفن تاذ دادعلا ؾٌرعت اٌناث ؾلملل app.config عون ىلع دامتعلاب Type دادعلا مسق ىرت نأ كنكمٌ ثٌح هددحت يذلا
applicationSettings وأ userSettings وأ connectionStrings اهنم دحاو نم رثكأ وأ لاثمك اهددحت ًتلا تادادعلا ىلع ادامتعا :

<userSettings>
<MySettingsDemo.MySettings>
<setting name="LastSearchedItem" serializeAs="String">
<value />
</setting>
<setting name="FormSize" serializeAs="String">
<value>400, 400</value>
</setting>
<setting name="FormLocation" serializeAs="String">
<value>0, 0</value>
</setting>
</MySettingsDemo.MySettings>
</userSettings>
<connectionStrings>
<add name="MySettingsDemo.MySettings.ConnectionString"
connectionString="Server=TABLET; User ID=sa; Password=1234;
Database=Northwind; Persist Security Info=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<applicationSettings>
<MySettingsDemo.MySettings>
<setting name="SMTPServerIP" serializeAs="String">
<value>192.168.2.11</value>
</setting>
<setting name="MyServicesURL" serializeAs="String">
265

<value>http://localhost/MyServices/Service1.asmx</value>
</setting>
</MySettingsDemo.MySettings>
</applicationSettings>

داداذػلٌ يٛطٌٛا
دعب ربع هٌلإ لوصولا كنكمٌ ثٌح هثٌدحتو هتءارقل جاتحنس دادعلا ةفاضإ My.Settings لاثمك

My.Settings.LastSearchedItem

ةقٌرطكو هذهل لوصولل ىرخأ تادادعلا صباصخلا قودنص نم ثٌح مكحتلا صباصخ ىدحإب اهطبر ًه مسق ىلإ لقتنا Data هٌفو
(ApplicationSettings) اهنمو (PropertyBinding) نمو لثم اهطبر دٌرت ًتلا ةٌصاخلل لقتنا كل رهظٌ يذلا قودنصلا Location
راٌتخاب مقو لثم اهل بسانملا طبضلا FormLocation رقنلاب كانه نم دٌدج دادعإ ءاشنإ كنكمٌ ىتح وأ ىلع New طبرلا اذهل ةجٌتنكو
ًلاتلاك ؾلخلا ًف دوك ءاشنإب ممصملا موقٌس

Me.DataBindings.Add(New System.Windows.Forms.Binding("Location",
MySettingsDemo.MySettings.Value, "FormLocation", True,
MySettingsDemo.MySettings.Value.LastSearchedItem, Nothing,
System.Windows.Forms.BindingUpdateMode.OnPropertyChanged))

طبرت امدنع طبض متٌس ثٌح تادادعلا هذه ةباتكو ةءارق لوح قلقلل رطضت نل ةقٌرطلا هذهب تادادعلا متٌ ؾوسو ةجاحلا دنع ةٌصاخلا
نأ ةظحلم كنكمٌو اهرٌٌؽت مت اذإ اٌباقلت اهتمٌق نٌزخت هذه نأ ةظحلم ردجٌ امك دوكلا نم رطس يأ ةباتكل كرارطضا نود متٌ هلك اذه
تادادعلا لثم عٌراشملا عاونأ ضعب ًف اٌباقلت اهنٌزخت متٌ Visual Basic Windows Forms نأ بجٌو ًعدتست ءارجلا Save نم
My.Settings عٌراشم لثم رخلا اهضعب ًف Class Library اذإو طبرلا اذه قٌقحت كنكمٌ طبرلا ةذفان نمض ةجردم رٌؼ ةٌصاخلا تناك
ثٌح دوكلا مادختساب ةٌصاخلا بابسلا ضعبل Size ًهو ةٌبٌرجتلا ةخسنلا ًف اهطبر نكمٌ ةٌصاخك ةرفوتم رٌؼ ةٌباهنلا ةخسنلا ًف ةرفوتم
ةفاضإب طبرلا قٌقحت نكمٌو Binding ةعومجمل دٌدج DataBindings collection لا نمض جذومن ةبفلا مدختست ثٌح Binding مسا دٌدحتل
ةٌصاخلا ةٌصاخلا طبر اننكمٌ لاثمك ثٌدحتلا ةقٌرطو دادعلا مساو Size دادعلاب FormSize لاثملاك اٌودٌ

Me.DataBindings.Add(New System.Windows.Forms.Binding("Size", _
MySettingsDemo.MySettings.Value, _
"FormSize"))

داداذػلا خِذمزٌّا
ةبفلا دٌدحت كنكمٌ كتادادعإ ىلع اٌفاضإ امكحت تدرأ اذإ Class ةبفلا نم اهقتشت نأ بجٌ ًتلاو كب ةصاخلا ApplicationSettingsBase
ةبفلا لكشت ًتلا تابف عٌمجل بلا تادادعلا ةٌصاخلاب اهقبست و ةبفلا هذهل ةٌصاخك دادعإ لك ددحت ثٌح
ApplicationScopedSettingAttribute ةٌصاخلاب وأ قٌبطتلا ىوتسم ىلع تناك اذإ UserScopedSettingAttribute تناك اذإ
ممصم هلعفٌ ام اذهو مدختسملا ىوتسم ىلع ممصملا ةطساوب دلوم دوك نم لاثم اذهو طبضلاب تادادعلا

Partial NotInheritable Class MySettings
Inherits System.Configuration.ApplicationSettingsBase

<System.Diagnostics.DebuggerNonUserCode(), _
System.Configuration.UserScopedSettingAttribute(), _
System.Configuration.DefaultSettingValueAttribute("400, 400")> _
Public Property FormSize() As System.Drawing.Size
Get
Return CType(Me("FormSize"),System.Drawing.Size)
End Get
Set
Me("FormSize") = value
End Set
End Property

<System.Diagnostics.DebuggerNonUserCode(), _
266


System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.Connecti
onString), _
System.Configuration.ApplicationScopedSettingAttribute(), _
System.Configuration.DefaultSettingValueAttribute("Server=TABLET;
User ID=sa; Password=1234; Database=Northwind; Persist Security In"& _
"fo=True")> _
Public ReadOnly Property ConnectionString() As String
Get
Return CType(Me("ConnectionString"),String)
End Get
End Property

<System.Diagnostics.DebuggerNonUserCode(), _
System.Configuration.ApplicationScopedSettingAttribute(), _
System.Configuration.DefaultSettingValueAttribute("192.168.2.11")> _
Public ReadOnly Property SMTPServerIP() As String
Get
Return CType(Me("SMTPServerIP"),String)
End Get
End Property
...

ةظحلم كنكمٌو نأ ـلا ConnectionString ةٌصاخلاب طاحم SpecialSetting ردجت امك تادادعلا ؾلم ًف صاخ مسق اهل نوكٌ ًتلا
ةظحلم Partial class ءزج هنٌمضتو كعورشم ًف دٌدج ؾلم ءاشنإ كنكمٌ هنأ ًنعٌ امم ؾٌرعتلا ةٌادب ًف تابفلا دحأ نم رخآ Class ًف
لٌدعت نود كتادادعإ لٌدعت كنكمٌ ةٌنقتلا هذهبو كعورشم ًتلاو ةبفلا هذه ًف ثادحلل ةجلاعم ةفاضإ كنكمٌو ممصملا ةطساوب ؤشنملا دوكلا
كحنمت هذهب مكحتلا ًف ربكأ ةقد تادادعلا ًه ثادحلا هذهو SettingChanging و SettingsSaving و PropertyChanging

267

ك١جطزٌا ساذحأ Application Events


ـث صبخ بُْ ػششنا Visual Basic 2005

بٓٛنإ لٕطٕهن :

مؾنا فشكزغي ٍي
Solution Explorer شمَا
ٗهػ ًُٙٛٛنا طٔبًنبث
شزخا ىص كػٔششي
Properties خؾفط ٍي ىص
Application سص ظغضا
View Application
Events سشؾًن كهمَ ىزٛف
ٍي ٍكًزر شٛؽ دٕكنا
طبزؾر ٘زنا سذؾنا واذخزعا
ٍي كمٛجطر ٙف ّزغنبؼًن
ْٕ بًك كٛجطزنا ضئبظخ
حسٕظنبث شْبظ




















268

حذؽ ٗهػ سذؽ مكث فٚشؼر ٙهٚ بًٛفٔ

My.Application.Startup Event
شٛٛغر ددسأ ارإ لضًف كٛجطزنا خٚاذث ذُػ بْزٛفُر ذٚشر ٙزنا شيألا ّٛف غضزن كٛجطزنا خٚاذث ذُػ سذؾنا ازْ كهطُٚ شٛؽ
خٛثشؼنا ٗنإ كٛجطزنبث خطبخنا خفبمضنا – ٙنبزنبث بٓٛجش ادٕك وذخزغَ خٚسٕع :

Private Sub MyApplication_Startup(ByVal sender As Object, _
ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
Handles Me.Startup

' ش١١غذ حفامصٌا حطاخٌا ك١ثطرٌات ذٕػ ح٠اذت ك١ثطرٌا
' ًثل ساٙظإ ح٠أ جزفأ
My.Application.ChangeCulture("Ar-Sy")

End Sub

دذؾًنا ٔ e خئفنا ٗنإ شٛشٚ Class StartupEventArgs ك١ثطرٌا ح٠اذت يٛح خاٍِٛؼِ شفٛذ ٟرٌا
ًصِ ضئاظخ جذػ اٌٙٚ Cancel ٚ زذحٌا ءاغٌئت َٛمذ ٟرٌا CommandLine خادذحِ سشّذ ٟرٌا
ك١ثطرٌٍ شِاٚلا شطس command-line arguments شِاٚلا شطس خادذحِ ٍٝػ يٛظحٌا هٕىّ٠ اّو
شِلا َاذخرسات اض٠أ My.Application.CommandLineArgs ك١ثطرٌا ٟف ْاىِ ٞأ ِٓ


My.Application.Shutdown Event
حششبجي كٛجطزنا خٚبَٓ مجل بٓعبزؾر ٙزنا سٕيلا خغنبؼًن ّياذخزعا كُكًٛف كٛجطزنا خٚبَٓ ذُػ سذؾنا ا ازْ كهطُٚ شٛؽ
لبضي :

Private Sub MyApplication_Shutdown(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Shutdown

My.Application.Log.WriteEntry("Application Shut Down.")

End Sub

My.Application.StartupNextInstance Event
ذعإزنا ذٛؽٔ ٌٕكٚ ٌأ عشزفًنا كٛجطزنا ٍي خَٛبص خخغَ مٛغشر لٔبؾر بيذُػ سذؾنا ا ازْ كهطُٚ شٛؽ single-
instance application بٛهؼف ػٕزفي كٛجطزنأ
لبضي :

Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
ByVal e As
Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs)_
Handles Me.StartupNextInstance

Dim inputArgument As String = "/input="
Dim inputName As String = ""
For Each s As String In e.CommandLine
If s.ToLower.StartsWith(inputArgument) Then
inputName = s.Remove(0, inputArgument.Length)
End If
Next
If inputName = "" Then
MsgBox("No input name")
Else
MsgBox("Input name: " & inputName)
End If
269

End Sub

دذؾًنا شٛشٚ شٛؽ e خئفهن StartupNextInstanceEventArgs كٛجطزنا داذعإر لٕؽ دبيٕهؼي ذٛؼر ٙزنا
Application Instancs خٛطبخنا دذؾر شٛؽ BringToForeground ٗنإ كٛجطزهن لٔلا ذعإزنا ممَ تغٚ ٌبك ارإ بًٛف
خٛطبخنا ٔ خٓعإنا CommandLine كٛجطزهن ذٚذغنا ذعإزهن شيألا شطع دادذؾي دذؾر

My.Application.UnhandledException Event
ءبُضزعا كهطُٚ بيذُػ سذؾنا ا ازْ كهطُٚ شٛؽ Exception ءاشعإ ٍي ٍكًززن كٛجطزنا مخاد ّزغنبؼي ىزر ىن كمٛجطر ٙف
ظيبَشجنا ٍي طشخٚٔ ءاشعلا ازْ زفُٚ َّئف خطمُنا ِزٓن ظيبَشجنا زٛفُر سبغي مظٚ بيذُػ َّأ خظؽلي غي ءبُضزعلا ازٓن خغنبؼي
لبضي :

Private Sub MyApplication_UnhandledException(ByVal sender As Object, _
ByVal e As _
Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) _
Handles Me.UnhandledException

My.Application.Log.WriteException(e.Exception, _
TraceEventType.Critical, "Unhandled Exception.")

End Sub

دذؾًنا ٔ e خئفنا ٗنإ شٛشٚ UnhandledExceptionEventArgs خٛطبخنا مضي أطخنا لٕؽ دبيٕهؼي ٕ٘ؾر ٙزنا
Exception خٛطبخنا ٔ أطخنا ٍػ دبيٕهؼي ٕ٘ؾر ٙزنا ExitApplication سٕف كٛجطزنا ءبَٓإ تغٚ ٌبك ارإ بًٛف دذؾر ٙزنا
خٛئاشعلا خٚبَٓ

NetworkChange.NetworkAvailabilityChanged Event
خكجشنا شفإر لٕؽ داشٛٛغر سذؾر بيذُػ سذؾنا ازْ كهطُٚ

Private Sub MyApplication_NetworkAvailabilityChanged(ByVal sender As Object, _
ByVal e As Microsoft.VisualBasic.Devices.NetworkAvailableEventArgs) _
Handles Me.NetworkAvailabilityChanged

MsgBox(e.IsNetworkAvailable.ToString)

End Sub

دذؾًنا شٛشٚ شٛؽ e خئفهن NetworkAvailableEventArgs خٛطبخ بٓنٔ خكجشنا شفإر لٕؽ دبيٕهؼي سشًر ٙزنا
ْٙ حذٛفي IsNetworkAvailable ل وأ حشفإزي خكجشنا مْ خٛمطُي خًٛل ذٛؼر ٙزنا





270

نسّٚٛ٠شفٌا ِٓ خٕ١ؼِ خخغٔ فاذٙزعل ك١جطزٌبث صبخٌا ف٠شؼزٌا فٍِ َاذخزعا خ١ف١و


ام دٌدحتل قٌبطتلاب صاخلا ؾٌرعتلا ؾلم مادختسا كنكمٌ ًتلا تانوكملا نم رثكأ وأ دحاو وأ قٌبطتلا اهٌلع دمتعٌ ًتلا كروومٌرفلا خسن ًه
مقر دٌدحت كٌلع بجوتٌ ثٌح اهمدختسٌ رادصلا مادختساب اهمعد دٌرت ًتلا كروومٌرفلا خسن نم لكل ءانبلا مقرو
< supportedRuntime > وأ < requiredRuntime > قٌبطتلاب صاخلا ؾٌرعتلا ؾلم ًف
ًلٌ امك قٌبطتلا اهٌلع دمتعٌ ًتلا كروومٌرفلا ةخسن مقر دٌدحت متٌ ثٌح :

 اٌباقلت قٌبطتلا لبق نم اهمادختسا متٌس قٌبطتلا لؽشٌس يذلا رتوٌبمكلا ىلع ةدوجوم اهٌلع دمتعٌ ًتلا كروومٌرفلا ةخسن تناك اذإ
 رصنعلا ةمٌق دٌدحتب مقت ملو رتوٌبمكلا كلذ ىلع ةدوجوم كروومٌرفلا ةخسن نكت مل نإو < supportedRuntime > متٌسف
زاهجلا ىلع ةدوجوملا كروومٌرفلا نم ةخسن ثدحأ ىلع قٌبطتلا لٌؽشت
 رصنعلل ةمٌق ىلع يوتحٌ قٌبطتلاب صاخلا ؾٌرعتلا ؾلمو رتوٌبمكلا كلذ ىلع ةدوجوم كروومٌرفلا ةخسن نكت مل نإو
< supportedRuntime > قٌبطتلاف س قٌبطتلاب صاخلا ؾٌرعتلا ؾلم ًف ةددحم كروومٌرفلا نم ةخسن ثدحأ ىلع هلٌؽشت متٌ

ةقحللا لمحٌ نكلو قٌبطتلا مسا سفن هل نوكٌ نأ بجٌ قٌبطتلاب صاخلا ؾٌرعتلا ؾلم نأ ىلإ هابتنلا ردجٌ امك . config لاثملا لٌبس ىلعف
ىمسٌ قٌبطت MyExecutable.exe مساب ؾٌرعت ؾلم هل نوكٌ نأ بجٌ MyExecutable.exe.config
لع وأ اهٌلع هإاشنإ مت ًتلا ةخسنلا سفن ىلع لمعٌل قٌبطتلا ؾٌرعت كنكمٌ ى ىلع هإاشنإ مت قٌبطت لاثملا لٌبس ىلعف ثدحأ ةخسن
كروومٌرفلا 1.0 خسنلا نم يأ ىلع لمعلا هنكمٌ 1.0 وأ 1.1 وأ 2.0 كروومٌرفلا ىلع هإاشنإ مت قٌبطت نكلو اعٌمج اهٌلع وأ 2.0 لمعٌس
كروومٌرفلا ىلع طقف 2.0

نسّٚٛ٠شفٌا فاذٙزعا 1.1
كروومٌرفلا مادختساب ًنب اقٌبطت هجوٌ مسقلا اذه ًف روكذملا ؾٌرعتلا ؾلم مسق 1.0 كروومٌرفلا مدختسٌل 1.1 ةٌلاتلا تلاحلا ًف كلذو :
- كروومٌرفلا تناك اذإ 1.1 ةدوجوم
- كروومٌرفلا ًتخسن اتلك تناك اذإ 1.0 و 1.1 ناتدوجوم
كروومٌرفلا تناك نإو 1.0 عٌس ةدوجوم طقف م كروومٌرفلا نأ ببسب جمانربلا ل 1.0 رصنعلا ىلع ؾرعتت ل < supportedRuntime >
ؾلملا ةسٌورت ًف ةدوجوملا ةخسنلا مدختسٌسو يذٌفنتلا قٌبطتلل

<?xml version ="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v1.1.4322 / ">
</startup>
</configuration>

غّغٌٍّ خح١حظٌا نسّٚٛ٠شفٌا خخغٔ ذ٠ذحر خ١ف١و
مدختسن < supportedRuntime > ةؽٌصب ةداعلا ًف نوكٌ يذلا ؾٌرعتلا ؾلم ًف xml كروومٌرفلا ةخسن ًه ام ةمٌقلا هذه ددحت ثٌح
ةخسنلا ًف ةدمتعم ًهو قٌبطتلا اهٌلع لمعٌ ًتلا 1.1 دعب امو اهتؽٌص نوكتو

271

<supportedRuntime version="runtime version/">

نوكٌ و version مسا لثامت نأ بجٌ ةٌصنلا ةلسلسلا هذهو قٌبطتلا اهٌلع دمتعٌ ًتلا كروومٌرفلا ةخسن ًه ام ددحت ةٌصن ةلسلس نع ةرابع
كروومٌرفلا هٌلع بصنملا دلجملل رذجلا دلجملا ًف دوجوملا دلجملا . دٌدحت متٌ مل اذإو < supportedRuntime > مقر سفن مادختسا متٌسف
هٌلع قٌبطتلا ةمجرت تمت يذلا كروومٌرفلا رادصإ .
مادختسا متٌ < supportedRuntime > كروومٌرفلا للخ نم ةٌنبملا جماربلا ًف طقف 1.1 كروومٌرفلا جماربل ةبسنلاب امأ دعب امو 1.0
مادختسا متٌف < requiredRuntime > اهنع اضوع
قٌبطتلاب صاخلا ؾٌرعتلا ؾلم ًف كلذو قٌبطتلا لبق نم ةموعدملا تارادصلا دٌدحت كنكمٌ ؾبك حضوٌ ًلاتلا لاثملاو

<configuration>
<startup>
<supportedRuntime version="v1.1.4322 / ">
<supportedRuntime version="v1.0.3705 / ">
</startup>
</configuration>


272

خ١ٕمر َاذخزعبث بٕػٚششِ غ٠صٛزث َٛمٔ ف١و Click Once

صشل ٍٝػ ششٌٍٕ خ١عبعلا ششٌٕا داٛطخث َٛمٔ ف١و CD ٚأ DVD
1 . ءاطخلا نم هولخ نم دكؤتو لماكلاب هتبرجتب مقو رٌوطتلا ةبٌبب كعورشم حتفا
2 . ةمباق نم Build رتخا Configuration Manager ددح مث Active Solution Configuration ىلإ Release دق تنك نإ
ةٌباهنلا ةروصلاب هرشن دٌرتو عورشملا رٌوطت نم امامت تٌهتنا
3 . ةمباق نم Build رتخا Publish ProjectName ثٌح ProjectName رشنلا جلاعم كل حتفٌ اهدنع كعورشم مسا وه
Publish Wizard
4 . جلاعملا نم ىلولا ةحفصلا ًف Where do you want to publish the application رشن دٌرت يذلا دلجملا راسم لخدأ
لثم هٌلإ جمانربلا D:\My Program\Publish عبرملا ًف Specify the location to publish this application مل نإو
طؽضا نلا هباشنإ لجأ نم كملعإ متٌ ؾوسف ادوجوم دلجملا كلذ نكٌ Next نم ةٌلاتلا ةحفصلل لاقتنلاو ةعباتملا لجأ نم
جلاعملا
5 . ةحفصلا ًف How Will users install the application جمانربلا بٌصنتب نومدختسملا اهب موقٌس ًتلا ةقٌرطلا دٌدحتب موقن
مادختساب عٌزوتلا يونن اننأ امبو CD وأ DVD راتخن ؾوسف From CD-ROM or DVD-ROM طؽضا مث Next
6 . ةحفصلا ًف Where will the application check for updates راتخنس The application will not check for
updates طؽضا مث Finish
7 . كنكمٌ انهو ىلولا ةوطخلا ًف هدٌدحتب تمق يذلا دلجملا ًف رشنلل ةمزللا تافلملا زٌهجتو عورشملا ةمجرت متٌ ؾوس انهو
صرق ىلإ رشنلا دلجم تاٌوتحم خسنل صارقأ خسن جمانرب يأ مادختسا CD وأ DVD

غ٠صٛزٌا دبفٍِ غِ ظِبٔشجٌا ً١غشزٌ خ٠سٚشؼٌا دبجزىٌّا ٓ١ّؼر بٕٕىّ٠ ف١و
1 . نم Solution Explorer صباصخ حتفا My Project ةحفصل لقتنا مث Publish
2 . رز رقنا Prerequisites راوح قودنص كل حتفٌف Prerequisites
3 . راٌخلا رتخا Download prerequisites from the same location as my application ىلع رشنلا لجأ نم CD وأ
DVD راٌخلا دٌدحت كنكمٌ وأ Download prerequisites from the component vendor's web site يونت تنك اذإ
تافلملا مجح نم للقت كلذبو اهل ةرشانلا تاكرشلا عقوم نم تابتكملا ىلع لوصحلاب دادعلا جمانرب موقٌس اهدنع بٌو ىلع رشنلا
كعقوم ىلع اهعفر متٌس ًتلا
4 . ةمباقلا نم ىرخأ تابتكم ةفاضإ تدرأ نإو اقبسم كعورشم اهٌلع دمتعٌ ًتلا تابتكملا تراتخا دق رٌوطتلا ةبٌب نوكت ماع لكشب
طؽضا مث رشنلا عورشم نمض هنٌمضتل ةبتكملا كلت بناجب عبرملا لخاد ةراشإ عضت نأ ًفكٌ راوحلا قودنص ًف ةدوجوملا OK
5 . لاقملا ةٌادب ًف درو امك امامت عورشملا رشنب موقن مث

خ١فبػئ دبظحلِ
 ةحفص ًف Publish صباصخ ًف My Project رز دجتس Application Files متٌس ًتلا كقٌبطت تافلم ةٌإر نم كنكمٌ
نم اهتٌبثت متٌس نٌأ ؾرعتسو رشنلا دنع اهنٌمضت Publish Status ةمٌقلاف Include و قٌبطتلا دلجم ًف نوكتس Data File
و تاناٌبلا تافلم لجأ نم هإاشنإ متٌس رخآ دلجم ًف نوكتس Exclude جمانربلا عٌزوت متٌ امدنع ؾلملا نٌمضت متٌ نل
 رز نم ةٌفاضلا تاراٌخلا ضعب دٌدحت كنكمٌ Options ةحفص ًف Publish صباصخ ًف My Project راٌخلا لثمف For
CD installations automatically start setup when CD is inserted دلجم ًف تافلملا نمض صاخ ؾلم ءاشنإ ببسٌ
مساو رشانلا مسا دٌدحت لثم ىرخأ تاراٌخو ةرشابم بساحلا ًف صرقلا عضو دنع ةرشابم دادعلا جمانرب لٌؽشتب موقٌ رشنلا
اهرٌؼو جتنملا
 رز ىلع طؽضلا دنعف جلاعملا نم ةٌناثلا ةحفصلا ًف بٌو ىلإ رشنلا راٌتخاب تمق نإ Next اذإ امع كلؤست ةحفص كل رهظتس
ارفوتم جمانربلا نوكٌ نأ تدرأ Online وأ Offline راٌخلا راٌتخا دنع رملا كلذكو اعم نٌنثلا وأ From UNC path or file
share
273

 دٌدحت كٌلع تاراٌخلا هذه دٌدحتلو اٌباقلت جمانربلا ثٌدحتب ماٌقلا نم كٌمدختسم نٌكمتب بؼرت دق بٌو ىلع رشنلا دنع Publish
Version ةحفص نم Publish صباصخ ًف My Project راٌخلا دٌدحت لضفٌو Automatically Increment revision
with each publish كعورشم رشنب اهٌف موقت ةرم لك رشنلا رادصإ مقر رٌٌؽت متٌ ىتح
 رز كانه ةٌباقلتلا تاثٌدحتلا لجأ نمو Updates ًف ةحفص Publish صباصخ ًف My Project تاراٌخلا دٌدحت نم كنكمٌ
تاثٌدحتلا نٌكمت راٌخ دجتس راوحلا قودنص ىلعأ ًفف كعورشمل ةٌباقلتلا ثٌدحتلا ةٌلمعب ةصاخلا The Application should
check for updates قٌبطتلا ءدب دعب وأ لبق تاثٌدحتلا نع ثحبلاب موقٌس له ددحت مث After the application starts وأ
Before the application starts راٌتخا ةلاح ًف ثٌدحتلا نع ثحبلا راركت ةٌفٌكو نمز دٌدحتو After the Application
starts افلتخم ناك نإ ثٌدحتلا عقوم راسم دٌدحتب هٌف موقت ًفاضإ راٌخو قٌبطتلل مزللا ىندلا رادصلا مقر دٌدحتب بؼرت دقو
رشنلا راسم نع
 هدنع دجٌ ل نم Configuration Manager ةمباق حتفا Tools مث Options مث Projects And Solutions راٌتخاب مقو
وه ةطقنلا هذهب قلعتملا راٌخلاو نمٌلا مسقلا ًف تاراٌخلا عٌمج Show Advanced Build Configurations
 ًف قٌبطتلا بٌصنت متٌ ثٌح قٌبطتلا عم دلجملا سفن ًف اهعضو متٌ ل تاناٌبلا ةدعاق نإف لٌمعلا زاهج ىلع جمانربلا بٌصنت دنع
مت يذلا دلجملا ةفرعم بٌصنتلا دعب نكمٌو تاناٌبلاب صاخ دلجم ًف ىرخلا تاناٌبلا تافلم وأ تاناٌبلا ةدعاقو صاخ دلجم
ةمٌقلا رابتخاب هٌف تاناٌبلا تافلم بٌصنت My.Application.Deployment.DataDirectory ةقلح مادختسا ىلإ هابتنلا عم
Try ةفرعم ةمٌقلا هذه نوكت ل ثٌح ىرخأ قرطب جمانربلا رشن لاح ًف ؤطخلا دٌصتل

274

َاذخزعبث هػٚششِ ششٔ SetupWizard

ةقٌرط نع انه ثدحتنس SetupWizard ةخسنلا ىلع قبطنٌ انه حرشلاو كعورشم رشن ًف Professional رٌؼ هنكلو ىرخأ خسن و
ةخسنلا ًف دوجوم Express .
كٌزٌاب لوجٌف ذنم ؾولؤملا لحلاو قٌبطتلا اذهل دادعلا عورشم لمعل تقولا ناح كقٌبطت ةباتك نم ءاهتنلا دعب 2003 جمانرب لمع وه
ـلا قٌرط نع دادعلا SetupWizard ًف ةطٌسبلا تافلتخلا ضعب ىوس اودجٌ نل ةقٌرطلا كلتب لمعلا اوداتعا نٌذلا كبلول ةبسنلابو
ـلا نأ اهنم لمعلا ةقٌرط Crystal Report جمد ةبتكم قٌرط نع هتفاضإ متت دعت مل Merge Module ام قٌرط نع هتفاضإ تحبصأ لب
ـب ىعدٌ prerequisites هل ًلسلستلا مقرلا عضول ةجاح كانه دعٌ ملو
ةمباق نم File رتخا new Project رتخا مث other project types مث setup and deployment عورشملا عون رتخا مث
SetupWizard راٌخ طبضا مث كٌدل دادعلا عورشمل مسا ددح مث solution ىلإ Add to solution طؽضا مث OK جلاعملا ءدبل

275

طؽضا next اٌبدبم مدختسنس زودنٌو قٌبطت روطن اننأ امبو جلاعملل ةٌقٌقحلا ةٌادبلا ًه ًتلا ةٌناثلا ةحفصلل لصنل ىلولا ةحفصلا ًف
ةروصلا ًف ةحضوملا تاراٌخلا .
طؽضا مث عورشملا ًف هنٌمضت دٌرت يذلا بسانملا جرخلا عون دٌدحت اهٌف كنكمٌ ًتلا ةٌلاتلا ةحفصلل لقتنا مث كبسانٌ امك كتاراٌخ ددح
next رز ىلإ طؽضلا كنكمٌ ًهتنت امدنع مث عورشملل اهتفاضإب بؼرت ًتلا ةٌفاضلا تافلملا نٌمضتب ةصاخ ةحفص كل رهظتف next
رز ىلع طؽضلا كنكمٌ اهنم دكؤتلا دعبو جلاعملا نم اهتددح ًتلا كتاراٌخ كل ضرعت ًتلاو جلاعملا نم ةرٌخلا ةحفصلل لاقتنلل finish
ةٌادبك تافلملا ماظن ؾشكتسم حتفب هباهتنا دعب جلاعملا موقٌسو كب صاخلا دادعلا عورشم ءاشنإب موقٌ ثٌح جلاعملا ءاهنل

276

 جمانربلا دلجم ءاشنإ
جمانربلاب ةصاخلا تاراصتخلاو : نم
ةحفص File System رقنا كمامأ ةرهاظلا
ىلع user's Desktop عٌطتسن ىتح
بتكملا حطس ىلع جمانربلل راصتخا ةفاضإ
كقٌبطت مدختسم رتوٌبمك ىلع
ةحاسملا ًف ًنٌمٌلا ةرؤفلا رزب نلا رقنا
بناجب رٌبكلا مسقلا ًف ةؼرافلا File
system رقناو Create New Shortcut
رقنا كل رهظٌ يذلا راوحلا قودنص نم مث
ىلع اجودزم ارقن Application Folder
طؽضاو عورشملل ًسٌبرلا جرخلا رتخا مث
Ok نلا كنكمٌو كل راصتخلا ءاشنإ متٌف
ةنوقٌأ دٌدحتلو دٌرت امك راصتخلا ةٌمست
رتخا دٌدجلا راصتخلل icon ةذفان نم
رتخاو دٌدجلا راصتخلا صباصخ
browse مث browse راوحلا قودنص نم
ءاشنإ دنع انلعف امك مث كل رهظٌ يذلا
ىلع اجودزم ارقن رقنا راصتخلا
Application Folder نم رتخا مث Files
of Type عونلا exe اجودزم ارقن رقنا مث
راٌتخا متٌف عورشملل ًسٌبرلا جرخلا ىلع
طؽضا مث عورشملل يذٌفنتلا ؾلملا لخادب ةنوقٌلا OK ةنوقٌأ راٌتخا كنكمٌ امك
ؾلم نم ico ةٌفاضلا تافلملا دٌدحت دنع ًفاضإ ؾلمك هتفاضإب تمق اذإ
عورشملل
 أدبا ةمئاق تانوقيأو دلجم ةفاضإ : ىلع ًنٌمٌلا ةرؤفلا رزب رقن
User's program menu مث Add Folder ًتلا تاراصتخلا اشنأ مث
ًتلا ةقٌرطلا سفنب كلذو وتلل هباشنإب تمق يذلا دلجملا نمض اهجاتحت
بتكملا حطس ىلع راصتخلا ءاشنل اهانمدختسا راصتخا ةفاضإ نكمٌ ثٌح
ؾلم وأ مدختسملا لٌلد يوتحٌ ؾلمل كلذكو كعورشمل يذٌفنتلا ؾلملل
هل راصتخا ةفاضإ جاتحت نأ نكمٌ امم اٌأ وأ قٌبطتلاب صاخلا ةدعاسملا
 رشنلا عورشم تارايخ ديدحت رتخا properties رشنلا عورشمل
ًف اهدٌدحت مت اهمهأو عورشملا تاراٌخل ةبسانلا مٌقلا ددحو هٌلع لمعن يذلا
ةروصلا
 ةفاضإ ىلإ جاتحت ام ةبتكم وأ امكحت تمدختسا دق نوكت امبر
Merge Module رزب رقنلاب كلذو ةلوهسب اهتفاضإ نكمٌ ثٌح عورشملا ىلإ
راٌتخاو دادعلا عورشم ىلع عورشملا ؾشكتسم ًف ًنٌمٌلا ةرؤفلا merge
module نم Add موقٌ ًتلا جمدلا تابتكمل ًضارتفلا راسملا نوكٌ ثٌح
وه اهعضوب وٌدوتس لوجٌف
 C:\Program Files\Common Files\Merge Modules
 كتبتكم وأ كمكحت نوكٌ دق رخآ ناكم يأ ىلإ ضارعتسلا كنكمٌ وأ
هٌف هب ةصاخلا جمدلا ةبتكم عضو دق

277

 رتخا مث كب ةصاخلا رشنلا عورشم ىلع ًنٌمٌلا ةرؤفلا رزب رقنا نلا Properties دٌدحت نم كنكمٌ راوح قودنص كل رهظٌل
نٌأ نم تاراٌخ دٌدحت وأ كعورشمل اهتمدختسا ةٌرورض تابتكم ةفاضإ تدرأ اذإو كب صاخلا دادعلا عورشمل ةٌفاضإ صباصخ
هذه ىلع كقٌبطت مدختسم لصحٌس سضنا ٗهػ ظغضا بْذُػ دبجزكًنا prerequisites طؽضا مث كبسانت ًتلا تاراٌخلا دٌدحتب مقو
Ok مث Ok























278






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




















279

ششػ ٞدبحٌا ُغمٌا - دبٔب١جٌا ذػاٛل



ةٌلاتلا عٌضاوملا مضٌو :
 امدنع لصتت ـب SQl Server 2005 ًناعت نم لوط ةرتف لاصتلا
 ؾٌك ؾٌضت كتاءارجإ ةصاخلا ىلإ SQL Server
 ؾٌك موقن لٌدبتلاب نٌب تارادصإ لوكٌس رفرٌس 2008 ةفلتخملا
 ءاشنإ ةدعاق تاناٌب سسكأ نم لخاد لوجٌف كٌزٌاب تود تن

280

ـث ًظزر بِذٕػ SQl Server 2005 يبظرلا حشزف يٛؽ ِٓ ٟٔبؼر

حش٘بظٌا
ـل تاناٌبلا دعاوق كرحمـب لاصتلاب موقت امدنع Microsoft SQL Server 2005 تدتعا امم لوطأ لاصتا تقو نم ًناعت امبر
ًف هٌلع SQL Server 2000 ةٌلاتلا طورشلا كٌدل رفاوتت امدنع ثدحٌ اذهو :
 مادختسا MDAC 2.8 مدقأ وأ
 لوكوتوربلا TCP/IP ـلا ًف لعفم رٌؼ SQL Server 2005
 ةكرتشملا ةركاذلا لوكوتورب shared memory protocol لؽشٌ يذلا رتوٌبمكلا ًفو لٌمعلا رتوٌبمكلا ًف لعفم
SQL Server 2005

تجغٌا
ةكرتشملا ةركاذلا لوكوتورب shared memory protocol ًف مدختسٌ يذلا MDAC ركاذلا لوكوترب عم قفاوتم رٌؼ ة
ًف ةكرتشملا SQL Server 2005 ـب لاصتلا لٌمعلا رتوٌبمكلا لواحٌ امدنعو SQL Server 2005 ةكرتشملا ةركاذلا لوكوتورب مادختساب
لوكوتوربلا ىلإ لاقتنلاب ةرشابم لٌمعلا رتوٌبمكلا موقٌ TCP/IP لوكوتوربلا نأ امبو لاصتلاب ماٌقلا لجأ نم TCP/IP لصحٌ لعفم رٌؼ
اهدنع رٌخؤتلا . لوكوتوربلا ربع لاصتلا ةلواحمب لٌمعلا رتوٌبمكلا موقٌ ثٌح TCP/IP ربع لاصتلاب موقٌ مث ةٌناثلا ًلاوحل named pipe
protocol رفوٌ و SQL Server 2005 لاصتا named pipe protocol ًف ةلعفم ةكرتشملا ةركاذلا تناك اذإ ًلحملا لٌمعلل SQL
Server 2005

ًحٌا
ةلكشملا هذه ىلع بلؽتلل ةٌلاتلا قرطلا ىدحإ مادختسا كنكمٌ :

ٌٝٚلا خم٠شطٌا
لٌمع حتفا SQL Server Native Client ـب لاصتلل SQL Server نع اضوع MDAC

خ١ٔبضٌا خم٠شطٌا
لوكوتوربلا لٌعفتب مق TCP/IP ًف SQL Server 2005 ةٌلاتلا تاوطخلا عبتا كلذب ماٌقللو :
1 . حتفا SQL Server Configuration Manager
2 . عسو SQL Server 2005 Network Configuration
3 . ىلع رقنا Protocols for SQLInstanceName ثٌح SQLInstanceName مسا وه SQL Server 2005 كٌدل
4 . لوكوتوربلا لعف TCP/IP

خضٌبضٌا خم٠شطٌا
راعتسم مسا اشنأ لٌمعلا رتوٌبمكلا ىلع Alias ـل ةلٌمعلا تارتوٌبمكلـل SQL Server 2005 ًف
SQL Server Configuration Manager دٌدحتب مق مث named pipe protocol راعتسملا مسلا اذهل صاخ :
1 . حتفا SQL Server Configuration Manager
2 . عسو SQL Native Client Configuration
281

3 . ىلع رقنا Alias رقنا مث New Alias
4 . لوكوتوربلا راٌخ ًف Protocol ددح Named Pipes ـل ةبسانملا تامولعملا لخدأو Alias Name و Pipe Name و Server

 ةكرتشملا ةركاذلا لوكوتورب لٌعفت ؾاقٌإب مق ةبرجتلا نم ةٌفاضإ ةحٌصن shared memory protocol

282

ف١و ف١ؼر هراءاشعئ خطبخٌا ٌٝئ SQL Server

موقؤس حرشب لاثملا انه ىلع ـلا SQL Server Express ىتح عٌطتسٌ عٌمجلا ةعباتملا
لوأ - كانه افٌرعت ارٌؽص ًف SQL Server انٌلع هلمع ىتح لمعٌ لاثملا
 حتفا نم ةمباق أدبا نم دلجم SQL Server دنبلا SQL Server 2005 Surface Area Configuration مث رتخا Surface
Area Configuration for Features مث نم ةحفص CLR Integration رتخا راٌخلا Enable CLR Integration مث رتخا OK
لضفٌو ةداعإ لٌؽشت زاهجلا وأ ةداعإ لٌؽشت SQL Server
 اشنأ اعورشم ادٌدج نم عون Class Library همسو TestExtend نإ تنك دٌرت ةعباتملا ًعم سفنب تاٌمستلا
 ةظحلم : نوكٌس دوكلا ىلع VB .net نكمٌو ًجمربمل # C ةعباتملا ثٌح نوكٌس لمعلا تاذ هسفن دعب لٌوحت داوكلا ةطٌسبلا
ًتلا اهمدختسنس انه ىلإ # C عم هابتنلا ىلإ نأ Shared ًف VB افاكت Static ًف # C دنع ؾٌرعت ءارجلا
 لعجا ررحم دوكلا كٌدل صاخلاو ةبتكملاب ًتلا موقت اهباشنإب دوكلاك ًلاتلا
Imports System.Data.SqlTypes

Public Class TestClass

Public Shared Function Triple(ByVal TrNum As SqlInt32) As SqlInt32
Return TrNum * 3
End Function

Public Shared Function sFactorial(ByVal Tn As SqlDouble) As SqlDouble
Dim Res As SqlDouble = 1
For i As SqlDouble = Tn To 1 Step -1
Res *= i
Next
Return Res
End Function
End Class

ظحلٌ انه لامعتسا ةملكلا Shared ًف ؾٌرعت تاءارجلا ًتلا اهمدختسنس كلذو ىتح عٌطتسن اهتفاضإ اقحل ةدعاقل تاناٌبلا انه مدختسن
static functions نلا طقف مق لمعب Build عورشملل مث مق خسنب ؾلملا TestExtend.dll جتانلا ىلإ دلجملا :\ D اذإ تنك بؼرت ةعباتملاب
ًعم اٌفرح وأ ىلإ يأ دلجم رخآ هدٌرت عم ةاعارم لٌدعت راسملا ًف داوكلا ةٌلاتلا دنع دارٌتسا ةبتكملا لخادل ةدعاق تاناٌبلا
 بهذإ ىلإ ررحم رماوأ سودلا و لؽش SQLCmd امك ًلٌ
SQLCMD -S .\SQLEXPRESS
ىلعو يزاهج رملا SQLcmd دوجوم ًف راسملا
C:\Program Files\Microsoft SQL Server\90\Tools\Binn
ةٌقب لمعلا نوكٌس نم نمض SQLCmd انهو قرفل نٌب VB و # C انلقتنا نلا رماول SQL Server
 موقنس ءاشنإب ةدعاق تاناٌب ةبرجتلل - لخدأ نٌرطسلا نٌٌلاتلا دنع هجوملا
create database SamerTest
GO
 مث موقنس رٌٌؽتب ةدعاق تاناٌبلا ةمدختسملا ىلإ ةدعاق تاناٌبلا ةدٌدجلا
use SamerTest
GO
283

 نلا موقنس ةفاضإب ةبتكملا ًتلا انمق اهباشنإب ىلإ ةدعاق تاناٌبلا ًلاتلاك عم ةظحلم ةقدلا ًف ةلاح ؾرحلا انه ىتح ول
تنك تمدختسا VB . net ءاشنل ةبتكملا
create assembly TestExtend
from 'D:\TestExtend.dll '
with PERMISSION_SET = SAFE
GO
ثٌح موقٌ SQL Server نٌزختب ةبتكملا TestExtend.dll نمض ةدعاق تاناٌبلا نلو ىقبٌ ةجاح دوجول انتبتكم ىلع صرقلا بلصلا لإ
ىلع لٌبس طاٌتحلا و ددحن تاٌحلصلا ةصاخلا ةبتكملاب اهنؤب ةنمآ ةطساوب راٌخلا PERMISSION_SET = SAFE
 نلا موقنس دارٌتساب تاءارج
ٌ
لا ةدوجوملا نمض ةبتكملا ىلإ SQL Server ىتح عٌطتسن اهمادختسا
create function sFactorial
(@Tn Float) RETURNS Float
as external name TestExtend.[TestExtend.TestClass].sFactorial
go

create function Triple
(@tn int) returns int
as external name TestExtend.[TestExtend.TestClass].Triple
go
دوكلا موقٌ ءاشنإب ءارجإ مدختسٌ دوك ءارجلا دوجوملا ًف ةبتكملا ثٌح ؾرعن مسا ءارجلا create function sFactorial
مث موقن دٌدحتب تاددحم لخدلا طبضلاب امك اهانفرع ًف انتبتكم @ tn float مث ددحن عون جرخلا returns float مث ددحن راسم ءارجلا ًف
انتبتكم as external name TestExtend.[TestExtend.TestClass].sFactorial
 نلا دعبو انتفاضإ ةبتكملا تاءارجلاو ةدعاقل تاناٌبلا ًقب نأ موقن اهبٌرجتب - مدختسا دوكلا ًلاتلا ءانبل لوادجلا
ةٌبٌرجتلا
create table Test(Tn int)
GO
insert into acctest values(15)
insert into acctest values(25)
insert into acctest values(50)
insert into acctest values(40)
insert into acctest values(70)
GO

284

create table AccTest(Amount int,Interest int, Days Int)
GO
insert into acctest values(150000,5,95)
insert into acctest values(250000,5,95)
insert into acctest values(50000,4,105)
insert into acctest values(2500000,3,180)
insert into acctest values(25000,7,73)
GO
 مدختسا تاملعتسا ةهٌبش ًلاتلاب رظناو ؾٌك لمعت انتاءارجإ نمض ةقلع Select امامت تاءارجلاك ةدوجوملا اقباس
نمض SQL Server
SELECT Tn, DBO.Triple(Tn) from Test
GO

SELECT Tn, DBO.Triple(Tn), sFactorial(Tn) from Test
GO
ل قلؽت SQLCmd انلزام هتجاحب
 نلا عجرا حتفاو عورشم ةبتكملا ًتلا اهانؤشنأ اقباس ؾضأو اهٌلإ ءارجلا ًلاتلا مث لمعا Build ةبتكملل دعب ةفاضإ
ءارجلا
Public Shared Function sInterest(ByVal Value As SqlInt32, _
ByVal Interest As SqlInt32, ByVal Days As SqlInt32) As SqlInt32

Return CType(((Value * Interest * Days) / 36500), SqlInt32)

End Function

 مدختسا ؾلم ةبتكملا ثدحملا ثٌدحتل ةخسنلا ةدوجوملا نمض ةدعاق تاناٌبلا ًلاتلاك كلذو نم نمض SQLCmd
alter assembly TestExtend
from 'D:\TestExtend.dll '
with PERMISSION_SET = SAFE
GO
ثٌح موقٌ دوكلا قباسلا لٌمحتب ةخسنلا ةدٌدجلا نم ةبتكملا ناكم ةخسنلا ةمٌدقلا ًف ةدعاق تاناٌبلا
 نلا ؾضأ ءارجلا دٌدجلا ىتح همدختسن
create function sInterest
(@Value int, @Interest int, @days int) returns int
as external name TestExtend.[TestExtend.TestClass].sInterest
285

go
 مدختسا املعتسا اهٌبش ًلاتلاب ةبرجتل ءارجلا دٌدجلا
select amount, dbo.sInterest(amount,interest,days) as DueInterest,
dbo.Triple(dbo.sInterest(amount,interest,days)) as TripleDue
from acctest
go
 اذإ تدرأ ؾذح ءارجإ كنكمٌ كلذ ةطاسبب
DROP FUNCTION sInterest
GO
 اذإو تدرأ ؾذح ةبتكملا اهلماكب موقن لوأ ؾذحب عٌمج تاءارجلا ةطبترملا اهب مث مدختسن دوكلا
DROP ASSEMBLY TestExtend
GO
 اذإو تدرأ مادختسا كلت تاءارجلا نم لخاد دوك كجمانرب : ؾضأ ةدعاق تاناٌبلا كعورشمل مقو ءاشنإب لاصتلا و ـلا
Dtatset قرطلاب ةٌداٌتعلا - دكؤت نم دارٌتسا Functions نمض ـلا Dataset
 ًف ررحم دوكلا ؾضأ دارٌتسلا ًلاتلا لبق لك اش
Imports System.Data.SqlTypes
 مدختسا ءارجإ اهٌبش ًلاتلاب ملعتسلل نمض دوكلا كلذو ضارتفاب نأ جذومنلا يوحٌ ListBox ددع نانثا رزو رماوأ
يوحٌ مادختساب كلذو ًلاتلا دوكلا ةقٌرطلا ةٌداٌتعلا ذٌفنتل رمأ Select نم نمض دوكلا ثٌح كنكمٌ ةظحلم مادختسا رماوأ
لٌدعت تاٌحلص مدختسملا ًلاحلا ىلع SQL Server لبق ذٌفنت ةلمج ملعتسلا
Me.ListBox1.Items.Clear()
Me.ListBox2.Items.Clear()

Try
Using MoCon As New SqlConnection(My.Settings.TestConnectionString)
Dim MoCmd As New SqlCommand
Dim MoReader As SqlDataReader

MoCmd.CommandText = "sp_configure 'clr enabled', 1;"

MoCmd.CommandType = CommandType.Text
MoCmd.Connection = MoCon

MoCmd.Connection.Open()

MoCmd.ExecuteNonQuery()

MoCmd.CommandText = "RECONFIGURE;"
MoCmd.ExecuteNonQuery()

MoCmd.CommandText = "SELECT Tn, DBO.TRIPLE(Tn) AS TRIP FROM TEST"

MoReader = MoCmd.ExecuteReader

If MoReader.HasRows = True Then
While MoReader.Read
286

Me.ListBox1.Items.Add(MoReader.Item("Tn").ToString)
Me.ListBox2.Items.Add(MoReader.Item("TRIP").ToString)
End While
End If
MoCmd.Connection.Close()
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try


287

شفش١ع يٛى١ع داساذطئ ٓ١ث ً٠ذجزٌبث َٛمٔ ف١و 2008 خفٍزخٌّا

رفرٌس لوكٌس ةخسن نم ةٌقرتلاب كماٌق دنع اهلمعل جاتحت ةٌفاضإ ةوطخ دجوت ةقٌقحلا ًف 2008 نم ةٌقرتلاب موقت امدنع لثمف ىرخأ ىلإ
ةخسن Express ةخسن ىلإ Express With Tools رادصلا ةٌقرتب ةٌفاضلا ةوطخلا هذه ىعدت Edition Upgrade اناٌحأو SKU
Upgrade ةفلتخم ةخسن ىلإ ةدوجوم ةخسن نم ةٌقرتلا دٌرت امدنع نٌترم بٌصنتلا جلاعم لٌؽشتل جاتحتس ةجٌتنلابو

هٌر ًّؼٌ طبزحٔ اربٌّ
ىلإ ةخسن نم ةٌقرتلا دٌرت امدنعو كزاهج ًف اٌلاح ةدوجوملا ةخسنلا ىلع ةٌنبم اهارت ًتلا اٌازملا ةرجش نأ ًه ةٌساسلا ةطقنلا
ةدٌدجلا ةرادصلا نمضتتل تامولعملا كلت ثٌدحت كٌلع اذهل ةجٌتنو ةمٌدقلا ةرادصلاب ةقلعتم زاهجلا ىلع ةدوجوملا تامولعملا نوكت ىرخأ
ةدٌدجلا ةخسنلاب ةقلعتملا ةدٌدجلا صباصخلا ةفاضإ عٌطتست نأ لبق .
تارادصلا ًمدختسمل ةبسنلاب ربكأ لكشب ثدحت اهنكلو ردان ثدح ةماعلا ةخسنلا ةٌقرت ةٌلمع نوكتو Express دق نوكت بلؼلا ىلع هنا امب
لثم لامتكا رثكلا ىرخلا خسنلا نم ةزٌم ةفاضإ دٌرتو طقف ةٌساسلا ةخسنلا ىلع انمضتم نوكٌ يذلا وٌدوتس لوجٌف لثم رخآ اجتنم تبصن
Express with tools

ًؼفٔ ْأ بٕ١ٍػ اربِ
رادصلا ةٌقرت Edition Upgrade ةخسنلاب صاخلا جتنملا حاتفم لاخدإب اهٌف موقت ًتلا بٌصنتلا جلاعم ربع ىرخأ ةرٌسم ةقٌقحلا ًف ًه
خسنلا عٌمج نأ امبو ةعوفدملا ةخسنلا ىلإ لقتنت امدنع ةدٌدجلا Express لٌزنت ًه ةقٌقح ةوطخلا هذه نوكت اقبسم لخدم جتنم حاتفم كلتمت
نٌترم اهربع رورملاو بلصلا كصرق ىلإ ةمزحلا كلت .
ةفلتخم ةخسن ىلإ ةٌقرتلا راٌخ راتخت نأ كٌلع ةمزحلا لٌؽشتب موقت امدنع ىلولا ةرملا ًف upgrade to a different edition اذهو
خسنلا ةلاح ًفو دٌدجلا جتنملا حاتفم لاخدل راٌخلا كٌطعتو تاصوحفلا نم ةعومجم ربع رمٌس Express جتنملا حاتفم لاخدل رطضت نل
ةدوجوم ةخسنل اٌازم ةفاضإ راٌتخا كٌلع ةرملا هذهو ىرخأ ةرم بٌصنتلا جلاعم لٌؽشت كٌلع ةخسنلا ةٌقرت نم ًهتنت املاحو Add
Features to an existing Instance يازملاب ةمباق كل ضرعت ًتلا اٌازملا ةرجشل لصت ىتح جلاعم تاحفص ةدع ربع رمتسو ا ةرفوتملا
ةدٌدجلا ةرادصلا عم

ٛ٘ بِ ءبٕضزعا بِٚد نبٕ٘
ةخسن نٌب رادصلا ةٌقرت ةوطخ ًطخت كنكمأ ةلاح ًفف ءانثتسا امباد كانه معن SQL Express With Tools ةخسنلا و SQL
Express With Advanced Services ةخسنلا بٌصنتب تمق دق تنك اذإ with tools ةخسنلا نم اٌازم ةفاضإ دٌرتو افلس Advanced
Services اٌازم ةفاضإ ىلإ ةرشابم باهذلا كنكمٌ Add Feature رادصلا ةٌقرت ًطختو .
كتخسن ةٌقرت دٌرت امدنع روملا تحضوأ دق روطسلا هذه نوكت نأ اٌجار

288

ششػ ٟٔبضٌا ُغمٌا - خ١ِبظٌٕا ش١ثبؼزٌا



ةٌلاتلا عٌضاوملا مضٌو :
 ثحبلا نع تاملكلا صوصنلاو ةسبتقملا
 ققحتلا نم لسلسلا ةٌصنلا ماقرلاو خٌراوتلاو
 رٌباعت ةٌماظن ةعباش ةزهاج مادختسلل

289

خغجزمٌّا صٛظٌٕاٚ دبٍّىٌا ٓػ شحجٌا

ةٌماظنلا رٌباعتلل ةعباشلا تاٌلمعلا ىدحإ Regular Expressions طسبأ ربتعت ًهو تاملك ىلإ ةلٌوط ةٌصن ةلسلس مٌسقت ًه
ةٌماظنلا رٌباعتلا مادختساب اهب موقت نأ نكمٌ ةٌلمع

Dim text As String = "A word with àccéntèd vowels, and the 123 number."
Dim pattern As String
pattern = "\w+"
For Each m As Match In Regex.Matches(text, pattern)
Console.WriteLine(m.Value)
Next

ةعومجم ًف تاطرشو ماقرأ ىلع يوتحٌ هنا ًف طسبملا لاثملا اذه ًف ةلكشملاو Collection ةلواحملا نوكتسو كلذب بؼرت ل دقو جباتنلا
لكشلا ىلع لضفلا

pattern = "\w+"

ةددشم ؾورح ىلع يوتحت تناك اذإ ةلماك تاملكلا ةفاضإب لشفٌس هنكلو لضفأ لكشب لمعٌس اذهو accented characters نم ؾورح وأ
مادختساب ةلكشملا هذه لحت نأ كنكمٌ كروومٌرفلا نم ةقباسلا خسنلا تحتو لثم ةٌنانوٌلاك ىرخأ تاؽل \p ؾراحم مادختسا نم كنكمٌ يذلاو
لاثملا لٌبس ىلعف دوكٌنوٌ \p{Ll} امنٌب رٌؽص ؾرحم يأ لثمٌ \p{Lu} ًلاتلاك ةلكشملا لح نوكٌ كلذبو رٌبك ؾرحم يأ لثمٌ

pattern = "(\p{Lu}|\p{Ll})+"

كروومٌرفلا ًف ؾراحملا تابف حرط ةزٌم مٌدقت مت 2.0 تاطرشلاو ماقرلا حرط كنكمٌ هنأ ةقٌقح ىلع ادمتعم ةلكشملا هذهل ادٌدج لح مدقتل
ةطساوب اهنع ربعملا ؾراحملا لاجم نم \w

pattern = "[\w-[0-9_]]+"

لثم ءاضوضلا تاملك طاقسا دٌرت ام ابلاؼ تاملكلا جرختست امدنعو The و a و an نمض تاملكلا هذه طاقسا كنكمٌ ثٌح كلذ لثم امو
ةقلح For … Each مهنم صلختلاب موقتل ةٌماظنلا رٌباعتلا كرت وه ةقانأ رثكلا نكلو

pattern = "\b(?!(the|a|an|and|or|on|of|with)\b)\w+"
text = "A fox and another animal on the lawn"
For Each m As Match In Regex.Matches(text, pattern, RegexOptions.IgnoreCase)
Console.Write("{0} ", m.Value) ' => fox another animal lawn
Next
1

رٌبعتلا \w رٌبعتلا امنٌب ةملك نع ثحبن اننأ ددحٌ قباسلا لاثملا ًف (?!...]b) ءاضوضلا تاملك دحأ يوتحت ل نأ بجٌ ةجٌتنلا نأ ددحٌ
جذومنلا نأ ًه ةقانؤب ةجٌتنلا نوكت كلذبو pattern ءاضوضلا ةمباق ًف ةدوجوملا كلت ادع تاملكلا عٌمج قباطٌس .
سبتقم صن ربتعت نأ دٌرت امدنع ًهو ةعباش ىرخأ ةلكشم Quoted ربع هرٌرمت متٌ رمأ ةجلاعمب موقت امدنع لثمك كلذو ةدحاو ةملكك
ةجودزم وأ ةدرفم سابتقا تاملع نمض نمضم صن وأ ةدرفم ةملك قباطٌ اٌماظن ارٌبعت مدختسٌ ًلاتلا لاثملاو رماولا رطس

' For simplicity's sake, use \w+ to match an individual word.
pattern = "(?<q>[""']).*?\k<q>|\w+"

نأ ظحل ؟*. قلؼلل سابتقلا تاملع قباطت ل امنٌب سابتقلا تاملع نٌب ؾرحم يأ قباطت ثٌحب ةلوسك ةقباطم لمعب موقت
290


لودج لكشٌ نأ نكمٌ ثٌح ًصن ؾلم ًف ةدوجوملا تاملكلا عٌمجب سوماق لمع دٌرت امدمع لثم ةدٌرف تاملك جارختساب اناٌحأ بؼرت امبر
شاه Hashtable نلا ىتح اهداجٌإ مت ًتلا تاملكلا ركذتل لح

Dim text As String = "one two three two zone four three"
Dim re As New Regex("\w+")
Dim words As New Hashtable()
For Each m As Match In re.Matches(text)
If Not words.Contains(m.Value) Then
Console.Write("{0} ", m.Value)
words.Add(m.Value, Nothing)
End If
Next

ةٌماظنلا تارٌبعتلا مادختساب كلذ قٌقحت كنكمٌ رخآ لكشبو

pattern = "(?<word>\b\w+\b)(?!.+\b\k<word>\b)"
For Each m As Match In Regex.Matches(text, pattern)
Console.Write(m.Value & " ")
Next

رٌبعتلا (?<word>]b]w+]b) ماقرأو ؾراحم ةلسلس قباطٌ (\w) ةملكلا دودح ىلع (\b) مسلا قاٌسلا اذه ًف ددحتو "word"
بٌكرتلاو (?!) اقباس اهداجٌإ مت ةملك قباطتل نأ بجٌ ةملكلا نأ ًنعٌ ) ًفلخلا عجرملا \k<word> ( ىرخأ ؾراحم كانه تناك اذإ ىتحو
لسلستلاب ةلثمم ؾصتنملا ًف .+ سفن رخآ دوروب ةعوبتم نوكتل نأ ثٌحب صنلا ًف ةملك يأ قباط ًماظنلا رٌبعتلا ًنعٌ حضاو رٌبعتبو
تاملكلا ةفاك داجٌإ متٌس اذهبو ةرركملا ةملكلل دورو رخآ وأ ةقٌثولا ًف دحاو دورو اهل ًتلا تاملكلا ىلع لصحا رثكأ ةطاسبب وأ ةملكلا
ةحٌحص ةروصب ةدٌرفلا
ؾراحملا نأ ظحل \b ــف ةٌبزجلا تاقباطملا عنمت ةٌماظنلا تارٌبعتلا ًف one قباطتل zone داجٌإ كنكمٌ لٌلق ؾلتخم ًماظن رٌبعتبو
ةقٌثولا ًف ةرركملا تاملكلا

pattern = "(?<word>\b\w+\b)(?=.+\b\k<word>\b)"

نأ ثٌح (?=) رٌبعتلا نإف ةقٌنأ ةٌماظنلا تارٌبعتلا تاٌنقت نأ عمو اهل رخآ دوروب ةعوبتم نوكت نأ بجٌ ةقباطملا ةملكلا نأ ًنعٌ (?=)
تارٌبعنلا مادختسا نوكٌس ؾرح نوٌلم ًلاوح ىلع يوتحٌ ًصن ردصم ةجلاعم دنع لثمف اٌبسن ةإفك رٌؼ اهلعجٌ ماملل رظنلاب صاخلا
ًلاوحب ؤطبأ ةٌماظنلا 8 شاه لودج مدختست ًتلا ةٌنقتلا نم تارم hashtable اقباس اهداجٌإ مت ًتلا تاملكلا نع لجسب ظفتحٌ ًكل دعاسم
نم نٌبٌرق امهداجٌإ بجٌ نٌصن نع ثحبت امدنع كلذو ًبٌرقتلا ثحبلا وه انه هنع ثدحتن نأ نكمٌ تاملكلا نع ثحبلا نم رٌخأ عون
ددع نم رثكأ نوكٌل ثٌحب ردصملا صنلا ًف امهضعب N صنلا لاثملا لٌبس ىلعف امهنٌب لصفٌ تاملكلا نم "one two three two
zone four three" تاملكلل ًبٌرقتلا ثحبلاف ردصملا وه "one" و "four" ددعلاو N يواسم 4 ناك اذإ لشفٌ ؾوس امنٌب حاجنب متٌس
ددعلا N ـل يواسم 3 لاثملاك ةطاسبب ثحبلا جذومن نوكٌ نأ نكمٌو

pattern = "\bone(\W+\w+){0,4}\W+\bfour\b"
If Regex.IsMatch(text, pattern, RegexOptions.IgnoreCase) Then
' At least one occurrence of the words "one" and "four"
' with four or fewer words between them.
End If

ةلاد ددحت نأ نكمٌو function تاقباطم ةعومجم لكشب جرخ دٌعتو امهنٌب ةٌمظعلا ةفاسملا لثمٌ مقرو ناتملكو لخدمك ةٌصن ةلسلس ذخؤت
MatchCollection

291

Function ProximityMatches(ByVal text As String, ByVal word1 As String, _
ByVal word2 As String, ByVal maxDistance As Integer) As MatchCollection

Dim pattern As String = "\b" & word1 & "(\W+\w+){0," &
maxDistance.ToString() _
& "}\" & "W+\b" & word2 & "\b"
Dim re As New Regex(pattern, RegexOptions.IgnoreCase)
Return re.Matches(text)
End Function

لكشلاب ةقباسلا دوكلا ةعطق حبصت اذهبو

Dim mc As MatchCollection = ProximityMatches(text, "one", "four", 4)
If mc.Count > 0 Then

End If

292

خ٠ساٛزٌاٚ َبلسلاٚ خ١ظٌٕا ًعلغٌا ِٓ كمحزٌا


زومرلا نمض هنٌمضتب كلذو ققحت جذومنك ثحب جذومن مادختسا اننكمٌ ^ و $ ةقٌرطلا مادختساو IsMatch ةقٌرطلا نم لدب
Matches اكٌرمأ ًف ةقطنم زمر لثمت ماقرأ ةسمخ ىلع يوتحٌ صنلا نأ نم ًلاتلا دوكلا ققحتٌ لثمف

pattern = "^\d{5}$"
If Regex.IsMatch(Text, pattern) Then
' It's a string containing five digits.
End If

ةطساوب هلعف كنكمٌ يذلا اشلا ةحٌحصلا صوصنلا ةعومجم نم بٌكارتلا ضعب داعبتسا دٌرت امدنع ةراثإ رثكأ روملا حبصتس انهو
بٌكرتلا (?!) لسلستلا لاثملا لٌبس ىلعف 00000 ًلاتلاك هداعبتسا كنكمٌ ثٌح حلاص ةقطنم زمر ربتعٌ ل
pattern = "^(?!00000)\d{5}$"

امدقم رظنلا بٌكارت مادختسا كنكمٌ (?=) اهناكم نع رظنلا ضؽب ةاطعم ةبف نمض ؾراحملا عٌمج ىلع يوتحٌ لاخدلا صن نأ نم دكؤتلل
اهنأو ىندأ دحك ؾراحم ةٌنامث لاخدإب موقٌ جمانربلا مدختسم نأ نم دكؤتلاو ةٌوق رس ةملك ةساٌس ضرفل ًلاتلا بٌكرتلا مادختسا كنكمٌ لثمف
ةرٌؽصو ةرٌبك ؾورحو ماقرأ ىلع يوتحت
pattern = "^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])\w{8,}$"

بٌكرتلا اذه لمعٌ ؾٌك ىرن انعد . لولا طرشلا (?=.*\d) ىلع يوتحٌ ل هنٌمٌ ىلع صنلا ءزج ناك اذإ ةٌادبلا ذنم لشفٌ ثحبلا لعجٌ
بٌكرتلاو ماقرأ (?=.*[a-z]) بٌكرتلا لثملابو ةرٌؽص ؾورح ىلع يوتحٌ لخدملا صنلا نأ دكؤتٌ (?=.*[A-Z]) صنلا ءاوتحا نم دكؤتٌ
ةرٌبك ؾورح ىلع . بٌكرتلا دكؤتٌ اذهبو ؾراحم ةٌأ كلهتست ل هذه ماملل رظنلا بٌكارتو \w{8,} ةٌنامث ىلع يوتحٌ صنلا نأ نم ًقبتملا
ىندأ دحك ؾراحم
نل خٌراوتلاو ماقرلا نم ققحتلل ةٌماظنلا رٌباعتلا مادختسا دٌرت دق ماع لكشبو ةرٌثم لكاشم ىطعم لاجم ًف مقر نم ققحتلا ًف رهظٌو
عونلا DateTime قرطلاب كدوزٌ Parse و Try-Parse تلاحلا ضعب ًف كلذ عمو رثكأ ةنورم رفوٌ امم اضٌأ ةٌمقرلا عاونلا عٌمجو
نأ نم دكؤتلاو لوطأ ةقٌثو نم ةحٌحصلا خٌراوتلاو ماقرلا جارختسا دٌرت دق لثمف ةمهملا هذه ًف ىتح قٌبطتلل ةلباق ةٌماظنلا رٌباعتلا نوكت
حٌحصلا ددعلا Integer عبطلاب ةٌداع ةلكشم ربتعت نٌعم دح ىتح ةمٌق كلمٌ

' Validate an integer in the range of 0 to 9,999; accept leading zeros.
pattern = "^\d{1,4}$"

ماملل رظنلا بٌكرت (?!) تلاح ةدعب مكحتت كلعجٌ ًبلسلا

' Validate an integer in the range 1 to 9,999; reject leading zeros.
pattern = "^(?!0)\d{1,4}$"

' Validate an integer in the range 0 to 9,999; reject leading zeros.
' (Same as previous one, but accept a single zero as a special case.)
pattern = "^(0|(?!0)\d{1,4})$"


ةؽٌصلاب سٌل لوبقملا لاجملل ىندلا دحلا ناك اذإ 99…999 حبصٌ بٌكرتلا نكلو ققحتلا لمعل ةٌماظنلا رٌباعتلا لامعتسا ةٌناكمإ كٌدل ىقبت
نم لاجملا نمض مقرلا نأ نم ًلاتلا بٌكرتلا ققحتٌ لثمف ادٌقعت رثكأ 0 ىلإ 255 ةقباس رافصأ نودب

pattern = "^(25[0–5]|2[0–4]\d|1\d\d|[1–9]\d|\d)$"

293

بٌكرتلا 25[0-5] نم لاجملا ًف ماقرلا نم ققحتٌ 250 ىلإ 255 بٌكرتلاو 2[0-4]\d نم لاجملا نمض ماقرلا نم ققحتٌ 200 ىلإ
249 بٌكرتلاو 1\d\d نم لاجملا نمض ماقرلا نم ققحتٌ 100 ىلإ 199 بٌكرتلاو [1-9]\d نم ماقرلاب متهٌ 10 ىلإ 99 ارٌخأو
بٌكرتلا \d نم لاجملا ًطؽٌ 0 ىلإ 9 مقر نم ققحتلا كنكمٌ بٌكرتلا ىلع طٌسب لٌدعتبو IP لثم ماسقأ ةعبرأ نم نوكم 192.168.0.11

pattern = "^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}" _
& "(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$"

ربكلا تلاجملا نمض ةعرسب دٌقعت رثكأ روملا حبصتو

' Validate an integer number in the range 0 to 65,535; leading zeros are OK.
pattern = "^([1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-4]|\d{1,4})$"

ةصاخ ةجلاعمل جاتحت اهقبست ةراشإ ماقرلل نوكٌ دقو

' Validate an integer in the range -32,768 to 32,767; leading zeros are OK.
pattern = "^(-?[12]\d{4}|-?3[0-1]\d{3}|-?32[0-6]\d{2}|-?327[0-5]\d|" _
& "-?3276[0-7]|-32768|-?\d{1,4})$"

ةصاخلا ةلاحلا نأ قباسلا بٌكرتلا ًف ظحل -3278 ةقباس ةٌراٌتخا صقان ةراشإ كلمٌ ًقابلا بٌكرتلا لكو لقتسم لكشب اهعم لماعتلا بجٌ
تقو ةمٌق نم ققحتلل ةهٌبش ةٌنقت مادختسا كنكمٌو

' Validate a time value in the format hh:mm; the hour number can have a leading
zero.
pattern = "^(2[0–3]|[01]\d|\d):[0–5]\d$"

رهش ًف حٌحصلا موٌلا دمتعٌ كلذ لك قوفو ماٌلا نم ؾلتخم ددع ىلع رهش لك ءاوتحا ببسب ةبوعص رثكأ نوكت دق خٌراتلا مٌق نم ققحتلاو
وذ ىطعم مقر يأ نأ نم ققحتلا ةٌماظنلا رٌباعتلل نكمٌ ؾٌك ىرن انعد ةلكشملا هذهل لح مٌدقت لبقو ل مأ ةسٌبك ةنسلا نوك ىلع طابش
ىلع ةمسقلا لبقٌ نٌتناخ 4

' If the first digit is even, the second digit must be 0, 4, or 8.
' If the first digit is odd, the second digit must be 2 or 6.
pattern = "^([02468][048]|[13579][26])$"

رٌبعتلا طٌسبت نم اننكمٌس امم ًلاحلا نرقلا ًف ىطعملا خٌراتلا ًلاتلاب نوكٌسف طقف نٌتناخ وذ ةنسلا مقر نؤب طسبم ضارتفا مادختسابو
ةنسلا نل حضاو لكشب ًماظنلا 2000 ةنسلا سكعب ةسٌبك 1900 و 2100 روطس ةعبرأ ىلإ بٌكرتلا مسق ًباهنلا رٌبعتلا حٌضوتلو

' This portion deals with months with 31 days.
Dim p1 As String = "(0?[13578]|10|12)/(3[01]|[012]\d|\d)/\d{2}"
' This portion deals with months with 30 days.
Dim p2 As String = "(0?[469]|11)/(30|[012]\d|\d)/\d{2}"
' This portion deals with February 29 in leap years.
Dim p3 As String = "(0?2)/29/([02468][048]|[13579][26])"
' This portion deals with other days in February.
Dim p4 As String = "(0?2)/(2[0-8]|[01]\d|\d)/\d{2}"
' Put all the patterns together.
pattern = String.Format("^({0}|{1}|{2}|{3})$", p1, p2, p3, p4)
' Check the date.
If Regex.IsMatch(Text, pattern) Then
' Date is valid.
End If

294

ىلع ةمسقلل ةلباقلا تاونسلا عٌمج تسٌل هنأ رابتعلا نٌعب ذخلا انٌلع بجو تاناخ عبرأ وأ نٌتناخ وذ ةنسلا مقر ناك نإو 100 نإ لإ ةسٌبك
ىلع ةمسقلل ةلباق تناك 400 ًلاتلا دوكلا لمعٌ ؾٌك مهفل ةٌفاكلا ةربخلا كلمت تحبصأ كنكلو ادٌقعت رثكأ ًماظنلا بٌكرتلا لعجٌ امم

' This portion deals with months with 31 days.
Const s1 As String = "(0?[13578]|10|12)/(3[01]|[12]\d|0?[1–9])/(\d\d)?\d\d"
' This portion deals with months with 30 days.
Const s2 As String = "(0?[469]|11)/(30|[12]\d|0?[1-9])/(\d\d)?\d\d "
' This portion deals with days 1–28 in February in all years.
Const s3 As String = "(0?2)/(2[0–8]|[01]\d|0?[1–9])/(\d\d)?\d\d"
' This portion deals with February 29 in years divisible by 400.
Const s4 As String = "(0?2)/29/(1600|2000|2400|2800|00)"
' This portion deals with February 29 in noncentury leap years.
Const s5 As String = "(0?2)/29/(\d\d)?(0[48]|[2468][048]|[13579][26])"
' Put all the patterns together.
pattern = String.Format("^({0}|{1}|{2}|{3}|{4})$", s1, s2, s3, s4, s5)

لكشلا نم خٌراوتلل ًماظن رٌبعت لمع لهسلا نم نوكٌسو dd/mm/yy ماسقأ نٌب لصافلا ؾرحلا ؾلتخا رابتعلا نٌعب ذخلاب كلذو
خٌراتلا .
295


296

َاذخزعلٌ حض٘بع خؼئبش خ١ِبظٔ ش١ثبؼر

Pattern فصولا
\d+ بجوم حٌحص ددع
[+-]?\d+ ةٌراٌتخا ةراشإب بلاس وأ بجوم حٌحص ددع
[+-]?\d+(\.\d+)? نٌٌراٌتخا يرشع مسقو ةراشإب ةمباع ةطقنب ددع
[+-]?\d+(\.\d+)?(E[+-]?\d+)? ًسلا لكشلاب اٌراٌتخا هلٌثمت نكمٌ ةمباع ةطقنب ددع
[0-9A-Fa-f]+ يرشع تس مقر
\w+ تاطرشلاو ماقرلاو ؾورحلا نم ةلسلس
[A–Z]+ ةرٌبك ؾراحم تاذ ةملك
[A–Z][a–z]+ رٌؽص ًقابلاو رٌبك لولا ؾرحلا اهٌف نوكت ةملك
[A–Z][A–Za–z']+ اهٌف نوكٌ نأ نكمٌ ةٌقبلاو رٌبك لولا ؾرحلا اهٌف ةملك
ةٌولع لصاوفو ةرٌبك ؾورح
[A–Za–z]{1,10} لقأ وأ ؾورح رشعب ةملك
[A–Za–z]{11,} رثكأ وأ افرح رشع دحؤب ةملك
[A-Za–z_]\w* ةطرش وأ ؾرحب أدبٌ براش ًس وأ كٌزٌاب لوجٌف رٌؽتم
تاطرش وأ ماقرأ وأ ؾورحب هتمتت اٌراٌتخاو
(?<q>["'])*?\k<q> نٌتجودزم وأ نٌتدرفم سابتقا ًتملع نمض سبتقم صن
(10|11|12|0?[1–9])(?<sep>[-/])(30|31|2\d|1\d|0?[1–
9])\k<sep>(\d{4}|\d{2})
ًكٌرملا قٌسنتلاب خٌرات
mm-dd-yyyy OR mm/dd/yyyy
(30|31|2\d|1\d|0?[1–9])(?<sep>[-/])(10|11|12|0?[1–
9])\<sep>(\d{4}|\d{2})
ًبرولا قٌسنتلاب خٌرات
dd-mm-yyyy or dd/mm/yyyy
(2[0–3]|[01]\d|\d):[0–5]\d ماظنب خٌرات 24 يراٌتخا ةعاسلا مقرل قباسلا رفصلاو ةعاس
hh:mm 24-hour format
\(\d{3}\)–\d{3}–\d{4} لكشلاب ؾتاه مقر
(123)-456-7890.
\d{5}(-\d{4})? ًكٌرمأ ةقطنم زمر
\d{3}-\d{2}-\d{4} ًكٌرمأ ًعامتجا نامض مقر
((\d{16}|\d{4}(-\d{4}){3})|(\d{4}(\d{4}){3})) نم نامتبا ةقاطب مقر 16 ةناخ
([0–9A–Fa–f]{32}|[0–9A–Fa–f]{8}-([0–9A–Fa–f]{4}-){3}[0–
9A–Fa–f]{12})
GUID
([A–Za–z]:)?\\?([^/:*?<>"|\\]+\\)*[^/:*?<>"|\\]+ راسملا نودب وأ عم ؾلم مسا
(http|https)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? An Internet URL
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* An Internet e-mail address.
297


Pattern فصولا
((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-
4]\d|1\d\d|[1-9]\d|\d)
A four-part IP address, such as 192.168.0.1; the
pattern verifies that each number is in the range
0–255.
([1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-
4]|\d{1,4})
A 16-bit integer that can be assigned to a UShort
variable, in the range of 0 to 65,535.
(-?[12]\d{4}|-?3[0-1]\d{3}|-?32[0-6]\d{2}|-?327[0-5]\d|-
?3276[0-7]|-32768|-?\d{1,4})
A 16-bit integer that can be assigned to a Short
variable, in the range of –32,768 to 32,767.
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])\w{8,}$ ىلع يوتحت ثٌحب لقلا ىلع ؾراحم ةٌنامث يوتحت رس ةملك
ضعب يوتحٌ نأ نكمٌو ارٌؽص افرحو ارٌبك ارحو امقر لقلا
ةصاخلا ؾورحلا


298

ششػ شٌبضٌا ُغمٌا - خفٍزخِ غ١ػاِٛ



ةٌلاتلا عٌضاوملا مضٌو :
 If Operator
 Lambda Expressions
 رٌباعت ادمل ًف قمعلا Lambda Expressions
 Nullable Value Types
 Object Initializers
 للدتسلا ًلحملا ىلع عونلا Local Type Inference
 رابجإ مدختسملا ىلع راٌتخا ةدحاو نم ةدع مٌق ةددحم اقباس ًف قودنص
صوصنلا
 مادختسا ؾباظولا ةنزخملا Using Stored Procedures
 عاونلا ةلوهجملا Anonymous Types
 مكحتلا PropertyGrid
 لٌوحتلا نٌب عاونأ تاناٌبلا مادختساب قٌٌضتلا Explicit عٌسوتلاو Implicit
 ةبفلا StringBuilder
 ةفصاولا Obsolete Attribute
 نٌزخت ؾلم ام نمض Exe جمانربلا ءانثأ رٌوطتلا هتداعتساو ءانثأ لٌؽشتلا
 رٌفشت رارسلا مدختسملل ًلاحلا
 تاهٌجوت جلاعملا
 ؾٌك لعجت ةذفانل جمانرب لظ
 ؾٌك موقت لمعب ةنوقٌأ ةصاخ كمكحتل صاخلا
 اذامل ذخؤٌ كدوك اتقو لٌوط ءانثأ ذٌفنتلا
 تافلم رداصملا صٌصختو جمانربلا اٌلحم Resources and localization

299

If Operator

نأ هونأ نأ بحأ ةٌادبلا ًف If Operator ا نع ؾلتخم انه ةفٌظول IIf ةرابع وأ If … Then … Else ةداتعملا . مدختسن انك امدنع اقباسف IIF
عونلا نم داعملا عونلا ناك Object رفوتٌ نل امك ةٌضارتفلا ةلاحلاب عونلا ىلع قٌقدت لصحٌ نل هنأ ًنعٌ امم IntelliSense ةمٌقلا كلتل
تاناٌبلا عون ىلإ عونلا كلذ لٌوحت مهٌلع بجٌ ناك دوكلل ركبملا طبرلا لجأ نمو عاونلا للخ نمآ دوك ةباتك ىلع نورصٌ نٌذلا ءلإهلو
ًلٌ امك دوكلا مهٌدل ودبٌ دقف دارملا
Dim intC As Integer = CInt(IIf(intA = intB, intA, intB - 1))

لماعملا مادختسابو نلا نكلو If رفوتو عونلا قٌقدتو ركبملا طبرلا دباوف ىلع لوصحلاو دوكلا سفن ةباتك ةداعإ اننكمٌ intelliSense كلتل
ةمٌقلا
Dim intD As Integer = If(intA = intB, intA, intB)

خِبؼٌا خغ١ظٌا
لماعملا رفوٌ If وأ هل طباسو ةثلث رٌرمتب هإاعدتسا نكمٌ ثٌح نٌعم طرش قفو نٌتمٌق نم ةدحاو ةمٌق ةداعل ةرصتخم ةقٌرط
هل ةماعلا ةؽٌصلا نوكتو نٌتطٌسو
If( [argument1,] argument2, argument3 )

ءبػذزعا If Operator ؾئبعٚ خصلضث
لماعملا ءاعدتسا متٌ امدنع If نم ةدحاو ةٌأ اهرودب ددحتس ًتلا ةٌناٌلوب ةمٌقك ىلولا ةطٌسولا مٌٌقت نكمٌ نأ بجٌ طباسو ةثلثب
لماعملا مادختسا دنع ثلثلا طباسولا نوكتو اهتمٌق ةداعإو اهمٌٌقت متٌس نٌٌرخلا نٌتطٌسولا If ًلٌ امك طباسو ةثلثب :
 argumet1 اهتداعإو اهمٌٌقت متٌس نٌٌرخلا نٌتطٌسولا نم ةدحاو ةٌأ ددحت ًهو ةٌناٌلوب اهتمٌقو ةٌرورض
 argumet2 عونلا نم ًهو ةٌرورض Object ةمٌق نوك لاح ًف اهتداعإو اهمٌٌقت متٌو argument1 ًه True
 argument3 عونلا نم ًهو ةٌرورض Object ةمٌق نوك لاح ًف اهتداعإو اهمٌٌقت متٌو argument1 ًه False
لماعملا ءاعدتسا متٌ امدنعف If ةفٌظولل هباشم لكشب لمعٌ طباسو ةثلثب IIf رصتخملا مٌٌقتلا مدختست اهنأ ادع امٌف . ةفٌظولاف IIf امود مٌقت
لماعملا امنٌب ثلثلا طباسولا عٌمج If ىلإ اهعون لٌوحتو ىلولا ةطٌسولا مٌٌقت متٌ ثٌح طباسولا كلت نم طقف نٌنثا مٌٌقتب موقٌ Boolean
ةجٌتنلا تناك نإف True مٌٌقت متٌسف argument2 مٌٌقت متٌ نل نكلو اهتمٌق ةداعإ مث argument3 ةلاحلا هذه ًف . ةطٌسولا ةمٌق تناك نإو
ىلولا False مٌٌقت متٌ نل اهدنع argument2 مٌٌقت متٌسو argument3 لماعملا مادختسا ًلاتلا لاثملا حضوٌو اهتمٌق ةداعإو If ةثلثب
طباسو
' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

300

رٌؽتم مٌسقتل نٌتلواحم ارهظم رصتخملا مٌٌقتلا ةمٌق حضوٌ ًلاتلا لاثملاو number رٌؽتم ىلع divisor ةمٌق نوكت امدنع هنأ ادع
devisor ذٌفنتلا تقو ؤطخ كلذ نع جتن لإو ةمسقلا ةٌلمعب ماٌقلا ةلواحم بجٌ لو رفص ةمٌقلا ةداعإ بجٌ رفصلل ةٌواسم – ةمسقلا ؤطخ
رفص ىلع - لماعملا نأ ببسبو If نإف ىلولا ةطٌسولا ةمٌق ىلع ادامتعا ةثلاثلا وأ ةٌناثلا ةطٌسولا امإ مٌقٌ هنإف رصتخملا مٌٌقتلا مدختسٌ
ةمٌقلا ىلولا ةطٌسولل تناك True نوكٌف devisor نإو ةمسقلا ةٌلمع ءارجإو ةٌناثلا ةطٌسولا مٌٌقت انمآ نوكٌ ًلاتلابو رفص ةمٌقلا لمحٌ ل
ىلولا ةطٌسولا ةمٌق تناك False ةمٌق نوكت امدنعف اذهلو رفص ةمٌقلا ةداعإ متٌسو طقف ةثلاثلا ةطٌسولا مٌٌقت متٌسف devisor رفصلل ةٌواسم
نأ امبو ذٌفنتلا نمز ًف ؤطخ كانه نوكٌ نل ًلاتلابو ةمسقلا ةٌلمع ءارجإ ةلواحم متٌ نلف IIf ةطٌسولا مٌٌقت متٌسف رصتخملا مٌٌقتلا مدختست ل
امود ذٌفنتلا تقو رفص ىلع ةمسقلا ؤطخ قلطنٌس ًلاتلابو ىلولا ةطٌسولا ةمٌق تناك امهم امود ةٌناثلا
number = 12

' When the divisor is not 0, both If and IIf return 4.
Dim divisor = 3
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

' When the divisor is 0, IIf causes a runtime error, but If does not.
divisor = 0
Console.WriteLine(If(divisor <> 0, number \ divisor, 0))
' Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

ءبػذزعا If Operator ٓ١زط١عٛث
لماعملا ءاعدتسا نم كنكمٌ امم ىلولا ةطٌسولا ؾذح نكمٌ If ًلٌ امك نانوكت ثٌح نٌتطٌسوب
 argument2 عونلا نم ةٌرورض Object ةمٌقلا لمحٌ نأ نكمٌ عون نم نوكت نأ بجٌو Nothing ًعجرم عون وأ
Reference or nullable type ـل ةرٌاؽم ةمٌق يأ لمحٌ امدنع هتداعإو همٌٌقت متٌ ثٌح Nothing
 argument3 عونلا نم ةٌرورض Object ةمٌق نوك ةلاح ًف اهتمٌق ةداعإو اهمٌٌقت متٌ ثٌح argument2 ـل ةٌواسم
Nothing
ةمٌقلا لمحٌ نأ لبقٌ عون نم ىلولا ةطٌسولا نوكت نأ بجٌ اهدنع ةٌناٌلوبلا ةطٌسولا ؾذح متٌ امدنعف Nothing ًعجرم عون وأ
reference or nullable type ىلإ ىلولا ةطٌسولا مٌٌقت مت نإف Nothing تلاحلا عٌمج ًفو ةٌناثلا ةطٌسولا ةمٌق ةداعإ متٌ اهدنع
ًلاتلا لاثملا رهظٌ امك ىلولا ةطٌسولا ةمٌق ةداعإ متٌ ىرخلا
' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))



301

Lambda Expressions

ـلا Lambda Expression ةفٌظو وه Function بلطت ًتلا رٌباعتلا ًف اهمادختسا نكمٌ امك ةدٌحو ةمٌق دٌعتو بستحت مسا نودب
ةضوفم تاءارجإ Delegate اهل دحاو ةفاضإ دعب جتانلا دٌعٌو ةمٌق ذخؤٌ رٌباعتلا هذه نع ًلاتلا لاثملاو
Function (num As Integer) num + 1
هل ةمٌقلا رٌرمتو رٌؽتمل ةفٌظولا هذه دانسإ كنكمٌ امك
Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(5))
تقولا سفنب ةفٌظولا ذٌفنتو ؾٌرعت كنكمٌ امك
Console.WriteLine((Function(num As Integer) num + 1)(5))

مدختست نأ نكمٌ امك Lambda Expressions ًلاتلا لاثملا ًفف ضوفم ءارجل طٌسوك اهرٌرمت وأ ةفٌظو ءاعدتسا دنع ةداعم ةمٌقك
مدختست Lambda Expressions ءارجلل طباسوك ةٌناٌلوب testResult عونلا نم طٌسول ًناٌلوب صحف ةقٌرطلا قبطت ثٌح Integer
ةمٌقلا رهظٌو Success ةمٌق تناك اذإ Lambda Expression ًه True وأ Failure هتمٌق تناك نإ False
Module Module2

Sub Main()
' The following line will print Success, because 4 is even.
testResult(4, Function(num) num Mod 2 = 0)
' The following line will print Failure, because 5 is not > 10.
testResult(5, Function(num) num > 10)
End Sub

' Sub testResult takes two arguments, an integer value and a
' Boolean function.
' If the function returns True for the integer argument, Success
' is displayed.
' If the function returns False for the integer argument, Failure
' is displayed.
Sub testResult(ByVal value As Integer, ByVal fun As Func(Of Integer, _
Boolean))

If fun(value) Then
Console.WriteLine("Success")
Else
Console.WriteLine("Failure")
End If
End Sub

End Module

رٌباعت نوكت Lambda Expressions ملعتسلا تلماعم نم رٌثكل ساسلا ًه Linq مجرتملا موقٌ ثٌح Compiler ءاشنإب
رٌباعت Lambda Expressions لثم ملعتسلاب ةصاخلا قبارطلل ةٌباسحلا تاٌلمعلاب ماٌقلل Where و Select و Order و By و Take
While ًلاتلا ملعتسلا رظنا لاثملا لٌبس ىلعف
Dim londonCusts = From cust In db.Customers
Where cust.City = "London"
Select cust

ًلاتلا دوكلا ىلإ هتمجرت متتس ثٌح

302

Dim londonCusts = db.Customers _
.Where(Function(cust) cust.City = "London") _
.Select(Function(cust) cust)

لكشلا ىلع اهتؽٌص نوكتو
 امسا كلمت ل رٌباعتلا هذه
 لثم اهعم تلدعملا مادختسا نكمٌ ل Overloads وأ Overrides
 مسق مدختست ل AS نإف ءارجلا مسج اهلكشٌ ًتلا ةمٌقلا عون وه ةداعملا ةمٌقلا عون نوكٌ كلذ نع لدبو ةداعملا ةمٌقلا عون دٌدحتل
لثم ءارجلا مسج ناك Cust.City = "London" ةٌناٌلوب ةداعملا ةمٌقلا نوكتف
 ةفٌظول ءاعدتسا ىلع يوتحٌ نأ نكمٌو حٌرصت سٌلو رٌبعت نوكٌ نأ بجٌ ءارجلا مسج Function ًعدتسٌ نأ نكمٌ ل هنكلو
ءارجإ Sub
 رٌبعت دجوٌ ل Return ةفٌظولا مسج لكشٌ يذلا رٌبعتلا كلذ ةمٌق ًه ةداعملا ةمٌقلا نوكتو
 رٌبعت دجوٌ ل End
 ةراشلاب عاونؤب اهعٌمج نوكت وأ عونلا ةددحم طباسولا عٌمج نوكت نأ بجٌ
 ةٌراٌتخلا طباسولاب حومسم رٌؼ
 طباسولا Generic اهب حومسم رٌؼ
رٌبعت يأ نأ ىرنس دعاوقلا هذهل ةجٌتنو Lambda Expression دقعم رٌؼو اطٌسب نوكٌس
كرتشت Lambda Expression ؾباظولا عم Methods اهٌوتحت ًتلا ةقٌرطلا ًف بوتكم دوك يؤك لوصولا قوقح عٌمج اهلو ةددحم اهنؤب
رٌبعتلا يوتحت ًتلا ةفٌظولا ًف ةدوجوملا تارٌؽملا عٌمجو ؾباظولاو ءاضعلا تارٌؽتم ىلإ لوصولا نمضتٌ اذهو Lambda
Expression رٌؽتملا ًلاتلا لاثملا ًفف target ـل ةبسنلاب ًلحم وه makeTheGame رٌبعتلا دٌدحت مت ًتلا ةقٌرطلاو Lambda
Expression ًه اهٌف playTheGame رٌبعتلا نم ةداعملا ةمٌقلا نأ ظحل Lambda Expression متٌ ـل اهنٌٌعت takeAGuess ًف
Main ًلحملا رٌؽتملل لوصولا عٌطتست تلازام target
Module Module1

Sub Main()
' Variable takeAGuess is a Boolean function. It stores the target
' number that is set in makeTheGame.
Dim takeAGuess As gameDelegate = makeTheGame()

' Set up the loop to play the game.
Dim guess As Integer
Dim gameOver = False
While Not gameOver
guess = CInt(InputBox("Enter a number between 1 and 10 (0 to quit)", _
"Guessing Game", "0"))
' A guess of 0 means you want to give up.
If guess = 0 Then
gameOver = True
Else
' Tests your guess and announces whether you are correct. Method takeAGuess
' is called multiple times with different guesses. The target value is not
' accessible from Main and is not passed in.
gameOver = takeAGuess(guess)
Console.WriteLine("Guess of " & guess & " is " & gameOver)
End If
End While

End Sub

Delegate Function gameDelegate(ByVal aGuess As Integer) As Boolean

Public Function makeTheGame() As gameDelegate
303


' Generate the target number, between 1 and 10. Notice that
' target is a local variable. After you return from makeTheGame,
' it is not directly accessible.
Randomize()
Dim target As Integer = CInt(Int(10 * Rnd() + 1))

' Print the answer if you want to be sure the game is not cheating
' by changing the target at each guess.
Console.WriteLine("(Peeking at the answer) The target is " & target)

' The game is returned as a lambda expression. The lambda expression
' carries with it the environment in which it was created. This
' environment includes the target number. Note that only the current
' guess is a parameter to the returned lambda expression, not the target.

' Does the guess equal the target?
Dim playTheGame = Function(guess As Integer) guess = target

Return playTheGame

End Function

End Module

ًف ةششعملا لوصولا قوقح نم اضٌرع لاجم ًلاتلا لاثملا ضرعتسٌو Lambda Expression رٌبعتلا ذٌفنت متٌ امدنعف Lambda
Expression نم Main ـك aDel ةٌلاتلا رصانعلا مدختسٌ ) ةبفلا ًف لقح aField – ةبفلا ًف ةٌصاخ aProp – ةٌبارجلل طٌسو
functionWithNestedLambda وه level1 – ـل ًلحم رٌؽتم functionWithNestedLambda وه localVar – رٌبعتلل طٌسو
Lambda Expression وه ششعملا level2 (
Module Module3

Sub Main()
' Create an instance of the class, with 1 as the value of
' the property.
Dim lambdaScopeDemoInstance = New LambdaScopeDemoClass _
With {.Prop = 1}

' Variable aDel will be bound to the nested lambda expression
' returned by the call to functionWithNestedLambda.
' The value 2 is sent in for parameter level1.
Dim aDel As aDelegate = _
lambdaScopeDemoInstance.functionWithNestedLambda(2)

' Now the returned lambda expression is called, with 4 as the
' value of parameter level3.
Console.WriteLine("First value returned by aDel: " & aDel(4))

' Change a few values to verify that the lambda expression has
' access to the variables, not just their original values.
lambdaScopeDemoInstance.aField = 20
lambdaScopeDemoInstance.Prop = 30
Console.WriteLine("Second value returned by aDel: " & aDel(40))
End Sub

Delegate Function aDelegate(ByVal delParameter As Integer) _
As Integer

Public Class LambdaScopeDemoClass
Public aField As Integer = 6
Dim aProp As Integer

304

Property Prop() As Integer
Get
Return aProp
End Get
Set(ByVal value As Integer)
aProp = value
End Set
End Property

Public Function functionWithNestedLambda _
(ByVal level1 As Integer) As aDelegate
Dim localVar As Integer = 5

' When the nested lambda expression is executed the first
' time, as aDel from Main, the variables have these values:
' level1 = 2
' level2 = 3, after aLambda is called in the Return statement
' level3 = 4, after aDel is called in Main
' locarVar = 5
' aField = 6
' aProp = 1
' The second time it is executed, two values have changed:
' aField = 20
' aProp = 30
' level3 = 40
Dim aLambda = Function(level2 As Integer) _
Function(level3 As Integer) _
level1 + level2 + level3 + localVar _
+ aField + aProp

' The function returns the nested lambda, with 3 as the
' value of parameter level2.
Return aLambda(3)
End Function

End Class
End Module

لٌوحت نكمٌ امك Lambda Expressions نٌعت امدنعف ةضوفملا تاءارجلا عم قفاوتتل Lambda Expression ضوفم ءارجل
Delegate ًلاتلا لاثملا ًفف ضوفملا ءارجلل اهدٌدحت ةمهم اكرات اهب ةصاخلا تاناٌبلا عاونأ لافؼإ عم نكلو طباسولا ءامسأ دٌدحت كنكمٌ
نٌٌعت متٌ Lambda Expression همسا رٌؽتمل del عونلا نم ExampleDel نٌتطٌسو ذخؤٌ ضوفم ءارجإ نع ةرابع وه يذلا integer
و string ًف تارٌؽتملا عاونأ نأ ظحل Lambda Expression ـف كلذ عمو اهدٌدحت متٌ مل del عونلا نم اطٌسو بلطتٌ integer
عونلا نم رخآ اطٌسوو string ؾٌرعت دنع هدٌدحت مت امك ExampleDel
' Definition of function delegate ExampleDel.
Delegate Function ExampleDel(ByVal arg1 As Integer, _
ByVal arg2 As String) As Integer

' Declaration of del as an instance of ExampleDel, with no data
' type specified for the parameters, m and s.
Dim del As ExampleDel = Function(m, s) m

' Valid call to del, sending in an integer and a string.
Console.WriteLine(del(7, "up"))

' Neither of these calls is valid. Function del requires an integer
' argument and a string argument.
'Console.WriteLine(del(7, 3))
'Console.WriteLine(del("abc"))

305

دٌدحت متٌ ًلاتلا لاثملا ًف Lambda Expression ةمٌقلا دٌعٌل True وأ ةمسق كلتمٌ طٌسولا ناك اذإ False ةمٌقلا ناك اذإ Nothing
Dim notNothing = Function(num? As Integer) _
num IsNot Nothing
Dim arg As Integer = 14
Console.WriteLine("Does the argument have an assigned value?")
Console.WriteLine(notNothing(arg))

ددحٌ ًلاتلا لاثملاو Lambda Expression دٌعٌ Index ةفوفصم ًف رٌخلا رصنعلا
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim lastIndex = Function(intArray() As Integer) _
intArray.Length - 1
For i = 0 To lastIndex(numbers)
numbers(i) = numbers(i) + 1
Next

306

كّؼٌا ٟف اذٌّ ش١ثبؼر Lambda Expressions

كٌزٌاب لوجٌف ًف ةدٌفملا تافاضلا نم ادمل رٌباعت ربتعت 2008 ىرخأ ةفٌظول ددحمك اهرٌرمت وأ ةفٌظو نم ةمٌقك اهتداعإ كنكمٌ ثٌح
ةنمضملا تاملعتسلا ةؽلل معدك كٌزٌابلا ةؽلل اهتفاضإ تمت ثٌح Linq لوجٌف ًف تاناٌبلا ةجمربل ةٌوق ةٌملعتسا تاٌناكمإ ؾٌضت ًتلا
اهٌف ةنماكلا ةنورملاو ةوقلا ىرتس ادمل رٌباعت مادختساب أدبت امدنعو كٌزٌاب
اذٌّ ش١ثبؼر ٟ٘ بِ
ذخؤٌ ادمل رٌبعت ؾرعٌ وهف ًساسأ ادمل رٌبعت ؾٌرعت نع لاثم ًلاتلا دوكلا لكشٌ Integer دٌعٌو Integer ةمٌق ذخؤٌ ثٌحب
ـب ةبورضم اهدٌعٌو لخدلا 2
Dim doubleIt as Func(Of Integer, integer) = _
Function(x As Integer) x * 2
عونلاو Func كٌزٌاب لوجٌف ًف ةدٌدجلا عاونلا نم 2008 ضوفم ءارجإ ساسلا ًف وهو Delegate رٌخلا ددحملا هددحٌ اعون دٌعٌ
ضوفملا عونلاو ددحملا كلذ قبست تاددحم ةعبرأ رٌرمت نم كنكمٌو Func عمجملا ًف ؾرعم System.Core.dll نم كنكمٌ يذلا رملا
تلٌمحت ًلاتلا دوكلا لثمٌو ادٌدج اقٌبطت اشنن امدنع اٌباقلت هدارٌتسا متٌ روكذملا عمجملا نل كلذو اٌروف هنم ةدافتسلا Overloads ةفلتخم
ـل Func
Dim f0 As Func(Of Boolean)
Dim f1 As Func(Of Integer, Boolean)
Dim f4 As Func(Of Integer, Integer, Integer, Integer, Boolean)
قباسلا لاثملا ًفف f0 ةمٌق دٌعٌ ضوفم وه Boolean و f1 ذخؤٌ ضوفم Integer دٌعٌو Boolean و f4 نم تاددحم ةعبرأ ذخؤٌ ضوفم
عونلا Integer عونلا نم ةمٌق دٌعٌو Boolean ًف تاضوفملاك امامت ءاعدتسلل لباق ضوفم هنأ وه ادمل رٌبعتلا ًف ةٌساسلا ةطقنلا نمكتو
كٌزٌاب لوجٌف 2005 ةزوجحملا ةملكلاب أدبت ًهف ادمل رٌباعتلل ةدٌدجلا ةؽٌصلا ةٌإر كنكمٌ ىلولا دوكلا ةعطق ًف ىنمٌلا ةاواسملا ةٌحان نمف
Function عونلا نم ادحاو اددحم ادمل رٌبعت ذخؤٌ قباسلا لاثملا ًفف دٌحو رٌبعتو تاددحملا نم ةمباقب ةعوبتم Integer مدع ظحلنو
رٌبعت دوجو Return ةرابع رٌرمتب موقٌ اذهبو رٌبعتلا هٌلع سسإملا عونلا ؾرعٌ مجرتملا نل كلذو Return نأ امب ةلاحلا هذه ًفو اٌباقلت
x عونلا نم وه Integer ًه ةلداعملا ةجٌتنو Integer ًه ادمل رٌبعت ةجٌتنف اذهل Integer هنأ ًف ادمل رٌباعت ًف رحسلا نكمٌو اضٌأ
لاثملا ًف ىرن امك طٌسب ضوفمك اهمادختسا نكمٌ
Dim doubleIt As Func(Of Integer, Integer) = _
Function(x As Integer) x * 2
Dim z = doubleIt(20)
ًف ةنزخملا ةمٌقلا نأ ىرتس قباسلا دوكلا تذفن نإف z ًه 40 يأ ةمٌق ؾعاضٌ ادمل رٌبعت ءاشنإب تمق اذهب تنأو Integer هل ررمٌ .
ادمل رٌباعت مادختساب رثكأ دقعم لاثم صحفتن نلا انعد
Dim mult As Func(Of Integer, Func(Of Integer, Integer)) = _
Function(x As Integer) Function(y As Integer) x * y
ربتعٌو mult عونلا نم ددحم هل لخدك ذخؤٌ وهف لٌلق دقعم ادمل رٌبعت Integer ةمٌق هرودب ذخأ يذلاو هل ةمٌقك ادمل رٌبعت دٌعٌو Integer
ةمٌق دٌعٌو Integer دوكلا حٌضوت لجأ نم رطسأ ىلع قباسلا رٌبعتلا مٌسقت ةداعإ اننكمٌ امك
Dim mult As Func(Of Integer, Func(Of Integer, Integer)) = _
Function(x As Integer) _
Function(y As Integer) x * y
لثامم ًلخادلا ادمل رٌبعتب صاخلا عٌقوتلا نوكٌو ةداعم ةمٌقك مجرتملا لبق نم مدختسٌ يذلا رخآ ادمل رٌبعت يوتحٌ ًجراخلا ادمل رٌبعتف
ضوفملا عٌقوتل Func(Of Integer, Integer) نود هلمكؤب رٌبعتلا ةمجرتب مجرتملا موقٌ ثٌح ًجراخلا ادمل رٌبعت نم ةداعملا ةمٌقلا ًف
ًلٌ امك اذه ادمل رٌبعت ةٌإر اننكمٌو لكاشم
307

Dim mult_10 = mult(10)
Dim r = mult_10(4)
ددحٌ لولا رطسلاف mult_10 ـك mult(10) نأ امبو Mult(10) ـب هبرضٌو ددحم ذخؤٌ ادمل رٌبعت دٌعٌ 10 نم داعملا عونلاو mult_10
وه Func(Of Integer, Integer) ًعدتسٌ ًناثلا رطسلاو mult_10 ةمٌقلا هل اررمم 4 ًف ةنزخملا ةمٌقلا نوكتس اذهب r ًه 40 نوكٌو
عون r وه Integer ربتعٌو mult مدختسٌ ًلخادلا ادمل رٌبعت نأ ظحلتسو لولا ددحملاب صصخم ادمل رٌبعت دٌعٌ وهف ادمل رٌباعتل عنصم
ًجراخلا ادمل رٌبعت ةاٌح ةرتف زواجتت ًلخادلا ادمل رٌبعت ةاٌح ةرتف نكلو ًجراخلا ادمل رٌبعت ددحم

داءبػذزعبو اذٌّ ش١ثبؼر
هٌف ضوفملا مادختسا نكمٌ ناكم يأ ًف اهمادختسا كنكمٌ اذل تاضوفم ةطاسبب ًه ادمل رٌباعت نأ امب . يذلا ًلاتلا ءارجلا ظحل
ةمباقلا ًف رصنع لك لجأ نم ضوفم ًعدتسٌو هل ددحمك ضوفم ذخؤٌ
Delegate Function ShouldProcess(Of T) (element As T) As Boolean

Sub ProcessList(Of T) ( _
Elements As List(Of T), shouldProcess As ShouldProcess(Of T))

For Each elem in elements
If shouldProcess(elem) Then
' Do some processing here
End If
Next
End Sub
ةقٌرطلاف تاضوفملا ىلع اٌساٌق اقٌبطت ًلاتلا لاثملا نوكٌو ProcessList اهٌلع ناك اذإ امٌف ققحتتو ةمباقلا نم رصنع لك ىلع رمتس
كٌزٌاب لوجٌف ًف اذه مادختسا نم نكمتت ىتحو ةجلاعملا ضعبب موقت مث رصنعلا ةجلاعم 2005 عٌقوت سفن كلتمت ةفٌظو ءاشنإ كٌلع
ءارجلا ىلإ ةفٌظولا كلت ناونع ررمت مث ضوفملا ProcessList
Class Person
Public age As Integer
End Class

Function _PrivateShouldProcess(person As Person) As Boolean
Return person.age > 50
End Function

Sub DoIt()
Dim list As New List(Of Person)
'Obtain list of Person from a database, for example
ProcessList(list, AddressOf _PrivateShouldProcess)
End Sub
تجتحا نإو اٌلك هتقباطم كٌلع بجٌ مث ضوفملا عٌقوت لثمٌ اذام ةفرعمل دوكلا قٌثوت ًف ثحبلا كٌلع ابلاؽف جاعزلا ضعب ببسٌ اذهو
ءاعدتسل ProcessList ةصاخلا ؾباظولا نم دٌدعلا ءاشنإب موقتس تاءارجإ ةدع عم .
ادمل رٌباعت مادختساب ءارجلا اذه ءاعدتسا اننكمٌ ؾٌك نلا ىرن انعد
Class Person
Public age As Integer
End Class

308

Sub DoIt()
Dim list As new List(Of Person)
'Obtain list of Person from a database, for example
ProcessList(list, Function(person As Person) person.age > 50)
End Sub
اهٌف مدختسٌس ًتلا ةطقنلا ًف ضوفملا ؾٌرعت متٌ ثٌح ةجلاعملا قطنمب ماٌقلل ةصاخ ةفٌظو ءاشنل ةجاح كانه دعٌ مل ادمل رٌباعت مادختسابف
اهلٌهستو ادمل رٌباعت ةوق ىرت تنأ اذهبو ةصاخلا ةقٌرطلا مادختساب اهتٌلحم نادقفو ام ناكم ًف ةصاخ ةفٌظو نمض هفٌرعت نم لضفأ اذهو
كب صاخلا دوكلا ةناٌصو ةءارق ةٌلمعل

اذٌّ ش١ثبؼر ُ٠ذمر ُر اربٌّ
كنٌل تاملعتسا معد لجأ نم Linq رٌباعت تناك اهنمض نمو كٌزٌاب لوجٌف ةؽلل ةدٌدجلا تاٌناكملا نم ةعومجم ةفاضإ بجٌ ناك
ادمل . ًلاتلا ملعتسلا انٌدل هنأ ضرتفا
Dim q = From p In Process.GetProgesses() _
Where p.PriorityClass = ProcessPriorityClass.High _
Select P
ةعومجملا ربع رورملاب موقٌس مجرتملاف ءاطؽلا تحت لمعلا نم رٌثكلا يرجٌ رٌبعتلا اذه ةمجرت متٌ ًكلف Process.GetProcesses
مسق ًف دوجوملا حشرملا قبطٌو Where لخاد كٌزٌاب لوجٌف رٌبعت دوجو ظحلن امك طرشلا كلذ قباطت ًتلا تاٌلمعلاب ةمباق دٌعٌو اهٌلع
مسق Where وه p.PriorityClass = ProcessPriorityClass.High لجأ نم ادمل رٌبعت ءاشنإب مجرتملا موقٌ انهو حشرملا قٌبطتل كلذو
مسق ًف دوجوملا حشرملا Where تاٌلمعلا ةمباق ًف رصنع لك ىلع هقبطٌو
Dim q = Process.GetProcesses().Where( _
Function(p) p.PriorityClass = ProcessPriorityClass.High)
كلجأ نم كلذ لكب موقٌ ثٌح تاضوفملا عم اهطبرو قرطلا ءاشنإ ةٌلمع راصتخا لجأ نم مجرتملل اراصتخا ادمل رٌبعتلا لكشٌ اساسأو
عونلا ىلع ًلحملا للدتسلا مدختسٌ انه مجرتملا نأ ًه تاضوفملاو ؾباظولا مادختسا دنع اهٌنجن لو ادمل رٌباعت نم اهٌنجن ًتلا ةدبافلاو
ددحملا عون دٌدحت متٌ قباسلا لاثملا ًفف ادمل رٌباعت ىلع p مسق ًف رٌبعتلا ددحٌ ةلاحلا هذه ًفو مادختسلا ىلع ءانب Where ادمل رٌبعت
لبق نم ةموعدملا عونلا ىلع ًلحملا للدتسلا ةزٌم ربتعت ثٌحب ادمل رٌبعتلا نم ةداعملا ةمٌقلا عون ىلع اٌلآ للدتسلاب مجرتملا موقٌو
كٌزٌاب لوجٌفل ةٌوقلا تافاضلا نم جلاعملا

عٌٕٛا ٍٝػ ٍٟحٌّا يلذزعلا
ًهف ًلاتلابو رٌؽتم لكل مبلملا عونلا دٌدحت لوح قلقت نأ كٌلع دعٌ مل هنأ ًنعٌ ةٌوقلا عونلا ىلع ًلحملا للدتسلا ةزٌم مٌدقت
ضوفم عون كٌدل ناك نإف ادج دٌفم ادمل رٌباعت نم داعملا عونلا ىلع للدتسلاف ةلٌحتسم ودبت تناك ًتلا روملا نم دٌدعلاب ماٌقلا نم كنكمت
تاددحملا عٌمج عون دٌدحت كٌلع دعٌ مل ادمل رٌبعت عم هطبر دٌرت
Dim lambda As Func(Of Integer, Integer) = Function(x) x * x
وه ادمل رٌبعت عون نوكٌ لاثملا اذه ًفف Func(Of Integer, Integer) عونلا نم ددحم ذخؤٌ ضوفم وهو Integer عونلا نم ددحم دٌعٌو
Integer ددحملا نأ ىلع اٌلآ لدتسٌ مجرتملاف اذهل ةجٌتنكو x عونلا نم وه ادمل رٌبعتل دباعلا Integer ًه ادمل رٌبعتلا نم ةداعملا ةمٌقلاو
Integer ًلاتلا دوكلا ظحل اضوفم ذخؤت ةقٌرط ًعدتست امدنع ادمل رٌباعت عون ىلع للدتسلا نم ةدافتسلا كنكمٌ امك اضٌأ
Delegate Function ShouldProcess(Of T) (element As T) As Boolean

Sun ProcessList(Of T) (_
Elements As List(Of T), shouldProcess As ShouldProcess(Of T))
' Method body removed for brevity
End Sub
309

ةفٌظولا ذخؤت ةلاحلا هذه ًف ProcessList لكشلا ىلع اهإاعدتسا نكمٌو ادمل رٌبعت
Sub DoIt()
Dim list As new List(Of A)
' fill or obtain elements in list
ProcessList(list, Function(a) a.x > 50)
End Sub
هسفنب هٌلع لدتسٌ جلاعملا نل كلذو اقباس انلعف امك ادمل رٌبعتلل ررمملا ددحملا عون ددحن مل اننأ ظحل .
مجرتملا ىرٌ ةٌادبلا ًفف لاثملا اذه ًف عونلا ىلع للدتسلا نم تاٌوتسم ةدع كانه ةقٌقحلا ًف ؟اذهك اش ثودح نكمٌ ؾٌك ProcessList
ذخؤٌ يداع ءارجإك list(Of T) و هل لخدك ShouldProcess(Of T) ءاعدتسا ًف ProcessList نأ مجرتملا ىرٌو list لولا ددحملا ًه
اهنأو list(Of Person) عون ةٌهام لوح تاحٌملت رفوٌ ل ًناثلا ددحملا نأ امبو T نأ مجرتملا ررقٌف T عونلا نم Person اذه نم لدتسٌو
ددحم نأ ىلع ShouldProcess(Of T) عونلا نم وه Person عونلا نم وه ًناثلا ددحملا نأ ىلع لدتسٌ اذهبو ShouldProcess(Of T)
عٌقوت ىلع دمتعٌ ددحملا عون نأ ؾرعٌ مجرتملاو هب صاخلا ددحملا عون مدقٌ ل ادمل رٌبعت نأ امب ارٌخأو
ضوفملا ShouldProcess(Of T) ددحملا عون نأ ىلع لدتسا دقو a وه Person سٌلف عونلا ىلع للدتسلا نم اٌوق اعون اذه ربتعٌو
ىلع للدتسلاو كنع ةباٌن لمعلا كلذب موقٌ مجرتملا كرت لضفلا نم ةقٌقحلا ًفو ادمل رٌبعت ًنبت امدنع ضوفملا تاددحم عون ةفرعم كٌلع
ةرفوتم ةزٌملا هذه نؤب املع كلجأ نم هعٌنصتب موقٌ نأ مجرتملا نم دٌرتو ضوفم عون كٌدل نكٌ مل نإ ةقٌقح دٌفم ةقٌرطلا هذهب ةجٌتنلا عون
طقف كٌزٌاب لوجٌف ًف
Dim lambda = Function(x As Integer) x * x
ددحملا نأ امب قباسلا لاثملا ًفف x عونلا نم وه Integer عونلا نم ًه ةداعملا ةمٌقلا نأ ىلع اٌلآ لدتسٌ مجرتملاف Integer ةجٌتنك اضٌأ
كلذ طبرٌو ادمل رٌبعت لكش قباطٌ لوهجم ضوفم عٌنصتب مجرتملا موقٌ اذهل اعون كلتمٌ ل ادمل رٌبعت نأ امبو رٌبعتلا ًف ةدوجوملا ةلداعملا
ادمل رٌبعتب ضوفملا عونلا . ةضوفملا عاونلا ؾٌرعتل جاتحت نأ نودب ةعرسب ادمل رٌباعت ءاشنإ كنكمٌ هنأ ًنعت اهنل ةمٌظع ةزٌم هذهو
اهب ةصاخلا . ًلاتلا دوكلا ًفف نكاملا نم دٌدعلا ًف كلذ لعف ىلإ جاتحتو تارٌؽتملا نم ةعومجم قٌبطتل هٌف جاتحت عضو ًف تنك ةرم مكف
ةفٌظولا ءاجرأ ًف تتشتلا نم لدب دحاو ناكم ًف طرشلا نم ققحتلا نكمٌ ثٌحب كلذ ةجلاعم اننكمٌ ةداعو ةهباشم تلاح ةدع ترم
Class Motorcycle
Public color As String
Public CC As Integer
Public weight As Integer
End Class

Sub PrintReport(motorcycle As New Motorcycle)
If motorcycle.color = "Red" And motorcycle.CC = 600 And _
Motorcycle.weight > 300 And Motorcycle.weight < 400 Then

' do something here
End If

' do something here

If motorcycle.color = "Red" And motorcycle.CC = 600 And _
Motorcycle.weight > 300 And Motorcycle.weight < 400 Then

' do something here
End If
End Sub
ىلع رثإٌ كلذب ماٌقلاو طقف ةفٌظولا كلت معدل ةبفلا ًف ءارجإ ةفاضإ اننكمٌو طقف ةفٌظولا هذه ًف ققحتلا اذه مدختسٌ ناٌحلا ضعب ًفو
ىلإ تابفلا ضعب ًف اذه يدإٌ دقو ام لٌدعتب ماٌقلل تجتحاو رخآ ناكم ًف ةفٌظولا هذه ءاعدتساب ام دحأ ماق ول اذامف دوكلا ةناٌص ةٌلمع
ةٌصاخ لعاج اهبقعت بعصٌ ؾباظو دوجو IntelliSense قطنم قرخ ىلإ ةفاضإ اهٌف ةٌفاضلا تلخدملا نم دٌدعلا دوجول ةدباف لق
ٌ
ا
310

نم دٌدعلا دوجو عمو اهمدختست ًتلا ةقٌرطلا نم ةبٌرق نوكت نأ لضفٌ اهدنع ةفلتخم ةلصفنم ةقٌرط مادختساب كلذب انمق نإو ةٌلحملا
مجرتملا كرتو ادمل رٌباعت مادختسا ًتؤٌ انهو لٌوطلا ىدملا ىلع ةٌلحملا ةناٌص بعصلا نم حبصٌ عورشملا سفن ىلع نولمعٌ صاخشلا
ةجاحلا دنع اهمادختساب موقٌو تاضوفملا ءاشنإب اٌلآ موقٌ
Sub PrintReport(motorcycle As New Motorcycle)
Dim check = Function(m As Motorcycle) m.color = "Red" And _
m.CC = 600 And _
m.weight > 300 And _
m.weight < 400

If check(motorcycle) Then
' do something here
End If

' do something here

If check(motorcycle) Then
' do something here
End If
End Sub
طورش ضعب صحفت قطنم لٌدعتب انه انمق Motorcycle مجرتملا موقٌس ثٌح ةصاخلا قبارطلا تابٌس نع اضوع ادمل رٌباعت مدختسٌل
نم بٌرق قطنملا عضت اهنل ةدٌفم ةقٌرطلا هذهو كلذ جاتحا امنٌأ ادمل رٌباعت ءاعدتسا عٌطتسن ًكل لمعلاب موقٌو ضوفملا عونلا ءاشنإب اٌباقلت
دقعم رٌبعت ءانب نم كنكمٌ هنل ادٌفم اذه ربتعٌو ةناٌصلا تاٌلمع مظعمب اهدعب مجرتملا موقٌو ةدحاو ةخسن عٌنصتب موقن ثٌح حٌرصتلا
رٌؽتملا وأ ادمل رٌبعت عون ددحن لف وٌرانٌسلا اذه ًف عونلا ىلع للدتسلاو رخؤتملا طبرلا مادختسابو ادمل رٌبعتل مسجك
Dim lambda = Function(x) x * x
ـك ادمل رٌبعت عون ددحٌ نكلو كلجأ نم لوهجم ضوفم جلاعملا دلوٌ اضٌأ انهو System.Object رخؤتملا طبرلا لٌعفت مت دق هنأ ًنعٌ اذهو
راٌخلا نوكٌ امدنع وٌرانٌسلا اذه ًف Option Strict عضولا ىلع Off طبرلا ىلع نودمتعٌ نٌذلا كبلول ةبسنلاب ادٌج وٌرانٌسلا اذه ربتعٌو
لماعملا نأ املاط قباسلا لاثملا ًفف لماك لكشب رخؤتملا طبرلا تاٌلمع معدت ادمل رٌباعت نأ ثٌح رخؤتملا * ىلإ ةررمملا عاونلا ىلع ؾرعم
لمعٌ ؾوسف ادمل رٌبعت
Dim a = lambda(10)
Dim b = lambda(CDec(10))
Dim c = lambda("This will throw an exception because " & _
"strings don't support the * operator")
لماعملا نأ املاط قباسلا لاثملا نم ىرت امكو * امك دٌج لكشب اش لك يرجٌ ؾوسف ررمملا عونلل ةبسنلاب لٌؽشتلا نمز تابتكم ًف دوجوم
كٌزٌاب لوجٌف ًف رخؤتملا طبرلا عم عبار لكشب ملقؤتت ادمل رٌباعت نأ .

ءبطغٌا ذحر دٛىٌا ذ١ٌٛر
مجرتملا لبق نم هدٌلوت متٌ يذلا دوكلا ىلع ةرظن ًقلن انعد ادمل رٌباعت انفشكتسا امدعب . قباسلا دوكلل رظنا
Sub TestLambda()
Dim doubleIt As Func(Of Integer, Integer) = _
Function(x As Integer) X * 2
Console.WriteLine(doubleIt(10))
End Sub
311

نأ ملعت تنأ Func رادصإب مجرتملا موقٌ ةلاحلا هذه ًف ؟لمعلاب اذإ مجرتملا موقٌ ؾٌكف ؾباظولل تارشإم ًه تاضوفملاو ضوفم وه
ةدٌدجلا ةفٌظولا كلت ىلإ رٌشٌ ضوفمب اهطبرٌو ةدٌدج ةفٌظو
Private Function $GeneratedFunction$(x As Integer) As Integer
Return x * 2
End Function

Sub TestLambda()
Dim doubleIt As Func(Of Integer, Integer) = _
AddressOf $GeneratedFunction$
Console.WriteLine(doubleIt(10)
End Sub
ةدلوملا ةدٌدجلا ةفٌظولا ناونع ادمل رٌبعت ذخؤٌ ثٌحب حٌرصتلا ةرابع رٌؽٌو هتاٌوتحمب ةدٌدج ةفٌظو اشنٌو ادمل رٌبعت مجرتملا ذخؤٌ ثٌح
ناك نإف ادمل رٌبعت مدختست ًتلا ةقٌرطلا ىلع يوتحٌ يذلا بلا سفنب ةفٌظولا دٌلوت متٌ ةلاحلا هذه ًفف TestLambda ةبفلا ًف ؾرعم C
ةبفلا ًف ةدٌدجلا ةفٌظولا ؾٌرعت متٌ ؾوسف C ددحم مادختساب اهنع حٌرصتلا متٌو ءاعدتسلل ةلباق رٌؼ ةفٌظولا هذه نأ ظحلنو اضٌأ
لوصولا Private

داش١غزٌّا غفسٚ اذٌّ ش١ثبؼر
عفر رامث عم ادمل رٌباعت ةوق ًتؤت كلذ عمو تارٌؽتملا كلت ىلإ اهرٌرمت متٌ تارٌؽتم ىلإ ادمل رٌباعت مسج رٌشٌ ةقباسلا ةلثملا ًف
هباشتم أدبم ىلع ةٌنبم ادمل رٌباعت عٌمجو تارٌؽتملا . نمض اهفٌرعت متٌ مل ةرح تارٌؽتم وأ ةطبترم تارٌؽتم مدختسٌ نأ نكمٌ ادمل رٌبعتو
وأ ةٌلحم تارٌؽتم نوكت دقف رٌبعتلل ًعدتسملا ءارجلا ًف اهنع حٌرصتلا مت دق نوكٌ نأ نكمم ةرحلا تارٌؽتملاف ادمل رٌبعتب صاخلا عٌقوتلا
ادمل رٌبعتلل ةٌوتحملا ةبفلا ًف رصانع وأ رٌبعتلا مسج ًف اهنع حٌرصتلا مت ًتلا كلت نوكت ةطبترملا رٌباعتلاو ءارجلا كلذل ةررمم تاددحم
ةبفلا كلتل بلا ةبفلا انمضتم . ةللد ىلع رثإت اهنل كب ةصاخلا ادمل رٌباعت ًف ةرحلاو ةطبترملا تارٌؽتملا نٌب زٌٌمتلا لجأ نم ماه اذهو
ىرخأو ةطبترم تارٌؽتم مدختست ادمل رٌباعت ىلع يوتحٌ لاثم اذهو كجمانرب ةحص ىلع رثإٌ ًلاتلابو هدٌلوت متٌ يذلا دوكلاو ادمل رٌبعت
ةرح
Function MakeLambda() As Func(Of Integer, Integer)
Dim y As Integer = 10
Dim addTen As Func(Of Integer, Integer) = Function(ByVal x) x + y
Return addTen
End Function

Sub UseLambda()
Dim addTen = MakeLambda()
Consloe.WriteLine(addTen(5))
End Sub
ةعابطب موقٌس دوكلا اذهف 15 ءاعدتسا متٌ امدنع لوسنوكلا ةذفان ىلع UseLambda ددحت ؟اذه لمعٌ ؾٌك كسفن لؤست نأ نكمٌ نكلو
ةفٌظولا MakeLambda رٌؽتملا y مدختسٌ ادمل رٌبعتلاو ًلحم رٌؽتمك y ةفٌظولا نم داعم عونك هتداعإ متٌ ادمل رٌبعتلا نكلو
MakeLambda ةفٌظولاو UseLambda ةفٌظولا نم ادمل رٌبعتلا ىلع لصحت MakeLambda نأ ول امك رملا ودبٌو ادمل رٌبعتلا ذفنتو
رٌؽتملا y ادمل رٌبعتلا لبق نم هركذت مت دق . رٌؽتملا ةاٌح ةرتفف y ةقٌرطلا ةٌاهن عم ًهتنت MakeLambda ادمل رٌبعتلا ىلع لصحن امدنعف
نم MakeLambda حبصت ؾوسف MakeLambda اذه قلعٌ ام ةقٌرطبو سدكملا ًف اهزجحت ًتلا ةحاسملا ةلازإ بجٌو لاجملا جراخ
رٌؽتملا عفرب ؾرعٌ ام اذهو ادمل رٌبعت عم رٌؽتملا Variable Lifting رٌؽتملا ىعدٌ ةلاحلا هذه ًفف y ىرت امكو عوفرملا رٌؽتملاب
جراخ اهظفحٌ ثٌح رٌؽتملا ةلاح كاسمإ نم كنٌكمت لجأ نم لمعلا نم رٌثكلاب موقٌ مجرتملاف ةٌوق ةٌجمرب ةزٌم ربتعت ةعوفرملا تارٌؽتملاف
ىعدت ةبف ىلإ رٌؽتملا عفرب موقٌ ةرح تارٌؽتم مدختست ادمل رٌباعت مجرتملا ؾداصٌ امدنعف ةٌعٌبطلا اهتاٌح ةرتف لاجم Closure نوكت ثٌحب
ًف تارٌؽتملا ىلإ لوصولا ةباتك ةداعإب مجرتملا موقٌو اهلخاد ةفاضتسملا ةرحلا تارٌؽتملا ةاٌح ةرتف دعب ام ىلإ دتمت ةبفلا هذه ةاٌح ةرتف
ةبفلا ًف ةدوجوملا اهتخسن ىلإ لوصولا متٌل قرطلا Closure
لاثملا ربع ىرخأ ةرم رٌسن انعد MakeLambda
312

Dim MakeLambda() As Func(Of Integer, Integer)
Dim y As Integer = 10
Dim addTen As Func(Of Integer, Integer) = Function(ByVal x) x + y
Return addTen
End Function
رٌؽتملاف اقباس لٌلحتلاب انمق امكو x رٌؽتملا نكلو ادمل رٌبعتلا ددحمب طبترم y ةبفلا ءاشنإب عباتٌو كلذ نع ؾشكلاب مجرتملا موقٌو رح رٌبعت
Closure ادمل رٌبعت ؾٌرعت ًف امك ةرحلا تارٌؽتملا طقتلت ًتلا
Public Class _Closure$__1
Public y As Integer
Public Function _Lambda$__1(ByVal x As Integer) As Integer
Return x + Me.y
End Function
End Class
رٌؽتم نأ ةٌإر كنكمٌ Closure رٌؽتملا طقتلٌ y ةبفلا ًف هنزخٌو Closure ةبفلا لخاد طبترم رٌؽتم ىلإ اهدعب رحلا رٌؽتملا لٌوحت متٌو
Closure ًلٌ امك ودبتل ادمل رٌبعتلا ىلع يوتحت ًتلا ةقٌرطلا ةباتك ةداعإب مجرتملا موقٌ امك
Function MakeLambda() As Func(Of Integer, Integer)
Dim Closure As New _Closure$__1
Closure.y = 10
Return AddressOf Closure._Lambda$__1
End Function
رٌؽتملا ءاشنإب مجرتملا موقٌ ؾٌك ةٌإر نلا كنكمٌ Closure رٌؽتملا ةباتك دٌعٌو y رٌؽتملا نمض هعفر مت يذلا Closure هتمٌق طبضٌو
ةبفلا نمض نزخملا ادمل رٌبعت ناونع ةطاسبب دٌعٌو Closure طقف ادمل رٌباعت ًف ةرحلا تارٌؽتملا عفرب موقٌ مجرتملا نأ ةظحلم ماهلا نمو
ًف رٌؽتملا ةلاح طاقتلا متٌو Closure ادوجوم ًقب ادمل رٌبعت نأ املاط ادوجوم ىقبٌ يذلا . ًلاتلا لاثملل رظنا
Sub Test()
Dim y As Integer = 10
Dim Lambda As Func(Of Integer, Integer) = Function(ByVal x) x + y
y = 20
Console.WriteLine(Lambda(5))
End Sub
تلق نإ ؟ةقباسلا ةفٌظولا ذٌفنت دنع رهظت ًتلا ةمٌقلا ًه ام 25 تبصأ دقف . اذاملف 25 تارٌؽتملا عٌمج ةباتك ةداعإو طاقتلاب موقٌ مجرتملا ؟اذإ
ةرحلا y ةخسن ىلإ Closure ًلاتلاك
Sub Test()
Dim Closure As New $Closure_Compiler_Generated_Name$
Closure.y = 10
Dim Lambda = AddressOf Closure.Lambda_1
Closure.y = 20
Console.WriteLine(Lambda(5))
End Sub
ةمٌق نوكت هٌف ادمل رٌبعت ذٌفنت متٌ يذلا تقولا ًفف y ىلإ ترٌؽت دق 20 دٌعٌ ادمل رٌبعت ذٌفنت متٌ امدنعف اذهبو 20 + 5 هنل ادج ماه اذهو
ًف اهطاقتلا متٌ ةرحلا تارٌؽتملا نأو تاقلحلا نع ثٌدحلل ًتؤن امدنع Closure ةبٌرؼ تافرصت ىرت دق دٌحو . ًلاتلا لاثملل رظنا
Sub Test()
For I = 1 To 5
StartThread(Function() I + 10)
Next
313

End Sub
نأ ضرفا StartThread ىلإ هطاقتلا مت هنأ املاطو لوسنوكلا ىلع ةجٌتنلا عبطٌو ادٌدج اراسم اشنٌ Closure دق ةقلحلا نوكت نأ نكمٌف
ةمٌق ترٌؼ I كٌلع كلذ نع لدبو ةعقوتملا ةجٌتنلا عبطٌ ل دق جمانربلاف ةلاحلا هذه ًفو ادمل رٌبعت ءاعدتساب هٌف راسملا موقٌ يذلا تقولا ًف
ةقلحلا لخاد طقتلملا رٌؽتملا ةٌإر
Sub Test
For I = 1 To 5
Dim x = I
StartThread(Function() x + 10)
Next
End Sub
ةمٌق نلا طقتلٌس دوكلاف x ًف Closure متٌس امدنع اهعفر متٌس تارٌؽتم ةٌأ ةفرعم ادج ماهلا نمو عقوتم وه امك مٌقلا عبطٌس جمانربلاو
ةحٌحص ةروصب هذٌفنت متٌ كجمانرب نأ نم دكؤتلا كنكمٌ كلذبو ةعوفرملا تارٌؽتملا كلت ةمٌق رٌٌؽت متٌس ىتمو ادمل رٌبعت ذٌفنت .
ًضِلا ًىشٌبث اذٌّ ش١ثبؼر َاذخزعا
كٌزٌاب لوجٌف ًف 2008 ًه ةدٌدج ةٌثلث ةزوجحم ةملك مٌدقت مت دقو ادمل رٌبعتل مسجك دحاو رٌبعت رٌرمت كنكمٌ If نم كنكمتل
لماك عون تاذ ةٌطرش رٌباعت ةباتك
Dim x = IF(condition, 10, 20)
ةزوجحملا ةملكلاو If ةفٌظولا ءاعدتسل ةهباشم IIF عونلا دض ةنمآ اهنأ ادع امٌف . ًعرف لك مجرتملا عبتتٌ قباسلا لاثملا ًف هنأ ًنعٌ اذهو
زوجحملا ةملكلا If دٌعٌو Integer عون نأ ررقٌو عونلا ىلع للدتسلا دعاوق قبطٌ وهف اذهبو x وه integer مادختسا نكلو IIf دٌعٌس
عونلا Object . مادختسا كنكمٌ امك If ادمل رٌبعت ًف
Dim x = Function(c As Customer) _
If(c.Age >= 18, c.Address, c.Parent.Address)
ةبف كٌدل هنأ ضرتفا قباسلا لاثملا ًفف Customer ةٌصاخلا اهفٌرعت نمضتٌ Address رٌبعت نأ ثٌح نوبزلل ًلاحلا ناونعلا لثمت ًتلا
ًثلثلا رٌبعتلا مدختسٌ ادمل Ternary Expression نم رثكأ وأ اٌواسم نوبزلا رمع ناك نإف لخدلا ددحم ىلع طرشلا قٌبطتل 18 دٌعٌ وهف
نوكٌل ادمل رٌبعت عون دٌدحتب مجرتملا موقٌو اضٌأ عونلا ىلع للدتسلا مادختسا متٌ انهو هدلاو ناونع دٌعٌ وهف لإو هناونع Address مث
ضوفملا عونلا ءاشنإب موقٌ x ضوفملا عونلا ذخؤٌ ثٌح اقباس اهتشقانم تمت ًتلا ةقٌرطلاب Customer دٌعٌو لخدك Address .


314

Nullable Value Types

نكمٌ لثم تاناٌب ةدعاق ًف لقحف ةنٌعم تلاح ًف ةددحم ةمٌق كلمت ل دق اهنكلو عون تاذ ةمٌق عم لماعتن ناٌحلا ضعب ًف
ادبأ ةمٌق هل سٌل نأ وأ ىنعم تاذ ةمٌق هل نأ نٌب هزٌٌمت . اش ل مٌق وأ ةٌداع امٌق امإ ذخؤتل مٌقلا عاونأ عٌسوت اننكمٌ اهدنع null Value
ىعدٌ عٌسوتلا اذهو nullable type .
لك nullable type بٌكرتلا نم هإاشنإ متٌ Nullable(T) . عونلا لمحٌ رٌؽتم نع حٌرصتلا متٌ ًلاتلا لاثملا ًفف Nullable Boolean
Type ًلٌ امك
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

رٌؽتملاف ridesBusToWork ةمٌقلا لمحٌ نأ نكمٌ True ةمٌقلا وأ False ًه هل ةٌضارتفلا ةمٌقلا نوكتو اقلطإ ةمٌق يأ لمحٌ ل نأ وأ
ةمٌقلا لباقملا ًفو صخشلا كلذ نم ةمولعملا كلت ىلع لوصحلا متٌ مل هنأ ًنعٌ دق ةلاحلا هذه ًفو ةمٌق يأ لمحٌ ل هنأ False نأ ًنعت دق
لمعلل صابلا بكرٌ ل صخشلا .
نم تاءارجإ وأ تافوفصم ىتح وأ صباصخ وأ تارٌؽتم نع حٌرصتلا كنكمٌ nullable types ةداعإ كنكمٌ امك Nullable type نم
ام ةفٌظو . ءاشنإ كنكمٌ ل نكلو nullable type ًعجرم عون نم Reference type وأ تابفلا وأ تافوفصملا لثم String عونلاف
ةمٌقلاب عون نوكٌ نأ بجٌ ًساسلا Value type
صباصخلا ربتعت HasValue و Value ًف ةٌمهأ رثكلا رصانعلا ًه nullable type عونلا نم رٌؽتم لجأ نمف nullable
type ةٌصاخلا انربخت HasValue ةٌصاخلا كلت ةمٌق تناك نإف ل مأ ةددحم ةمٌق رٌؽتملل ناك اذإ امٌف True رٌؽملا ةمٌق ةءارق كنكمٌ اهدنع
ةٌصاخلا نم Value نٌتٌصاخلا اتلك نأ ىلإ هابتنلا كٌلع بجٌو HasValue و Value طقف ةءارقلل نٌتٌصاخ امه .
عونلا نم رٌؽتم نع حرصت امدنع nullable type ةٌصاخلل ةٌضارتفلا ةمٌقلا نوكت HasValue ًه False ًف رٌؽتملا نأ ًنعٌ اذهو
رٌؽتملل نوكٌ ل ًلاتلا لاثملا ًفف عونلا اذهل سسإملا ةمٌقلا عونل ةٌضارتفلا ةمٌقلا نع اضوع ةددحم ةمٌق يأ لمحٌ ل ةٌضارتفلا ةلاحلا
numberOfChildren عونلل ةٌضارتفلا ةمٌقلا نأ عم ةددحم ةمٌق Integer رفصلا ًه
Dim numberOfChildren? As Integer

اش ل ةمٌقلا نوكتو Null Value رٌؽتملا نع حٌرصتلا مت نإف ةددحم رٌؼ وأ ةفورعم رٌؼ رٌؽتملا ةمٌق نأ حٌضوتل ةدٌفم
numberOfChildren هنأ ىلع Integer دعب ةبولطملا تامولعملا رٌفوت متٌ مل هنأ ىلإ رٌشت ةمٌق كانه نوكٌ نلف
عونلا نم رٌؽتملا ةمٌق طبض نكمٌ امك nullable type رٌؽتملل ةمٌق طبضٌ يذلا ًلاتلا لاثملا ًف امك ةٌداٌتعلا ةقٌرطلاب
numberOfChildren قباسلا لاثملا ًف هنع حٌرصتلا مت يذلا
numberOfChildren = 2

عونلا نم ةٌصاخ وأ رٌؽتمل تناك نإو nullable type اهطبضب كلذو ةمٌق ىلع اهباوتحا مدعب ةٌساسلا ةمٌقلل اهتداعإ كنكمٌ ةددحم ةمٌق
ىلإ Nothing لاثملا ًف امك
numberOfChildren = Nothing

ةمٌقلا طبض كنكمٌ هنا عم Nothing عونلا نم رٌؽتملل Nullable type عم ةنراقملاب هصحف كنكمٌ ل هنأ لإ Nothing ةملع مادختساب
لثم ةاواسملا ةملع مدختست ًتلا ةنراقملا ةمٌق نوكتو ةاواسملا someVar = Nothing ـل ةٌواسم امباد Nothing . كنكمٌ كلذ نع لدب
ةٌصاخلا ةمٌق صحف hasValue ةمٌقلا لجا نم False لماعملا مادختساب وأ Is لماعملا وأ IsNot
315

عونلا نم رٌؽتم ًف ةنزخملا ةمٌقلا ىلع لوصحلل nullable type ةٌصاخلا صحف لوأ كٌلع بجٌ HasValue ةمٌق لمحت اهنأ نم دكؤتلل
هتٌصاخ ةمٌق تناكو رٌؽتملا كلذ ةمٌق ةءارق تلواح نإف HasValue ـل ةٌواسم False ءانثتسا قلطإب كٌزٌاب لوجٌف موقٌ ؾوس
InvalidOperationException رٌؽتملا ةمٌق ةءارقل اهب حوصنملا ةقٌرطلا ًلاتلا لاثملا انٌرٌو numberOfChildren لاثملاب ةصاخلا
قباسلا
If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If

عونلا نم تارٌؽتم مادختسا متٌ امدنع Nullable Boolean ةمٌقلا نوكت نأ نكمٌ ةٌقطنملا رٌباعتلا ًف True وأ False وأ Nothing امٌفو
لجأ نم ةقٌقحلا لودج ًلٌ And و Or نأ امب b1 و b2 ةنراقملل تلامتحا ةعست كانه نوكٌ ةلمتحم مٌق ةثلث ناكلمٌ
b1 b2 b1 And b2 b1 Or b2
Nothing Nothing Nothing Nothing
Nothing True Nothing True
Nothing False False Nothing
True Nothing Nothing True
True True True True
True False False True
False Nothing False Nothing
False True False True
False False False False

رٌبعتلا وأ ًقطنملا رٌؽتملا ةمٌق نوكت امدنع Nothing تسٌل ًه ةمٌقلاف True تسٌل و False ًلاتلا لاثملل رظنا اضٌأ
Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
Console.WriteLine("Expression is true")
Else
Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
Console.WriteLine("Expression is false")
Else
Console.WriteLine("Expression is not false")
End If

316

مٌقت لاثملا اذه ًفف b1 And b2 ىلإ Nothing مسق ذٌفنت متٌ ةجٌتنلابو Else رٌبعت لك ًف If ًلٌ امك جرخلا نوكٌو
Expression is not true
Expression is not false

نا ظحل AndAlso و OrElse هتمٌق مٌٌقت مت دق لولا رٌبعتلا نوك ةلاح ًف ًناثلا امهلماعم مٌٌقتب ناموقت رصتخملا مٌٌقتلا نامدختست نٌتللا
ىلإ Nothing
ةحازإ وأ ةٌقطنم وأ ةٌضاٌر ةلداعم ًف تلماعملا دحأ وأ لك ناك نإ nullable اضٌأ ةجٌتنلا نوكتسف nullable لكل ناك نإو
يواست ل ةمٌق نٌلماعملا Nothing سٌلو ةمٌق عون نم امهنأ ول امك تلماعملا كلت مٌق قفو ةٌلمعلا متت nullable ًلاتلا لاثملا ًفف
رٌؽتملا compare1 رٌؽتملاو sum1 امهلك نأ ىلإ رٌشٌ مجرتملا نأ ظحلتس امهقوف لٌلق ةرؤفلا ةرٌشم تفقوأ نإف ناٌنمض ناعون
نم nullable type
'Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3>2, but compare1 is inferred to be of
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine(m & " * " & n & " * " & sum1 & " * " & compare1)

تلماعملا نم رثكأ وأ دحاو ةمٌق تناك نإو Nothing نوكتس ةجٌتنلاف Nothing
' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays 3 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

مادختسا نكامأ رثكأ تاناٌبلا دعاوق لكشت nullable types معدت تاناٌبلا دعاوق ضارؼأ عٌمج تسٌل نأ عم ةٌمهأ nullable types نكلو
ـلا TableAdapter اهمعدٌ ممصملا لبق نم دلوملا

317

Object Initializers

كنكمت Object Initializers نم دٌدحت صباصخ ضرؼ دقعم نمض رٌبعت دحاو مدختستو ؾٌرعتل تارٌؽتم نم لك نم عاونلا
ةفورعملا ةلوهجملاو ولف انضرف هنأ انٌدل ةبف ةطٌسب Employee ةفرعم ىلع لكشلا
Public Class Employee
Private _name As String
Private _Salalry As Short
Private _Address As String

Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property

Public Property Salary() As Short
Get
Return _Salalry
End Get
Set(ByVal value As Short)
If value > 0 Then
_Salalry = value
End If
End Set
End Property

Public Property Address() As String
Get
Return _Address
End Get
Set(ByVal value As String)
_Address = value
End Set
End Property
End Class

اننكمٌ مادختساب ؾٌرعت رٌؽتم رٌشٌ ىلإ كلت ةبفلا ادنساو صباصخلا امك ًف دوكلا ًلاتلا عم اننأ انسل نٌرطضم انه طبضل مٌق ةفاك
صباصخلا ًتلا ةبفلا اهٌوتحت موقنف طبضب مٌق صباصخلا ًتلا جاتحن اهطبضل طقف

Dim Empl3 = New Employee With {.Name = "Mazen", .Salary = 8500}
Dim Empl1 As New Employee With {.Name = "Reem", .Salary = 10000}
امك اننكمٌ راصتخا مسق AS انه نكمٌف ةباتك حٌرصتلا امك ًلٌ كلذو دامتعا ىلع local type inference
Dim Empl5 = New Employee With {.Name = "Ahmad"}
امنٌب انك ًف قباسلا مادختسابو سفن ةبفلا امك ًلٌ
Dim Empl2 As New Employee
With Empl2
318

.Name = "Ahamd"
.Salary = 11500
End With

نإو تناك انٌدل ةبف جاتحت رٌرمتل مٌق دٌشمل ةبفلا لثم ةبفلا Person اننكمٌف لثم اضٌأ مادختسا سفن ةقٌرطلا طبضل صباصخ ىرخأ متٌ ل
اهرٌرمت دٌشمل ةبفلا
Dim Per1 As New Person("Ghassan") With {.Address = "Damas"}
امك مدختست هذه ةقٌرطلا اضٌأ ؾٌرعتل عاونلا ةلوهجملا
Dim Visitor = New With {.Name = "Mussa", .Account = 232536}
امكو ظحلن نم ةقٌرط ؾٌرعتلا ةؽٌصف ؾٌرعت عاونلا ةفورعملا ةلثامم ًف لكشلا عاونلل ةلوهجملا ًفف عاونلا ةفورعملا ظحل دوجو مسا
ةبفلا دعب ةملكلا new امنٌب امدنع ؾرعن اعون لوهجم دجوٌل مسا ةبفلل دعب ةملكلا new ببسب نأ عاونلا ةلوهجملا سٌل اهل مسا ةبف ةلباق
مادختسلل دنعف مادختسا ةبف ةفورعم دنع حٌرصتلا بجٌ نأ نوكت صباصخلا ًتلا دٌرن طبض اهمٌق ةدوجوم لعف حٌرصتلاو اشنٌ ارٌؽتم
رٌشٌ ىلإ كلت ةبفلا نمو لجأ ؾٌرعت عونلا موقٌ لوهجملا مجرتملا ءاشنإب ةبف ةدٌدج كلذل رٌؽتملا يوتحت صباصخلا راشملا اهٌلإ ًف
حٌرصتلا ددحٌو اهمسا دنع ةمجرتلا دقو ؾلتخٌ مسل نم ةٌلمع ةمجرت ىرخل نكمٌ ل كلذل دامتعلا ىلع مسا تابفلا ةلوهجملا نمض دوكلا
وأ ؾٌرعتلا
كٌلإو ضعب تاظحلملا ةصاخلا ؾٌرعتلاب
- ةمباق ؾٌرعتلا دعب With نكمٌ ل نأ نوكت ةؼراف
- نكمٌ ل راركت ؾٌرعت ةمٌق ةٌصاخل رثكأ نم ةرم ًف سفن ؾٌرعتلا
- نكمٌ طبض ةمٌق ةٌصاخ نم ةٌصاخ ىرخأ
- ًف لاح تناك ىدحإ صباصخلا ةبف نكمٌ شٌشعت حٌرصتلا سفنب ةقٌرطلا
Dim cust12 = New Customer With {.Name = "Toni Poe", _
.Address = New AddressClass _
With {.City = "Louisville", _
.State = "Kentucky"}}
Console.WriteLine(cust12.Address.State)

- نكمٌ ل مادختسا رصانع ةكرتشم Shared وأ ةءارقلل طقف ReadOnly وأ تباوثلا وأ ءاعدتسا قرطلا ًف ةمباقلا دعب ةملك With
- نكمٌ ل مادختسا صباصخلا ًتلا كلتمت اسرهف وأ ةطورشملا ةفوفصمك لثم تافٌرعتلاف ةٌلاتلا لثم رٌؼ ةحٌحص
'' Not valid.
' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}
' Dim c2 = New Customer with {.Address.City = "Springfield"}


319

عٌٕٛا ٍٝػ ٍٟحٌّا يلذزعلا Local Type Inference


كٌزٌاب لوجٌف ًف مجرتملا مدختسٌ 2008 عونلا ىلع للدتسلا Type Inference مت ًتلا ةٌلحملا تارٌؽتملا عون دٌدحتل
ةرقف مادختسا نودب اهنع حٌرصتلا As كلذ ةمٌق طبضٌ يذلا رٌبعتلا عون نم رٌؽتملا عون ىلع مجرتملا لدتسٌ ثٌح حٌرصتلا رٌبعت ًف
ًلاتلا لاثملا ًف امك اهعون دٌدحت نودب تارٌؽملا ؾٌرعت ةٌناكمإ رفوٌ امم رٌؽتملا
Public Sub inferenceExample()

' Using explicit typing .
Dim num1 As Integer = 3

' Using local type inference.
Dim num2 = 3

End Sub

ةبفلا ًف لوقحلا ؾٌرعت دنع عونلا ىلع للدتسلا مادختسا نكمٌ لو Class Fields ناك نإف num2 نع لدب ةبف ًف لقح قباسلا لاثملا ًف
ناك اذإ ؤطخ حٌرصتلا دلوٌ ؾوسف اٌلحم ارٌؽتم هنوك Option Strict On ؾنصٌ ؾوسو num2 ضرؼ هنأ ىلع Object ناك نإ
Option Strict Off ةنكاسلا تارٌؽتملا عونف هباشم لكشبو Static Variables ناك نإ اهٌلع للدتسلا نكمٌ ل Option Strict On نإو
ناك Option Strict Off ضرؼ نوكٌس نكاسلا رٌؽتملا عونف Object رٌؽتملا نم دٌرت نكت مل نإف num2 نم نوكٌ نأ قباسلا لاثملا ًف
عونلا Integer هنع حٌرصتلا دنع رخآ اعون دٌدحت كنكمٌف
Dim num3 As Object = 3 or Dim num4 As Double = 3

رخؤتملا طبرلا ىلع دمتعٌ يذلا دوكلا هباشٌ عونلا للدتسا مدختسٌ يذلا دوكلاو Late Binding نمز ًف طقف افورعم هعون نوكٌس يذلا
لٌؽشتلا . ىرخلا نٌسحتلا تاٌلمع ءارجإو ةقدب ةركاذلا زجحو ذٌفنتلا لبق لكاشملا دٌدحت نم مجرتملا نكمٌ ركبم لكشب عونلا ةفرعمو
ـب جمربملا دٌوزت نم رٌوطتلا ةبٌب نٌكمت ىلإ ةفاضلاب IntelliSense تارابتعل هلٌضفت ىلإ ةفاضلاب ضرؽلا كلذ ءاضعأ لوح ةدعاسملاو
عونلا نم اهنؤكو اهفٌلؽت بجٌ رخؤتملا طبرلا مادختساب نزخت ًتلا تاناٌبلا عٌمج نأ ببسب ءادلاب ةصاخ Object ءاضعلا ىلإ لوصولاو
ؤطبأ نوكٌس لٌؽشتلا نمز ًف .
ةرقف مادختسا نودب رٌؽتملا نع حٌرصتلا متٌ امدنع عونلا ىلع للدتسلا ثدحٌ As مدختسٌف رٌؽتملا كلذل ةمٌق طبضو حٌرصتلا رٌبعت ًف
عونلا نم ارٌؽتم ؾرعت ةٌلاتلا دوكلا روطس لثمف رٌؽتملل عونك ةمٌقلا كلت عون مجرتملا String
' Using explicit typing.
Dim name1 As String = "Springfield"

' Using local type inference.
Dim name2 = "Springfield"

عونلا نم ةفوفصم ءاشنل ناتبفاكتم ناتقٌرط ًلاتلا دوكلا ضرعتسٌو Integer
' Using explicit typing.
Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5}

' Using local type inference.
Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}

ىلع مجرتملا ؾرعتٌس ًلاتلا دوكلا ًفف ةٌراركت ةقلحل مكحتلا رٌؽتم عون دٌدحتل عونلا ىلع للدتسلا مادختسا كنكمٌ امك num نم هنؤب
عونلا Integer نل someNumbers2 ةفوفصم نع ةرابع Integer
320

Dim total = 0
For Each number In someNumbers2
total += number
Next

ةرابعلا ًف عونلا ىلع للدتسلا مدختسٌو Using ًلاتلا لاثملا ًف حضاو وه امك ردصملا مسا عون دٌدحتل اضٌأ
Using proc = New System.Diagnostics.Process
' Insert code to work with the resource.
End Using

نوكٌ ثٌح ًلاتلا دوكلا ًف رهاظ وه امك اضٌأ ءارجلا نم ةداعملا ةمٌقلا نم رٌؽتملا عون ىلع لدتسٌو pList1 و pList2 نع ةرابع Lists
of Processes
' Using explicit typing.
Dim pList1() As Process = Process.GetProcesses()

' Using local type inference.
Dim pList2 = Process.GetProcesses()

كٌزٌاب لوجٌف مدق دقو 2008 وه ادٌدج اراٌخ Option Infer ؾلم ًف ل مأ احومسم عونلا ىلع ًلحملا للدتسلا ناك اذإ دٌدحت نم كنكمٌ
نٌعم . ؾلملا ةٌادب ًف نٌٌلاتلا نٌرطسلا نم بسانملا رٌبعتلا بتكا عونلا ىلع للدتسلا راٌخ لٌطعت وأ نٌكمتلف
Option Infer On
Option Infer Off

راٌخلل ةمٌق دٌدحتب مقت مل نإو Option Infer ًضارتفلا راٌخلا مدختسٌس مجرتملاف دوكلا ًف Option Infer On ًتلا عٌراشملا لجأ نم
ًف اهإاشنإ مت Visual Basic 2008 راٌخلاو Option Infer Off ةقباس تارادصإ نم اهتٌقرت تمت ًتلا عٌراشملا لجأ نم . تبراضت نإو
راٌخلا ةمٌق Option Infer ةمٌقلا مادختسا متٌ ؾوسف رماولا رطس ًف وأ رٌوطتلا ةبٌب تاراٌخ ًف ةطوبضملا ةمٌقلا عم ؾلملا ًف
ؾلملا ًف ةدوجوملا .
ةنكاس رٌؽلا تارٌؽتملا ًف طقف عونلا ىلع للدتسلا مدختسٌو Non-Static ةبفلا لوقح ؾٌرعت ًف اهمادختسا نكمٌ لو Class Fields وأ
صباصخلا Properties تاءارجلا وأ Functions

321

صٛظٌٕا قٚذٕط ٟف بمثبع حدذحِ ُ١ل حذػ ِٓ حذحاٚ سب١زخا ٍٝػ َذخزغٌّا سبجعئ

ثدحلا مادختسا ىلع ةركفلا موقت Validating ةحرتقملا مٌقلا ةمباق قباطٌ ام راتخا دق مدختسملا نأ نم دكؤتلل .
صوصن ًقودنص هٌلإ ؾضأ مث دٌدج عورشم ءاشنإب مق ةبرجتلل
ثدحلا ًف Load ًلاتلا دوكلا عض جذومنلل

' ف٠شؼذ حفٛفظِ ًّحرس إذاسا١خ ياّولٌ ٟئامٍرٌا
Dim Lis As New List(Of String)
Lis.Add("Visual Basic")
Lis.Add("Visual C#")
Lis.Add("Visual C++")
Lis.Add("Pascal")
Lis.Add("Delphi")
Lis.Add("C++")
Lis.Add("2100")
Lis.Add("3200")
Lis.Add("Nokia 6600")
Lis.Add("Nokia 3250")
Lis.Add("Nokia 7610")

' ذ٠ذحذ حم٠شط ياّولا ٟئامٍرٌا
Me.TextBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
' ذ٠ذحذ سذظِ ياّولا ٟئامٍرٌا
Me.TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource

' حفاضإ حّئامٌا حطاخٌا إت سذظّو ياّولٌ ٟئامٍرٌا
Me.TextBox1.AutoCompleteCustomSource.Clear()
Me.TextBox1.AutoCompleteCustomSource.AddRange(Lis.ToArray)

ثدحلا ًف Validating صوصنلا قودنصل TextBox1 ًلاتلا دوكلا عض

If Me.TextBox1.AutoCompleteCustomSource.Count = 0 Then
' ارإ دٔاو حّئال ياّولا ٟئامٍرٌا حغساف
Me.TextBox1.Text = String.Empty
Exit Sub
Else
' ذ٠ذحذ ارإ ْاو ضٌٕا دٛظِٛ ّٓض حّئال ياّولا ٟئامٍرٌا
For Each Str As String In Me.TextBox1.AutoCompleteCustomSource
If Str.ToUpper = Me.TextBox1.Text.ToUpper Then
Me.TextBox1.Text = Str
Exit Sub
End If
Next
End If
' ارإ إٍطٚ ٌٝإ إ٘ ازٙف ٟٕؼ٠ ْأ ضٌٕا ًخذٌّا ش١غ دٛظِٛ
' ٟف حّئال ياّولا ٟئامٍرٌا ْٛىرف ح١ٍّػ كمحرٌا حٍشاف
e.Cancel = True


ةبرجتلاب مقو جمانربلا لؽش

322

خٔضخٌّا فئبظٌٛا َاذخزعا Using Stored Procedures

ةرابع ذٌفنت نم لدب ةٌجمربلا تلاحلا نم دٌدعلا ًف SQL وأ ةنزخملا ؾباظولاب ىعدٌ ام ذٌفنت ىلإ جاتحتس ةرشابم Stored Procedures
تاقبطلا ةددعتم تاقٌبطتلا ًف ناملا زٌزعتو تاناٌبلا دعاوق قطنم ؾٌلؽتل ةزاتمم ةقٌرط اهرودب ربتعت ًتلاو multitiered ةفٌظو ذٌفنتلو
ىلإ جاتحتس ةنزخم Command object هتٌصاخ طبضب موقت CommandType ىلإ StoredProcedure ةٌصاخو CommandText
ددع أرقت ةنزخم ةفٌظو ذٌفنتب موقن ًلاتلا لاثملا ًفو ةنزخملا ةفٌظولا مسا ىلإ employees تاناٌبلا ةدعاق ًف Pubs

Public Overloads Function CountEmployees() As Integer
Dim oPubConnection As New SqlConnection
Dim sConnString As String
Dim oSqlCommand As SqlCommand
Try
sConnString = "Data Source=drcsrv01;Initial Catalog=pubs;" & _
"Integrated Security=True"
oPubConnection.ConnectionString = sConnString
oPubConnection.Open()
oSqlCommand = New SqlCommand()
oSqlCommand.Connection = oPubConnection
oSqlCommand.CommandText = "GetEmployeeCount"
oSqlCommand.CommandType = CommandType.StoredProcedure
Return oSqlCommand.ExecuteScalar
Catch oEx As Exception
MessageBox.Show(oEx.Message)
Finally
If Not oPubConnection Is Nothing Then
oPubConnection.Close()
End If
End Try

لخد طباسو رٌرمت ىلإ جاتحن ةنزخم ةفٌظو ذٌفنتب موقن امدنع ةداعلا ًف Input Parameters للخ نم جرخلا جباتن دٌعتست دقو
جرخلا طباسو Output Parameters ـل عجرم ؾٌرعت انٌلع بجٌ طباسولا عم لماعتللو SqlParameter اهعونو ةطٌسولا مساب هدٌوزتو
لخد ،لخد ،جرخ ةطٌسو ررمت امدنعو اضٌأ تاناٌبلا هذه مجح رٌرمتل جاتحتس تاناٌبلا عاونأ ضعبل ةبسنلابو - ددحت نأ اضٌأ كٌلع جرخ
لكشب داعٌ ددعلاو ؾرحلا كلذب مهتلباع ءامسأ أدبت نٌذلا نٌفظومـلا ددع دٌعتو ؾرح نع ةرابع لخد ةطٌسو ررمن ًلاتلا لاثملا ًف اههاجتا
جرخ ةطٌسو

Public Overloads Function CountEmployees(ByVal LInitial As String) As Integer
Dim oPubConnection As New SqlConnection
Dim sConnString As String
Dim oSqlCommand As SqlCommand
Try
sConnString = "Data Source=drcsrv01;Initial Catalog=pubs;" & _
"Integrated Security=True"
oPubConnection.ConnectionString = sConnString
oPubConnection = New SqlConnection(sConnString)
oPubConnection.Open()
oSqlCommand = New SqlCommand()
oSqlCommand.Connection = oPubConnection
oSqlCommand.CommandText = "GetEmployeeCountbyLInitial"
oSqlCommand.CommandType = CommandType.StoredProcedure
Dim oInputParam As SqlParameter = _
oSqlCommand.Parameters.Add("@LInitial", SqlDbType.Char, 1)
oInputParam.Value = LInitial
Dim oOutPutParam As SqlParameter = _
oSqlCommand.Parameters.Add("@EmployeeCount", SqlDbType.Int)
323

oOutPutParam.Direction = ParameterDirection.Output
oSqlCommand.ExecuteNonQuery()
Return oOutPutParam.Value
Catch oEx As Exception
MessageBox.Show(oEx.Message)
Finally
If Not oPubConnection Is Nothing Then
oPubConnection.Close()
End If
End Try
End Function

324

عاٛٔلا خٌٛٙغٌّا Anonymous Types

مدقٌ لوجٌف وٌدوتس 2008 عاونلا ةلوهجملا anonymous types ًتلاو كنكمت نم ءاشنإ ضارؼلا Objects نودب ةباتك
ؾٌرعت ةبف Class definition نم لجأ عون تاناٌبلا اضوعو نع كلذ دلوٌ مجرتملا ةبفلا نم كلجأ نلو نوكٌ ةبفلل امسا لباق مادختسلل
ثٌح نوكت هذه تابفلا ةثوروم ةرشابم نم Object كلتمتو صباصخلا ًتلا اهددحت دنع ؾٌرعت ضرؽلا Object امبو نأ عون تاناٌبلا مل
متٌ هدٌدحت متٌ ةراشلا هٌلإ ىلع هنأ عون لوهجم anonymous type . ثٌح حرصٌ لاثملا ًلاتلا نع رٌؽتملا product رٌؽتمك نم عونلا
anonymous type اكلتمم نٌتٌصاخلا Name و Price
' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
ثٌح مدختسٌ رٌبعت ملعتسلا ًلاتلا عاونلا ةلوهجملا جمدل ةدمعأ تاناٌبلا ةددحملا ةطساوب ملعتسلا امبو هنأ كنكمٌ ل دٌدحت عون ةجٌتنلا
امدقم ببسب مدع ةٌناكمإ إبنتلا ةدمعلاب ًتلا نكمٌ نأ اهراتخٌ ملعتسا نٌعم كنكمتف عاونلا ةلوهجملا نم ةباتك ملعتسا راتخٌ ددع نم
ةدمعلا يؤب بٌترت هدٌرن موقٌف مجرتملا ءاشنإب عون تاناٌبلا لثامملا كلتل صباصخلا ةددحملا كلذب بٌترتلا نٌعملا . ًفو لاثملا ًلاتلا نوكٌ
Products ةرابع نع ةمباق نم ضارؼأ Product لكو اهنم كلتمٌ صباصخ ةدٌدع ثٌحب لمحٌ رٌؽتملا namePriceQuery ؾٌرعت
ملعتسلا يذلا دٌعٌ دنع هذٌفنت ةعومجم نم عاونلا ةلوهجملا ًتلا كلتمت نٌتٌصاخلا Name و Price
Dim namePriceQuery = From prod In products_
Select prod.Name, prod.Price
رٌؽتملاو nameQuantityQuery لمحٌ ؾٌرعت ملعتسلا يذلا دٌعٌ دنع هذٌفنت ةعومجم نم عاونلا ةلوهجملا ًتلا كلتمت نٌتٌصاخ
Name و OnHand
Dim nameQuantityQuery = From prod In products_
Select prod.Name, prod.OnHand

فيرعت عون لوهجم Declaring an Anonymous Type
ؾٌرعت رٌؽتم نم عون لوهجم مدختسٌ ةمباق ءانب دٌدحتل صباصخ كلذ عونلا ثٌحب كنكمٌ دٌدحت صباصخلا هذه طقف دنع نلعلا
نع عونلا لوهجملا نكمٌ لو مادختسا ةٌقب رصانع تابفلا لثم قبارطلا ثادحلاو ًف عاونلا ةلوهجملا ًفف لاثملا ًلاتلا نوكٌ Product1
نم عون لوهجم كلتمٌ نٌتٌصاخ Name و Price
'Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
- 'or-
'product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
نإف تمق دٌدحتب صباصخلا صباصخك ةٌحاتفم key properties حبصأ كناكمإب اهمادختسا ةنراقمل نٌعون نٌلوهجم له امه نٌٌواستم مأ
ل عمو كلذ مٌقف صباصخلا ةٌحاتفملا نكمٌ ل اهرٌٌؽت ًهف ةءارقلل طقف . عم ةظحلم نأ حٌرصتلا نع عون لوهجم لثامٌ حٌرصتلا نع عون
ىمسم مادختساب ًناب ضرؽلا object initializer
'Variable product3 is an instance of a class named Product.
325

Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}

ضئبظخٌا خ١حبزفٌّا Key Properties
ؾلتخت صباصخلا ةٌحاتفملا نع ةٌداعلا ةدعب رومأ :
 مدختست صباصخلا ةٌحاتفملا طقف ةنراقمل ةاواسملا نٌب نٌعون نٌلوهجم
 نكمٌ ل رٌٌؽت مٌق صباصخلا ةٌحاتفملا ًهف امباد ةءارقلل طقف
 طقف صباصخلا ةٌحاتفملا متٌ اهنٌمضت نمض ـلا Hash Code يذلا هدلوٌ مجرتملا نم لجأ عاونلا ةلوهجملا

حاٚبغٌّا Equality
نوكت تارٌؽتم عاونلا ةلوهجملا ةٌواستم امدنع نوكت تارٌؽتم سفنل عونلا لوهجملا موقٌو جلاعملا ةلماعمب نٌرٌؽتم نٌرٌؽتمك نم
سفن عونلا اذإ ترفوت امهٌف طورشلا ةٌلاتلا
 مت حٌرصتلا امهنع ًف سفن عمجملا
 كلتمت امهصباصخ سفن مسلا عونلاو متو حٌرصتلا اهنع سفنب بٌترتلا نوكتو ةنراقم ءامسلا رٌؼ ةساسح ةلاحل ؾرحلا
 سفن صباصخلا اهٌف ةددحم صباصخك ةٌساسأ
 كلتمٌ لك عون ةٌصاخ ةٌساسأ ةدحاو ىلع لقلا
حٌرصتلاو نع عون لوهجم كلتمٌ ل يذلا يأ ةٌصاخ ةٌحاتفم نوكٌ اٌواسم هسفنل طقف
'prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

'The following line displays False, because prod1 and prod2 have no
'key properties.
Console.WriteLine(prod1.Equals(prod2))

'The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))
نوكتو ةمٌق نٌرٌؽتم سفنل عونلا لوهجملا نٌٌواستم اذإ تناك ةمٌق امهصباصخ ةٌحاتفملا ةٌواستم امك ًف لاثملا ًلاتلا يذلا حضوٌ ةٌفٌك
صحف هذه ةاواسملا
Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
'The following line displays True, because prod3 and prod4 are
'instances of the same anonymous type, and the values of their
'key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
326

Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29, OnHand = 423}
'The following line displays False, because prod5 and prod6 do not
'have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29, OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29, OnHand = 423}
'The following line displays True, because prod7 and prod8 are
'instances of the same anonymous type, and the values of their
'key properties are equal. The equality check does not compare the
'values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

ُ١مٌا خٍثبمٌا حءاشمٌٍ ؾمف
نكمٌ ل رٌٌؽت مٌق صباصخلا ةٌحاتفملا لثمف ًف prod8 ًف لاثملا قباسلا لوقحلا Name و Price ةلباق ةءارقلل طقف ًف نٌح نأ
لقحلا OnHamd نكمٌ رٌٌؽت هتمٌق
'The following statement will not compile, because Name is a key
'property and its value cannot be changed.
'prod8.Name = "clamps"

'OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22
عاونلا ةلوهجملا نم ريباعت ملعتسلا Anonymous Types from Query Expressions
رٌباعت ملعتسلا بلطتت ل امود ءاشنإ عاونأ ةلوهجم دنعف ناكملا اهنكمٌ مادختسا عون دوجوم لمحٌل تاناٌب دومعلا اذهو ثدحٌ
امدنع دٌعٌ ملعتسلا امإ تلجس ةلماك نم ردصم تاناٌبلا وأ لقح دحاو نم لك لجس ًفف لاثملا ًلاتلا نوكٌ Customers ةرابع نع
ةعومجم تابف Customer ةبفلاو كلتمت دٌدعلا نم صباصخلا ثٌحب كنكمٌ نٌمضت ةدحاو وأ رثكأ نم هذه صباصخلا ًف جباتن ملعتسلا
يؤبو بٌترت هدٌرت ًفف نٌلاثملا نٌٌلولا دجوٌ ل ةجاح يل عون لوهجم نل ملعتسلا بلجٌ رصانع نم عاونأ ةفورعم ـف Custs1 نوكٌ
نم عونلا string نل cust.Name نم عونلا String و Custs2 وه ةعومجم نم ضارؼلا Customers نل لك رصنع ًف
Customers وه ضرؼ Customer لماكو رصنعلا مت هبلج ةطساوب ملعتسلا
Dim custs1 = From cust In customers_
Select cust.Name

Dim custs2 = From cust In customers_
Select cust
327

عمو كلذ عاونلاف ةامسملا نوكت ل امباد ةرفوتم ثٌح كنكمٌ ملعتسلا نع Names و Addresses نم لجأ ؾده نٌعم و ID و
Numbers و Location نم لجأ ؾده رخآ انهف كنكمت عاونلا ةلوهجملا نم راٌتخا ةٌأ ةبٌكرت نم صباصخلا يؤبو بٌترت نودب نأ
رطضت ًف ةٌادبلا حٌرصتلل نع عون ىمسم دٌدج لمحٌل ةجٌتنلا لدبو نع كلذ موقٌ مجرتملا ءاشنإب عون لوهجم لكل ةبٌكرت نم صباصخلا
لثمف ملعتسلا ًلاتلا ددحٌ طقف Name و ID نم لك ضرؼ Customer ًف customers نمو لجأ كلذ موقٌ ءاشنإب عون لوهجم نم كلت
صباصخلا
Dim custs3 = From cust In customers_
Select cust.Name, cust.ID
لكو نم مسلا عونلاو نٌدباعلا صباصخل عونلا لوهجملا متٌ اهذخأ نم تاددحم ملعتسلا cust.Name و Cust.Id نوكتو صباصخ
عونلا لوهجملا ًتلا اهبشنٌ ملعتسلا صباصخ ةٌحاتفم امود دنعو ذٌفنت cust3 ًف ةقلح For...Each ةٌلاتلا نوكت ةجٌتنلا ًه ةعومجم
عاونأ كلتمت ةلوهجم نٌتٌصاخ نٌتٌحاتفم Name و ID
For Each selectedCust In custs3
Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name(
Next

ذ٠ذحر ٝزِ َذخزغٔ عاٛٔلا خٌٛٙغٌّا
لبق نأ موقت حٌرصتلاب نع ضرؼ هنؤب نم عون لوهجم بجٌ كٌلع رٌكفتلا امٌف اذإ ناك اذه راٌخلا وه لضفلا لثمف نإ تنك دٌرت
ءاشنإ ضرؼ تقإم يوتحٌل ضعب لوقح تامولعملا تسلو ةجاحب ىلإ ةٌقب لوقحلا قبارطلاو ًتلا اهٌوتحت ةبفلا ةلماكلا نوكٌ اهدنع عونلا
لوهجملا لح ادٌج نوكتو عاونلا ةلوهجملا ةمبلم امدنع دٌرت ءاقتنا ةعومجم ةفلتخم نم صباصخلا دنع لك حٌرصت وأ نإ تنك دٌرت رٌٌؽت
بٌترت هذه صباصخلا نإو ناك كعورشم يوتحٌ ىلع ةدع ضارؼأ لمحت سفن صباصخلا بٌترتب تباث كنكمٌ اهدنع حٌرصتلا مهنع
ةلوهسب مادختساب عاونلا ةامسملا مادختساب ًناب ةبف اهدنعف مادختساب ًناب مبلم نكمٌ ؾٌرعت ةدع تارٌؽتم نم ةبفلا Product نوكٌو كلذ
لهسأ نم مادختسا ةدع تارٌؽتم ةلوهجم عونلا
'Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)
'Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
نمكتو ةدباف ىرخأ عاونلل ةلوهجملا ًف نأ مجرتملا هنكمٌ طاقتلا ءاطخلا ةٌعابطلا ًف ءامسأ صباصخلا ًفف لاثملا قباسلا ضرتفٌ عاونلاب
firstProd2 و secondProd2 و thirdProd2 نأ نوكت تارٌؽتم سفنل عونلا لوهجملا عمو كلذ تمق نع قٌرط ؤطخلا حٌرصتلاب نع
thirdProd2 دحؤب قبارطلا ةقحللا وهو عون ؾلتخم نع firstProd2 و secondProd2
'Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09}
'Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
'Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}
رملاو مهلا وه هنأ كانه دودح مادختسل عاونلا ةلوهجملا قبطنت ل ىلع عاونلا ةفورعملا عمف نأ firstProd2 و secondProd2 و
thirdProd2 ًه تارٌؽتم سفنل عونلا لوهجملا رٌؽتملاف لوهجملا كرتشملا رٌؼ رفوتم نكمٌ لو عقوت هروهظ عونك ؾورعم ًف دوكلا
328

لثمف نكمٌ مادختسا عونلا لوهجملا دٌدحتل عٌقوت ةقٌرطلا حٌرصتلل نع لقح رٌؽتم نوكٌف ةجٌتنلاب عونلا لوهجملا رٌؼ مبلم لدابتل تاناٌبلا
ربع قبارطلا

329

ُىحزٌا PropertyGrid

مكحتلا موقٌ PropertyGrid نباكلا لوح تامولعم ضرعب Object صباصخلا ةذفان بولسل هباشم بولسؤب Properties
Window صباصخلا هذه مٌق رٌرحت نم هاٌإ انكمم اٌدجبأ وأ ةبفلا بسحب صباصخلا مٌظنت نم مدختسملا نكمٌ وهو رٌوطتلا ةبٌب ًف .
ةٌصاخلا ًه رصانعلا هذه نٌب نم مهلا نكلو رصانعلا نم دٌدعلا مكحتلا اذه كلتمٌو SelectedObject ةفرعم وأ طبضل مدختست ًتلا
عونلا نم اهتمٌق نوكتو مكحتلا عم ةطبترملا تانباكلا Object دوكلا ًف امك
' Show Button1 Properites
Me.PropertyGrid1.SelectedObject = Button1

' Show Cla Properties
Dim cla As New Class1
Me.PropertyGrid1.SelectedObject = cla

مكحتلاو PropertyGrid ةبفلا وأ مكحتلا صباصخ ضرعب موقٌ Properties ةماعلا تارٌؽتملا ضرعٌ ل وهف طقف Public Variables
ةفصاولاب ةملعم ةٌصاخ يؤف ضارعتسلل ةلباقلا كلت صباصخلا هذه نم ضرعٌ وهو لثم Browsable(False) امك اهضرع متٌ نل
ةفصاولا مدختست Category ةفصاولاو ماسقأ نمض مكحتلا صباصخ مٌظنتل Description طبض متٌ ثٌح ةٌصاخلا كلتل ؾصو راهظل
مكحتلا وأ ةبفلا دوك ةباتك دنع ىدح ىلع ةٌصاخ لكلو بسانملا لكشلاب تافصاولا هذه مٌق
مساب ةبف انٌدل هنأ انضرتفا اذإف Class1 مكحتلا ًف اهصباصخ ضرع دٌرن PropertyGrid ًلٌ امك ةبفلا هذه دوك ناكو
Imports System.ComponentModel

Public Class Class1
Public Enum ProgrammingLanguageEnum
VisualBasic
CSharp
CPlusPlus
Java
Pascal
End Enum

Private _mTest As String
Private _mName As String
Private _mProg As ProgrammingLanguageEnum

<Browsable(False)> _
Public Property Test() As String
Get
Return _mTest
End Get
Set(ByVal value As String)
_mTest = value
End Set
End Property

<Category("Personal"), Description("Person Name.")> _
Public Property Name() As String
Get
Return _mName
End Get
Set(ByVal value As String)
_mName = value
End Set
End Property

<Category("Lang"), Description("His Programming Language")> _
330

Public Property ProgrammingLanguage() As ProgrammingLanguageEnum
Get
Return _mProg
End Get
Set(ByVal value As ProgrammingLanguageEnum)
_mProg = value
End Set
End Property

End Class
رٌؽتملا صباصخ راهظل ًلاتلا دوكلا ةباتك اننكمٌ cla ًلٌ امك ةبفلا كلتل ام دجاوت نع ةرابع وه يذلا
Dim cla As New Class1
Me.PropertyGrid1.SelectedObject = cla
ءامسلا لاجمل ادارٌتسا ةٌادبلا ًف انمدختسا ةبفلا هذه ًفف System.ComponentModel ةصاخلا تافصاولا ضعب طبض نم نكمتن ًكل
مكحتلا ًف صباصخلا هذه راهظإ ةقٌرط ىلع رثإت ًتلاو انتبف صباصخب PropertyGrid ةٌصاخلا نأ ظحلت ثح Test ةفصاولاب ةنٌزم
Browsable ىلإ اهتمٌق ةطوبضم False ةٌصاخلا روهظ مدع ببستس ًهف اذل Test مكحتلا ًف PropertyGrid صباصخ ضرعٌ امدنع
ةبفلا Class1 ةفصاولا مادختسا نكمٌو Category مكحتلا نمض هٌف ةٌصاخلا راهظإ ًف بؼرن يذلا مسقلا طبضل PropertyGrid مت لثمف
ةفصاولا طبض Category ىلإ Personal ةٌصاخلل ةبسنلاب Name مسق نمض اهروهظ ظحلتس ًتلا Personal صباصخ ضرع دنع
ةفصاولاو ةبفلا Description مكحتلا ةذفان لفسأ رهظٌ ةٌصاخلل ؾصو ةباتك نم كنكمت PropertyGrid

331

ك١١ؼزٌا َاذخزعبث دبٔب١جٌا عاٛٔأ ٓ١ث ً٠ٛحزٌا Explicit غ١عٛزٌاٚ Implicit


ىمسم لوسنوك عونلا نم جمانرب انٌدل هنأ ضرفنل TypeConversions ًلاتلا دوكلا ًف رهاظ وه امك

Module Program

Sub Main()
Console.WriteLine("***** The Amazing Addition Program *****")
Dim a As Short = 9
Dim b As Short = 10
Console.WriteLine("a + b = {0}", Add(a, b))
End Sub

Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function

End Module

ةقٌرطلا نأ ظحل Add عونلا نم نٌددحم اهل ررمٌ نأ عقوتت Integer ءارجلا نأ ظحلن كلذ عمو Main نم نٌددحم عقاولا ًف اهل ررمٌ
عونلا Short ةمٌقلا دٌعٌو ءاطخأ نودب هتمجرتو هذٌفنت متٌ جمانربلا نأ لإ تاناٌبلا عاونأ ًف ًلك قباطت مدع اذه ودبٌ دقو 19 وه امك
عقوتم . عونلل ةٌمظعلا ةمٌقلا نأ امب تاناٌبلا ًف نادقف ثودحل لامتحا دجوٌ ل هنأ ىلإ كلذ ًف ببسلا دوعٌو Short ًه 32767 امنٌب
عونلل نوكت Integer وه 217483647 عونلا نم ةمٌق لك عٌسوتب اٌلآ مجرتملا موقٌف Short عونلا ىلإ Integer ةٌباقلت خسن ةٌلمعب كلذو
نم Short ىلإ Integer . ًف ببستت دق تلاحلا ضعب ًف نكلو قباسلا لاثملا ًف انحلاصل تمت دق ةٌللا ضٌرعتلا ةٌلمع نأ نم مؼرلابو
ًفنتلا نمز ءاطخأ ذ اهفشك بعصٌ .
عونلل ةٌمظعلا ةمٌقلا ىلع ناضٌف ثودح ًف ناببستٌ اعم امهعمج متٌ امدنع ثٌحب قباسلا لاثملا ًف نارٌؽتملا مٌق لٌدعتب تمق كنأ ضرتفا
Short ةقٌرطلا نم ةداعملا ةمٌقلا نٌزختب موقت كنأ ضارتفابو Add عونلا نم ًلحم رٌؽتم نمض Short ىلع ةجٌتنلا راهظإ ىلإ ةفاضإ
لوسنوكلا

Module Program

Sub Main()
Console.WriteLine("***** The Amazing Addition Program *****")
Dim a As Short = 30000
Dim b As Short = 30000
Dim answer As Short = Add(a, b)
Console.WriteLine("a + b = {0}", answer)
End Sub

Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Return x + y
End Function

End Module

ذٌفنتلا نمز ؤطخ قلطإ متٌ ؾوسف جمانربلا ذٌفنت متٌ امدنع هنأ لإ انه ةحٌحص ةروصب هتمجرت متت جمانربلا نأ نم مؼرلا ىلعف
System.OverflowException ةقٌرطلا نأ نم مؼرلابو Add ةداعإ اهنكمٌ Integer مٌق لاجم نمض عقت ًتلا ةحٌحصلا ةمٌقلا لمحٌ
عونلا Integer عونلا نم رٌؽتم ًف ةمٌقلا كلت نٌزخت نكمٌ ل نكلو Short عونلا نمض اهنٌزخت نكمٌ ًتلا مٌقلا لاجم جراخ عقت ةمٌقلا نل
Short ذٌفنتلا نمز ًف ناضٌف ؤطخ جتنتس ًتلا قٌٌضت ةٌلمعب ماٌقلا مجرتملا لواحٌ ةلاحلا هذه ًفف . جتنٌ قٌٌضتلا تاٌلمع عٌمج تسٌل نكلو
ؤطخلا اهنع System.OverflowwException ًلاتلا لاثملل رظنا
332


Dim myByte As Byte
Dim myInt As Integer = 200
myByte = myInt
Console.WriteLine("Value of myByte: {0}", myByte)


رٌؽتملا ًف ةاوتحملا ةمٌقلا نوكت قباسلا دوكلا ًفف Integer عونلا لاجم نمض عقت Byte ؤطخ قلطإ ًف ببستٌ ل قٌٌضتلا لٌوحتف اذل
نمز ىلإ لصن نأ لبق ةمجرتلا دنع قٌٌضتلا تلٌوحت بقعت لضفلا نم هنإف ةنمآ ربتعت قٌٌضتلا تلٌوحت نم دٌدعلا نأ عمو ذٌفنتلا نمز
ًفنتلا ذ مجرتملا هٌجوت مادختساب كلذ متٌو Option Strict

ُٙف Option Strict
دكؤتٌ Option Strict ًف هحٌحصت اننكمٌ ثٌحب املعإ انٌطعٌو قٌٌضتلا تلٌوحت نم ذٌفنتلا نمز نع اضوع ةمجرتلا نمز ًف
ذٌفنتلا نمز ًف ءاطخأ روهظ رطخ ؾٌفختو ةٌحٌحصت تاءارجإ ذاختا اننكمٌ هذه قٌٌضتلا تلٌوحت دٌدحت عٌطتسن امدنعف ركبم تقو . عمو
دوك ؾلم لك ةٌادب ًف راٌخلا اذه دٌدحت كنكمٌ هنأ

Option Strict On

هٌجوتلا لٌعفت اضٌأ اننكمٌ هنأ لإ Option Strict ةحفص نم بسانملا راٌخلا دٌدحتب كلذو لكك عورشملل هفاقٌإ وأ Compile صباصخ نم
MyProject كل دلوٌ ؾوسو ةمجرتلا ةٌلمع للخ تلامتحلا هذه نم ققحتلا هٌلع نؤب مجرتملا ملعت تنؤف راٌخلا اذه لٌعفتب موقت امدنعف
قٌٌضت لٌوحت ةٌلمع لك نع ةمجرتلا نمز ًف ؤطخ .
راٌخلا ةفاضإ اننكمٌو Option Strict لمحٌس يذلا رٌؽتملا عون رٌٌؽت اننكمٌ ثٌح قٌٌضتلا تاٌلمع نم ققحتلاب مجرتملا موقٌل قباسلا انلاثمل
عونلا نم ةجٌتنلا Short عونلا ىلإ Integer نامؤب ةجٌتنلا لمح هنكمٌ يذلا

Dim answer As Integer = Add(a, b)

دذحٌّا ً٠ٛحزٌا دلاد
لثم نامؤب عاونلا نٌب لٌوحتلا نم اننكمت ًتلا لٌوحتلا تلاد نم ددعب كٌزٌاب لوجٌف اندوزٌ CBool و CByte و CDate و
CDbl و CInt ةفٌظولا ىلإ ةفاضإ CType يرطس لثمف دارملا تاناٌبلا عون وه ًناثلاو كٌدل ًتلا تاناٌبلا وه لولا نٌددحم ذخؤت ًتلا
نٌبفاكتم ناربتعٌ نٌٌلاتلا دوكلا

myByte = CByte(myInt)
myByte = CType(myInt, Byte)


ةفٌظولا ًف ةدبافلا نمكتو CType كلذكو ةقتشملاو ةٌساسلا تابفلاو عاونلا ؾلتخم نٌب لٌوحتلا تاٌلمع عٌمج عم لماعتلا عٌطتست اهنأ ًه
اهتاهجاوو ضارؼلا

سٚد System.Convert
ءامسلا لاجم ىلع ةرظن ءاقلإ انٌلع بحٌ لٌوحتلا عوضوم نع ثٌدحلا لامكإ لجأ نم System ةبفلا ىلع يوتحٌ يذلا
Convert لاثملا ًف امك ضٌرعتلاو قٌٌضتلا لٌوحت تاٌلمع ًف اضٌأ اهمادختسا نكمٌ ًتلا

myByte = Convert.ToByte(myInt)
333


ةبفلا مادختسا نم ةدبافلا نمكتو System.Convert اندوزٌ كلذ عمو تاناٌبلا عاونأ ؾلتخم نٌب لٌوحتلل ةٌعٌبط ةٌوؽل ةقٌرط رفوت اهنأ ًف
كٌزٌاب لوجٌف 2008 لثم ةنمضملا لٌوحتلا ؾباظو نم دٌج مكب CBool و CByte ةبفلا مادختسا نأ ثٌح Convert لٌوحتلا تاٌلمعب ماٌقلل
ًصخش لٌضفت راٌخ هنوك ودعٌ ل

334

خئفٌا StringBuilder

ةبفلا نزخت StringBuilder ةبفلا نم رٌثكب عرسأ ربتعت ًهو اهعم لماعتلل قبارط انل مدقتو ةٌكٌمانٌد ةٌصن لسلس String مدختست اهنكلو
ةبفلا اهمدختست ًتلا كلت نم ظوحلم لكشب ربكأ ةركاذلا نم اردق String ةبفلا مادختسا عٌطتست ىتحو StringBuilder كٌلع كعورشم ًف
ءامسلا لاجمل عجرم ةفاضإ System.Text ةبفلا كلت ىلإ رٌشٌ رٌؽتم ؾٌرعت اننكمٌ روكذملا ءامسلا لاجم دارٌتساب تمق كنأ ضارتفابو

Dim txt As New StringBuilder

ةٌضارتفلا ةعسلا نوكتو اقبسم اهٌف هنٌزختب موقتس يذلا صنلا مجح ؾٌرعت دٌجلا نم ربتعٌف ةٌكٌمانٌد ةٌصن لسلس عم لماعتت اهنأ امبو
16 ةٌصاخلا ةمٌق طبضب موقن ةعسلا هذه طبضلو اهزواجتب موقت ةرم لك ًف اٌباقلت ؾعاضتت ةعسلا هذهو افرحم Capacity .
ةبفلا نم دٌدج ناٌك ءاشنلو StringBuilder ةٌضارتفا ةٌصن ةمٌق رٌرمت وأ تاددحم ةٌأ رٌرمت نودب ةبفلا ًناب ءاعدتسا كنكمٌ

Dim txt As New StringBuilder("some string")

ةعسلا ًف ةرمتسم تارٌٌؽت كانه دعٌ مل اذهبو ةبفلا ًنابل ةمٌقلا هذه رٌرمت كنكمٌ هنٌزختب موقتس يذلا صنلا لوط رٌدقت ىلع ارداق تنك نإو
ًف ؾراحملا نٌزخت دنع StringBuilder

Dim txt As New StringBuilder(initialCapacity)

ةبفلا موقتسو ذٌفنتلا ءانثأ رٌؽتت نأ نكمٌ ذإ ةٌباهن تسٌل اهدٌدحتب تمق ًتلا ةعسلاف كلذ عمو StringBuilder نإو اٌلآ ةعسلا ةمٌق طبضب
ًلاتلا ًنابلا مادختسا كنكمٌ هنٌزخت متٌس امل ىمظع ةعس دٌدحتب بؼرت تنك

Dim txt As New StringBuilder( initialCapacity, maxCapacity)

ةبفلا نم دٌدج ناٌك ءاشنإ دٌرت امدنعو StringBuilder مادختسا كنكمٌ ةٌبادتبلا ةمٌقلاو ىمظعلا ةعسلاو ةٌبادتبلا ةعسلا نم لك امدختسم
ًلاتلا لكشلاب ةبفلا ًناب

Dim txt As New StringBuilder( string, initialCapacity, maxCapacity)

ةبفلل ناتٌساسأ ناتٌصاخ نلا ىتح انٌأر StringBuilder امه Capacity و MaxCapacity صباصخلا ةبفلا هذه انل مدقت امهل ةفاضإو
Length و Chars ةبفلا ًف مس