ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﻦ ﻛﺘﺎب آﻣﻮزﺷﻲ ﻳﻚ ﻛﺘﺎب راﻳﮕﺎن اﺳﺖ و ﻣﻲ ﺗﻮان ﻣﻄﺎﻟﺐ ﻣﻮﺟﻮد در آن را ﺑﺎ/ﺑﺪون اﺟﺎزه ﮔﺮدآورﻧﺪه ﺗﻮزﻳﻊ ﻛﺮده و ﻳﺎ ﺗﻐﻴﻴﺮ داد .اﻳﻦ ﻛﺘﺎب ﺑﻪ اﻳﻦ اﻣﻴﺪ ﮔﺮدآوري ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﺪ در ارﺗﻘﺎي ﺳﻄﺢ ﻋﻠﻤﻲ دوﺳﺘﺎن ﻣﻮﺛﺮ واﻗﻊ ﺷﻮد ،اﻣﺎ ﻫﻴﭻ ﺗﻀﻤﻴﻨﻲ در ﻣﻮرد آن و ﻳﺎ در ﻣﻮرد ﻣﻨﺎﺳﺐ ﺑﺪون ﻣﻄﺎﻟﺐ ﻣﻮﺟﻮد ﺑﺮاي اﻫﺪاف ﺧﺎص وﺟﻮد ﻧﺪارد. از ﺧﻮاﻧﻨﺪه ﻣﺤﺘﺮم ﺗﻘﺎﺿﺎ ﻣﻲ ﺷﻮد ﺑﺎ ارﺳﺎل ﻧﻈﺮات و ﭘﻴﺸﻨﻬﺎدات ﺧﻮد در ﻣﻮرد اﻳﻦ ﻛﺘﺎب و ﻳﺎ اﺷﻜﺎﻻت ﻣﻮﺟﻮد در ﻣﺤﺘﻮي ﻳﺎ ﻣﺘﻦ آن ﺑﻪ آدرس m.hashemian@gmail.comدر ﺑﻬﺒﻮد اﻳﻦ ﻛﺘﺎب ﺳﻬﻴﻢ ﺷﻮد. ﺑﺎ ﺗﺸﻜﺮ، ﺳﻴﺪ ﻣﺤﻤﺪ ﻫﺎﺷﻤﻴﺎن ﺗﺎﺑﺴﺘﺎن 1385
٢
www pupuol com
ﻓﺼﻞ اول :ﺑﻪ وﻳﮋوال 2005 C#ﺧﻮش آﻣﺪﻳﺪ
18
ﻧﺼﺐ وﻳﮋوال 18 ............................................................................................................ :2005 C# ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ وﻳﮋوال 23 .................................................................................................... :2005 C# ﺻﻔﺤﻪ 23 ...................................................................................................... :Profile Setup ﻣﻨﻮ24 ............................................................................................................................... : ﻧﻮار اﺑﺰارﻫﺎ26 ........................................................................................................................ : اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده27 ............................................................................................................... : ﭘﻨﺠﺮه ﻫﺎ در IDEوﻳﮋوال اﺳﺘﻮدﻳﻮ 28 ...................................................................................... :2005 اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺳﺎﺧﺘﻦ ﭘﺮوژه 29 .................................................................................... Hello User ﺟﻌﺒﻪ اﺑﺰار31 ........................................................................................................................ : ﻧﺸﺎﻧﻪ ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ ﺗﻐﻴﻴﺮ ﻳﺎﻓﺘﻪ35 ................................................................................................ : وﻳﺮاﻳﺸﮕﺮ ﻛﺪ36 ..................................................................................................................... : اﺳﺘﻔﺎده از ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ41 ......................................................................................... : ﺧﻼﺻﻪ43 ............................................................................................................................... : ﺗﻤﺮﻳﻦ43 ................................................................................................................................ :
ﻓﺼﻞ دوم :ﭼﺎرﭼﻮب .NETو ارﺗﺒﺎط آن ﺑﺎ 44 .................................................... C# ﭼﺎرﭼﻮب .NETﭼﻴﺴﺖ؟ 44 ........................................................................................................... ﭼﺎرﭼﻮب .NETاز ﭼﻪ اﺟﺰاﻳﻲ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ؟45 ................................................................................. ﭼﮕﻮﻧﻪ ﺑﺎ اﺳﺘﻔﺎده از ﭼﺎرﭼﻮب .NETﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﻢ؟ 46 ............................................................................. MSILو 46 ................................................................................................................. :JIT اﺳﻤﺒﻠﻲ ﻫﺎ47 ........................................................................................................................ : ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه48 ............................................................................................................ : ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در 48 ......................................................................................................:.NET ﻣﺮاﺣﻞ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ در 48 ..................................................................................................... .NET ﻟﻴﻨﻚ دادن50 ....................................................................................................................... : C#ﭼﻴﺴﺖ؟ 50 ......................................................................................................................... ﭼﻪ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ را ﻣﻴﺘﻮان ﺑﺎ اﺳﺘﻔﺎده از C#اﻧﺠﺎم داد؟ 51 ......................................................................... وﻳﮋوال اﺳﺘﻮدﻳﻮ 52 ............................................................................................................... :2005 راه ﺣﻠﻬﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ53 ...........................................................................................................: ﻧﺘﻴﺠﻪ53 ................................................................................................................................. :
ﻓﺼﻞ ﺳﻮم :ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار 54 .......................................................................... داده ﻫﺎ و اﻃﻼﻋﺎت54 ................................................................................................................... : اﻟﮕﻮرﻳﺘﻢ ﻫﺎ54 .......................................................................................................................: ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭼﻴﺴﺖ؟ 56 ................................................................................................. ﻣﺘﻐﻴﻴﺮ ﻫﺎ56 ............................................................................................................................. : ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎ56 .................................................................................................................. : ﺗﻮﺿﻴﺤﺎت و ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ60 ..........................................................................................................:
٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻮﺿﻴﺤﺎت60 ........................................................................................................................ : ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ62 ................................................................................................................... : ﻧﻮع ﻫﺎي داده اي62 .................................................................................................................... : ﻛﺎرﻛﺮدن ﺑﺎ اﻋﺪاد62 ................................................................................................................. : ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ ﻣﻌﻤﻮل روي اﻋﺪاد ﺻﺤﻴﺢ63 .................................................................................. : ﺗﻨﺪ ﻧﻮﻳﺴﻲ در ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ66 ............................................................................................... : ﻣﺤﺪودﻳﺖ ﻛﺎر ﺑﺎ اﻋﺪاد ﺻﺤﻴﺢ67 ............................................................................................... : اﻋﺪاد اﻋﺸﺎري68 ................................................................................................................ : ﺣﺎﻟﺘﻬﺎي دﻳﮕﺮ70 ................................................................................................................ : اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ70 ............................................................................................... : ﻛﺎر ﺑﺎ رﺷﺘﻪ ﻫﺎ71 ....................................................................................................................: اﺗﺼﺎل رﺷﺘﻪ ﻫﺎ73 ...............................................................................................................: اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ اﺗﺼﺎل رﺷﺘﻪ در درون ﺑﺮﻧﺎﻣﻪ74 .............................................................................. : ﻋﻤﻠﻴﺎت ﺑﻴﺸﺘﺮ روي رﺷﺘﻪ ﻫﺎ75 .................................................................................................: زﻳﺮ رﺷﺘﻪ ﻫﺎ77 .................................................................................................................. : ﻗﺎﻟﺐ ﺑﻨﺪي رﺷﺘﻪ ﻫﺎ79 .......................................................................................................... : ﻗﺎﻟﺐ ﺑﻨﺪي ﺑﻮﻣﻲ80 ............................................................................................................. : ﺟﺎﻳﮕﺰﻳﻨﻲ زﻳﺮرﺷﺘﻪ ﻫﺎ81 ....................................................................................................... : ﺗﺒﺪﻳﻞ ﻧﻮع ﻫﺎي داده اي82 ..................................................................................................... : اﺳﺘﻔﺎده از ﺗﺎرﻳﺨﻬﺎ85 ................................................................................................................: ﻗﺎﻟﺐ ﺑﻨﺪي ﺗﺎرﻳﺨﻬﺎ86 .......................................................................................................... : اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي 88 ....................................................................................... :DateTime ﻛﺎر ﺑﺎ ﺗﺎرﻳﺨﻬﺎ89 ................................................................................................................ : ﺑﻮﻟﻴﻦ90 ............................................................................................................................. : ﻧﮕﻬﺪاري ﻣﺘﻐﻴﻴﺮ ﻫﺎ91 .................................................................................................................. : دودوﻳﻲ91 ........................................................................................................................... : ﺑﻴﺘﻬﺎ و ﺑﺎﻳﺖ ﻫﺎ92 ...................................................................................................................: ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ92 .................................................................................................................... : ﻣﺘﺪﻫﺎ94 ................................................................................................................................. : ﭼﺮا از ﻣﺘﺪﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ؟ 95 .................................................................................................. ﻣﺘﺪﻫﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن دﻳﺪه اﻳﺪ95 ................................................................................................ : اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ100................................................................................................................... : اﻧﺘﺨﺎب ﻧﺎم ﺑﺮاي ﻣﺘﺪ103............................................................................................................ : ﻣﺤﺪوده ﻫﺎ104...................................................................................................................... : ﻧﺘﻴﺠﻪ106................................................................................................................................ : ﺗﻤﺮﻳﻦ107............................................................................................................................... : ﺗﻤﺮﻳﻦ 107.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 107.........................................................................................................................:2
٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﭼﻬﺎرم :ﻛﻨﺘﺮل روﻧﺪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ 108 ............................................................. ﺗﺼﻤﻴﻢ ﮔﻴﺮي در ﺑﺮﻧﺎﻣﻪ108............................................................................................................. : دﺳﺘﻮر 108............................................................................................................................ :if دﺳﺘﻮر 111....................................................................................................................:Else ﺑﺮرﺳﻲ ﭼﻨﺪ ﺷﺮط ﺑﺎ 112.................................................................................................. :else if دﺳﺘﻮرات ifﺗﻮدرﺗﻮ114............................................................................................................. : ﻋﻤﻠﮕﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ اي115..........................................................................................................: اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ115................................................................................................... : اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي ﻣﻘﺎﻳﺴﻪ اي117......................................................................................... : ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﻣﻨﻄﻘﻲ 121......................................................................................... : اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ Andﻣﻨﻄﻘﻲ123............................................................................................: ﻣﻄﺎﻟﺐ ﺑﻴﺸﺘﺮ در راﺑﻄﻪ ﺑﺎ ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﻣﻨﻄﻘﻲ125.............................................................. : ﻣﻘﺎﻳﺴﻪ رﺷﺘﻪ ﻫﺎ126................................................................................................................. : اﻧﺘﺨﺎب ﺑﻴﻦ ﺣﺎﻟﺘﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از 128......................................................................................... :switch اﺳﺘﻔﺎده از switchﺑﺎ و ﺑﺪون ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف132....................................................................... : اﻧﺘﺨﺎﺑﻬﺎي ﭼﻨﺪ ﮔﺎﻧﻪ136............................................................................................................. : دﺳﺘﻮر 138............................................................................................................... :default اﺳﺘﻔﺎده از ﻧﻮع ﻫﺎي داده اي ﮔﻮﻧﺎﮔﻮن در دﺳﺘﻮر 139.................................................................... :switch ﺣﻠﻘﻪ ﻫﺎ139............................................................................................................................. : ﺣﻠﻘﻪ 140....................................................................................................................... :for ﺷﻤﺎرش ﻣﻌﻜﻮس در ﺣﻠﻘﻪ145.................................................................................................. : ﺣﻠﻘﻪ ﻫﺎي 146.......................................................................................................... :foreach ﺣﻠﻘﻪ ﻫﺎي 148.................................................................................................................. :do ﺣﻠﻘﻪ 150................................................................................................................... :while ﺷﺮﻃﻬﺎي ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮاي ﺣﻠﻘﻪ ﻫﺎي doو 152..................................................................... :while ﺣﻠﻘﻪ ﻫﺎي ﺗﻮدرﺗﻮ153............................................................................................................... : ﺧﺮوج زودﻫﻨﮕﺎم از ﺣﻠﻘﻪ155........................................................................................................ : دﺳﺘﻮر 157......................................................................................................... :continue ﺣﻠﻘﻪ ﻫﺎي ﺑﻲ ﻧﻬﺎﻳﺖ158............................................................................................................ : ﻧﺘﻴﺠﻪ159................................................................................................................................ : ﺗﻤﺮﻳﻦ160............................................................................................................................... : ﺗﻤﺮﻳﻦ 160.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 160.........................................................................................................................:2
ﻓﺼﻞ ﭘﻨﺠﻢ :ﻛﺎرﻛﺮدن ﺑﺎ ﺳﺎﺧﺘﺎرﻫﺎي داده اي 161 ....................................................... ﻣﻔﻬﻮم آراﻳﻪ161......................................................................................................................... : ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده از آراﻳﻪ ﻫﺎ161.....................................................................................................: اﺳﺘﻔﺎده از 164........................................................................................................... :foreach
٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻧﺘﻘﺎل آراﻳﻪ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ167................................................................................................. : ﻣﺮﺗﺐ ﺳﺎزي آراﻳﻪ ﻫﺎ170............................................................................................................: ﺣﺮﻛﺖ ﺑﻪ ﻋﻘﺐ در آراﻳﻪ ﻫﺎ171..................................................................................................... : ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ آراﻳﻪ ﻫﺎ173.................................................................................................... : ﻣﻔﻬﻮم ﺷﻤﺎرﻧﺪه ﻫﺎ174.................................................................................................................. : اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ175........................................................................................................... : ﺗﻌﻴﻴﻦ ﻣﻮﻗﻴﺖ180.................................................................................................................... : ﻣﻔﻬﻮم ﺛﺎﺑﺖ ﻫﺎ182...................................................................................................................... : اﺳﺘﻔﺎده از ﺛﺎﺑﺖ ﻫﺎ182.............................................................................................................. : ﺛﺎﺑﺘﻬﺎ ﺑﺎ ﻧﻮﻋﻬﺎي داده اي ﮔﻮﻧﺎﮔﻮن185.............................................................................................. : ﺳﺎﺧﺘﺎرﻫﺎ186............................................................................................................................ : اﻳﺠﺎد ﺳﺎﺧﺘﺎرﻫﺎ186.................................................................................................................. : اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ ﺑﻪ ﺳﺎﺧﺘﺎرﻫﺎ190.............................................................................................. : ﻛﺎر ﺑﺎ ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي191.......................................................................................................... : اﺳﺘﻔﺎده از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي192.................................................................................................. : ﺣﺬف ﻳﻚ ﻋﻨﺼﺮ از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي197........................................................................................ : ﻧﻤﺎﻳﺶ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي200........................................................................................ : اﻳﺠﺎد ﺟﺪاول ﻗﺎﺑﻞ ﺟﺴﺘﺠﻮ ﺑﺎ Hashtableﻫﺎ202.................................................................................... : اﺳﺘﻔﺎده از 203....................................................................................................... :Hashtable ﺟﻠﻮﮔﻴﺮي از وارد ﺷﺪن ﻋﻨﺎﺻﺮ ﺗﻜﺮاري208......................................................................................... : ﻧﺘﻴﺠﻪ210................................................................................................................................ : ﺗﻤﺮﻳﻦ210............................................................................................................................... : ﺗﻤﺮﻳﻦ 211.........................................................................................................................:1
ﻓﺼﻞ ﺷﺸﻢ :اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي 212 ............................................................ ﭘﺎﺳﺦ ﺑﻪ روﻳﺪادﻫﺎ212................................................................................................................... : ﺗﻨﻈﻴﻢ ﻳﻚ روﻳﺪاد ﺑﺮاي ﻛﻨﺘﺮل 212..................................................................................... :Button اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده218.............................................................................................................. : اﻳﺠﺎد ﻓﺮم218....................................................................................................................... : ﺷﻤﺎرش ﻛﺎراﻛﺘﺮ ﻫﺎ220............................................................................................................. : ﺷﻤﺎرش ﻛﻠﻤﺎت222................................................................................................................. : اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭘﻴﭽﻴﺪه ﺗﺮ227........................................................................................................ : ﺑﺮﻧﺎﻣﻪ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ227........................................................................................................... : اﻳﺠﺎد ﻧﻮار اﺑﺰار228.................................................................................................................. : اﻳﺠﺎد ﻧﻮار وﺿﻌﻴﺖ232.............................................................................................................. : اﻳﺠﺎد ﻗﺴﻤﺖ وﻳﺮاﻳﺶ ﻣﺘﻦ234..................................................................................................... : ﭘﺎك ﻛﺮدن ﺑﺨﺶ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ235............................................................................................... : ﭘﺎﺳﺦ ﺑﻪ روﻳﺪادﻫﺎي ﻧﻮار اﺑﺰار237................................................................................................... : ﻣﻔﻬﻮم ﻓﻮﻛﻮس242.................................................................................................................. :
٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده از ﭼﻨﺪﻳﻦ ﻓﺮم در ﺑﺮﻧﺎﻣﻪ244.................................................................................................... : ﻓﺮم 245................................................................................................................... :About ﻧﺘﻴﺠﻪ248................................................................................................................................ : ﺗﻤﺮﻳﻦ249............................................................................................................................... : ﺗﻤﺮﻳﻦ 249.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 249.........................................................................................................................:2
ﻓﺼﻞ ﻫﻔﺘﻢ :ﻧﻤﺎﻳﺶ ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي 250 ........................................................... ﻛﺎدر ﻣﺤﺎوره اي 250............................................................................................... :MessageBox آﻳﻜﻮﻧﻬﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم251..................................................................................... : دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد ﺑﺮاي ﻛﺎدر ﭘﻴﻐﺎم251............................................................................................. : ﺗﻨﻈﻴﻢ دﻛﻤﻪ ي ﭘﻴﺶ ﻓﺮض252.................................................................................................... : ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﻛﺎدر ﭘﻴﻐﺎم252.................................................................................................. : ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ اﺳﺘﻔﺎده از ﻣﺘﺪ 253.......................................................................................:Show ﻛﺎدرﻫﺎي ﭘﻴﻐﺎم ﻧﻤﻮﻧﻪ255............................................................................................................ : ﻛﻨﺘﺮل 259.................................................................................................... :OpenFileDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 260.................................................................................... :OpenFileDialog ﻣﺘﺪﻫﺎي 262...............................................................................................:OpenFileDialog اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 262..................................................................................... :OpenFileDialog ﻛﻨﺘﺮل 268..................................................................................................... :SaveFileDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 268..................................................................................... :SaveFileDialog ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل 269........................................................................................ :SaveFileDialog اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 269...................................................................................... :SaveFileDialog ﻛﻨﺘﺮل 273............................................................................................................ :FontDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 273............................................................................................ :FontDialog ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل 274...............................................................................................:FontDialog اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 274............................................................................................. :FontDialog ﻛﻨﺘﺮل 278.......................................................................................................... :ColorDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 279.......................................................................................... :ColorDialog اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 280........................................................................................... :ColorDialog ﻛﻨﺘﺮل 282............................................................................................................ :PrintDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 283........................................................................................... :PrintDialog اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 283............................................................................................ :PrintDialog ﻛﻼس 283................................................................................................. :PrintDocument ﺧﺼﻮﺻﻴﺎت ﻛﻼس 284................................................................................ :PrintDocument ﭼﺎپ ﻳﻚ ﺳﻨﺪ284...................................................................................................................: ﻛﻨﺘﺮل 293........................................................................................... :FolderBrowserDialog ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل 294...................................................................................... :FolderBrowser اﺳﺘﻔﺎده از ﻛﻨﺘﺮل 295....................................................................................... :FolderBrowser
٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﺘﻴﺠﻪ298................................................................................................................................ : ﺗﻤﺮﻳﻦ299............................................................................................................................... : ﺗﻤﺮﻳﻦ 299.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 299.........................................................................................................................:2
ﻓﺼﻞ ﻫﺸﺘﻢ :ﻣﻨﻮ ﻫﺎ 301 .................................................................................. درك وﻳﮋﮔﻴﻬﺎي ﻳﻚ ﻣﻨﻮ301........................................................................................................... : ﺗﺼﺎوﻳﺮ301.......................................................................................................................... : ﻛﻠﻴﺪﻫﺎي دﺳﺘﺮﺳﻲ302.............................................................................................................. : ﺷﻮرت ﻛﺎت ﻫﺎ302.................................................................................................................. : ﻋﻼﻣﺖ ﺗﻴﻚ302.................................................................................................................... : ﭘﻨﺠﺮه 303.......................................................................................................... :Properties اﻳﺠﺎد ﻣﻨﻮ ﻫﺎ304.........................................................................................................................: ﻃﺮاﺣﻲ ﻣﻨﻮ ﻫﺎ304...................................................................................................................: اﺿﺎﻓﻪ ﻛﺮدن ﻧﻮار اﺑﺰارﻫﺎ و ﻛﻨﺘﺮل ﻫﺎ307........................................................................................... : ﻧﻮﺷﺘﻦ ﻛﺪ ﺑﺮاي ﻣﻨﻮ ﻫﺎ309......................................................................................................... : ﻛﺪ ﻧﻮﻳﺴﻲ ﻣﻨﻮي Viewو ﻧﻮار اﺑﺰارﻫﺎ315........................................................................................ : اﻣﺘﺤﺎن ﺑﺮﻧﺎﻣﻪ317................................................................................................................... : ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ320..................................................................................................................... : اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ321........................................................................................................... : ﻓﻌﺎل و ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ و دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار324................................................................ : ﻧﺘﻴﺠﻪ330................................................................................................................................ : ﺗﻤﺮﻳﻦ330............................................................................................................................... :
ﻓﺼﻞ ﻧﻬﻢ :ﺳﺎﺧﺘﻦ اﺷﻴﺎ 331 .............................................................................. ﻣﻔﻬﻮم اﺷﻴﺎ331.......................................................................................................................... : ﻛﭙﺴﻮﻟﻲ ﺑﻮدن333................................................................................................................... : ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎ333............................................................................................................ : روﻳﺪادﻫﺎ334......................................................................................................................... : ﻗﺎﺑﻞ روﻳﺖ ﺑﻮدن334................................................................................................................ : ﻳﻚ ﻛﻼس ﭼﻴﺴﺖ؟ 335............................................................................................................. اﻳﺠﺎد ﻛﻼﺳﻬﺎ336....................................................................................................................... : ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده ﻣﺠﺪد337............................................................................................................... : ﻃﺮاﺣﻲ ﻳﻚ ﺷﻴﺊ338................................................................................................................... : ﺣﺎﻟﺖ339............................................................................................................................ : رﻓﺘﺎر339............................................................................................................................. : ﻧﮕﻬﺪاري ﺣﺎﻟﺖ340................................................................................................................. : ﺧﺎﺻﻴﺖ ﻫﺎي ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ343.................................................................................................... : ﺧﺎﺻﻴﺘﻬﺎي ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ348................................................................................................... : ﻣﺘﺪ 351.............................................................................................................. :IsMoving ٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ 352............................................................................. IsMoving ﻣﺘﺪﻫﺎي ﺳﺎزﻧﺪه354..................................................................................................................... : اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه354...........................................................................................................: وراﺛﺖ356............................................................................................................................... : اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﺟﺪﻳﺪ357...................................................................................... : اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ 361...................................................................... :GetPowerToWeightRatio ﺗﻐﻴﻴﺮ دادن ﭘﻴﺶ ﻓﺮض ﻫﺎ362...................................................................................................... : ﭼﻨﺪ ﺷﻜﻠﻲ ﺑﻮدن :ﻛﻠﻤﻪ اي ﺗﺮﺳﻨﺎك ،ﻣﻔﻬﻮﻣﻲ ﺳﺎده 364............................................................................ Overrideﻛﺮدن ﻣﺘﺪﻫﺎي ﺑﻴﺸﺘﺮ365............................................................................................ : ﺑﻪ ارث ﺑﺮدن از ﻛﻼس 369.............................................................................................. :Object اﺷﻴﺎ و ﺳﺎﺧﺘﺎرﻫﺎ369..................................................................................................................... : ﻛﻼﺳﻬﺎي ﭼﺎرﭼﻮب 370........................................................................................................:.NET ﻓﻀﺎي ﻧﺎم370....................................................................................................................... : راﻫﻨﻤﺎي 372............................................................................................................... :using وراﺛﺖ در ﭼﺎرﭼﻮب 373.................................................................................................... :.NET ﻧﺘﻴﺠﻪ373................................................................................................................................ :
ﻓﺼﻞ دﻫﻢ :ﻣﺒﺎﺣﺚ ﭘﻴﺸﺮﻓﺘﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا 375 ................................................ ﺳﺮﺑﺎر ﮔﺬاري ﻣﺘﺪ ﻫﺎ375................................................................................................................ : اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي 378......................................................................................... :Static اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎي 379.............................................................................................. :Static اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎي 385.................................................................................................... :Static ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ386............................................................................................................. : درك ﻋﻤﻠﮕﺮ ﻫﺎ387................................................................................................................. : ﭼﮕﻮﻧﮕﻲ ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ388............................................................................................... : ﻛﻼﺳﻬﺎي 394............................................................................................................. :Abstract ﻛﻼﺳﻬﺎي 401................................................................................................................ :sealed Interfaceﻫﺎ401..................................................................................................................... : اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻛﺎرﺑﺮدي414.......................................................................................................: ﺷﻮرت ﻛﺎت ﻫﺎي اﻳﻨﺘﺮﻧﺘﻲ و Favoritesﻫﺎ414.................................................................................. : اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎ416............................................................................................................... : ﭘﻴﺪا ﻛﺮدن ﮔﺰﻳﻨﻪ ﻫﺎي 423.......................................................................................... :Favorites ﻣﺸﺎﻫﺪه ي ﻟﻴﻨﻚ ﻫﺎ428............................................................................................................ : اﻳﺠﺎد ﻧﻤﻮﻧﻪ اي دﻳﮕﺮ از ﺑﺮﻧﺎﻣﻪ ي 431....................................................................... :Favorite Viewer اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ي 431......................................................................................... :Favorites Tray ﻧﻤﺎﻳﺶ ﮔﺰﻳﻨﻪ ﻫﺎي 434.............................................................................................. :Favorites ﻧﺘﻴﺠﻪ439................................................................................................................................ :
ﻓﺼﻞ ﻳﺎزدﻫﻢ :اﺷﻜﺎل زداﻳﻲ و ﻛﻨﺘﺮل ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ 441 ................................................
٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻧﻮاع ﻣﺨﺘﻠﻒ ﺧﻄﺎﻫﺎ441................................................................................................................. : ﺧﻄﺎﻫﺎي دﺳﺘﻮري441............................................................................................................... : ﺧﻄﺎﻫﺎي اﺟﺮاﻳﻲ444................................................................................................................ : ﺧﻄﺎﻫﺎي ﻣﻨﻄﻘﻲ444................................................................................................................ : اﺷﻜﺎل زداﻳﻲ446........................................................................................................................ : اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻤﻮﻧﻪ446......................................................................................................... : ﻛﻨﺘﺮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از Breakpointﻫﺎ451.......................................................................... : ﮔﺰﻳﻨﻪ ﻫﺎي ﭘﺮ ﻛﺎرﺑﺮد در ﻧﻮار اﺑﺰار 452.................................................................................. :Debug ﭘﻨﺠﺮه ي 454.................................................................................................... :Breakpoints ﻛﻨﺘﺮل اﺳﺘﺜﻨﺎ ﻫﺎ در ﺑﺮﻧﺎﻣﻪ456...........................................................................................................: ﭼﮕﻮﻧﮕﻲ ﻳﺎﻓﺘﻦ ﺑﻼك Catchﺑﺮاي ﻳﻚ اﺳﺘﺜﻨﺎ457.............................................................................. : ﻛﻼس 458..........................................................................................................:Exception دﺳﺘﻮر 459................................................................................................................. :throw دﺳﺘﻮرات tryو 462....................................................................................................... :catch اﻳﺠﺎد ﺑﻼك ﻫﺎي catchاﺧﺘﺼﺎﺻﻲ465.......................................................................................... : ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻛﻼس 468................................................................................. :Exception ﻧﺘﻴﺠﻪ471................................................................................................................................ :
ﻓﺼﻞ دوازدﻫﻢ :اﻳﺠﺎد ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼس473 ......................................................... ﻣﻔﻬﻮم ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼس474....................................................................................................... : اﻳﺠﺎد ﻳﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻛﻼس474.................................................................................................. : اﻳﺠﺎد ﻳﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻛﻼس ﺑﺮاي 476............................................................... :Favorites Viewer ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭼﻨﺪ ﻻﻳﻪ480........................................................................................................... : اﺳﺘﻔﺎده از ﻧﺎﻣﮕﺬاري ﻗﻮي 482........................................................................................................... اﻣﻀﺎ ﻛﺮدن اﺳﻤﺒﻠﻲ ﻫﺎ483.......................................................................................................... : ﻧﺴﺨﻪ ﻫﺎي ﻳﻚ اﺳﻤﺒﻠﻲ486........................................................................................................ : ﺛﺒﺖ ﻛﺮدن ﻳﻚ اﺳﻤﺒﻠﻲ487............................................................................................................ : اﺑﺰار 487................................................................................................................ :GacUtil ﻃﺮاﺣﻲ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼس490...................................................................................................... : اﺳﺘﻔﺎده از ﻳﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻛﻼس ﺷﺨﺺ ﺛﺎﻟﺚ491................................................................................... : اﺳﺘﻔﺎده از ﻓﺎﻳﻞ 491................................................................................ :InetrnetFavorites.dll اﺳﺘﻔﺎده از 492................................................................................................. :Object Browser ﻧﺘﻴﺠﻪ494................................................................................................................................ : ﺗﻤﺮﻳﻦ494............................................................................................................................... :
ﻓﺼﻞ ﺳﻴﺰدﻫﻢ :اﻳﺠﺎد ﻛﻨﺘﺮﻟﻬﺎي ﺳﻔﺎرﺷﻲ 495 ........................................................... ﻛﻨﺘﺮﻟﻬﺎي وﻳﻨﺪوزي495................................................................................................................. : اﻳﺠﺎد و ﺗﺴﺖ ﻛﺮدن ﻛﻨﺘﺮل ﻫﺎي ﺳﻔﺎرﺷﻲ496..................................................................................... : اﻳﺠﺎد ﻛﺮدن ﺧﺎﺻﻴﺖ ﺑﺮاي ﻛﻨﺘﺮل ﻫﺎي ﺳﻔﺎرﺷﻲ500...................................................................................:
١٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ ﻫﺎ501........................................................................................................ : اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ ﺑﻪ ﻛﻨﺘﺮل ﻫﺎي ﺳﻔﺎرﺷﻲ503...................................................................................... : اﺿﺎﻓﻪ ﻛﺮدن روﻳﺪاد ﺑﻪ ﻛﻨﺘﺮل504.................................................................................................. : زﻣﺎن اﺟﺮا ﻳﺎ زﻣﺎن ﻃﺮاﺣﻲ509.......................................................................................................... : اﻳﺠﺎد ﻳﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻓﺮم512......................................................................................................... : اﻳﺠﺎد ﻳﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻓﺮم ﺣﺎوي ﻓﺮم ورود512................................................................................... : اﺳﺘﻔﺎده از ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻓﺮم اﻳﺠﺎد ﺷﺪه523.......................................................................................... : اﺳﺘﻔﺎده از روﻳﺪاد ﻫﺎي ﻣﻮﺟﻮد در ﻛﺘﺎﺑﺨﺎﻧﻪ ي ﻓﺮم526............................................................................. : ﻧﺘﻴﺠﻪ530................................................................................................................................ : ﺗﻤﺮﻳﻦ531............................................................................................................................... :
ﻓﺼﻞ ﭼﻬﺎردﻫﻢ :اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﮔﺮاﻓﻴﻜﻲ 532 ........................................................ اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي Paintﺳﺎده532................................................................................................. : اﻳﺠﺎد ﻳﻚ ﭘﺮوژه ﻫﻤﺮاه ﺑﺎ ﻛﻨﺘﺮل ﻫﺎي ﺳﻔﺎرﺷﻲ532................................................................................ : ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﮔﺮاﻓﻴﻜﻲ ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ؟ 533..................................................................................... ﺗﺮﺳﻴﻢ ﺑﻴﺖ ﻣﭙﻲ534............................................................................................................. : ﺗﺮﺳﻴﻢ ﺑﺮداري535............................................................................................................... : اﻳﺠﺎد ﻛﻼس 535............................................................................................. :GraphicsItem ﻣﺨﺘﺼﺎت ﺻﻔﺤﻪ و ﻣﺨﺘﺼﺎت ﺑﺮﻧﺎﻣﻪ538............................................................................................: ﺑﺮرﺳﻲ ﺣﺮﻛﺎت ﻣﺎوس و رﺳﻢ اﺷﻴﺎي 540.................................................................. :GraphicsCircle ﻧﺎ ﻣﻌﺘﺒﺮ ﺳﺎزي547................................................................................................................... : ﺑﻬﻴﻨﻪ ﺳﺎزي ﻛﺮدن رﺳﻢ548........................................................................................................ : اﻧﺘﺨﺎب رﻧﮓ549.................................................................................................................... : اﻳﺠﺎد ﻛﻨﺘﺮل 549............................................................................................ :ColorPalette ﭘﺎﺳﺦ دادن ﺑﻪ ﻛﻠﻴﻚ ﻫﺎ556.........................................................................................................: اﺳﺘﻔﺎده از دو رﻧﮓ در ﺑﺮﻧﺎﻣﻪ560........................................................................................................ : ﻣﺸﺨﺺ ﻛﺮدن رﻧﮕﻬﺎي ﻣﻮرد اﺳﺘﻔﺎده563.......................................................................................... : اﺳﺘﻔﺎده از رﻧﮕﻬﺎي ﺑﻴﺸﺘﺮ در ﺑﺮﻧﺎﻣﻪ572............................................................................................. : اﺳﺘﻔﺎده از ﻛﺎدر 574.................................................................................................... :Color اﺳﺘﻔﺎده از رﻧﮕﻬﺎي ﺳﻴﺴﺘﻤﻲ576................................................................................................ : اﺳﺘﻔﺎده از اﺑﺰارﻫﺎي ﻣﺘﻔﺎوت577..................................................................................................... : اﺳﺘﻔﺎده از داﻳﺮه ﻫﺎي ﺗﻮﺧﺎﻟﻲ578................................................................................................... : ﻛﺎر ﺑﺎ ﻋﻜﺴﻬﺎ584........................................................................................................................: ﻧﻤﺎﻳﺶ ﺗﺼﺎوﻳﺮ585.................................................................................................................. : ﺗﻐﻴﻴﺮ اﻧﺪازه ي ﺗﺼﺎوﻳﺮ587.......................................................................................................... : ﻣﺘﺪ ﻫﺎي دﻳﮕﺮ ﻛﻼس 590............................................................................................... :Graphics ﻧﺘﻴﺠﻪ591................................................................................................................................ :
ﻓﺼﻞ ﭘﺎﻧﺰدﻫﻢ :اﺳﺘﻔﺎده از ﺑﺎﻧﻜﻬﺎي اﻃﻼﻋﺎﺗﻲ 592 ....................................................... ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﭼﻴﺴﺖ؟ 592............................................................................................................. ١١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺷﻴﺎي ﻣﻮﺟﻮد در 593.................................................................................................... :Access ﺟﺪوﻟﻬﺎ593.......................................................................................................................... : ﭘﺮس وﺟﻮ ﻫﺎ594.................................................................................................................... : دﺳﺘﻮر SELECTدر زﺑﺎن 595.............................................................................................. :SQL ﭘﺮس وﺟﻮ ﻫﺎ در 597........................................................................................................ :Access اﻳﺠﺎد ﻳﻚ ﭘﺮس وﺟﻮ598............................................................................................................ : ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت603................................................................................................. : 603..................................................................................................................... :DataSet 604.......................................................................................................... :DataGridView 604.......................................................................................................... :BindingSource 605..................................................................................................... :BindingNavigator 605............................................................................................................ :TableAdapter اﺗﺼﺎل داده ﻫﺎ605....................................................................................................................... : ﻧﺘﻴﺠﻪ613................................................................................................................................ : ﺗﻤﺮﻳﻦ614............................................................................................................................... : ﺗﻤﺮﻳﻦ 614.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 615.........................................................................................................................:2
ﻓﺼﻞ ﺷﺎﻧﺰدﻫﻢ :ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺑﺎ SQL Serverو 616 .......... ADO.NET 617..................................................................................................................... ADO.NET ﻓﻀﺎي ﻧﺎم 617............................................................................................................... :Data ﻛﻼس 619.................................................................................................. :SqlConnection اﻳﺠﺎد ﺑﺨﺸﻬﺎي ﻣﺨﺘﻠﻒ 619........................................................................ :ConnectionString ﻣﺘﺼﻞ ﺷﺪن و ﻗﻄﻊ ﻛﺮدن اﺗﺼﺎل ﺑﻪ ﻳﻚ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ621................................................................. : ﻛﻼس 621.................................................................................................... :SqlCommand ﺧﺎﺻﻴﺖ 622.................................................................................................. :Connection ﺧﺎﺻﻴﺖ 622.............................................................................................:CommandText ﺧﺎﺻﻴﺖ 623................................................................................................... :Parameters ﻣﺘﺪ 624........................................................................................... :ExecuteNonQuery ﻛﻼس 625................................................................................................ :SqlDataAdapter ﺧﺎﺻﻴﺖ 626.......................................................................................... :SelectCommand اﺳﺘﻔﺎده از Command Builderﺑﺮاي اﻳﺠﺎد دﺳﺘﻮرات SQLدﻳﮕﺮ628............................................... : ﻣﺘﺪ 628.................................................................................................................... :Fill ﻛﻼس 630............................................................................................................. :DataSet ﻛﻼس 631..........................................................................................................:DataView ﺧﺎﺻﻴﺖ 632.............................................................................................................. :Sort ﺧﺎﺻﻴﺖ 632.................................................................................................... :RowFilter ﻣﺘﺪ 633.................................................................................................................. :Find اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎي ADO.NETدر ﻋﻤﻞ634.................................................................................... :
١٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﺎرﺑﺮد DataSetدر ﺑﺮﻧﺎﻣﻪ635................................................................................................... : اﺗﺼﺎل داده ﻫﺎ646....................................................................................................................... : BindingContextو 647........................................................................ :CurrencyManager اﺗﺼﺎل ﻛﻨﺘﺮل ﻫﺎ648................................................................................................................ : ﻣﺜﺎل اﻳﺠﺎد اﺗﺼﺎل649........................................................................................................... : ﻧﺘﻴﺠﻪ689................................................................................................................................ : ﺗﻤﺮﻳﻦ690............................................................................................................................... : ﺗﻤﺮﻳﻦ 690.........................................................................................................................:1
ﻓﺼﻞ ﻫﻔﺪﻫﻢ :ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺒﺘﻨﻲ ﺑﺮ وب 691 ............................................................ ﻣﻌﻤﺎري ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب691..................................................................................................... : ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب در ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وﻳﻨﺪوز693..................................................................... : ﻣﺰاﻳﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وﻳﻨﺪوز693............................................................................................... : ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب694...........................................................................................................: اﺟﺰاي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب694................................................................................................ : ﺳﺮور وب695........................................................................................................................ : ﻣﺮورﮔﺮ695.......................................................................................................................... : 695...................................................................................................................... :HTML VBScriptو 696............................................................................................... :JavaScript 696........................................................................................................................... :CSS 696.............................................................................................................................. :ASP ﻣﺰاﻳﺎ697............................................................................................................................. : ﻓﺎﻳﻠﻬﺎي ﺧﺎص در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﺗﺤﺖ وب697.................................................................................... : ﻓﺎﻳﻞ 697..................................................................................................... :Global.asax ﻓﺎﻳﻞ 698...................................................................................................... :web.config اﺳﺘﻔﺎده از ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ698............................................................................................... : ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﺟﻌﺒﻪ اﺑﺰار698................................................................................................. : اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺗﺤﺖ وب699...........................................................................................................: اﻳﺠﺎد ﻳﻚ ﻓﺮم وب ﺑﺮاي ﭘﺮدازش ﺳﻤﺖ ﺳﺮور و ﺳﻤﺖ ﻛﻼﻳﻨﺖ700............................................................... : درﻳﺎﻓﺖ اﻃﻼﻋﺎت و اﻋﺘﺒﺎر ﺳﻨﺠﻲ آﻧﻬﺎ707.......................................................................................... : ﻃﺮاﺣﻲ ﻇﺎﻫﺮ ﺳﺎﻳﺖ713............................................................................................................. : اﺳﺘﻔﺎده از ﻛﻨﺘﺮل GridViewﺑﺮاي ﻧﻤﺎﻳﺶ داده ﻫﺎ در ﻓﺮم وب727............................................................ : ﻣﺤﻞ ﻗﺮارﮔﻴﺮي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﺗﺤﺖ وب در وﻳﮋوال اﺳﺘﻮدﻳﻮ735.................................................................. : ﻧﺘﻴﺠﻪ738................................................................................................................................ : ﺗﻤﺮﻳﻦ738............................................................................................................................... :
ﻓﺼﻞ ﻫﺠﺪﻫﻢ :ﺗﺸﺨﻴﺺ ﻫﻮﻳﺖ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب 740 ......................................... ﺗﺸﺨﻴﺺ ﻫﻮﻳﺖ در ﻳﻚ ﺳﺎﻳﺖ وب740................................................................................................ : ﺗﺸﺨﻴﺺ ﻫﻮﻳﺖ ﺑﺎ اﺳﺘﻔﺎده از وﻳﻨﺪوز740........................................................................................... : ﺗﺸﺨﻴﺺ ﻫﻮﻳﺖ ﺑﺎ اﺳﺘﻔﺎده از ﻓﺮﻣﻬﺎي وب741..................................................................................... : ١٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺑﺰار ﻣﺪﻳﺮﻳﺖ ﺳﺎﻳﺖ وب )741.............................................................................................:(WAT ﻛﻨﺘﺮﻟﻬﺎي 752............................................................................................................. :Login ﻧﺘﻴﺠﻪ765............................................................................................................................ : ﺗﻤﺮﻳﻦ766............................................................................................................................... : ﺗﻤﺮﻳﻦ 766.........................................................................................................................:1
ﻓﺼﻞ ﻧﻮزدﻫﻢ XML :و وﻳﮋوال 767 ....................................................... 2005 C# درك 767....................................................................................................................... :XML XMLﺷﺒﻴﻪ ﺑﻪ ﭼﻴﺴﺖ؟ 768....................................................................................................... XMLﺑﺮاي اﻓﺮاد ﻣﺒﺘﺪي771..................................................................................................... : ﭘﺮوژه ي دﻓﺘﺮ ﺗﻠﻔﻦ771................................................................................................................. : اﻳﺠﺎد ﭘﺮوژه771...................................................................................................................... : ﻛﻼس 773............................................................................................... :SerializableData درﻳﺎﻓﺖ داده ﻫﺎ از ﻳﻚ ﻓﺎﻳﻞ 780.......................................................................................... :XML ﺗﻐﻴﻴﺮ در داده ﻫﺎ784................................................................................................................. : ﻓﺮﺳﺘﺎدن اﻳﻤﻴﻞ785..................................................................................................................: اﻳﺠﺎد ﻟﻴﺴﺘﻲ از آدرﺳﻬﺎ786.......................................................................................................... : در ﻧﻈﺮ ﻧﮕﺮﻓﺘﻦ اﻋﻀﺎ792............................................................................................................ : اﺳﺘﺨﺮاج رﻛﻮرد ﻫﺎ از ﻓﺎﻳﻞ 795............................................................................................ :XML اﺿﺎﻓﻪ ﻛﺮدن رﻛﻮرد ﻫﺎي ﺟﺪﻳﺪ796................................................................................................. : ﺣﺮﻛﺖ در ﺑﻴﻦ داده ﻫﺎ798.......................................................................................................... : ﺣﺬف ﻛﺮدن داده ﻫﺎ از ﺑﺮﻧﺎﻣﻪ800................................................................................................... : ﺑﺮرﺳﻲ ﻟﺒﻪ ﻫﺎ802................................................................................................................... : اﻳﺠﺎد ﻳﻜﭙﺎرﭼﮕﻲ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ ي دﻓﺘﺮ ﺗﻠﻔﻦ و دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ803................................................................... : ﺗﻮﺿﻴﺢ اﺻﻮل ﻳﻜﭙﺎرﭼﻪ ﺳﺎزي803...................................................................................................: ﺧﻮاﻧﺪن اﻃﻼﻋﺎت ﺑﺮﻧﺎﻣﻪ ي دﻓﺘﺮ ﺗﻠﻔﻦ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي دﻳﮕﺮ805.................................................................: ﻧﺘﻴﺠﻪ811................................................................................................................................ : ﺗﻤﺮﻳﻦ811............................................................................................................................... : ﺗﻤﺮﻳﻦ 812.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 812.........................................................................................................................:2
ﻓﺼﻞ ﺑﻴﺴﺘﻢ :وب ﺳﺮوﻳﺲ ﻫﺎ و 813 ........................................... .NET Remoting وب ﺳﺮوﻳﺲ ﭼﻴﺴﺖ؟813................................................................................................................ ﻧﺤﻮه ي ﻋﻤﻠﻜﺮد وب ﺳﺮوﻳﺲ ﻫﺎ814.............................................................................................. : 815........................................................................................................................ :SOAP اﻳﺠﺎد ﻳﻚ وب ﺳﺮوﻳﺲ816............................................................................................................. : اﻳﺠﺎد ﻳﻚ وب ﺳﺮوﻳﺲ ﺳﺎده817................................................................................................... : اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪﻫﺎي دﻳﮕﺮ820..................................................................................................... : اﻳﺠﺎد ﺳﺮور ﭘﺮوژه ي 822...................................................................................... :Picture Service
١٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﺠﺎد ﭘﺮوژه822...................................................................................................................... : ﺑﺮﮔﺮداﻧﺪن آراﻳﻪ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ي ﻣﺘﺪ825.....................................................................................: ﺑﺮﮔﺮداﻧﺪن ﻳﻚ ﺳﺎﺧﺘﺎر ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ي ﻳﻚ ﻣﺘﺪ در وب ﺳﺮوﻳﺲ830.......................................................... : اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ي ﻛﻼﻳﻨﺖ835............................................................................................................ : 835...................................................................................................................... :WSDL اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ي ﻛﻼﻳﻨﺖ835........................................................................................................ : اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ وب ﺳﺮوﻳﺲ ﺑﻪ ﺑﺮﻧﺎﻣﻪ837....................................................................................... : ﻧﻤﺎﻳﺶ ﻟﻴﺴﺖ ﻓﻮﻟﺪر ﻫﺎ در ﺑﺮﻧﺎﻣﻪ839............................................................................................... : ﻧﻤﺎﻳﺶ ﻟﻴﺴﺖ ﻓﺎﻳﻠﻬﺎي ﻣﻮﺟﻮد و اﻧﺘﺨﺎب آﻧﻬﺎ843................................................................................... : 848............................................................................................................ :.NET Remoting اﻳﺠﺎد ﭘﺮوﻛﺴﻲ852.................................................................................................................. : ﻧﺘﻴﺠﻪ856................................................................................................................................ : ﺗﻤﺮﻳﻦ856............................................................................................................................... : ﺗﻤﺮﻳﻦ 856.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 857.........................................................................................................................:2
ﻓﺼﻞ ﺑﻴﺴﺖ و ﻳﻜﻢ :ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﺎرﺑﺮدي 858 .................................................... ﻣﻨﻈﻮر از ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﭼﻴﺴﺖ؟ 858...................................................................................................... ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از روش 859............................................................................... :ClickOnce ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از روش 865.................................................................................. :XCOPY اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻧﺼﺐ ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ 865.................................................................... :2005 اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻧﺼﺐ ﻛﻨﻨﺪه866............................................................................................... : وﻳﺮاﻳﺸﮕﺮ راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ ي ﻧﺼﺐ870............................................................................................ : ﺗﻮزﻳﻊ راه ﺣﻠﻬﺎي ﮔﻮﻧﺎﮔﻮن874.......................................................................................................... : اﺳﻤﺒﻠﻲ ﻫﺎي ﺧﺼﻮﺻﻲ874......................................................................................................... : اﺳﻤﺒﻠﻲ ﻫﺎي ﻋﻤﻮﻣﻲ875........................................................................................................... : ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي876..................................................................................................... : ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺒﺘﻨﻲ ﺑﺮ وب876................................................................................................ : ﺗﻮزﻳﻊ وب ﺳﺮوﻳﺲ ﻫﺎ876.......................................................................................................... : اﺑﺰارﻫﺎي ﻣﻔﻴﺪ876................................................................................................................... : ﻧﺘﻴﺠﻪ877................................................................................................................................ : ﺗﻤﺮﻳﻦ878............................................................................................................................... : ﺗﻤﺮﻳﻦ 878.........................................................................................................................:1 ﺗﻤﺮﻳﻦ 878.........................................................................................................................:2
ﻓﺼﻞ ﺑﻴﺴﺖ و دوم :اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﻮﺑﺎﻳﻞ 879 ....................................................... درك ﻣﺤﻴﻂ879......................................................................................................................... : 880....................................................................................... :Common Language Runtime 880............................................................................................................... :ActiveSync ﻧﻮع ﻫﺎي داده اي در 881...................................................................................................... :CF ١٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در 882..........................................................................:Compact Framework اﻳﺠﺎد ﻳﻚ ﺑﺎزي ﺑﺮاي 885............................................................................................. :Pocket PC ﻧﺘﻴﺠﻪ897................................................................................................................................ : ﺗﻤﺮﻳﻦ898............................................................................................................................... :
ﺿﻤﻴﻤﻪ ي :1اداﻣﻪ ي ﻣﺴﻴﺮ 899 ......................................................................... ﻣﻨﺎﺑﻊ آﻧﻼﻳﻦ900......................................................................................................................... : ﻣﻨﺎﺑﻊ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ900.............................................................................................................. : ﻣﻨﺎﺑﻊ دﻳﮕﺮ901...................................................................................................................... :
ﺿﻤﻴﻤﻪ :2ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺠﺎري و ﭼﻨﺪ ﻻﻳﻪ در 902 ........................................... .NET ﭼﺮا .NET؟ 902....................................................................................................................... ﻣﺸﻜﻼت ﺗﺠﺎري رﻓﻊ ﺷﺪه ﺗﻮﺳﻂ 902..................................................................................... .NET ﻛﺎراﻳﻲ و ﻣﻘﻴﺎس ﭘﺬﻳﺮي904........................................................................................................ : ﻣﺰاﻳﺎي 904................................................................................................................ : .NET ﭘﺬﻳﺮش اﺳﺘﺎﻧﺪاردﻫﺎي ﻫﻤﮕﺎﻧﻲ905................................................................................................. : ﺳﺮوﻳﺲ ﻫﺎي وب906...............................................................................................................: وﻳﮋﮔﻲ ﻫﺎي ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ 906.......................................................................... : Visual Stadio.NET 906....................................................................................... :Common Language Runtime زﺑﺎن ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ 906.............................................................................................. :.NET 907............................................................................................. :Intermediate Language ﺗﻜﺎﻣﻞ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻻﻳﻪ اي907...................................................................................................... : ﺗﻌﺮﻳﻒ907........................................................................................................................... : ﻣﺪﻳﺮﻳﺖ ﻣﺘﻤﺮﻛﺰ907................................................................................................................. : ﻣﺤﺎﺳﺒﺎت ﺗﻮزﻳﻊ ﺷﺪه908........................................................................................................... : ﻛﺎراﻳﻲ908........................................................................................................................... : ﻣﻘﻴﺎس ﭘﺬﻳﺮي908.................................................................................................................. : ﻗﻮاﻋﺪ و دﺳﺘﻮرات ﺗﺠﺎري908....................................................................................................... : راﺣﺘﻲ ﻛﺎرﺑﺮ909..................................................................................................................... : ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ909................................................................................................................. : ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ909.............................................................................................: ﻛﺎراﻳﻲ910........................................................................................................................... : دﺳﺘﺮﺳﻲ داده ﻫﺎ910................................................................................................................ : ﻗﻮاﻋﺪ ﺗﺠﺎري911.................................................................................................................... : ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ911................................................................................................................ : ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮان911.......................................................................................................... : ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري912........................................................................................................... : ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ912........................................................................................................ : ﻣﺪﻳﺮﻳﺖ ﻛﺪ913..................................................................................................................... : ﻣﻘﻴﺎس ﭘﺬﻳﺮي913.................................................................................................................. : ١٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻗﻮاﻋﺪ ﺗﺠﺎري913.................................................................................................................... : ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭼﻨﺪ ﻻﻳﻪ914............................................................................................................. : ﻛﻼس ﺧﺎرﺟﻲ914.................................................................................................................. : ﻛﻼس اﺻﻠﻲ ﺗﺠﺎري915............................................................................................................: ﻛﻼﺳﻬﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت916.................................................................................................. : ﺳﺮوﻳﺲ ﻫﺎي وب916...............................................................................................................: ﻣﺪل ﻻﻳﻪ وب ﺳﺮوﻳﺲ ﻫﺎ917...................................................................................................... : ﭼﺮا وب ﺳﺮوﻳﺲ ﻫﺎ؟ 917............................................................................................................
ﺿﻤﻴﻤﻪ ي :3ﻣﻌﻤﺎري ﭘﻠﺖ ﻓﺮم 919 ........................................ .NET Framework ﻛﺎﻣﭙﺎﻳﻞ ﺳﻮرس ﻛﺪ ﺑﻪ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه919.................................................................................. : ﺗﺮﻛﻴﺐ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در اﺳﻤﺒﻠﻲ ﻫﺎ922................................................................................... : ﺑﺎرﮔﺬاري 924............................................................................. :Common Language Runtime اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه925....................................................................................................... : ﻣﺠﻤﻮﻋﻪ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس 929.............................................................................. :.NET Framework ﺳﻴﺴﺘﻢ ﻧﻮع داده اي ﻋﻤﻮﻣﻲ931........................................................................................................ : ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ933......................................................................................... :
ﺿﻤﻴﻤﻪ :4ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در 935 .............................................................. .NET درك ﻣﺒﺎﻧﻲ ﻛﺎر 935....................................................................................... :Garbage Collector اﻟﮕﻮرﻳﺘﻢ 938............................................................................................. :Garbage Collection ارﺟﺎع ﻫﺎي ﺿﻌﻴﻒ942.................................................................................................................. : ﻧﺴﻠﻬﺎ944................................................................................................................................ : دﻳﮕﺮ ﻧﺘﺎﻳﺞ ﻛﺎراﻳﻲ 948.................................................................................... :Garbage Collector اﺷﻴﺎي ﺑﺰرگ950........................................................................................................................ :
١٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ اول :ﺑﻪ وﻳﮋوال 2005 C#ﺧﻮش آﻣﺪﻳﺪ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي ﻳﻚ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫﻤﺎﻧﻨﺪ ﻳﺎد دادن ﮔﺮه زدن ﺑﻨﺪ ﻛﻔﺶ ﺑﻪ ﻳﻚ ﻛﻮدك اﺳﺖ .ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ ﻧﺘﻮاﻧﻴﺪ درﺳﺖ ﻣﺮاﺣﻞ ﻛـﺎر را ﺑﻴﺎن ﻛﻨﻴﺪ ،ﻫﻴﭻ ﻛﺎري اﻧﺠﺎم ﻧﻤﻲ ﺷﻮد .وﻳﮋوال 2005 C#ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد ﺑﮕﻮﻳﻴﺪ ﭼﻪ ﻛﺎرﻫﺎﻳﻲ را اﻧﺠﺎم دﻫﺪ .اﻣﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻧﻴﺰ ﻣﺎﻧﻨﺪ ﻳﻚ ﻛﻮدك اﺳﺖ و ﻓﻘﻂ ﻛﺎرﻫﺎﻳﻲ را ﻣﻲ ﺗﻮاﻧﺪ اﻧﺠﺎم دﻫﺪ ﻛﻪ ﻣﺮاﺣﻞ آن ﺑﻪ وﺿﻮح ﻣﺸﺨﺺ ﺷﻮﻧﺪ .اﮔﺮ ﺗﺎ ﻛﻨﻮن ﻫﻴﭻ ﺑﺮﻧﺎﻣﻪ اي ﻧﻨﻮﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻣﻤﻜﻦ اﺳﺖ اﻳﻦ ﻛﺎر ﺑﺴﻴﺎر ﻣﺸﻜﻞ ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ ،اﻟﺒﺘﻪ در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ﻧﻴﺰ ﺑﻪ ﻫﻤﻴﻦ ﺻﻮرت اﺳﺖ .اﻣﺎ ﺧﻮﺷﺒﺨﺘﺎﻧﻪ ،وﻳﮋوال 2005 C#زﺑﺎﻧﻲ اﺳﺖ ﻛﻪ ﺳﻌﻲ ﻛﺮده اﺳﺖ اﻳﻦ ﻣﻮﺿﻮع را ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ ﺳﺎده ﻛﻨﺪ و ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﺎ ﻛﺎرﻫﺎي ﺑﺴﻴﺎر ﻣﺸﻜﻞ را ﺑﻪ ﺳﺎدﮔﻲ اﻧﺠﺎم دﻫﻴﺪ .درك اﺗﻔﺎﻗﺎﺗﻲ ﻛﻪ در ﺳﻄﻮح ﭘﺎﻳﻴﻦ ﺑﺮاي اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ رخ ﻣﻲ دﻫﺪ ﻫﻴﭻ وﻗﺖ ﺿﺮري ﻧﺪاﺷﺘﻪ اﺳﺖ ،اﻣﺎ در وﻳﮋوال 2005 C#ﺑﺮاي ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎزي ﺑﻪ درﮔﻴﺮي ﺑﺎ ﻣﺴﺎﺋﻠﻲ از اﻳـﻦ ﻗﺒﻴـﻞ ﻧﺪارﻳﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ ﺑﺮ اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻨﻮﻳﺴﻴﺪ ﺗﻤﺮﻛﺰ ﻛﻨﻴﺪ. ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي وﻳﮋوال 2005 C#ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ وﻳﻨﺪوز اﺟﺮا ﺷﻮﻧﺪ .ﺣﺘﻲ اﮔﺮ ﺗـﺎﻛﻨﻮن ﻫﻴﭻ ﺑﺮﻧﺎﻣﻪ اي ﺑﺮاي ﻛﺎﻣﭙﻴﻮﺗﺮ ﻧﻨﻮﺷﺘﻪ ﺑﺎﺷﻴﺪ ،در ﻃﻮل ﻛﺘﺎب و اﺟﺮاي ﺗﻤﺮﻳﻨﺎت ﺑﺨﺶ "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" ،ﺑﻴﺸﺘﺮ ﺑﺎ ﺟﻨﺒﻪ ﻫﺎي ﻣﺨﺘﻠﻒ اﻳﻦ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ و ﻫﻤﭽﻨﻴﻦ .NET Frameworkآﺷﻨﺎ ﻣﻲ ﺷﻮﻳﺪ .ﺑﻪ زودي ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ ﻛـﻪ ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ ﺑـﺮاي ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ اﻳﻦ اﻧﺪازه ﻛﻪ ﺗﺼﻮر ﻣﻲ ﻛﻨﻴﺪ ،ﻣﺸﻜﻞ ﻧﻴﺴﺖ .ﺑﻌﺪ از ﻣﺪت ﻛﻤﻲ ﻛﻪ ﺑﺎ آن آﺷﻨﺎ ﺷﺪﻳﺪ ،ﺑﻪ راﺣﺘـﻲ ﻣـﻲ ﺗﻮاﻧﻴـﺪ اﻧـﻮاع ﻣﺨﺘﻠـﻒ ﺑﺮﻧﺎﻣﻪ ﻫﺎ را ﺑﺎ وﻳﮋوال 2005 C#اﻳﺠﺎد ﻛﻨﻴﺪ .وﻳﮋوال ) 2005 C#ﻫﻤﺎﻧﻄﻮر ﻛﻪ از اﺳﻢ .NETﻣﺸﺨﺺ اﺳﺖ( ﻣﻴﺘﻮاﻧﺪ ﺑـﺮاي اﻳﺠـﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده در اﻳﻨﺘﺮﻧﺖ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﻳﻦ زﺑﺎن ﺑﻪ راﺣﺘـﻲ ﺑـﺮاي دﺳـﺘﮕﺎه ﻫـﺎي ﻣﻮﺑﺎﻳـﻞ و ﻳـﺎ PocketPCﻫﺎ ﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﺪ .ﻧﻮﺷﺘﻦ اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ آﻧﻘﺪر ﺳﺎده اﺳﺖ ﻛﻪ در ﭘﺎﻳﺎن اﻳﻦ ﻛﺘﺎب ،ﺑﺮاي ﻧﻤﻮﻧﻪ ﻳﻚ ﺑﺮﻧﺎﻣـﻪ ﺑـﺮاي اﻳﻦ دﺳﺘﮕﺎه ﻫﺎ ﺧﻮاﻫﻴﻢ ﻧﻮﺷﺖ .اﻣﺎ اﺣﺘﻤﺎﻻً ﺑﺎ اﻳﻦ ﻧﻜﺘﻪ ﻣﻮاﻓﻘﻴﺪ ﻛﻪ ﻗﺒﻞ از ﻳﺎدﮔﻴﺮي دوﻳﺪن ،ﺑﺎﻳﺪ راه رﻓﺘﻦ را آﻣﻮﺧـﺖ .ﺑﻨـﺎﺑﺮاﻳﻦ در اﻳـﻦ ﻗﺴﻤﺖ از ﻛﺘﺎب در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ وﻳﻨﺪوز ﺗﻤﺮﻛﺰ ﻣﻲ ﻛﻨﻴﻢ. در اﻳﻦ ﻓﺼﻞ:
ﻧﺼﺐ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005 ﮔﺸﺘﻲ در ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ ﻣﺘﻤﺮﻛﺰ ) (IDEوﻳﮋوال 2005 C# ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده ﺗﺤﺖ وﻳﻨﺪوز ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎي ﺟﺎﻣﻊ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005
ﻧﺼﺐ وﻳﮋوال :2005 C# ﻗﺒﻞ از اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ و وﻳﮋوال C#را ﺷﺮوع ﻛﻨﻴﻢ ،ﺑﺎﻳﺪ آن را در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮدئ ﻧﺼﺐ ﻛﻨـﻴﻢ .وﻳـﮋوال C# ﺑﻪ گ.ﻧﻪ ﻫﺎي ﻣﺨﺘﻠﻔﻲ ﺑﻪ وﺳﻴﻠﻪ ي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ اراﺋﻪ ﺷﺪه اﺳﺖ .ﻧﺴﺨﻪ ي وﻳﮋوال C#اي ﻛﻪ ﺷﻤﺎ از آن اﺳﺘﻔﺎده ﻣـﻲ ﻛﻨﻴـﺪ ،ﻣﻤﻜـﻦ اﺳﺖ ﺑﻪ ﻳﻜﻲ از ﺣﺎﻟﺘﻬﺎي زﻳﺮ ﺑﺎﺷﺪ:
ﺑﻪ ﻋﻨﻮان ﺑﺨﺸﻲ از وﻳﮋوال اﺳﺘﻮدﻳﻮ ،2005ﻛﻪ ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺷﺎﻣﻞ اﺑﺰارﻫﺎ و زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳـﺴﻲ اﺳـﺖ :اﻳـﻦ ﻣﺠﻤﻮﻋـﻪ ﻫﻤﭽﻨــﻴﻦ ﺷــﺎﻣﻞ وﻳــﮋوال ﺑﻴــﺴﻴﻚ J# ،و ﻧﻴــﺰ Visual C++ﻣﻴــﺸﻮد .وﻳــﮋوال اﺳــﺘﻮدﻳﻮ در ﻧــﺴﺨﻪ ﻫــﺎي Tools For Office، Professional ،Standardو وﻳـﮋوال اﺳـﺘﻮدﻳﻮ Team
١٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Systemﻣﻨﺘﺸﺮ ﺷﺪه اﺳﺖ .ﻫﺮ ﻛﺪام از اﻳﻦ ﻧﺴﺨﻪ ﻫﺎ ﻧﺴﺒﺖ ﺑﻪ ﻧﺴﺨﻪ ﻗﺒﻠﻲ از اﻣﻜﺎﻧﺎت و اﺑﺰارﻫﺎي ﺑﻴﺸﺘﺮي ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻬﺮه ﻣﻨﺪ ﻫﺴﺘﻨﺪ. ﺑﻪ ﻋﻨﻮان ﻧﮕﺎرش :Expressاﻳﻦ ﻧﮕﺎرش ﻧﺴﺨﻪ اي از وﻳﮋوال C#اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﺳﺮي اﻣﻜﺎﻧـﺎت و وﻳﮋﮔﻴﻬـﺎي ﻣﺤﺪود ﻣﻮﺟﻮد در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﻴﺸﻮد.
ﻫﺮ دوي اﻳﻦ ﻧﺴﺨﻪ ﻫﺎ از C#ﺑﻪ ﺷﻤﺎ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗﺎ ﺑﺮاي وﻳﻨﺪوز ﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﺪ .ﻣﺮاﺣﻞ ﻧـﺼﺐ ﻫـﺮ دوي آﻧﻬـﺎ ﻧﻴـﺰ ﻛـﺎﻣ ً ﻼ واﺿﺢ اﺳﺖ .در ﺣﻘﻴﻘﺖ ،ﺑﺎﻳﺪ ﮔﻔﺖ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ آﻧﻘﺪر ﺑﺎﻫﻮش اﺳﺖ ﻛﻪ ﺑﻔﻬﻤـﺪ ﺑـﺮاي اﺟـﺮا ﺷـﺪن روي ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺷـﻤﺎ ﺑـﻪ ﭼـﻪ ﭼﻴﺰﻫﺎﻳﻲ ﻧﻴﺎز دارد. ﺗﻮﺿﻴﺤﺎﺗﻲ ﻛﻪ در ﺑﺨﺶ "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" زﻳﺮ آﻣﺪه اﺳﺖ ،ﺑﺮاي ﻧﺼﺐ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻧﺴﺨﻪ ي Team Systemاﺳـﺖ. ﺑﻴﺸﺘﺮ ﻗﺴﻤﺘﻬﺎي ﻧﺼﺐ ﻛﺎﻣﻼً واﺿﺢ ﻫﺴﺘﻨﺪ و ﻓﻘﻂ ﺑﺎﻳﺪ ﮔﺰﻳﻨﻪ ﻫﺎي ﭘﻴﺶ ﻓـﺮض را اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﺻـﺮف ﻧﻈـﺮ از اﻳﻨﻜـﻪ از ﻛﺪاﻣﻴﻚ از ﻧﮕﺎرش ﻫﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ،اﮔﺮ ﻫﻨﮕﺎم ﻧﺼﺐ ﮔﺰﻳﻨﻪ ﻫﺎي ﭘﻴﺶ ﻓﺮض را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،در ﻧـﺼﺐ ﺑﺮﻧﺎﻣـﻪ ﻧﺒﺎﻳﺪ ﻣﺸﻜﻠﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﺼﺐ وﻳﮋوال 2005 C# (1
(2
(3 (4
ﺑﺎ ﻗﺮار دادن CDوﻳﮋوال اﺳﺘﻮدﻳﻮ 2005در دراﻳﻮ ،ﺑﺮﻧﺎﻣﻪ ي ﻧﺼﺐ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﺟﺮا ﻣﻲ ﺷـﻮد .اﻣـﺎ اﮔـﺮ اﺟـﺮا ﻧـﺸﺪ ﻣﻴﺘﻮاﻧﻴﺪ ﻓﺎﻳﻞ setup.exeرا از درون دراﻳﻮ اﺟﺮا ﻛﻨﻴﺪ .ﺑﺮاي اﻳـﻦ ﻛـﺎر ﺑـﻪ ﻣﻨـﻮي Startﺑﺮوﻳـﺪ و روي ﮔﺰﻳﻨـﻪ Runﻛﻠﻴﻚ ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه اي ﻛﻪ ﺑﺎز ﻣﻴﺸﻮد D:\setup.exe ،را ﺗﺎﻳﭗ ﻛﻨﻴﺪ ) Dﻧﺎم دراﻳﻮ ي اﺳﺖ ﻛﻪ CDﻳﺎ DVDوﻳﮋوال اﺳﺘﻮدﻳﻮ در آن ﻗﺮار دارد( .ﺑﻌﺪ از اﺟﺮاي ﺑﺮﻧﺎﻣﻪ Setupﺑﺎﻳﺪ ﺻﻔﺤﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 1-1ﺑﺒﻴﻨﻴﺪ. اﻳﻦ ﭘﻨﺠﺮه ﻣﺮاﺣﻠﻲ را ﻛﻪ ﺑﺮاي ﻧﺼﺐ ﺑﺎﻳﺪ ﻃﻲ ﻛﻨﻴﺪ ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﺮاي اﺟﺮاي درﺳﺖ ﻓﺮآﻳﻨﺪ ﻧﺼﺐ ،وﻳﮋوال اﺳـﺘﻮدﻳﻮ ﻧﻴـﺎز دارد ﻛﻪ ﻳﻚ ﺳﺮي از ﺑﺮﻧﺎﻣﻪ ﻫﺎي روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ را ﺑﻪ روز رﺳﺎﻧﻲ ﻛﻨﺪ ﻣﺜﻞ ﺳﺮوﻳﺲ ﭘﻚ 1ﺑﺮاي وﻳﻨﺪوز .XPﺑﺮﻧﺎﻣﻪ ي ﻧﺼﺐ ،ﻟﻴﺴﺘﻲ از ﻣﻮاردي را ﻛﻪ ﺑﺎﻳﺪ در ﺳﻴﺴﺘﻢ ﺑﻪ روز رﺳﺎﻧﺪه ﺷﻮﻧﺪ را ﺑﻪ ﺷﻤﺎ ﻧﺸﺎن ﻣﻲ دﻫﺪ و ﺷـﻤﺎ ﺑﺎﻳـﺪ ﻗﺒـﻞ از اداﻣـﻪ ي ﻧﺼﺐ وﻳﮋوال اﺳﺘﻮدﻳﻮ ،اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ را ﻧﺼﺐ ﻛﻨﻴﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺗﻐﻴﻴﺮات ﻻزم در ﺳﻴﺴﺘﻢ را اﻧﺠـﺎم داد ،وارد ﻧﺼﺐ ﺧﻮد ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮﻳﻢ .ﺑﺮاي اﻳﻦ ﻣﺮﺣﻠﻪ روي ﻟﻴﻨﻚ Install Visual Studioﻛﻠﻴﻚ ﻛﻨﻴﺪ. ﺑﻌﺪ از ﻗﺒﻮل ﻛﺮدن ﻗﺮارداد ﻧﻮﺷﺘﻪ ﺷﺪه ﺗﻮﺳﻂ ﺷﺮﻛﺖ ،روي Continueﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ ﻣﺮﺣﻠﻪ ﺑﻌﺪ ﺑﺮوﻳﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ﻧﻮع ﻫﺎي ﻣﺨﺘﻠﻔﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ وﻳﮋوال اﺳﺘﻮدﻳﻮ را ﺑﻪ آن ﺻﻮرت ﻧﺼﺐ ﻛﻨﻴﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺳﻪ ﮔﺰﻳﻨﻪ ي ﻣﺨﺘﻠﻒ را در اﻳﻦ ﻗﺴﻤﺖ در اﺧﺘﺎر ﺷﻤﺎ ﻗﺮار ﻣﻲ دﻫﺪ ﻛﻪ ﻋﺒﺎرﺗﻨﺪ از: :Defaultاﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎ اﺑﺰارﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺻـﻮرت ﭘـﻴﺶ ﻓـﺮض اﻧﺘﺨـﺎب ﺷـﺪه اﻧـﺪ در ﺳﻴﺴﺘﻢ ﻧﺼﺐ ﺷﻮﻧﺪ. :Fullﺑﺎ اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ ،وﻳﮋوال اﺳﺘﻮدﻳﻮ و ﺗﻤﺎم اﺑﺰارﻫﺎي ﺟﺎﻧﺒﻲ آن ﺑﻪ ﺻﻮرت ﻛﺎﻣـﻞ در ﺳﻴـﺴﺘﻢ ﺷـﻤﺎ ﻧـﺼﺐ ﻣـﻲ ﺷﻮﻧﺪ .اﮔﺮ از ﻧﻈﺮ ﻓﻀﺎﻳﻲ ﻛﻪ ﺑﺎ اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ در ﺳﻴﺴﺘﻢ ﺷﻤﺎ اﺷﻐﺎل ﻣﻲ ﺷﻮد ﻣﺸﻜﻠﻲ ﻧﺪارﻳـﺪ ،ﺑﻬﺘـﺮ اﺳـﺖ ﻛـﻪ ﻫﻨﮕـﺎم ﻧﺼﺐ اﻳﻦ ﮔﺰﻳﻨﻪ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﻧﺼﺐ ﺷﻮد. :Customﺑﺎ اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ ،ﻟﻴﺴﺘﻲ از ﺗﻤﺎم ﻗﺴﻤﺘﻬﺎي ﻣﻮﺟﻮد در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ و ﻣﻲ ﺗﻮاﻧﻴـﺪ اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﻛﻪ ﻛﺪام ﻗﺴﻤﺘﻬﺎ ﺑﺎﻳﺪ ﻧﺼﺐ ﺷﻮﻧﺪ و ﻛﺪاﻣﻴﻚ ﻧﺒﺎﻳﺪ ﻧﺼﺐ ﺷﻮﻧﺪ.
١٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺮاي اﻳﻨﻜﻪ ﺑﺎ ﻗﺴﻤﺘﻬﺎي ﻣﻮﺟﻮد در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﻴﺰ آﺷﻨﺎ ﺷﻮﻳﻢ ،ﮔﺰﻳﻨﻪ ي Customرا اﻧﺘﺨﺎب ﻛـﺮده و دﻛﻤﻪ ي Nextرا ﻓﺸﺎر دﻫﻴﺪ. (5ﺑﺎ وارد ﺷﺪن ﺑﻪ اﻳﻦ ﻗﺴﻤﺖ ،ﻟﻴﺴﺖ اﺟﺰاي وﻳﮋوال اﺳﺘﻮدﻳﻮ را ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﺼﺐ ﻛﻨﻴﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛـﺮد .ﺑـﺪﻳﻦ ﺗﺮﺗﻴـﺐ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻓﻘﻂ ﻗﺴﻤﺘﻬﺎﻳﻲ را ﻛﻪ ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز دارﻳﺪ ﻧﺼﺐ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻓﻀﺎي دﻳـﺴﻚ ﺷـﻤﺎ ﻛـﻢ اﺳـﺖ و از وﻳـﮋوال 2005 C++اﺳﺘﻔﺎده ﻧﻤﻲ ﻛﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﻧﺼﺐ ﻧﻜﻨﻴﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻜﺎن ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ را ﻧﻴـﺰ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ )ﻣﻌﻤﻮﻻ ﻣﻜﺎن اوﻟﻴﻪ ﻣﻨﺎﺳﺐ اﺳﺖ ،ﻣﮕﺮ آﻧﻜﻪ ﺑﻪ دﻟﻴﻞ ﺧﺎﺻﻲ ﺑﺨﻮاﻫﻴﺪ آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ( .ﺗﻤﺎم ﻗﺴﻤﺘﻬﺎﻳﻲ را ﻛـﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﻌﺪاً ﻧﻴﺰ ﻣﻴﺘﻮاﻧﻨﺪ ﻧﺼﺐ ﺷﺪه و ﻳﺎ از ﺣﺎﻟﺖ ﻧﺼﺐ ﺧﺎرج ﺷﻮﻧﺪ .اﻟﺒﺘﻪ اﮔـﺮ ﻣـﻲ ﺧﻮاﻫﻴـﺪ ﺑﺮﻧﺎﻣـﻪ ﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺑﻨﻮﻳﺴﻴﺪ ،ﻫﻤﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ در ﻓﺼﻞ 16ﺗﻮﺿﻴﺢ داده ﺷﺪه اﻧـﺪ ،در اﻳـﻦ ﻗـﺴﻤﺖ ﺑﺎﻳـﺪ SQL Server 2005 Expressﻛﻪ آﺧﺮﻳﻦ ﮔﺰﻳﻨﻪ ي ﻟﻴﺴﺖ اﺳﺖ را ﻧﻴﺰ اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
ﺷﻜﻞ 1-1 ﺑﺮاي ﻫﺮ ﮔﺰﻳﻨﻪ از ﻟﻴﺴﺖ ﺳﻪ ﻗﺴﻤﺖ وﺟﻮد دارﻧﺪ ﻛﻪ اﻃﻼﻋﺎت آن را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﻨﺪ:
ﻗﺴﻤﺖ Feature Descriptionﻳﻚ ﻃﺮح ﻛﻠﻲ و ﻛﺎراﻳﻲ ﻗﺴﻤﺖ اﻧﺘﺨﺎب ﺷﺪه را ﺷﺮح ﻣﻴﺪﻫﺪ. ﻗﺴﻤﺖ Feature Install Pathﻣﻜﺎﻧﻲ ﻛـﻪ ﻓﺎﻳﻠﻬـﺎي ﺑﺨـﺶ اﻧﺘﺨـﺎب ﺷـﺪه در آن ﻧـﺼﺐ ﻣﻴﺸﻮﻧﺪ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ. در ﻧﻬﺎﻳﺖ ،ﻗﺴﻤﺖ Disk Space Requirementsﺑﻪ ﺷﻤﺎ ﻧﺸﺎن ﻣﻴﺪﻫﺪ ﻛﻪ ﺑﺎ ﻧـﺼﺐ ﺑﺨـﺶ اﻧﺘﺨﺎب ﺷﺪه ،ﻓﻀﺎي دﻳﺴﻚ ﺷﻤﺎ ﭼﮕﻮﻧﻪ ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ.
٢٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻌﺪ از اﻳﻨﻜﻪ ﻧﺼﺐ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،زﻣﺎﻧﻲ ﻛﻪ وﻳﮋوال 2005 C#را اﺟﺮا ﻣﻲ ﻛﻨﻴﺪ اﻃﻼﻋﺎت زﻳﺎدي از دﻳﺴﻚ ﺑﻪ ﺣﺎﻓﻈﻪ و ﺑﺮﻋﻜﺲ ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ داﺷﺘﻦ ﻣﻘﺪاري ﻓﻀﺎي ﺧﺎﻟﻲ در دﻳﺴﻚ ﺑﺮاي ﻛﺎر ﺿﺮوري اﺳﺖ .ﺗﻌﻴﻴﻦ ﻣﻘﺪار دﻗﻴﻖ ﻓﻀﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﻳﻦ ﻣﻮرد ،اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ .اﻣﺎ اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ از اﻳﻦ ﺳﻴﺴﺘﻢ ﺑـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ اﺳـﺘﻔﺎده ﻛﻨﻴﺪ ،ﺣﺪاﻗﻞ ﺑﻪ 100ﻣﮕﺎ ﺑﺎﻳﺖ ﻓﻀﺎي ﺧﺎﻟﻲ ﻧﻴﺎز دارﻳﺪ.
ﺷﻜﻞ 2-1 (6ﺑﻌﺪ از اﻧﺘﺨﺎب ﻗﺴﻤﺘﻬﺎﻳﻲ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﻧﺼﺐ ﻛﻨﻴﺪ ،روي ﮔﺰﻳﻨﻪ Installﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺣـﺎﻻ ﺷـﻤﺎ ﻣﻴﺘﻮاﻧﻴـﺪ ﻣﻘـﺪاري اﺳﺘﺮاﺣﺖ ﻛﻨﻴﺪ ،ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻧﺼﺐ ﺷﻮد .زﻣﺎن ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ ﺑﺴﺘﻪ ﺑﻪ ﻗﺴﻤﺘﻬﺎﻳﻲ ﻛﻪ ﺑـﺮاي ﻧـﺼﺐ اﻧﺘﺨﺎب ﻛﺮده اﻳﺪ ﻣﺘﻔﺎوت اﺳﺖ .وﻟﻲ ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ در ﻳﻚ ﺳﻴﺴﺘﻢ ﺑﺎ ﭘﺮدازﻧﺪه ي 2,4ﮔﻴﮕﺎ ﻫﺮﺗﺰ و 512ﻣﮕﺎ ﺑﺎﻳﺖ ﺣﺎﻓﻈـﻪ ﺑـﺎ وﻳﻨﺪوز XPﻧﺴﺨﻪ Professionalﺣﺪود 20دﻗﻴﻘﻪ ﻃﻮل ﻣﻴﻜﺸﺪ. (7ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ ﺗﻤﺎم ﺷﺪ ،ﺻﻔﺤﻪ اي را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﭘﺎﻳﺎن ﻧﺼﺐ را اﻃﻼع ﻣﻴﺪﻫﺪ .در اﻳﻦ ﻣﺮﺣﻠـﻪ ،ﺑﺮﻧﺎﻣـﻪ ي ﻧﺼﺐ ﻫﺮ ﻣﺸﻜﻠﻲ ﻛﻪ ﺑﺎ آن روﺑﺮو ﺷﺪه ﺑﺎﺷﺪ را ﮔﺰارش ﻣﻲ دﻫﺪ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﮔﺰارش ﻋﻤﻠﻜﺮد ﻧـﺼﺐ را ﻧﻴﺰ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .در اﻳﻦ ﮔﺰارش ﺗﻤﺎم ﻛﺎرﻫﺎﻳﻲ ﻛﻪ در ﻃﻮل ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ اﻧﺠﺎم ﺷﺪه ،ﻧﻮﺷﺘﻪ ﺷـﺪه اﺳـﺖ .اﻳـﻦ ﮔـﺰارش در ﻣﻮاﻗﻌﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﺼﺐ ﺑﺎ ﻣﺸﻜﻞ روﺑﺮو ﻣﻲ ﺷﻮد ،ﻣﻲ ﺗﻮاﻧﺪ ﻣﻔﻴﺪ ﺑﺎﺷﺪ .ﺧﻮب ،ﺑﺪﻳﻦ ﺗﺮﺗﻴـﺐ ﻧـﺼﺐ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ 2005 ﺗﻤﺎم ﺷﺪ .روي ﮔﺰﻳﻨﻪ Doneﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ وارد ﺑﺨﺶ ﻧﺼﺐ ﻣﺴﺘﻨﺪات ﻳﺎ راﻫﻨﻤﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺷﻮﻳﻢ. (8ﻧﺼﺐ MSDN Libraryﻛﺎﻣﻼً ﺳﺎده و واﺿﺢ اﺳﺖ و در اﻳﻦ ﺑﺨﺶ ﻓﻘﻂ ﻗﺴﻤﺘﻬﺎي ﻣﻬﻢ آن را ذﻛﺮ ﻣﻲ ﻛﻨﻴﻢ .اوﻟﻴﻦ ﺻﻔﺤﻪ اي ﻛﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﻴﺒﻴﻨﻴﺪ ،ﺻﻔﺤﻪ ﺧﻮش آﻣﺪ ﮔﻮﻳﻲ اﺳﺖ .ﺑﺮاي اداﻣﻪ ﻛﺎر روي Nextﻛﻠﻴﻚ ﻛﻨﻴﺪ.
٢١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(9ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 3-1ﻧﺸﺎن داده ﺷﺪه اﺳﺖ ،ﺑﻪ ﺷﻤﺎ اﺟﺎزه داده ﻣﻲ ﺷﻮد ﻛﻪ ﻣﻘﺪار ﻣﺴﺘﻨﺪاﺗﻲ ﻛـﻪ ﻣـﻲ ﺧﻮاﻫﻴـﺪ ﻧـﺼﺐ ﻛﻨﻴﺪ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﺑﺮاي ﺷﺮوع ﻧﺼﺐ روي ﮔﺰﻳﻨﻪ Nextﻛﻠﻴﻚ ﻛﻨﻴﺪ. اﮔﺮ دﻳﺴﻚ ﺷﻤﺎ ﻓﻀﺎي ﻛﺎﻓﻲ دارد ،ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ MSDNرا ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﻧﺼﺐ ﻛﻨﻴﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﺑﻪ ﺗﻤـﺎم اﻃﻼﻋـﺎت اﻳﻦ ﻛﺘﺎﺑﺨﺎﻧﻪ دﺳﺘﺮﺳﻲ ﺧﻮاﻫﻴﺪ داﺷﺖ .اﻳﻦ ﻣﻮرد ﺑﻪ ﺧﺼﻮص در ﻣﻮاﻗﻌﻲ ﻛﻪ ﻓﻘﻂ ﻗﺴﻤﺘﻲ از وﻳﮋوال اﺳﺘﻮدﻳﻮ را ﻧـﺼﺐ ﻛـﺮده اﻳﺪ و ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻌﺪا ﻗﺴﻤﺘﻬﺎي دﻳﮕﺮي را ﻧﻴﺰ ﻧﺼﺐ ﻛﻨﻴﺪ ،ﺑﺴﻴﺎر ﻣﻔﻴﺪ ﺧﻮاﻫﺪ ﺑﻮد. (10ﺑﻌﺪ از اﻳﻨﻜﻪ ﻧﺼﺐ MSDNﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،ﺑﻪ ﺻﻔﺤﻪ اول ﺑـﺎز ﺧﻮاﻫﻴـﺪ ﮔـﺸﺖ .در اﻳـﻦ ﻣﺮﺣﻠـﻪ ﮔﺰﻳﻨـﻪ Service Releasesﻧﻴﺰ ﻓﻌﺎل ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻜﻞ 3-1 ﺑﻪ وﺳﻴﻠﻪ ي اﻳﻦ ﮔﺰﻳﻨﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﺴﺨﻪ ﻫﺎي Updateاﻳﻦ ﺑﺮﻧﺎﻣﻪ را ﺑﺎ اﺳﺘﻔﺎده از اﻳﻨﺘﺮﻧﺖ درﻳﺎﻓﺖ ﻛﻨﻴﺪ .اﻳﻦ ﻧﺴﺨﻪ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺷﺎﻣﻞ ﻫﺮ ﭼﻴﺰي ،از ﻣﺴﺘﻨﺪات اﺿﺎﻓﻲ ﺗﺎ ﺗﻌﻤﻴﺮ ﺧﻄﺎﻫﺎي ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ ﺑﺎﺷﻨﺪ .ﺑﺮاي درﻳﺎﻓﺖ آﻧﻬﺎ ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﻴﺪ از اﻳﻨﺘﺮﻧﺖ و ﻳﺎ از ﺑﺴﺘﻪ ﻫﺎي Service Packاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻟﺒﺘﻪ ﻣﺸﺨﺺ اﺳﺖ ﻛﻪ ﺑﺮاي ﻧﺼﺐ اﻳـﻦ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎ از ﻃﺮﻳﻖ اﻳﻨﺘﺮﻧﺖ ،ﺑﺎﻳﺪ ﻳﻚ اﺗﺼﺎل ﻓﻌﺎل ﺑﻪ اﻳﻨﺘﺮﻧﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ و ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ اﻳﻦ اﺗﺼﺎل ﺳﺮﻳﻊ ﺑﺎﺷﺪ ،ﭼﻮن ﺣﺠﻢ اﻳﻦ ﺑـﺴﺘﻪ ﻫﺎ ﻣﻌﻤﻮﻻ زﻳﺎد اﺳﺖ. ﺑﻌﺪ از ﻃﻲ ﻛﺮدن ﻣﺮاﺣﻞ ﺑﺎﻻ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﺼﺐ ﺷﺪه و آﻣﺎده اﺳﺘﻔﺎده اﺳﺖ .از اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺑﻌﺪ ﺗﻔﺮﻳﺢ واﻗﻌﻲ ﺷـﺮوع ﻣﻴـﺸﻮد! ﭘـﺲ اﺟﺎزه ﺑﺪﻫﻴﺪ وارد دﻧﻴﺎي وﻳﮋوال 2005 C#ﺑﺸﻮﻳﻢ.
٢٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ 1وﻳﮋوال :2005 C# در اﺑﺘﺪا ﺟﺎﻟﺐ اﺳﺖ ﺑﺪاﻧﻴﺪ ﻛﻪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ زﺑﺎن ،C#ﺑﻪ ﺑﺮﻧﺎﻣﻪ ي وﻳﮋوال 2005 C#ﻧﻴﺎزي ﻧﺪارﻳﺪ! ﺷﻤﺎ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑﺮﻧﺎﻣـﻪ ﻫﺎي ﺧﻮد را ﺑﺎ ﻳﻚ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻨﻲ ﻣﺎﻧﻨﺪ Notepadﻧﻴﺰ ﺑﻨﻮﻳﺴﻴﺪ .اﻣﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﮋوال C#ﻣﻌﻤﻮﻻ ﻃـﻮﻻﻧﻲ ﻫـﺴﺘﻨﺪ و ﻧﻮﺷـﺘﻦ آﻧﻬﺎ ﺑﺎ notepadزﻣﺎن زﻳﺎدي را ﺻﺮف ﻣﻲ ﻛﻨﺪ .اه ﺑﻬﺘﺮ ﺑﺮاي اﻧﺠﺎم اﻳﻦ ﻛﺎر اﺳﺘﻔﺎده از ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ ﻣﺠﺘﻤﻊ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻛـﻪ ﺑﻪ ﻋﻨﻮان IDEﻧﻴﺰ ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮد IDE .وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻣﻜﺎﻧﺎت ﺑﺴﻴﺎر زﻳﺎدي را در اﺧﺘﻴﺎر ﺷﻤﺎ ﻗﺮار ﻣﻲ دﻫﺪ ﻛﻪ ﻣﺴﻠﻤﺎً ﺑﺎ اﺳﺘﻔﺎده از وﻳﺮاﻳﺸﮕﺮ ﻫﺎي ﻣﺘﻨﻲ ﺑﻪ آﻧﻬﺎ دﺳﺘﺮﺳﻲ ﻧﺨﻮاﻫﻴﺪ داﺷﺖ .ﺑﺮاي ﻣﺜﺎل اﻳﻦ ﻣﺤﻴﻂ ﻣﻲ ﺗﻮاﻧﺪ درﺳﺘﻲ ﻛﺪﻫﺎي ﻧﻮﺷﺘﻪ ﺷـﺪه را ﺑﺮرﺳـﻲ ﻛﻨـﺪ، ﻗﺴﻤﺘﻬﺎي ﺗﻤﺎم ﺷﺪه از ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺻﻮرت ﺑﺼﺮي ﻧﻤﺎﻳﺶ دﻫﺪ ،ﺧﻄﺎﻫﺎي ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ را ﺗﺸﺨﻴﺺ دﻫﺪ و ….
ﺻﻔﺤﻪ :Profile Setup ﻳﻚ ،IDEﻣﺤﻴﻄﻲ اﺳﺖ ﺷﺎﻣﻞ ﻳﻚ ﺳﺮي اﺑﺰار ﻛﻪ ﻣﻮﺟﺐ ﺳﻬﻮﻟﺖ ﻛﺎر ﺗﻮﺳﻌﻪ و ﻃﺮاﺣﻲ ﻧﺮم اﻓﺰار ﻣﻲ ﺷﻮد .وﻳﮋوال اﺳـﺘﻮدﻳﻮ 2005را اﺟﺮا ﻛﻨﻴﺪ ﺗﺎ ﺑﺒﻴﻨﻴﺪ ﺑﺎ ﭼﻪ ﭼﻴﺰي روﺑﺮو ﻣﻲ ﺷﻮﻳﺪ .اﮔﺮ ﺷﻤﺎ ﻣﺮاﺣﻞ ﭘﻴﺶ ﻓﺮض ﻧﺼﺐ را اﻧﺘﺨﺎب ﻛﺮده اﻳـﺪ ،ﺑـﻪ ﻣﻨـﻮي اﺳـﺘﺎرت ﺑﺮوﻳـﺪ و Allدر وﻳﻨــﺪوز XPﻳــﺎ وﻳﻨــﺪوز (2003ﺳــﭙﺲ از زﻳــﺮ ﻣﻨــﻮي Programsرا اﻧﺘﺨــﺎب ﻛﻨﻴــﺪ )Programs Microsoft Visual Studio 2005ﮔﺰﻳﻨـﻪ ي Microsoft Visual Studio 2005را اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺻﻔﺤﻪ آﻏﺎزﻳﻦ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ ﺑـﻪ ﺳـﺮﻋﺖ ﻧﻤـﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد و ﺑﻌـﺪ از آن ﭘﻨﺠـﺮه Choose Default Environment Settingsرا ﺧﻮاﻫﻴـﺪ دﻳـﺪ .از ﻟﻴـﺴﺖ ﻇـﺎﻫﺮ ﺷـﺪه ﮔﺰﻳﻨـﻪ Visual C# Development Settingsرا اﻧﺘﺨﺎب ﻛﺮده و روي Start Visual Studioﻛﻠﻴﻚ ﻛﻨﻴـﺪ .ﻣﺤـﻴﻂ ﺗﻮﺳﻌﻪ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 4-1ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
)Integrated Development Environment (IDE
1
٢٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 4-1
ﻣﻨﻮ: اﺣﺘﻤﺎﻻ اﺷﺘﻴﺎق زﻳﺎدي ﺑﺮاي ﺷﺮوع ﻛﺪ ﻧﻮﻳﺴﻲ دارﻳﺪ .اﻣﺎ در اﺑﺘﺪا ﺑﻬﺘﺮ اﺳﺖ ﻛﻤﻲ IDEرا ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .ﮔﺮدش ﺧﻮدﻣـﺎن را در IDE از ﻣﻨﻮ ﻫﺎ و ﻧﻮارﻫﺎي اﺑﺰار ﺷﺮوع ﻣﻲ ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺒﻴﻨﻴﺪ ،ﻣﻨﻮ ﻫﺎ و ﻧﻮار اﺑﺰارﻫﺎ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺰ ﺗﻔﺎوت ﭼﻨـﺪاﻧﻲ ﺑـﺎ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي دﻳﮕﺮ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ از ﻗﺒﻴﻞ Wordو ﻳﺎ Excelﻧﺪارد. ﻧﻮار ﻣﻨﻮي Visual Studio 2005ﺑﻪ ﺻﻮرت دﻳﻨﺎﻣﻴﻚ اﺳﺖ ،ﻳﻌﻨﻲ ﺑﺮ ﺣﺴﺐ ﻛﺎري ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ اﻧﺠﺎم دﻫﻴـﺪ ﻳـﻚ ﺳﺮي از ﮔﺰﻳﻨﻪ ﻫﺎ ﺑﻪ ﻣﻨﻮ اﺿﺎﻓﻪ ﺷﺪه و ﻳﺎ از آن ﺣﺬف ﻣﻲ ﺷﻮﻧﺪ .وﻗﺘﻲ ﻓﻘﻂ ﻣﺤﻴﻂ IDEﺧﺎﻟﻲ را در ﻣﻘﺎﺑﻞ ﺧﻮد دارﻳﺪ ،ﻣﻨـﻮي وﻳـﮋوال اﺳــﺘﻮدﻳﻮ ﺷــﺎﻣﻞ ﮔﺰﻳﻨــﻪ ﻫــﺎي Community ،Window ،Test ،Tools ،Data ،View ،Edit ،Fileو ﻣﻨﻮي Helpاﺳﺖ .اﻣﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎر ﺑﺮ روي ﻳﻚ ﭘﺮوژه را ﺷﺮوع ﻛﻨﻴﺪ ﻣﻨﻮي ﻛﺎﻣﻞ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ 2005ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ 5-1 ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 5-1 در اﻳﻨﺠﺎ ﺑﻪ ﺗﻮﺿﻴﺢ ﻛﺎﻣﻞ در ﻣﻮرد ﻫﻤﻪ ي ﻣﻨﻮ ﻫﺎ ﻧﻴﺎزي ﻧﺪارﻳﻢ .در ﻃﻮل اﻳﻦ ﻛﺘﺎب ﺑﻪ ﻣﺮور ﺑﺎ ﺗﻤﺎﻣﻲ آﻧﻬﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ .اﻣـﺎ در زﻳـﺮ ﺑﺮاي آﺷﻨﺎﻳﻲ اوﻟﻴﻪ ،ﺷﺮح ﻣﺨﺘﺼﺮي از ﻋﻤﻠﻜﺮد ﻫﺮ ﻳﻚ از ﻣﻨﻮ ﻫﺎ آورده ﺷﺪه اﺳﺖ:
٢٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
:Fileﺑﻪ ﻧﻈﺮ ﻣﻴﺮﺳﺪ ﻛﻪ ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻳﻚ ﻣﻨﻮي ﻓﺎﻳﻞ دارﻧﺪ .در اﻳﻦ ﻣﻨﻮ ﺣﺪاﻗﻞ ﭼﻴﺰي ﻛـﻪ ﭘﻴـﺪا ﻣﻴـﺸﻮد، راﻫﻲ ﺑﺮاي ﺧﺎرج ﺷﺪن از ﺑﺮﻧﺎﻣﻪ اﺳﺖ .اﻟﺒﺘﻪ در ﻣﻨﻮي Fileاﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﮔﺰﻳﻨﻪ ﻫﺎي ﺑﻴﺸﺘﺮي ﻣﺜﻞ ﺑـﺎز ﻛـﺮدن ،ﺑـﺴﺘﻦ ﻳـﺎ ذﺧﻴﺮه ﻛﺮدن ﻳﻚ ﻓﺎﻳﻞ ﺧﺎص و ﻳﺎ ﺗﻤﺎم ﭘﺮوژه ﻫﻢ وﺟﻮد دارد. :Editاﻳﻦ ﻣﻨﻮ ﻫﻢ ﻣﺜﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﺷﺎﻣﻞ ﮔﺰﻳﻨﻪ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ اﻧﺘﻈﺎر آن را دارﻳـﺪCut ،Redo ، Undo: Paste، Copy،و .Delete :Viewﻣﻨﻮي Viewﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﺎ ﺑﻪ ﺳﺮﻋﺖ ﺑﻪ ﭘﻨﺠﺮه ﻫﺎي ﻣﻮﺟﻮد در IDEﻣﺜـﻞ Solution ،Explorerﭘﻨﺠﺮه ،Propertiesﭘﻨﺠﺮه Toolbar ،Outputﻫﺎ و ...دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ. :Projectاﻳﻦ ﻣﻨﻮ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻴﺪﻫﺪ ﺗﺎ ﻓﺎﻳﻠﻬﺎي ﻣﺨﺘﻠﻒ از ﻗﺒﻴﻞ ﻓﺮﻣﻬﺎي ﺟﺪﻳﺪ و ﻳﺎ ﻛﻼﺳﻬﺎ را ﺑﻪ ﺑﺮﻧﺎﻣـﻪ ي ﺧـﻮد اﺿﺎﻓﻪ ﻛﻨﻴﺪ. :Buildاﻳﻦ ﻣﻨﻮ زﻣﺎﻧﻲ ﻣﻔﻴﺪ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد را ﺗﻤﺎم ﻛﻨﻴﺪ و ﺑﺨﻮاﻫﻴﺪ ﻛـﻪ آن را ﺑـﺪون اﺳـﺘﻔﺎده از ﻣﺤـﻴﻂ Visual C#اﺟﺮا ﻛﻨﻴﺪ )اﺣﺘﻤﺎﻻ از ﻃﺮﻳﻖ ﻣﻨﻮي اﺳﺘﺎرت ،ﻣﺜﻞ ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي دﻳﮕﺮ از ﻗﺒﻴﻞ Wordو ﻳﺎ (Excel :Debugاﻳﻦ ﻣﻨﻮ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻴﺪﻫﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﺧﻮدﺗﺎن را در داﺧﻞ ﻣﺤﻴﻂ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ ﺧـﻂ ﺑـﻪ ﺧـﻂ اﺟـﺮا ﻛﻨﻴـﺪ. ﻫﻤﭽﻨﻴﻦ از ﻃﺮﻳﻖ اﻳﻦ ﻣﻨﻮ ﺷﻤﺎ ﺑﻪ دﻳﺒﺎﮔﺮ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻧﻴﺰ دﺳﺘﺮﺳﻲ ﺧﻮاﻫﻴﺪ داﺷﺖ .ﺑﻪ وﺳﻴﻠﻪ دﻳﺒـﺎﮔﺮ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻋﻤﻠﻜﺮد ﻛﺪ ﺧﻮد را در ﻫﻨﮕﺎم اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﻂ ﺑﻪ ﺧﻂ ﺑﺮرﺳﻲ ﻛﺮده و ﻣﺸﻜﻼت آن را ﻣﺘﻮﺟﻪ ﺷﻮﻳﺪ. :Dataاﻳﻦ ﻣﻨﻮ ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ ﺗﺎ از اﻃﻼﻋﺎت ﺑﺪﺳﺖ آﻣﺪه از ﻳﻚ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﺳﺘﻔﺎده ﻛﻨﻴـﺪ .اﻟﺒﺘـﻪ اﻳـﻦ ﻣﻨـﻮ زﻣﺎﻧﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﻛﻪ در ﺣﺎل ﻛﺎر ﺑﺮ روي ﻗﺴﻤﺘﻬﺎي ﺑﺼﺮي ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﺑﺎﺷﻴﺪ ) در ﭘﻨﺠﺮه اﺻﻠﻲ وﻳﮋوال اﺳـﺘﻮدﻳﻮ، ﻗﺴﻤﺖ ] [Designﻓﻌﺎل ﺑﺎﺷﺪ( ،ﻧﻪ زﻣﺎﻧﻲ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻛﺪ ﻫﺴﺘﻴﺪ .در ﻓﺼﻮل 15و 16ﻛﺘﺎب ،ﻛﺎر ﺑـﺎ ﺑﺎﻧﻜﻬـﺎي اﻃﻼﻋﺎﺗﻲ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. :Formatاﻳﻦ ﻣﻨﻮ ﻧﻴﺰ ﻓﻘﻂ زﻣﺎﻧﻲ ﻛﻪ در ﺣﺎل ﻛﺎر ﺑﺎ ﻗﺴﻤﺖ ﻫﺎي ﺑﺼﺮي ﺑﺮﻧﺎﻣﻪ ﺑﺎﺷﻴﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺑـﻪ وﺳـﻴﻠﻪ ﮔﺰﻳﻨﻪ ﻫﺎي اﻳﻦ ﻣﻨﻮ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻃﺮﻳﻘﻪ ﻗﺮار ﮔﺮﻓﺘﻦ اﺷﻴﺎي ﻣﻮﺟﻮد در ﻓﺮم ﺑﺮﻧﺎﻣﻪ )از ﻗﺒﻴﻞ TextBoxﻫﺎ ،دﻛﻤﻪ ﻫﺎ و (...را ﻛﻨﺘﺮل ﻛﻨﻴﺪ. :Toolsدر اﻳﻦ ﻗﺴﻤﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺤﻴﻂ IDEوﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را ﻛﻨﺘﺮل و ﻳﺎ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﻟﻴﻨﻜـﻲ ﺑـﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي اﺿﺎﻓﻲ ﻧﺼﺐ ﺷﺪه در ﻛﻨﺎر وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﻴﺰ ،در اﻳﻦ ﻗﺴﻤﺖ وﺟﻮد دارد. :Testﻣﻨﻮي Testﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ اﻳﺠﺎد ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﻴﺪ ﺑﻌﺪ از اﺗﻤـﺎم ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ، ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ آن را از ﻧﻈﺮ ﻛﺎراﻳﻲ و ﻳﺎ ﻋﻤﻠﻜﺮد ﺑﺮرﺳﻲ ﻛﻨﻴﺪ. :Windowاﻳﻦ ﻣﻨﻮ در ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ اﻣﻜﺎن ﺑﺎز ﻛﺮدن ﺑﻴﺶ از ﻳﻚ ﭘﻨﺠﺮه در ﻫﺮ ﻟﺤﻈﻪ را ﺑﻪ ﻛﺎرﺑﺮ ﻣﻲ دﻫﻨﺪ ،ﻣﺜﻞ Wordو ﻳﺎ ،Excelﻧﻴﺰ وﺟﻮد دارد .ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻣﻨﻮ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﻨﺪ ﻛـﻪ در ﺑـﻴﻦ ﭘﻨﺠـﺮه ﻫـﺎي ﻣﻮﺟﻮد در IDEﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮﻳﺪ .ﻧﺎم ﭘﻨﺠﺮه ﻫﺎﻳﻲ ﻛﻪ در ﻫﺮ ﻟﺤﻈﻪ در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎز ﻫﺴﺘﻨﺪ ،در ﭘﺎﻳﻴﻦ ﻧﻮار اﺑـﺰار ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن روي ﻫﺮ ﻛﺪام از آﻧﻬﺎ ،ﭘﻨﺠﺮه ﻣﺮﺑﻮﻃﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. :Communityاﻳﻦ ﻣﻨﻮ ،دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻨﺎﺑﻊ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ،ﻣﻜﺎن ﻫﺎﻳﻲ ﺑﺮاي ﭘﺮﺳﻴﺪن ﺳﻮاﻻت و ﻧﻴﺰ ﺟﺴﺘﺠﻮ ﺑﻴﻦ ﻧﻤﻮﻧﻪ ﻛﺪﻫﺎ را در اﻳﻨﺘﺮﻧﺖ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ. :Helpﻣﻨﻮي Helpﺑﻪ ﺷﻤﺎ اﺟﺎزه دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺴﺘﻨﺪات وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را ﻣﻲ دﻫـﺪ .راه ﻫـﺎي زﻳـﺎدي ﺑـﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ اﻃﻼﻋﺎت وﺟﻮد دارﻧﺪ )ﺑﺮاي ﻣﺜﺎل از ﻃﺮﻳﻖ ﻣﺤﺘﻮﻳﺎت ،اﻧﺪﻳﺲ و ﻳﺎ ﺟﺴﺘﺠﻮ( .اﻳﻦ ﻣﻨﻮ ﻫﻤﭽﻨﻴﻦ داراي ﮔﺰﻳﻨـﻪ ﻫﺎﻳﻲ ﺑﺮاي وﺻﻞ ﺷﺪن ﺑﻪ وب ﺳﺎﻳﺖ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ،درﻳﺎﻓﺖ آﺧﺮﻳﻦ ﻧﺴﺨﻪ ﻫﺎي ﺑـﻪ روز رﺳـﺎﻧﻲ و ﻫﻤﭽﻨـﻴﻦ ﮔـﺰارش دادن ﻣﺸﻜﻼت ﺑﺮﻧﺎﻣﻪ اﺳﺖ.
٢٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻮار اﺑﺰارﻫﺎ: ﻧﻮار اﺑﺰارﻫﺎي زﻳﺎدي در IDEوﻳﮋوال اﺳﺘﻮدﻳﻮ وﺟﻮد دارﻧﺪ ،ﻣﺎﻧﻨﺪ Image Editor ،Formattingو ﻳـﺎ Text .Editorﺑﺮاي ﺣﺬف و ﻳﺎ اﺿﺎﻓﻪ اﻳﻦ ﻧﻮار اﺑﺰارﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﮔﺰﻳﻨﻪ Toolbarsدر ﻣﻨﻮي Viewاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻫﺮ ﻛـﺪام از اﻳﻦ ﻧﻮار اﺑﺰارﻫﺎ ،دﺳﺘﺮﺳﻲ ﺳﺮﻳﻊ ﺷﻤﺎ را ﺑﻪ ﻳﻚ دﺳﺘﻮر ﭘﺮﻛﺎرﺑﺮد ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .ﺑﺪﻳﻦ ﺻﻮرت ﻣﺠﺒﻮر ﻧﺨﻮاﻫﻴﺪ ﺑﻮد ﻛـﻪ ﻫـﺮ ﺑـﺎر ﺑـﺮاي اﺟﺮاي آن دﺳﺘﻮر ﻣﻨﻮ ﻫﺎ را زﻳﺮ و رو ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜـﺎل ،ﮔﺰﻳﻨـﻪ ي … File New Projectاز ﻧـﻮار ﻣﻨـﻮ ،ﺑـﻪ وﺳﻴﻠﻪ ي ﺳﻤﺖ ﭼﭗ ﺗﺮﻳﻦ آﻳﻜﻮن در ﻧﻮار اﺑﺰار ﭘﻴﺶ ﻓﺮض ﻛﻪ ﻧﻮار اﺑﺰار اﺳﺘﺎﻧﺪارد ﻧﻴﺰ ﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد )ﺷـﻜﻞ (1-6ﻧﻴـﺰ ﻗﺎﺑـﻞ دﺳﺘﺮﺳـﻲ اﺳﺖ.
ﺷﻜﻞ 6-1 ﻧﻮار اﺑﺰار اﺳﺘﺎﻧﺪارد ﺑﻪ ﭼﻨﺪ ﺑﺨﺶ ﻛﻪ ﺷﺎﻣﻞ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ ﻫﺴﺘﻨﺪ ﺗﻘﺴﻴﻢ ﺷﺪه اﺳﺖ .ﻫﺮ ﺑﺨﺶ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﺧﻂ ﻋﻤﻮدي از ﺑﺨﺸﻬﺎي دﻳﮕﺮ ﺗﻔﻜﻴﻚ ﺷﺪه اﺳﺖ .ﭘﻨﺞ آﻳﻜﻮن اول ،ﺷﺎﻣﻞ ﻛﺎرﻫﺎي ﻋﻤﻮﻣﻲ ﺑـﺮ روي ﻓﺎﻳـﻞ و ﻳـﺎ ﭘـﺮوژه ﻫـﺴﺘﻨﺪ ﻛـﻪ از ﻃﺮﻳـﻖ ﻣﻨـﻮي Fileو ﻳﺎ ﻣﻨﻮي Projectﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﻧﺪ ،ﻣﺎﻧﻨﺪ ﺑﺎز ﻛﺮدن و ﻳﺎ ذﺧﻴﺮه ﻛﺮدن ﻓﺎﻳﻠﻬﺎ. ﮔﺮوه ﺑﻌﺪي آﻳﻜﻮن ﻫﺎ ،ﺑﺮاي وﻳﺮاﻳﺶ اﺳﺘﻔﺎده ﻣﻴﺸﻮد ) Copy ،Cutو .(Pasteﮔﺮوه ﺑﻌﺪي ﻧﻴﺰ ﺑﺮاي ﻟﻐﻮ ﻛـﺮدن آﺧـﺮﻳﻦ ﻋﻤـﻞ اﻧﺠﺎم ﺷﺪه ،دوﺑﺎره اﻧﺠﺎم دادن آن و ﻳﺎ ﺟﺎ ﺑﻪ ﺟﺎ ﺷﺪن ﺑﻴﻦ ﻛﺪﻫﺎ اﺳﺖ. ﮔﺮوه ﭼﻬﺎرم از آﻳﻜﻮن ﻫﺎ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﺷﺮوع ﻛﻨﻴﺪ ) ﺑﻪ وﺳﻴﻠﻪ ﻣﺜﻠﺚ ﺳﺒﺰ رﻧﮓ( .در اﻳﻦ ﻗﺴﻤﺖ ﻫﻤﭽﻨﻴﻦ ﻣﻴﺘﻮاﻧﻴﺪ ﭘﻴﻜﺮ ﺑﻨﺪي ﺑﺮﻧﺎﻣﻪ ﺗﺎن را ﻣﺸﺨﺺ ﻛﺮده و ﻳﺎ ﻧﺤﻮه اﺟﺮاي آن را ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ. در ﺑﺨﺶ ﺑﻌﺪي ﻣﻴﺘﻮاﻧﻴﺪ ﻣﺘﻦ ﺧﺎﺻﻲ را در ﺑﻴﻦ ﻛﺪﻫﺎي ﻓﺎﻳﻠﻲ ﻛﻪ ﻫﻢ اﻛﻨﻮن ﺑﺎز اﺳﺖ ،در ﺑﻴﻦ ﻣﺴﺘﻨﺪات ﺑﺮﻧﺎﻣﻪ و ﻳﺎ در ﺑـﻴﻦ ﻛـﻞ ﭘـﺮوژه ﺟﺴﺘﺠﻮ ﻛﻨﻴﺪ. ﮔﺮوه آﺧﺮ از آﻳﻜﻮن ﻫﺎ دﺳﺘﺮﺳﻲ ﺳﺮﻳﻊ ﺷﻤﺎ را ﺑـﻪ ﻗـﺴﻤﺘﻬﺎي ﻣﺨﺘﻠـﻒ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ ﻣﺎﻧﻨـﺪ ،Solution Explorer ﭘﻨﺠﺮه Start Page ،Object Browser ،Toolbox ،Propertiesو ﻳﺎ ﺻﻔﺤﺎت دﻳﮕﺮ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ )در ﻗﺴﻤﺘﻬﺎي ﺑﻌﺪي ﺑﺎ اﻳﻦ ﭘﻨﺠﺮه ﻫﺎ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ( .اﮔﺮ ﻫﺮ ﻛﺪام از اﻳﻦ ﭘﻨﺠﺮه ﻫﺎ ﺑﺴﺘﻪ ﺷﺪه ﺑﺎﺷـﺪ ،ﺑـﺎ ﻛﻠﻴـﻚ ﺑـﺮ روي آﻳﻜﻮن آن در اﻳﻦ ﻗﺴﻤﺖ ،ﭘﻨﺠﺮه ﻣﻮرد ﻧﻈﺮ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ. ﻧﻜﺘﻪ :اﮔﺮ ﻓﺮاﻣﻮش ﻛﺮدﻳﺪ ﻛﻪ ﻫﺮ آﻳﻜﻮن ﭼﻪ ﻛﺎري اﻧﺠﺎم ﻣﻴﺪﻫﺪ ،اﺷﺎره ﮔﺮ ﻣﺎوس ﺧﻮد را ﺑﺮاي ﭼﻨﺪ ﻟﺤﻈﻪ ﺑﺮ روي آن ﻧﮕﻪ دارﻳﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻛﺎدري ﻇﺎﻫﺮ ﻣﻴﺸﻮد ﻛﻪ ﻧﺎم آﻳﻜﻮن ﻣﻮرد ﻧﻈﺮ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ. ﺑﺮاي دﻳﺪن ﺑﻘﻴﻪ ﭘﻨﺠﺮه ﻫﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻣﻨﻮي ،Viewﭘﻨﺠﺮه ﻣﻮرد ﻧﻈﺮﺗـﺎن را اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .اﻣـﺎ ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﻣﻴﺒﻴﻨﻴﺪ ،ﺑﻴﺸﺘﺮ آﻧﻬﺎ در ﺣﺎل ﺣﺎﻇﺮ ﺧﺎﻟﻲ ﻫﺴﺘﻨﺪ و ﻧﻤﻴﺘﻮان ﻋﻤﻠﻜﺮد آﻧﻬﺎ را ﻓﻬﻤﻴﺪ .ﺑﻬﺘﺮﻳﻦ راه ﻓﻬﻤﻴﺪن ﻛﺎرﺑﺮد اﻳﻦ ﻗﺴﻤﺘﻬﺎ ،ﻛﺎر ﻛـﺮدن ﺑـﺎ IDEو اﺳﺘﻔﺎده از اﻳﻦ ﻗﺴﻤﺘﻬﺎ در ﻃﻮل ﻧﻮﺷﺘﻦ ﻛﺪ ﺑﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﺳﺖ.
٢٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده: ﺑﺮاي اﺗﻤﺎم ﮔﺮدش در IDEوﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﺑﻬﺘﺮ اﺳﺖ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده ﺑـﺴﺎزﻳﻢ .ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ،در ﭘﻨﺠـﺮه ﻫـﺎي ﻗﺒﻠـﻲ ﻣﻘـﺪاري اﻃﻼﻋﺎت واﻗﻌﻲ و ﺟﺎﻟﺐ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ آﻧﻬﺎ را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .در ﺑﺨﺶ "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" زﻳﺮ ،ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﻼً ﺳﺎده ﺑﻪ ﻧﺎم HelloUserﺧﻮاﻫﻴﺪ ﺳﺎﺧﺖ ﻛﻪ در آن ﻛﺎرﺑﺮ ﻣﻴﺘﻮاﻧﺪ ﻧﺎم ﺧﻮد را در ﻳﻚ ﻛﺎدر ﻣﺘﻨﻲ وارد ﻛﻨﺪ .ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﭘﻴﻐﺎم ﺧﻮش آﻣـﺪ ﮔﻮﻳﻲ ﺑﻪ ﻛﺎرﺑﺮ ،ﺑﺎ ﻧﺎم او ،ﻧﻤﺎﻳﺶ ﺧﻮاﻫﺪ داد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﭘﺮوژه HelloUser (1ﺑﺮ روي دﻛﻤﻪ ي New Projectدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ. (2ﭘﻨﺠﺮه New Projectﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ .ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ ﻛﻪ در ﻗﺴﻤﺖ Project Typeدر ﺳـﻤﺖ ﭼـﭗ ،ﮔﺰﻳﻨـﻪ Visual C#اﻧﺘﺨـﺎب ﺷـﺪه ﺑﺎﺷـﺪ .ﺳـﭙﺲ در ﺑﺨـﺶ Templatesدر ﺳـﻤﺖ راﺳـﺖ ،ﮔﺰﻳﻨـﻪ Windows Applicationsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .در ﻛﺎدر Nameﻛﻠﻤﻪ Hello Userرا ﺗﺎﻳﭗ ﻛـﺮده و در اﻧﺘﻬﺎ روي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﭘﻨﺠﺮه New Projectﺷﻤﺎ ﺑﺎﻳﺪ ﭼﻴﺰي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 7-1ﺑﺎﺷﺪ.
ﺷﻜﻞ 7-1
٢٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن روي IDE ،OKوﻳﮋوال اﺳﺘﻮدﻳﻮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ﺧﺎﻟﻲ ﺑﺮاي ﺷﻤﺎ اﻳﺠﺎد ﻣﻴﻜﻨﺪ .در ﺣﺎل ﺣﺎﻇﺮ ،ﺑﺮﻧﺎﻣﻪ ي Hello Userﻓﻘﻂ داراي ﻳﻚ ﭘﻨﺠﺮه وﻳﻨﺪوزي ﺧﺎﻟﻲ اﺳﺖ ﻛﻪ ﻳﻚ ﻓﺮم وﻳﻨﺪوزي) 1ﻳﺎ ﺑﻪ اﺧﺘﺼﺎر ﻳﻚ ﻓﺮم( ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .ﻧﺎم ﭘﻴﺶ ﻓﺮض اﻳﻦ ﻓﺮم ،ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 8-1ﻧﺸﺎن داده ﺷﺪه اﺳﺖ Form1.cs ،اﺳﺖ. ﻧﻜﺘﻪ :ﻫﺮ زﻣﺎﻧﻲ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺨﻮاﻫﺪ ﻳﻚ ﻓﺎﻳﻞ ﺟﺪﻳﺪ را اﻳﺠﺎد ﻛﻨﺪ ،ﭼﻪ اﻳﻦ ﻓﺎﻳﻞ در ﻫﻨﮕﺎم ﺳﺎﺧﺘﻦ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد و ﭼﻪ ﺑﻌـﺪ ًا ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﻮد ،ﻧﺎﻣﻲ ﺑﻪ آن ﻓﺎﻳﻞ اﺧﺘﺼﺎص ﻣﻲ دﻫﺪ ﻛﻪ از دو ﻗﺴﻤﺖ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .ﻗﺴﻤﺖ اول ﻧﻮع ﻓﺎﻳـﻞ را ﺗﻮﺻـﻴﻒ ﻣـﻲ ﻛﻨﺪ و ﻗﺴﻤﺖ دوم ﻧﻴﺰ ﻳﻚ ﻋﺪد اﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﻳﻦ ﻓﺎﻳﻞ ،ﭼﻨﺪﻣﻴﻦ ﻓﺎﻳﻞ از اﻳﻦ ﻧﻮع اﺳﺖ.
ﭘﻨﺠﺮه ﻫﺎ در IDEوﻳﮋوال اﺳﺘﻮدﻳﻮ :2005 در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﭘﻨﺠﺮه ﻫﺎي زﻳﺎدي را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﻛﺎرﺑﺮد ﺧﺎﺻﻲ دارﻧﺪ .ﺑﻬﺘﺮ اﺳﺖ ﻗﺒﻞ از اداﻣـﻪ ي ﺑﺨـﺶ "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" ،ﺗﻌﺪادي از آﻧﻬﺎ را ﺑﻪ اﺧﺘﺼﺎر ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .ﻳﺎدآوري ﻣﻲ ﻛﻨﻢ ﻛﻪ اﮔﺮ ﻫﺮ ﻳﻚ از اﻳﻦ ﭘﻨﺠﺮه ﻫﺎ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ ﻧﻤـﺎﻳﺶ داده ﻧﻤﻲ ﺷﻮﻧﺪ ،از ﻣﻨﻮي Viewﮔﺰﻳﻨﻪ ﻣﺮﺑﻮط ﺑﻪ آن را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ آن ﭘﻨﺠﺮه دﻳﺪه ﺷﻮد .ﻫﻤﭽﻨﻴﻦ اﮔﺮ از ﻣﻜـﺎن ﻗﺮارﮔﻴـﺮي ﻳـﻚ ﭘﻨﺠﺮه ﺧﺎص راﺿﻲ ﻧﻴﺴﺘﻴﺪ ،ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﻧﻮار ﻋﻨﻮان ﭘﻨﺠﺮه )ﻧﻮار آﺑﻲ رﻧﮓ ﺑﺎﻻي ﭘﻨﺠﺮه ﻣﻮرد ﻧﻈﺮ( و ﻛﺸﻴﺪن آن ﺑﻪ ﻣﻜـﺎن ﺟﺪﻳـﺪ، ﺟﺎي آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﭘﻨﺠﺮه ﻫﺎ ﻣﻴﺘﻮاﻧﻨﺪ درون IDEﺷﻨﺎور ﺑﺎﺷﻨﺪ و ﻳﺎ ﺑﻪ ﻳﻜﻲ از ﻟﺒﻪ ﻫﺎ وﺻﻞ ﺷﻮﻧﺪ)ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ .(8-1ﻟﻴﺴﺖ زﻳـﺮ ﻋﻤﻮﻣﻲ ﺗﺮﻳﻦ ﭘﻨﺠﺮه ﻫﺎ را ﻣﻌﺮﻓﻲ ﻣﻴﻜﻨﺪ.
:Server Explorerاﻳﻦ ﭘﻨﺠﺮه دﺳﺘﺮﺳﻲ ﺷﻤﺎ را ﺑﻪ ﺳﺮورﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳـﻒ ﻛـﺮده اﻳﺪ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ اﺗﺼﺎﻻت ﺟﺪﻳﺪي را ﺑﻪ اﻳـﻦ ﺳـﺮورﻫﺎ اﻳﺠـﺎد ﻛﻨﻴـﺪ و ﻳـﺎ اﻃﻼﻋـﺎت ﻣﻮﺟـﻮد در ﺑﺎﻧﻜﻬﺎي اﻃﻼﻋﺎﺗﻲ ﻛﻨﻮﻧﻲ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .در ﺗﺼﻮﻳﺮ ،8-1ﭘﻨﺠﺮه ،Server Explorerﺗﺐ 2ﻣﻮﺟـﻮد در زﻳـﺮ ﭘﻨﺠﺮه Toolboxاﺳﺖ. :Toolboxاﻳﻦ ﭘﻨﺠﺮه ﺷﺎﻣﻞ ﻛﻨﺘﺮل ﻫﺎ و ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺧﻮد اﺿﺎﻓﻪ ﻛﺮده و ﺑﺎ اﺳﺘﻔﺎده از آن ﭘﻨﺠﺮه ي ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد را ﻃﺮاﺣﻲ ﻛﻨﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺷﺎﻣﻞ ﻛﻨﺘﺮﻟﻬﺎي ﻋﻤﻮﻣﻲ ﻣﺎﻧﻨﺪ دﻛﻤﻪ ﻫﺎ ﻳﺎ اﺗـﺼﺎل دﻫﻨـﺪه ﻫـﺎي داده اي ،ﻛﻨﺘﺮﻟﻬﺎي ﺧﺮﻳﺪاري ﺷﺪه و ﻳﺎ ﻛﻨﺘﺮل ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺧﻮدﺗﺎن ﻃﺮاﺣﻲ ﻛﺮده اﻳﺪ. :Design Windowاﻳﻦ ﻗﺴﻤﺖ ،ﺑﺨﺸﻲ اﺳﺖ ﻛﻪ ﺑﻴﺸﺘﺮﻳﻦ ﻓﻌﺎﻟﻴﺘﻬﺎ در آن ﺻﻮرت ﻣﻴﮕﻴﺮد .در اﻳﻦ ﺑﺨﺶ ﺷﻤﺎ راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ ﺗﺎن را ﺑﺮ روي ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻃﺮاﺣﻲ ﻣﻲ ﻛﻨﻴﺪ .اﻳﻦ ﭘﻨﺠﺮه در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ Designerﻫـﻢ ﻧﺎﻣﻴـﺪه ﻣـﻲ ﺷﻮد. 3 :Solution Explorerاﻳﻦ ﭘﻨﺠﺮه ﻳﻚ ﻧﻤﺎي درﺧﺘﻲ از راه ﺣﻞ ﺷﻤﺎ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﻳﻚ راه ﺣﻞ ﻣﻲ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﭘﺮوژه ﺑﺎﺷﺪ ،ﻛﻪ ﻫﺮ ﻳﻚ از اﻳﻦ ﭘﺮوژه ﻫﺎ ﺧﻮد ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺷﺎﻣﻞ ﻓـﺮم ﻫـﺎ ،ﻛﻼﺳـﻬﺎ ،ﻣـﺎژول ﻫـﺎ ،و ﻳـﺎ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎﻳﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻳﻚ ﻣﺴﺌﻠﻪ ﺧﺎص را ﺣﻞ ﻣﻲ ﻛﻨﺪ .در ﻓﺼﻞ دوم ﺑﻴﺸﺘﺮ در ﻣﻮرد ﻳﻚ راه ﺣﻞ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. :Propertiesﭘﻨﺠﺮه Propertiesﺧﺎﺻﻴﺘﻬﺎي ﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ ﺷﻴﺊ اﻧﺘﺨﺎب ﺷﺪه را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫـﺪ .اﮔﺮﭼـﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﺧﺎﺻﻴﺖ ﻫﺎ را از ﻃﺮﻳﻖ ﻛﺪ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ،اﻣﺎ در ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ﺗﻨﻈﻴﻢ ﻛﺮدن آﻧﻬﺎ در زﻣﺎن ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ راﺣﺖ ﺗﺮ اﺳﺖ )ﺑﺮاي ﻣﺜﺎل ،ﻣﻮﻗـﻊ ﻗـﺮار دادن ﻛﻨﺘـﺮل ﻫـﺎ در ﻓـﺮم( .دﻗـﺖ ﻛﻨﻴـﺪ ﻛـﻪ ﺧﺎﺻـﻴﺖ File Nameداراي ﻣﻘـﺪار Form1.csاﺳﺖ .اﻳﻦ ﻧﺎم ،ﻧﺎم ﻓﻴﺰﻳﻜﻲ ﻓﺎﻳﻞ ﺣﺎوي ﻛﺪﻫﺎي ﻓﺮم و اﻃﻼﻋﺎت ﻇﺎﻫﺮي آن اﺳﺖ. 1
Windows Form - WinForm Tab 3 Solution 2
٢٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 8-1
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺳﺎﺧﺘﻦ ﭘﺮوژه Hello User (1اﺑﺘﺪا ﻧﺎم ﻓﺮم ﺧﻮد را ﺑﻪ ﭼﻴﺰي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﺑﻴﺸﺘﺮ ﻣﻌـﺮف ﺑﺮﻧﺎﻣـﻪ ﺷـﻤﺎ ﺑﺎﺷـﺪ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر روي Form1.csدر Solution Explorerﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺳﭙﺲ ،در ﭘﻨﺠﺮه Propertiesﺧﺎﺻـﻴﺖ File Name را از Form1.csﺑﻪ HelloUser.csﺗﻐﻴﻴﺮ داده )ﺷﻜﻞ (9-1و Enterرا ﻓﺸﺎر دﻫﻴﺪ .ﺑﻌﺪ از ﺗﻐﻴﻴـﺮ ﻫـﺮ ﺧﺎﺻﻴﺖ در ﭘﻨﺠﺮه ،Propertiesﺑﺮاي اﻋﻤﺎل آن ﺑﺎﻳﺪ ﻛﻠﻴﺪ Enterرا ﻓﺸﺎر دﻫﻴﺪ و ﻳﺎ در ﺟﺎﻳﻲ ﺧﺎرج از ﭘﻨﺠـﺮه ﻛﻠﻴﻚ ﻛﻨﻴﺪ. (2ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ اﺳﻢ ﻓﺎﻳﻞ در ﭘﻨﺠﺮه Solution Explorerﻫﻢ ﺑﻪ HelloUser.csﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ. (3ﺣﺎﻻ روي ﻓﺮﻣﻲ ﻛﻪ در ﭘﻨﺠﺮه ي Designﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﭘﻨﺠـﺮه Propertiesﺗﻐﻴﻴـﺮ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي Formاﻧﺘﺨﺎب ﺷﺪه را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ )ﺑﻪ ﺟﺎي ﺧﺎﺻﻴﺘﻬﺎي ﻓﺎﻳﻞ HelloUser.csﻛـﻪ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ در ﺣﺎل ﻧﻤﺎﻳﺶ آن ﺑﻮد( .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻗﺴﻤﺖ ﻛﺎﻣﻼً ﻣﺘﻔﺎوت ﺑـﺎ ﻗـﺴﻤﺖ ﻗﺒﻠـﻲ اﺳـﺖ. ﺗﻔﺎوﺗﻲ ﻛﻪ در اﻳﻦ ﺟﺎ وﺟﻮد دارد ﺑﻪ ﻋﻠﺖ دو ﻧﮕﺎه ﻣﺘﻔﺎوت ﺑﻪ ﻳﻚ ﻓﺎﻳﻞ اﺳﺖ .زﻣـﺎﻧﻲ ﻛـﻪ ﻧـﺎم ﻓـﺮم در Solution Explorerاﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ،ﺧﺎﺻﻴﺘﻬﺎي ﻣﺮﺑﻮط ﺑﻪ ﻓﺎﻳﻞ ﻓﻴﺰﻳﻜﻲ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷـﻮد .اﻣـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻓـﺮم ﻣﻮﺟﻮد در ﺑﺨﺶ Designerاﻧﺘﺨﺎب ﺷﻮد ،ﺧﺎﺻﻴﺘﻬﺎي ﻣﻨﻄﻘﻲ و ﺑﺼﺮي ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
٢٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 9-1 ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه Propertiesﻣﻴﺘﻮاﻧﻴﺪ ﺧﺎﺻﻴﺘﻬﺎي ﻳﻚ ﻛﻨﺘـﺮل را ﺑـﻪ راﺣﺘـﻲ ﺗﻐﻴﻴـﺮ دﻫﻴـﺪ .ﺧﺎﺻـﻴﺖ ﻫـﺎ ﻳـﻚ ﻣﺠﻤﻮﻋﻪ ي وﻳﮋه ،داﺧﻞ اﺷﻴﺎ ﻫﺴﺘﻨﺪ .آﻧﻬﺎ ﻣﻌﻤﻮﻻ رﻓﺘﺎر ﻳﺎ ﻇﺎﻫﺮ ﻳﻚ ﺷﻴﺊ را ﺗﻮﺻﻴﻒ ﻣﻲ ﻛﻨﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 10-1 ﻣﻲ ﺑﻴﻨﻴﺪ ﺧﺎﺻﻴﺖ ﻫﺎ در ﮔﺮوه ﻫﺎي ﻣﺨﺘﻠﻒ ﻗﺮار ﻣﻴﮕﻴﺮﻧﺪ ﻛﻪ ﻋﺒﺎرﺗﻨـﺪ از)Accessibility :ﻧﻤـﺎﻳﺶ داده ﻧـﺸﺪه اﺳﺖ()Appearance ،ﻧﺎم اﻳﻦ ﮔﺮوه ﻧﻴﺰ در ﺷﻜﻞ ﻣـﺸﺨﺺ ﻧﻴـﺴﺖ(،Design ،Data ،Behavior ، )Focusﻧﻤــﺎﻳﺶ داده ﻧــﺸﺪه اﺳــﺖ()Layout ،ﻧﻤــﺎﻳﺶ داده ﻧــﺸﺪه اﺳــﺖ()Misc ،ﻧﻤــﺎﻳﺶ داده ﻧــﺸﺪه اﺳــﺖ( و )Window-Styleﻧﻤﺎﻳﺶ داده ﻧﺸﺪه اﺳﺖ(. ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺨﺺ اﺳﺖ ،ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﺧﺎﺻﻴﺖ ﻧﺎم ﻓﺎﻳﻞ ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم را ﺑﻪ Hello Userﺗﻐﻴﻴﺮ داده اﻳﻢ، اﻣﺎ ﻋﻨﻮان ﻓﺮم ﻫﻤﭽﻨﺎن Form1اﺳﺖ. (4در ﺣﺎل ﺣﺎﻇﺮ ،ﻋﻨﻮان اﻳﻦ ﻓﺮم Form1اﺳﺖ .اﻳﻦ ﻋﻨﻮان ﻛﺎرﺑﺮد ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺨﺺ ﻧﻤﻲ ﻛﻨﺪ .ﭘﺲ آن را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫـﻴﻢ ﺗﺎ ﺑﻴﺸﺘﺮ ﻣﻌﺮف ﺑﺮﻧﺎﻣﻪ ﺑﺎﺷﺪ .ﺧﺎﺻﻴﺖ Textرا در ﺑﺨﺶ Appearanceدر ﭘﻨﺠﺮه Propertiesاﻧﺘﺨﺎب ﻛﺮده و ﻣﻘﺪار آن را ﺑﻪ Hello From Visual C# 2005ﺗﻐﻴﻴﺮ داده ،ﺳﭙﺲ Enterرا ﻓﺸﺎر دﻫﻴﺪ. ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻋﻨﻮان ﻓﺮم در ﺑﺨﺶ Designerﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪاري ﻣﻲ ﺷﻮد ﻛﻪ در ﻛﺎدر ﻣﺮﺑﻮﻃﻪ وارد ﻛﺮده اﻳﺪ. اﮔﺮ ﭘﻴﺪا ﻛﺮدن ﺧﺎﺻﻴﺖ ﻣﻮرد ﻧﻈﺮﺗﺎن از ﻟﻴﺴﺖ در ﺣﺎﻟﺖ ﮔﺮوه ﺑﻨﺪي ﺷﺪه ﻣﺸﻜﻞ اﺳـﺖ ،ﺑـﺮ روي ﮔﺰﻳﻨـﻪ AZدر ﻧـﻮار اﺑـﺰار ﺑﺎﻻي ﭘﻨﺠﺮه Propertiesﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻟﻴﺴﺖ ﺧﺎﺻﻴﺖ ﻫﺎ ﺑﻪ ﺻﻮرت اﻟﻔﺒﺎﻳﻲ ﻣﺮﺗﺐ ﻣﻲ ﺷﻮﻧﺪ. (5ﺑﺮ روي دﻛﻤﻪ Startدر ﻧﻮار اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻛﻠﻴﻚ ﻛﻨﻴﺪ )ﻣﺜﻠﺚ ﺳﺒﺰ رﻧﮓ( ﺗﺎ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد .در ﻃﻮل اﻳﻦ ﻛﺘﺎب ﻫﺮ ﺟﺎ ﻋﺒﺎرﺗﻬﺎي "ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ" و ﻳﺎ "ﺑﺮﻧﺎﻣﻪ را ﺷﺮوع ﻛﻨﻴﺪ" دﻳﺪﻳﺪ ،روي ﻛﻠﻴﺪ Startﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻌﺪ از ﻛﻠﻴﻚ روي اﻳﻦ دﻛﻤﻪ ،ﻳﻚ ﭘﻨﺠﺮه ﺧﺎﻟﻲ ﺑﺎ ﻋﻨﻮان Hello From Visual C# 2005ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
٣٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 10-1 ﺧﻴﻠﻲ راﺣﺖ ﺑﻮد ،اﻣﺎ ﺑﺮﻧﺎﻣﻪ ﻛﻮﭼﻚ ﺷﻤﺎ ﻛﺎري اﻧﺠﺎم ﻧﻤﻲ دﻫﺪ .اﺟﺎزه ﺑﺪﻫﻴﺪ ﻣﻘﺪاري ﺑﺮﻧﺎﻣﻪ را ﻣﺤﺎوره اي ﺗﺮ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛـﺎر، ﺑﺎﻳﺪ ﺗﻌﺪادي ﻛﻨﺘﺮل ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﻢ ،دو دﻛﻤﻪ ،ﻳﻚ ﻟﻴﺒﻞ و ﻳﻚ ﻛﺎدر ﻣﺘﻨﻲ .ﺑﻪ زودي ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛـﻪ اﺿـﺎﻓﻪ ﻛـﺮدن اﻳﻨﻬـﺎ ﺑـﺎ اﺳﺘﻔﺎده از Toolboxﭼﻪ ﻗﺪر راﺣﺖ اﺳﺖ .ﻳﻜﻲ از ﻣﺰﻳﺖ ﻫﺎي Visual C#اﻳﻦ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﻣﻘﺪار زﻳـﺎدي از ﺑﺮﻧﺎﻣﻪ ﺧﻮدﺗﺎن را ﻃﺮاﺣﻲ ﻛﻨﻴﺪ ﺑﺪون اﻳﻨﻜﻪ ﻛﺪي ﺑﻨﻮﻳﺴﻴﺪ .اﻟﺒﺘﻪ ﺑﺮاي آﻧﻬﺎ ﻛﺪ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد ،اﻣﺎ اﻳﻦ ﻛﺪ دور از دﻳﺪ ﺷﻤﺎ اﺳﺖ و وﻳﮋوال C#آﻧﻬﺎ را ﺑﺮاي ﺷﻤﺎ ﻣﻲ ﻧﻮﻳﺴﺪ.
ﺟﻌﺒﻪ اﺑﺰار: ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺟﻌﺒﻪ اﺑﺰار ﺳﻪ راه وﺟﻮد دارد: .1از ﻣﻨﻮي Viewﮔﺰﻳﻨﻪ Toolboxرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. .2از ﻧﻮار اﺑﺰار اﺳﺘﺎﻧﺪارد آﻳﻜﻮن ﻣﺮﺑﻮط ﺑﻪ آن را اﻧﺘﺨﺎب ﻛﻨﻴﺪ. .3ﻛﻠﻴﺪﻫﺎي Ctrl+Alt+Xرا ﻓﺸﺎر دﻫﻴﺪ.
٣١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﺟﻌﺒﻪ اﺑﺰار در ﻗﺴﻤﺖ ﭼﭗ IDEﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد .ﺟﻌﺒﻪ اﺑﺰار ﺷﺎﻣﻞ ﻛﻨﺘﺮل ﻫﺎ و ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫـﺎﻳﻲ ﻣـﻲ ﺷـﻮد ﻛـﻪ ﻣـﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ روي ﻓﺮم ﺧﻮد ﻗﺮار دﻫﻴﺪ .ﻛﻨﺘﺮل ﻫﺎ ﻣﺎﻧﻨﺪ دﻛﻤﻪ ﻫﺎ ،ﻛﺎدر ﻫﺎي ﻣﺘﻨﻲ ،دﻛﻤﻪ ﻫﺎي رادﻳﻮﻳﻲ و ﻳﺎ ﻟﻴﺴﺖ ﻫﺎي ﺗﺮﻛﻴﺒﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ از ﺟﻌﺒﻪ اﺑﺰار اﻧﺘﺨﺎب ﺷﻮﻧﺪ و روي ﻓﺮم ﻗﺮار ﮔﻴﺮﻧـﺪ .ﺑـﺮاي ﺑﺮﻧﺎﻣـﻪ HelloUserﺷـﻤﺎ ﻓﻘـﻂ از ﻛﻨﺘﺮﻟﻬـﺎي ﻗـﺴﻤﺖ Common Controlsدر ﺟﻌﺒﻪ اﺑﺰار اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ .در ﺷﻜﻞ 11-1ﻣﻲ ﺗﻮاﻧﻴﺪ ﻟﻴﺴﺘﻲ از ﻛﻨﺘﺮﻟﻬﺎي ﻋﻤﻮﻣﻲ ﺑـﺮاي ﻓﺮﻣﻬـﺎي وﻳﻨـﺪوزي را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ. ﻛﻨﺘﺮل ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻫﺮ ﺗﺮﺗﻴﺒﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ ﻣﻮرد ﻛﻪ ﺷﻤﺎ دﻛﻤﻪ ﻫﺎ را ﻗﺒﻞ از ﻛﺎدرﻫـﺎي ﻣﺘﻨـﻲ ﺑـﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ و ﻳﺎ ﻟﻴﺒﻞ ﻫﺎ را ﻗﺒﻞ از دﻛﻤﻪ ﻫﺎ رﺳﻢ ﻛﻨﻴﺪ اﻫﻤﻴﺘﻲ ﻧﺪارد .در "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" ﺑﻌﺪي ،ﻗﺮار دادن ﻛﻨﺘـﺮل ﻫـﺎ ﺑـﺮ روي ﻓﺮم را ﺷﺮوع ﻣﻲ ﻛﻨﻴﻢ.
ﺷﻜﻞ 11-1
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ي HelloUser (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻫﻢ اﻛﻨﻮن در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ ،زﻳﺮا ﺑﺎﻳﺪ ﺗﻌﺪادي ﻛﻨﺘﺮل ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴـﺪ .ﺑﻬﺘـﺮﻳﻦ راه ﺑـﺮاي ﺑﺴﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﺮدن روي دﻛﻤﻪ ي Xدر ﺳﻤﺖ راﺳﺖ ﻧﻮار ﻋﻨﻮان اﺳﺖ.ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ روي ﻣﺮﺑﻊ آﺑﻲ رﻧﮓ در IDEﻛﻠﻴﻚ ﻛﻨﻴﺪ )اﮔﺮ اﺷﺎره ﮔﺮ ﻣﺎوس ﺧﻮد را ﺑﺮ روي آن ﻧﮕﻪ دارﻳﺪ ﻋﺒـﺎرت " "Stop Debuggingدر ﻛـﺎدر زرد ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد(. (2ﻳﻚ ﻛﻨﺘﺮل ﻟﻴﺒﻞ ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ،در ﺟﻌﺒﻪ اﺑﺰار روي ﻛﻨﺘﺮل Labelﻛﻠﻴﻚ ﻛﻨﻴﺪ و آن را ﺗﺎ ﻣﺤﻞ ﻣﻮرد ﻧﻈﺮﺗﺎن ﺑﺮ روي ﻓﺮم ﺑﻜﺸﻴﺪ و ﺳﭙﺲ آن را رﻫﺎ ﻛﻨﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﻗﺮار دادن ﻳﻚ ﻛﻨﺘﺮل روي ﻓﺮم ﻣﻴﺘﻮاﻧﻴﺪ ﺑﺮ روي آﻳﻜﻮن آن در ﺟﻌﺒﻪ اﺑﺰار دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
٣٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3اﮔﺮ ﻛﻨﺘﺮل ﻟﻴﺒﻠﻲ ﻛﻪ ﺑﺮ روي ﻓﺮم ﻗﺮار داده اﻳﺪ در ﻣﻜﺎن ﻣﻨﺎﺳﺒﻲ ﻗﺮار ﻧﮕﺮﻓﺘﻪ اﺳﺖ ،ﻣﺸﻜﻠﻲ ﻧﻴﺴﺖ .ﻫﻨﮕﺎﻣﻲ ﻛـﻪ ﻛﻨﺘﺮﻟـﻲ ﺑـﺮ روي ﻓﺮم ﻗﺮار ﻣﻲ ﮔﻴﺮد ،ﻣﻴﺘﻮاﻧﻴﺪ آن را ﺟﺎ ﺑﻪ ﺟﺎ ﻛﻨﻴﺪ و ﻳﺎ اﻧﺪازه آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺷﻜﻞ 12-1ﻓـﺮم ﺑﺮﻧﺎﻣـﻪ را ﺑﻌـﺪ از ﻗـﺮار دادن ﻛﻨﺘﺮل ﺑﺮ روي آن ﻧﺸﺎن ﻣﻴﺪﻫﺪ .ﺑﺮاي ﺣﺮﻛﺖ دادن ﻛﻨﺘﺮل روي ﻓﺮم ،ﺑﺮ روي ﻧﺎﺣﻴﻪ ﻧﻘﻄﻪ ﭼﻴﻦ در ﻓﺮم ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ و آن را ﺑﻪ ﻣﻜﺎن ﻣﻮرد ﻧﻈﺮﺗﺎن ﺑﻜﺸﻴﺪ .از ﻧﻈﺮ اﻧﺪازه ﻫﻢ ،ﻛﻨﺘﺮل ﻟﻴﺒﻞ ﺧﻮد را ﺑﺎ ﻣﺘﻨﻲ ﻛﻪ درون آن وارد ﻣـﻲ ﻛﻨﻴـﺪ ﻫـﻢ اﻧـﺪازه ﻣﻴﻜﻨﺪ .ﭘﺲ ﺧﻴﺎﻟﺘﺎن ﻣﻲ ﺗﻮاﻧﺪ از اﻳﻦ ﻧﻈﺮ راﺣﺖ ﺑﺎﺷﺪ. (4ﺑﻌﺪ از رﺳﻢ ﻳﻚ ﻛﻨﺘﺮل ﺑﺮ روي ﻓﺮم ،ﺣﺪاﻗﻞ ﺑﺎﻳﺪ ﻧﺎم و ﻣﺘﻨﻲ ﻛـﻪ ﻧﻤـﺎﻳﺶ ﻣـﻲ دﻫـﺪ را اﺻـﻼح ﻛﻨﻴـﺪ .ﺑـﺎ اﻧﺘﺨـﺎب ﻛﻨﺘـﺮل Labelﺑـﺮ روي ﻓــﺮم ،ﻣــﺸﺎﻫﺪه ﺧﻮاﻫﻴــﺪ ﻛــﺮد ﻛــﻪ ﭘﻨﺠــﺮه Propertiesدر ﺳــﻤﺖ ﭼــﭗ ،Designer ﺧﺎﺻــﻴﺘﻬﺎي Label1را ﻧﻤــﺎﻳﺶ ﻣــﻲ دﻫــﺪ .در ﭘﻨﺠــﺮه Propertiesﺧﺎﺻــﻴﺖ Textاﻳــﻦ ﻛﻨﺘــﺮل را ﺑــﻪ Enter Your Nameﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺑﺎ ﻓﺸﺎر ﻛﻠﻴﺪ Enterو ﻳﺎ ﻛﻠﻴﻚ در ﺧﺎرج از ﺧﺎﺻﻴﺖ ﻣﻮرد ﻧﻈﺮ ،اﻧﺪازه ﻟﻴﺒﻞ ﺑﻪ ﺻـﻮرﺗﻲ ﺗﻐﻴﻴـﺮ ﻣﻴﻜﻨـﺪ ﺗـﺎ ﻣـﺘﻦ ﺷـﻤﺎ را در ﺧـﻮد ﺟـﺎي دﻫـﺪ .ﺣـﺎﻻ ،ﺧﺎﺻـﻴﺖ Nameﻛﻨﺘـﺮل را ﺑـﻪ lblNameﺗﻐﻴﻴﺮ دﻫﻴﺪ.
ﺷﻜﻞ 12-1 (5ﺣﺎﻻ ،دﻗﻴﻘﺎ زﻳﺮ ﻛﻨﺘﺮل ،Labelﻳﻚ ﻛﻨﺘﺮل TextBoxﻗﺮار دﻫﻴﺪ ﺗﺎ در آن ﺑﺘﻮاﻧﻴﺪ ﻧـﺎم را وارد ﻛﻨﻴـﺪ .ﺑـﺮاي اﺿـﺎﻓﻪ ﻛﺮدن ﻳﻚ TextBoxﺑﻪ ﻓﺮم ﻫﻤﺎﻧﻨﺪ ﻟﻴﺒﻞ ﻋﻤﻞ ﻛﻨﻴﺪ ،اﻣﺎ در اﻳﻦ ﺑﺎر ﺑﻪ ﺟﺎي ﻟﻴﺒﻞ ،ﻛﻨﺘـﺮل TextBoxرا از ﺟﻌﺒـﻪ اﺑﺰار اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ TextBoxرا در ﺟﺎي ﺧﻮد ﺑﺮ روي ﻓﺮم ﻗﺮار دادﻳﺪ )ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ (13-1ﺑـﺎ اﺳـﺘﻔﺎده از ﭘﻨﺠﺮه Propertiesﺧﺎﺻﻴﺖ Nameآن را ﺑﻪ txtNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﻪ دﺳﺘﮕﻴﺮه ﻫﺎي ﺗﻨﻈﻴﻢ اﻧﺪازه در ﺳﻤﺖ ﭼﭗ و راﺳﺖ ﻛﻨﺘﺮل ﺗﻮﺟﻪ ﻛﻨﻴﺪ .ﺑﻪ وﺳﻴﻠﻪ آﻧﻬﺎ ،ﻣﻴﺘﻮاﻧﻴﺪ اﻧﺪازه اﻓﻘﻲ ﻛﻨﺘﺮل را ﺗﻐﻴﻴـﺮ دﻫﻴﺪ.
٣٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 13-1 (6در ﺳﻤﺖ ﭼﭗ ﭘﺎﻳﻴﻦ ﻓﺮم ،ﺑﻪ ﻫﻤﺎن ﺻﻮرت ﻛﻪ Labelو ﻳﺎ TextBoxرا ﺑـﺮ روي ﻓـﺮم ﻗـﺮار دادﻳـﺪ ،ﻳـﻚ ﻛﻨﺘـﺮل Buttonﻫﻢ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺖ Nameآن را ﺑـﻪ btnOKو ﺧﺎﺻـﻴﺖ Textآن را ﺑـﻪ &OKﺗﻐﻴﻴـﺮ ﻫﻴﺪ .ﻓﺮم ﺷﻤﺎ ﻫﻢ اﻛﻨﻮن ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 14-1ﺑﺎﺷﺪ. ﻛﺎراﻛﺘﺮ & ﻛﻪ در ﺧﺎﺻﻴﺖ Textدﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ،ﺑﺮاي اﻳﺠﺎد ﺷـﻮرت ﻛـﺎت ﺑـﺮاي آن دﻛﻤـﻪ اﺳـﺖ. ﺣﺮﻓﻲ ﻛﻪ ﻛﺎراﻛﺘﺮ & ﻗﺒﻞ از آن ﻗﺮار ﻣﻲ ﮔﻴﺮد ،ﺑﻪ ﺻﻮرت زﻳﺮ ﺧـﻂ دار ﻧﻤـﺎﻳﺶ داده ﻣﻴـﺸﻮد)ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ .(14-1ﺑـﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻛﺎرﺑﺮ ﻣﻴﺘﻮاﻧﺪ ﺑﻪ ﺟﺎي ﻛﻠﻴﻚ ﻛﺮدن ﺑﺎ ﻣﺎوس ﺑﺮ روي دﻛﻤﻪ ،ﺑﺎ ﻓﺸﺎر ﻛﻠﻴﺪ Altو ﺣﺮف ﻣﺸﺨﺺ ﺷـﺪه ﻛﻠﻴـﺪ ﻣـﻮرد ﻧﻈﺮ را اﻧﺘﺨﺎب ﻛﻨﺪ )در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ،ﺗﺎ ﻛﺎرﺑﺮ ﻛﻠﻴﺪ Altرا ﻓﺸﺎر ﻧﺪﻫﺪ ،ﺣﺮوف ﻣﻮرد ﻧﻈﺮ زﻳﺮ ﺧﻂ دار ﻧﻤـﻲ ﺷـﻮﻧﺪ( .ﺑـﺮاي ﻣﺜﺎل ،در اﻳﻦ ﺟﺎ ﻓﺸﺎر دادن ﻛﻠﻴﺪ Alt + Oﻫﻤﺎﻧﻨﺪ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي دﻛﻤﻪ OKاﺳﺖ .ﺑﺮاي اﻧﺠﺎم دادن اﻳﻦ ﻛـﺎر ﻻزم ﻧﻴﺴﺖ ﻛﻪ ﺷﻤﺎ ﻛﺪي را وارد ﻛﻨﻴﺪ. (7ﺣﺎﻻ دﻛﻤﻪ دوم را ﻫﻤﺎﻧﻨﺪ دﻛﻤﻪ اول ،ﺑﺎ ﻛﺸﻴﺪن از ﺟﻌﺒﻪ اﺑﺰار و رﻫﺎ ﻛﺮدن ﺑﺮ روي ﻓﺮم ،در ﮔﻮﺷﻪ ﺳـﻤﺖ راﺳـﺖ ﭘـﺎﻳﻴﻦ ﻓـﺮم ﻗﺮار دﻫﻴﺪ .دﻗﺖ ﻛﻨﻴﺪ ،ﺑﻪ ﻣﺤﺾ اﻳﻨﻜﻪ دﻛﻤﻪ ﻣﻮرد ﻧﻈﺮ را ﺑﻪ ﮔﻮﺷﻪ ﺳﻤﺖ راﺳﺖ ﻓﺮم ﺑﺒﺮﻳﺪ ،ﻳﻚ ﺧﻂ اﻓﻘﻲ آﺑﻲ رﻧﮓ ،ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ ،15-1ﻇﺎﻫﺮ ﻣﻴﺸﻮد .اﻳﻦ ﺧﻂ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ ﻫﺪ ﻛﻪ ﻣﻜﺎن ﻛﻨﺘﺮل ﺟﺪﻳﺪ را ،ﺑﺎ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻓﺮم ﺗـﺮاز ﻛﻨﻴـﺪ. ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﺧﻂ ﻣﻲ واﻧﻴﺪ ﻛﻨﺘﺮﻟﻬﺎي ﺟﺪﻳﺪ را دﻗﻴﻘﺎً در ﺳﻤﺖ ﭼﭗ ،راﺳﺖ ،ﺑﺎﻻ و ﻳﺎ ﭘﺎﻳﻴﻦ ﻳﻚ ﻛﻨﺘﺮل ﺧﺎص ﻗﺮار دﻫﻴﺪ .ﺑـﻪ وﺳﻴﻠﻪ ﺧﻂ آﺑﻲ ﻛﻤﺮﻧﮓ ﻛﻨﺎر ﻛﻨﺘﺮل ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﻓﺎﺻﻠﻪ ﺧﺎص را ﻫﻤﻮاره ﺑﻴﻦ ﻟﺒﻪ ﻓﺮم ﺧﻮد و ﻟﺒﻪ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻓﺮم رﻋﺎﻳﺖ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Nameﻛﻨﺘﺮل ﺟﺪﻳﺪ را ﺑﻪ btnExitو ﺧﺎﺻﻴﺖ Textآن را ﺑـﻪ E&xitﺗﻐﻴﻴـﺮ دﻫﻴـﺪ. ﻓﺮم ﺷﻤﺎ ﻫﻢ اﻛﻨﻮن ﺑﺎﻳﺪ ﭼﻴﺰي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 15-1ﺑﺎﺷﺪ.
٣٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 14-1
ﺷﻜﻞ 15-1 ﺧﻮب ،ﻗﺒﻞ از اﻳﻨﻜﻪ اوﻟﻴﻦ ﺑﺮﻧﺎﻣﻪ را ﺗﻤﺎم ﻛﻨﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﻣﻘﺪاري ﻛﺪ ﻛﻪ ﺑﺎﻳﺪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ را ﺑﻪ اﺧﺘﺼﺎر ﺗﻮﺿﻴﺢ دﻫﻴﻢ.
ﻧﺸﺎﻧﻪ ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ ﺗﻐﻴﻴﺮ ﻳﺎﻓﺘﻪ: اﺣﺘﻤﺎﻻ ﻣﺘﻮﺟﻪ ﺷﺪه اﻳﺪ ﻛﻪ ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ ﺗﺎ ﻛﻨﻮن اﻳﺠﺎد ﻛﺮده اﻳﻢ ،ﺳﺎﺧﺘﺎر ﻧﺎم ﺟﺎﻟﺒﻲ دارﻧﺪ .ﺗﻤﺎﻣﻲ آﻧﻬﺎ داراي ﻳﻚ ﭘﻴﺸﻮﻧﺪ ﻫﺴﺘﻨﺪ ﻛـﻪ ﻧﻮع ﻛﻨﺘﺮل را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻛﺎر ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻫﻨﮕﺎم ﻛﺪ ﻧﻮﻳﺴﻲ ﺑﻪ راﺣﺘﻲ ﻧﻮع ﻛﻨﺘﺮﻟﻲ ﻛﻪ ﺑﺎ آن ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ را ﺗﺸﺨﻴﺺ
٣٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
دﻫﻴﺪ .ﻣﺜﻼً ﻓﺮض ﻛﻨﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﻳﻚ ﻛﻨﺘﺮل دارﻳﺪ ﻛﻪ ﻧﺎم آن Nameاﺳﺖ ،ﺑـﺪون ﻫـﻴﭻ ﭘﻴـﺸﻮﻧﺪي از ﻗﺒﻴـﻞ lblﻳـﺎ .txt ﭼﻄﻮر ﻣﻲ ﺧﻮاﻫﻴﺪ ﺗﺸﺨﻴﺺ دﻫﻴﺪ ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ،ﻳﻚ ﻛﺎدر ﻣﺘﻨﻲ ) (TextBoxاﺳﺖ ﻛﻪ ﻧﺎم را از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨـﺪ ﻳـﺎ ﻳـﻚ ﻟﻴﺒﻞ ﻛﻪ ﻳﻚ ﻋﺒﺎرت ﻣﺮﺑﻮط ﺑﻪ ﻧﺎم را در ﻓﺮم ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ؟ ﻓـﺮض ﻛﻨﻴـﺪ ﻛـﻪ در ﺑﺨـﺶ "اﻣﺘﺤـﺎن ﻛﻨﻴـﺪ" ﻗﺒﻠـﻲ ،ﻛﻨﺘـﺮل ﻟﻴﺒـﻞ را Name1و ﻛﻨﺘﺮل TextBoxرا Name2ﻧﺎم ﮔﺬاري ﻣﻲ ﻛﺮدﻳﻢ ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺴﻠﻤﺎً ﮔﻴﺞ ﻣﻲ ﺷﺪﻳﺪ .اﮔﺮ ﺑﻌﺪ از ﭼﻨﺪ ﻣﺎه ﻣﻲ ﺧﻮاﺳﺘﻴﺪ ﻛﺪ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﭼﻄﻮر ﻣﻴﺘﻮاﻧﺴﺘﻴﺪ ﻛﻨﺘﺮل ﻫﺎ را از ﻫﻢ ﺗﺸﺨﻴﺺ دﻫﻴﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺎ ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﻪ ﺻﻮرت ﮔﺮوﻫﻲ ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﻣﻮرد ﻛﻪ ،اﺳﺘﻴﻞ و ﻗﺎﻟﺐ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺻـﻮرت ﺛﺎﺑـﺖ و ﻣﺸﺨـﺼﻲ ﻧﮕﻪ دارﻳﺪ ﻣﻬﻢ ﺧﻮاﻫﺪ ﺷﺪ .ﻳﻜﻲ از ﻋﻤﻮﻣﻲ ﺗﺮﻳﻦ ﺳﺎﺧﺘﺎرﻫﺎي ﻧﺎم ﺑﺮاي ﻛﻨﺘﺮل ﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ ﻫـﺮ زﺑـﺎﻧﻲ ،ﺗﻮﺳـﻂ دﻛﺘـﺮ ﭼـﺎرﻟﺰ ﺳﻴﻤﻮﻧﻲ ﺑﻪ وﺟﻮد آﻣﺪ ﻛﻪ ﻗﺒﻞ از ﭘﻴﻮﺳﺘﻨﺶ ﺑﻪ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮاي ﺷﺮﻛﺖ 1XPARCﻛﺎر ﻣﻴﻜﺮد .او ﭘﻴﺸﻮﻧﺪ ﻫﺎي ﻛﻮﺗﺎﻫﻲ را ﺑـﻪ وﺟـﻮد آورده ﺑﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺑﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﺴﺘﻨﺪ ﺑﻪ راﺣﺘﻲ ﺗﺸﺨﻴﺺ دﻫﻨﺪ ﻛﻪ ﻫﺮ ﻣﺘﻐﻴﻴﺮ ﭼـﻪ ﻧـﻮع داده اي را ﻧﮕﻬـﺪاري ﻣـﻲ ﻛﻨﺪ .ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ دﻛﺘﺮ ﺳﻴﻤﻮﻧﻲ اﻫﻞ ﻣﺠﺎرﺳﺘﺎن ﺑﻮد و اﻳﻦ ﭘﻴﺸﻮﻧﺪ ﻫﺎ ﻫﻢ ﻣﻘﺪاري ﻣﺎﻧﻨﺪ ﻳﻚ زﺑﺎن ﺧـﺎرﺟﻲ ﻣـﻲ ﻣﺎﻧﺪﻧـﺪ ،ﻧـﺎم "ﻧـﺸﺎﻧﻪ ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ" ﺑﺮ روي اﻳﻦ ﺳﻴﺴﺘﻢ ﻣﺎﻧﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﻪ اﻳﻦ دﻟﻴﻞ ﻛﻪ ﺳﻴﺴﺘﻢ ﻣﻌﺮﻓﻲ ﺷﺪه ﺑﺮاي زﺑﺎﻧﻬﺎي Cو C++ﺑﻪ ﻛﺎر ﻣﻴﺮﻓﺖ، ﻣﺎ اﻳﻦ ﺳﻴﺴﺘﻢ را در وﻳﮋوال " 2005 C#ﻧﺸﺎﻧﻪ ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ ﺗﻐﻴﻴﺮ ﻳﺎﻓﺘﻪ" ﻣﻲ ﻧﺎﻣﻴﻢ .ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﭘﻴﺸﻮﻧﺪﻫﺎﻳﻲ اﺳـﺖ ﻛـﻪ ﺑﻪ ﺷﻤﺎ ﭘﻴﺸﻨﻬﺎد ﻣﻲ ﻛﻨﻢ در اﻳﻦ ﻛﺘﺎب از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻧﺸﺎﻧﻪ ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ زﻣﺎﻧﻲ ﻛﻪ در ﺣﺎل ﺑﺮرﺳﻲ ﻛﺪ ﻓﺮد دﻳﮕﺮي ﻫﺴﺘﻴﺪ و ﻳﺎ ﻛﺪي ﻛﻪ ﺧﻮدﺗﺎن ﭼﻨﺪ ﻣﺎه ﭘﻴﺶ ﻧﻮﺷﺘﻪ اﻳﺪ را ﻣﻄﺎﻟﻌﻪ ﻣﻲ ﻛﻨﻴﺪ ،ﺑﺴﻴﺎر ﻛﺎر را ﺳﺮﻳﻊ ﻣﻲ ﻛﻨﻨﺪ .اﻣﺎ ﮔﺬﺷﺘﻪ از اﻳﻦ ﻣﻮرد ،ﺑﻬﺘﺮﻳﻦ ﻓﺎﻳﺪه اﺳﺘﻔﺎده از اﻳﻦ ﺳﻴﺴﺘﻢ ،اﻳﺠﺎد ﻳﻜﭙﺎرﭼﮕﻲ در ﻛﺪ اﺳﺖ .ﭘﻴـﺸﻨﻬﺎد ﻣﻲ ﻛﻨﻢ از ﭘﻴﺶ ﻓﺮض ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺻﻮرت ﻏﻴﺮ رﺳﻤﻲ در وﻳﮋوال 2005 C#ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد در آﻣﺪه اﻧﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،اﻣﺎ اﻳﻦ ﻛﺎر واﺟﺐ ﻧﻴﺴﺖ .ﻣﻬﻢ اﻳﻦ اﺳﺖ ﻛﻪ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﺧﻮد از ﻳﻚ ﻗﺎﻋﺪه ﺧﺎص ﺑﺮاي ﻧﺎﻣﮕﺬاري ﭘﻴﺮوي ﻛﻨﻴﺪ .ﺗﻌﺪادي از اﻳﻦ ﭘﻴﺶ ﻓﺮض ﻫﺎ ﺑﻪ ﻫﻤﺮاه ﻧﺎم ﻛﻨﺘﺮل ﻣﺮﺑﻮط ﺑﻪ آن در ﺟﺪول زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﻧﺪ. ﭘﻴﺸﻮﻧﺪ
ﻛﻨﺘﺮل دﻛﻤﻪ ﻓﺮﻣﺎن )(Button
Btn
ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ )(ComboBox
Cbo
ﺟﻌﺒﻪ اﻧﺘﺨﺎب )(CheckBox
Chk
ﻟﻴﺒﻞ )(Label
lbl
ﺟﻌﺒﻪ ﻟﻴﺴﺖ )(ListBox
lst
ﻣﻨﻮي اﺻﻠﻲ )(Menu
mnu
دﻛﻤﻪ رادﻳﻮﻳﻲ )(RadioButton
rdb
ﺟﻌﺒﻪ ﺗﺼﻮﻳﺮ )(PictureBox
pic
ﺟﻌﺒﻪ ﻣﺘﻨﻲ )(TextBox
txt
وﻳﺮاﻳﺸﮕﺮ ﻛﺪ:
Xerox Palo Alto Research Center
1
٣٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺣﺎﻻ ﻛﻪ ﻓﺮم HelloUserرا اﻳﺠﺎد ﻛﺮده اﻳﺪ ،ﺑﺎﻳﺪ ﻣﻘﺪاري ﻛﺪ ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎرﻫﺎي ﻣﻮرد ﻧﻈﺮ را ﺑﺮاﻳﺘﺎن اﻧﺠﺎم دﻫـﺪ .ﺗـﺎ ﻛﻨﻮن دﻳﺪه اﻳﺪ ﻛﻪ اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻛﻨﺘﺮل ﺑﻪ ﻓﺮم ﺗﺎ ﭼﻪ ﺣﺪ ﺳﺎده اﺳﺖ .ﻓﺮاﻫﻢ ﻛﺮدن ﻳﻚ ﻛﺎراﻳﻲ ﺧﺎص ﺑﺮاي اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ ﻛﺪ ﻧﻴﺰ ،زﻳﺎد ﺳﺨﺖ ﺗﺮ از اﺿﺎﻓﻪ ﻛﺮدن ﻛﻨﺘﺮل ﺑﻪ ﻓﺮم ﻧﻴﺴﺖ .ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ ﺑﻪ ﻛﻨﺘﺮل ﻣﻮرد ﺑﺤﺚ ،ﻓﻘﻂ ﻛﺎﻓﻲ اﺳﺖ ﻛـﻪ روي آن دوﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﺎ اﻳﻦ ﻛﺎر ،ﺻﻔﺤﻪ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 16-1ﻧﺸﺎن داده ﺷﺪه اﺳﺖ ﺑﺎز ﻣﻲ ﺷﻮد.
ﺷﻜﻞ 16-1 دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻳﻚ ﻟﺒﻪ دﻳﮕﺮ ﺑﻪ ﻟﺒﻪ ﻫﺎي ﺑﺎﻻي ﺻﻔﺤﻪ اﺻﻠﻲ در وﻳﮋوال اﺳﺘﻮدﻳﻮ اﺿﺎﻓﻪ ﺷﺪ .ﺣﺎﻻ در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﻪ دو ﭘﻨﺠﺮه Designو Codeدﺳﺘﺮﺳﻲ دارﻳﺪ .ﺑﺮاي ﻃﺮاﺣﻲ ﻇﺎﻫﺮ و راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ از ﻗﺴﻤﺖ ،Designو ﺑـﺮاي ﻧﻮﺷـﺘﻦ ﻛـﺪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ از ﻗﺴﻤﺖ Codeاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮاي ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻓﺮم ،ﻳﻚ ﻓﺎﻳﻞ ﻣﺠﺰا اﻳﺠـﺎد ﻣﻲ ﻛﻨﺪ .ﻗﺴﻤﺘﻬﺎي ﺑﺼﺮي و ﻗﺴﻤﺘﻬﺎﻳﻲ ﻛﻪ ﺑﻪ ﻇﺎﻫﺮ ﻓﺮم ﻣﺮﺑﻮط ﻫﺴﺘﻨﺪ در ﻓﺎﻳﻠﻲ ﺑﻪ ﻧﺎم HelloUser.Designer.cs و ﻛﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﭼﮕﻮﻧﮕﻲ ﻋﻤﻠﻜﺮد ﻓﺮم در HelloUser.csﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .اﻳﻦ ﻣـﻮرد ﺧـﻮد ﻳﻜـﻲ از دﻻﻳﻠـﻲ اﺳـﺖ ﻛـﻪ ﻣﻮﺟﺐ راﺣﺘﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎ وﻳﮋوال 2005 C#ﻣﻲ ﺷﻮد .ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ Designﻣﻲ ﺗﻮاﻧﻴﺪ ﻇﺎﻫﺮ ﺑﺮﻧﺎﻣﻪ ﺧـﻮد را ﻃﺮاﺣـﻲ ﻛﻨﻴﺪ ،ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ Codeﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم را ﺑﻨﻮﻳﺴﻴﺪ. ﻗﺴﻤﺖ ﻣﻬﻢ دﻳﮕﺮ در ﭘﻨﺠﺮه ﻣﺮﺑﻮط ﺑﻪ ﻛﺪ ،دو ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﻣﻮﺟﻮد در ﺑﺎﻻي ﺻﻔﺤﻪ اﺳﺖ .ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ دو ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑـﻪ ﺳـﺮﻋﺖ ﺑـﻪ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻓﺮم ﺧﻮد دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ .اﺷﺎره ﮔﺮ ﻣﺎوس ﺧﻮد را ﺑﺮ روي ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﺳﻤﺖ ﭼﭗ ﺑﺒﺮﻳﺪ و ﻣﻘـﺪاري ﺑـﺮ روي آن ﻧﮕﻪ دارﻳﺪ .راﻫﻨﻤﺎﻳﻲ ﻇﺎﻫﺮ ﺷﺪه و ﻣﻴﮕﻮﻳﺪ ﻛﻪ اﻳﻦ ﻛﺎدر ،ﻣﺮﺑﻮط ﺑﻪ Typesاﺳﺖ .اﮔﺮ اﻳﻦ ﻟﻴﺴﺖ را ﺑـﺎز ﻛﻨﻴـﺪ ،ﻟﻴـﺴﺘﻲ از ﺗﻤـﺎﻣﻲ ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﻓﺮم ﺧﻮد ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .اﮔﺮ اﺷﺎره ﮔﺮ ﻣﺎوس ﺧﻮد را ﺑﺮ روي ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﺳـﻤﺖ راﺳـﺖ ﺑﺒﺮﻳـﺪ ،راﻫﻨﻤـﺎي ﻇﺎﻫﺮ ﺷﺪه ﺑﻪ ﺷﻤﺎ ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ اﻳﻦ ﻗﺴﻤﺖ ﻣﺮﺑﻮط ﺑﻪ Membersاﺳﺖ .اﮔﺮ اﻳﻦ ﻟﻴﺴﺖ را ﺑﺎز ﻛﻨﻴـﺪ ،ﻧـﺎم ﺗﻤـﺎم ﺗﻮاﺑـﻊ و زﻳﺮﺑﺮﻧﺎﻣـﻪ ﻫﺎﻳﻲ ﻛﻪ در ﻛﻼس اﻧﺘﺨﺎب ﺷﺪه در ﺳﻤﺖ ﭼﭗ ﻗﺮار دارﻧﺪ را ﺧﻮاﻫﻴﺪ دﻳﺪ .اﮔﺮ ﻓﺮم ﺟﺎري ﻣﺤﺘﻮي ﻣﻘﺪار زﻳﺎدي ﻛﺪ اﺳﺖ ،ﺑﻪ وﺳﻴﻠﻪ اﻳـﻦ ﻗﺴﻤﺖ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ ﺑﻴﻦ ﺗﻮاﺑﻊ آن ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮﻳﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ HelloUser (1ﺑﺮاي ﺷﺮوع اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ،ﺑﺮ روي ﻗﺴﻤﺖ Designدر ﭘﻨﺠﺮه اﺻﻠﻲ ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﺑـﺎر دﻳﮕـﺮ ﻗـﺴﻤﺖ ﻃﺮاﺣﻲ را ﺑﺒﻴﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ ي OKدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﭘﻨﺠﺮه ي ﻛﺪ ﺑﺎ ﻛﺪي ﻛﻪ در زﻳﺮ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳـﺖ ﺑـﺎز ﻣـﻲ
٣٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻮد .اﻳﻦ ﻛﺪ ﻛﻪ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ،ﭘﻮﺳﺘﻪ ﻳﺎ ﻗﺎﻟﺐ روﻳﺪاد Clickﺑﺮاي ﻛﻨﺘﺮل Buttonاﺳـﺖ. در اﻳﻦ ﻗﺴﻤﺖ ﻣﻴﺘﻮاﻧﻴﺪ ﻛﺪي را وارد ﻛﻨﻴﺪ ﻛﻪ ﺑﺎ ﻫﺮ ﺑﺎر ﻛﻠﻴﻚ ﻛﺮدن روي اﻳﻦ ﻛﻨﺘﺮل اﺟﺮا ﺷﻮد .اﻳﻦ ﻛﺪ ﺑﻪ ﻋﻨـﻮان ﻛﻨﺘـﺮل ﻛﻨﻨﺪه ي روﻳﺪاد 1و ﻳﺎ زﻳﺮ ﺑﺮﻧﺎﻣﻪ روﻳﺪاد 2ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .در ﻓﺼﻠﻬﺎي ﺑﻌﺪ ﺑﺎ اﻳﻦ ﻣﻮارد ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ: )private void btnOK_Click(object sender, EventArgs e { } در ﻛﺪ ﺑﺎﻻ ﻛﻠﻤﺎت voidو ﻳﺎ privateﻧﻤﻮﻧﻪ اي از ﻛﻠﻤﺎت ﻛﻠﻴﺪي در C#ﻫﺴﺘﻨﺪ .در اﺻﻄﻼﺣﺎت ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ، ﻛﻠﻤﺎت ﻛﻠﻴﺪي 3ﻛﻠﻤﺎﺗﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﻳﮋوال C#ﻣﻴﮕﻮﻳﻨﺪ ﻛﺎرﻫﺎي ﺧﺎﺻﻲ را اﻧﺠﺎم دﻫﺪ .ﻣﺜﻼً در اﻳﻦ ﺟﺎ ،ﻛﻠﻤﻪ void ﺑﻪ وﻳﮋوال C#ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﺗﺎﺑﻊ ﺗﻌﺮﻳﻒ ﺷﺪه ﻫﻴﭻ ﻣﻘﺪاري را ﺑﺮﻧﻤﻲ ﮔﺮداﻧﺪ .ﻫﻤـﻪ ي ﻛـﺪﻫﺎﻳﻲ ﻛـﻪ ﺷـﻤﺎ در ﺑـﻴﻦ ﺧﻄـﻮط ﻣﺮﺑﻮط ﺑﻪ ﺑﺎز ﺷﺪن آﻛﻮﻻد ){( و ﺑﺴﺘﻪ ﺷﺪن آن )}( ﺑﻨﻮﻳﺴﻴﺪ ،ﺗﺎﺑﻊ روﻳﺪاد ﻣﺮﺑﻮط ﺑﻪ دﻛﻤـﻪ OKرا ﺗـﺸﻜﻴﻞ ﻣـﻲ دﻫﻨـﺪ .در ﻓﺼﻞ ﺳﻮم ﺑﻴﺸﺘﺮ در ﻣﻮرد اﻳﻦ ﻣﺒﺎﺣﺚ ﮔﻔﺘﮕﻮ ﺧﻮاﻫﻴﻢ ﻛﺮد. (2ﺣﺎﻻ ﻛﺪﻫﺎي ﻣﺸﺨﺺ ﺷﺪه در اﻳﻦ ﻗﺴﻤﺖ را در ﺗﺎﺑﻊ وارد ﻛﻨﻴﺪ )در ﺑﻴﻦ آﻛﻮﻻدﻫﺎ ﺑﻨﻮﻳﺴﻴﺪ(: )private void btnOK_Click(object sender, EventArgs e { //Display a message box greeting the user MessageBox.Show("Hello " + txtName.Text + "! Welcome to Visual C# 2005.", ;)""Hello User Message } ﻧﻜﺘﻪ :ﺑﻪ ﻋﻠﺖ ﻛﻤﺒﻮد ﺟﺎ در اﻳﻦ ﺻﻔﺤﻪ ﻧﻤﻲ ﺗﻮاﻧﻴﻢ ﺗﻤﺎم ﻳﻚ دﺳﺘﻮر را ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺑﻨﻮﻳﺴﻴﻢ ،اﻣﺎ در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﺷﻤﺎ ﻣـﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﻛﺪﻫﺎ را ﭘﺸﺖ ﺳﺮ ﻫﻢ ﺑﻨﻮﻳﺴﻴﺪ .در وﻳﮋوال C#ﻳﻚ ﺧﻂ ﻛﺪ ،زﻣﺎﻧﻲ ﺗﻤﺎم ﻣﻴﺸﻮد ﻛﻪ ﻋﻼﻣﺖ ﻧﻘﻄﻪ وﻳﺮﮔﻮل );( ﺑﻌﺪ از آن ﺑﻴﺎﻳﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻴﺘﻮاﻧﻴﺪ ﻳﻚ دﺳﺘﻮر را در ﭼﻨﺪ ﺧﻂ ﺑﻨﻮﻳﺴﻴﺪ و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻛﺎراﻛﺘﺮ ; را وارد ﻧﻜﺮده اﻳﺪ ﻧﻴﺰ دﺳـﺘﻮر را اداﻣـﻪ دﻫﻴﺪ. ﻧﻜﺘﻪ :در ﻃﻮل ﻛﺘﺎب ،ﺑﺎ ﻗﺴﻤﺘﻬﺎﻳﻲ روﺑﺮو ﻣﻲ ﺷﻮﻳﺪ ﻛﻪ ﺑﺎﻳﺪ ﻛﺪﻫﺎﻳﻲ را در ﺑﺮﻧﺎﻣﻪ ﺧﻮد وارد ﻛﻨﻴﺪ .ﻣﻌﻤﻮﻻ ﻫﺮ ﺟﺎ ﻛﻪ ﭼﻨﻴﻦ ﻣﻮردي ﭘﻴﺶ ﺑﻴﺎﻳﺪ ،ﻣﻜﺎن دﻗﻴﻖ وارد ﻛﺮدن ﻛﺪ را ﺑﺮاي ﺷﻤﺎ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻢ .ﻛﺪﻫﺎﻳﻲ ﻛﻪ ﺑﺎ رﻧﮓ ﭘـﻴﺶ زﻣﻴﻨـﻪ ﺧﺎﻛـﺴﺘﺮي ﻣـﺸﺨﺺ ﻣـﻲ ﺷـﻮﻧﺪ، ﻛﺪﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺎﻳﺪ در ﺑﺮﻧﺎﻣﻪ وارد ﻛﻨﻴﺪ. (3ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﺪ ﻗﺴﻤﺖ ﻗﺒﻠﻲ را وارد ﻛﺮدﻳﺪ ،ﻣﺠﺪدا ﺑﻪ ﻗﺴﻤﺖ Designﺑﺮﮔﺮدﻳﺪ و روي دﻛﻤـﻪ Exitدوﺑـﺎر ﻛﻠﻴـﻚ ﻛﻨﻴﺪ .ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﺗﺎﺑﻊ btnExit_Clickوارد ﻛﻨﻴﺪ. )private void btnExit_Click(object sender, EventArgs e { 1
Event Handler Event Procedure 3 Keywords 2
٣٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
//End the program and close the form ;)(this.Close } اﺣﺘﻤﺎﻻ ﻛﻠﻤﻪ thisﺑﺮاﻳﺘﺎن ﺟﺪﻳﺪ اﺳﺖ this .ﻳﻚ ﻛﻠﻤﻪ ﻛﻠﻴـﺪي در C#اﺳـﺖ ﻛـﻪ ﺑـﻪ ﺷـﻴﺊ ﻛـﻪ در آن ،در ﺣـﺎل ﻛﺪﻧﻮﻳﺴﻲ ﻫﺴﺘﻴﻢ ،اﺷﺎره ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺟﺎ ﭼﻮن ﻛﺪﻫﺎي ﻧﻮﺷﺘﻪ ﺷـﺪه ﻣﺮﺑـﻮط ﺑـﻪ ﻓـﺮم HelloUserاﺳـﺖ ،ﻛﻠﻤـﻪ thisﺑﻪ ﻓﺮم HelloUserاﺷﺎره ﻣﻲ ﻛﻨﺪ. (4ﺣﺎﻻ ﻛﻪ ﻛﺪﻧﻮﻳﺴﻲ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،زﻣﺎن ﺗﺴﺖ ﻛﺮدن آن ﺷﺪه اﺳﺖ و ﻣﻲ ﺗﻮاﻧﻴﺪ ﺳﺎﺧﺘﻪ ﺧﻮدﺗﺎن را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .اﺑﺘـﺪا ﺑﺮﻧﺎﻣﻪ را از ﻃﺮﻳﻖ ﻣﻨﻮي File Save HelloUser.csو ﻳﺎ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻠﻴﺪ Saveروي ﻧـﻮار اﺑﺰار ،ذﺧﻴﺮه ﻛﻨﻴﺪ. (5روي دﻛﻤﻪ Startﺑﺮ روي ﻧﻮار اﺑﺰار )ﻣﺜﻠﺚ ﺳﺒﺰ رﻧـﮓ( ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﭘﻨﺠـﺮه Outputدر ﭘـﺎﻳﻴﻦ ﺻـﻔﺤﻪ ،اﻧﺠـﺎم ﻓﻌﺎﻟﻴﺘﻬﺎي زﻳﺎدي را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .اﮔﺮ در وارد ﻛﺮدن ﻛﺪﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻫﻴﭻ ﺧﻄﺎﻳﻲ ﺑﻪ وﺟﻮد ﻧﻴﺎﻳﺪ ،اﻃﻼﻋﺎت اﻳﻦ ﭘﻨﺠﺮه ﻓﻘﻂ ﺷﺎﻣﻞ اﺳﻢ ﻓﺎﻳﻠﻬﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎرﮔﺬاري ﻣﻲ ﺷﻮﻧﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ،ﺑﻪ اﺻﻄﻼح ،وﻳﮋوال اﺳﺘﻮدﻳﻮ در ﺣﺎل ﻛﺎﻣﭙﺎﻳﻞ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺳﺖ .ﻛﺎﻣﭙﺎﻳﻞ ﻛﺮدن ﺑﻪ ﻣﺮﺣﻠﻪ اي ﮔﻔﺘﻪ ﻣﻲ ﺷـﻮد ﻛﻪ در آن ،از ﻛﺪ وﻳﮋوال 2005 C#ﻛﻪ ﺗﻮﺳﻂ ﺷﻤﺎ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ،ﻛﺪي ﺳﺎﺧﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﺗﻮﺳـﻂ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻗﺎﺑـﻞ ﻓﻬـﻢ ﺑﺎﺷﺪ .1ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﺎﻣﭙﺎﻳﻞ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎ ﻣﻮﻓﻘﻴﺖ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005آن را اﺟﺮا ﻣﻲ ﻛﻨـﺪ و ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻧﺘﻴﺠﻪ ﻛﺎر ﺧﻮد را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ. اﮔﺮ در ﻣﺮﺣﻠﻪ ﻛﺎﻣﭙﺎﻳﻞ ﻛﺮدن ،وﻳﮋوال 2005 C#ﺑﺎ ﻫﺮ ﺧﻄﺎﻳﻲ در ﻛﺪ ﻣﻮاﺟﻪ ﺷﻮد ،آن را ﺑﻪ ﻋﻨﻮان ﻳﻚ وﻇﻴﻔﻪ در ﭘﻨﺠـﺮه ي Task Listﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﺑﺎ دوﺑﺎر ﻛﻠﻴﻚ ﻛﺮدن روي وﻇﻴﻔﻪ ﻣﻮرد ﻧﻈﺮ در ﺑﺨﺶ Task Listﺑﻪ ﻗﺴﻤﺘﻲ از ﻛﺪ ﻛﻪ ﺑﻪ آن ﻣﺮﺗﺒﻂ اﺳﺖ ،ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮﻳﺪ .در ﻓﺼﻞ 11در ﻣﻮرد ﺧﻄﺎ ﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و اﺻﻼح آﻧﻬﺎ ﺑﻴـﺸﺘﺮ ﻳـﺎد ﺧـﻮاﻫﻴﻢ ﮔﺮﻓﺖ. (6ﺑﻌﺪ از اﻳﻨﻜﻪ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﺪ ،ﺻﻔﺤﻪ اﺻﻠﻲ آن ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﻳﻚ ﻧﺎم را وارد ﻛﺮده و روي ﻛﻠﻴﺪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ )ﻳـﺎ ﻛﻠﻴﺪﻫﺎي Alt + Oرا ﻓﺸﺎر دﻫﻴﺪ() .ﺷﻜﻞ (17-1
– Compile 1در اﻳﻦ ﻣﻮرد در ﻓﺼﻞ دوم ﺑﻴﺸﺘﺮ ﺗﻮﺿﻴﺢ ﺧﻮاﻫﻴﻢ داد.
٣٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 17-1 (7ﭘﻨﺠﺮه اي ﻛﻪ ﺑﻪ ﻛﺎدر ﭘﻴﻐﺎم 1ﻣﻌﺮوف اﺳﺖ ،ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ و ﺑﻪ ﺷﺨﺼﻲ ﻛﻪ ﻧـﺎم او در TextBoxداﺧـﻞ ﻓـﺮم آﻣﺪه اﺳﺖ ﺧﻮش آﻣﺪ ﻣﻲ ﮔﻮﻳﺪ) .ﺷﻜﻞ (18-1
ﺷﻜﻞ 18-1 (8ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﺎدر ﭘﻴﻐﺎم را ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن روي دﻛﻤﻪ OKﺑﺴﺘﻴﺪ ،روي دﻛﻤﻪ Exitﺑﺮ روي ﻓـﺮم ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﺑﺮﻧﺎﻣـﻪ ﺑﺴﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ و ﺷﻤﺎ ﺑﻪ ﻣﺤﻴﻂ وﻳﮋوال 2005 C#ﺑﺮﺧﻮاﻫﻴﺪ ﮔﺸﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﺪي ﻛﻪ در روﻳﺪاد Clickﺑﺮاي دﻛﻤﻪ OKوارد ﻛﺮده اﻳﺪ ﻧﺎم ﻛﺎرﺑﺮي را ﻛﻪ در TextBoxﻓﺮم وارد ﺷﺪه اﺳﺖ درﻳﺎﻓﺖ ﻛـﺮده و آن را ﺑﻪ ﻋﻨﻮان ﺑﺨﺸﻲ از ﭘﻴﻐﺎم ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 18-1ﻧﺸﺎن ﻣﻲ دﻫﺪ. ﺧﻂ اوﻟﻲ ﻛﻪ در ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ روﻳﺪاد ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ،ﻓﻘﻂ ﻳﻚ ﺗﻮﺿﻴﺢ اﺳﺖ .اﻳﻦ ﺗﻮﺿﻴﺢ ﺑﺮاي راﻫﻨﻤﺎﻳﻲ ﻛﺮدن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻛﻪ روي ﭘﺮوژه ﻛﺎر ﻣﻲ ﻛﻨﺪ و ﻳﺎ ﻛﺴﻲ ﻛﻪ ﺑﻌﺪﻫﺎ ﻣﻲ ﺧﻮاﻫﺪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ را ﺑﺨﻮاﻧﺪ ﻧﻮﺷﺘﻪ ﻣـﻲ ﺷـﻮد و ﺗﻮﺳـﻂ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺧﻮاﻧـﺪه ﻧﻤـﻲ ﺷـﻮد. ﺗﻮﺿﻴﺤﺎت در وﻳﮋوال C#ﺑﺎ ) (//ﻣﺸﺨﺺ ﻣﻲ ﺷﻮﻧﺪ و ﻫﺮ ﻣﺘﻨﻲ ﻛﻪ ﺑﻌﺪ از اﻳﻦ دو ﻛﺎراﻛﺘﺮ وارد ﺷﻮد ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد .در راﺑﻄﻪ ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن ﺗﻮﺿﻴﺤﺎت در ﻓﺼﻞ ﺳﻮم ﺑﺤﺚ ﺷﺪه اﺳﺖ. ﺗﺎﺑﻊ MessageBox.Showﻳﻚ ﭘﻴﻐﺎم را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .اﻳﻦ ﺗﺎﺑﻊ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺨﺘﻠﻔﻲ را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .ﻣـﺜﻼ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ،ﻳﻚ رﺷﺘﻪ ﻣﺘﻨﻲ را ﺑﻪ اﻳﻦ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎدﻳﺪ ﺗﺎ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ .رﺷﺘﻪ ﻣﺘﻨﻲ ﺷﻤﺎ از اﺗﺼﺎل دو ﻣﻘﺪار ﺛﺎﺑﺖ ﻣﺘﻨﻲ ﻛﻪ در ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل )"( ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﻮد ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﺪ .ﺑﺮاي اﺗﺼﺎل ﭼﻨﺪ رﺷﺘﻪ ﻣﺘﻨﻲ ﺑﻪ ﻳﻜﺪﻳﮕﺮ و اﻳﺠﺎد ﻳﻚ رﺷﺘﻪ ﻃﻮﻻﻧﻲ در C#ﻣـﻲ ﺗﻮاﻧﻴﺪ ﻫﻤﺎﻧﻨﺪ ﻛﺎري ﻛﻪ ﺑﺮاي ﺟﻤﻊ ﻛﺮدن اﻋﺪاد اﻧﺠﺎم ﻣﻲ دﻫﻴﺪ ،از ﻋﻼﻣﺖ +اﺳﺘﻔﺎده ﻛﻨﻴﺪ. در ﺣﻘﻴﻘﺖ ﻛﺪي ﻛﻪ ﺑﻌﺪ از ﺧﻂ ﺗﻮﺿﻴﺤﺎت در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ آﻣﺪه اﺳﺖ ،ﺛﺎﺑﺖ رﺷﺘﻪ اي " "Helloرا ﺑﺎ ﻣﻘـﺪار ﺧﺎﺻـﻴﺖ Text ﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل txtNameﺟﻤﻊ ﻛﺮده و ﻋﺒـﺎرت " "! Welcome to Visual C# 2005را ﺑـﻪ رﺷـﺘﻪ ﺣﺎﺻﻞ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .ﭘﺎراﻣﺘﺮ دوﻣﻲ ﻛﻪ ﺑﻪ ﻣﺘﺪ MessageBox.Showﻓﺮﺳﺘﺎده ﺷﺪه اﺳﺖ ،ﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺑﻪ ﻋﻨﻮان ﻣﺘﻨﻲ ﻛـﻪ ﺑﺎﻳﺪ در ﻧﻮار ﻋﻨﻮان ﭘﻨﺠﺮه ﻧﻤﺎﻳﺶ داده ﺷﻮد اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. ﻧﻜﺘﻪ دﻳﮕﺮي ﻛﻪ در اﻳﻦ ﻛﺪ ﻣﻬﻢ اﺳﺖ اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ دﺳﺘﻮر را در ﭼﻨﺪ ﺧﻂ ﻧﻮﺷﺘﻪ اﻳﻢ .اﻳﻦ ﻛﺎر ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ دﺳﺘﻮر ﻃﻮﻻﻧﻲ را وارد ﻛﻨﻴﻢ ﺑﺴﻴﺎر ﻣﻔﻴﺪ اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ،در C#ﻳﻚ دﺳﺘﻮر زﻣﺎﻧﻲ ﺗﻤﺎم ﻣﻴﺸﻮد ﻛﻪ ﻛﺎراﻛﺘﺮ ; ﺑﻌﺪ از آن ﻗﺮار ﮔﻴﺮد. ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﻪ اﻳﻦ ﻛﺎراﻛﺘﺮ ﺑﺮﺧﻮرد ﻧﻜﺮده ﺑﺎﺷﺪ ،ﺗﻤﺎم ﻣﺘﻦ را ﺑﻪ ﻋﻨﻮان ﻳﻚ دﺳﺘﻮر در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮد.
MessageBox
1
٤٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)private void btnOK_Click(object sender, EventArgs e { //Display a message box greeting the user MessageBox.Show("Hello " + txtName.Text + "! Welcome to Visual C# 2005.", ;)""Hello User Message } ﻛﺪ ﺑﻌﺪي ﻛﻪ وارد ﻛﺮدﻳﺪ ،ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickﺑـﺮاي دﻛﻤـﻪ Exitﺑـﻮد .در آﻧﺠـﺎ ﺑـﺮاي ﺧـﺮوج از ﺑﺮﻧﺎﻣـﻪ ،ﺑـﻪ راﺣﺘـﻲ ﻛـﺪ )( this.Closeرا ﻧﻮﺷﺘﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼ ﻫﻢ ﺗﻮﺿﻴﺢ داده ﺷﺪ ،ﻛﻠﻤﻪ ﻛﻠﻴﺪي ،thisﺑﻪ ﻓﺮﻣﻲ ﻛـﻪ ﻫـﻢ اﻛﻨـﻮن در آن ﻫﺴﺘﻴﻢ اﺷﺎره ﻣﻲ ﻛﻨﺪ .ﻣﺘﺪ Closeاز ﻓﺮم ﺟﺎري ،ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻓﺮم ﺑﺴﺘﻪ ﺷﺪه و ﺗﻤﺎم ﻣﻨﺎﺑﻌﻲ ﻛـﻪ ﺳﻴـﺴﺘﻢ در اﺧﺘﻴـﺎر آن ﻗـﺮار داده اﺳﺖ آزاد ﺷﻮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻓﺮم )و در ﻧﺘﻴﺠﻪ ﺑﺮﻧﺎﻣﻪ( ﺑﺴﺘﻪ ﻣﻲ ﺷﻮد. )private void btnExit_Click(object sender, EventArgs e { //End the program and close the form ;)(this.Close } اﺣﺘﻤﺎﻻً ﻗﺴﻤﺘﻬﺎي زﻳﺎدي از ﻧﻮﺷﺘﻪ ﻫﺎي ﺑﺎﻻ را ﻣﺘﻮﺟﻪ ﻧﺸﺪه اﻳﺪ و ﻳﺎ ﺑﺮاﻳﺘﺎن ﻧﺎﻣﻔﻬﻮم اﺳﺖ .اﻣﺎ اﺻﻼً ﺟﺎي ﻧﮕﺮاﻧـﻲ ﻧﻴـﺴﺖ ،در ﻓـﺼﻠﻬﺎي ﺑﻌﺪي ﺗﻤﺎم اﻳﻦ ﻣﻮارد ﺑﻪ ﺗﻔﺼﻴﻞ ﺗﻮﺿﻴﺢ داده ﺧﻮاﻫﻨﺪ ﺷﺪ.
اﺳﺘﻔﺎده از ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ: ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎﻳﻲ ﻛﻪ در وﻳﮋوال 2005 C#ﺑﻪ ﻛﺎر رﻓﺘﻪ اﺳﺖ ،ﻧﺴﺨﻪ ي ارﺗﻘﺎ ﻳﺎﻓﺘﻪ ي ﻧﺴﺨﻪ ﻫﺎي ﻗﺒﻠﻲ اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﺳﺖ .ﺑﻪ ﺗﺪرﻳﺞ ﻛﻪ ﺷﺮوع ﺑﻪ ﻳﺎدﮔﻴﺮي وﻳﮋوال 2005 C#ﻛﻨﻴﺪ ،ﺑﺎ اﻳﻦ ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ .اﻣﺎ ﺧﻮب اﺳﺖ در اﻳﻨﺠﺎ ﺑﻪ ﻃﻮر ﻣﺨﺘﺼﺮ اﻳـﻦ ﺳﻴﺴﺘﻢ را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ﺗﺎ ﺑﺘﻮاﻧﻴﺪ ﺳﺮﻳﻌﺘﺮ اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز ﺧﻮد را در آن ﭘﻴﺪا ﻛﻨﻴﺪ. ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮي Helpدر ﺷﻜﻞ 19-1ﻧﻤﺎﻳﺶ داده ﺷﺪه اﻧﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ،اﻳﻦ ﻣﻨﻮ ﻧﺴﺒﺖ ﺑﻪ ﻣﻨﻮي Helpدﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﮔﺰﻳﻨﻪ ﻫﺎي ﺑﻴﺸﺘﺮي دارد .دﻟﻴﻞ اﻳﻦ ﻣﻮﺿـﻮع ﻫـﻢ ﺣﺠﻢ زﻳﺎد ﻣﺴﺘﻨﺪاﺗﻲ اﺳﺖ ﻛﻪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ وﺟﻮد دارد .اﻓﺮاد ﻛﻤﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻴﺸﺘﺮ ﻣﻮارد ﻣﻮرد ﻧﻴﺎز ﺧﻮد را در .NETاز ﺣﻔﻆ ﺑﺎﺷﻨﺪ. اﻣﺎ ﺧﻮﺷﺒﺨﺘﺎﻧﻪ ﻧﻴﺎزي ﺑﻪ ﺣﻔﻆ ﺑﻮدن آﻧﻬﺎ ﻧﻴﺴﺖ ،ﭼﻮن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ و ﺑﻪ ﺳﺮﻋﺖ ﺑﻪ ﺳﻴﺴﺘﻢ راﻫﻨﻤـﺎي وﻳـﮋوال اﺳـﺘﻮدﻳﻮ ﻣﺮاﺟﻌـﻪ ﻛﻨﻴﺪ. ﻳﻜﻲ از اﻣﻜﺎﻧﺎت ﺟﺎﻟﺐ راﻫﻨﻤﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﺳﻴﺴﺘﻢ راﻫﻨﻤﺎي دﻳﻨﺎﻣﻴﻚ آن اﺳﺖ .وﻗﺘﻲ ﺷﻤﺎ ﮔﺰﻳﻨﻪ Dynamic Helpرا از ﻣﻨﻮي Helpاﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻴﺪ ،ﭘﻨﺠﺮه ﻣﺮﺑﻮط ﺑﻪ راﻫﻨﻤﺎي دﻳﻨﺎﻣﻴﻚ ﺑﺎز ﻣﻲ ﺷﻮد و ﻟﻴﺴﺘﻲ از ﻣﻮﺿﻮﻋﺎت ﻣﺮﺗﺒﻂ ﺑﺎ ﻛﺎري ﻛـﻪ در ﺣـﺎل اﻧﺠﺎم آن ﻫﺴﺘﻴﺪ را ﺑﻪ ﺷﻤﺎ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﭘﻨﺠﺮه راﻫﻨﻤﺎي دﻳﻨﺎﻣﻴﻚ از ﻃﺮﻳـﻖ اﻧﺘﺨـﺎب Help Dynamic Help در ﻧﻮار ﻣﻨﻮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ .ﺑﺎ اﻧﺘﺨﺎب آن ﭘﻨﺠﺮه Dynamic Helpدر ﻛﻨﺎر ﭘﻨﺠـﺮه ي Propertiesدر ﻣﺤـﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
٤١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 19-1 ﻣﺜﻼً ،ﻓﺮض ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺷﻤﺎ در ﺣﺎل ﻛﺎر ﺑﺎ ﻳﻚ ﻛﻨﺘـﺮل TextBoxﻫـﺴﺘﻴﺪ )ﺑـﺮاي ﻣﺜـﺎل TextBoxاي ﻛـﻪ در ﺑﺮﻧﺎﻣـﻪ ي Hello Userﻗﺮار دادﻳﻢ( و ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﻘﺪاري اﻃﻼﻋﺎت راﺟﻊ ﺑﻪ آن ﻛﺴﺐ ﻛﻨﻴﺪ .ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ در ﻓﺮم و ﻳﺎ در ﻗﺴﻤﺖ ﻛـﺪ، TextBoxرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ ﺗﻤﺎم ﻣﻮﺿﻮﻋﺎت ﻣﺮﺗﺒﻂ ﺑﺎ آن را در ﭘﻨﺠﺮه راﻫﻨﻤﺎي دﻳﻨﺎﻣﻴﻚ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ) .ﺷﻜﻞ (20-1 ﮔﺰﻳﻨﻪ ﻫﺎي دﻳﮕﺮ ﻣﻮﺟﻮد در ﻣﻨﻮي Content ،Serach) Helpو (Indexﻫﻤﺎﻧﻨﺪ دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨـﺪوزي ﻋﻤـﻞ ﻣﻴﻜﻨﻨﺪ .ﮔﺰﻳﻨﻪ How Do Iدر اﻳﻦ ﻣﻨﻮ ،ﻟﻴﺴﺘﻲ از ﻣﻮارد ﻣﻮﺟﻮد در راﻫﻨﻤﺎي وﻳﮋوال اﺳـﺘﻮدﻳﻮ ﻛـﻪ در آن ﻛﺎرﻫـﺎي ﻋﻤـﻮﻣﻲ دﺳـﺘﻪ ﺑﻨﺪي ﺷﺪه اﻧﺪ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﺷﻜﻞ 21-1
٤٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﻼﺻﻪ: ﺧﻮﺷﺒﺨﺘﺎﻧﻪ ﺗﺎ ﻛﻨﻮن ﻣﺘﻮﺟﻪ ﺷﺪه اﻳﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎ وﻳﮋوال 2005 C#ﺳﺨﺖ ﻧﻴﺴﺖ .ﻣﻘﺪاري ﻣﺤﻴﻂ وﻳﮋوال اﺳـﺘﻮدﻳﻮ را ﺑﺮرﺳـﻲ ﻛﺮده اﻳﺪ و دﻳﺪه اﻳﺪ ﻛﻪ اﻳﻦ ﻣﺤﻴﻂ ﭼﮕﻮﻧﻪ ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ ﺗﺎ ﺑﻪ ﺳﺮﻋﺖ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﻨﻴﺪ .دﻳﺪﻳﺪ ﻛـﻪ ﺟﻌﺒـﻪ اﺑـﺰار ﻣـﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺷﻤﺎ در ﻃﺮاﺣﻲ راﺣﺖ و ﺳﺮﻳﻊ راﺑﻄﻬﺎي ﻛﺎرﺑﺮي ﻛﻤﻚ ﺑﺴﻴﺎري ﻛﻨﺪ .ﺑﻪ ﻛﻤﻚ ﭘﻨﺠﺮه Propertiesﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺖ ﻫﺎي ﻛﻨﺘﺮل ﻫـﺎي ﻓـﺮم ﺧـﻮد را ﺑـﻪ راﺣﺘـﻲ ﺗﻐﻴﻴـﺮ داده و ﺑـﻪ ﺻـﻮرت دﻟﺨـﻮاه ﺗﻨﻈـﻴﻢ ﻛﻨﻴـﺪ .ﺑـﻪ ﻛﻤـﻚ ﭘﻨﺠـﺮه Solution Explorerﺗﻮاﻧﺴﺘﻴﺪ ﻧﻤﺎي درﺧﺘﻲ ﺗﻤﺎم ﻓﺎﻳﻠﻬﺎي ﺗﺸﻜﻴﻞ دﻫﻨﺪه ي ﭘﺮوژه را ﻣﺸﺎﻫﺪه ﻛﻨﻴـﺪ .ﺣﺘـﻲ در اﻳـﻦ ﺑﺨـﺶ ﻣﻘـﺪاري ﻛـﺪ ﻧﻮﺷﺘﻴﺪ. در ﻓﺼﻠﻬﺎي ﺑﻌﺪي ﺑﺎ ﺟﺰﻳﻴﺎت ﺑﻴﺸﺘﺮي درﮔﻴﺮ ﻣﻲ ﺷﻮﻳﺪ و ﺑﻴﺸﺘﺮ ﺑﻪ ﻛﺪ ﻧﻮﻳﺴﻲ ﻋﺎدت ﻣﻲ ﻛﻨﻴـﺪ .ﻗﺒـﻞ از اﻳﻨﻜـﻪ زﻳـﺎد وارد وﻳـﮋوال C# 2005ﺑﺸﻮﻳﻢ ،در ﻓﺼﻞ ﺑﻌﺪ ﭼﺎرﭼﻮب .NETرا ﻣﻌﺮﻓﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. در ﭘﺎﻳﺎن ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ ﻣﺠﺘﻤﻊ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻳﺎ IDE اﺿﺎﻓﻪ ﻛﺮدن ﻛﻨﺘﺮل ﺑﻪ ﻓﺮم در ﺣﺎﻟﺖ ﻃﺮاﺣﻲ ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل ﻫﺎي روي ﻓﺮم اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ ﺑﻪ ﻛﻨﺘﺮل ﻫﺎ در ﭘﻨﺠﺮه ي ﻛﺪ
ﺗﻤﺮﻳﻦ: ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﻛﻨﺘﺮل TextBoxو ﻳﻚ Buttonﺑﺎﺷﺪ .ﺑﺎ ﻓﺸﺎر داده ﺷﺪن دﻛﻤﻪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ،ﻣﺘﻨﻲ ﻛﻪ در TextBoxﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد. ﻧﻜﺘﻪ :ﭘﺎﺳﺦ اﻳﻦ ﺗﻤﺮﻳﻦ و دﻳﮕﺮ ﺗﻤﺮﻳﻦ ﻫﺎ ،در اﻧﺘﻬﺎي ﻛﺘﺎب در ﺿﻤﻴﻤﻪ ي 5آورده ﺷﺪه اﺳﺖ.
٤٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ دوم :ﭼﺎرﭼﻮب .NETو ارﺗﺒﺎط آن ﺑﺎ C# در ﻓﺼﻞ ﻗﺒﻞ ﻣﻘﺪاري ﺑﺎ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ C#و ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ آﺷﻨﺎ ﺷﺪﻳﻢ .اﻣﺎ ﺑﻬﺘﺮ اﺳﺖ ﻗﺒﻞ از اﻳﻨﻜﻪ درﮔﻴﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎ اﻳﻦ زﺑﺎن و ﻛﺎر ﺑﺎ اﻳﻦ ﻣﺤﻴﻂ ﺷﻮﻳﻢ ،ﻣﻘﺪاري در راﺑﻄﻪ ﺑﺎ ﭼﺎرﭼﻮب 1.NETو ارﺗﺒﺎط آن ﺑﺎ وﻳﮋوال اﺳﺘﻮدﻳﻮ و C#ﺻﺤﺒﺖ ﻛﻨﻴﻢ. در اﻳﻦ ﻓﺼﻞ اﺑﺘﺪا ﻧﮕﺎﻫﻲ ﻛﻠﻲ ﺑﻪ ﺗﻜﻨﻮﻟﻮژي .NETﺧﻮاﻫﻴﻢ داﺷﺖ و ﺑﻌﺪ از ﻣﻌﺮﻓﻲ اﺟﺰاي آن ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ارﺗﺒﺎط آﻧﻬﺎ را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺷﺮح دﻫﻴﻢ .NET .ﻫﻨﻮز ﻳﻚ ﺗﻜﻨﻮﻟﻮژي ﺟﺪﻳﺪ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد و داراي ﻣﺒﺎﺣﺚ ﻓﻨﻲ زﻳﺎدي اﺳﺖ ﻛﻪ ﻓﺮاﮔﻴﺮي آﻧﻬـﺎ در اﺑﺘـﺪا ﻛﻤـﻲ ﻣﺸﻜﻞ ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ .ﻣﺸﻜﻞ ﺑﻮدن آن ﻧﻴﺰ ﺑﻪ اﻳﻦ ﻋﻠﺖ اﺳﺖ ﻛﻪ .NETﻳﻚ ﭼﺎرﭼﻮب ﻳﺎ ﻓﺮﻳﻢ ورك اﺳﺖ و ﻳﻚ ﻓﺮﻳﻢ ورك ،راه و روش ﺟﺪﻳﺪي را ﺑﺮاي ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ﻧﺮم اﻓﺰار اراﺋﻪ ﻣﻲ دﻫﺪ .در ﻃﻮل اﻳﻦ ﻓﺼﻞ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﻣﻔﺎﻫﻴﻢ ﺟﺪﻳﺪ اراﺋﻪ ﺷﺪه در .NET را ﺑﻪ ﻃﻮر ﺧﻼﺻﻪ و اﺟﻤﺎﻟﻲ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ. در اﻳﻦ ﻓﺼﻞ:
ﭼﺎرﭼﻮب .NETﭼﻴﺴﺖ؟ ﭼﺎرﭼﻮب .NETﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ و ﭼﻪ ﭼﻴﺰي ﺑﺎﻋﺚ ﺷﺪه اﺳﺖ ﻛﻪ ﺑﻪ ﻳﻚ ﻓﺮﻳﻢ ورك ﭘﺮﻃﺮﻓﺪار ﺗﺒﺪﻳﻞ ﺷﻮد؟ ﺑﺎ زﺑﺎن C#ﭼﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ را ﻣﻲ ﺗﻮان ﻧﻮﺷﺖ؟
ﭼﺎرﭼﻮب .NETﭼﻴﺴﺖ؟ ﻗﺒﻞ از ﻫﺮ ﭼﻴﺰ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺗﻌﺮﻳﻒ دﻗﻴﻘﻲ از ﻛﻠﻤﺎت ﻓﺮﻳﻢ ورك ﻳﺎ ﭼﺎرﭼﻮب و ﻫﻤﭽﻨﻴﻦ ﭘﻠﺘﻔﺮم اراﺋﻪ دﻫﻴﻢ. در ﺗﻌﺮﻳﻒ .NETﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ ﻛﻪ" :ﭼﺎرﭼﻮب .NETﻳﻚ ﭘﻠﺘﻔﺮم ﺟﺪﻳﺪ اﺳﺖ ﻛﻪ ﺗﻮﺳﻂ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮاي ﻃﺮاﺣﻲ و ﺗﻮﺳـﻌﻪ ﻧﺮم اﻓﺰار اﻳﺠﺎد ﺷﺪه اﺳﺖ". ﻧﻜﺘﻪ ﺟﺎﻟﺒﻲ ﻛﻪ در اﻳﻦ ﺗﻌﺮﻳﻒ وﺟﻮد دارد اﺑﻬﺎم زﻳﺎدي اﺳﺖ ﻛﻪ در اﻳﻦ ﺗﻌﺮﻳﻒ ﺑﻪ ﻛﺎر ﺑﺮده ام ،اﻣﺎ ﺑﺮاي اﻳﻦ ﻛﺎر دﻟﻴﻞ ﺧـﻮﺑﻲ وﺟـﻮد دارد. ﺑﺮاي ﺷﺮوع ،ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﺗﻌﺮﻳﻒ ﻧﮕﻔﺘﻪ ام "ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ﻧﺮم اﻓﺰار ﺑـﺮاي ﺳﻴـﺴﺘﻢ ﻋﺎﻣـﻞ وﻳﻨـﺪوز ".اﮔﺮﭼـﻪ ﻣﺎﻳﻜﺮوﺳـﺎﻓﺖ ﭼﺎرﭼﻮب .NETرا ﺑﺮاي اﺟﺮا ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ وﻳﻨﺪوز ﻣﻨﺘﺸﺮ ﻛﺮده اﺳﺖ ،ﺑـﻪ زودي ﻧـﺴﺨﻪ ﻫـﺎي دﻳﮕـﺮي از اﻳـﻦ ﭼـﺎرﭼﻮب را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎي دﻳﮕﺮ ﻣﺎﻧﻨﺪ ﻟﻴﻨﻮﻛﺲ ﻧﻴﺰ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﻳﻜﻲ از اﻳﻦ ﻧﺴﺨﻪ ﻫـﺎ ﻣﻮﻧـﻮ 2اﺳـﺖ .ﻣﻮﻧـﻮ ﻳﻚ ﻧﺴﺨﻪ ﻣﺘﻦ ﺑﺎز از ﭼﺎرﭼﻮب .NETاﺳﺖ )ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﻛﺎﻣﭙﺎﻳﻠﺮ C#ﻧﻴﺰ ﻫﺴﺖ( ﻛﻪ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎي ﮔﻮﻧـﺎﮔﻮﻧﻲ ﻣﺎﻧﻨـﺪ ﻧﺴﺨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﻟﻴﻨﻮﻛﺲ و ﻣﻜﻴﻨﺘﺎش ﻣﻨﺘﺸﺮ ﺷﺪه اﺳﺖ .ﭘﺮوژه ﻫﺎي ﺑﺴﻴﺎر دﻳﮕﺮي ﻣﺸﺎﺑﻪ ﻣﻮﻧﻮ در ﺣﺎل اﺟﺮا ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻤﻜﻦ اﺳـﺖ ﻫﻨﮕﺎم اﻧﺘﺸﺎر اﻳﻦ ﻛﺘﺎب در اﺧﺘﻴﺎر ﺷﻤﺎ ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﺎﺷﻨﺪ .ﺑﻪ ﻋـﻼوه ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﻧـﺴﺨﻪ ﻓـﺸﺮده اﻳـﻦ ﭼـﺎرﭼﻮب ﺑـﻪ ﻧـﺎم Microsoft .NET Compact Frameworkﻛﻪ زﻳﺮ ﻣﺠﻤﻮﻋﻪ اي از ﭼﺎرﭼﻮب .NETاﺳﺖ ﺑﺮاي وﺳـﺎﻳﻞ ﻫﻮﺷﻤﻨﺪ ﻣﺎﻧﻨﺪ دﺳﺘﻴﺎر دﻳﺠﻴﺘﺎل ﺷﺨﺼﻲ 3و ﻳﺎ ﻣﻮﺑﺎﻳﻞ ﻫﺎ ﻧﻴﺰ ﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﺪ )ﺑﺎ اﻳﻦ ﭼﺎرﭼﻮب در ﻓﺼﻞ ﺑﻴﺴﺖ و دوم ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧـﻮاﻫﻴﻢ ﺷﺪ(. اﮔﺮ ﺑﻪ ﺗﻌﺮﻳﻔﻲ ﻛﻪ در ﺑﺎﻻ ﺑﺮاي ﭼﺎرﭼﻮب .NETآورده ﺷﺪه اﺳﺖ دﻗﺖ ﻛﻨﻴﺪ ،ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﺗﻌﺮﻳﻒ ﻣﺤﺪود ﺑﻪ ﻧﻮع ﺧﺎﺻـﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻧﻴﺴﺖ .در ﺣﻘﻴﻘﺖ در ﻣﻮرد ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮان ﺑﺎ .NETﻧﻮﺷﺖ ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ وﺟﻮد ﻧﺪارد ﻛﻪ ﺑﺨﻮاﻫﻴﻢ آن را 1
.NET Framework Mono 3 )Personal Digital Assistant (PDA 2
٤٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ذﻛﺮ ﻛﻨﻴﻢ .از ﭼﺎرﭼﻮب .NETﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮاي ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وﻳﻨﺪوز ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب ،ﺳﺮوﻳﺴﻬﺎي ﻣﺒﺘﻨﻲ ﺑـﺮ وب و ...اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﭼﺎرﭼﻮب .NETﻳﻚ ﭼﺎرﭼﻮب ﻛﻠﻲ اﺳﺖ و ﻣﺤﺪود ﺑﻪ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺧﺎﺻﻲ ﻧﻴﺴﺖ .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴـﺪ ﺑﺮﻧﺎﻣـﻪ ﺧﻮدﺗـﺎن را ﺑـﻪ ﻫـﺮ زﺑﺎﻧﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﻨﻮﻳﺴﻴﺪ .در اﻳﻦ ﻛﺘﺎب ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ زﺑﺎن C#را ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ ،اﻣﺎ ﻋﻼوه ﺑﺮ اﻳﻦ زﺑﺎن ﻣﻲ ﺗﻮاﻧﻴﺪ از زﺑﺎﻧﻬـﺎﻳﻲ ﻣﺎﻧﻨﺪ ،C++وﻳﮋوال ﺑﻴﺴﻴﻚ ،ﺟﺎوا و ﺣﺘﻲ زﺑﺎﻧﻬﺎي ﻗﺪﻳﻤﻲ ﻣﺎﻧﻨﺪ COBOLﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴـﺪ .ﺑـﺮاي ﻫـﺮ ﻛـﺪام از اﻳـﻦ زﺑﺎﻧﻬـﺎ ﻳـﻚ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺧﺎص .NETاراﺋﻪ ﻣﻲ ﺷﻮد .ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻪ اﻳﻦ زﺑﺎﻧﻬﺎ ﻧﻪ ﺗﻨﻬـﺎ ﻣـﻲ ﺗﻮاﻧﻨـﺪ ﺑـﺎ ﭼـﺎرﭼﻮب .NETارﺗﺒﺎط داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،ﺑﻠﻜﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻛﻪ ﺗﺤﺖ .NETﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ﻧﻴﺰ ارﺗﺒﺎط داﺷـﺘﻪ ﺑﺎﺷـﻨﺪ. ﺑﺮاي ﻣﺜﺎل ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺑﻪ زﺑﺎن C#ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﺑﻪ راﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﺪ از ﻛﺪي اﺳﺘﻔﺎده ﻛﻨﺪ ﻛﻪ ﺑﻪ زﺑﺎن وﻳـﮋوال ﺑﻴـﺴﻴﻚ ﻧﻮﺷـﺘﻪ ﺷﺪه اﺳﺖ و ﻳﺎ ﺑﺮﻋﻜﺲ. ﻣﻮاردي ﻛﻪ ﺗﺎ ﻛﻨﻮن ﮔﻔﺘﻴﻢ ﺳﻄﺢ ﺑﺎﻻي ﺗﻨﻮع در .NETرا ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ .اﻳﻦ ﺗﻨـﻮع ﻳﻜـﻲ از دﻻﻳﻠـﻲ اﺳـﺖ ﻛـﻪ ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮد ﭼﺎرﭼﻮب .NETﭼﻨﻴﻦ دورﻧﻤﺎي ﺟﺬاﺑﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. ﭘﺲ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ .NETﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ،ﻳﻚ ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ وﻳﻨﺪوز ،ﻳﻚ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﺧﺎص ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ وﻳﻨﺪوز و ﻳﺎ ﻣﻮاردي از اﻳﻦ ﻗﺒﻴﻞ ﻧﻴﺴﺖ .ﺑﻠﻜﻪ .NETﻳـﻚ روش ﺑـﺮاي ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ي ﻧﺮم اﻓﺰار اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻣﻌﺮﻓﻲ ﺷﺪه اﺳﺖ و ﻣﻲ ﺗﻮاﻧﺪ در ﺗﻤﺎﻣﻲ ﻣﻮاردي ﻛﻪ در ﺑﺎﻻ ذﻛـﺮ ﺷـﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد.
ﭼﺎرﭼﻮب .NETاز ﭼﻪ اﺟﺰاﻳﻲ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ؟ ﻳﻜﻲ از اﺟﺮاي اﺻﻠﻲ ﭼﺎرﭼﻮب .NETﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس ﻋﻈﻴﻢ آن اﺳﺖ ﻛﻪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ از آن در ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﺧـﻮد اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ. ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس 1ﻳﻚ ﻣﺠﻤﻮﻋﻪ از ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎ اﺳﺖ ﻛﻪ ﺑﺮاي اﻧﺠﺎم اﻣﻮر ﻣﺨﺘﻠﻒ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺑـﺮاي ﻣﺜـﺎل ﻳـﻚ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس ،ﺷﺎﻣﻞ ﺗﻮاﺑﻌﻲ ﺑﺮاي ﻛﻨﺘﺮل ورودي و ﺧﺮوﺟﻲ ،اﺳﺘﻔﺎده از اﻣﻜﺎﻧﺎت ﭼﺎپ ،ﻛﺎر ﺑﺎ اﻧﻮاع ﻣﺨﺘﻠﻒ ﺷﺒﻜﻪ ﻫﺎ و ...اﺳـﺖ .اﻳـﻦ ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺗﻜﻨﻴﻜﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ،2در .NETﺑـﻪ ﮔـﺮوه ﻫـﺎ و ﻳـﺎ ﻓـﻀﺎي ﻧﺎﻣﻬـﺎي ﻣﺨﺘﻠﻔﻲ دﺳﺘﻪ ﺑﻨﺪي ﻣﻲ ﺷﻮﻧﺪ .ﺑﺎ ﻣﻔﻬﻮم ﻓﻀﺎي ﻧﺎم در ﻓﺼﻞ 9ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. در ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻫﺮ ﻛﺪام از ﻓﻀﺎي ﻧﺎﻣﻬﺎ را ﻛﻪ ﻧﻴﺎز داﺷﺘﻴﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻳﻜﻲ از اﻳﻦ ﻓـﻀﺎي ﻧﺎﻣﻬـﺎ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ وﻳﻨﺪوز ﺑﻪ ﻛﺎر ﻣﻲ رود ،ﻳﻜﻲ دﻳﮕﺮ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﺒﻜﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ،ﻓﻀﺎي ﻧﺎم دﻳﮕـﺮي ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ وب ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻌﻀﻲ از اﻳﻦ ﻓﻀﺎي ﻧﺎﻣﻬﺎ ﺧﻮد ﺑﻪ ﻓﻀﺎي ﻧﺎﻣﻬﺎي ﻛﻮﭼﻜﺘﺮي ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮﻧﺪ ﻛـﻪ ﺑـﺮاي ﻛﺎرﺑﺮد ﺧﺎﺻﻲ در آن ﻗﺴﻤﺖ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﻀﺎي ﻧﺎم ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ وب ﺷﺎﻣﻞ ﻳﻚ ﻓﻀﺎي ﻧﺎم ﻛﻮﭼﻜﺘﺮ اﺳﺖ ﻛـﻪ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺳﺮوﻳﺴﻬﺎي ﺗﺤﺖ وب ﺑﻪ ﻛﺎر ﻣﻲ رود. ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺗﻤﺎم ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎ ،ﻫﻤﻪ ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در اﻳﻦ ﻓﻀﺎي ﻧﺎﻣﻬﺎ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻳﻚ دﺳـﺘﻴﺎر دﻳﺠﻴﺘﺎل ﺷﺨﺼﻲ از ﺗﻮاﺑﻊ اﺻﻠﻲ ﭼﺎرﭼﻮب .NETﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ ،اﻣﺎ ﻳﻚ ﺳﺮي از ﺗﻮاﺑﻊ ﻛﻪ در اﻳـﻦ وﺳـﺎﻳﻞ ﻛـﺎرﺑﺮدي ﻧـﺪارد ﺑـﻪ وﺳﻴﻠﻪ آﻧﻬﺎ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﺷﻮد. ﺑﺨﺶ دﻳﮕﺮي از ﭼﺎرﭼﻮب ،.NETﻳﻚ ﺳﺮي ﻧﻮع ﻫﺎي داده اي اﺑﺘـﺪاﻳﻲ را ﺗﻌﺮﻳـﻒ ﻣـﻲ ﻛﻨـﺪ .ﻧـﻮع ﻫـﺎي داده اي ﺑـﺮاي ﻧﮕﻬـﺪاري اﻃﻼﻋﺎت ﻳﻚ ﺑﺮﻧﺎﻣﻪ در ﻃﻮل اﺟﺮاي آن ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﻧﻮع ﻫﺎي داده اي ﻛﻪ در اﻳـﻦ ﻗـﺴﻤﺖ از .NETﺗﻌﺮﻳـﻒ ﻣـﻲ ﺷﻮﻧﺪ ﺑﻪ ﺻﻮرت ﺑﺴﻴﺎر ﭘﺎﻳﻪ اي ﻫﺴﺘﻨﺪ )ﻣﺎﻧﻨﺪ "ﻋﺪد ﺻﺤﻴﺢ ﻋﻼﻣﺖ دار 32ﺑﻴﺘﻲ"( .ﻧﻮع ﻫﺎي داده اي ﭘﻴـﺸﺮﻓﺘﻪ ﺗـﺮي ﻛـﻪ در زﺑﺎﻧﻬـﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺒﺘﻨﻲ ﺑﺮ .NETﻣﺎﻧﻨﺪ C#و ﻳﺎ وﻳﮋوال ﺑﻴﺴﻴﻚ وﺟﻮد دارﻧﺪ ﺑﺎﻳﺪ ﺑﺮ اﺳﺎس ﻳﻜﻲ از اﻳﻦ ﻧﻮع ﻫﺎي داده اي ﺗﻌﺮﻳﻒ ﺷـﺪه Class Library
1
2ﺑﺎ اﻳﻦ ﺗﻜﻨﻴﻚ ﻫﺎ در ﻓﺼﻮل 9و 10آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
٤٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﻗﺴﻤﺖ از ﭼﺎرﭼﻮب .NETﺑﺎﺷﻨﺪ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ ﻫﻤﺎﻫﻨﮕﻲ ﺑﻴﻦ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻲ ﺷـﻮد ﻛـﻪ از ﭼـﺎرﭼﻮب .NET اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .اﻳﻦ ﻗﺴﻤﺖ از ﭼﺎرﭼﻮب ،.NETﺳﻴﺴﺘﻢ ﻧﻮع داده اي ﻋﻤﻮﻣﻲ و ﻳﺎ ﺑﻪ اﺧﺘﺼﺎر 1CTSﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد .ﺑﺎ ﻧﻮع ﻫـﺎي داده اي در ﻓﺼﻞ ﺑﻌﺪ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. 2 ﻋﻼوه ﺑﺮ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼﺳﻲ ﻛﻪ ذﻛﺮ ﺷﺪ ،ﭼﺎرﭼﻮب .NETﺷﺎﻣﻞ ﺑﺨﺸﻲ ﺑﻪ ﻧﺎم زﺑﺎن ﻋﻤﻮﻣﻲ زﻣﺎن اﺟﺮا و ﻳﺎ ﺑﻪ اﺧﺘﺼﺎر CLRاﺳـﺖ. اﻳﻦ ﺑﺨﺶ از ﭼﺎرﭼﻮب ) .NETﻛﻪ ﻣﻬﻤﺘﺮﻳﻦ ﺑﺨﺶ آن ﻧﻴﺰ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد( ﻣﺴﺌﻮل ﻛﻨﺘﺮل و ﻣﺪﻳﺮﻳﺖ اﺟﺮاي ﺗﻤـﺎم ﺑﺮﻧﺎﻣـﻪ ﻫـﺎﻳﻲ اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس .NETﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ.3
ﭼﮕﻮﻧﻪ ﺑﺎ اﺳﺘﻔﺎده از ﭼﺎرﭼﻮب .NETﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﻢ؟ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از ﭼﺎرﭼﻮب .NETﺑﻪ ﻣﻌﻨﻲ ﻧﻮﺷﺘﻦ ﻛﺪ ﺑﻪ ﻫﺮ ﻛﺪام از زﺑﺎﻧﻬﺎﻳﻲ ﻛﻪ ﺗﻮﺳﻂ .NETﭘﺸﺘﻴﺒﺎﻧﻲ ﻣـﻲ ﺷـﻮﻧﺪ ،ﺑـﺎ اﺳﺘﻔﺎده از ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس .NETاﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ در ﻃﻮل اﻳﻦ ﻛﺘﺎب از ﻣﺤﻴﻂ ﻃﺮاﺣﻲ ﻣﺠﺘﻤـﻊ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ )(IDE ﺑﺮاي ﻃﺮاﺣﻲ و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﻣﺰﻳﺖ اﺳﺘﻔﺎده از اﻳﻦ ﻣﺤﻴﻂ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑـﻪ راﺣﺘـﻲ از وﻳﮋﮔﻴﻬـﺎﻳﻲ ﻛـﻪ در ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ از ﭼﺎرﭼﻮب .NETﻣﻌﺮﻓﻲ ﻛﺮدﻳﻢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻛﺪي ﻛﻪ ﺷﻤﺎ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ در ﻃﻮل اﻳﻦ ﻛﺘﺎب اﺳﺘﻔﺎده ﻣـﻲ ﻛﻨﻴﺪ ﻛﻼً ﺑﻪ زﺑﺎن C#اﺳﺖ ،اﻣﺎ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﻫﺎ از ﭼﺎرﭼﻮب .NETو ﻫﻤﭽﻨﻴﻦ از ﻳﻚ ﺳﺮي وﻳﮋﮔﻲ ﻫـﺎ و اﺑﺰارﻫـﺎﻳﻲ ﻛـﻪ ﻣﺤـﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ در اﺧﺘﻴﺎر ﻣﺎ ﻗﺮار ﻣﻲ دﻫﺪ اﺳﺘﻔﺎده ﺧﻮاﻫﻴﻢ ﻛﺮد. ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺑﻪ زﺑﺎن C#ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﻗﺒﻞ از اﺟﺮا ﺑﺎﻳﺪ ﺑﻪ ﻛﺪي ﺗﺒﺪﻳﻞ ﺷﻮد ﻛﻪ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﻛـﺪ، ﻛﺪ ﻣﺤﻠﻲ 4ﻣﻲ ﮔﻮﻳﻨﺪ .ﺗﺒﺪﻳﻞ ﻳﻚ ﻛﺪ از ﻫﺮ زﺑﺎﻧﻲ ﺑﻪ ﻛﺪ ﻣﺤﻠﻲ ﻛﻪ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺎﺷﺪ را ﻛﺎﻣﭙﺎﻳﻞ ﻛﺮدن ﻣﻲ ﮔﻮﻳﻨـﺪ و ﻋﻤﻠﻲ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻧﺠﺎم ﻣﻲ ﺷﻮد .در ﭼﺎرﭼﻮب .NETاﻳﻦ ﺑﺨﺶ از دو ﻣﺮﺣﻠﻪ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ.
MSILو :JIT ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ در آن از ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس .NETاﺳﺘﻔﺎده ﺷﺪه اﺳﺖ را ﻛﺎﻣﭙﺎﻳﻞ ﻣـﻲ ﻛﻨﻴـﺪ ،ﺑﻼﻓﺎﺻـﻠﻪ ﻛـﺪ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ و ﻳﺎ ﻛﺪ ﻣﺤﻠﻲ ﺗﻮﻟﻴﺪ ﻧﻤﻲ ﺷﻮد .در ﻋﻮض ﻛﺪ ﺷﻤﺎ ﺑﻪ زﺑﺎﻧﻲ ﺑﻪ ﻧﺎم زﺑﺎن ﺳﻄﺢ ﻣﻴﺎﻧﻲ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ و ﻳﺎ ﺑـﻪ اﺧﺘﺼﺎر 5MSILﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد .اﻳﻦ ﻛﺪ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺧﺎﺻﻲ ﻧﻴﺴﺖ و ﻫﻤﭽﻨﻴﻦ ﻣﻨﺤﺼﺮ ﺑﻪ زﺑﺎن C#ﻧﻴﺰ ﻧﻴـﺴﺖ .ﺑـﻪ ﻋﺒـﺎرت دﻳﮕﺮ ﻛﺪ زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ MSILﺗﺒﺪﻳﻞ ﺷﻮد )و اﻟﺒﺘﻪ ﺑﺎﻳﺪ ﺗﺒﺪﻳﻞ ﺷـﻮﻧﺪ( .ﻛـﺪﻫﺎي زﺑﺎﻧﻬـﺎي دﻳﮕـﺮي ﻛـﻪ از ﭼـﺎرﭼﻮب .NETاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻧﻴﺰ )ﻣﺎﻧﻨﺪ وﻳﮋوال ﺑﻴﺴﻴﻚ( ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ اﺑﺘﺪا ﺑﻪ زﺑﺎن MSILﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ .ﻫﻨﮕﺎم اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ،اﻳﻦ ﻣﺮﺣﻠﻪ از ﻛﺎﻣﭙﺎﻳﻞ ﺗﻮﺳﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻧﺠﺎم ﻣﻲ ﺷﻮد. اﻣﺎ ﺑﺮاي اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﻮﺳﻂ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻳﻚ ﻣﺮﺣﻠﻪ دﻳﮕﺮ ﻧﻴﺰ ﻣﻮرد ﻧﻴﺎز اﺳﺖ .اﻳﻦ ﻣﺮﺣﻠﻪ وﻇﻴﻔﻪ ي ﻛﺎﻣﭙـﺎﻳﻠﺮ Just-In- Timeو ﻳﺎ ﺑﻪ اﺧﺘﺼﺎر JITﻛﺎﻣﭙﺎﻳﻠﺮ اﺳﺖ .اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻛﺪ MSILﻳﻚ ﺑﺮﻧﺎﻣﻪ را درﻳﺎﻓﺖ ﻛﺮده و آن را ﺑﻪ ﻛﺪي ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻗﺎﺑﻞ اﺟﺮا ﺑﺎﺷﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ اﻳﻦ ﺗﺒﺪﻳﻞ ﺗﻮﺳﻂ JITاﻧﺠﺎم ﺷﺪ ،ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨـﺪ.
1
Common Type System Common Language Runtime 3اﻳﻦ ﻣﻔﺎﻫﻴﻢ ﺑﻪ ﺗﻔﺼﻴﻞ و ﺑﺎ ذﻛﺮ ﺟﺰﺋﻴﺎت ،در ﺿﻤﻴﻤﻪ ي 2ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ .اﻟﺒﺘﻪ ﻣﻄﺎﻟﻌﻪ ي ﻣﻄﺎﻟﺐ آن ﺿﻤﻴﻤﻪ ﻣﻤﻜـﻦ اﺳـﺖ ﺑـﺮاي ﺑـﺎر اول ﻣﻘـﺪاري ﻣﺸﻜﻞ ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ. 4 Native Code 5 Microsoft Intermediate Language 2
٤٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﺎﻧﻄﻮر ﻛﻪ از اﺳﻢ اﻳﻦ ﻗﺴﻤﺖ ﻧﻴﺰ ﻣﺸﺨﺺ اﺳﺖ ) (Just-In-Timeﻛﺪﻫﺎي زﺑﺎن MSILﻓﻘﻂ ﻫﻨﮕﺎﻣﻲ ﺑﻪ زﺑﺎن ﻣﺤﻠﻲ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ ،ﻛﻪ ﺑﺨﻮاﻫﻨﺪ اﺟﺮا ﺷﻮﻧﺪ. در ﮔﺬﺷﺘﻪ ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎي ﻣﺨﺘﻠﻒ اﺟﺮا ﻛﻨﻴﺪ ﻧﻴﺎز داﺷﺘﻴﺪ ﻛﻪ ﺑـﺮاي ﻫـﺮ ﻧـﺴﺨﻪ از ﺳﻴـﺴﺘﻢ ﻋﺎﻣﻞ ،آن ﻛﺪ را ﻳﻚ ﻣﺮﺗﺒﻪ ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ ﻛﺎﻣﭙﺎﻳﻞ ﻛﻨﻴﺪ .اﻣﺎ در ﭼﺎرﭼﻮب .NETﻧﻴﺎزي ﺑﻪ اﻳﻦ ﻛﺎر ﻧﻴﺴﺖ .زﻳﺮا ﺑﺮاي ﻫﺮ ﻧﻮع ﭘﺮدازﻧﺪه و ﻧﻴﺰ ﻫﺮ ﻧﻮع ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻳﻚ ﻧﺴﺨﻪ از JITوﺟﻮد دارد .ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ در ﻫﺮ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﻛﻪ اﺟﺮا ﺷﻮد ،ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻣﻮﺟﻮد در آن ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ،ﻛﺪ MSILﺑﺮﻧﺎﻣﻪ ي ﺷﻤﺎ را ﻛﻪ ﻣﺴﺘﻘﻞ از ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ و ﻧﻮع ﭘﺮدازﻧﺪه اﺳﺖ درﻳﺎﻓﺖ ﻛﺮده و ﻛﺪ ﻣﺤﻠﻲ ﻣﻨﺎﺳﺒﻲ ﺗﻮﻟﻴـﺪ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺎﺷﺪ. ﻓﺎﻳﺪه اﺳﺘﻔﺎده از اﻳﻦ روش در اﻳﻦ اﺳﺖ ﻛﻪ وﻇﻴﻔﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ را ﺑﻪ ﺷﺪت ﻛﺎﻫﺶ ﻣﻲ دﻫﺪ .در ﺣﻘﻴﻘﺖ ﻣﻲ ﺗﻮان ﮔﻔﺖ ﻛﻪ ﺑـﻪ ﻋﻨـﻮان ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ،ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﻛﻪ ﻗﺮار اﺳﺖ ﺑﺮﻧﺎﻣﻪ روي آن اﺟﺮا ﺷﻮد را ﻓﺮاﻣﻮش ﻛـﺮده و ﻓﻜـﺮ ﺧـﻮد را ﺑـﺮ روي ﻛﺪ و ﻣﻨﻄﻖ ﺑﺮﻧﺎﻣﻪ ﻣﺘﻤﺮﻛﺰ ﻛﻨﻴﺪ.
اﺳﻤﺒﻠﻲ ﻫﺎ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﻛﻨﻴﺪ ،ﻛﺪ MSILﺗﻮﻟﻴﺪ ﺷﺪه در ﻓﺎﻳﻠﻬﺎﻳﻲ ﺑﻪ ﻧﺎم اﺳﻤﺒﻠﻲ 1ذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪ .ﻓﺎﻳﻠﻬﺎي اﺳـﻤﺒﻠﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺷﺎﻣﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﺑﺪون ﻧﻴﺎز ﺑﻪ ﺑﺮﻧﺎﻣﻪ اي دﻳﮕﺮ ﺑﺘﻮاﻧﻨﺪ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺟﺮا ﺷﻮﻧﺪ )اﻳـﻦ ﮔﻮﻧـﻪ ﻓﺎﻳﻠﻬـﺎ داراي ﭘﺴﻮﻧﺪ .exeﻫﺴﺘﻨﺪ( و ﻳﺎ ﺷﺎﻣﻞ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎﻳﻲ از ﻛﻼﺳﻬﺎ و ﺗﻮاﺑﻊ ﺑﺮاي اﺳﺘﻔﺎده در دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﺎﺷﻨﺪ )اﻳـﻦ ﮔﻮﻧـﻪ ﻓﺎﻳﻠﻬـﺎ داراي ﭘﺴﻮﻧﺪ .dllﻫﺴﺘﻨﺪ(. 2 ﻓﺎﻳﻠﻬﺎي اﺳﻤﺒﻠﻲ ﻋﻼوه ﺑﺮ ﻛﺪﻫﺎي ،MSILﺷﺎﻣﻞ اﻃﻼﻋﺎت ﻣﺘﺎ )اﻃﻼﻋﺎﺗﻲ راﺟﻊ ﺑﻪ اﻃﻼﻋـﺎت ذﺧﻴـﺮه ﺷـﺪه در ﻓﺎﻳـﻞ اﺳـﻤﺒﻠﻲ( و ﻫﻤﭽﻨﻴﻦ ﻣﻨﺎﺑﻊ اﺧﺘﻴﺎري )اﻃﻼﻋﺎت اﺿﺎﻓﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺪﻫﺎي MSILاﺳﺘﻔﺎده ﻣﻲ ﺷـﻮﻧﺪ ،ﻫﻤﺎﻧﻨـﺪ ﻓﺎﻳﻠﻬـﺎي ﺻـﻮﺗﻲ و ﻳـﺎ ﻓﺎﻳﻠﻬـﺎي ﺗﺼﻮﻳﺮي( ﻧﻴﺰ ﻫﺴﺘﻨﺪ .اﻃﻼﻋﺎت ﻣﺘﺎ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻳﻚ ﻓﺎﻳﻞ اﺳﻤﺒﻠﻲ ﺑﺘﻮاﻧﺪ اﻃﻼﻋﺎت داﺧﻞ ﺧﻮد را ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ ﺗﻮﺻﻴﻒ ﻛﻨﺪ .ﺑـﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺮاي اﺳﺘﻔﺎده از ﻳﻚ اﺳﻤﺒﻠﻲ ﺑﻪ ﻫﻴﭻ اﻃﻼﻋﺎت و ﻳﺎ ﻛﺎرﻫﺎي اﺿﺎﻓﻲ ﻣﺎﻧﻨﺪ ﺛﺒﺖ آن در رﺟﻴﺴﺘﺮي ﺳﻴﺴﺘﻢ ﻧﻴﺎزي ﻧﺪارﻳـﺪ .ﺑـﻪ اﻳﻦ ﺗﺮﺗﻴﺐ از ﻣﺸﻜﻼﺗﻲ ﻛﻪ ﻋﻤﻮﻣﺎً ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ اﻳﻦ ﻧﻮع ﻓﺎﻳﻠﻬﺎ در ﻣﺤﻴﻄﻬﺎي دﻳﮕﺮ ﺑﻪ وﺟﻮد ﻣﻲ آﻣﺪ ﻧﻴﺰ ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﺷﻮد. ﻳﻜﻲ دﻳﮕﺮ از ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻣﻮرد در اﻳﻦ اﺳﺖ ﻛﻪ ﺗﻮزﻳﻊ ﻳﻚ ﻧﺮم اﻓﺰار ﺑﻪ ﺳﺎدﮔﻲ ﻛﭙﻲ ﻛﺮدن ﺗﻤﺎم ﻓﺎﻳﻠﻬﺎي آن ﺑﺮ روي ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ اﺳﺖ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﺑﺮاي اﺟﺮاي ﻳﻚ ﻓﺎﻳﻞ اﺳﻤﺒﻠﻲ ﺑﻪ ﻫﻴﭻ ﻣﻮرد دﻳﮕﺮي ﻧﻴﺎز ﻧﻴﺴﺖ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺎدﮔﻲ ﻓﻮﻟـﺪر ﺣـﺎوي ﺑﺮﻧﺎﻣـﻪ را ﺑـﺮ روي ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﻛﭙﻲ ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي ﻓﺎﻳﻞ اﺟﺮاﻳﻲ آن ،ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و از آن اﺳﺘﻔﺎده ﻛﻨﻴـﺪ )ﺑـﺎ ﻓـﺮض اﻳﻨﻜﻪ CLRﻛﻪ ﻣﻬﻤﺘﺮﻳﻦ ﺑﺨﺶ .NETاﺳﺖ ،ﻗﺒﻼ در آن ﻛﺎﻣﭙﻴﻮﺗﺮ ﻧﺼﺐ ﺷﺪه ﺑﺎﺷﺪ( .در ﻣﻮرد ﭼﮕﻮﻧﮕﻲ ﺗﻮزﻳـﻊ ﻳـﻚ ﻧـﺮم اﻓـﺰار در ﻓﺼﻞ ﺑﻴﺴﺖ و ﻳﻜﻢ ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. اﻟﺒﺘﻪ ﻣﻤﻜﻦ اﺳﺖ در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ﺑﺨﻮاﻫﻴﺪ از ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ﻳﻚ ﻓﺎﻳﻞ ،DLLدر ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻻزم ﻧﻴـﺴﺖ ﻓﺎﻳﻞ ﻣﺬﻛﻮر را در ﻓﻮﻟﺪر ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻗﺮار دﻫﻴﺪ .ﺑﻠﻜﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﻳﻚ ﺑﺎر در ﻳﻚ ﻣﻜـﺎن ﻣـﺸﺨﺺ ﻗﺮار دﻫﻴﺪ و ﺳﭙﺲ ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﻪ ﺑﻪ آن ﻧﻴﺎز دارﻧﺪ ،از آن اﺳﺘﻔﺎده ﻛﻨﻨﺪ .در ﭼﺎرﭼﻮب .NETاﻳﻦ ﻣﻜﺎن ﻣﺸﺨﺺ ﻛﻪ ﺑـﺮاي ﻗـﺮار ﮔﺮﻓﺘﻦ ﻓﺎﻳﻠﻬﺎي اﺳﻤﺒﻠﻲ ﻋﻤﻮﻣﻲ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ Global Assembly Cache ،و ﻳﺎ GACﻧـﺎم دارد .ﺑـﺮاي اﻳﻨﻜﻪ ﻳﻚ ﻓﺎﻳﻞ اﺳﻤﺒﻠﻲ را در اﻳﻦ ﻗﺴﻤﺖ ﻗﺮار دﻫﻴﺪ ،ﻛﺎﻓﻲ اﺳﺖ ﺑﻪ ﺳﺎدﮔﻲ ﻓﺎﻳﻞ ﻣﻮرد ﻧﻈﺮ را در ﻓﻮﻟﺪر ﻣﺸﺨﺺ ﺷﺪه ﺑﺮاي GACﻛﭙﻲ ﻛﻨﻴﺪ ،زﻳﺮا ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻋﻼوه ﺑﺮ اﺳﻤﺒﻠﻲ ﻫﺎي ﺧﻮد ﺑﻪ ﻫﻤﻪ اﺳﻤﺒﻠﻲ ﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻓﻮﻟﺪر ﻧﻴﺰ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ.
1ﻣﻔﻬﻮم اﺳﻤﺒﻠﻲ در اﻳﻦ ﻛﺘﺎب ﻛﺎﻣﻼ ﺑﺎ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﻤﺒﻠﻲ ﺗﻔﺎوت دارد. Metadata
2
٤٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ﺑﺮﻧﺎﻣﻪ ي ﺷﻤﺎ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ اﺑﺘﺪا ﺑﻪ ﻛﺪ MSILﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد ،ﺳﭙﺲ اﻳﻦ ﻛﺪ ﻗﺒﻞ از اﺟﺮا ﺑﻪ وﺳـﻴﻠﻪ JITﺑـﻪ ﻛﺪ ﻣﺤﻠﻲ ﺗﺒﺪﻳﻞ ﺷﺪه و ﻛﺪ ﻣﺤﻠﻲ ﺑﻪ وﺳﻴﻠﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺟﺮا ﻣﻲ ﺷﻮد .ﺗﻤﺎم اﻳﻦ ﻗﺴﻤﺘﻬﺎ ﺑﺨﺸﻲ از وﻇﺎﻳﻒ CLRاﺳﺖ ،اﻣـﺎ وﻇـﺎﻳﻒ CLRﺑﻪ اﻳﻦ ﻣﻮارد ﺧﺘﻢ ﻧﻤﻲ ﺷﻮد .ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ .NETﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ در ﻃﻮل زﻣﺎن اﺟﺮا ﺗﻮﺳﻂ CLRﻣﺪﻳﺮﻳﺖ ﻣـﻲ ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ در ﻃﻮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺎ CLR ،.NETﻣﺴﺌﻮل ﻛﻨﺘﺮل اﻣﻨﻴﺖ آﻧﻬﺎ ،ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ، ﻛﻨﺘﺮل ﺑﺨﺸﻬﺎي ﺧﻄﺎ ﻳﺎﺑﻲ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ...اﺳﺖ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎ .NETﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣـﺪﻳﺮﻳﺖ ﺷﺪه ﻣﻲ ﮔﻮﻳﻨﺪ .در ﻣﻘﺎﺑﻞ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺗﺤﺖ ﻛﻨﺘﺮل CLRاﺟﺮا ﻧﻤﻲ ﺷﻮﻧﺪ ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﻣـﺪﻳﺮﻳﺖ ﻧـﺸﺪه 1ﻣﻌـﺮوف ﻫـﺴﺘﻨﺪ و زﺑﺎﻧﻬﺎي ﻣﺸﺨﺼﻲ ﻣﺎﻧﻨﺪ C++ﻣﻲ ﺗﻮاﻧﻨﺪ ﭼﻨﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ را ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪ .از ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﻴﺸﺘﺮ در ﻣﻮاﻗﻌﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده از ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻧﺒﺎﺷﺪ ،ﻫﻤﺎﻧﻨﺪ ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ﺳﻄﺢ ﭘﺎﻳﻴﻦ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ .اﻟﺒﺘﻪ ﺑﺎ اﺳﺘﻔﺎده از زﺑﺎن C#ﻧﻤـﻲ ﺗﻮان ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺗﻮﻟﻴﺪ ﻛﺮد و ﺗﻤﺎم ﻛﺪﻫﺎي ﺗﻮﻟﻴﺪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ C#ﺗﺤﺖ ﻛﻨﺘﺮل CLRاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ.
ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در :.NET ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ وﻳﮋﮔﻴﻬﺎي ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ،ﺑﺨﺶ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در اﻳﻦ ﻧﻮع ﻛـﺪﻫﺎ اﺳـﺖ ﻛـﻪ ﺑـﻪ وﺳـﻴﻠﻪ ﺳﻴـﺴﺘﻤﻲ ﺑـﻪ ﻧـﺎم Garbage Collectionو ﻳﺎ ﺑﻪ اﺧﺘﺼﺎر GCاﻧﺠﺎم ﻣﻲ ﺷﻮد .ﭼﺎرﭼﻮب .NETﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺳﻴـﺴﺘﻢ ﻣـﻲ ﺗﻮاﻧـﺪ اﻃﻤﻴﻨﺎن ﺣﺎﺻﻞ ﻛﻨﺪ ﻛﻪ ﺣﺎﻓﻈﻪ اي ﻛﻪ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﺧﺘﺼﺎص داده ﻣﻲ ﺷﻮد ،ﺑﺎ ﭘﺎﻳﺎن ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﻃـﻮر ﻛﺎﻣـﻞ ﺑﺎزﻳـﺎﺑﻲ ﻣـﻲ ﺷـﻮد .در زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻗﺒﻞ از ،.NETاﻳﻦ ﻣﻮرد ﺑﻪ وﺳﻴﻠﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻛﻨﺘﺮل ﻣﻲ ﺷﺪ و اﻣﻜﺎن داﺷﺖ ﻛﻪ ﺑﺎ ﻳﻚ اﺷـﺘﺒﺎه ﻛﻮﭼـﻚ در ﻛﺪ ﺑﺮﻧﺎﻣﻪ ،ﻣﻘﺪار زﻳﺎدي از ﻓﻀﺎي ﺣﺎﻓﻈﻪ ﻏﻴﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﻤﺎﻧﺪ و ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻛﻤﺒﻮد ﺣﺎﻓﻈﻪ ﻣﻮاﺟﻪ ﺷﻮد .اﻳﻦ ﮔﻮﻧﻪ ﻣﺸﻜﻼت ﺑﺎﻋﺚ ﻛﺎﻫﺶ ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﺣﺘﻲ در ﺑﻌﻀﻲ ﺷﺮاﻳﻂ ﺑﺎﻋﺚ ﺗﻮﻗﻒ ﺳﻴﺴﺘﻢ ﻣﻲ ﺷﺪ. ﻧﺤﻮه ﻛﺎر GCدر .NETﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ در زﻣﺎﻧﻬﺎي ﻣﺸﺨﺼﻲ ﺑﻪ ﺑﺮرﺳـﻲ ﺣﺎﻓﻈـﻪ ﻣـﻲ ﭘـﺮدازد و داده ﻫـﺎﻳﻲ را ﻛـﻪ دﻳﮕـﺮ اﺳﺘﻔﺎده ﻧﻤﻲ ﺷﻮﻧﺪ از ﺣﺎﻓﻈﻪ ﭘﺎك ﻣﻲ ﻛﻨﺪ .اﻟﺒﺘﻪ ﺑﺮرﺳﻲ ﺣﺎﻓﻈﻪ ﺗﻮﺳﻂ GCدر ﻓﺎﺻﻠﻪ ﻫﺎي زﻣﺎﻧﻲ ﺛﺎﺑﺖ ﺻﻮرت ﻧﻤﻲ ﮔﻴﺮد ﺑﻠﻜـﻪ ﻣﻤﻜـﻦ اﺳﺖ در ﺷﺮاﻳﻄﻲ در ﻫﺮ ﺛﺎﻧﻴﻪ ﭼﻨﺪﻳﻦ ﻫﺰار ﺑﺎر اﺟﺮا ﺷﻮد و در ﺷﺮاﻳﻂ دﻳﮕﺮ در ﻫﺮ ﭼﻨﺪ ﺛﺎﻧﻴﻪ ﻳﻚ ﺑﺎر اﺟﺮا ﺷﻮد.2
ﻣﺮاﺣﻞ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ در .NET ﻗﺒﻞ از اداﻣﻪ ،ﻣﺮاﺣﻞ ﻻزم ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎ .NETرا ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﺗﻮﺿﻴﺢ داده ﺷﺪ ﺟﻤﻊ ﺑﻨﺪي ﻣﻲ ﻛﻨﻴﻢ: (1ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﺳﻴﻠﻪ ﻳﻜﻲ از زﺑﺎﻧﻬﺎي ﺳﺎزﮔﺎر ﺑﺎ .NETﻣﺎﻧﻨﺪ C#ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد )ﺷﻜﻞ :(1-2
Unmanaged Code
1
2ﺑﺮاي آﺷﻨﺎﻳﻲ ﺑﻴﺸﺘﺮ ﺑﺎ ﺳﻴﺴﺘﻢ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در .NETﺑﻪ ﺿﻤﻴﻤﻪ ي 4ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ.
٤٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 1-1 (2اﻳﻦ ﻛﺪ ﺑﻪ زﺑﺎن MSILﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﺷﻮد و ﺳﭙﺲ در ﻳﻚ ﻓﺎﻳﻞ اﺳﻤﺒﻠﻲ ذﺧﻴﺮه ﻣﻲ ﺷﻮد )ﺷﻜﻞ :(2-2
ﺷﻜﻞ 2-2 (3ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺪ ﺑﺨﻮاﻫﺪ اﺟﺮا ﺷﻮد )ﭼﻪ ﺧﻮد ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ﺑﺎﺷﺪ و ﺑﻪ ﺗﻨﻬﺎﻳﻲ اﺟﺮا ﺷﻮد ،ﭼﻪ ﻳﻚ ﻓﺎﻳﻞ ﺣﺎوي ﺗﻮاﺑﻊ ﻣﻮرد اﺳﺘﻔﺎده ﺑﺎﺷﺪ و ﺑﻪ وﺳﻴﻠﻪ دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ اﺣﻀﺎر ﺷﻮد( اﺑﺘﺪا ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﻛﺎﻣﭙﺎﻳﻠﺮ دﻳﮕﺮ ﺑﻪ ﻛﺪ ﻣﺤﻠﻲ ﺗﺒﺪﻳﻞ ﺷﻮد .اﻳـﻦ ﻛﺎﻣﭙـﺎﻳﻠﺮ JITﻧﺎم دارد )ﺷﻜﻞ :(3-2
ﺷﻜﻞ 3-2
٤٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(4ﻛﺪ ﻣﺤﻠﻲ ﺗﻮﻟﻴﺪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ JITﺑﻪ ﻫﻤﺮاه دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي در ﺣﺎل اﺟﺮا ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ .NETﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ ،ﺗﺤﺖ ﻛﻨﺘﺮل CLRﺑﻪ اﺟﺮا در ﻣﻲ آﻳﺪ )ﺷﻜﻞ :(4-2
ﺷﻜﻞ 4-2
ﻟﻴﻨﻚ دادن: در ﺗﻜﻤﻴﻞ ﮔﻔﺘﻪ ﻫﺎي ﻗﺒﻠﻲ ،ﻓﻘﻂ ﻳﻚ ﺑﺨﺶ دﻳﮕﺮ ﺑﺎﻗﻲ ﻣﺎﻧﺪه اﺳﺖ .ﻛﺪ C#ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻪ در اوﻟﻴﻦ ﻣﺮﺣﻠﻪ ﺑﻪ زﺑـﺎن MSILﺗﺒـﺪﻳﻞ ﻣﻲ ﺷﻮد ﺣﺘﻤﺎً ﻧﺒﺎﻳﺪ در ﻳﻚ ﻓﺎﻳﻞ ﺑﺎﺷﺪ ،ﺑﻠﻜﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﺮﻧﺎﻣﻪ را در ﭼﻨﺪﻳﻦ ﻓﺎﻳﻞ ﺳﻮرس ﻛﺪ ﻗﺮار دﻫﻴﻢ و ﺳﭙﺲ آﻧﻬـﺎ را در ﻳـﻚ ﻓﺎﻳـﻞ اﺳﻤﺒﻠﻲ ﻛﺎﻣﭙﺎﻳﻞ ﻛﻨﻴﻢ .ﺑﻪ اﻳﻦ ﻋﻤﻞ ﻟﻴﻨﻚ ﻛﺮدن ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻛﺎرﺑﺮد زﻳﺎدي دارد .ﻓﺎﻳﺪه اﻳﻦ روش در اﻳـﻦ اﺳـﺖ ﻛـﻪ ﻣﻌﻤﻮﻻ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻛﺎر ﺑﺎ ﭼﻨﺪ ﻓﺎﻳﻞ ﻛﻮﭼﻚ راﺣﺖ ﺗﺮ از ﻛﺎر ﺑﺎ ﻳﻚ ﻓﺎﻳﻞ ﺑﺰرگ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺳﻮرس ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﭼﻨﺪﻳﻦ ﻓﺎﻳﻞ ﻣﺠﺰا ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﻪ ﻃﻮر ﺟﺪاﮔﺎﻧﻪ ﺑﺮ روي ﻫﺮ ﻳﻚ از آﻧﻬﺎ ﻛﺎر ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ در ﻣﻮاﻗـﻊ ﻣـﻮرد ﻧﻴـﺎز ،ﭘﻴـﺪا ﻛﺮدن ﻗﺴﻤﺖ ﺧﺎﺻﻲ از ﻛﺪ ﻧﻴﺰ ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ ﺧﻮاﻫﺪ ﺷﺪ. ﻳﻜﻲ دﻳﮕﺮ از ﻗﺎﺑﻠﻴﺘﻬﺎي اﻳﻦ روش در اﻳﻦ اﺳﺖ ﻛﻪ ﮔﺮوﻫﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ ﺗﻘﺴﻴﻢ ﻛﻨﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﺮ ﻛﺪام از ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺮ روي ﻳﻚ ﻗﺴﻤﺖ ﺧﺎص ﻛﺎر ﻛﻨﺪ ﺑﺪون اﻳﻨﻜﻪ در ﻣﻮرد ﻧﺤﻮه ﭘﻴـﺸﺮﻓﺖ ﻗـﺴﻤﺘﻬﺎي دﻳﮕـﺮ ﻧﮕﺮان ﺑﺎﺷﻨﺪ.
C#ﭼﻴﺴﺖ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻧﻴﺰ ذﻛﺮ ﺷﺪ C#ﻳﻜﻲ از زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮان ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﺑﺎ ﻗﺎﺑﻠﻴـﺖ اﺟﺮا در .NET CLRﺗﻮﻟﻴﺪ ﻛﺮد .زﺑﺎن C#در ﺣﻘﻴﻘﺖ ﻧﺴﺨﻪ ﻛﺎﻣﻞ ﺷﺪه ي زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ Cو C++اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮاي ﻛﺎر ﺑﺎ ﭼﺎرﭼﻮب .NETﺑﻪ وﺟﻮد آﻣﺪه اﺳﺖ .ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺟﺪﻳﺪ ﺑﻮدن اﻳﻦ زﺑﺎن ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ ،در اﻳﺠـﺎد آن ﺳـﻌﻲ ﺷﺪه اﺳﺖ ﻛﻪ از وﻳﮋﮔﻴﻬﺎي ﺧﻮب زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ دﻳﮕﺮ اﻟﻬﺎم ﮔﺮﻓﺘﻪ ﺷﻮد و ﻧﻴﺰ ﻛﺎﺳﺘﻲ ﻫﺎي آن زﺑﺎﻧﻬﺎ ﺑﺮﻃﺮف ﺷﻮد.
٥٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ در ﻣﺤﻴﻂ C#ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ از اﻳﺠﺎد ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ در ﻣﺤـﻴﻂ C++اﺳـﺖ .ﻋـﻼوه ﺑـﺮ اﻳـﻦ ﺳـﺎدﮔﻲ C# ،زﺑـﺎن ﻗﺪرﺗﻤﻨﺪي ﻧﻴﺰ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد ﺑﻪ ﻧﺤﻮي ﻛﻪ اﻏﻠﺐ ﻛﺎرﻫﺎﻳﻲ ﻛﻪ در C++اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ در C#ﻫﻢ ﻣﻲ ﺗﻮان اﻧﺠﺎم داد .ﺑﻌﻀﻲ از وﻳﮋﮔﻴﻬﺎي C#ﻛﻪ ﻫﻢ ﺳﻄﺢ ﺑﺎ وﻳﮋﮔﻴﻬﺎي ﭘﻴﺸﺮﻓﺘﻪ در C++ﻫﺴﺘﻨﺪ ،ﻫﻤﺎﻧﻨﺪ ﻗﺎﺑﻠﻴﺖ دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺣﺎﻓﻈﻪ و ﻧﻴﺰ ﺗﻐﻴﻴﺮ آن ،ﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻛﺪﻫﺎي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻋﻨﻮان ﻛﺪ ﻧﺎ اﻣﻦ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد .اﺳﺘﻔﺎده از اﻳﻦ ﺗﻜﻨﻴﻚ ﻫﺎي ﭘﻴﺸﺮﻓﺘﻪ ي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ،ﻋﻤﻮﻣﺎً ﺧﻄﺮﻧﺎك ﻫﺴﺘﻨﺪ زﻳﺮا ﻣﻤﻜﻦ اﺳﺖ ﺑﺎﻋﺚ ﺷﻮﻧﺪ ﻗﺴﻤﺘﻬﺎي ﻣﻬﻢ ﺣﺎﻓﻈﻪ ﻛﻪ اﻃﻼﻋﺎت ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ در آن ﻗﺮار دارد ﺑـﻪ ﻃـﻮر ﻧـﺎ ﺧﻮاﺳـﺘﻪ ﺗﻐﻴﻴﺮ ﻛﻨﺪ و ﺳﻴﺴﺘﻢ ﻣﺘﻮﻗﻒ ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﻳﻦ ﻣﺒﺎﺣﺚ در اﻳﻦ ﻛﺘﺎب ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﻧﻤﻲ ﮔﻴﺮﻧﺪ. ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ﻛﺪﻫﺎي زﺑﺎن C#ﻃﻮﻻﻧﻲ ﺗﺮ از ﻛﺪﻫﺎي زﺑﺎن C++ﻫﺴﺘﻨﺪ .ﻋﻠﺖ اﻳﻦ ﻃﻮﻻﻧﻲ ﺗﺮ ﺑﻮدن ﻛﺪﻫﺎ ﺑﻪ ﺧﺎﻃﺮ اﻳﻦ اﺳﺖ ﻛﻪ C# ﺑﺮ ﺧﻼف C++ﻳﻚ زﺑﺎن ﻧﻮع-اﻣﻦ 1اﺳﺖ .در اﺻﻄﻼح اﻳﻦ ﻟﻐﺖ ﺑﻪ ﻣﻌﻨﻲ اﻳﻦ اﺳـﺖ ﻛـﻪ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻧـﻮع داده اي ﻳـﻚ ﻣﺘﻐﻴﻴـﺮ ﻣﺸﺨﺺ ﺷﺪ ،آن ﻣﺘﻐﻴﻴﺮ ﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻳﻚ ﻧﻮع داده اي دﻳﮕﺮ ﻛﻪ ﺑﻪ آن ﻣﺮﺗﺒﻂ ﻧﻴﺴﺖ ﺗﺒﺪﻳﻞ ﺷﻮد .2ﻋـﻼوه ﺑـﺮ اﻳـﻦ ﻣـﻮرد ﻳـﻚ ﺳـﺮي ﻣﺤﺪودﻳﺘﻬﺎي دﻳﮕﺮ ﻧﻴﺰ ﻫﻨﮕﺎم ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻮع داده اي ﺑﻪ ﻧﻮع داده اي دﻳﮕﺮ ﻧﻴﺰ وﺟﻮد دارد ﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﺪﻫﺎي C#ﻃﻮﻻﻧﻲ ﺗـﺮ از ﻛﺪﻫﺎي C++ﺷﻮﻧﺪ ،اﻣﺎ در ﻣﻘﺎﺑﻞ ﻛﺪﻫﺎي C#از ﭘﺎﻳﺪاري ﺑﻴﺸﺘﺮي ﺑﺮﺧﻮردارﻧﺪ و ﻧﻴﺰ ﺧﻄﺎ ﻳﺎﺑﻲ در آﻧﻬﺎ ﺳﺎده ﺗﺮ اﺳﺖ. اﻟﺒﺘﻪ C#ﻓﻘﻂ ﻳﻜﻲ از زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ .NETاﻳﺠﺎد ﺷﺪه اﺳﺖ ،اﻣﺎ ﺑﻪ ﻧﻈـﺮ ﻣـﻦ ﻣﻄﻤﺌﻨـﺎً ﺑﻬﺘﺮﻳﻦ زﺑﺎن ﺑﺮاي اﻳﻦ ﻛﺎر اﺳﺖ .ﻳﻜﻲ از دﻻﻳﻞ اﻳﻦ اﻣﺮ اﻳﻦ اﺳﺖ ﻛﻪ زﺑﺎن C#از ﭘﺎﻳﻪ ﺑﺮاي اﺳﺘﻔﺎده در ﻣﺤـﻴﻂ .NETاﻳﺠـﺎد ﺷـﺪه اﺳﺖ و ﻣﻌﻤﻮﻻً در ﭘﺮوژه ﻫﺎﻳﻲ ﻛﻪ در راﺑﻄﻪ ﺑﺎ اﻧﺘﻘﺎل .NETﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎي دﻳﮕﺮ اﺳﺖ ،ﻣﺎﻧﻨﺪ Monoاز اﻳﻦ زﺑﺎن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .در زﺑﺎﻧﻬﺎي دﻳﮕﺮ ،ﻣﺎﻧﻨﺪ ﻧﺴﺨﻪ .NETزﺑﺎن وﻳﮋوال ﺑﻴﺴﻴﻚ ،ﺑﺮاي اﻳﻨﻜﻪ ﺷﺒﺎﻫﺖ ﺑﺎ ﻧﺴﻠﻬﺎي ﻗﺒﻠﻲ ﺧﻮد را ﺣﻔﻆ ﻛﻨﻨﺪ ،ﻳﻜـﺴﺮي از ﻗﺴﻤﺘﻬﺎي CLRﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﺷﻮد .در ﻣﻘﺎﺑﻞ ﺑﺎ اﺳﺘﻔﺎده از زﺑﺎن C#ﻣﻲ ﺗﻮان از ﺗﻤﺎم وﻳﮋﮔﻴﻬﺎي اراﺋﻪ ﺷـﺪه ﺑـﻪ وﺳـﻴﻠﻪ .NETدر ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﺮد.
ﭼﻪ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ را ﻣﻴﺘﻮان ﺑﺎ اﺳﺘﻔﺎده از C#اﻧﺠﺎم داد؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ،در .NETﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ ﺑﺮاي ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺎﺑﻞ اﺟـﺮا وﺟـﻮد ﻧـﺪارد .زﺑـﺎن C#ﻧﻴـﺰ از ﭼـﺎرﭼﻮب .NET اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ در ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﻳﻦ زﺑﺎن اﻧﺠﺎم داد وﺟﻮد ﻧﺪارد .اﻣﺎ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎ C#ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ ﺟﺰء ﻳﻜﻲ از دﺳﺘﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي زﻳﺮ ﻫﺴﺘﻨﺪ:
ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺒﺘﻨﻲ ﺑﺮ وﻳﻨﺪوز :اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻫﻤﺎﻧﻨﺪ Officeﺑﺮﻧﺎﻣﻪ ﻫـﺎﻳﻲ ﻫـﺴﺘﻨﺪ ﻛـﻪ داراي ﻇـﺎﻫﺮ آﺷـﻨﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻫﺴﺘﻨﺪ .اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ ﻓﻀﺎي ﻧﺎم ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي در ﭼـﺎرﭼﻮب .NET ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ ﻓﻀﺎي ﻧﺎم ﺷﺎﻣﻞ ﻛﻨﺘﺮل ﻫﺎﻳﻲ از ﻗﺒﻴﻞ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ،ﻧﻮار اﺑﺰارﻫﺎ ،ﻣﻨﻮ ﻫﺎ و ...اﺳﺖ ﻛﻪ ﺑـﻪ وﺳـﻴﻠﻪ آﻧﻬﺎ ﻣﻲ ﺗﻮان راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﺮد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺒﺘﻨﻲ ﺑﺮ وب :اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺷﺎﻣﻞ ﻳﻚ ﺳﺮي ﺻﻔﺤﺎت وب ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺗﺎﻛﻨﻮن ﺑﻪ وﺳـﻴﻠﻪ ﻣﺮورﮔﺮ ﻫﺎي ﻣﺨﺘﻠﻒ اﻳﻨﺘﺮﻧﺖ آﻧﻬﺎ را ﻣﺸﺎﻫﺪه ﻛﺮده ﺑﺎﺷﻴﺪ .ﭼﺎرﭼﻮب .NETداراي ﻳﻚ ﺳﻴﺴﺘﻢ ﻗﻮي ﺑﺮاي اﻳﺠﺎد اﺗﻮﻣﺎﺗﻴﻚ ﺻﻔﺤﺎت وب و ﺗﺎﻣﻴﻦ اﻣﻨﻴﺖ آﻧﻬﺎ و ...اﺳﺖ .اﻳﻦ ﺳﻴﺴﺘﻢ 3ASP.NETﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد و ﺷﻤﺎ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از زﺑﺎن C#و ﺳﻴﺴﺘﻢ ASP.NETﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻣﺒﺘﻨﻲ ﺑﺮ وب اﻳﺠﺎد ﻛﻨﻴﺪ. ﺳﺮوﻳﺴﻬﺎي وب :وب ﺳﺮوﻳﺲ ﻫﺎ ﻳﻚ روش ﺟﺪﻳﺪ و ﺟﺎﻟﺐ ﺑﺮاي اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﻮزﻳﻊ ﺷﺪﻧﻲ ﻣﺒﺘﻨﻲ ﺑﺮ وب ﻫﺴﺘﻨﺪ .ﺑﺎ اﺳﺘﻔﺎده از وب ﺳﺮوﻳﺲ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻫﺮ ﻧﻮع اﻃﻼﻋﺎﺗﻲ را از ﻃﺮﻳﻖ اﻳﻨﺘﺮﻧﺖ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻨﺘﻘﻞ ﻛﻨﻴﺪ .در اﻳـﻦ ﻣـﻮرد زﺑـﺎن Type-Safe
1
2در ﻣﻮرد ﻧﻮع ﻫﺎي داده اي و ﺗﺒﺪﻳﻞ آﻧﻬﺎ ﺑﻪ ﻳﻜﺪﻳﮕﺮ در ﻓﺼﻞ ﺑﻌﺪ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. Active Server Pages .NET
3
٥١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﻮرد اﺳﺘﻔﺎده در ﺑﺮﻧﺎﻣﻪ و ﻳﺎ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ در آن اﺟﺮا ﻣﻲ ﺷﻮد اﻫﻤﻴﺘﻲ ﻧﺪارد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ي ﺷـﻤﺎ ﻛـﻪ ﺗﺤﺖ .NETو ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ وﻳﻨﺪوز ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﻛﻪ ﺗﺤﺖ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫـﺎي دﻳﮕـﺮ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ ﺗﺒﺎدل اﻃﻼﻋﺎت داﺷﺘﻪ ﺑﺎﺷﺪ. در ﻫﺮ ﻛﺪام از اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ در ﺑﺎﻻ ذﻛﺮ ﺷﺪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ﻳﻚ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻧﻴﺎز ﭘﻴﺪا ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر در .NETﺑﺎﻳﺪ از ﺳﻴﺴﺘﻤﻲ ﺑﻪ ﻧﺎم 1ADO.NETاﺳﺘﻔﺎده ﻛﻨﻴﺪ.
وﻳﮋوال اﺳﺘﻮدﻳﻮ :2005 در ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي .NETاﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﻮردي ﺿﺮوري ﻧﻴﺴﺖ .اﻣﺎ ﺑـﺎ اﺳـﺘﻔﺎده از آن ﺳـﺮﻋﺖ ﻃﺮاﺣـﻲ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎ اﻓﺰاﻳﺶ ﺷﺪﻳﺪي ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از C#ﺗﺤﺖ .NETﻣﻲ ﺗﻮاﻧﻴﺪ ﺣﺘﻲ از ﻳـﻚ وﻳﺮاﻳـﺸﮕﺮ ﺳـﺎده ي ﻣـﺘﻦ ﻣﺎﻧﻨﺪ Notepadﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎﻣﭙﺎﻳﻠﺮ ﺧﻂ-ﻓﺮﻣﺎن .NET 2ﺑﺮاي ،C#آن را ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ اﺟـﺮا ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ. در زﻳﺮ وﻳﮋﮔﻴﻬﺎﻳﻲ از وﻳﮋوال اﺳﺘﻮدﻳﻮ .NETﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اﻳﻦ ﻣﺤﻴﻂ اﻧﺘﺨـﺎﺑﻲ ﻣﻨﺎﺳـﺐ ﺑـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ ﺗﺤـﺖ .NET ﻣﺤﺴﻮب ﺷﻮد را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد:
وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺗﻤﺎم ﻣﺮاﺣﻞ ﻛﺎﻣﭙﺎﻳﻞ ﻳﻚ ﺳﻮرس ﻛﺪ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ اﺟﺮا را ﺑﻪ ﺻـﻮرت اﺗﻮﻣﺎﺗﻴـﻚ اﻧﺠـﺎم ﻣـﻲ دﻫـﺪ و ﻫﻤﭽﻨﻴﻦ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﺟﺎزه ﻣﻲ دﻫﺪ ﻫﺮ ﻗﺴﻤﺘﻲ را ﻛﻪ ﺑﺨﻮاﻫﺪ ﺗﻐﻴﻴﺮ داده و ﺗﻨﻈﻴﻢ ﻛﻨﺪ. وﻳﺮاﻳﺸﮕﺮ ﻛﺪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺮاي ﻛﺪ ﻧﻮﻳﺴﻲ زﺑﺎن ﻫﺎي ﭘﺸﺘﻴﺒﺎﻧﻲ ﺷﺪه در .NETﺑﺴﻴﺎر ﻫﻮﺷﻤﻨﺪ اﺳﺖ و ﻣﻲ ﺗﻮاﻧﺪ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ اﻳﻦ ﻛﺪﻫﺎ ﺧﻄﺎﻫﺎي آﻧﻬﺎ را ﺗﺸﺨﻴﺺ داده و در ﺗﺼﺤﻴﺢ آﻧﻬﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻛﻤﻚ ﻛﻨﺪ. وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺷﺎﻣﻞ ﻣﺤﻴﻄﻬﺎﻳﻲ ﺑﺮاي ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي و ﻧﻴﺰ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺒﺘﻨﻲ ﺑﺮ وب اﺳﺖ ﻛـﻪ ﺑـﻪ ﻛﻤـﻚ آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺎدﮔﻲ ﻣﺤﻴﻂ ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﻃﺮاﺣﻲ ﻛﻨﻴﺪ. ﺑﺮاي اﻳﻨﻜﻪ در .NETﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز اﻳﺠﺎد ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﻣﻘﺪار زﻳﺎدي ﻛﺪ را ﻛـﻪ در اﻏﻠـﺐ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎ ﺑـﻪ ﺻـﻮرت ﺗﻜﺮاري ﻫﺴﺘﻨﺪ ﺑﻨﻮﻳﺴﻴﺪ .اﻳﻦ ﻣﻮرد در اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ از ﻧﻮع ﻫﺎي دﻳﮕﺮ ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﺗﺤـﺖ وب ﻧﻴـﺰ وﺟـﻮد دارد. وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎ ﻧﻮﺷﺘﻦ اﺗﻮﻣﺎﺗﻴﻚ اﻳﻦ ﻛﺪﻫﺎ در ﺳﺮﻋﺖ ﺑﺨﺸﻴﺪن ﺑﻪ ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻛﻤﻚ ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ ﻣﻲ ﻛﻨﺪ. وﻳﮋوال اﺳﺘﻮدﻳﻮ داراي وﻳﺰارد ﻫﺎي زﻳﺎدي اﺳﺖ ﻛﻪ ﺑﺴﻴﺎري از ﻛﺎرﻫﺎي ﻋﻤﻮﻣﻲ را ﺑﺮاي ﺷﻤﺎ اﻧﺠﺎم داده و ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ آﻧﻬـﺎ را در ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲ دﻫﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ دﻳﮕﺮ ﻧﻴﺎزي ﻧﻴﺴﺖ در ﻣﻮرد ﻧﺤﻮه ﻧﻮﺷﺘﻦ ﻛﺪ آﻧﻬﺎ ﻧﮕﺮان ﺑﺎﺷﻴﺪ. وﻳﮋوال اﺳﺘﻮدﻳﻮ داراي اﺑﺰارﻫﺎي ﻗﺪرﺗﻤﻨﺪي ﺑﺮاي ﻛﻨﺘﺮل ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻳﻚ ﭘﺮوژه از ﻗﺒﻴـﻞ ﺳـﻮرس ﻛـﺪﻫﺎي C#و ﻳـﺎ ﻓﺎﻳﻠﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ از ﻗﺒﻴﻞ ﻓﺎﻳﻠﻬﺎي ﺻﻮﺗﻲ و ﺗﺼﻮﻳﺮي اﺳﺖ. ﻋﻼوه ﺑﺮ ﺳﺎدﮔﻲ ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎ در ،.NETﺗﻮزﻳﻊ آﻧﻬﺎ ﻧﻴﺰ ﺑـﺴﻴﺎر ﺳـﺎده اﺳـﺖ و ﺑـﻪ راﺣﺘـﻲ ﻣـﻲ ﺗـﻮان آن را ﺑـﺮ روي ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﻣﻘﺼﺪ اﺟﺮا ﻛﺮد و ﻳﺎ ﺑﻪ روز رﺳﺎﻧﺪ. وﻳﮋوال اﺳﺘﻮدﻳﻮ داراي اﺑﺰارﻫﺎي ﻗﻮي ﺧﻄﺎ ﻳﺎﺑﻲ در ﺑﺮﻧﺎﻣﻪ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ اﺑﺰارﻫﺎ ﻣﻲ ﺗﻮان ﺑﺮﻧﺎﻣـﻪ را ﺧـﻂ ﺑﻪ ﺧﻂ اﺟﺮا ﻛﺮد و در اﺟﺮاي ﻫﺮ ﺧﻂ ﻣﻮﻗﻌﻴﺖ ﺑﺮﻧﺎﻣﻪ را ﺑﺮرﺳﻲ ﻛﺮد.
Active Data Objects .NET Command-Line Compiler
1 2
٥٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
وﻳﮋﮔﻴﻬﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺴﻴﺎر ﺑﻴﺸﺘﺮ از ﻣﻮارد ذﻛﺮ ﺷﺪه اﺳﺖ اﻣﺎ ﻫﻤﻴﻦ ﻣﻘﺪار ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﺰاﻳﺎي اﺳﺘﻔﺎده از آن ﻛﺎﻓﻲ ﺑـﻪ ﻧﻈـﺮ ﻣـﻲ رﺳﺪ.
راه ﺣﻠﻬﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﺎ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﻨﻮﻳﺴﻴﺪ اﺑﺘﺪا ﺑﺎﻳﺪ ﻳﻚ راه ﺣﻞ 1اﻳﺠﺎد ﻛﻨﻴﺪ .ﻳﻚ راه ﺣـﻞ در اﺻـﻄﻼح وﻳـﮋوال اﺳﺘﻮدﻳﻮ ،از ﺑﻴﺶ از ﻳﻚ ﭘﺮوژه ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﻮد .راه ﺣﻞ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﭘﺮوژه از اﻧﻮاع ﻣﺨﺘﻠﻒ ﺑﺎﺷـﻨﺪ .ﺑـﺮاي ﻣﺜـﺎل ﺗـﺼﻮر ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺮﻧﺎﻣﻪ اي ﺑﺮاي ﻳﻚ ﺷﺮﻛﺖ ﺗﺠﺎري ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ از دو ﻗﺴﻤﺖ ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﻮد :در ﻗﺴﻤﺖ اول ﺑﺎﻳﺪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤـﺖ وﻳﻨﺪوز اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ اﻣﻮر ﻣﺨﺘﻠﻒ آن ﺷﺮﻛﺖ را ﻛﻨﺘﺮل ﻛﻨﺪ ،در ﻗﺴﻤﺖ دوم ﻧﻴﺰ ﺑﺎﻳﺪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﺗﺤﺖ وب اﻳﺠﺎد ﻛﻨﻴﺪ ﺗـﺎ اﻃﻼﻋـﺎت ﻣﺮﺑﻮط ﺑﻪ آن ﺷﺮﻛﺖ را در ﻳﻚ وب ﺳﺎﻳﺖ ﻧﻤﺎﻳﺶ دﻫﺪ .ﺑﺮاي ﻫﺮ ﻛﺪام از اﻳﻦ ﻗﺴﻤﺘﻬﺎ ﺑﻪ ﻳﻚ ﭘﺮوژه ي ﻣﺠﺰا ﻧﻴﺎز دارﻳﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در ﻛﻞ ﺑﺎﻳﺪ دو ﭘﺮوژه اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﺮاي در ﻳﻚ ﮔﺮوه ﻗﺮار دادن اﻳﻦ دو ﭘﺮوژه ﻣﻲ ﺗﻮاﻧﻴﺪ از راه ﺣﻞ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴـﺐ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻛﺪﻫﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ را در ﻳﻚ ﺟﺎ ﮔﺮوه ﺑﻨﺪي ﻛﻨﻴﺪ ،ﺣﺘﻲ اﮔﺮ ﭘﺮوژه ﻫﺎي آﻧﻬﺎ در ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠـﻒ ﻫـﺎرد دﻳـﺴﻚ ﺑﺎﺷـﻨﺪ و ﻫﻨﮕـﺎم ﻛﺎﻣﭙﺎﻳﻞ ﭼﻨﺪﻳﻦ ﻓﺎﻳﻞ اﺳﻤﺒﻠﻲ ﻣﺨﺘﻠﻒ در ﻗﺴﻤﺘﻬﺎي ﻣﺘﻔﺎوت ﻫﺎرد دﻳﺴﻚ اﻳﺠﺎد ﺷﻮد. ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ وﻳﮋﮔﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻫﻤﺰﻣﺎن ﺑﺮ روي ﻛﺪﻫﺎﻳﻲ ﻛﻪ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﺸﺘﺮك اﺳﺖ ) ﺑـﺮاي ﻣﺜـﺎل اﺳـﻤﺒﻠﻲ ﻫـﺎي ﻣﻮﺟـﻮد در (GACو ﻧﻴﺰ ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ ﻛﺎر ﻛﻨﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﻪ ﻋﻠﺖ اﻳﻦ ﻛﻪ ﺑﺮاي ﻛﺎر ﺑﺮ روي اﻳﻦ ﭘﺮوژه ﻫﺎ از ﻳﻚ ﻣﺤﻴﻂ ﻃﺮاﺣﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ، ﺧﻄﺎ ﻳﺎﺑﻲ آﻧﻬﺎ ﻧﻴﺰ ﺑﺴﻴﺎر ﺳﺎده ﺗﺮ ﺧﻮاﻫﺪ ﺷﺪ.
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ ﺑﻪ ﻣﻌﺮﻓﻲ .NETﭘﺮداﺧﺘﻴﻢ و دﻳﺪﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗـﻮان ﺑـﺎ اﺳـﺘﻔﺎده از .NETﺑـﻪ ﺳـﺎدﮔﻲ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﻣﺘﻨـﻮع و ﻗﺪرﺗﻤﻨﺪي را ﻧﻮﺷﺖ .ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﺑﺮاي اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻪ زﺑﺎن C#در .NETﭼﻪ ﻣﺮاﺣﻠﻲ ﺑﺎﻳﺪ ﻃﻲ ﺷﻮﻧﺪ و ﻧﻴﺰ ﻣﺰﻳﺖ ﻫﺎي اﺳﺘﻔﺎده از ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در .NET CLRﻧﺴﺒﺖ ﺑﻪ ﻛﺪﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﭼﻴﺴﺖ. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﭼﺎرﭼﻮب .NETﭼﻴﺴﺖ ،ﭼﺮا ﺑﻪ وﺟﻮد آﻣﺪ و ﭼﻪ ﻣﻮاردي ﺑﺎﻋﺚ ﻗﺪرت و ﺟﺬاﺑﻴﺖ آن ﻣﻲ ﺷﻮد؟ زﺑﺎن C#ﭼﻴﺴﺖ و ﭼﻪ ﭼﻴﺰ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻨﺎﺳﺐ ﺗﺤﺖ .NETﺗﺒﺪﻳﻞ ﺷﻮد؟ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﭼﻴﺴﺖ و ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﺪ در ﺗﺴﺮﻳﻊ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ در .NETﻣﻮﺛﺮ واﻗﻊ ﺷﻮد؟
Solution
1
٥٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﺳﻮم :ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار ﺣﺎﻻ ﻛﻪ ﺗﻮاﻧﺴﺘﻴﺪ وﻳﮋوال 2005 C#را اﺟﺮا ﻛﺮده و ﺣﺘﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻮﭼﻚ وﻟﻲ ﻗﺎﺑﻞ اﺟﺮا ﺑﺎ آن ﺑﻨﻮﻳﺴﻴﺪ ،ﺑﻬﺘـﺮ اﺳـﺖ در اﻳـﻦ ﻓـﺼﻞ ﻣﺒﺎﻧﻲ ﻓﺮآﻳﻨﺪ ﻧﻮﺷﺘﻦ ﻳﻚ ﻧﺮم اﻓﺰار را ﻳﺎد ﺑﮕﻴﺮﻳﺪ و ﻛﺪﻫﺎي ﺧﻮدﺗﺎن را در ﻛﻨﺎر ﻫﻢ ﻗﺮار دﻫﻴﺪ و ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺟﺬاﺑﻲ ﻃﺮاﺣﻲ ﻛﻨﻴﺪ. در اﻳﻦ درس:
در راﺑﻄﻪ ﺑﺎ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﻣﻄﺎﻟﺒﻲ را ﺧﻮاﻫﻴﺪ آﻣﻮﺧﺖ. ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﻣﺘﻐﻴﻴﺮ ﻫﺎ را ﺧﻮاﻫﻴﺪ دﻳﺪ. ﺑﺎ اﻧﻮاع ﻣﺨﺘﻠﻒ داده ﻫﺎ از ﻗﺒﻴﻞ اﻋﺪاد ﺻﺤﻴﺢ ،اﻋﺸﺎري ،رﺷﺘﻪ ﻫﺎ و ﺗﺎرﻳﺦ ﻫﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﺑﺎ داﻣﻨﻪ ﻓﻌﺎﻟﻴﺖ ﻣﺘﻐﻴﻴﺮ ﻫﺎ آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﺪ. ﺑﺎ ﺧﻄﺎ ﻳﺎﺑﻲ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﭼﮕﻮﻧﮕﻲ ذﺧﻴﺮه ﺷﺪن داده ﻫﺎ در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
داده ﻫﺎ و اﻃﻼﻋﺎت: اﻃﻼﻋﺎت ﺑﻪ ﺗﻮﺿﻴﺤﺎﺗﻲ ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ راﺟﻊ ﺑﻪ واﻗﻌﻴﺘﻲ ﺑﻴﺎن ﻣﻲ ﺷﻮد .اﻳﻦ اﻃﻼﻋﺎت ﻣﻴﺘﻮاﻧﻨﺪ در ﻫﺮ ﻗﺎﻟﺒﻲ ﺟﻤﻊ آوري و ﻳﺎ اراﺋﻪ ﺷﻮﻧﺪ، ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ ﺑﺮاي درك ﺗﻮﺳﻂ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ و ﻳﺎ اﻧﺴﺎﻧﻬﺎ ﻣﻨﺎﺳﺐ ﺑﺎﺷﺪ .ﻣﺜﻼ اﮔﺮ ﺷﻤﺎ ﭼﻨﺪ ﻧﻔـﺮ را ﺑـﺮاي ﺑﺮرﺳـﻲ وﺿـﻌﻴﺖ ﺗﺮاﻓﻴـﻚ ﺑـﻪ ﭼﻨﺪﻳﻦ ﭼﻬﺎرراه ﻣﺨﺘﻠﻒ ﺑﻔﺮﺳﺘﻴﺪ ،در ﭘﺎﻳﺎن ﻛﺎر ﺑﺎ ﭼﻨﺪ ﮔﺰارش دﺳﺖ ﻧﻮﻳﺲ ﻛﻪ وﺿﻌﻴﺖ ﻋﺒﻮر ﻣﺎﺷﻴﻨﻬﺎ را در ﭼﻬﺎرراه ﻫﺎي ﻣﺨﺘﻠـﻒ ﺑﻴـﺎن ﻣﻲ ﻛﻨﺪ روﺑﺮو ﻣﻲ ﺷﻮﻳﺪ .اﻳﻦ ﮔﺰارﺷﺎت را ﻣﻴﺘﻮان اﻃﻼﻋﺎﺗﻲ در ﻧﻈﺮ ﮔﺮﻓﺖ ﻛﻪ ﺑﺮاي اﻧﺴﺎن ﻗﺎﺑﻞ ﻓﻬﻢ ﻫﺴﺘﻨﺪ. ﺑﻪ اﻃﻼﻋﺎت ﺟﻤﻊ آوري ﺷﺪه ،ﻣﺮﺗﺐ ﺷﺪه و ﻗﺎﻟﺐ ﺑﻨﺪي ﺷﺪه ،ﺑﻪ ﻧﺤﻮي ﻛﻪ ﺗﻮﺳﻂ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﺎﺷﺪ، داده ﻣﻲ ﮔﻮﻳﻨﺪ .اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺷﻤﺎ دارﻳﺪ )ﭼﻨﺪﻳﻦ دﻓﺘﺮ ﭘﺮ از ﻣﺘﻨﻬﺎي دﺳﺖ ﻧﻮﻳﺲ( ﺑﻪ وﺳﻴﻠﻪ ﻧـﺮم اﻓﺰارﻫـﺎي ﻛـﺎﻣﭙﻴﻮﺗﺮي ﻗﺎﺑـﻞ اﺳـﺘﻔﺎده ﻧﻴﺴﺘﻨﺪ .ﺑﺮاي ﺗﺒﺪﻳﻞ آﻧﻬﺎ ﺑﻪ داده ﻫﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺗﻮﺳﻂ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺎﻳﺪ ﭼﻨﺪﻳﻦ ﻧﻔﺮ روي آﻧﻬﺎ ﻛﺎر ﻛﻨﻨﺪ و ﻗﺎﻟﺐ آن را ﺗﻐﻴﻴﺮ دﻫﻨﺪ.
اﻟﮕﻮرﻳﺘﻢ ﻫﺎ: ﺻﻨﻌﺖ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ اﻳﻦ ﻣﻌﺮوف اﺳﺖ ﻛﻪ ﺑﺎ ﺳﺮﻋﺘﻲ ﺑﺎورﻧﻜﺮدﻧﻲ در ﺣﺎل ﺗﻐﻴﻴﺮ اﺳﺖ .ﺑﻴﺸﺘﺮ ﻣﺘﺨﺼﺼﺎن اﻳﻦ رﺷﺘﻪ در ﺗﻤﺎم دوران ﻓﻌﺎﻟﻴـﺖ ﺧﻮد ،داﺋﻤﺎ در ﺣﺎل آﻣﻮزش و ﻳﺎدﮔﻴﺮي ﻫﺴﺘﻨﺪ ﺗﺎ اﻃﻼﻋﺎت ﺧﻮد را ﺑﻪ روز ﻧﮕﻪ دارﻧﺪ .اﻣﺎ ﺑﻌﻀﻲ از ﻗﺴﻤﺘﻬﺎي ﻛﺎﻣﭙﻴﻮﺗﺮ ،از زﻣـﺎﻧﻲ ﻛـﻪ ﺑـﻪ وﺟﻮد آﻣﺪه اﻧﺪ ﺗﺎ ﻛﻨﻮن ﺗﻐﻴﻴﺮي ﻧﻜﺮده اﻧﺪ و اﺣﺘﻤﺎﻻ در ﻃﻮل ﻋﻤﺮ ﻣﺎ ﻫﻢ ﺗﻐﻴﻴﺮي ﻧﺨﻮاﻫﻨﺪ ﻛﺮد .ﻓﺮآﻳﻨﺪ و ﺗﺮﺗﻴﺐ ﻣﻮﺟـﻮد در ﺗﻮﺳـﻌﻪ ﻧـﺮم اﻓﺰار ﻧﻤﻮﻧﻪ اي از ﺟﻨﺒﻪ ﻫﺎي ﺗﻜﻨﻮﻟﻮژي ﻛﺎﻣﭙﻴﻮﺗﺮ اﺳﺖ ﻛﻪ ﻣﺎﻫﻴﺖ اﺻﻠﻲ آن از اﺑﺘﺪا ﺗﺎﻛﻨﻮن دﭼﺎر ﺗﻐﻴﻴﺮ ﻧﺸﺪه اﺳﺖ. ﺑﺮاي ﻛﺎر ﻛﺮدن ﻳﻚ ﻧﺮم اﻓﺰار ،ﻳﻚ ﺳﺮي داده ﻧﻴﺎز اﺳﺖ ﻛﻪ روي آﻧﻬﺎ ﭘﺮدازش اﻧﺠﺎم ﺷﻮد .ﻧﺮم اﻓﺰار اﻳﻦ داده ﻫﺎ را درﻳﺎﻓﺖ ﻣﻴﻜﻨﺪ و ﺑـﻪ ﻓﺮﻣﻲ دﻳﮕﺮ ﺗﺒﺪﻳﻞ ﻣﻴﻜﻨﺪ و اراﺋﻪ ﻣﻲ دﻫﺪ .ﺑﺮاي ﻣﺜﺎل ،ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ،اﻃﻼﻋﺎت ﻣﺸﺘﺮﻳﺎن ﺷﻤﺎ را ﻛﻪ ﺑﻪ ﺻﻮرت ﺻﻔﺮ و ﻳﻚ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و آﻧﻬﺎ را ﺑﺮاي ﺷﻤﺎ در ﻣﺎﻧﻴﺘﻮر ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﻳﺎ ﺳﺮوﻳﺲ ﺗﻠﻔﻦ ﺷﻤﺎ ،ﻣﺪت زﻣﺎن ﺗﻤﺎﺳـﻬﺎي ﺷـﻤﺎ را ذﺧﻴﺮه ﻛﺮده و ﺻﻮرت ﺣﺴﺎب ﻫﺎ را ﺑﺮ اﺳﺎس اﻳﻦ اﻃﻼﻋﺎت ﺗﻮﻟﻴﺪ ﻣﻲ ﻛﻨﺪ. اﻣﺎ اﺳﺎس ﻓﻌﺎﻟﻴﺖ ﻫﻤﻪ اﻳﻦ ﻧﺮم اﻓﺰارﻫﺎ ،اﻟﮕﻮرﻳﺘﻢ آﻧﻬﺎ اﺳﺖ .ﻗﺒﻞ از اﻳﻨﻜﻪ ﺷﻤﺎ ﺑﺘﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﺗﺎ ﻣﺴﺌﻠﻪ اي را ﺣﻞ ﻛﻨﺪ ،اﺑﺘـﺪا ﺑﺎﻳﺪ آن را ﺑﻪ ﭼﻨﺪ ﻣﺴﺌﻠﻪ ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ ،و ﭼﮕﻮﻧﮕﻲ ﺣﻞ اﻳﻦ ﻣﺴﺎﻳﻞ را ﻗﺪم ﺑﻪ ﻗﺪم ﺗﻮﺿـﻴﺢ دﻫﻴـﺪ .اﻟﮕـﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎ ﻛـﺎﻣﻼ
٥٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺴﺘﻘﻞ از زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ از آن اﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ اﻟﮕﻮرﻳﺘﻢ ﻳﻚ ﺑﺮﻧﺎﻣـﻪ را ﺑـﻪ ﻫـﺮ ﻧﺤﻮي ﻛﻪ ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻣﻴﻜﻨﺪ ﺗﺎ ﻣﺴﺌﻠﻪ را درك ﻛﻨﻴﺪ ﺑﺎزﮔﻮ ﻛﻨﻴﺪ .ﻣﺜﻼ ﻣﻴﺘﻮاﻧﻴﺪ آن را ﺑﻪ زﺑﺎﻧﻲ ﻛﻪ ﺑﺎ آن ﺻﺤﺒﺖ ﻣﻴﻜﻨﻴﺪ ﺑﺮاي ﺧﻮدﺗـﺎن ﺗﻮﺿﻴﺢ ﺑﺪﻫﻴﺪ و ﻳﺎ آن را ﺑﻪ وﺳﻴﻠﻪ ﺷﻜﻠﻬﺎ و ﻧﻤﻮدارﻫﺎ رﺳﻢ ﻛﻨﻴﺪ. ﻓﺮض ﻛﻨﻴﺪ ﺷﻤﺎ ﺑﺮاي ﻳﻚ ﺷﺮﻛﺖ ﺧﺪﻣﺎت ﺗﻠﻔﻨﻲ ﻛﺎر ﻣﻴﻜﻨﻴﺪ و ﻣﻴﺨﻮاﻫﻴﺪ ﺻﻮرت ﺣﺴﺎب ﻣﺸﺘﺮﻛﻴﻦ را ﺑﺮ اﺳﺎس ﺗﻤﺎﺳﻬﺎﻳﻲ ﻛﻪ ﮔﺮﻓﺘﻪ اﻧﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ .اﻟﮕﻮرﻳﺘﻤﻲ ﻛﻪ ﺑﺮاي ﺣﻞ ﻣﺴﺌﻠﻪ ﺑﺎﻻ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ ،ﻣﻴﺘﻮاﻧﺪ ﻣﺸﺎﺑﻪ اﻟﮕﻮرﻳﺘﻢ زﻳﺮ ﺑﺎﺷﺪ: (1 (2 (3 (4 (5 (6
در اﺑﺘﺪاي ﻫﺮ ﻣﺎه ﺷﻤﺎ ﺑﺎﻳﺪ ﺻﻮرت ﺣﺴﺎب ﻫﺮ ﻳﻚ از ﻣﺸﺘﺮﻛﻴﻦ ﺧﻮد را ﻣﺤﺎﺳﺒﻪ ﻛﻨﻴﺪ. ﺑﺮاي ﻫﺮ ﻣﺸﺘﺮك ،ﺷﻤﺎ ﻟﻴﺴﺖ ﺗﻤﺎﺳﻬﺎﻳﻲ ﻛﻪ آن ﻣﺸﺘﺮك در ﻣﺎه ﻗﺒﻞ ﮔﺮﻓﺘﻪ اﺳﺖ را دارﻳﺪ. ﺷﻤﺎ ﻣﺪت ﻫﺮ ﺗﻤﺎس و ﺳﺎﻋﺘﻲ ﻛﻪ آن ﺗﻤﺎس ﮔﺮﻓﺘﻪ ﺷﺪه ﺑﻮد را ﻣﻴﺪاﻧﻴﺪ و ﺑﺮ اﺳﺎس اﻳﻦ اﻃﻼﻋﺎت ﻣﻴﺘﻮاﻧﻴﺪ ﻫﺰﻳﻨﻪ ﻫﺮ ﺗﻤﺎس را ﻣﺸﺨﺺ ﻛﻨﻴﺪ. ﺑﺮاي ﻫﺮ ﻣﺸﺘﺮك ،ﺻﻮرت ﺣﺴﺎب او ﺑﺮاﺑﺮ اﺳﺖ ﺑﺎ ﻣﺠﻤﻮع ﻫﺰﻳﻨﻪ ﺗﻤﺎم ﺗﻤﺎﺳﻬﺎﻳﻲ ﻛﻪ داﺷﺘﻪ اﺳﺖ. ﻣﺎﻟﻴﺎت ﻫﺮ ﺻﻮرت ﺣﺴﺎب را ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﻛﻨﻴﺪ. ﺑﻌﺪ از اﻳﻦ ﻛﻪ ﺻﻮرت ﺣﺴﺎب ﻧﻬﺎﻳﻲ ﻣﺤﺎﺳﺒﻪ ﺷﺪ ،ﺑﺎﻳﺪ آن را ﭼﺎپ ﻛﻨﻴﺪ.
اﻳﻦ ﺷﺶ ﻣﺮﺣﻠﻪ ،اﻟﮕﻮرﻳﺘﻢ ﻗﺴﻤﺘﻲ از ﻧﺮم اﻓﺰاري اﺳﺖ ﻛﻪ ﻫﺰﻳﻨﻪ ﻣﺎﻫﻴﺎﻧﻪ ﻣﺸﺘﺮﻛﻴﻦ ﻳﻚ ﻣﺮﻛﺰ ﺧﺪﻣﺎت ﺗﻠﻔﻨﻲ را ﻣﺤﺎﺳﺒﻪ ﻣﻴﻜﻨﺪ .ﺗﻔـﺎوﺗﻲ ﻧﺪارد ﺷﻤﺎ اﻳﻦ ﻧﺮم اﻓﺰار را ﺑﺎ ﭼﻪ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻲ ﻧﻮﻳﺴﻴﺪ ،C# ،C++ ،وﻳﮋوال ﺑﻴـﺴﻴﻚ ،J# ،ﺟـﺎوا و ﻳـﺎ ﻫـﺮ زﺑـﺎن دﻳﮕـﺮي، اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﻴﺮي ﻧﻤﻴﻜﻨﺪ) .اﻟﺒﺘﻪ اﻳﻦ ﻫﻔﺖ ﻣﺮﺣﻠﻪ ﻫﻢ ﺧﻴﻠﻲ ﻛﻠﻲ ﻫﺴﺘﻨﺪ و ﺑﺎﻳﺪ ﻗﺒﻞ از اﻳﻦ ﻛﻪ ﺑﻪ وﺳـﻴﻠﻪ ﻳـﻚ زﺑـﺎن ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳﺴﻲ ﻧﻮﺷﺘﻪ ﺷﻮﻧﺪ ﺑﻪ ﻣﺮاﺣﻞ ﻛﻮﭼﻜﺘﺮي ﺷﻜﺴﺘﻪ ﺷﻮﻧﺪ و ﺟﺰﺋﻴﺎت ﺑﻴﺸﺘﺮي از آن ﺷﺮح داده ﺷﻮد( ﺣﺎﻻ ﺑﺮاي اﻓﺮادي ﻛﻪ ﺗﺎزه وارد ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﺪه اﻧﺪ ،ﻳﻚ ﺧﺒﺮ ﺧﻮب و ﻳﻚ ﺧﺒﺮ ﺑﺪ دارم .ﺧﺒﺮ ﺧﻮب اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻌﻤـﻮﻻ اﻳﺠـﺎد ﻳـﻚ اﻟﮕﻮرﻳﺘﻢ ﺑﺴﻴﺎر ﺳﺎده اﺳﺖ .ﻣﺜﻼ در اﻟﮕﻮرﻳﺘﻢ ﻗﺒﻠﻲ ،ﻓﻜﺮ ﻧﻜﻨﻢ ﻗﺴﻤﺘﻲ ﺑﻪ ﻧﻈﺮ ﺷﻤﺎ ﮔﻨﮓ ﺑﺎﺷﺪ و واﺿﺢ ﺑﻪ ﻧﻈﺮ ﻧﺮﺳﺪ .ﻣﻌﻤﻮﻻ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ از ﻳﻚ ﺳﺮي اﺳﺘﺪﻻل ﻫﺎﻳﻲ ﭘﻴﺮوي ﻣﻴﻜﻨﻨﺪ ﻛﻪ از ﻧﻈﺮ ﻣﺮدم ﻋﺎدي درﺳﺖ اﺳﺖ .اﻟﺒﺘﻪ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﺑﺎ اﻟﮕـﻮرﻳﺘﻢ ﻫـﺎﻳﻲ ﺑﺮﺧـﻮرد ﻛﻨﻴﺪ ﻛﻪ داراي ﻓﺮﻣﻮﻟﻬﺎي ﭘﻴﭽﻴﺪه رﻳﺎﺿﻲ و ﻳﺎ ﻓﺮﻣﻮﻟﻬﺎي دﻳﮕﺮ ﻋﻠﻮم ﺑﺎﺷﻨﺪ و ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﻓﺮﻣﻮل ﻫﺎ ﺑﺎ اﺳﺘﺪﻻل ﻫﺎي ﺷﻤﺎ درﺳﺖ ﺑﻪ ﻧﻈﺮ ﻧﻤﻲ رﺳﻨﺪ ،اﻣﺎ ﺧﻮب اﻳﻦ ﻓﺮﻣﻮل ﻫﺎ ﻫﻢ از ﻧﻈﺮ اﻓﺮاد دﻳﮕﺮي ﻛﻪ آﻧﻬﺎ را ﻣﻴﺪاﻧﻨﺪ درﺳﺖ ﺑﻪ ﻧﻈﺮ ﻣﻴﺮﺳﺪ .اﻣﺎ ﺧﺒﺮ ﺑﺪ اﻳـﻦ اﺳـﺖ ﻛـﻪ ﻣﻌﻤﻮﻻ ﺗﺒﺪﻳﻞ ﻳﻚ اﻟﮕﻮرﻳﺘﻢ ﺑﻪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﻛﺎر ﻣﺸﻜﻠﻲ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﻳﻦ ﻛﻪ ﺑﺪاﻧﻴﺪ ﭼﮕﻮﻧﻪ ﻳﻚ اﻟﮕـﻮرﻳﺘﻢ را ﺗﻮﺳﻂ ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭘﻴﺎده ﻛﻨﻴﺪ ﻣﻬﻢ اﺳﺖ. ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺣﺮﻓﻪ اي ﺑﺮ اﻳﻦ اﺻﻞ ﻋﻘﻴﺪه دارﻧﺪ ﻛﻪ ﺗﻘﺪم ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺮ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ دﻳﮕﺮ ،ﻛـﺎﻣﻼ ﺑـﻲ رﺑـﻂ اﺳﺖ .زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺘﻔﺎوت ﻣﻴﺘﻮاﻧﻨﺪ ﻛﺎرﻫﺎي ﻣﺨﺘﻠﻔﻲ را راﺣﺖ ﺗﺮ و ﺳﺮﻳﻌﺘﺮ اﻧﺠﺎم دﻫﻨﺪ .ﻣﺜﻼ C++ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻗـﺪرت زﻳﺎدي در ﻛﻨﺘﺮل ﻧﺤﻮه اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﻴﺪﻫﺪ و ﻫﻤﭽﻨﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎي آن ﻧﻴﺰ از ﺳﺮﻋﺖ اﺟﺮاي ﺑﺎﻻﻳﻲ ﺑﺮﺧﻮردار ﻫﺴﺘﻨﺪ ،اﻣﺎ ﺑـﺪي آن اﻳـﻦ اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ اﻳﻦ زﺑﺎن ﺑﺴﻴﺎر ﻣﺸﻜﻞ اﺳﺖ و ﻳﺎدﮔﻴﺮي آن ﺑﺮاي ﻣﺒﺘﺪﻳﺎن ﻣﻌﻤﻮﻻ ﺑﺴﻴﺎر ﺳﺨﺖ اﺳﺖ .در ﻣﻘﺎﺑﻞ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ و ﻳﺎدﮔﻴﺮي زﺑﺎن وﻳﮋوال ﺑﻴﺴﻴﻚ ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ اﺳﺖ ،اﻣﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ در اﻳﻦ زﺑﺎن ﻛﻨﺘـﺮل ﻛـﺎﻓﻲ ﺑـﺮ روي ﺑﺮﻧﺎﻣـﻪ ﻧـﺪارد )زﺑـﺎن C# ﻫﻤﺎﻧﻄﻮر ﻛﻪ ادﻋﺎ ﺷﺪه اﺳﺖ ،زﺑﺎﻧﻲ اﺳﺖ ﻛﻪ از ﺳﺎدﮔﻲ زﺑﺎﻧﻲ ﻣﺎﻧﻨﺪ وﻳﮋوال ﺑﻴﺴﻴﻚ و ﻗﺪرت زﺑﺎﻧﻲ ﻣﺎﻧﻨﺪ C++ﺑﺮﺧﻮردار اﺳـﺖ( .ﭼﻴـﺰي ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻳﺎد ﺑﮕﻴﺮﻳﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﻴﺪ ﺑﺮاي ﺣﻞ ﻳﻚ ﻣﺴﺌﻠﻪ ،زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺨﺘﻠﻒ را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .اﻟﺒﺘﻪ زﻣﺎﻧﻲ ﻛﻪ ﺷﺮوع ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ اوﻟﻴﻦ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ را ﻳﺎد ﺑﮕﻴﺮﻳﺪ ،در آن ﭘﻴﺸﺮﻓﺖ ﻛﻨـﺪي ﺧﻮاﻫﻴـﺪ داﺷـﺖ ،اﻣـﺎ ﻣﻌﻤـﻮﻻ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ در ﻧﺤﻮه اﺟﺮا و ﭘﻴﺎده ﻛﺮدن اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﺗﻔﺎوﺗﻲ ﻧﺪارﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ را ﻳﺎد ﮔﺮﻓﺘﻴـﺪ، ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺗﺠﺮﺑﻪ ﺧﻮد در اﻟﮕﻮرﻳﺘﻢ ﻫﺎ و ﻳﺎ ﺣﺘﻲ ﻛﺪ زﺑﺎن ﻗﺒﻠﻲ در زﺑﺎن ﺟﺪﻳﺪ ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮده و ﭼﻨﺪﻳﻦ زﺑﺎن دﻳﮕﺮ را ﻧﻴﺰ ﺑـﻪ ﺳـﺮﻋﺖ ﻳﺎد ﺑﮕﻴﺮﻳﺪ.
٥٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭼﻴﺴﺖ؟ از ﻳﻚ ﻧﮕﺎه ،ﻣﻴﺘﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ ﻛﻪ ﻳﻚ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ ﭼﻴﺰي ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﺗﻮاﻧﺎﻳﻲ ﺗـﺼﻤﻴﻢ ﮔﻴـﺮي داﺷـﺘﻪ ﺑﺎﺷـﺪ .ﻛﺎﻣﭙﻴﻮﺗﺮﻫـﺎ ﻣﻌﻤﻮﻻ ﺧﻴﻠﻲ ﺳﺮﻳﻊ و ﺑﺎ دﻗﺖ ﻣﻴﺘﻮاﻧﻨﺪ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﻨﻨﺪ اﻣﺎ ﻣﺘﺎﺳﻔﺎﻧﻪ ،ﻓﻘﻂ در زﻣﻴﻨﻪ ﻫﺎي ﺑﺴﻴﺎر ﺳﺎده ﻣﻴﺘﻮاﻧﻨﺪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم ﺑﺪﻫﻨﺪ. ﻣﺜﻼ "آﻳﺎ اﻳﻦ ﻋﺪد ﺑﺰرﮔﺘﺮ از ﺳﻪ اﺳﺖ؟" و ﻳﺎ "آﻳﺎ اﻳﻦ ﻣﺎﺷﻴﻦ آﺑﻲ اﺳﺖ؟". اﮔﺮ ﺷﻤﺎ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﭘﻴﭽﻴﺪه را ﺑﻪ وﺳﻴﻠﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﻧﺠﺎم دﻫﻴﺪ ،اﺑﺘﺪا ﺑﺎﻳـﺪ آن را ﺑـﻪ ﻗـﺴﻤﺘﻬﺎي ﻛـﻮﭼﻜﺘﺮي ﻛـﻪ ﺗﻮﺳـﻂ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻗﺎﺑﻞ ﻓﻬﻢ ﺑﺎﺷﺪ ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ .ﻣﻌﻤﻮﻻ ﺑﺮاي ﻓﻬﻤﻴﺪن اﻳﻦ ﻛﻪ ﭼﮕﻮﻧﻪ ﻳﻚ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﭘﻴﭽﻴﺪه را ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ ﺳـﺎده ﺗﻘـﺴﻴﻢ ﻛﻨﻴﺪ ﻣﻴﺘﻮاﻧﻴﺪ از اﻟﮕﻮرﻳﺘﻢ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺑﺮاي ﻧﻤﻮﻧﻪ ﻳﻚ ﻣﺴﺌﻠﻪ ﻛﻪ ﺣﻞ آن ﺑﺮاي ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻴﻠﻲ ﺳﺨﺖ اﺳﺖ ،ﺗﺸﺨﻴﺺ ﭼﻬﺮه اﻧﺴﺎﻧﻬﺎ اﺳﺖ .ﺷـﻤﺎ ﻧﻤﻴﺘﻮاﻧﻴـﺪ ﺑـﻪ ﻳـﻚ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺑﮕﻮﻳﻴﺪ ﻛﻪ "آﻳﺎ اﻳﻦ ﻋﻜﺲ ﺗﺼﻮﻳﺮي از ﻣﺎري اﺳﺖ؟" ،ﺑﻠﻜﻪ ﺑﺎﻳﺪ اﻳﻦ ﻣﺴﺌﻠﻪ را ﺑﻪ ﭼﻨﺪ ﻣﺴﺌﻠﻪ ﻛﻮﭼﻜﺘﺮ ﻛﻪ ﺗﻮﺳـﻂ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻗﺎﺑـﻞ ﻓﻬـﻢ ﺑﺎﺷﺪ ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺘﻮاﻧﺪ ﺑﻪ آﻧﻬﺎ ﭘﺎﺳﺦ ﺻﺤﻴﺢ ﺑﺪﻫﺪ. ﺳﻮاﻻﺗﻲ ﻛﻪ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ از ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺑﭙﺮﺳﻴﺪ و ﺑﺮ اﺳﺎس آﻧﻬﺎ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﻨﻴﺪ ﻣﻌﻤﻮﻻ داراي ﺟﻮاب ﺑﻠﻪ و ﻳﺎ ﺧﻴـﺮ ﻫـﺴﺘﻨﺪ .اﻳـﻦ دو ﺟﻮاب ﻣﻌﻤﻮﻻ ﺑﺎ ﻋﻨﻮان درﺳﺖ و ﻏﻠﻂ و ﻳﺎ 1و 0ﻧﻴﺰ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .در زﻣﺎن ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ اﺳﺎس ﭘﺎﺳـﺦ ﺑـﻪ ﺳﻮال " 10در ﻣﻘﺎﻳﺴﻪ ﺑﺎ 4ﭼﻪ ﻗﺪر ﺑﺰرﮔﺘﺮ اﺳﺖ؟" ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﻨﻴﺪ .ﺑﻠﻜﻪ ﺑﺎﻳﺪ اﻳﻦ ﺳﻮال را ﺑﻪ ﺻﻮرت "آﻳﺎ 10از 4ﺑﺰرﮔﺘـﺮ اﺳـﺖ؟" ﺑﭙﺮﺳﻴﺪ .ﺗﻔﺎوت اﻳﻦ دو ﺳﻮال ﺑﺴﻴﺎر رﻳﺰ و در ﻋﻴﻦ ﺣﺎل ﻣﻬﻢ اﺳﺖ .ﺟﻮاب ﺳﻮال اول ﺑﻪ ﺻﻮرت ﺑﻠﻪ و ﻳﺎ ﺧﻴﺮ ﻧﻴﺴﺖ اﻣﺎ ﺟﻮاب ﺳـﻮال دوم ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ .اﻟﺒﺘﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻗﺎدر اﺳﺖ ﺑﻪ ﺳﻮال اول ﻫﻢ ﭘﺎﺳﺦ ﺑﺪﻫﺪ ،اﻣـﺎ ﺑـﺮ اﺳـﺎس اﻳـﻦ ﭘﺎﺳـﺦ ﻧﻤﻴﺘـﻮان ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﺮد .ﺑﺮاي ﭘﺎﺳﺦ ﺳﻮال اول ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺪار 4را از 10ﻛﻢ ﻣﻴﻜﻨﺪ و ﺣﺎﺻﻞ را ﻧﮕﻬﺪاري ﻣﻴﻜﻨـﺪ ﺗـﺎ ﺷـﻤﺎ ﺑﺘﻮاﻧﻴـﺪ از آن در ﻗﺴﻤﺘﻬﺎي دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ ﻓﻜﺮ ﻛﻨﻴﺪ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻓﻘﻂ ﺑﺮ اﺳﺎس ﺑﻠﻪ و ﻳﺎ ﺧﻴﺮ ﻳﻚ ﻣﺤﺪودﻳﺖ اﺳﺖ ،اﻣﺎ واﻗﻌﺎً اﻳﻦ ﻃﻮر ﻧﻴـﺴﺖ .ﺣﺘـﻲ در زﻧـﺪﮔﻲ روزﻣﺮه ﻧﻴﺰ ﺗﺼﻤﻴﻢ ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﮔﻴﺮﻳﻢ ﻧﻮﻋﻲ از ﺑﻠﻪ و ﺧﻴﺮ اﺳﺖ .وﻗﺘﻲ ﺷﻤﺎ ﻣﻴﺨﻮاﻫﻴﺪ راﺟﻊ ﺑﻪ ﻣﻮردي ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳـﺪ ،ﻳـﺎ آن را ﻗﺒـﻮل ﻣﻴﻜﻨﻴﺪ )ﺑﻠﻪ ،درﺳﺖ و ﻳﺎ (1ﻳﺎ آن را رد ﻣﻴﻜﻨﻴﺪ )ﻧﻪ ،ﻏﻠﻂ ﻳﺎ .(0 در اﻳﻦ ﻛﺘﺎب ﺷﻤﺎ از C#ﺑﻪ ﻋﻨﻮان زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺧﻮد اﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ ،اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ﺟﻨﺒﻪ ﻣﻬﻢ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﻳﻦ اﺳﺖ ﻛﻪ زﺑﺎن ﻣﻮرد اﺳﺘﻔﺎده در آن ﻣﻬﻢ ﻧﻴﺴﺖ .در ﺣﻘﻴﻘﺖ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺴﺘﻘﻞ از زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳـﺖ .ﻫـﺮ ﺑﺮﻧﺎﻣـﻪ اي ،ﺑﺎ ﻫﺮ ﺷﻜﻞ و ﻇﺎﻫﺮي ﻛﻪ ﺑﺎﺷﺪ و ﻫﺮ زﺑﺎﻧﻲ ﻛﻪ ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺎﺷﺪ ،از ﻣﺘﺪﻫﺎ )ﺗﻮاﺑﻊ و زﻳﺮﺑﺮﻧﺎﻣﻪ ﻫﺎ :ﭼﻨﺪﻳﻦ ﺧﻂ ﻛﺪ ﻛﻪ ﻳـﻚ اﻟﮕـﻮرﻳﺘﻢ ﺧﺎص را اﺟﺮا ﻣﻴﻜﻨﻨﺪ( و ﻣﺘﻐﻴﻴﺮ ﻫﺎ )ﻣﻜﺎﻧﻲ ﺑﺮاي ﻧﮕﻬﺪاري و ﺗﻐﻴﻴﺮ داده ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺎ ( ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ.
ﻣﺘﻐﻴﻴﺮ ﻫﺎ: ﻣﺘﻐﻴﻴﺮ ﻣﻜﺎﻧﻲ اﺳﺖ ﻛﻪ ﺷﻤﺎ در ﻃﻮل ﻛﺎر اﻟﮕﻮرﻳﺘﻢ ﺧﻮد ﻣﻘﺪاري را در آن ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﺪ .ﺑﻌﺪﻫﺎ ﺷﻤﺎ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺮ اﺳـﺎس ﻣﻘـﺪار آن ﻣﺘﻐﻴﻴﺮ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﻨﻴﺪ )ﺑﺮاي ﻣﺜﺎل "آﻳﺎ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﺮاﺑﺮ 79اﺳﺖ؟" و ﻳﺎ "آﻳﺎ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﻴﺸﺘﺮ از 4اﺳﺖ؟"( ﻳﺎ ﻋﻤﻠﻴـﺎت رﻳﺎﺿـﻲ و ﻣﺤﺎﺳﺒﺎﺗﻲ ﺑﺮ روي آن اﻧﺠﺎم دﻫﻴﺪ ) ﻣﺜﻼ "ﻣﺘﻐﻴﻴﺮ را ﺑﺎ 2ﺟﻤﻊ ﻛﻦ ".و ﻳﺎ "ﻣﺘﻐﻴﻴﺮ را در 6ﺿﺮب ﻛﻦ"( ﻳﺎ ﭼﻴﺰﻫﺎي دﻳﮕﺮ.
ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎ:
٥٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻗﺒﻞ از اﻳﻨﻜﻪ درﮔﻴﺮ ﻣﺘﻐﻴﻴﺮ ﻫﺎ در ﻛﺪ ﺷﻮﻳﻢ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﻪ اﻟﮕﻮرﻳﺘﻢ زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ: (1ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم nاﻳﺠﺎد ﻛﻨﻴﺪ و ﻣﻘﺪار 27را در آن ذﺧﻴﺮه ﻛﻨﻴﺪ. (2ﻣﺘﻐﻴﻴﺮ nرا ﺑﺎ ﻋﺪد 1ﺟﻤﻊ ﻛﻨﻴﺪ و ﺣﺎﺻﻞ را ﻣﺠﺪداً در nﻗﺮار دﻫﻴﺪ. (3ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ nرا ﺑﻪ ﻛﺎرﺑﺮ ﻧﺸﺎن دﻫﻴﺪ. در اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﺷﻤﺎ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم nاﻳﺠﺎد ﻛﺮده و ﻣﻘﺪار 27را در آن ﻗﺮار ﻣﻲ دﻫﻴﺪ .اﻳﻦ ﻣـﻮرد ﺑـﻪ اﻳـﻦ ﻣﻌﻨـﻲ اﺳـﺖ ﻛـﻪ ﺷـﻤﺎ ﻣﻘﺪاري از ﺣﺎﻓﻈﻪ ي ﻛﺎﻣﭙﻴﻮﺗﺮ را ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺳﺖ ﮔﺮﻓﺘﻪ اﻳﺪ و ﻣﻘﺪار 27را در آن ﻗـﺮار داده اﻳـﺪ .اﻳـﻦ ﻗـﺴﻤﺖ از ﺣﺎﻓﻈـﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺪار 27را ﺑﺮاي ﺷﻤﺎ ﻧﮕﻪ ﺧﻮاﻫﺪ داﺷﺖ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ و ﻳﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﮕﻮﻳﻴﺪ ﻛﻪ دﻳﮕﺮ ﺑﻪ آن ﻧﻴﺎزي ﻧﺪارﻳﺪ. در ﻣﺮﺣﻠﻪ دوم ﺷﻤﺎ ﻳﻚ ﻋﻤﻠﻴﺎت ﺟﻤﻊ اﻧﺠﺎم ﻣﻲ دﻫﻴﺪ .در اﻳﻦ ﻣﺮﺣﻠﻪ ،ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ nرا از ﮔﺮﻓﺘﻪ و آن را ﺑـﺎ ﻋـﺪد 1ﺟﻤـﻊ ﻣـﻲ ﻛﻨﻴـﺪ. ﺳﭙﺲ آن را ﻣﺠﺪداً در nﻗﺮار ﻣﻲ دﻫﻴﺪ .ﺑﻌﺪ از ﭘﺎﻳﺎن اﻳﻦ ﻋﻤﻠﻴﺎت ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ ﻛﻪ ﻣﺘﻐﻴﻴﺮ nرا ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ ،ﺣﺎوي ﻣﻘﺪار 28 ﺧﻮاﻫﺪ ﺑﻮد. در ﻣﺮﺣﻠﻪ آﺧﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻪ ﻛﺎرﺑﺮ ﻣﻘﺪار nرا ﻧﺸﺎن دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ nرا از ﺣﺎﻓﻈـﻪ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺧﻮاﻧـﺪه و آن را ﺑـﺮاي ﻛﺎرﺑﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻧﺸﺎن ﻣﻲ دﻫﻴﺪ. ﻓﻜﺮ ﻧﻜﻨﻢ ﭼﻴﺰي در اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻧﺎﻣﻔﻬﻮم ﺑﺎﺷﺪ ﻛﻪ ﻣﺘﻮﺟﻪ آن ﻧﺸﺪه ﺑﺎﺷﻴﺪ .ﻫﻤﻪ ﭼﻴﺰ واﺿﺢ اﺳﺖ! اﻟﺒﺘﻪ ،ﻛـﺪ اﻳـﻦ ﻛـﺎر در وﻳـﮋوال C# 2005ﻣﻘﺪاري رﻣﺰي ﺗﺮ ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ .در ﺑﺨﺶ "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" زﻳﺮ ،ﺑﻴﺸﺘﺮ در راﺑﻄﻪ ﺑﺎ ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎ در C#آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎ (1ﺑﺎ اﻧﺘﺨﺎب ﮔﺰﻳﻨﻪ File New Projectاز ﻣﻨﻮي وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ را اﻳﺠﺎد ﻛﻨﻴـﺪ. در ﭘﻨﺠﺮه New Projectاز ﻗﺴﻤﺖ ﺳﻤﺖ راﺳﺖ Windows Applicationرا اﻧﺘﺨﺎب ﻛﻨﻴـﺪ و در ﻗﺴﻤﺖ ﻧﺎم ﭘﺮوژه Variablesرا وارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ) .ﺷﻜﻞ (1-3 (2ﭘﻨﺠﺮه Form1را ﻣﻘﺪاري ﻛﻮﭼﻜﺘﺮ ﻛﻨﻴﺪ و ﺳﭙﺲ از ﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ﻛﻨﺘﺮل Buttonروي آن ﻗـﺮار دﻫﻴـﺪ .ﺧﺎﺻـﻴﺖ Textآن را ﺑﻪ Add 1 to intNumberو ﺧﺎﺻﻴﺖ Nameآن را ﺑﻪ btnAddﺗﻐﻴﻴـﺮ دﻫﻴـﺪ .ﻓـﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 2-3ﺷﻮد. (3روي دﻛﻤﻪ ﻓﺮﻣﺎن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺗﺎﺑﻊ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickدﻛﻤﻪ ﻓﺮﻣﺎن ﺑﺎ ﻧـﺎم btnAdd_Click ﺑﺎز ﺷﻮد .ﻛﺪﻫﺎي ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ. )private void btnAdd_Click(object sender, EventArgs e { ;int intNumber ;intNumber = 27 ;intNumber = intNumber + 1 (MessageBox.Show "Value of intNumber + 1 = " + intNumber, ;)""Variables }
٥٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 1-3
ﺷﻜﻞ 2-3 (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ Add 1 to intNumberﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ 3-3 ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد.
ﺷﻜﻞ 3-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٥٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮﻧﺎﻣﻪ از ﺑﺎﻻﺗﺮﻳﻦ ﺧﻂ ﺷﺮوع ﻣﻲ ﺷﻮد ،ﻳﻜﻲ ﻳﻜﻲ ﺧﻄﻬﺎ را اﺟﺮا ﻣﻴﻜﻨﺪ و ﺑﻪ ﺳﻤﺖ ﭘﺎﻳﻴﻦ ﻣﻲ آﻳﺪ .ﺧﻂ اول ﻳﻚ ﻣﺘﻐﻴﻴـﺮ ﺟﺪﻳـﺪ ﺑـﻪ ﻧـﺎم intNumberاﻳﺠﺎد ﻣﻴﻜﻨﺪ. ;int intNumber intدر C#ﻳﻚ ﻛﻠﻤﻪ ﻛﻠﻴﺪي اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﻳﻚ ﮔﻔﺘﻢ ﻛﻠﻤﻪ ﻛﻠﻴﺪي ،ﺑﻪ ﻛﻠﻤﻪ اي ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﺑﺮاي وﻳـﮋوال C# 2005ﻣﻌﻨﻲ ﺧﺎﺻﻲ دارد .ﻣﺎﻧﻨﺪ دﺳﺘﻮرات .ﻛﻠﻤﻪ ﻛﻠﻴﺪي ،intﻛﻪ ﻣﺨﻔﻒ ﻛﻠﻤﻪ integerﺑﻪ ﻣﻌﻨـﺎي ﻋـﺪد ﺻـﺤﻴﺢ اﺳـﺖ ،ﻧـﻮع ﻣﻘﺪاري ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ در اﻳﻦ ﻣﺘﻐﻴﻴﺮ ذﺧﻴﺮه ﻛﻨﻴﻢ را ﺑﻪ وﻳﮋوال 2005 C#ﻣﻴﮕﻮﻳﺪ .اﻳﻦ ﻛﻠﻤﺎت ﻛﻪ ﺑـﺮاي ﻣـﺸﺨﺺ ﻛـﺮدن ﻧـﻮع داده ﻣﻮرد ﻧﻈﺮ اﺳﺘﻔﺎده ﻣﻴﺸﻮﻧﺪ ،ﺑﻪ "ﻧﻮع داده اي" ﻣﻌﺮوف ﻫﺴﺘﻨﺪ .ﻓﻌﻼ ﻫﻤﻴﻦ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ ،اﻳـﻦ ﻧـﻮع داده اي ﺑـﻪ وﻳـﮋوال C# 2005ﻣﻴﮕﻮﻳﺪ ﻛﻪ ﺷﻤﺎ ﻣﻴﺨﻮاﻫﻴﺪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ را در اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻗﺮار دﻫﻴﺪ. ﻧﻜﺘﻪ :ﻛﻠﻤﻪ intﺑﺮاي ﺗﻌﺮﻳﻒ ﻧﻮع داده اي ﻋﺪد ﺻﺤﻴﺢ در C#از زﺑﺎن C++ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ .در C#ﺑﻌﻀﻲ از ﻛﻠﻤـﺎت ﻛﻠﻴـﺪي ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ ﻛﺎر ﺑﺎ اﻋﺪاد ﻫﺴﺘﻨﺪ ،از زﺑﺎن C++ﮔﺮﻓﺘﻪ ﺷﺪه اﻧﺪ ،ﻣﺎﻧﻨﺪ ﻛﻠﻤﺎت ﻛﻠﻴﺪي ﻣﺮﺑﻮط ﺑﻪ ﺗﻌﺮﻳﻒ اﻋﺪاد ﺻﺤﻴﺢ ،اﻋـﺪاد اﻋـﺸﺎري، اﻋﺪاد ﺻﺤﻴﺢ ﺑﺰرگ و .. ﺑﻌﺪ از اﻳﻦ ﻛﻪ ﻧﻮع داده اي ﻣﺘﻐﻴﻴﺮ ﺧﻮد را ﻣﺸﺨﺺ ﻛﺮدﻳﻢ ،ﺑﺎﻳﺪ ﻧﺎﻣﻲ را ﺑﻪ آن اﺧﺘﺼﺎص دﻫﻴﻢ ﺗﺎ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑـﻪ آن، از آن ﻧﺎم اﺳﺘﻔﺎده ﻛﻨﻴﻢ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﺎم intNumberرا ﺑﺮاي ﻣﺘﻐﻴﻴﺮ اﻧﺘﺨﺎب ﻛﺮده اﻳﻢ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در ﻧﺎﻣﮕﺬاري اﻳﻦ ﻣﺘﻐﻴﻴﺮ از ﻧﻤﺎد ﮔﺬاري ﻣﺠﺎرﺳﺘﺎﻧﻲ ﻛﻪ در ﻓﺼﻞ ﻳﻚ ﺗﻮﺿﻴﺢ دادم اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .در اﻳﻨﺠﺎ ﻛﻠﻤﻪ intﻣﺨﻔﻒ ﻋﺒﺎرت Integerاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ را در ﺧﻮد ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ .ﻛﻠﻤﻪ Numberﻫﻢ ﻧـﺎم ﺧـﻮد ﻣﺘﻐﻴﻴـﺮ اﺳـﺖ .در ﻃﻮل ﺑﺮﻧﺎﻣﻪ دﻳﺪﻳﺪ ﻛﻪ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ را در ﺧﻮد ﻧﮕﻬﺪاري ﻣﻴﻜﻨﺪ ،ﭘﺲ اﻳﻦ ﻧﺎم ﺑﺮاي آن ﻣﻨﺎﺳﺐ اﺳﺖ. دﺳﺘﻮر ﻧﻮﺷﺘﻪ ﺷﺪه در ﺧﻂ ﺑﻌﺪي ،ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا در آن ﻗﺮار ﻣﻲ دﻫﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ در اﻳـﻦ ﺧـﻂ ﻣﻘـﺪار 27در intNumberﻗﺮار ﻣﻲ ﮔﻴﺮد. ﻧﻜﺘﻪ :ﻣﻲ ﺗﻮاﻧﻴﻢ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ را ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻧﻴﺰ ﺑﻪ آن ﺑﺪﻫﻴﻢ .ﻣﺜﻼً در ﺑﺮﻧﺎﻣﻪ ي ﺑﺎﻻ ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ در ﻳﻚ ﺧﻂ ﻣﺘﻐﻴﻴﺮ را ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ و در ﺧﻂ ﺑﻌﺪ ﻣﻘﺪار 27را ﺑﻪ آن اﺧﺘﺼﺎص دﻫﻴﻢ ،ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﺑﻪ ﺻﻮرت زﻳﺮ در ﻳﻚ ﺧﻂ ﻫﻢ ﻣﺘﻐﻴﻴﺮ را ﺗﻌﺮﻳﻒ ﻛﺮده و ﻫﻢ ﺑـﻪ آن ﻣﻘﺪار ﺑﺪﻫﻴﻢ: ;int intNumber = 27 دﺳﺘﻮر ﺧﻂ ﺑﻌﺪي ،ﻋﺪد ﻳﻚ را ﺑﺎ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberﺟﻤﻊ ﻣﻴﻜﻨﺪ: ;intNumber = intNumber + 1 اﮔﺮ از دﻳﺪ رﻳﺎﺿﻲ ﺑﻪ اﻳﻦ دﺳﺘﻮر ﻧﮕﺎه ﻛﻨﻴﺪ ﻣﻤﻜﻦ اﺳﺖ اﺷﺘﺒﺎه ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ .اﻣﺎ در ﺣﻘﻴﻘﺖ ﻛﺎري ﻛﻪ اﻳﻦ دﺳﺘﻮر اﻧﺠﺎم ﻣﻴﺪﻫﺪ ،اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ﺑﺎ ﻋﺪد 1ﺟﻤﻊ ﻣﻴﻜﻨﺪ و ﺣﺎﺻﻞ را ﻣﺠﺪدا در intNumberذﺧﻴﺮه ﻣﻴﻜﻨﺪ. ﺧﻂ آﺧﺮ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ ﻛﻪ در آن ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumber + 1ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ .ﻋﺒـﺎرﺗﻲ ﻛـﻪ اﻳﻦ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ ﺑﻪ ﺻﻮرت ﻣﺠﻤﻮع رﺷﺘﻪ ي "= "Value of intNumber + 1و ﻣﻘـﺪار ﻛﻨـﻮﻧﻲ intNumberاﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻋﻨﻮان اﻳﻦ ﭘﻨﺠﺮه را ﻧﻴﺰ " "Variablesﻗﺮار ﻣﻴﺪﻫﻴﻢ ﺗﺎ ﺑﺎ ﻧﺎم ﺑﺮﻧﺎﻣﻪ ﻫﻤﺎﻫﻨﮓ ﺷﻮد:
٥٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(MessageBox.Show "Value of intNumber + 1 = " + intNumber, ;)""Variables
ﺗﻮﺿﻴﺤﺎت و ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺪ ﻳﻚ ﻧﺮم اﻓﺰار را ﻣﻲ ﻧﻮﻳﺴﻴﺪ ،ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ ﺷﻤﺎ ﻳﺎ ﺷﺨﺺ دﻳﮕﺮي در آﻳﻨﺪه ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﺪ اﻳﻦ ﻛﺪ را ﺗﻐﻴﻴﺮ دﻫـﺪ. ﺑﻨﺎﺑﺮاﻳﻦ وﻇﻴﻔﻪ ﺷﻤﺎﺳﺖ ﻛﻪ ﺗﺎ ﺟﺎﻳﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﻛﺪ را ﻗﺎﺑﻞ ﻓﻬﻢ ﻛﻨﻴﺪ.
ﺗﻮﺿﻴﺤﺎت: ﺗﻮﺿﻴﺤﺎت ﺑﺨﺸﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ وﻳﮋوال 2005 C#ﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﻣﻲ ﺷـﻮﻧﺪ .ﻳﻌﻨـﻲ ﺷـﻤﺎ ﻣـﻲ ﺗﻮاﻧﻴـﺪ در اﻳـﻦ ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ ،ﻫﺮ ﭼﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ و ﺑﻪ ﻫﺮ زﺑﺎﻧﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻨﻮﻳﺴﻴﺪ و ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛـﻪ ﻗﻮاﻋـﺪ ﺧﺎﺻـﻲ را رﻋﺎﻳـﺖ ﻛﻨﻴـﺪ .اﻳـﻦ ﻗﺴﻤﺖ ﻓﻘﻂ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻛﻪ در ﺣﺎل ﻣﻄﺎﻟﻌﻪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ اﺳﺖ ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ ﺗﺎ راﺣﺖ ﺗﺮ ﺑﻔﻬﻤﺪ آن ﻗـﺴﻤﺖ از ﺑﺮﻧﺎﻣـﻪ در ﺣـﺎل ﭼـﻪ ﻛﺎري اﺳﺖ. ﻧﻜﺘﻪ :ﻫﻤﻪ زﺑﺎﻧﻬﺎ ﻗﺎﺑﻠﻴﺖ ﻧﻮﺷﺘﻦ ﺗﻮﺿﻴﺤﺎت را دارﻧﺪ ،اﻣﺎ ﻧﻮع ﻣﺸﺨﺺ ﻛﺮدن ﺗﻮﺿﻴﺤﺎت در زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﻣﺘﻔﺎوت اﺳﺖ. اﻣﺎ ﺳﻮال اﻳﻨﺠﺎﺳﺖ ﻛﻪ ﺷﻤﺎ ﭼﻪ ﻣﻮﻗﻊ ﺑﻪ ﻧﻮﺷﺘﻦ ﺗﻮﺿﻴﺤﺎت ﻧﻴﺎز دارﻳﺪ؟ﺧﻮب ،اﻳﻦ ﻣﻮرد ﺑﺮ ﺣﺴﺐ ﻣﻮﻗﻌﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻓﺮق ﻣﻲ ﻛﻨﺪ ،اﻣﺎ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻗﺎﻧﻮن ﻛﻠﻲ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ ﻛﻪ ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ اﻟﮕﻮرﻳﺘﻢ ﺧﻮدﺗﺎن دﻗﺖ ﻛﻨﻴﺪ .ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ در "اﻣﺘﺤﺎن ﻛﻨﻴﺪ" ﻗﺴﻤﺖ ﻗﺒـﻞ ﻧﻮﺷﺘﻴﻢ داراي اﻟﮕﻮرﻳﺘﻢ زﻳﺮ ﺑﻮد: (1ﻳﻚ ﻣﻘﺪار را ﺑﺮاي intNumberﺗﻌﺮﻳﻒ ﻛﻦ. (2ﻣﻘﺪار 1را ﺑﻪ intNumberاﺿﺎﻓﻪ ﻛﻦ. (3ﻣﻘﺪار ﺟﺪﻳﺪ intNumberرا ﺑﻪ ﻛﺎرﺑﺮ ﻧﺸﺎن ﺑﺪه. ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻮﺿﻴﺤﺎﺗﻲ را ﺑﻪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ ﺑﺎ ﻗﺴﻤﺘﻬﺎي اﻟﮕﻮرﻳﺘﻢ ﻫﻤﺎﻫﻨﮓ ﺷﻮد: // Define a variable for intNumber ;int intNumber // Set the initial value ;intNumber = 27 // Add 1 to the value of intNumber ;intNumber = intNumber + 1 // Display the new value of intNumber (MessageBox.Show "Value of intNumber + 1 = " + intNumber, ;)""Variables
٦٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در وﻳﮋوال 2005 C#ﺗﻮﺿﻴﺤﺎت ﺧﻮد را ﺑﺎ دو ﻛﺎراﻛﺘﺮ اﺳﻠﺶ ) (//ﺷﺮوع ﻣﻲ ﻛﻨﻴﺪ .ﻫﺮ ﻣﺘﻨﻲ ﻛﻪ ﺑﻌﺪ از اﻳﻦ دو ﻛﺎراﻛﺘﺮ ﺗﺎ اﻧﺘﻬـﺎي آن ﺧﻂ ،ﻗﺮار ﺑﮕﻴﺮد ﺑﻪ ﻋﻨﻮان ﺗﻮﺿﻴﺢ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ،ﺣﺘﻲ اﮔﺮ در ﻳﻚ ﺧﻂ ﻛﺪي وﺟﻮد داﺷـﺘﻪ ﺑﺎﺷـﺪ و ﺷـﻤﺎ در اواﺳـﻂ ﺧﻂ از //اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﺘﻦ ﺑﻌﺪ از آن ﺑﻪ ﻋﻨﻮان ﺗﻮﺿﻴﺢ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮد .ﻣﺎﻧﻨﺪ: intNumber = intNumber + 1; // Add 1 to value of intNumber اﻳﻦ ﻣﻮرد ﻣﻨﻄﻘﻲ ﻫﻢ ﻫﺴﺖ ،زﻳﺮا ﻓﻘﻂ ﺗﻮﺿﻴﺤﺎت ﺑﻌﺪ از ﻋﻼﻣﺖ //ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺗﻮﺿﻴﺤﺎت ﻛﺪ ﻗﺒﻠﻲ ،ﻛـﻢ و ﺑـﻴﺶ ﻣﺸﺎﺑﻪ اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ ﻫﺴﺘﻨﺪ .ﻳﻚ ﺗﻜﻨﻴﻚ ﺧﻮب ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﺗﻮﺿﻴﺢ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﻳﻦ اﺳﺖ ﻛﻪ آن ﻗﺴﻤﺖ از اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻛﺪ آن ﻫﺴﺘﻴﺪ را در ﭼﻨﺪ ﻛﻠﻤﻪ ﺗﻮﺿﻴﺢ دﻫﻴﺪ. اﮔﺮ در ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎز داﺷﺘﻴﺪ ﻛﻪ از ﺑﻴﺶ از ﻳﻚ ﺧﻂ ﺗﻮﺿﻴﺢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ در اﺑﺘـﺪاي ﻫـﺮ ﺧـﻂ از // اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،در ﺟﺎﻳﻲ ﻛﻪ ﺗﻮﺿﻴﺤﺎت ﺷﺮوع ﻣﻲ ﺷﻮﻧﺪ از ﻋﻼﻣﺖ * /اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ وﻳﮋوال C#ﺗﻤﺎم ﻣـﺘﻦ ﺑﻌـﺪ از اﻳـﻦ ﻋﻼﻣﺖ را ﺗﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﻪ ﻋﻼﻣﺖ */ﺑﺮﺳﺪ ﺑﻪ ﻋﻨﻮان ﺗﻮﺿﻴﺢ در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮد .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﺗﻤﺎم ﺗﻮﺿﻴﺤﺎت ﻧﻮﺷﺘﻪ ﺷﺪه در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ را در ﻳﻚ ﻗﺴﻤﺖ ﺑﻪ ﺻﻮرت زﻳﺮ وارد ﻛﻨﻴﻢ: /* 1) Define a variable for intNumber 2) Set the initial value 3) Add 1 to the value of intNumber 4) Display the new value of intNumber */ ;int intNumber ﻳﻜﻲ دﻳﮕﺮ از روﺷﻬﺎي ﺗﻮﻟﻴـﺪ ﺑﻼﻛﻬـﺎي ﺗﻮﺿـﻴﺤﺎت ﺑـﺮاي ﻣﺘـﺪﻫﺎي ﺑﺮﻧﺎﻣـﻪ ،اﺳـﺘﻔﺎده از وﻳﮋﮔـﻲ دروﻧـﻲ XML Document Commentدر وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005اﺳﺖ .ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ وﻳﮋﮔﻲ ،ﻣﻜﺎن ﻧﻤﺎ را در ﺧﻂ ﺧﺎﻟﻲ ﺑﺎﻻي ﻣﺘﺪ ﻣـﻮرد ﻧﻈﺮﺗـﺎن ﻗـﺮار دﻫﻴﺪ و ﺳﻪ ﻛﺎراﻛﺘﺮ اﺳﻠﺶ ) (///ﺗﺎﻳﭗ ﻛﻨﻴﺪ .ﻳﻚ ﺑﻼك ﺗﻮﺿﻴﺤﺎت ،ﻫﻤﺎﻧﻨﺪ ﻛﺪ زﻳﺮ ،ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد. >/// <summary /// >/// </summary >/// <param name="sender"></param >/// <param name="e"></param )private void btnAdd_Click(object sender, EventArgs e { اﻣﺎ ﻧﻜﺘﻪ اي ﻛﻪ در ﻣﻮرد اﻳﻦ وﻳﮋﮔﻲ ﺟﺎﻟﺐ اﺳﺖ ،اﻳﻦ اﺳﺖ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻣﻘـﺎدﻳﺮ ﻣﺮﺑـﻮط ﺑـﻪ ﻗـﺴﻤﺖ nameرا در اﻳـﻦ ﺑﻼك ﻫﺎ ﺑﺮ اﺳﺎس ﻧﺎم ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻣﺘﺪ ﺷﻤﺎ ﻛﺎﻣﻞ ﻣﻲ ﻛﻨﺪ .اﮔﺮ در ﻣﺘﺪ ﻫﻴﭻ ﭘﺎراﻣﺘﺮي ﻧﺪاﺷـﺘﻪ ﺑﺎﺷـﻴﺪ ،ﻗـﺴﻤﺖ > <paramاز اﻳـﻦ ﺑﻼك ﺗﻮﺿﻴﺤﺎت ﺣﺬف ﻣﻲ ﺷﻮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻳﻦ ﺑﻼك ﺗﻮﺿﻴﺤﺎت را اﻳﺠﺎد ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﺧﻼﺻﻪ از ﻋﻤﻠﻜﺮد ﻣﺘﺪ را در ﻗﺴﻤﺖ summaryوارد ﻛﻨﻴـﺪ و ﻳـﺎ ﻫﺮ ﺗﻮﺿﻴﺢ اﺿﺎﻓﻲ ﻛﻪ ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ﺑﺎﻳﺪ در ﻧﻈﺮ داﺷﺖ را ﻧﻴﺰ در اﻳﻦ ﺑﻼك ﺑﻨﻮﻳﺴﻴﺪ .اﮔﺮ ﻣﺘﺪ ﺷـﻤﺎ ﻣﻘـﺪاري را ﺑﺮﮔﺮداﻧـﺪ ﺑﺨـﺶ > <returnﻫﻢ ﺑﻪ اﻳﻦ ﺑﻼك اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ در راﺑﻄﻪ ﺑﺎ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ از ﻣﺘﺪ ،در آن ﺗﻮﺿﻴﺤﺎﺗﻲ ﺑﻨﻮﻳﺴﻴﺪ. ﺗﻮﺿﻴﺤﺎت داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﻋﻤﻮﻣﺎً ﺑﺮاي درك ﺑﻬﺘﺮ ﻛﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ،ﭼﻪ ﺑﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻛﻪ ﺗـﺎ ﻛﻨـﻮن ﻛـﺪ ﺷـﻤﺎ را ﻧﺪﻳﺪه اﺳﺖ ﭼﻪ ﺑﺮاي ﺷﻤﺎ اﮔﺮ ﻣﺪت زﻣﺎن ﻃﻮﻻﻧﻲ ﻛﺪ را ﻣﺮور ﻧﻜﺮده ﺑﺎﺷﻴﺪ و اﻛﻨﻮن ﺑﺨﻮاﻫﻴﺪ آن را ﺗﻐﻴﻴﺮ ﺑﺪﻫﻴﺪ .در ﻛـﻞ ﺗﻮﺿـﻴﺤﺎت ﺑـﻪ
٦١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺎﺗﻲ راﺟﻊ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺷﺎره ﻣﻴﻜﻨﻨﺪ ﻛﻪ در ﻧﮕﺎه اول ﺑﻪ ﻛﺪ ﻣﺸﺨﺺ ﻧﻴﺴﺘﻨﺪ و ﻳﺎ در ﻣﻮرد ﻋﻤﻠﻜﺮد ﻛﺪ ﺧﻼﺻﻪ اي را ﺑﻴـﺎن ﻣـﻲ ﻛﻨﻨـﺪ ﺗـﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺘﻮاﻧﺪ ﺑﺪون دﻧﺒﺎل ﻛﺮدن ﺧﻂ ﺑﻪ ﺧﻂ ﻛﺪ از ﻋﻤﻠﻜﺮد آن ﻗﺴﻤﺖ ﻣﻄﻠﻊ ﺷﻮد. ﺑﻪ زودي ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ ﻛﻪ ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ روﺷﻬﺎي ﺧﺎص ﺧﻮدش را ﺑﺮاي ﺗﻮﺿﻴﺢ ﻧﻮﺷﺘﻦ دارد .اﮔﺮ ﺷﻤﺎ ﺑﺮاي ﻳﻚ ﺷﺮﻛﺖ ﺑﺰرگ ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ ،ﻳﺎ ﻣﺪﻳﺮ ﺷﻤﺎ ﺑﺮ ﻛﺪ ﻧﻮﻳﺴﻲ اﺳﺘﺎﻧﺪارد ﺗﺎﻛﻴﺪ داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺑﻪ ﺷﻤﺎ ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﺗﻮﺿﻴﺤﺎت ﺧﻮد را در ﭼﻪ ﻗﺎﻟﺒﻬﺎﻳﻲ ﺑﻨﻮﻳﺴﻴﺪ و ﻳﺎ اﻳﻨﻜﻪ در ﻛﺪام ﻗﺴﻤﺖ از ﻛﺪ ﺗﻮﺿﻴﺢ ﺑﻨﻮﻳﺴﻴﺪ و در ﻛﺪام ﻗﺴﻤﺖ ﻧﻨﻮﻳﺴﻴﺪ.
ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ: ﻳﻜﻲ دﻳﮕﺮ از ﻣﻮاردي ﻛﻪ ﻣﻮﺟﺐ ﺧﻮاﻧﺎﻳﻲ ﺑﻴﺸﺘﺮ ﻛﺪ ﻣﻴﺸﻮد اﺳﺘﻔﺎده زﻳﺎد از ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ ﺑﻴﻦ ﻛﺪﻫﺎ اﺳـﺖ .ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﻓـﻀﺎي ﺑـﻴﻦ ﻛﻠﻤﺎت در اﻧﮕﻠﻴﺴﻲ ﻣﻮﺟﺐ ﺑﻬﺘﺮ ﺧﻮاﻧﺪه ﺷﺪن ﻣﺘﻦ ﻣﻲ ﺷﻮد ،ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ در ﺑﺮﻧﺎﻣﻪ )ﻓﻀﺎ ﻫﺎﻳﻲ ﺑﺮ روي ﺻﻔﺤﻪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛـﺎراﻛﺘﺮ ﻫﺎ اﺷﻐﺎل ﻧﻤﻲ ﺷﻮﻧﺪ( ﻣﻮﺟﺐ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻛﺪﻫﺎ راﺣﺖ ﺗﺮ ﺧﻮاﻧﺪه ﺷﻮﻧﺪ .ﻣﺜﻼ اﮔﺮ در ﻣﺜﺎل ﻗﺒﻠﻲ در ﻫﺮ ﺧﻂ ،ﻗﺒـﻞ از ﺗﻮﺿـﻴﺤﺎت از ﻳـﻚ ﺧﻂ ﺧﺎﻟﻲ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﻛﺴﻲ ﻛﻪ ﻛﺪ را ﻣﻲ ﺧﻮاﻧﺪ ﻣﺘﻮﺟﻪ ﺷﻮد ﻛﻪ ﻫﺮ ﻛﺪام از اﻳﻦ ﺑﺨﺸﻬﺎ ﻳﻚ ﻛﺎر ﺧﺎص را اﻧﺠﺎم ﻣـﻲ دﻫﻨﺪ. در ﻓﺼﻞ ﺑﻌﺪي ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﻢ ﻛﻨﺘﺮل اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ وﺳﻴﻠﻪ ﺑﻼﻛﻬﺎي ﺗﻜﺮار ) (forو ﻳﺎ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ) (ifﺗﻮﺿـﻴﺢ ﺑﺪﻫﻴﻢ ،ﺑﺎ دﻟﻴﻞ اﺳﺘﻔﺎده از ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ .ﻫﻤﻴﻦ ﻃﻮر ﻣﺘﻮﺟﻪ ﻣﻲ ﺷﻮﻳﺪ ﻛﻪ ﻣﻘﺪار و ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ در ﺑﺮﻧﺎﻣﻪ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﺘﻔﺎوت اﺳﺖ .ﻓﻌﻼ از زﻳﺎد ﻓﺎﺻﻠﻪ ﻗﺮار دادن ﺑﻴﻦ ﻛﺪﻫﺎ ﻧﺘﺮﺳﻴﺪ ،اﻳﻦ ﻣﻮرد ﺧﻮاﻧﺎﻳﻲ ﻛﺪ ﺷﻤﺎ را ﺑﻪ ﻣﻘﺪار زﻳﺎدي اﻓﺰاﻳﺶ ﻣﻲ دﻫﺪ ،ﻣﺨﺼﻮﺻﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺣﺠﻢ زﻳﺎدي از ﻛﺪ را در ﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﺪ. ﻧﻜﺘﻪ :ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ ،ﻓﻀﺎﻫﺎي ﺧﺎﻟﻲ ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ و ﻫﻤﭽﻨﻴﻦ ﺗﻮﺿﻴﺤﺎت ﺑﺮﻧﺎﻣﻪ را ﻧﺎدﻳﺪه ﻣﻴﮕﻴﺮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻴﻦ اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓـﻀﺎي ﺧﺎﻟﻲ و ﺗﻮﺿﻴﺤﺎت زﻳﺎد و ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺪون اﻳﻦ ﻣﻮارد ،از ﻟﺤﺎظ ﺳﺮﻋﺖ و ﻛﺎراﻳﻲ ﻫﻴﭻ ﺗﻔﺎوﺗﻲ ﻧﻴﺴﺖ.
ﻧﻮع ﻫﺎي داده اي: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ را ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ ﺗﻘﺮﻳﺒﺎ ﭼﻪ ﻧﻮع اﻃﻼﻋﺎﺗﻲ را ﻣﻴﺨﻮاﻫﻴﺪ در آن ذﺧﻴﺮه ﻛﻨﻴﺪ .ﺗﺎ اﻳﻨﺠﺎ در ﻣﺜﺎل ﻗﺒﻞ ،ﻣﺘﻐﻴﻴﺮي را دﻳﺪﻳﺪ ﻛﻪ ﻣﻘﺎدﻳﺮ ﺻﺤﻴﺢ را در ﺧﻮد ﻧﮕﻪ ﻣﻴﺪاﺷﺖ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ را در وﻳﮋوال 2005 C#ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﺑﻪ آن ﺑﮕﻮﻳﻴﺪ ﻛﻪ ﭼﻪ ﻧﻮع اﻃﻼﻋـﺎﺗﻲ را ﻣﻴﺨﻮاﻫﻴـﺪ در آن ذﺧﻴﺮه ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺣﺪس زده اﻳﺪ ،اﻳﻦ ﻣﻮارد ﺑﻪ ﻋﻨﻮان ﻧﻮع ﻫﺎي داده اي ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮﻧﺪ و ﺗﻤﺎم زﺑﺎﻧﻬﺎي ﻣﻬـﻢ ،ﺗﻌـﺪاد زﻳـﺎدي ﻧﻮع داده اي دارﻧﺪ ﻛﻪ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﻧﻮع اﻃﻼﻋﺎت داﺧﻞ ﻣﺘﻐﻴﻴﺮ ﺧﻮد را از ﺑﻴﻦ آﻧﻬﺎ اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﻧﻮع داده اي ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺗﺎﺛﻴﺮ زﻳﺎدي ﺑـﺮ اﻳﻦ ﻛﻪ ﭼﮕﻮﻧﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ را اﺟﺮا ﻛﻨﺪ دارد .در اﻳﻦ ﺑﺨﺶ ﻧﮕﺎه دﻗﻴﻘﺘﺮي ﺑﺮ ﭼﮕﻮﻧﮕﻲ ﻛﺎر ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺧﻮاﻫﻴﻢ داﺷـﺖ .ﻫﻤﭽﻨـﻴﻦ ﭼﮕﻮﻧﮕﻲ ﺗﺎﺛﻴﺮ ﻧﻮع ﻳﻚ ﻣﺘﻐﻴﻴﺮ را در ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
ﻛﺎرﻛﺮدن ﺑﺎ اﻋﺪاد:
٦٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ ﺑﺎ اﻋﺪاد در وﻳﮋوال 2005 C#ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ دو ﻧﻮع ﻋﺪد داﺷﺘﻪ ﺑﺎﺷﻴﺪ :اﻋﺪاد ﺻﺤﻴﺢ و اﻋﺪاد اﻋﺸﺎري .ﻫﺮ ﻛﺪام از اﻳﻦ اﻋﺪاد ﻛﺎرﺑﺮد ﺧﺎص ﺧﻮدﺷﺎن را دارﻧﺪ .ﻣﺜﻼ اﻋﺪاد ﺻﺤﻴﺢ ﺗﻮاﻧﺎﻳﻲ ﻧﮕﻬﺪاري ﺑﺨﺶ اﻋﺸﺎري را ﻧﺪارﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﻣﺤﺎﺳﺒﺎﺗﻲ ﻛـﻪ ﻣﻤﻜﻦ اﺳﺖ ﻧﺘﻴﺠﻪ ﺷﺎﻣﻞ اﻋﺸﺎر ﻫﻢ ﺑﺎﺷﺪ ﻧﺒﺎﻳﺪ از ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﺻﺤﻴﺢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. در ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰارﻫﺎ ،ﺑﻴﺸﺘﺮ از اﻋﺪاد ﺻﺤﻴﺢ ﺑﺮاي ﺷﻤﺮدن ﻣﺮاﺗﺒﻲ ﻛﻪ ﻳﻚ اﺗﻔﺎق رخ ﻣﻴﺪﻫﺪ اﺳﺘﻔﺎده ﻣﻴﺸﻮد ﺗﺎ ﺑـﺮاي اﻧﺠـﺎم ﻣﺤﺎﺳـﺒﺎت. ﺑﺮاي ﻣﺤﺎﺳﺒﺎت ﺑﻴﺸﺘﺮ از اﻋﺪاد اﻋﺸﺎري اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ. ﻣﺜﻼ ،ﻓﺮض ﻛﻨﻴﺪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ اي ﻫﺴﺘﻴﺪ ﻛﻪ اﻃﻼﻋﺎت ﻣﺸﺘﺮﻛﻴﻦ را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ .ﻫﻤﭽﻨﻴﻦ ﻓﺮض ﻣﻴﻜﻨﻴﻢ ﻛـﻪ ﺷـﻤﺎ اﻃﻼﻋﺎت 100ﻣﺸﺘﺮك را در ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺧﻮد دارﻳﺪ .زﻣﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﺮوع ﺑـﻪ ﻛـﺎر ﻛـﺮد ،اﻃﻼﻋـﺎت ﻣـﺸﺘﺮك اول را در ﺻـﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ .در اﻳﻨﺠﺎ ﺷﻤﺎ ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ اﻃﻼﻋﺎت ﻛﺪام ﻣﺸﺘﺮك در ﺻﻔﺤﻪ ﭼﺎپ ﺷﺪه ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮ درﺧﻮاﺳﺖ ﻛﺮد اﻃﻼﻋﺎت ﻣﺸﺘﺮك ﺑﻌﺪي را ﻣﺸﺎﻫﺪه ﻛﻨﺪ ،ﺑﺪاﻧﻴﺪ ﻛﺪام اﻃﻼﻋﺎت را ﺑﺎﻳﺪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. ﻣﻌﻤﻮﻻ اﮔﺮ ﻫﺮ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ را ﻛﻪ ﺣﺎوي اﻃﻼﻋﺎت ﻣﺸﺘﺮﻛﻴﻦ ﺑﺎﺷﻨﺪ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ،ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛـﻪ در آن ﻫـﺮ ﻣـﺸﺘﺮك داراي ﻳـﻚ ﺷﻤﺎره ﻣﺨﺼﻮص ﺑﻪ ﺧﻮد اﺳﺖ .اﻳﻦ ﺑﻪ اﻳﻦ ﺧﺎﻃﺮ اﺳﺖ ﻛﻪ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ راﺣﺖ ﺗﺮ ﻣﻴﺘﻮاﻧﻨﺪ ﺑﺎ اﻋﺪاد ﻛﺎر ﻛﻨﻨﺪ ﺗـﺎ ﺑـﺎ اﺳـﺎﻣﻲ .ﻣﻌﻤـﻮﻻ اﻳـﻦ ﺷﻤﺎره ﻫﺎي ﻣﺨﺼﻮص ﻛﻪ ﺑﻪ ﻣﺸﺘﺮﻛﻴﻦ داده ﻣﻴﺸﻮد ،ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ اﺳﺖ ﻛﻪ ﺑﻪ آن ﺷﻨﺎﺳﻪ 1ﻳﺎ IDﮔﻔﺘﻪ ﻣﻴـﺸﻮد .ﺑﻨـﺎﺑﺮاﻳﻦ در ﻣﺜـﺎل ﻗﺒﻠﻲ ﻫﻢ ﻛﻪ ﻣﺎ ﻟﻴﺴﺘﻲ از 100ﻣﺸﺘﺮك را در ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺧﻮد داﺷﺘﻴﻢ ،ﻫﺮ ﻣﺸﺘﺮك داراي ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﻣﺨﺼﻮص ﺑﻪ ﺧـﻮد از 1 ﺗﺎ 100اﺳﺖ .ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺮاي ﭼﺎپ اﻃﻼﻋﺎت ﻣﺸﺘﺮﻛﻴﻦ ،ﻣﻴﺘﻮاﻧﺪ ﺷﻤﺎره آﺧﺮﻳﻦ ﻣﺸﺘﺮﻛﻲ ﻛﻪ اﻃﻼﻋﺎت او ﭼـﺎپ ﺷـﺪه اﺳـﺖ را در ﻳـﻚ ﻣﺘﻐﻴﻴﺮ ﻧﮕﻪ دارد .زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮ درﺧﻮاﺳﺖ ﻛﺮد ﺗﺎ اﻃﻼﻋﺎت ﻣﺸﺘﺮك ﺑﻌﺪي را ﺑﺒﻴﻨﺪ ،ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﻳﻚ واﺣﺪ ﺑـﻪ ﺷﻨﺎﺳـﻪ آﺧـﺮﻳﻦ ﻛﺎرﺑﺮي ﻛﻪ اﻃﻼﻋﺎت او ﭼﺎپ ﺷﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ و اﻃﻼﻋﺎت ﻣﺸﺘﺮك ﺟﺪﻳﺪ را ﭼﺎپ ﻛﻨﻴﺪ. اﻳﻦ ﮔﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ را زﻣﺎﻧﻲ ﻛﻪ در ﻣﻮرد ﻣﺒﺎﺣﺚ ﭘﻴﺸﺮﻓﺘﻪ ﺗﺮي ﻣﺜﻞ ﺑﺎﻧﻜﻬﺎي اﻃﻼﻋﺎﺗﻲ ﺻﺤﺒﺖ ﻛﺮدﻳﻢ ،ﺗﻤﺮﻳﻦ ﺧﻮاﻫﻴﻢ ﻛـﺮد .اﻣـﺎ ﻓﻌـﻼً ﺑﺪاﻧﻴﺪ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻌﻤﻮﻻ از اﻋﺪاد ﺻﺤﻴﺢ ﺑﻴﺸﺘﺮ از اﻋﺪاد اﻋﺸﺎري اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ ﻣﻌﻤﻮل روي اﻋﺪاد ﺻﺤﻴﺢ: در اﻳﻦ ﻗﺴﻤﺖ ﺷﻤﺎ ﭘﺮوژه ﺟﺪﻳﺪي ﺑﺮاي اﻧﺠﺎم ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ ﺧﻮاﻫﻴﺪ ﻧﻮﺷﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ اﻋﺪاد ﺻﺤﻴﺢ (1ﺑﺎ اﻧﺘﺨﺎب ﻣﻨﻮي File New Projectﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ در وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005اﻳﺠﺎد ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه New Projectﮔﺰﻳﻨﻪ Windows Applicationرا از ﻗﺴﻤﺖ ﺳﻤﺖ راﺳﺖ اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ )ﺑﻪ ﻋﻜﺲ 1-3رﺟﻮع ﻛﻨﻴﺪ( .ﻧﺎم ﭘﺮوژه را IntegerMathوارد ﻛﻨﻴﺪ و روي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ. (2ﻗﺒﻞ از ﻫﺮ ﭼﻴﺰ ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﻪ ﻓـﺮم ﺧـﻮد اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .ﺧﺎﺻـﻴﺖ Nameآن را ﺑـﻪ btnIntMathو ﺧﺎﺻﻴﺖ Textآن را ﺑﻪ Math Testﺗﻐﻴﻴﺮ دﻫﻴﺪ .روي ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ و در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه ﺑﺮاي روﻳﺪاد Clickﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺗﺎﻳﭗ ﻛﻨﻴﺪ: )private void btnIntMath_Click(object sender, EventArgs e { // Declare variable Identifier
1
٦٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
int intNumber; // Set number, add numbers, and display results intNumber = 16; intNumber = intNumber + 8; MessageBox.Show("Addition test... " + intNumber, "Integer Math"); // Set number, subtract numbers, and display results intNumber = 24; intNumber = intNumber - 2; MessageBox.Show("Subtraction test... " + intNumber, "Integer Math"); // Set number, multiply numbers, and display results intNumber = 6; intNumber = intNumber * 10; MessageBox.Show("Multiplication test... " + intNumber,"Integer Math"); // Set number, divide numbers, and display results intNumber = 12; intNumber = intNumber / 6; MessageBox.Show("Division test... " + intNumber, "Integer Math"); } ﻧﻤـﺎﻳﺶ داده3-4 ﭼﻬﺎر ﻛﺎدر ﭘﻴﻐﺎم ﻣﺘﻮاﻟﻲ ﻫﻤﺎﻧﻨﺪ ﺷـﻜﻞ. ﻛﻠﻴﻚ ﻛﻨﻴﺪMath Test ( ﭘﺮوژه را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ3 . در ﻫﺮ ﻛﺪام ﻛﻠﻴﻚ ﻛﻨﻴﺪOK ﻣﻴﺸﻮﻧﺪ و ﺷﻤﺎ ﺑﺎﻳﺪ روي
4-3 ﺷﻜﻞ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻴﻜﻨﺪ؟ در، ﺷﻤﺎ ﻗﺒﻼ ﻛـﺎرﺑﺮد ﻋﻤﻠﮕـﺮ ﺟﻤـﻊ را دﻳـﺪه اﻳـﺪ. ﺧﻴﻠﻲ ﮔﻴﺞ ﻛﻨﻨﺪه ﻧﻴﺴﺘﻨﺪ، ﻫﻴﭻ ﻛﺪام از ﻛﺪﻫﺎﻳﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ﻧﻮﺷﺘﻴﺪ،ﺧﻮﺷﺒﺨﺘﺎﻧﻪ .اﻳﻨﺠﺎ ﻫﻢ از آن دوﺑﺎره اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ
٦٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Set number, add numbers, and display results ;intNumber = 16 ;intNumber = intNumber + 8 MessageBox.Show("Addition test... " + intNumber, ;)""Integer Math ﭼﻴﺰي ﻛﻪ در اﻳﻦ ﻛﺪ ﺷﻤﺎ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻴﮕﻮﻳﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ: (1ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ﺑﺮاﺑﺮ 16ﻗﺮار ﺑﺪه. (2ﺳﭙﺲ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ﺑﺮاﺑﺮ ﻣﻘﺪار ﻛﻨﻮﻧﻲ اﻳﻦ ﻣﺘﻐﻴﻴﺮ )ﻋﺪد (16ﺑﻪ اﺿﺎﻓﻪ 8ﻗﺮار ﺑﺪه. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻛﺎدر ﭘﻴﻐﺎم ﺷﻜﻞ 3-4ﻣﻲ ﺑﻴﻨﻴﺪ ،ﻣﻘﺪار 24ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ درﺳﺖ اﺳﺖ. ﻋﻤﻠﮕﺮ ﺗﻔﺮﻳﻖ در اﻳﻨﺠﺎ ﻋﻼﻣﺖ ) (-اﺳﺖ ﻛﻪ ﻋﻤﻠﻜﺮد آن را در ﻛﺪ زﻳﺮ ﻣﻲ ﺑﻴﻨﻴﺪ: // Set number, subtract numbers, and display results ;intNumber = 24 ;intNumber = intNumber - 2 MessageBox.Show("Subtraction test... " + intNumber, ;)""Integer Math دوﺑﺎره ،ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﺟﻤﻊ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻲ ﮔﻮﻳﻴﺪ ﻛﻪ: (1ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ﺑﺮاﺑﺮ 24ﻗﺮار ﺑﺪه. (2ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ﺑﺮاﺑﺮ ﻣﻘﺪار ﻛﻨﻮﻧﻲ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ) (24ﻣﻨﻬﺎي 2ﻗﺮار ﺑﺪه. ﻋﻤﻠﮕﺮ ﺿﺮب ،ﻋﻼﻣﺖ ﺳﺘﺎره اﺳﺖ )*( ﻛﻪ ﻛﺎرﺑﺮد آن در ﻛﺪ زﻳﺮ ﻣﺸﺨﺺ اﺳﺖ: // Set number, multiply numbers, and display results ;intNumber = 6 ;intNumber = intNumber * 10 MessageBox.Show("Multiplication test... " + ;)"intNumber,"Integer Math اﻟﮕﻮرﻳﺘﻢ اﻳﻦ ﻛﺪ ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ: (1ﻣﻘﺪار intNumberرا ﺑﺮاﺑﺮ 6ﻗﺮار ﺑﺪه. (2ﻣﻘﺪار intNumberرا ﺑﺮاﺑﺮ ﻣﻘﺪار ﻛﻨﻮﻧﻲ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ) (6ﺿﺮب در 10ﻗﺮار ﺑﺪه. در آﺧﺮ ،ﻋﻤﻠﮕﺮ ﺗﻘﺴﻴﻢ ﻳﻚ ﻋﻼﻣﺖ /اﺳﺖ ﻛﻪ در زﻳﺮ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ: // Set number, divide numbers, and display results ٦٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
intNumber = 12; intNumber = intNumber / 6; MessageBox.Show("Division test... " + intNumber, "Integer Math"); :و اﻟﮕﻮرﻳﺘﻢ آن ﻣﻄﺎﺑﻖ زﻳﺮ اﺳﺖ . ﻗﺮار ﺑﺪه12 را ﺑﺮاﺑﺮintNumber ( ﻣﻘﺪار1 . ﻗﺮار ﺑﺪه6 ( ﺗﻘﺴﻴﻢ ﺑﺮ12 را ﺑﺮاﺑﺮ ﻣﻘﺪار ﻛﻨﻮﻧﻲ اﻳﻦ ﻣﺘﻐﻴﻴﺮ )ﻳﻌﻨﻲintNumber ( ﻣﻘﺪار2
:ﺗﻨﺪ ﻧﻮﻳﺴﻲ در ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ اﻟﺒﺘﻪ ﻣﺴﻠﻤﺎ در اﺑﺘﺪا اﻳﻦ ﻧﻮع ﻧﻮﺷـﺘﻦ. ﺷﻤﺎ ﻛﺪﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ را ﺑﻪ ﻧﺤﻮي ﺑﺴﻴﺎر ﻛﻮﺗﺎﻫﺘﺮ ﺧﻮاﻫﻴﺪ ﻧﻮﺷﺖ،در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي . از آﻧﻬﺎ ﺑﻴﺸﺘﺮ اﺳﺘﻔﺎده ﺧﻮاﻫﻴﺪ ﻛﺮد، ﺑﻌﺪ از ﻣﻘﺪاري ﻛﺎر، اﻣﺎ ﺑﻪ زودي،ﻧﺴﺒﺖ ﺑﻪ ﻧﻮع ﻃﻮﻻﻧﻲ آﻧﻬﺎ ﻏﻴﺮ ﻣﻨﻄﻘﻲ ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ
اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي ﻣﺨﺘﺼﺮ ﺷﺪه:اﻣﺘﺤﺎن ﻛﻨﻴﺪ : ﺧﻄﻬﺎي ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. را ﻣﺠﺪدا ﺑﺎز ﻛﻨﻴﺪForm1.cs ﺑﺮوﻳﺪ و ﻓﺎﻳﻞ2005 ( ﺑﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ1 private void btnIntMath_Click(object sender, EventArgs e) { // Declare variable int intNumber; // Set number, add numbers, and display results intNumber = 16; intNumber += 8; MessageBox.Show("Addition test... " + intNumber, "Integer Math"); // Set number, subtract numbers, and display results intNumber = 24; intNumber -= 2; MessageBox.Show("Subtraction test... " + intNumber, "Integer Math"); // Set number, multiply numbers, and display results intNumber = 6; intNumber *= 10; MessageBox.Show("Multiplication test... " + intNumber,"Integer Math"); // Set number, divide numbers, and display results intNumber = 12; intNumber /= 6;
٦٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
MessageBox.Show("Division test... " + intNumber, ;)""Integer Math } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Math Testﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻧﺘﻴﺠـﻪ اي ﻣـﺸﺎﺑﻪ ﺑﺮﻧﺎﻣـﻪ ﻗﺒﻠـﻲ را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﻴﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي اﺳﺘﻔﺎده از ﺣﺎﻟﺖ ﻣﺨﺘﺼﺮ ﺷﺪه ﻋﻤﻠﮕﺮ ﻫﺎ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻧﺎم ﻣﺘﻐﻴﻴﺮ را ﻛﻪ ﺑﺮاي ﺑﺎر دوم ﺗﻜﺮار ﺷـﺪه اﺳـﺖ ﺣـﺬف ﻛﻨﻴـﺪ و ﻋﻼﻣـﺖ رﻳﺎﺿﻲ ﻣﺮﺗﺒﻂ ﺑﺎ آن را ﻧﻴﺰ ﺑﻪ ﻗﺒﻞ از ﻣﺴﺎوي اﻧﺘﻘﺎل دﻫﻴﺪ .ﻣﺜﻼ در ﺣﺎﻟﺖ: ;intNumber = intNumber + 8 ﻋﺒﺎرت ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد: ;intNumber += 8
ﻣﺤﺪودﻳﺖ ﻛﺎر ﺑﺎ اﻋﺪاد ﺻﺤﻴﺢ: ﻣﺤﺪودﻳﺖ اﺻﻠﻲ ﻛﻪ در ﻛﺎر ﺑﺎ اﻋﺪاد ﺻﺤﻴﺢ وﺟﻮد دارد اﻳﻦ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﻋﺪدي داﺷﺘﻪ ﺑﺎﺷـﻴﺪ ﻛـﻪ داراي ﻗـﺴﻤﺖ اﻋـﺸﺎري ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل اﺳﺘﻔﺎده از ﻛﺪ زﻳﺮ ﻣﻮﺟﺐ اﻳﺠﺎد ﺧﻄﺎ در زﻣﺎن ﻛﺎﻣﭙﺎﻳﻞ ﺑﺮﻧﺎﻣﻪ ﻣﻴﺸﻮد: // Try multiplying numbers ;int intNumber = 34 ;intNumber *= 10.234 اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ﺑﻪ ﻋﻠﺖ ﺧﻄﺎﻳﻲ ﻛﻪ در ﻗﺴﻤﺖ ﻛﺎﻣﭙﺎﻳﻞ ﺑﻪ وﺟﻮد ﻣﻲ آﻳﺪ ﻣﺘﻮﻗﻒ ﻣﻲ ﺷﻮد .زﻳﺮا ﻣﺘﻐﻴﻴﺮ intNumberاز ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ اﺳﺖ و ﺷﻤﺎ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ آن را در ﺣﺎﻟﺖ ﻋﺎدي در ﻳﻚ ﻋﺪد اﻋﺸﺎري ﺿﺮب ﻛﻨﻴﺪ. در ﺗﻘﺴﻴﻢ دو ﻋﺪد ﻫﻢ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ را ﺑﺮ ﻳﻚ ﻋﺪد اﻋﺸﺎري ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ ،ﺑﺎ ﺧﻄﺎﻳﻲ ﻣﺸﺎﺑﻪ ﺣﺎﻟﺖ ﺟﻤﻊ روﺑـﺮو ﻣﻴـﺸﻮﻳﺪ. اﻣﺎ ﻛﺪ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ: …// Try deviding numbers ;int intNumber = 12 ;intNumber /= 7 در اﻳﻦ ﻛﺪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberرا ) (12ﻛﻪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ اﺳﺖ ﺑﺮ 7ﻛﻪ آن ﻧﻴﺰ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ اﺳﺖ ﺗﻘﺴﻴﻢ ﻛﺮده اﻳﻢ و ﺟﻮاب ﺑﺮاﺑﺮ 1,71اﺳﺖ .در اﻳﻦ ﻣﻮاﻗﻊ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺧﻄﺎﻳﻲ ﺗﻮﻟﻴﺪ ﻧﻤﻴﻜﻨﺪ ،اﻣﺎ ﻣﻘﺪار ﻛﻪ در ﻣﺘﻐﻴﻴﺮ intNumberذﺧﻴـﺮه ﻣﻴـﺸﻮد ﺑـﺎ ﺟﻮاﺑﻲ ﻛﻪ ﺷﻤﺎ اﻧﺘﻈﺎر دارﻳﺪ ﺗﻔﺎوت دارد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ،ﺑﻌﺪ از اﺟﺮاي ﻛﺪ ﺑﺎﻻ ،ﺟﻮاب 1,71در intNumberﻧﺨﻮاﻫﺪ ﺑـﻮد ،ﺑﻠﻜـﻪ
٦٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻗﺴﻤﺖ اﻋﺸﺎر اﻳﻦ ﻋﺪد ﺣﺬف ﻣﻴﺸﻮد و ﻣﻘﺪار 1در ﻣﺘﻐﻴﻴﺮ intNumberﻗﺮار ﻣﻴﮕﻴﺮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺗﺼﻮر ﻛﻨﻴـﺪ ،اﮔـﺮ ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﺨﻮاﻫﺪ ﺑﺎ اﻧﻮاع ﻣﺨﺘﻠﻒ داده ﻫﺎ ﻛﺎر ﻛﻨﺪ و از اﻋﺪاد ﺻﺤﻴﺢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﺑﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ. در ﻗﺴﻤﺖ ﺑﻌﺪي ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از اﻋﺪاد اﻋﺸﺎري ،از ﺑﺮوز ﻣﺸﻜﻼﺗﻲ ﻣﺎﻧﻨﺪ ﻗﺒﻞ ﺟﻠﻮﮔﻴﺮي ﻛﻨﻴﺪ.
اﻋﺪاد اﻋﺸﺎري: در ﻗﺴﻤﺖ ﻗﺒﻞ ﻣﺘﻮﺟﻪ ﺷﺪﻳﺪ ﻛﻪ اﻋﺪاد ﺻﺤﻴﺢ ﺑﺮاي اﻧﺠﺎم ﻣﺤﺎﺳﺒﺎت رﻳﺎﺿﻲ ﻣﻨﺎﺳﺐ ﻧﻴﺴﺘﻨﺪ .زﻳﺮا ﻧﺘﻴﺠـﻪ ﺑﻴـﺸﺘﺮ اﻳـﻦ ﻣﺤﺎﺳـﺒﺎت داراي ﻗﺴﻤﺖ اﻋﺸﺎري اﺳﺖ و اﻋﺪاد ﺻﺤﻴﺢ ﻫﻢ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﻗـﺴﻤﺖ اﻋـﺸﺎري را در ﺧـﻮد ﻧﮕﻬـﺪاري ﻛﻨﻨـﺪ .در اﻳـﻦ ﺑﺨـﺶ ﭼﮕـﻮﻧﮕﻲ اﻧﺠـﺎم ﻣﺤﺎﺳﺒﺎت رﻳﺎﺿﻲ ﺑﺎ اﻋﺪاد اﻋﺸﺎري را در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﻣﺎﻧﻨﺪ ﻣﺤﺎﺳﺒﻪ ﻣﺴﺎﺣﺖ و ﻣﺤﻴﻂ داﻳﺮه ﺗﻤﺮﻳﻦ ﺧﻮاﻫﻴﻢ ﻛـﺮد ،اﻣـﺎ ﻓﻌـﻼ ،در آزﻣﺎﻳﺶ ﻛﻨﻴﺪ زﻳﺮ ،ﻓﻘﻂ ﻣﻔﺎﻫﻴﻢ ﻛﻠﻲ را ﻣﻌﺮﻓﻲ ﻣﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻋﺪاد اﻋﺸﺎري (1ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ در وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﻪ ﻧﺎم Floating-Pt Mathاﻳﺠﺎد ﻛﻨﻴﺪ .ﻗﺒـﻞ از ﻫـﺮ ﭼﻴـﺰ ،ﻳـﻚ ﻛﻨﺘﺮل Buttonروي ﻓﺮم ﻗﺮار دﻫﻴﺪ و ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnFloatMathو ﺧﺎﺻـﻴﺖ Text آن را ﺑﺮاﺑﺮ Double Testﻗﺮار دﻫﻴﺪ. (2روي دﻛﻤﻪ btnFloatMathدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن ﻛﺪي را ﻛﻪ در زﻳﺮ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ وارد ﻛﻨﻴﺪ. Private void btnFloatMath_Click(object sender, )EventArgs e { // Declare variable ;double dblNumber // Set number, multiply numbers, and display results ;dblNumber = 45.34 ;dblNumber *= 4.333 MessageBox.Show("Multiplication test... " + ;)"dblNumber, "Floating Points // Set number, divide numbers, and display results ;dblNumber = 12 ;dblNumber /= 7 MessageBox.Show("Division test... " + dblNumber, ;)""Floating Points } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي ﻛﻠﻴﺪ Double Testﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 5-3را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
٦٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 5-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺘﻮﺟﻪ ﺷﺪﻳﺪ ﻣﻬﻤﺘﺮﻳﻦ ﺗﻐﻴﻴﺮ در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ،ﺗﻐﻴﻴﺮ ﻧﻮع ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ اﺳﺖ: // Declare variable ;double dblNumber ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي intاﺳﺘﻔﺎده ﻛﻨﻴﻢ ،از ﻛﻠﻤﻪ doubleاﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .اﻳﻦ ﻛﻠﻤﻪ ﺑـﻪ وﻳـﮋوال 2005 C#ﻣﻴﮕﻮﻳﺪ ﻛﻪ ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ در اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﺟﺎي اﻋﺪاد ﺻﺤﻴﺢ ،اﻋﺪاد ﺑﺎ ﻗﺴﻤﺖ اﻋﺸﺎر ﻗﺮار دﻫﻴﺪ .در ﻧﺘﻴﺠﻪ ،ﻫﺮ ﻋﻤﻠﻴـﺎﺗﻲ ﻛﻪ ﺑﺮ روي ﻣﺘﻐﻴﻴﺮ dblNumberاﻧﺠﺎم دﻫﻴﺪ از ﻧﻮع اﻋﺸﺎري ﺧﻮاﻫﺪ ﺑﻮد و ﻣﻴﺘﻮاﻧﺪ ﻗﺴﻤﺖ اﻋﺸﺎري را ﻧﻴـﺰ ﻧﮕﻬـﺪاري ﻛﻨـﺪ .ﻧﻜﺘـﻪ ﻣﻬﻢ دﻳﮕﺮ در ﻛﺪ ﺑﺎﻻ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﭘﻴﺸﻮﻧﺪ intاز ﭘﻴﺸﻮﻧﺪ dblاﺳﺘﻔﺎده ﻛﺮده اﻳﻢ ﺗﺎ ﻣﺸﺨﺺ ﺑﺎﺷـﺪ ﻛـﻪ ﻣﺘﻐﻴﻴـﺮ ﺑﺎﻻ اﻋﺪاد اﻋﺸﺎري از ﻧﻮع Doubleرا در ﺧﻮد ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﻨﺪ. اﻟﺒﺘﻪ ﺑﺎ اﻳﻦ ﻛﻪ ﻋﻤﻠﻴﺎت روي ﻣﺘﻐﻴﻴﺮ dblNumberﻗﺴﻤﺖ اﻋﺸﺎري را ﻧﻴﺰ ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﻨﺪ اﻣﺎ روش اﻧﺠﺎم ﻋﻤﻠﻴـﺎت ،ﻫﻤـﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﺑﺎ ﻋﻤﻠﻴﺎت روي اﻋﺪاد ﺻﺤﻴﺢ ﺗﻔﺎوﺗﻲ ﻧﺪارد. // Set number, multiply numbers, and display results ;dblNumber = 45.34 ;dblNumber *= 4.333 MessageBox.Show("Multiplication test... " + dblNumber, ;)""Floating Points اﮔﺮ ﻛﺪ ﺑﺎﻻ را اﺟﺮا ﻛﻨﻴﺪ ،ﻧﺘﻴﺠﻪ 196,45822را ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ ﻛﻪ ﻫﻤﺎﻧﻨﺪ دو ﻋﺪدي ﻛﻪ در ﻫﻢ ﺿﺮب ﺷﺪﻧﺪ داراي ﻗﺴﻤﺖ اﻋﺸﺎري ﻧﻴﺰ ﻫﺴﺖ .اﻟﺒﺘﻪ اﻋﺪادي ﻛﻪ در اﻳﻦ ﻣﺤﺎﺳﺒﺎت ﺑﻪ ﻛﺎر ﻣﻴﺮوﻧﺪ ﺣﺘﻤﺎ ﻧﺒﺎﻳﺪ داراي ﺑﺨﺶ ﺻﺤﻴﺢ ﺑﺎﺷﻨﺪ ،ﺑﻠﻜﻪ ﻣﺎﻧﻨﺪ ﻗﺴﻤﺖ ﺗﻘـﺴﻴﻢ ﺑﺮﻧﺎﻣـﻪ ﻗﺒـﻞ ﻣﻲ ﺗﻮاﻧﻨﺪ از دو ﻋﺪد ﺻﺤﻴﺢ ﺗﺸﻜﻴﻞ ﺷﺪه ﺑﺎﺷﻨﺪ ﻛﻪ در ﺻﻮرت ﻧﻴﺎز ﺣﺎﺻﻞ ﻋﺒﺎرت ﺑﺎ ﻗﺴﻤﺖ اﻋﺸﺎري ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮاي ﻣﺜﺎل ﺑﻪ ﻛﺪ زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ: // Set number, divide numbers, and display results ;dblNumber = 12 ;dblNumber /= 7 MessageBox.Show("Division test... " + dblNumber, ;)""Floating Points
٦٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﺘﻴﺠﻪ اﻳﻦ ﺗﻘﺴﻴﻢ داراي ﻗﺴﻤﺖ اﻋﺸﺎري ﻧﻴﺰ ﺧﻮاﻫﺪ ﺑﻮد زﻳﺮا ﻣﺘﻐﻴﻴﺮ dblNumberﺑﻪ ﮔﻮﻧﻪ اي ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ﻛـﻪ در ﺻـﻮرت ﻧﻴﺎز ﺑﺘﻮاﻧﺪ ﻗﺴﻤﺖ اﻋﺸﺎري اﻋﺪاد را ﻧﻴﺰ ﻧﮕﻬﺪاري ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ را اﺟﺮا ﻛﻨﻴـﺪ ،ﻋـﺪد 1,71428571428571را ﺑـﻪ ﻋﻨـﻮان ﻧﺘﻴﺠﻪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. ﻧﻜﺘﻪ :ﺑﻪ اﻋﺪاد اﻋﺸﺎري ،اﻋﺪاد ﺑﺎ ﻣﻤﻴﺰ ﺷﻨﺎور ﻧﻴﺰ ﮔﻔﺘﻪ ﻣﻴﺸﻮد .اﻳﻦ ﻧﺎﻣﮕﺬاري ﺑﻪ اﻳﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ اﻳﻦ اﻋﺪاد ﺑـﻪ ﺻـﻮرت ﻋـﺪد ﻋﻠﻤـﻲ ذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪ .در ﻧﻤﺎد ﮔﺬاري ﻋﻠﻤﻲ ﺑﺮاي اﻋﺪاد ،ﻳﻚ ﻋﺪد ﺑﻪ ﺻﻮرت ﺗﻮاﻧﻲ از 10و ﻋـﺪدي دﻳﮕـﺮ ﺑـﻴﻦ 1ﺗـﺎ 10وﺟـﻮد دارد .ﺑـﺮاي ﻣﺤﺎﺳﺒﻪ ﻣﻘﺪار واﻗﻌﻲ ﻋﺪد 10 ،ﺑﻪ ﺗﻮان ﻋﺪد اول ﻣﻲ رﺳﺪ و ﺳﭙﺲ در ﻋﺪد دوم ﺿﺮب ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜـﺎل ،ﻋـﺪد 10001ﺑـﻪ ﺻـﻮرت 1,0001*104و ﻋﺪد 0,0010001ﺑﻪ ﺻﻮرت 1,0001*10 -3ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد .در اﻳﻦ ﮔﻮﻧﻪ اﻋﺪاد ،ﻣﻤﻴـﺰ ﺑـﻴﻦ اﻋـﺪاد ﺑﻌـﺪ از رﻗـﻢ اول ﺷﻨﺎور اﺳﺖ .اﻋﺪاد اﻋﺸﺎري در ﻛﺎﻣﭙﻴﻮﺗﺮ ﻧﻴﺰ ﺑﺎ ﻫﻤﻴﻦ روش ﻧﮕﻬﺪاري ﻣﻲ ﺷﻮﻧﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ اﻳﻦ اﻋﺪاد در ﻣﺒﻨﺎي 10ﺑﻮدﻧﺪ اﻣﺎ اﻋـﺪاد در ﻛﺎﻣﭙﻴﻮﺗﺮ در ﻣﺒﻨﺎي 2ذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪ.
ﺣﺎﻟﺘﻬﺎي دﻳﮕﺮ: اﻋﺪاد اﻋﺸﺎري ﻋﻼوه ﺑﺮ ﻣﻘﺎدﻳﺮ ﻋﺪدي ،ﻣﻴﺘﻮاﻧﻨﺪ ﺣﺎﻟﺘﻬﺎي ﺧﺎص دﻳﮕﺮي را ﻧﻴﺰ ﻧﮕﻬﺪاري ﻛﻨﻨﺪ .ﺑﻌﻀﻲ از اﻳﻦ ﺣﺎﻟﺘﻬﺎ ﻋﺒﺎرﺗﻨﺪ از:
– NaNﻛﻪ ﺑﻪ ﻣﻌﻨﻲ " "Not a Numberﻳﺎ "ﻋﺪد ﻧﻴﺴﺖ" اﺳﺖ. ﺑﻲ ﻧﻬﺎﻳﺖ ﻣﻨﻔﻲ ﺑﻲ ﻧﻬﺎﻳﺖ ﻣﺜﺒﺖ
ﻣﺎ در اﻳﻦ ﻛﺘﺎب در ﻣﻮرد اﻳﻦ ﺣﺎﻟﺘﻬﺎ ﺻﺤﺒﺖ ﻧﺨﻮاﻫﻴﻢ ﻛﺮد ،اﻣﺎ در ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺤﺎﺳﺒﺎﺗﻲ و رﻳﺎﺿـﻲ ﻣﻴﺘـﻮان از اﻳـﻦ ﺣﺎﻟﺘﻬـﺎ ﻧﻴـﺰ اﺳﺘﻔﺎده ﻛﺮد.
اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ: در ﻗﺴﻤﺖ ﻗﺒﻠﻲ از اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ اﺳﺘﻔﺎده ﻛﺮدﻳﻢ ،اﻣﺎ در .NETﺷﻤﺎ ﺑﺮاي ﻧﮕﻬﺪاري اﻋﺪاد اﻋﺸﺎري ﺧـﻮد ﻣﻴﺘﻮاﻧﻴـﺪ از دو ﻧﻮع ﻋﺪد اﻋﺸﺎري اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ،ﺑﺨﺶ اﻋﺸﺎري ﻳﻚ ﻋﺪد ﻣﻤﻜﻦ اﺳﺖ ﺗﺎ ﺑﻲ ﻧﻬﺎﻳﺖ اداﻣﻪ ﭘﻴـﺪا ﻛﻨـﺪ )ﻣﺎﻧﻨـﺪ ﻋـﺪد ﭘﻲ( ،اﻣﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻲ ﻧﻬﺎﻳﺖ ﻓﻀﺎ ﺑﺮاي ﻧﮕﻬﺪاري اﻳﻦ اﻋﺪاد ﻧﺪارد ،ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻤﻴـﺸﻪ ﺑـﺮاي ﻧﮕﻬـﺪاري ﺗﻌـﺪاد ارﻗـﺎم اﻋـﺸﺎري ﻳـﻚ ﻋـﺪد ﻣﺤﺪودﻳﺘﻬﺎﻳﻲ وﺟﻮد دارد .اﻳﻦ ﻣﺤﺪودﻳﺖ ﺑﻪ اﻧﺪازه ﻳﺎ ﻓﻀﺎﻳﻲ ﺑﺴﺘﮕﻲ دارد ﻛﻪ ﻣﺘﻐﻴﻴﺮ ﺑﺮاي ﻧﮕﻬﺪاري ﻋﺪد از آن اﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ. اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ ﻣﻴﺘﻮاﻧﻨﺪ اﻋﺪاد از – 1,7 * 10308ﺗﺎ + 1,7 * 10308را ﺑﺎ دﻗﺘﻲ ﺑﺴﻴﺎر ﺑﺎﻻ ﻧﮕﻬﺪاري ﻛﻨﺪ )ﺑـﺎ دﻗـﺖ ﻳـﻚ ﭘﻨﻲ در 45ﺗﺮﻳﻠﻴﻮن دﻻر( .اﻋﺪاد ﺻﺤﻴﺢ ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ ﻣﻴﺘﻮاﻧﻨﺪ اﻋﺪاد از – 3,4 * 1038ﺗﺎ + 3,4 * 1038را ﻧﮕﻬﺪاري ﻛﻨﻨﺪ .اﻟﺒﺘﻪ اﻳـﻦ ﻋﺪد ﻫﻢ ﻋﺪد ﺑﺴﻴﺎر ﺑﺰرﮔﻲ اﺳﺖ اﻣﺎ ﻣﻴﺰان دﻗﺖ اﻳﻦ اﻋﺪاد ﺧﻴﻠﻲ ﻛﻤﺘﺮ از اﻋﺪاد ﺑﺎ دﻗـﺖ ﻣـﻀﺎﻋﻒ اﺳـﺖ )ﻳـﻚ ﭘﻨـﻲ در 330000دﻻر(. ﻣﺰﻳﺘﻲ ﻛﻪ اﻋﺪاد ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ دارﻧﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻧﺴﺒﺖ ﺑﻪ اﻋﺪاد ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ ﻓﻀﺎي ﻛﻤﺘﺮي در ﺣﺎﻓﻈﻪ اﺷﻐﺎل ﻣﻲ ﻛﻨﻨﺪ و ﺳﺮﻋﺖ ﻣﺤﺎﺳﺒﻪ ﺑﺎﻻﺗﺮي دارﻧﺪ.
٧٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :ﺑﻪ ﺟﺰ در ﻣﻮاردي ﻛﻪ ﺑﻪ دﻗﺖ ﺑﺴﻴﺎر ﺑﺎﻻﻳﻲ ﻧﻴﺎز دارﻳﺪ ،از اﻋﺪاد ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ اﺳـﺘﻔﺎده ﻧﻜﻨﻴـﺪ و ﺑـﻪ ﺟـﺎي آن اﻋـﺪاد ﺑـﺎ دﻗـﺖ ﻣﻌﻤﻮﻟﻲ را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ .اﺳﺘﻔﺎده از اﻋﺪاد ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ ﺑﻪ ﺟﺎي اﻋﺪاد ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ ،ﻣﺨﺼﻮﺻﺎ در ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﺑـﺰرگ ﻣﻴﺘﻮاﻧـﺪ در ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﻪ ﺷﺪت ﺗﺎﺛﻴﺮﮔﺬار ﺑﺎﺷﺪ. ﺑﺮاي اﻧﺘﺨﺎب اﻳﻨﻜﻪ از ﭼﻪ ﻧﻮع ﻋﺪدي اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﺑﻪ ﻣﺤﺎﺳﺒﺎﺗﻲ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ اﻧﺠﺎم دﻫﻴﺪ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴـﺮ ﻫـﺎي ﻋﺪدي ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي doubleو ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻋﺪدي ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي float اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﻛﺎر ﺑﺎ رﺷﺘﻪ ﻫﺎ: رﺷﺘﻪ ﻣﺠﻤﻮﻋﻪ اي از ﻛﺎراﻛﺘﺮ اﺳﺖ ﻛﻪ اﺑﺘﺪا و اﻧﺘﻬﺎي آن ﺑﻪ وﺳﻴﻠﻪ ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل )"( ﻣﺸﺨﺺ ﻣﻲ ﺷﻮد .روش اﺳﺘﻔﺎده از رﺷـﺘﻪ ﻫـﺎ را در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ﺑﺮﻧﺎﻣﻪ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻳﺪه اﻳﺪ .رﺷﺘﻪ ﻫﺎ ﻋﻤﻮﻣﺎ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع داده ﺷﻮد در ﺑﺮﻧﺎﻣﻪ ﭼﻪ اﺗﻔﺎﻗﻲ اﻓﺘﺎده اﺳﺖ و ﭼﻪ اﺗﻔﺎﻗﻲ ﻣﻴﺨﻮاﻫﺪ رخ دﻫﺪ .ﻳﻚ اﺳﺘﻔﺎده دﻳﮕﺮ از رﺷﺘﻪ ﻫﺎ ،ذﺧﻴﺮه ﻗـﺴﻤﺘﻲ از ﻳﻚ ﻣﺘﻦ ﺑﺮاي اﺳﺘﻔﺎده از آن در ﻳﻚ اﻟﮕﻮرﻳﺘﻢ اﺳﺖ .در ﻃﻮل اﻳﻦ ﻛﺘﺎب ﺑﺎ رﺷﺘﻪ ﻫﺎي زﻳﺎدي ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮﻳﺪ ،ﻫﻤﺎﻧﻄﻮر ﻛـﻪ ﺗـﺎﻛﻨﻮن از رﺷﺘﻪ زﻳﺮ اﺳﺘﻔﺎده ﻛﺮده اﻳﺪ: MessageBox.Show("Multiplication test... " + dblNumber, ;)""Floating Points "… "Multiplication testو " "Floating Pointsﻧﻤﻮﻧﻪ ﻫـﺎﻳﻲ از رﺷـﺘﻪ ﻫـﺴﺘﻨﺪ ،زﻳـﺮا داراي ﻋﻼﻣﺖ )"( در اﺑﺘﺪا و اﻧﺘﻬﺎي ﺧﻮد ﻫﺴﺘﻨﺪ .اﻣﺎ ﻋﺒﺎرت dblNumberﭼﻲ؟ در ﻋﺒﺎرت ﺑﺎﻻ ،ﻣﻘﺪار ﻣﺘﻐﻴﻴـﺮ dblNumberﺑـﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﺷﺪه و ﭘﺲ از ﺗﺮﻛﻴﺐ ﺑﺎ دو رﺷﺘﻪ دﻳﮕﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ )ﭼﮕﻮﻧﮕﻲ ﺗﺒﺪﻳﻞ اﻳﻦ ﻣﺘﻐﻴﻴـﺮ ﻋـﺪدي ﺑـﻪ رﺷـﺘﻪ، ﺑﺤﺜﻲ اﺳﺖ ﻛﻪ ﺟﻠﻮﺗﺮ راﺟﻊ ﺑﻪ آن ﺻﺤﺒﺖ ﺷﺪه اﺳﺖ .اﻣﺎ ﻓﻌﻼ اﻳﻦ را ﺑﺪاﻧﻴﺪ ﻛﻪ در اﻳﻦ ﺟﺎ ﻳﻚ ﺗﺒﺪﻳﻞ ﺻﻮرت ﮔﺮﻓﺘﻪ اﺳﺖ( .ﺑـﺮاي ﻣﺜـﺎل اﮔﺮ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ dblNumberﺑﺮاﺑﺮ ﺑﺎ 27ﺑﺎﺷﺪ ،اﻳﻦ ﻣﻘﺪار ﺑﻪ ﻳﻚ ﻋﺒﺎرت رﺷﺘﻪ اي ﻛﻪ دو ﻛـﺎراﻛﺘﺮ ﻃـﻮل دارد ﺗﺒـﺪﻳﻞ ﻣﻴـﺸﻮد و ﺳﭙﺲ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﺑﺎ ﻳﻚ ﺳﺮي از ﻛﺎرﻫﺎﻳﻲ ﻛﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﺎ رﺷـﺘﻪ ﻫـﺎ اﻧﺠـﺎم دﻫﻴـﺪ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از رﺷﺘﻪ ﻫﺎ (1ﺑﺎ اﺳﺘﻔﺎده از ﮔﺰﻳﻨﻪ File New Projectﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﻧـﺎم آن را Stringsﻗﺮار دﻫﻴﺪ. (2ﺑــﺎ اﺳــﺘﻔﺎده از ﺟﻌﺒــﻪ اﺑــﺰار ،ﻳــﻚ ﻛﻨﺘــﺮل Buttonروي ﻓــﺮم ﻗــﺮار دﻫﻴــﺪ .ﺧﺎﺻــﻴﺖ Nameاﻳــﻦ دﻛﻤــﻪ را ﺑﺮاﺑــﺮ btnStringsو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Using Stringsﻗﺮار دﻫﻴﺪ .روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه ،ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪ: )private void btnStrings_Click(object sender, EventArgs e {
٧١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Declare variable ;string strData // Set the string value ;"!strData = "Hello, world // Display the result ;)"MessageBox.Show(strData, "Strings } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Using Stringsﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐـﺎﻣﻲ ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 6-3ﻧﻤـﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 6-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮي ﻛﻪ ﺑﺘﻮاﻧﺪ رﺷﺘﻪ ﻫﺎ را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺸﺎﺑﻪ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻋـﺪدي ﻋﻤـﻞ ﻛﻨﻴـﺪ .اﻣـﺎ اﻳـﻦ ﻣﺮﺗﺒﻪ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي stringاﺳﺘﻔﺎده ﻛﻨﻴﺪ: // Declare variable ;string strData ﻫﻤﺎﻧﻨﺪ ﻗﺒﻞ ،ﻳﻚ ﻣﻘﺪار را ﺑﻪ ﻣﺘﻐﻴﻴﺮ ﺟﺪﻳﺪ اﺧﺘﺼﺎص ﻣﻲ دﻫﻴﺪ: // Set the string value ;"!strData = "Hello, world ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﻳﻦ ﻛﻪ رﺷﺘﻪ ﺷﻤﺎ از ﻛﺠﺎ ﺷﺮوع ﺷﺪه و ﺗﺎ ﻛﺠﺎ اداﻣﻪ ﭘﻴﺪا ﻣﻴﻜﻨﺪ ﺑﺎﻳﺪ از ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل )"( اﺳﺘﻔﺎده ﻛﻨﻴـﺪ .اﻳـﻦ ﻣﻮرد اﻫﻤﻴﺖ زﻳﺎدي دارد ،زﻳﺮا اﻳﻦ ﻋﻼﻣﺖ ﺑﻪ وﻳﮋوال 2005 C#ﻣﻴﮕﻮﻳﺪ ﻛﻪ ﻛﺪام ﻋﺒﺎرات را ﺑﺎﻳﺪ ﺑﻪ ﻋﻨﻮان رﺷﺘﻪ در ﻧﻈﺮ ﺑﮕﻴﺮد و آﻧﻬﺎ را ﻛﺎﻣﭙﺎﻳﻞ ﻧﻜﻨﺪ .اﮔﺮ از ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل اﺳﺘﻔﺎده ﻧﻜﻨﻴﺪ ،وﻳﮋوال 2005 C#ﺑﺎ اﻳﻦ ﻣﺘﻦ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﻛﺪ رﻓﺘﺎر ﻛﺮده ،ﺳﻌﻲ ﻣﻴﻜﻨـﺪ آﻧﻬـﺎ را ﻛﺎﻣﭙﺎﻳﻞ ﻛﻨﺪ و ﻧﻤﻴﺘﻮاﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺎﻣﭙﺎﻳﻞ ﻛﻞ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﺧﻄﺎ روﺑﺮو ﺧﻮاﻫﺪ ﺷﺪ. وﻗﺘﻲ ﻣﻘﺪار "! "Hello, worldرا در ﻣﺘﻐﻴﻴﺮ strDataذﺧﻴﺮه ﻛﺮدﻳﺪ ﻣﻴﺘﻮاﻧﻴﺪ آن را در ﺑﻪ ﻋﻨـﻮان ﻳـﻚ ﭘـﺎراﻣﺘﺮ ﺑـﻪ ﺗﺎﺑﻊ MessageBox.Showﺑﻔﺮﺳﺘﻴﺪ ﺗﺎ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﭼﺎپ ﻛﻨﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ دﻳﺪﻳﺪ ﻧﺤﻮه ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده از رﺷﺘﻪ ﻫﺎ ﻧﻴﺰ ﻣﺸﺎﺑﻪ اﻋﺪاد اﺳﺖ .در ﻗﺴﻤﺖ ﺑﻌﺪي در ﻣﻮرد ﭼﮕﻮﻧﮕﻲ اﻧﺠﺎم ﻋﻤﻠﻴﺎت ﻣﺨﺘﻠـﻒ روي رﺷﺘﻪ ﻫﺎ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد.
٧٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺗﺼﺎل رﺷﺘﻪ ﻫﺎ: اﺗﺼﺎل رﺷﺘﻪ ﻫﺎ ﺑﻪ ﻣﻌﻨﻲ ﺑﻪ ﻫﻢ ﻣﺘﺼﻞ ﻛﺮدن ﻳﻚ ﺳﺮي از رﺷﺘﻪ ﻫﺎ در اﻣﺘﺪاد ﻳﻜﺪﻳﮕﺮ و اﻳﺠﺎد ﻳﻚ رﺷﺘﻪ ﺟﺪﻳﺪ اﺳﺖ .اﺗﺼﺎل ﺑﺮاي رﺷﺘﻪ ﻫﺎ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻞ ﺟﻤﻊ ﻛﺮدن در اﻋﺪاد اﺳﺖ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﺑﺎ ﭼﮕﻮﻧﮕﻲ اﻳﻦ ﻋﻤﻞ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺗﺼﺎل رﺷﺘﻪ ﻫﺎ (1در ﭘﺮوژه اي ﻛﻪ در ﺑﺨﺶ ﻗﺒﻠﻲ اﻳﺠﺎد ﻛﺮدﻳﺪ ،ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﺑﺮوﻳﺪ و ﻳﻚ ﻛﻨﺘﺮل Buttonﺟﺪﻳﺪ اﺿـﺎﻓﻪ ﻛﻨﻴــــﺪ .ﺧﺎﺻــــﻴﺖ Nameآن را ﺑﺮاﺑــــﺮ btnConcatenationو ﺧﺎﺻــــﻴﺖ Textآن را ﺑﺮاﺑــــﺮ Concatenationﻗﺮار دﻫﻴﺪ .روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه وارد ﻛﻨﻴﺪ: private void btnConcatenation_Click(object sender, )EventArgs e { // Declare variables ;string strOne ;string strTwo ;string strResults // Set the string values ;" strOne = "Hello, ;"!strTwo = "World // Concatenate the strings ;strResults = strOne + strTwo // Display the results ;)"MessageBox.Show(strResults, "Strings } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Concatenationﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 6-3ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ،اﺑﺘﺪا ﺳﻪ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع رﺷﺘﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ: // Declare variables ;string strOne ;string strTwo ٧٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;string strResults ﺳﭙﺲ ﺑﻪ دو ﻣﺘﻐﻴﻴﺮ اول ﻣﻘﺪار ﻣﻲ دﻫﻴﺪ: // Set the string values ;" strOne = "Hello, ;"!strTwo = "World ﺑﻌﺪ از اﻳﻦ ﻛﻪ ﺑﻪ دو ﻣﺘﻐﻴﻴﺮ اول ﻣﻘﺪار دادﻳﺪ ،دو رﺷﺘﻪ را ﺑﺎ اﺳﺘﻔﺎده از ﻋﻼﻣﺖ ﺟﻤﻊ ) (+ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲ ﻛﻨﻴﺪ و ﻋﺒﺎرت ﺟﺪﻳﺪ را در ﻣﺘﻐﻴﻴﺮ ﺳﻮم ﺑﻪ ﻧﺎم strResultsﻗﺮار ﻣﻲ دﻫﻴﺪ: // Concatenate the strings ;strResults = strOne + strTwo در واﻗﻊ در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻲ ﮔﻮﻳﻴﺪ" :ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ strResultsرا ﺑﺮاﺑـﺮ ﻣﻘـﺪار strOneﺑـﻪ ﻋـﻼوه ﻣﻘـﺪار strTwoﻗﺮار ﺑﺪه" .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺗﺎﺑﻊ MessageBox.Showرا ﻓﺮاﺧـﻮاﻧﻲ ﻛﺮدﻳـﺪ ،ﻣﻘـﺪار strResultsﺑﺮاﺑـﺮ "! "Hello, Worldﺧﻮاﻫﺪ ﺑﻮد ،ﺑﻨﺎﺑﺮاﻳﻦ ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﻗﺒﻞ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﻴﺪ. // Display the results ;)"MessageBox.Show(strResults, "Strings
اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ اﺗﺼﺎل رﺷﺘﻪ در درون ﺑﺮﻧﺎﻣﻪ: ﺑﺮاي اﺗﺼﺎل دو رﺷﺘﻪ ﺑﻪ ﻳﻜﺪﻳﮕﺮ ﺣﺘﻤﺎ ﻧﺒﺎﻳﺪ ﻣﺘﻐﻴﻴﺮي ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و رﺷﺘﻪ ﻫﺎ را درون آن ﻗﺮار دﻫﻴﺪ .ﺑﻠﻜﻪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ درون ﻛـﺪ و ﺑـﻪ ﺳﺮﻋﺖ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ روش در اﻣﺘﺤﺎن ﻛﻨﻴﺪ اﻳﻦ ﺑﺨﺶ ﺷﺮح داده ﺷﺪه اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺗﺼﺎل رﺷﺘﻪ ﻫﺎ درون ﺑﺮﻧﺎﻣﻪ (1ﻣﺠﺪدا ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﺑﺮﮔﺮدﻳﺪ و ﻳﻚ دﻛﻤﻪ ﻓﺮﻣﺎن ﺟﺪﻳﺪ ﺑﻪ ﺻـﻔﺤﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .ﺧﺎﺻـﻴﺖ Nameآن را Inline ﺑﺮاﺑــــﺮ btnInlineConcatenationو ﺧﺎﺻــــﻴﺖ Textآن را ﺑﺮاﺑــــﺮ Concatenationﻗﺮار دﻫﻴﺪ .روي دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: private void btnInlineConcatenation_Click(object sender, )EventArgs e { // Declare variable ;int intNumber // Set the value ;intNumber = 26 ٧٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Display the results MessageBox.Show("The value of intNumber is: " + ;)"intNumber, "Strings } (2ﻛﺪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Inline Concatenationﻛﻠﻴﻚ ﻛﻨﻴـﺪ .ﻧﺘﻴﺠـﻪ اي ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 7-3را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 7-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ اﺗﺼﺎل رﺷﺘﻪ ﻣﺎﻧﻨﺪ ﻛﺪ ﺑﺎﻻ را ﻗﺒﻼ در ﻣﺜﺎل ﻫﺎي ﭘﻴﺶ دﻳﺪه ﺑﻮدﻳﺪ .ﭼﻴﺰي ﻛﻪ در ﺣﻘﻴﻘﺖ اﻳﻦ ﻛﺪ اﻧﺠﺎم ﻣﻲ دﻫﺪ ﺗﺒﺪﻳﻞ ﻣﻘﺪار ذﺧﻴﺮه ﺷﺪه در ﻣﺘﻐﻴﻴﺮ intNumberﺑﻪ رﺷﺘﻪ اﺳﺖ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﻳﻦ ﻣﻘﺪار ﻣﻴﺘﻮاﻧﺪ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﭼﺎپ ﺷﻮد .ﺑـﻪ اﻳـﻦ ﻛﺪ ﻧﮕﺎه ﻛﻨﻴﺪ: // Display the results MessageBox.Show("The value of intNumber is: " + ;)"intNumber, "Strings ﺑﺨﺶ " "The value of intNumber is:در ﺣﻘﻴﻘﺖ ﻳﻚ رﺷﺘﻪ اﺳﺖ ،اﻣﺎ ﺷﻤﺎ ﻣﺠﺒﻮر ﻧﻴـﺴﺘﻴﺪ ﻛـﻪ آن را ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻣﺘﻐﻴﻴﺮ رﺷﺘﻪ اي ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ .در وﻳﮋوال 2005 C#اﻳﻦ ﻧﻮع رﺷﺘﻪ ﻫﺎ را ﻳﻚ ﺛﺎﺑﺖ رﺷﺘﻪ اي ﻣﻲ ﻧﺎﻣﻨﺪ ،زﻳﺮا از ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﺗﺎ ﻣﻮﻗﻊ اﺳﺘﻔﺎده ،ﻣﻘﺪار آﻧﻬﺎ ﺛﺎﺑﺖ اﺳﺖ و ﺗﻐﻴﻴﺮ ﻧﻤﻲ ﻛﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ از ﻋﻤﻠﮕﺮ اﺗـﺼﺎل رﺷـﺘﻪ ﻫـﺎ روي اﻳـﻦ رﺷـﺘﻪ و ﻣﺘﻐﻴﻴـﺮ intNumberاﺳﺘﻔﺎده ﻛﺮدﻳﺪ ،ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intNumberﺑﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﺧﻮاﻫﺪ ﺷﺪ و در اﻧﺘﻬﺎي "The value " of intNumber is:ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ .ﻧﺘﻴﺠﻪ اﻳﻦ ﻋﻤﻞ ﻳﻚ رﺷﺘﻪ ﺟﺪﻳﺪ ﺷﺎﻣﻞ ﻫﺮ دو ﻋﺒﺎرت رﺷﺘﻪ و ﻋﺪد ﺧﻮاﻫـﺪ ﺑﻮد ﻛﻪ ﺑﻪ ﺗﺎﺑﻊ MessageBox.Showﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد.
ﻋﻤﻠﻴﺎت ﺑﻴﺸﺘﺮ روي رﺷﺘﻪ ﻫﺎ: در ﻫﺮ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ از ﺟﻤﻠﻪ C#ﺗﻮاﺑﻊ زﻳﺎدي ﺑﺮاي ﻛﺎر ﺑﺮ روي ﻳﻚ رﺷﺘﻪ وﺟﻮد دارﻧﺪ .ﺑﻌﻀﻲ از اﻳﻦ ﺗﻮاﺑﻊ در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ﺗﻮﺿﻴﺢ داده ﺷﺪه اﻧﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻴﺘﻮاﻧﻴﺪ ﻃﻮل ﻳﻚ رﺷﺘﻪ را ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺗﻮاﺑﻊ ﺑﺪﺳﺖ آورﻳﺪ.
٧٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺑﺪﺳﺖ آوردن ﻃﻮل ﻳﻚ رﺷﺘﻪ (1ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﻳﻚ ﻛﻨﺘﺮل TextBoxﺑﻪ ﻓﺮم ﺧﻮد اﺿﺎﻓﻪ ﻛﻨﻴﺪ .و ﺧﺎﺻﻴﺖ Nameآن را ﺑـﻪ txtStringﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻛﻨﺘﺮل Buttonدﻳﮕـﺮي ﺑـﻪ ﺻـﻔﺤﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ و ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnLengthو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Lengthﻗﺮار دﻫﻴﺪ .ﻛﻨﺘﺮﻟﻬﺎي روي ﻓﺮم را ﺑﻪ ﻧﺤـﻮي ﻗـﺮار دﻫﻴـﺪ ﻛﻪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 8-3ﺑﺎﺷﻨﺪ:
ﺷﻜﻞ 8-3 (2روي دﻛﻤﻪ Lengthدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnLength_Click(object sender, EventArgs e { // Declare variable ;string strData // Get the text from the TextBox ;strData = txtString.Text // Display the length of the string MessageBox.Show(strData.Length + " Character(s)", ;)""Strings } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻣﺘﻦ دﻟﺨﻮاﻫﻲ را در TextBoxوارد ﻛﻨﻴﺪ. (4روي دﻛﻤﻪ Lengthﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ آﻧﭽﻪ در ﺷﻜﻞ 9-3ﻧﺸﺎن داده ﺷﺪه اﺳﺖ را ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﺷﻜﻞ 9-3
٧٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اوﻟﻴﻦ ﻛﺎري ﻛﻪ اﻧﺠﺎم ﻣﻲ دﻫﻴﺪ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮي اﺳﺖ ﻛﻪ اﻃﻼﻋﺎت را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ .ﺳﭙﺲ ﻣﺘﻦ وارد ﺷـﺪه در TextBox را درﻳﺎﻓﺖ ﻛﺮده و در ﻣﺘﻐﻴﻴﺮ ﻣﺘﻨﻲ ﺧﻮد ﻛﻪ strDataﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﺪ. // Declare variable ;string strData // Get the text from the TextBox ;strData = txtString.Text زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﻣﺘﻨﻲ دارﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺧﺎﺻﻴﺖ Lengthآن ﺑﺮاي درﻳﺎﻓﺖ ﺗﻌﺪاد ﺣﺮوف رﺷﺘﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳـﻦ ﺧﺎﺻـﻴﺖ ﻣﻘﺪاري را از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﻋﻨﻮان ﻃﻮل رﺷﺘﻪ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﻪ ﻳﺎد داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫﺮ ﻛﺎراﻛﺘﺮي از ﻗﺒﻴﻞ ﻓﻀﺎﻫﺎي ﺧـﺎﻟﻲ و ﻋﻼﻣﺘﻬﺎ را ﻧﻴﺰ در ﻣﺤﺎﺳﺒﻪ ﻃﻮل رﺷﺘﻪ ﺑﻪ ﺷﻤﺎر ﻣﻲ آورد. // Display the length of the string MessageBox.Show(strData.Length + " Character(s)", ;)""Strings
زﻳﺮ رﺷﺘﻪ ﻫﺎ: در ﺑﻴﺸﺘﺮ ﻣﻮاﻗﻊ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﺑﻪ ﺟﺎي ﻛﺎر ﺑﺎ ﺗﻤﺎم رﺷﺘﻪ ،ﺑﺎ ﻗﺴﻤﺘﻲ از آن ﻛﺎر ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺧﻮاﻫﻴﺪ از ﻳﻚ ﻣﺠﻤﻮﻋﻪ از ﻛﺎراﻛﺘﺮ ﻫﺎ ﻛﻪ در اول رﺷﺘﻪ و ﻳﺎ در آﺧﺮ آن آﻣﺪه اﻧﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﻛﺎراﻛﺘﺮ ﻫﺎ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ از ﻫﺮ ﺟـﺎﻳﻲ از رﺷﺘﻪ ﺷﺮوع ﺷﻮﻧﺪ و ﺑﻪ ﻫﺮ ﺟﺎﻳﻲ در رﺷﺘﻪ ﺧﺘﻢ ﺷﻮﻧﺪ را زﻳﺮ رﺷﺘﻪ ﻣﻲ ﻧﺎﻣﻴﻢ. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ ﻛﻪ ﺳﻪ ﻛﺎراﻛﺘﺮ اﺑﺘﺪا ،وﺳﻂ و اﻧﺘﻬﺎي رﺷﺘﻪ را ﻧﻴﺰ ﻧﻤﺎﻳﺶ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ زﻳﺮ رﺷﺘﻪ ﻫﺎ (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ Stringsدر ﺣﺎل اﺟﺮا اﺳﺖ ،آن را ﺑﺒﻨﺪﻳﺪ. (2دﻛﻤﻪ ﻓﺮﻣﺎن دﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ و ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ btnSplitو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑـﺮ Splitﻗﺮار دﻫﻴﺪ .روي دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را وارد ﻛﻨﻴﺪ: )private void btnSplit_Click(object sender, EventArgs e { // Declare variable ;string strData
٧٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Get the text from thew TextBox ;strData = txtString.Text // Display the first three characters ;)"MessageBox.Show(strData.Substring(0, 3), "Strings // Display the middle three characters ;)"MessageBox.Show(strData.Substring(3, 3), "Strings // Display the last three characters (MessageBox.Show ;)"strData.Substring(strData.Length - 3), "Strings } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻛﻠﻤﻪ Cranberryرا در ﺟﻌﺒﻪ ﻣﺘﻨﻲ وارد ﻛﻨﻴﺪ. (4روي دﻛﻤﻪ Splitﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺳﻪ ﻛﺎدر ﭘﻴﻐﺎم ﻣﺘﻮاﻟﻲ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 10-3ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 10-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻣﺘﺪ Substringﺑﻪ ﺷﻤﺎ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﺗﺎ از ﻫﺮ ﻗﺴﻤﺘﻲ از رﺷﺘﻪ ،ﻳﻚ ﻣﺠﻤﻮﻋﻪ از ﻛﺎراﻛﺘﺮ ﻫﺎ را ﺟﺪا ﻛﻨﻴﺪ .اﻳﻦ ﻣﺘـﺪ ﺑـﻪ دو روش ﻣﻲ ﺗﻮاﻧﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد .روش اول اﻳﻦ اﺳﺖ ﻛﻪ ﺷﻤﺎره ﻛﺎراﻛﺘﺮ اول و ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎﻳﻲ را ﻛﻪ ﻧﻴﺎز دارﻳﺪ ﺑﻪ ﺗﺎﺑﻊ ﺑﺪﻫﻴﺪ .ﺑﺮاي ﻣﺜﺎل در اوﻟﻴﻦ ﺑﺎر اﺟﺮاي ﺗﺎﺑﻊ در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ﺑﻪ وﻳﮋوال 2005 C#ﻣﻲ ﮔﻮﻳﻴﻢ ﻛﻪ از ﻛﺎراﻛﺘﺮ ﺻﻔﺮم )از اﺑﺘﺪاي رﺷﺘﻪ( ﺷـﺮوع ﻛـﻦ و ﺳـﻪ ﻛﺎراﻛﺘﺮ را ﺟﺪا ﻛﻦ: // Display the first three characters ;)"MessageBox.Show(strData.Substring(0, 3), "Strings در ﻣﺮﺗﺒﻪ دوم ﻓﺮاﺧﻮاﻧﻲ ،ﺑﻪ ﺗﺎﺑﻊ ﻣﻲ ﮔﻮﻳﻴﺪ ﻛﻪ از ﻛﺎراﻛﺘﺮ ﺳﻮم ،ﺳﻪ ﻛﺎراﻛﺘﺮ را ﺟﺪا ﻛﻨﺪ و ﺑﺮﮔﺮداﻧﺪ. // Display the middle three characters ;)"MessageBox.Show(strData.Substring(3, 3), "Strings در ﻣﺮﺗﺒﻪ آﺧﺮي ﻛﻪ ﺗﺎﺑﻊ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﺪ ،ﻓﻘﻂ ﻳﻚ ﭘﺎراﻣﺘﺮ را ﺑﺮاي آن ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ .اﻳﻦ ﭘﺎراﻣﺘﺮ ﺑﻪ ﺗﺎﺑﻊ ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ از ﻣﻜﺎن ﻣﺸﺨﺺ ﺷﺪه ﺷﺮوع ﻛﻨﺪ و ﺗﻤﺎم ﻛﺎراﻛﺘﺮ ﻫﺎي ﺳﻤﺖ راﺳﺖ آن را ﺟﺪا ﻛﻨﺪ .در اﻳـﻦ ﻗـﺴﻤﺖ ﻣـﻲ ﺧـﻮاﻫﻴﻢ ﺳـﻪ ﻛـﺎراﻛﺘﺮ آﺧـﺮ رﺷـﺘﻪ را ٧٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮﮔﺮداﻧﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ Lengthﺑﻪ ﺗﺎﺑﻊ Substringﻣﻲ ﮔﻮﻳﻴﻢ ﻛﻪ از ﺳﻪ ﻛﺎراﻛﺘﺮ ﻣﺎﻧﺪه ﺑﻪ اﻧﺘﻬﺎي رﺷـﺘﻪ ﺷﺮوع ﻛﻦ و ﺗﻤﺎم ﻛﺎراﻛﺘﺮ ﻫﺎي ﺑﺎﻗﻲ ﻣﺎﻧﺪه را ﺑﺮﮔﺮدان. // Display the last three characters MessageBox.Show(strData.Substring(strData.Length - 3), ;)""Strings
ﻗﺎﻟﺐ ﺑﻨﺪي رﺷﺘﻪ ﻫﺎ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺎ رﺷﺘﻪ ﻫﺎ ﻛﺎر ﻛﻨﻴﺪ ،ﻣﻤﻜﻦ اﺳﺖ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻛﺎراﻛﺘﺮ ﻫـﺎ ﺑـﺮ ﺻـﻔﺤﻪ ﻧﻤـﺎﻳﺶ را ﺗﻐﻴﻴـﺮ دﻫﻴﺪ .ﻣﺜﻼ در ﺷﻜﻞ ،5-3ﻛﺎدر ﭘﻴﻐﺎم ﻧﺘﻴﺠﻪ ﺗﻘﺴﻴﻢ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ ،اﻣﺎ اﺣﺘﻤﺎﻻ ﺷﻤﺎ ﺑﻪ ﻫﺮ 14رﻗﻢ اﻋﺸﺎر ﻧﻴﺎز ﻧﺪارﻳـﺪ و 2ﻳـﺎ 3رﻗـﻢ ﻛﻔﺎﻳﺖ ﻣﻴﻜﻨﺪ! ﭼﻴﺰي ﻛﻪ ﺷﻤﺎ در اﻳﻦ ﻗﺴﻤﺖ ﻧﻴﺎز دارﻳﺪ اﻳﻦ اﺳﺖ ﻛﻪ رﺷﺘﻪ را ﺑﻪ ﮔﻮﻧﻪ اي ﻗﺎﻟﺐ ﺑﻨﺪي ﻛﻨﻴﺪ ﻛﻪ ﺗﻤﺎم ﻛﺎراﻛﺘﺮ ﻫﺎي ﺳﻤﺖ ﭼﭗ ﻣﻤﻴﺰ و ﻓﻘﻂ 2ﻳﺎ 3رﻗﻢ اﻋﺸﺎر را ﻧﺸﺎن دﻫﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي اﻳﻦ ﻛﺎر را اﻧﺠﺎم ﺧﻮاﻫﻴﻢ داد:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻗﺎﻟﺐ ﺑﻨﺪي رﺷﺘﻪ ﻫﺎ (1ﺑﺮﻧﺎﻣﻪ Floating-Pt Mathرا ﻛﻪ ﻗﺒﻼ در اﻳﻦ ﻓﺼﻞ اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﺪ ﺑﺎز ﻛﻨﻴﺪ. (2وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﺗﻐﻴﺮات زﻳﺮ را در ﻛﺪ اﻳﺠﺎد ﻛﻨﻴﺪ: // Set number, divide numbers, and display results ;dblNumber = 13 ;dblNumber /= 7 // Display the results without formatting MessageBox.Show("Without formatting: " + dblNumber, ;)""Floating Points //Display the results with formatting MessageBox.Show("With formatting: " + String.Format("{0:n3}", dblNumber), ;)""Floating Points (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﺎدر ﭘﻴﻐـﺎم ﻣﺮﺑـﻮط ﺑـﻪ ﺗـﺴﺖ ﻋﻤـﻞ ﺿـﺮب ﻧﻤـﺎﻳﺶ داده ﺷـﺪ ،ﻛـﺎدر ﭘﻴﻐـﺎم ﺑﻌـﺪي ﻋـﺪد 1,71428571428571را ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. (4ﻫﻨﮕﺎﻣﻲ ﻛﻪ روي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻛﺎدر ﺑﻌﺪي ﻧﺘﻴﺠﻪ 1,714را ﻧﻤﺎﻳﺶ ﺧﻮاﻫﺪ داد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٧٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻨﻬﺎ ﭼﻴﺰي ﻛﻪ در اﻳﻦ ﻛﺪ ﻣﻤﻜﻦ اﺳﺖ ﻋﺠﻴﺐ ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ ،اﺳﺘﻔﺎده از ﺗﺎﺑﻊ String.Formatاﺳﺖ .اﻳﻦ ﺗﺎﺑﻊ ﻗﻮي ،ﺑﻪ ﺷـﻤﺎ اﺟﺎزه ﻣﻴﺪﻫﺪ ﻣﺘﻦ و ﻳﺎ اﻋﺪاد ﺧﻮد را ﻗﺎﻟﺐ ﺑﻨﺪي ﻛﻨﻴﺪ .ﺗﻨﻬﺎ ﻧﻜﺘﻪ ﻣﻬﻤﻲ ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ دارد ،ﭘﺎراﻣﺘﺮ اول آن اﺳﺖ ﻛـﻪ ﻣـﺸﺨﺺ ﻣـﻲ ﻛﻨـﺪ ﺧﺮوﺟﻲ ﺗﺎﺑﻊ ﺑﺎﻳﺪ در ﭼﻪ ﻗﺎﻟﺒﻲ ﺑﺎﺷﺪ. //Display the results with formatting MessageBox.Show("With formatting: " + String.Format("{0:n3}", dblNumber), ;)""Floating Points ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ String.Formatﺑﺎﻳﺪ دو ﭘﺎراﻣﺘﺮ را ﺑﻪ آن ﺑﻔﺮﺳﺘﻴﺪ .ﭘﺎراﻣﺘﺮ اول ،"{0:n3}" ،ﻗﺎﻟﺐ رﺷﺘﻪ اي اﺳﺖ ﻛﻪ ﺷﻤﺎ ﻣﻴﺨﻮاﻫﻴﺪ از ﻣﺘﺪ درﻳﺎﻓﺖ ﻛﻨﻴﺪ .ﭘﺎراﻣﺘﺮ دوم ،dblNumber ،ﻣﻘﺪاري اﺳﺖ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﻗﺎﻟﺐ ﺑﻨﺪي ﻛﻨﻴﺪ. ﻋـﺪد ﺻـﻔﺮ در ﭘــﺎراﻣﺘﺮ اول ﻣـﺸﺨﺺ ﻣﻴﻜﻨــﺪ ﻛـﻪ در ﺣـﺎل ﻣــﺸﺨﺺ ﻛـﺮدن ﻗﺎﻟــﺐ اوﻟـﻴﻦ ﭘـﺎراﻣﺘﺮ ﺑﻌــﺪ از ﭘـﺎراﻣﺘﺮ ﺣﺎﺿــﺮ ﻳـﺎ ﻫﻤــﺎن dblNumberﻫﺴﺘﻴﺪ .ﻗﺴﻤﺘﻲ ﻛﻪ ﺑﻌﺪ از " ":آﻣﺪه اﺳﺖ ﻣﺸﺨﺺ ﻣﻴﻜﻨﺪ ﻛﻪ ﺑﻪ ﭼﻪ ﺻﻮرت ﻣﻲ ﺧﻮاﻫﻴﺪ رﺷﺘﻪ را ﻗﺎﻟﺐ ﺑﻨﺪي ﻛﻨﻴﺪ. در اﻳﻦ ﺟﺎ از n3اﺳﺘﻔﺎده ﻛﺮده اﻳﺪ ﻛﻪ ﺑﻪ ﻣﻌﻨﺎي "ﻳﻚ ﻋﺪد ﺑﺎ ﻣﻤﻴﺰ ﺷﻨﺎور و ﺳﻪ رﻗﻢ اﻋﺸﺎر" اﺳﺖ .ﺑﺮاي اﻳـﻦ ﻛـﻪ ﻋـﺪد را ﺑـﺎ دو رﻗـﻢ اﻋﺸﺎر داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﺑﻪ راﺣﺘﻲ ﻣﻴﺘﻮاﻧﻴﺪ از ﻋﺒﺎرت n2اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﻗﺎﻟﺐ ﺑﻨﺪي ﺑﻮﻣﻲ: زﻣﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ اي را ﺑﺎ .NETﻣﻲ ﻧﻮﻳﺴﻴﺪ ،ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺷﻤﺎ ﻣﻤﻜﻦ اﺳﺖ از ﻗﻮاﻋﺪ ﻋﻼﻣﺖ ﮔﺬاري در زﺑﺎن ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﺪ ﻛﻪ ﺑﺮاي ﺷﻤﺎ ﻧﺎ آﺷﻨﺎ ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در اﻳﺎﻻت ﻣﺘﺤﺪه زﻧﺪﮔﻲ ﻣﻲ ﻛﻨﻴﺪ ،از ﻋﻼﻣﺖ ﻧﻘﻄـﻪ ) (.ﺑـﺮاي ﻣﻤﻴـﺰ ﺑـﻴﻦ ﻗـﺴﻤﺖ اﻋـﺸﺎر و ﻗﺴﻤﺖ ﺻﺤﻴﺢ ﻋﺪد اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ .اﻣﺎ ﺑﺮاي ﻛﺎرﺑﺮاﻧﻲ ﻛﻪ در ﻓﺮاﻧﺴﻪ ﻫﺴﺘﻨﺪ اﻳﻦ ﻋﻼﻣﺖ ﻳﻚ وﻳﺮﮔﻮل ) (،اﺳﺖ .ﻫﻤﻴﻨﻄﻮر ﻣﻤﻜﻦ اﺳﺖ ﺑﺮاي ﻛﺎرﺑﺮان ﻛﺸﻮرﻫﺎي دﻳﮕﺮ اﻳﻦ ﻋﻼﻣﺖ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪ. وﻳﻨﺪوز ﻣﻴﺘﻮاﻧﺪ ﺑﺮ اﺳﺎس ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻛﺎرﺑﺮ ،اﻳﻦ ﻋﻼﻣﺘﻬﺎ را ﺑﺮاي ﺷﻤﺎ اﻧﺘﺨﺎب ﻛﻨﺪ .اﮔﺮ ﺷﻤﺎ از ﭼـﺎرﭼﻮب .NETدرﺳـﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻋﻤﻮﻣﺎ ﻧﻴﺎزي ﻧﻴﺴﺖ در ﻣﻮرد اﻳﻦ ﻋﻼﻣﺖ ﮔﺬاري ﻫﺎ ﻧﮕﺮان ﺑﺎﺷﻴﺪ .ﺑﺮاي ﻣﺜﺎل در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠـﻲ ﻣـﺎ ﺑـﺎ اﺳـﺘﻔﺎده از ،n3ﺑـﻪ .NETﮔﻔﺘﻴﻢ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻋﺪد ﺧﻮد را ﺑﺎ ﺟﺪا ﻛﻨﻨﺪه ﻫﺰارﮔﺎن و ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﺳﻪ رﻗﻢ اﻋﺸﺎر در ﺳﻤﺖ راﺳـﺖ ﻧﻤـﺎﻳﺶ دﻫـﻴﻢ .اﻟﺒﺘـﻪ ﺗﻘﺴﻴﻢ ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﺑﻪ ﺟﺪاﻛﻨﻨﺪه ﻫﺰارﮔﺎن ﻧﻴﺎزي ﻧﺪارد اﻣﺎ اﮔﺮ ﺗﻘﺴﻴﻢ را ﺑﻪ 12000 / 7ﺗﻐﻴﻴﺮ دﻫﻴﻢ ،ﻋـﺪد 1،742 .286را درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨﻴﻢ ﻛﻪ در ﺻﻮرت داﺷﺘﻦ ﺟﺪاﻛﻨﻨﺪه ﻫﺰارﮔﺎن ،راﺣﺖ ﺗﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد. ﺣﺎل اﮔﺮ ﻛﺎرﺑﺮ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد را ﺑﺮاﺑﺮ ﺗﻨﻈﻴﻤﺎت ﻓﺮاﻧﺴﻮي ﻗﺮار دﻫﺪ و ﻛﺪ ﻗﺒﻠﻲ را اﺟﺮا ﻛﻨﺪ )ﺑﺪون اﻳﻨﻜﻪ ﻫﻴﭻ ﺗﻐﻴﺮي را در ﻛﺪ ﺑﻪ وﺟﻮد آورﻳﺪ( ،ﻧﺘﻴﺠﻪ 1 714،286را درﻳﺎﻓﺖ ﺧﻮاﻫﺪ ﻛﺮد. ﻧﻜﺘﻪ :ﺑﺮاي ﺗﻐﻴﻴﺮ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد ﻣﻴﺘﻮاﻧﻴﺪ ﺑـﻪ Control Panelﺑﺮوﻳـﺪ و روي آﻳﻜـﻮن Regional and Language Optionsﻛﻠﻴﻚ ﻛﻨﻴﺪ و زﺑﺎن ﺧﻮد را ﺑﻪ زﺑﺎﻧﻲ ﻛﻪ ﺗﻤﺎﻳﻞ دارﻳﺪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﻪ اﻳﻦ ﺻـﻮرت ﻋﻼﻣـﺖ ﮔﺬاري زﺑﺎﻧﻲ ﻛﻪ اﻧﺘﺨﺎب ﻛﺮده اﻳﺪ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. در زﺑﺎن ﻓﺮاﻧﺴﻪ ،ﺟﺪاﻛﻨﻨﺪه ﻫﺰارﮔﺎن ﻳﻚ ﻓﻀﺎي ﺧﺎﻟﻲ اﺳﺖ ﻧﻪ ﻳﻚ وﻳﺮﮔﻮل .ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﻣﻤﻴﺰ اﻋﺸﺎري ﻧﻴﺰ از وﻳﺮﮔﻮل اﺳﺘﻔﺎده ﻣﻴﻜﻨﻨﺪ ﻧﻪ از ﻧﻘﻄﻪ .ﺑﺎ اﺳﺘﻔﺎده درﺳﺖ از ﻣﺘﺪ String.Formatﻣﻴﺘﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑـﺮ اﺳـﺎس ﺗﻨﻈﻴﻤـﺎت ﻣﺤﻠـﻲ ﻛـﺎرﺑﺮ، اﻃﻼﻋﺎت را ﺑﻪ ﻧﺤﻮي ﺻﺤﻴﺢ ﻧﻤﺎﻳﺶ دﻫﺪ.
٨٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺟﺎﻳﮕﺰﻳﻨﻲ زﻳﺮرﺷﺘﻪ ﻫﺎ: ﻳﻜﻲ از ﻛﺎرﻫﺎي ﻋﻤﻮﻣﻲ دﻳﮕﺮي ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ رﺷﺘﻪ ﻫﺎ ﺑﻪ آن ﻧﻴﺎز ﭘﻴﺪا ﻛﻨﻴﺪ ،ﺟـﺎﻳﮕﺰﻳﻨﻲ ﻳـﻚ رﺷـﺘﻪ ﺧـﺎص ﺑـﺎ رﺷـﺘﻪ دﻳﮕﺮي در ﻳﻚ ﻣﺘﻦ اﺳﺖ .ﺑﺮاي ﺗﻮﺿﻴﺢ ﭼﮕﻮﻧﮕﻲ اﻳﻦ ﻛﺎر ،در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﺑﺮﻧﺎﻣﻪ Stringsﺧـﻮد را ﺑـﻪ ﮔﻮﻧـﻪ اي ﺗﻐﻴﻴﺮ ﻣﻴﺪﻫﻴﻢ ﻛﻪ رﺷﺘﻪ " "Helloرا ﺑﺎ رﺷﺘﻪ " "Goodbyeﺟﺎﻳﮕﺰﻳﻦ ﻛﻨﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺟﺎﻳﮕﺰﻳﻨﻲ زﻳﺮرﺷﺘﻪ ﻫﺎ (1ﺑﺮﻧﺎﻣﻪ Stringsرا ﻛﻪ ﻗﺒﻼ اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﺪ ،ﺑﺎز ﻛﻨﻴﺪ. (2ﻛﻨﺘﺮل Buttonدﻳﮕﺮي را ﺑﻪ Form1اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ btnReplaceو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Replaceﻗﺮار دﻫﻴﺪ .روي دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ ﻣﺘﺪ ﻣﺮﺑـﻮط ﺑﻪ روﻳﺪاد Clickآن اﺿﺎﻓﻪ ﻛﻨﻴﺪ. )private void btnReplace_Click(object sender, EventArgs e { // Declare variables ;string strData ;string strNewData // Get the text from the TextBox ;strData = txtString.Text // Replace the string occurance ;)"strNewData = strData.Replace("Hello", "Goodbye // Display the new string ;)"MessageBox.Show(strNewData, "Strings } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺟﻤﻠﻪ ! Hello Worldرا در ﺟﻌﺒﻪ ﻣﺘﻨﻲ وارد ﻛﻨﻴﺪ. (4روي دﻛﻤﻪ Replaceﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻋﺒـﺎرت ! Goodbye Worldرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻣﺘﺪ Replaceدو رﺷﺘﻪ را درﻳﺎﻓﺖ ﻣﻴﻜﻨﺪ و در ﻣﺘﻦ ﺑﻪ دﻧﺒﺎل رﺷﺘﻪ اول ﻣﻲ ﮔﺮدد .ﺳﭙﺲ در ﻫﺮ ﻗﺴﻤﺘﻲ از ﻣـﺘﻦ ﻛـﻪ رﺷـﺘﻪ اول را ﭘﻴﺪا ﻛﺮد آن را ﺑﺎ رﺷﺘﻪ دوم ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﻛﻨﺪ .ﺑﻌﺪ از اﻳﻦ ﻛﻪ رﺷﺘﻪ اول در ﺗﻤﺎم ﻣﺘﻦ ﺑﺎ رﺷﺘﻪ دوم ﺟﺎﻳﮕﺰﻳﻦ ﺷﺪ ،ﻋﺒﺎرت ﺟﺪﻳﺪ ﺑـﻪ ﺷـﻤﺎ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد و ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﻧﻤﺎﻳﺶ دﻫﻴﺪ.
٨١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Replace the string occurance ;)"strNewData = strData.Replace("Hello", "Goodbye ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻛﺪ ،ﻓﻘﻂ Helloاول ﺑﺎ Goodbyeﺟﺎﻳﮕﺰﻳﻦ ﻧﻤﻴﺸﻮد ،ﺑﻠﻜﻪ ﻣﻴﺘﻮاﻧﻴﺪ در ﺟﻌﺒﻪ ﻣﺘﻨﻲ ،ﻋﺒﺎرﺗﻲ را وارد ﻛﻨﻴـﺪ ﻛـﻪ ﭼﻨﺪﻳﻦ Helloداﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻤﺎم Helloﻫﺎي ﻣﺘﻦ ﺑﺎ Goodbyeﺟﺎﻳﮕﺰﻳﻦ ﻣﻴﺸﻮﻧﺪ .اﻣﺎ ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻛﺪ ﺑﺎﻻ ،ﻛﻠﻤﻪ Helloرا ﺑﺎ Goodbyeﺟﺎﻳﮕﺰﻳﻦ ﻣﻴﻜﻨﺪ ﻧﻪ ﻛﻠﻤﻪ helloرا )ﻳﺎ ﻫﺮ ﺣﺎﻟﺖ دﻳﮕﺮي( .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﻳـﻦ ﺗﺎﺑﻊ ﻧﺴﺒﺖ ﺑﻪ ﻛﻮﭼﻜﻲ ﻳﺎ ﺑﺰرﮔﻲ ﺣﺮوف ﺣﺴﺎس اﺳﺖ.
ﺗﺒﺪﻳﻞ ﻧﻮع ﻫﺎي داده اي: در اﻧﺠﺎم ﻣﺤﺎﺳﺒﺎت ﺑﺮ روي ﻣﺘﻐﻴﻴﺮ ﻫﺎ و ﻳﺎ ذﺧﻴﺮه ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ در ﻣﺘﻐﻴﻴﺮي دﻳﮕﺮ ،ﻧﻮع داده اي آﻧﻬﺎ ﻫﻤﻮاره ﺑﺎﻳﺪ ﻳﻜﺴﺎن ﺑﺎﺷﺪ .ﺑـﺮاي ﻣﺜﺎل ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ را ﻓﻘﻂ ﻣﻲ ﺗﻮان ﺑﺮ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ دﻳﮕﺮ ﺗﻘﺴﻴﻢ ﻛﺮد و ﻳﺎ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﻋـﺸﺎري را ﻧﻤـﻲ ﺗـﻮان ﺑـﻪ ﻳـﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﻧﺴﺒﺖ داد .1در ﻫﻨﮕﺎم ﻣﺤﺎﺳﺒﺎت اﮔﺮ ﻧﻮع ﻫﺎي ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺑﺎ ﻫﻢ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪ ،ﻳﻜﻲ از ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺑـﻪ ﻧـﻮع داده اي ﻣﺘﻐﻴﻴﺮ دﻳﮕﺮ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد .ﺗﺒﺪﻳﻞ ﻧﻮع داده اي ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺑﻪ دو روش ﻣﻲ ﺗﻮاﻧﺪ اﻧﺠﺎم ﺷﻮد :ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ و ﺑﻪ ﺻـﻮرت ﺻﺮﻳﺢ .در ﺑﻴﺸﺘﺮ ﻣﻮاﻗﻊ اﻳﻦ ﺗﺒﺪﻳﻞ ﻧﻮع ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻧﺠﺎم ﻣﻲ ﺷﻮد .اﻣﺎ در ﻣﻮاﻗﻌﻲ ﻛﻪ اﻳـﻦ ﺗﺒـﺪﻳﻞ ﻧـﻮع ﻣﻤﻜـﻦ اﺳﺖ ﻣﻨﺠﺮ ﺑﻪ از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺷﻮد ،ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺎﻳﺪ آن را ﺑﻪ ﺻﻮرت ﺻﺮﻳﺢ اﻧﺠﺎم دﻫﺪ. ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع اﻋﺸﺎري را در ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﺻﺤﻴﺢ ﻗـﺮار دﻫﻴـﺪ .در اﻳـﻦ ﺣﺎﻟـﺖ ﻧﻤـﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺻﻮرت ﻣﻌﻤﻮﻟﻲ از ﻋﻤﻠﮕﺮ ﺗﺴﺎوي اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،زﻳﺮا ﺑﺎ اﻳﻦ ﻛﺎر ﻗﺴﻤﺖ اﻋﺸﺎر ﻋﺪد از ﺑﻴﻦ ﻣﻴﺮود .ﺑﻪ ﻫﻤﻴﻦ ﻋﻠﺖ ﻛﺎﻣﭙـﺎﻳﻠﺮ اﻳـﻦ ﺗﺒﺪﻳﻞ را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻧﺠﺎم ﻧﻤﻲ دﻫﺪ .اﻣﺎ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ را در ﻳﻚ ﻣﺘﻐﻴﻴـﺮ از ﻧـﻮع اﻋـﺸﺎري ﻗـﺮار دﻫﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻋﻤﻠﮕﺮ ﺗﺴﺎوي اﺳﺘﻔﺎده ﻛﻨﻴﺪ .زﻳﺮا ﺑﺎ ﺗﻐﻴﻴﺮ ﻧﻮع از ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﻋﺪد اﻋﺸﺎري اﻣﻜﺎن از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋـﺎت وﺟـﻮد ﻧﺪارد و اﻳﻦ ﺗﺒﺪﻳﻞ ﻧﻮع ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻧﺠﺎم ﻣﻲ ﺷﻮد. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﭼﮕﻮﻧﮕﻲ ﺗﺒﺪﻳﻞ ﻧﻮع داده اي ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻃﻮر ﺻﺮﻳﺢ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد .
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺗﺒﺪﻳﻞ ﻧﻮع ﻫﺎي داده اي (1در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005روي ﻣﻨﻮي Fileﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﺳﭙﺲ New Projectرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. در ﭘﻨﺠﺮه New Projectﻳﻚ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ﺑﻪ ﻧﺎم Casting Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﻳﻚ ﻛﻨﺘﺮل Buttonﻗﺮار داده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑـﻪ btnCastو Text آن را ﺑﻪ Castﺗﻐﻴﻴﺮ دﻫﻴﺪ. (3ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳـﺮ را در آن وارد ﻛﻨﻴﺪ. )private void btnCast_Click(object sender, EventArgs e { 1ﺣﺘﻲ اﮔﺮ ﻣﻘﺪار آن ﻣﺘﻐﻴﻴﺮ ﻓﺎﻗﺪ ﻗﺴﻤﺖ اﻋﺸﺎر ﺑﺎﺷﺪ ،ﺑﺎز ﻫﻢ ﻧﻤﻲ ﺗﻮان ﻣﻘﺪار آن را در ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﻗﺮار داد.
٨٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
int intNumber = 2; double dblNumber = 3.4; intNumber = dblNumber; MessageBox.Show("The value of intNumber is: " + intNumber); } . ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ در ﺧﻂ ﺳﻮم ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮد.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ4 : را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪbtCast_Click ( ﻛﺪ ﻣﺘﺪ5 private void btnCast_Click(object sender, EventArgs e) { int intNumber = 2; double dblNumber = 3.4; dblNumber = intNumber; MessageBox.Show("The value of dblNumber is: " + dblNumber); } 2 ﺑﻪ ﻋﺪدdblNumber ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ6 .ﺗﻐﻴﻴﺮ ﻛﺮده اﺳﺖ :( ﻛﺪ ﻣﻮﺟﻮد در ﻣﺘﺪ را ﻣﺠﺪداً ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﺑﻪ ﺻﻮرت زﻳﺮ درآﻳﺪ7 private void btnCast_Click(object sender, EventArgs e) { int intNumber = 2; double dblNumber = 3.4; intNumber = (int)dblNumber; MessageBox.Show("The value of intNumebr is: " + intNumber); } ﺗﻐﻴـﺮintNumber ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛـﻪ ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ8 . ﺷﺪه اﺳﺖdblNumber ﻛﺮده و ﺑﺮاﺑﺮ ﺑﺎ ﻗﺴﻤﺖ ﺻﺤﻴﺢ ﻋﺪد
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٨٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﺑﺘﺪا ﺳﻌﻲ ﻛﺮده اﻳﻢ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﻋﺸﺎري را در ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﺻﺤﻴﺢ ﻗﺮار دﻫﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﺑـﺎ اﻳـﻦ ﻛﺎر ﺑﺨﺶ اﻋﺸﺎر ﻋﺪد از ﺑﻴﻦ ﻣﻲ رود .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻳﻦ ﺗﺒﺪﻳﻞ را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻧﺠﺎم ﻧﻤﻲ دﻫﺪ و ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟـﻪ ﻣﻲ ﺷﻮد. ;intNumber = dblNumber MessageBox.Show("The value of intNumber is: " + ;)intNumber در ﺑﺨﺶ ﺑﻌﺪ ﺳﻌﻲ ﻛﺮده اﻳﻢ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﺻﺤﻴﺢ را در ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﻋﺸﺎري ﻗﺮار دﻫﻴﻢ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ در اﻳﻦ ﺣﺎﻟﺖ اﺣﺘﻤـﺎل از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت وﺟﻮد ﻧﺪارد و ﻣﻘﺪار ﻣﻮﺟﻮد در ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ در ﻣﺘﻐﻴﻴﺮ اﻋﺸﺎري ذﺧﻴﺮه ﻣﻲ ﺷﻮد ،اﻳﻦ ﺗﺒﺪﻳﻞ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻧﺠﺎم ﻣﻲ ﺷﻮد. ;dblNumber = intNumber MessageBox.Show("The value of dblNumber is: " + ;)dblNumber ﺑﺎ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ و ﻛﻠﻴﻚ ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛـﺮد ﻛـﻪ ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ intNumberﻳﻌﻨـﻲ ﻋـﺪد 2در ﻣﺘﻐﻴﻴـﺮ dblNumberﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ. ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﻣﻘﺪار ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﻋﺸﺎري را در ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﻧﮕﻬﺪاري ﻛﻨﻴﻢ ﺑﺎﻳﺪ ﺑﻪ ﻃـﻮر ﺻـﺮﻳﺢ آن را ﺑـﻪ ﻋـﺪد ﺻﺤﻴﺢ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .در زﺑﺎن C#اﻳﻦ ﻛﺎر ﺑﻪ وﺳﻴﻠﻪ ﻋﻤﻠﮕﺮ ﭘﺮاﻧﺘﺰ )( اﻧﺠﺎم ﻣﻲ ﺷﻮد .ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑـﻪ ﻳـﻚ ﻧـﻮع داده اي ﺧﺎص و ذﺧﻴﺮه آن ،ﺑﺎﻳﺪ ﻗﺒﻞ از ﻧﺎم ﻣﺘﻐﻴﻴﺮ ﻳﻚ ﭘﺮاﻧﺘﺰ ﻗﺮار دﻫﻴﺪ و ﺳﭙﺲ داﺧﻞ ﭘﺮاﻧﺘﺰ ﻧﺎم ﻧﻮع داده اي ﻣﻘﺼﺪ را وارد ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل: ;intNumber = (int)dblNumber MessageBox.Show("The value of intNumebr is: " + ;)intNumber در اﻳﻦ ﻛﺪ ﻣﺘﻐﻴﻴﺮ dblNumberﻛﻪ از ﻧﻮع doubleاﺳﺖ ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﭘﺮاﻧﺘﺰ ﺑـﻪ ﻧـﻮع داده اي intﺗﺒـﺪﻳﻞ ﺷـﺪه اﺳﺖ و ﺳﭙﺲ در ﻣﺘﻐﻴﻴﺮي از اﻳﻦ ﻧﻮع ذﺧﻴﺮه ﺷﺪه اﺳﺖ. اﻟﺒﺘﻪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ از اﻳﻦ روش ﺑﺮاي ﺗﺒﺪﻳﻞ ﻣﺘﻐﻴﻴﺮ ﻫﺎي رﺷﺘﻪ اي ﺑﻪ ﻋﺪدي و ﺑﺮ ﻋﻜﺲ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﮔﺮ رﺷﺘﻪ اي ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﻋﺪد اﺳﺖ )ﻣﺎﻧﻨﺪ " ("234.14را ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻋﺪد ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ ﺑﺎﻳﺪ از ﺗﺎﺑﻊ Parseدر ﻧﻮع داده اي ﻋﺪد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻣﺘﻐﻴﻴﺮ ،str1رﺷﺘﻪ اي ﺣﺎوي ﻳﻚ ﻋﺪد اﻋﺸﺎري اﺳﺖ و ﻣﻲ ﺧﻮاﻫﻴـﺪ آن را در ﻣﺘﻐﻴﻴـﺮ dblNum1 ﻛﻪ از ﻧﻮع اﻋﺸﺎري اﺳﺖ ذﺧﻴﺮه ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ از ﺗﺎﺑﻊ )( double.Parseﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ;)dblNum1 = double.Parse(str1 ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ رﺷﺘﻪ ﺷﺎﻣﻞ ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﻋﺪد ﺻﺤﻴﺢ ﺑﺎﻳﺪ از ﺗﺎﺑﻊ int.Parseاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻋﺪد ﺑﻪ رﺷﺘﻪ ﻫﻢ ﺑﺎﻳﺪ از ﺗﺎﺑﻊ )( ToStringﻣﺮﺑﻮط ﺑﻪ ﻣﺘﻐﻴﻴﺮ ﻋﺪدي اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜـﺎل اﮔـﺮ ﺑﺨﻮاﻫﻴـﺪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ dblNumberرا در ﻳﻚ ﻣﺘﻐﻴﻴﺮ رﺷـﺘﻪ اي ذﺧﻴـﺮه ﻛﻨﻴـﺪ ﺑﺎﻳـﺪ از ﺗـﺎﺑﻊ )(dblNumber.ToString اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
٨٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده از ﺗﺎرﻳﺨﻬﺎ: ﻳﻜﻲ دﻳﮕﺮ از اﻧﻮاع داده اي ﻛﻪ ﻛﺎرﺑﺮد زﻳﺎدي دارد و اﺣﺘﻤﺎﻻً از آن زﻳﺎد اﺳﺘﻔﺎده ﺧﻮاﻫﻴﺪ ﻛﺮد ﺗﺎرﻳﺨﻬﺎ ﻫﺴﺘﻨﺪ .اﻳﻦ ﻧـﻮع ﻣﺘﻐﻴﻴـﺮ ﻫـﺎ ﻳـﻚ ﺗﺎرﻳﺦ را در ﺧﻮد ﻧﮕﻪ ﻣﻲ دارﻧﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎﻳﻲ ﻛﻪ ﺗﺎرﻳﺦ را ﻧﮕﻬﺪاري ﻣﻴﻜﻨﻨﺪ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﻣﻴﺸﻮﻳﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻤﺎﻳﺶ ﺗﺎرﻳﺦ روز (1ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Date Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﺑﺎ اﺳـﺘﻔﺎده از ﺟﻌﺒـﻪ اﺑـﺰار ﻳـﻚ ﻛﻨﺘـﺮل Buttonﺑـﻪ ﻓـﺮم ﺟﺪﻳـﺪ ﺧـﻮد اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnDateو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Show Dateﻗﺮار دﻫﻴﺪ. (3روي دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را ﺑﻪ ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnDate_Click(object sender, EventArgs e { // Declare variable ;DateTime dteDate // Get the current date and time ;dteDate = DateTime.Now // Display the results ;)"MessageBox.Show(dteDate.ToString(), "Date Demo } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Show Dateﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻇﺎﻫﺮ ﺷﺪه و ﺗﺎرﻳﺦ و ﺳـﺎﻋﺖ ﺟـﺎري را )ﺑـﺮ اﺳﺎس ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ( ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 11-3ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﺷﻜﻞ 11-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٨٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻮع داده اي DateTimeﻣﻴﺘﻮاﻧﺪ ﻳﻚ ﻣﻘﺪار را ﻛﻪ ﻣﻌﺮف ﻳﻚ ﺗﺎرﻳﺦ و زﻣﺎن ﺧﺎص اﺳﺖ ،در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ .ﺑﻌـﺪ از اﻳـﻦ ﻛـﻪ ﻣﺘﻐﻴﻴﺮي از اﻳﻦ ﻧﻮع را اﻳﺠﺎد ﻛﺮدﻳﺪ ،ﺑﺮاي اﻳﻦ ﻛﻪ ﺑﻪ آن ﻣﻘﺪار اوﻟﻴﻪ ﺑﺪﻫﻴﺪ ﻣﻴﺘﻮاﻧﻴﺪ از ﺧﺎﺻﻴﺖ Nowدر اﻳﻦ ﻧﻮع داده اي اﺳﺘﻔﺎده ﻛﻨﻴﺪ. اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﻘﺪار ﺗﺎرﻳﺦ و زﻣﺎن ﻛﻨﻮﻧﻲ ﺳﻴﺴﺘﻢ را ﺑﺮﻣﻴﮕﺮداﻧﺪ: // Declare variable ;DateTime dteDate // Get the current date and time ;dteDate = DateTime.Now ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺑﺮ اي اﻳﻦ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻣﺘﺪ MessageBox.Showﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ ،ﺑﺎﻳﺪ ﺑﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ .در .NETﻫﺮ ﻣﺘﻐﻴﻴﺮي ﺗﺎﺑﻌﻲ ﺑﻪ ﻧﺎم ToStringدارد ﻛـﻪ ﻣﺘﻐﻴﻴـﺮ را ﺑـﻪ رﺷـﺘﻪ ﺗﺒـﺪﻳﻞ ﻣﻴﻜﻨـﺪ .1در اﻳـﻦ ﺟـﺎ ﺑـﺮاي اﻳـﻦ ﻛـﻪ ﺑﺘـﻮاﻧﻴﻢ ﻣﺘﻐﻴﻴـﺮ dteDateرا ﻧﻤﺎﻳﺶ دﻫﻴﻢ اﺑﺘﺪا ﺑﺎﻳﺪ آن را ﺑﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ ﻛﻪ ﺑﺮاي اﻳﻦ ﻛﺎر از ﺗﺎﺑﻊ ToStringاﻳـﻦ ﻣﺘﻐﻴﻴـﺮ اﺳـﺘﻔﺎده ﻛﺮده اﻳﻢ: // Display the results ;)"MessageBox.Show(dteDate.ToString(), "Date Demo ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﺗﺎرﻳﺦ و زﻣﺎن ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ دﻳﮕﺮ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻫﺴﺘﻨﺪ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺗـﺎرﻳﺦ و زﻣـﺎن را در ﺧـﻮد ﻧﮕﻬـﺪاري ﻛﻨﻨـﺪ و ﻋﻤﻠﻴﺎت ﺟﻤﻊ و ﺗﻔﺮﻳﻖ ﻣﺮﺑﻮط ﺑﻪ آن را ﻧﻴﺰ اﻧﺠﺎم دﻫﻨﺪ .در ﺑﺨﺸﻬﺎي ﺑﻌﺪي ﺑﺎ ﻧﺤﻮه ﻛﺎر ﺑﺎ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ و ﻧﻤﺎﻳﺶ آﻧﻬﺎ ﺑـﺮ روي ﺻـﻔﺤﻪ ﻧﻤﺎﻳﺶ ﺑﻪ روﺷﻬﺎي ﮔﻮﻧﺎﮔﻮن ،ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
ﻗﺎﻟﺐ ﺑﻨﺪي ﺗﺎرﻳﺨﻬﺎ: در ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﻳﻜﻲ از ﺣﺎﻟﺘﻬﺎي ﻗﺎﻟﺐ ﺑﻨﺪي ﺗﺎرﻳﺦ را دﻳﺪﻳﻢ .اﮔﺮ ﻣﺘﻐﻴﻴﺮي از ﻧﻮع ﺗﺎرﻳﺦ را ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ToStringﺑﻪ رﺷـﺘﻪ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ ،ﺗﺎرﻳﺦ و زﻣﺎن ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 11-3ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﻨﺪ ﺷﺪ.ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ اﻳﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑـﺮ اﺳـﺎس اﻳـﺮان اﺳﺖ ،ﺗﺎرﻳﺦ ﺑﻪ ﺻﻮرت YYYY/MM/DDو زﻣﺎن ﻧﻴﺰ ﺑﻪ ﺻﻮرت 12ﺳﺎﻋﺘﻪ ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد .اﻳـﻦ ﻧﻴـﺰ ﻧﻤﻮﻧـﻪ دﻳﮕـﺮي از ﺗـﺎﺛﻴﺮ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺮ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﻣﺘﻐﻴﻴﺮ ﻫﺎ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد را ﺑﺮاﺑـﺮ اﻧﮕﻠـﻴﺲ ﻗـﺮار دﻫﻴـﺪ، ﺗﺎرﻳﺦ در ﻗﺎﻟﺐ DD/MM/YYYYو زﻣﺎن ﻧﻴﺰ ﺑﻪ ﺻﻮرت 24ﺳﺎﻋﺘﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. اﻟﺒﺘﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﻧﺤﻮه ﻧﻤﺎﻳﺶ ﺗﺎرﻳﺦ را در ﺑﺮﻧﺎﻣﻪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﺎ در ﻫﺮ ﺳﻴﺴﺘﻢ ﺑﺎ ﻫﺮ ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﺑﻪ ﻳﻚ ﺻﻮرت ﻧﻤـﺎﻳﺶ داده ﺷـﻮد، اﻣﺎ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ اﺟﺎزه دﻫﻴﺪ .NETﻧﺤﻮه ﻧﻤﺎﻳﺶ را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻧﺘﺨﺎب ﻛﻨﺪ ،ﺗﺎ ﻫﺮ ﻛﺎرﺑﺮ ﺑﻪ ﻫﺮ ﻧﺤـﻮي ﻛـﻪ ﺑﺨﻮاﻫـﺪ آن را ﻣﺸﺎﻫﺪه ﻛﻨﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺎ ﭼﻬﺎر روش ﻣﻔﻴﺪ ﺑﺮاي ﻗﺎﻟﺐ ﺑﻨﺪي ﺗﺎرﻳﺨﻬﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻗﺎﻟﺐ ﺑﻨﺪي ﺗﺎرﻳﺨﻬﺎ 1اﻳﻦ در ﺣﺎﻟﺘﻲ اﺳﺖ ﻛﻪ ﻣﺘﻐﻴﻴﺮ ﺑﺘﻮاﻧﺪ ﺑﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﺷﻮد .ﺑﻌﻀﻲ از ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻛﻪ در ﻓﺼﻠﻬﺎي ﺑﻌﺪي ﺑﺎ آﻧﻬﺎ آﺷﻨﺎ ﻣﻴﺸﻮﻳﻢ ﻧﻤﻴﺘﻮاﻧﻨﺪ ﺑﻪ رﺷﺘﻪ ﺗﺒـﺪﻳﻞ ﺷـﻮﻧﺪ .در اﻳـﻦ ﺻﻮرت ،اﻳﻦ ﺗﺎﺑﻊ رﺷﺘﻪ اي را ﺑﺮﻣﻴﮕﺮداﻧﺪ ﻛﻪ ﻣﻌﺮف ﻣﺘﻐﻴﻴﺮ ﻣﻮرد ﻧﻈﺮ اﺳﺖ.
٨٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1اﮔﺮ ﺑﺮﻧﺎﻣﻪ Date Demoدر ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ. (2ﺑﺎ اﺳﺘﻔﺎده از وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮاي ،Form1ﺗﺎﺑﻊ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickدﻛﻤﻪ ﻓﺮﻣﺎن را ﭘﻴﺪا ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: // Display the results MessageBox.Show("Current Date is: " + dteDate, ;)""Date Demo // Display dates MessageBox.Show(dteDate.ToLongDateString(), ;)""Date Demo MessageBox.Show(dteDate.ToShortDateString(), ;)""Date Demo // Display times MessageBox.Show(dteDate.ToLongTimeString(), ;)""Date Demo MessageBox.Show(dteDate.ToShortTimeString(), ;)""Date Demo } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي دﻛﻤﻪ ،Show Dateﭘﻨﺞ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮﻧﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣـﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻛﺎدر ﭘﻴﻐﺎم اول ﺗﺎرﻳﺦ و زﻣﺎن را ﺑﺮ اﺳﺎس ﺗﻨﻈﻴﻤﺎت ﻣﺤﻠﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ ﻧﻤـﺎﻳﺶ ﻣﻴﺪﻫـﺪ .ﻛـﺎدر دوم ﺗـﺎرﻳﺦ را ﺑـﻪ ﺻﻮرت ﻛﺎﻣﻞ و ﻛﺎدر ﺳﻮم ﺗﺎرﻳﺦ را ﺑﻪ ﺻﻮرت ﺧﻼﺻﻪ ﺷﺪه ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﻛﺎدر ﭼﻬﺎرم زﻣﺎن را ﺑﻪ ﺻـﻮرت ﻛﺎﻣـﻞ و ﻛـﺎدر آﺧﺮ زﻣﺎن ﺑﻪ ﺻﻮرت ﻣﺨﺘﺼﺮ ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ﻫﻴﭻ ﻧﻘﻄﻪ ﻣﺒﻬﻤﻲ وﺟﻮد ﻧﺪارد و ﻧﺎم ﺗﻮاﺑﻊ ﺑﻪ اﻧﺪازه ﻛﺎﻓﻲ واﺿﺢ ﻫﺴﺘﻨﺪ و ﻣﺸﺨﺺ ﻣﻴﻜﻨﻨﺪ ﻛﻪ ﻫﺮ ﺗﺎﺑﻊ ﭼﻪ ﻛـﺎري اﻧﺠـﺎم ﻣﻴﺪﻫﺪ: // Display dates ;)"MessageBox.Show(dteDate.ToLongDateString(), "Date Demo ;)"MessageBox.Show(dteDate.ToShortDateString(),"Date Demo // Display times ;)"MessageBox.Show(dteDate.ToLongTimeString(), "Date Demo ;)"MessageBox.Show(dteDate.ToShortTimeString(),"Date Demo
٨٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
:DateTime اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي در. ﻣﻴﺘﻮاﻧﻴﺪ از ﺧﺎﺻﻴﺘﻬﺎي ﮔﻮﻧﺎﮔﻮﻧﻲ ﻛﻪ اراﺋـﻪ ﻣـﻲ دﻫـﺪ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ، داﺷﺘﻪ ﺑﺎﺷﻴﺪDateTime ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع . ﺑﺎ ﻗﺴﻤﺘﻲ از آﻧﻬﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ،اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ
DateTime اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي:اﻣﺘﺤﺎن ﻛﻨﻴﺪ . آن را ﺑﺒﻨﺪﻳﺪ، در ﺣﺎل اﺟﺮا اﺳﺖDate Demo ( اﮔﺮ ﺑﺮﻧﺎﻣﻪ1 آن را ﺑﺮاﺑـــــﺮName ﺧﺎﺻـــــﻴﺖ، اﺿـــــﺎﻓﻪ ﻛﻨﻴـــــﺪForm1 دﻳﮕـــــﺮي ﺑـــــﻪButton ( ﻛﻨﺘـــــﺮل2 روي. ﻗـﺮار دﻫﻴـﺪDate Properties آن را ﺑﺮاﺑﺮText و ﺧﺎﺻﻴﺖbtnDateProperties :دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه وارد ﻛﻨﻴﺪ private void btnDateProperties_Click(object sender, EventArgs e) { // Declare variable DateTime dteDate; // Get the current date and time dteDate = DateTime.Now; // Display the various properties MessageBox.Show("Month: " + dteDate.Month, "Date Demo"); MessageBox.Show("Day: " + dteDate.Day, "Date Demo"); MessageBox.Show("Year: " + dteDate.Year, "Date Demo"); MessageBox.Show("Hour: " + dteDate.Hour, "Date Demo"); MessageBox.Show("Minute: " + dteDate.Minute, "Date Demo"); MessageBox.Show("Second: " + dteDate.Second, "Date Demo"); MessageBox.Show("Day of week: " + dteDate.DayOfWeek, "Date Demo"); MessageBox.Show("Day of year: " + dteDate.DayOfYear, "Date Demo"); } ﻳﻚ ﺳﺮي ﻛﺎدرﻫﺎي ﭘﻴﻐﺎم ﻣﺘﻮاﻟﻲ را ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ ﭘﻴﻐـﺎم ﻫـﺎي.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻓﺮﻣﺎن ﺟﺪﻳﺪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ3 .واﺿﺤﻲ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﻨﺪ
٨٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻞ ،در اﻳﻦ ﻣﺜﺎل ﻫﻢ ﻧﻜﺘﻪ ﻣﺒﻬﻤﻲ وﺟﻮد ﻧﺪارد ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺗﻮﺿﻴﺢ داﺷﺘﻪ ﺑﺎﺷﺪ .ﺧﻮد ﺗﻮاﺑﻊ ﺑﻪ اﻧﺪازه ﻛﺎﻓﻲ واﺿـﺢ ﻫـﺴﺘﻨﺪ. ﺑﺮاي اﺳﺘﻔﺎده از ﺳﺎﻋﺖ ،از ﺧﺎﺻﻴﺖ ،Hourﺑﺮاي اﺳﺘﻔﺎده از ﺳﺎل از ﺧﺎﺻﻴﺖ Yearو ...اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﻛﺎر ﺑﺎ ﺗﺎرﻳﺨﻬﺎ: ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ ﻛﻨﺘﺮل آن ﻫﻤﻴﺸﻪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﺸﻜﻞ ﺑﻮده اﺳﺖ ،ﻛﺎر ﺑﺎ ﺗﺎرﻳﺨﻬﺎ اﺳﺖ .ﻳﻜﻲ از اﻳـﻦ ﻧﻤﻮﻧـﻪ ﻣـﺸﻜﻼت ﻛـﻪ ﻣﻤﻜﻦ اﺳﺖ ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﺗﺎرﻳﺦ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ اﻳﺠﺎد ﺷﻮد ،ﻣﺸﻜﻞ ﺳﺎل 2000ﺑﻮد ﻛﻪ در آن ﻫﻤﻪ ﻣﺮدم ﻣﻨﺘﻈﺮ ﺑﻮدﻧﺪ ﺗﺎ ﺑﺒﻴﻨﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ﭼﮕﻮﻧﻪ ﺑﺎ اﻳﻦ ﻣﺸﻜﻞ روﺑﺮو ﻣﻲ ﺷﻮﻧﺪ .ﻳﺎ ﻣﺜﻼ ،ﻛﺎر ﺑﺎ ﺳﺎﻟﻬﺎي ﻛﺒﻴﺴﻪ ﻫﻤﻮاره ﻣﺸﻜﻼت زﻳﺎدي را در ﺑﺮﻧﺎﻣﻪ ﻫـﺎ اﻳﺠـﺎد ﻛـﺮده اﺳﺖ. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺗﻌﺪادي از ﺗﻮاﺑﻊ و ﻣﺘﺪﻫﺎي ﻧﻮع داده اي Dateﻛﻪ ﻣﻮﺟﺐ ﺳﺎده ﺗﺮ ﺷﺪن ﻛﺎر ﺑﺎ ﺳﺎﻟﻬﺎي ﻛﺒﻴﺴﻪ در ﺑﺮﻧﺎﻣـﻪ ﻣﻲ ﺷﻮد را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﺗﺎرﻳﺨﻬﺎي ﺧﺎص (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ Date Demoدر ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ. (2دﻛﻤﻪ ﻓﺮﻣﺎن دﻳﮕﺮي ﺑﻪ ﻓﺮم ﺧﻮد اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnDateManipulationو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Date Manipulationﻗﺮار دﻫﻴﺪ .روي دﻛﻤﻪ ﻓﺮﻣﺎن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛـﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه وارد ﻛﻨﻴﺪ: private void btnDateManipulation _Click(object sender, )EventArgs e { // Declare variables ;DateTime dteStartDate ;DateTime dteChangedDate // Start off in 2400 ;)dteStartDate = new DateTime(2400, 2, 28 // Add a day and display the results ;)dteChangedDate = dteStartDate.AddDays(1 MessageBox.Show(dteChangedDate.ToLongDateString(), ;)""Date Demo // Add some months and display the results
٨٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
dteChangedDate = dteStartDate.AddMonths(6); MessageBox.Show(dteChangedDate.ToLongDateString(), "Date Demo"); // Subtract a year and display the results dteChangedDate = dteStartDate.AddYears(-1); MessageBox.Show(dteChangedDate.ToLongDateString(), "Date Demo"); } ﻛـﺎدر ﭘﻴﻐـﺎم اوﻟـﻲ ﺗـﺎرﻳﺦ. ﺳﻪ ﻛـﺎدر ﭘﻴﻐـﺎم را ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ3 . را ﻧﻤﺎﻳﺶ ﺧﻮاﻫﺪ داد2399/2/28 و ﻛﺎدر ﭘﻴﻐﺎم ﺳﻮم،2400/8/28 ﻛﺎدر ﭘﻴﻐﺎم دوﻣﻲ ﺗﺎرﻳﺦ،2400/2/29
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ : در زﻳﺮ ﺳﻪ ﻧﻤﻮﻧﻪ از آﻧﻬﺎ آﻣﺪه اﺳﺖ. ﻣﺘﺪﻫﺎي زﻳﺎدي ﺑﺮاي ﻛﺎر ﺑﺮ روي ﺗﺎرﻳﺦ داردDateTime ﻧﻮع داده اي // Add a day and display the results dteChangedDate = dteStartDate.AddDays(1); MessageBox.Show(dteChangedDate.ToLongDateString(), "Date Demo"); // Add some months and display the results dteChangedDate = dteStartDate.AddMonths(6); MessageBox.Show(dteChangedDate.ToLongDateString(), "Date Demo"); // Subtract a year and display the results dteChangedDate = dteStartDate.AddYears(-1); MessageBox.Show(dteChangedDate.ToLongDateString(), "Date Demo"); ﺑﺮاي ﻛﻢ ﻛﺮدن از اﻳـﻦ ﻣﻘـﺎدﻳﺮ، ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ. ﻣﺎه و ﻳﺎ ﺳﺎل ﺑﻪ ﺗﺎرﻳﺦ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ،اﻳﻦ ﺗﻮاﺑﻊ ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن روز ،AddHours : ﻣﺘــﺪﻫﺎي ﻣﻬــﻢ دﻳﮕــﺮ در اﻳــﻦ ﻧــﻮع داده اي ﻋﺒﺎرﺗﻨــﺪ از.ﻳــﻚ ﻋــﺪد ﻣﻨﻔــﻲ را ﺑــﻪ اﻳــﻦ ﺗﻮاﺑــﻊ ارﺳــﺎل ﻛــﺮده اﻳــﻢ .AddMiliseconds وAddSeconds ،AddMinutes
:ﺑﻮﻟﻴﻦ
٩٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﺎﻛﻨﻮن ﺑﺎ ﻧﻮع ﻫـﺎي داده اي String ،Double ،float ،intو DateTimeآﺷـﻨﺎ ﺷـﺪﻳﺪ .ﻧـﻮع داده اي ﻣﻬـﻢ دﻳﮕﺮي ﻛﻪ ﺑﺎﻳﺪ ﻧﺤﻮه ﻛﺎر ﺑﺎ آن را ﺑﺪاﻧﻴﺪ Boolean ،اﺳﺖ .ﺑﻌﺪ از اﺗﻤﺎم اﻳﻦ ﻧﻮع داده اي،ﺑﺎ ﭘﺮﻛﺎرﺑﺮد ﺗـﺮﻳﻦ ﻧـﻮع ﻫـﺎي داده اي در .NETآﺷﻨﺎ ﺷﺪه اﻳﺪ. ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻮﻟﻴﻦ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ ) Trueدرﺳﺖ( و ﻳـﺎ ) Falseﻏﻠـﻂ( را داﺷـﺘﻪ ﺑﺎﺷـﺪ .ﻣﺘﻐﻴﻴـﺮ ﻫـﺎي Booleanﺑﻴـﺸﺘﺮ ﻫﻨﮕﺎﻣﻲ اﻫﻤﻴﺖ ﺧﻮد را ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺨﻮاﻫﺪ ﺻﺤﺖ ﻳﻚ ﺷﺮط را ﺑﺮرﺳﻲ ﻛﻨﺪ )ﺑﺎ ﺑﺮرﺳﻲ ﺷﺮط ﻫﺎ در ﻓـﺼﻞ 4ﺑﻴـﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ(.
ﻧﮕﻬﺪاري ﻣﺘﻐﻴﻴﺮ ﻫﺎ: ﻋﻤﻮﻣﺎ ﻣﺤﺪود ﺗﺮﻳﻦ ﻗﺴﻤﺖ ﻳﻚ ﺳﻴﺴﺘﻢ ،ﺣﺎﻓﻈﻪ آن اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﺑـﻪ ﺑﻬﺘـﺮﻳﻦ و ﻛﺎرآﻣـﺪ ﺗـﺮﻳﻦ ﻧﺤـﻮ از اﻳـﻦ ﻗـﺴﻤﺖ اﺳﺘﻔﺎده ﻛﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ )از ﻫﺮ ﻧﻮﻋﻲ( ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻛﺮده اﻳﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﻫـﺎ ﺑﺎﻳـﺪ دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻫﻢ ﻛﻤﺘﺮﻳﻦ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ ﻣﻤﻜﻦ را ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﻫﻢ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ. اﻣﺮوزه ،ﺑﻪ دو دﻟﻴﻞ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺷﻤﺎ از ﺟﺰﺋﻴﺎت ﻛﺎﻣﻞ ﺑﻬﻴﻨﻪ ﺳﺎزي ﻣﺘﻐﻴﻴﺮ ﻫﺎ آﮔﺎه ﺑﺎﺷﻴﺪ .دﻟﻴـﻞ اول اﻳـﻦ اﺳـﺖ ﻛـﻪ ﻛﺎﻣﭙﻴﻮﺗﺮﻫـﺎي اﻣﺮوزي ﻣﻘﺪار زﻳﺎدي ﺣﺎﻓﻈﻪ دارﻧﺪ .از زﻣﺎﻧﻲ ﻛﻪ ﻻزم ﺑﻮد ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد را در 32ﻛﻴﻠﻮ ﺑﺎﻳـﺖ از ﺣﺎﻓﻈـﻪ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﺟـﺎ ﺑﺪﻫﻨﺪ ﺧﻴﻠﻲ ﮔﺬﺷﺘﻪ اﺳﺖ .دﻟﻴﻞ دﻳﮕﺮ اﻳﻦ اﺳﺖ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي اﻣﺮوزي ﺑﻪ ﺻﻮرت دروﻧﻲ ،ﺑﻪ اﻧﺪازه ﻛﺎﻓﻲ در اﻳﻦ زﻣﻴﻨﻪ ﻫﻮﺷﻤﻨﺪ ﻋﻤﻞ ﻣﻴﻜﻨﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ،ﻛﺪﻫﺎي ﺗﻮﻟﻴﺪ ﺷﺪه ﺗﻮﺳﻂ آﻧﻬﺎ ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ ﺑﻬﻴﻨﻪ ﻣﻴﺸﻮد ﺗﺎ ﺑﻬﺘﺮﻳﻦ ﻛﺎراﻳﻲ را داﺷﺘﻪ ﺑﺎﺷﻨﺪ.
دودوﻳﻲ: ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺑﺮاي ﻧﮕﻬﺪاري ﻫﺮ اﻃﻼﻋﺎﺗﻲ از ﺳﻴﺴﺘﻢ دودوﻳﻲ اﺳﺘﻔﺎده ﻣﻴﻜﻨﻨﺪ .در ﺣﻘﻴﻘﺖ ﻫﺮ داده اي را ﻛﻪ ﺷـﻤﺎ در ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻧﮕﻬـﺪاري ﻣﻴﻜﻨﻴﺪ ﺑﺎﻳﺪ در ﻗﺎﻟﺐ ﺻﻔﺮ و ﻳﻚ ذﺧﻴﺮه ﺷﻮﻧﺪ .ﺑﺮاي ﻧﻤﻮﻧﻪ ﻋﺪد ﺻﺤﻴﺢ 27را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .در ﺳﻴﺴﺘﻢ ﺑﺎﻳﻨﺮي ﻳﺎ دودوﻳﻲ اﻳﻦ ﻋﺪد ﺑـﻪ ﺻﻮرت 11011ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ،ﻛﻪ ﻫﺮ ﻛﺪام از اﻳﻦ اﻋﺪاد در ﺗﻮاﻧﻲ از دو ﺿﺮب ﻣﻴﺸﻮﻧﺪ .ﻧﻤﻮدار ﺷﻜﻞ 12-3ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻣﻴﻜﻨﺪ ﺗﺎ ﻋﺪد 27را ﺑﻬﺘﺮ در ﺳﻴﺴﺘﻢ ده دﻫﻲ و در ﺳﻴﺴﺘﻢ دودوﻳﻲ ﻳﺎ ﺑﺎﻳﻨﺮي ﻧﻤﺎﻳﺶ دﻫﻴﺪ. ﻣﻤﻜﻦ اﺳﺖ در اﺑﺘﺪا اﻳﻦ ﻣﻮرد ﻣﻘﺪاري ﻧﺎﻣﻔﻬﻮم ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ .در ﻣﺒﻨﺎي 10ﻳﺎ ﻫﻤﺎن ﺳﻴﺴﺘﻢ ده دﻫﻲ ﻛﻪ ﺑﺎ آن آﺷﻨﺎ ﻫﺴﺘﻴﺪ ،ﺑﺮاي ﺗﻌﻴﻴﻦ ارزش ﻫﺮ ﻋﺪد ،ﻫﺮ رﻗﻢ از آن در ﺗﻮاﻧﻲ از ده ﺿﺮب ﻣﻴﺸﻮد .اوﻟﻴﻦ رﻗﻢ ﻋﺪد از ﺳﻤﺖ راﺳﺖ در ده ﺑﻪ ﺗﻮان ﺻﻔﺮ ﺿﺮب ﻣﻴﺸﻮد ،ﻋـﺪد دوم در ده ﺑﻪ ﺗﻮان ﻳﻚ ﺿﺮب ﻣﻴﺸﻮد ،ﻋﺪد ﺳﻮم در ده ﺑﻪ ﺗﻮان دو ﺿﺮب ﻣﻴﺸﻮد و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ اداﻣﻪ ﭘﻴﺪا ﻣﻴﻜﻨﺪ. ﻫﻤﻴﻦ روش در ﺳﻴﺴﺘﻢ ﺑﺎﻳﻨﺮي ﻫﻢ وﺟﻮد دارد .ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻋﺪد در ﻣﺒﻨﺎي دو ﺑﻪ ﻳﻚ ﻋﺪد در ﻣﺒﻨـﺎي ده ،ﺑﺎﻳـﺪ رﻗﻤﻬـﺎ را از ﺳـﻤﺖ راﺳﺖ ﻳﻜﻲ ﻳﻜﻲ ﺟﺪا ﻛﻨﻴﺪ و در دو ﺑﻪ ﺗﻮان ﺷﻤﺎره ﻣﻜﺎن ﻋﺪد ﺿﺮب ﻛﻨﻴﺪ )ﻋﺪد اول از ﺳﻤﺖ راﺳﺖ در ﻣﻜﺎن ﺻﻔﺮم ،ﻋﺪد دوم در ﻣﻜﺎن ﻳﻜﻢ و ...ﻗﺮار دارد( .ﺳﭙﺲ ﺗﻤﺎم اﻋﺪاد ﺑﻪ دﺳﺖ آﻣﺪه را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻛﻨﻴﺪ .ﻋﺪدي ﻛﻪ ﺑﻪ دﺳﺖ ﻣﻲ آﻳـﺪ ،ﻧﻤـﺎﻳﺶ دﻫﻨـﺪه ﻫﻤـﺎن ﻋـﺪد در ﻣﺒﻨﺎي ده اﺳﺖ.
٩١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﻣﺒﻨﺎي 10ﻫﺮ رﻗﻢ ﺿﺮﻳﺒﻲ از ﻳﻜﻲ از ﺗﻮاﻧﻬﺎي 10اﺳﺖ .ﺑﺮاي اﻳﻨﻜﻪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻳﻚ رﺷﺘﻪ از ارﻗﺎم ﻛﻪ در ﻣﺒﻨﺎي 10ﻧﻮﺷـﺘﻪ ﺷـﺪه اﻧﺪ ﭼﻪ ﻋﺪدي را ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ ،ﻛﺎﻓﻲ اﺳﺖ رﻗﻢ اول را در 10ﺑﻪ ﺗﻮان ،0رﻗﻢ دوم را در 10ﺑﻪ ﺗﻮان 1و ...ﺿﺮب ﻛﺮده و ﺣﺎﺻﻞ را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛﻨﻴﺪ.
در ﻣﺒﻨﺎي 2ﻳﺎ اﻋﺪاد ﺑﺎﻳﻨﺮي ،ﻫﺮ رﻗﻢ ﺿﺮﻳﺒﻲ از ﻳﻜﻲ از ﺗﻮاﻧﻬﺎي 2اﺳﺖ .ﺑﺮاي ﺗﺸﺨﻴﺺ اﻳﻨﻜﻪ ﻳﻚ رﺷﺘﻪ ارﻗﺎم در ﻣﺒﻨﺎي 2ﭼﻪ ﻋـﺪدي را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ ،ﺑﺎﻳﺪ رﻗﻢ اول را در 2ﺑﻪ ﺗﻮان ،0رﻗﻢ دوم را در 2ﺑﻪ ﺗﻮان 1و ...ﺿﺮب ﻛﺮده و ﺣﺎﺻﻞ را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛﺮد. ﺷﻜﻞ 12-3
ﺑﻴﺘﻬﺎ و ﺑﺎﻳﺖ ﻫﺎ: در اﺻﻄﻼﺣﺎت ﻛﺎﻣﭙﻴﻮﺗﺮي ،ﺑﻪ ﻳﻚ رﻗﻢ ﺑﺎﻳﻨﺮي ،ﻳﻚ ﺑﻴﺖ ﻣﻴﮕﻮﻳﻨﺪ .ﻳﻚ ﺑﻴﺖ ﻛﻮﭼﻜﺘﺮﻳﻦ ﺑﺨﺶ ﻣﻤﻜﻦ ﺑﺮاي ﻧﻤﺎﻳﺶ داده اﺳـﺖ و ﻓﻘـﻂ ﻣﻴﺘﻮاﻧﺪ داراي ﻣﻘﺪار درﺳﺖ و ﻳﺎ ﻏﻠﻂ ﺑﺎﺷﺪ .اﻳﻦ ﻣﻘﺪار در ﻣﺪارﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ وﺳﻴﻠﻪ وﺟﻮد داﺷﺘﻦ و ﻳﺎ وﺟﻮد ﻧﺪاﺷﺘﻦ ﺟﺮﻳـﺎن ﻣـﺸﺨﺺ ﻣﻲ ﺷﻮد .دﻟﻴﻞ اﻳﻨﻜﻪ در ﻫﺮ ﻗﺴﻤﺖ از ﺷﻜﻞ 12-3ﻫﺸﺖ ﺑﻴﺖ در ﻛﻨﺎر ﻫﻢ ﻧﺸﺎن داده ﺷﺪه اﻧﺪ ،اﻳﻦ اﺳﺖ ﻛﻪ ﻫﺮ ﻫـﺸﺖ ﺑﻴـﺖ در ﻛﻨـﺎر ﻫﻢ ﻳﻚ ﺑﺎﻳﺖ را ﺗﺸﻜﻴﻞ ﻣﻲ دﻫﻨﺪ .ﺑﺎﻳﺖ واﺣﺪ اﻧﺪازه ﮔﻴﺮي ﺣﺎﻓﻈﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ ﺷﻤﺎر ﻣﻴﺮود. ﻳﻚ ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻳﺎ KBاز 1024ﺑﺎﻳﺖ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .دﻟﻴﻞ اﻳﻨﻜﻪ ﺑﻪ ﺟﺎي 1000از 1024ﺑﺎﻳﺖ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ ،اﻳـﻦ اﺳـﺖ ﻛـﻪ 1024ﺗﻮاﻧﻲ از دو اﺳﺖ ) دو ﺑﻪ ﺗﻮان ده( .ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ اﻋﺪاد در ﻛﺎﻣﭙﻴﻮﺗﺮ در ﻣﺒﻨﺎي دو ذﺧﻴﺮه ﻣﻴﺸﻮﻧﺪ ،ﻧﮕﻬـﺪاري 1024راﺣـﺖ ﺗـﺮ از ﻧﮕﻬﺪاري 1000اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻧﮕﻬﺪاري 1000ﺑﺮاي ﺷﻤﺎ ﻛﻪ از ﺳﻴﺴﺘﻢ ده دﻫﻲ اﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ راﺣﺖ ﺗﺮ از 1024اﺳﺖ. ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ ﻳﻚ ﻣﮕﺎ ﺑﺎﻳﺖ ﻳﺎ MBﺑﺮاﺑﺮ 1024ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻳﺎ 1048576ﺑﺎﻳﺖ ،ﻳﻚ ﮔﻴﮕﺎ ﺑﺎﻳﺖ 1024ﻣﮕﺎ ﺑﺎﻳـﺖ ﻳـﺎ 1073741824 ﺑﺎﻳﺖ اﺳﺖ )دو ﺑﻪ ﺗﻮان ﺳﻲ( .ﻫﻤﭽﻨﻴﻦ ﺗﺮا ﺑﺎﻳﺖ ﺑﺮاﺑﺮ دو ﺑﻪ ﺗﻮان ﭼﻬﻞ و ﭘﺘﺎ ﺑﺎﻳﺖ ﺑﺮاﺑﺮ دو ﺑﻪ ﺗﻮان ﭘﻨﺠﺎه اﺳﺖ. ﻫﻤﻪ اﻳﻦ ﻣﻄﺎﻟﺐ ﺑﻪ ﭼﻪ ﻛﺎر ﻣﻲ آﻳﺪ؟ ﺧﻮب ،داﻧﺴﺘﻦ اﻳﻦ ﻛﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﭼﮕﻮﻧﻪ اﻃﻼﻋﺎت را ذﺧﻴﺮه ﻣﻴﻜﻨﺪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻪ ﺷﻤﺎ ﻛﻤـﻚ ﻛﻨـﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد را ﺑﻬﺘﺮ ﻃﺮاﺣﻲ ﻛﻨﻴﺪ .ﻓﺮض ﻛﻨﻴﺪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ 256ﻣﮕﺎ ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ دارد .اﻳﻦ ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﺑﺮاﺑـﺮ 2147483648 ﺑﺎﻳﺖ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار ﻫﺴﺘﻴﺪ ﺑﺎﻳﺪ ﺳﻌﻲ ﻛﻨﻴﺪ ﻛﻪ از ﺣﺎﻓﻈﻪ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ ﻣﻤﻜﻦ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﻧﻤﺎﻳﺶ ﻣﻘﺎدﻳﺮ:
٩٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻴﺸﺘﺮ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي اﻣﺮوزي 32ﺑﻴﺘﻲ ﻫﺴﺘﻨﺪ ،ﻳﻌﻨﻲ در ﻫﺮ ﻟﺤﻈﻪ ﻣﻴﺘﻮاﻧﻨﺪ ﺑﺎ داده ﻫﺎﻳﻲ ﺑﻪ ﻃﻮل 32ﺑﻴﺖ ﻛﺎر ﻛﻨﻨﺪ .اﻋﺪادي ﻛﻪ در ﺑﺨﺶ ﻗﺒﻠﻲ دﻳﺪﻳﺪ ﻫﻤﮕﻲ اﻋﺪاد ﻫﺸﺖ ﺑﻴﺘﻲ ﺑﻮدﻧﺪ .در ﻳﻚ ﻋﺪد ﻫﺸﺖ ﺑﻴﺘﻲ ﺣﺪاﻛﺜﺮ ﻣﻘﺪاري را ﻛﻪ ﻣﻲ ﺗﻮان ﻧﮕﻬـﺪاري ﻛـﺮد ﺑـﻪ ﺻـﻮرت زﻳـﺮ اﺳﺖ: 1*128 + 1*64 + 1*32 + 1*16 + 1*8 + 1*4 + 1*2 + 1*1 = 256 ﻫﺮ ﻋﺪد 32ﺑﻴﺘﻲ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮي در ﻣﺤﺪوده -2147483647ﺗﺎ 2147483647را ﻧﮕﻬﺪاري ﻛﻨـﺪ .ﺣـﺎل اﮔـﺮ ﺑﺨﻮاﻫﻴـﺪ ﻳـﻚ ﻋـﺪد ﺻﺤﻴﺢ را ﻧﮕﻬﺪاري ﻛﻨﻴﺪ ﻣﺘﻐﻴﻴﺮي را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻴﻜﻨﻴﺪ: ;int intNumber در اﻳﻨﺠﺎ 32 .NET ،ﺑﻴﺖ از ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ را ﺑﺮاي اﻳﻦ ﻣﺘﻐﻴﻴﺮ اﺧﺘﺼﺎص ﻣﻴﺪﻫﺪ ﻛﻪ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ اﻋﺪاد در ﺑﺎزه اي ﻛﻪ ﮔﻔﺘـﻪ ﺷـﺪ را در آن ذﺧﻴﺮه ﻛﻨﻴﺪ .اﻣﺎ ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﻤﺎ ﻣﺤﺪود اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ 256ﻣﮕﺎﺑﺎﻳـﺖ ﺣﺎﻓﻈـﻪ داﺷـﺘﻪ ﺑﺎﺷﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ 67108864ﻋﺪد ﺻﺤﻴﺢ را در آن ﻧﮕﻬﺪاري ﻛﻨﻴﺪ .ﻣﻤﻜﻦ اﺳﺖ زﻳﺎد ﺑﻪ ﻧﻈﺮ ﺑﺮﺳـﺪ .اﻣـﺎ ﺑﺎﻳـﺪ دو ﻧﻜﺘـﻪ را در ﻧﻈـﺮ داﺷـﺘﻪ ﺑﺎﺷﻴﺪ .اول اﻳﻨﻜﻪ ﺑﻌﻀﻲ از ﻣﺘﻐﻴﻴﺮﻫﺎ ﻛﻪ در ﻓﺼﻠﻬﺎي ﺑﻌﺪي ﺑﺎ آﻧﻬﺎ آﺷﻨﺎ ﻣﻴﺸﻮﻳﻢ ﺑﺴﻴﺎر ﺑﻴﺸﺘﺮ از ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﻓﻀﺎ اﺷـﻐﺎل ﻣـﻲ ﻛﻨﻨـﺪ. دوم اﻳﻨﻜﻪ ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺣﺎﻓﻈﻪ ﺑﻴﻦ ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﺸﺘﺮك اﺳﺖ و ﻧﺒﺎﻳﺪ آن را ﻫﺪر ﺑﺪﻫﻴﺪ. ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﻧﮕﻬﺪاري ﻳﻚ ﻋﺪد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ ،ﻣﺘﻐﻴﻴﺮي ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻴﻜﺮدﻳﺪ: ;double dblNumber ﺑﺮاي ﻧﮕﻬﺪاري ﻳﻚ ﻋﺪد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ ﺑﻪ 64ﺑﻴﺖ از ﺣﺎﻓﻈﻪ ﻧﻴﺎز دارﻳﺪ .ﻳﻌﻨﻲ ﻣﻴﺘﻮاﻧﻴﺪ ﺣﺪاﻛﺜﺮ 33554432ﻋﺪد اﻋـﺸﺎري ﺑـﺎ دﻗﺖ ﻣﻀﺎﻋﻒ در ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد داﺷﺘﻪ ﺑﺎﺷﻴﺪ. ﻧﻜﺘﻪ :اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻌﻤﻮﻟﻲ 32ﺑﻴﺖ از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣﻲ ﻛﻨﻨﺪ ،ﻳﻌﻨﻲ اﻳﻦ اﻋﺪاد ﻧﺼﻒ اﻋﺪاد اﻋﺸﺎري ﺑﺎ دﻗﺖ ﻣﻀﺎﻋﻒ و ﺑـﻪ اﻧﺪازه ي اﻋﺪاد ﺻﺤﻴﺢ ﻓﻀﺎ ﻣﻴﮕﻴﺮﻧﺪ. اﮔﺮ ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﺻﺤﻴﺢ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﭼﻪ در آن 1را ذﺧﻴﺮه ﻛﻨﻴﺪ ،ﭼﻪ 249و ﻳﺎ ،2147483647دﻗﻴﻘﺎ 32ﺑﻴﺖ از ﻓﻀﺎي ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻛﺮده اﻳﺪ .اﻧﺪازه ﻋﺪد ﻫﻴﭻ ﺗﺎﺛﻴﺮي در اﻧﺪازه ﻓﻀﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ذﺧﻴﺮه آن ﻧﺪارد .اﻳﻦ ﻣﻮرد ﻣﻤﻜﻦ اﺳﺖ ﻫﺪر رﻓـﺘﻦ ﺣﺎﻓﻈـﻪ ﺑـﻪ ﻧﻈﺮ رﺳﺪ .اﻣﺎ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺗﺼﻮر ﻣﻴﻜﻨﺪ اﻋﺪاد از ﻧﻮع ﻳﻜﺴﺎن ﻓﻀﺎي ﻳﻜﺴﺎﻧﻲ ﺑﺮاي ﻧﮕﻬﺪاري ﻧﻴـﺎز دارﻧـﺪ .در ﻏﻴـﺮ اﻳـﻦ ﺻﻮرت ،ﻧﻤﻴﺘﻮاﻧﺪ ﺑﺎ ﺳﺮﻋﺖ ﻗﺎﺑﻞ ﻗﺒﻮﻟﻲ ﻛﺎر ﻛﻨﺪ. ﺣﺎﻻ ﺑﻪ ﭼﮕﻮﻧﮕﻲ ﺗﻌﺮﻳﻒ ﻳﻚ رﺷﺘﻪ ﻧﮕﺎه ﻛﻨﻴﺪ: ;"!string strData = "Hello, World ﺑﺮ ﺧﻼف اﻋﺪاد ﺻﺤﻴﺢ و اﻋﺸﺎري ،رﺷﺘﻪ ﻫﺎ داراي ﻃﻮل ﺛﺎﺑﺘﻲ ﻧﻴﺴﺘﻨﺪ .در رﺷﺘﻪ ﻫﺎ ،ﻫﺮ ﻛﺎراﻛﺘﺮ دو ﺑﺎﻳﺖ ﻳﺎ 16ﺑﻴﺖ از ﻓﻀﺎي ﺣﺎﻓﻈـﻪ را اﺷﻐﺎل ﻣﻴﻜﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﻧﻤﺎﻳﺶ اﻳﻦ رﺷﺘﻪ ي 13ﻛﺎراﻛﺘﺮي ،ﺑﻪ 26ﺑﺎﻳﺖ ﻳﺎ 208ﺑﻴﺖ ﻓﻀﺎ در ﺣﺎﻓﻈﻪ ﻧﻴﺎز دارﻳﺪ .ﺣﺎﻓﻈﻪ ﻛـﺎﻣﭙﻴﻮﺗﺮي ﻛﻪ ﭘﻴﺸﺘﺮ ﻣﺜﺎل زدﻳﻢ ﺣﺪود دو ﻣﻴﻠﻴﻮن ﻛﺎراﻛﺘﺮ را ﻣﻴﺘﻮاﻧﺪ ﻧﮕﻬﺪاري ﻛﻨﺪ ﻛﻪ ﻧﺴﺒﺖ ﺑﻪ اﻋﺪاد ﺻﺤﻴﺢ و ﻳﺎ اﻋﺪاد اﻋﺸﺎري ﺑﺴﻴﺎر ﻛﻤﺘﺮ اﺳﺖ. اﺷﺘﺒﺎﻫﻲ ﻛﻪ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺗﺎزه ﻛﺎر اﻧﺠﺎم ﻣﻴﺪﻫﻨﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻛﻤﺘﺮ ﺑﻪ ﺗﺎﺛﻴﺮ ﻧﻮع ذﺧﻴﺮه داده ﻫﺎ در ﺻﺮﻓﻪ ﺟﻮﻳﻲ ﺣﺎﻓﻈﻪ ﻓﻜﺮ ﻣﻲ ﻛﻨﻨﺪ .ﺑﺮاي ﻧﻤﻮﻧﻪ اﮔﺮ ﺷﻤﺎ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﺮاي ﻧﮕﻬﺪاري رﺷﺘﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﺳﭙﺲ ﻋﺪد ﺻﺤﻴﺢ در آن ﻧﮕﻬﺪاري ﻛﻨﻴﺪ ،ﻣﺎﻧﻨﺪ زﻳﺮ:
٩٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;"string strData = "65536 در اﻳﻨﺠﺎ ﺑﺮاي ﻧﮕﻬﺪاري اﻳﻦ ﻋﺪد ﺻﺤﻴﺢ در ﻗﺎﻟﺐ رﺷﺘﻪ ،از 10ﺑﺎﻳﺖ ﻳﺎ 80ﺑﻴﺖ اﺳﺘﻔﺎده ﻛﺮده اﻳﺪ .در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻴﺘﻮاﻧﺴﺘﻴﺪ ﺑـﺎ ﺗﻌﺮﻳـﻒ اﻳﻦ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺣﺎﻓﻈﻪ ﻛﻤﺘﺮي اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻧﮕﻬﺪاري اﻳﻦ رﺷﺘﻪ ﻋﺪدي در ﺣﺎﻓﻈﻪ ﻫﺮ ﻛﺪام از اﻳﻦ ﻛﺎراﻛﺘﺮﻫﺎ ﺑﺎﻳـﺪ ﺑﻪ ﻳﻚ ﻋﺪد ﺧﺎص ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ و ﺳﭙﺲ در ﺣﺎﻓﻈﻪ ذﺧﻴﺮه ﺷﻮﻧﺪ .ﺑﺮاي ذﺧﻴﺮه ﻣﺘﻦ در ﺣﺎﻓﻈﻪ ،ﺑﺮ اﺳﺎس اﺳﺘﺎﻧﺪاردي ﺑﻪ ﻧﺎم ﻳﻮﻧﻴﻜﺪ 1ﺑﻪ ﻫﺮ ﻛﺎراﻛﺘﺮ ﻳﻚ ﻛﺪ ﺧﺎص داده ﻣﻴﺸﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫﺮ ﻛﺎراﻛﺘﺮ ﻳﻚ ﻛﺪ از 0ﺗﺎ 65535دارد و ﺑﺮاي ذﺧﻴﺮه آن ﻛـﺎراﻛﺘﺮ در ﺣﺎﻓﻈـﻪ ،ﻛـﺪ ﻣﻌﺎدل آن ذﺧﻴﺮه ﻣﻲ ﺷﻮد. در زﻳﺮ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻫﺮ ﻛﺎراﻛﺘﺮ را در رﺷﺘﻪ ﺑﺎﻻ آورده اﻳﻢ:
" "6ﻳﻮﻧﻴﻜﺪ 54ﻛﻪ ﻛﺪ ﺑﺎﻳﻨﺮي ﻣﻌﺎدل آن ﺑﺮاﺑﺮ 0000000000110110اﺳﺖ. " "5ﻳﻮﻧﻴﻜﺪ 53ﻛﻪ ﻛﺪ ﺑﺎﻳﻨﺮي ﻣﻌﺎدل آن ﺑﺮاﺑﺮ 0000000000110101اﺳﺖ. " "5ﻳﻮﻧﻴﻜﺪ 53ﻛﻪ ﻛﺪ ﺑﺎﻳﻨﺮي ﻣﻌﺎدل آن ﺑﺮاﺑﺮ 0000000000110101اﺳﺖ. " "3ﻳﻮﻧﻴﻜﺪ 51ﻛﻪ ﻛﺪ ﺑﺎﻳﻨﺮي ﻣﻌﺎدل آن ﺑﺮاﺑﺮ 0000000000110011اﺳﺖ. " "6ﻳﻮﻧﻴﻜﺪ 54ﻛﻪ ﻛﺪ ﺑﺎﻳﻨﺮي ﻣﻌﺎدل آن ﺑﺮاﺑﺮ 0000000000110110اﺳﺖ.
ﻫﺮ ﻛﺪام از اﻳﻦ ﻛﺪﻫﺎ ﺑﺮاي ذﺧﻴﺮه ﺷﺪن ﺑﻪ دو ﺑﺎﻳﺖ ﻓﻀﺎ ﻧﻴﺎز دارﻧﺪ .ﭘﺲ ﺑﺮاي ذﺧﻴﺮه 5رﻗﻢ در ﻗﺎﻟﺐ رﺷﺘﻪ ﺑﻪ 80ﺑﻴﺖ ﻓﻀﺎ ﻧﻴـﺎز دارﻳـﻢ. ﺑﺮاي ذﺧﻴﺮه ﻋﺪد ﺑﺎﻻ ﺑﺎﻳﺪ ﻣﺘﻐﻴﻴﺮ را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ: ;int intNumber = 65536 ﻣﻘﺪار اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﺻﻮرت ﻳﻚ ﻋﺪد در ﻗﺎﻟﺐ ﺑﺎﻳﻨﺮي در ﺣﺎﻓﻈﻪ ذﺧﻴﺮه ﻣﻴﺸﻮد و از آﻧﺠﺎ ﻛﻪ ﻫﺮ ﻋﺪد ﺻﺤﻴﺢ 32ﺑﻴﺖ ﻓﻀﺎ را اﺷﻐﺎل ﻣـﻲ ﻛﻨﺪ ،اﻳﻦ ﻋﺪد ﻫﻢ 32ﺑﻴﺖ ﻓﻀﺎ در ﺣﺎﻓﻈﻪ اﺷﻐﺎل ﻣﻴﻜﻨﺪ ﻛﻪ ﺑﺴﻴﺎر ﻛﻤﺘﺮ از 80ﺑﻴﺖ اﺷﻐﺎل ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ رﺷﺘﻪ اﺳﺖ.
ﻣﺘﺪﻫﺎ: ﻳﻚ ﻣﺘﺪ ،ﻳﻚ ﺗﻜﻪ ﻛﺪ اﺳﺖ ﻛﻪ وﻇﻴﻔﻪ ﺧﺎﺻﻲ را اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﻣﺘﺪﻫﺎ ﻛﻪ ﭘﺮوﺳﻴﺠﺮ ﻫﻢ ﻧﺎﻣﻴﺪه ﻣﻴـﺸﻮﻧﺪ ﺑـﻪ دو دﻟﻴـﻞ اﻫﻤﻴـﺖ زﻳـﺎدي دارﻧﺪ .دﻟﻴﻞ اول اﻳﻦ اﺳﺖ ﻛﻪ آﻧﻬﺎ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﻗﺴﻤﺘﻬﺎي ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻣﻲ ﻛﻨﻨﺪ و ﻣﻮﺟﺐ ﻣﻴﺸﻮﻧﺪ ﻛـﻪ ﺑﺮﻧﺎﻣـﻪ ﺑﻬﺘـﺮ درك ﺷـﻮد .دوم اﻳﻨﻜﻪ آﻧﻬﺎ ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده ﻣﺠﺪد از ﻛﺪﻫﺎ را اﻓﺰاﻳﺶ ﻣﻲ دﻫﻨﺪ .اﺳﺘﻔﺎده ﻣﺠﺪد از ﻛﺪﻫﺎ ﺑﻪ اﻧﺪازه اي ﻣﻬﻢ اﺳﺖ ﻛﻪ ﺗﺎ آﺧﺮ اﻳﻦ ﻛﺘﺎب ﺑﻴﺸﺘﺮ وﻗﺖ ﺧﻮد را ﺻﺮف آن ﻣﻲ ﻛﻨﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﺮوع ﺑﻪ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﻨﻴﺪ ،اﺑﺘﺪا ﺑﺎﻳﺪ اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ آن را ﺗﻬﻴﻪ ﻛـﺮده و ﺳـﭙﺲ ﺟﺰﺋﻴـﺎت ﻫـﺮ ﻗﺴﻤﺖ از اﻟﮕﻮرﻳﺘﻢ را ﺑﻪ ﻛﺪ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ ﺗﺎ ﻛﻞ ﺑﺨﺸﻬﺎي اﻟﮕﻮرﻳﺘﻢ را ﺑﻪ ﺻﻮرت ﻛﺪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﺳﭙﺲ ﺑﺎ ﻛﻨﺎر ﻫﻢ ﻗﺮار دادن اﻳﻦ ﻛـﺪﻫﺎ ﺑﻪ اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ ﻣﻴﺮﺳﻴﺪ .ﻳﻚ ﻣﺘﺪ ،ﻳﻜﻲ از ﺧﻄﻬﺎي اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻛﻠﻲ را اﺟﺮا ﻣﻲ ﻛﻨﺪ ،ﺑﺮاي ﻣﺜﺎل "ﻳﻚ ﻓﺎﻳﻞ را ﺑﺎز ﻛﻦ"" ،ﻳﻚ ﻣـﺘﻦ را روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﺑﺪه"" ،ﻳﻚ ﺻﻔﺤﻪ را ﭼﺎپ ﻛﻦ" و ﻳﺎ ﻣﻮاردي از اﻳﻦ ﻗﺒﻴﻞ. داﻧﺴﺘﻦ اﻳﻦ ﻛﻪ ﭼﮕﻮﻧﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ ﻣﻮردي اﺳﺖ ﻛﻪ ﺑﻪ ﺗﺠﺮﺑﻪ ﺑﺴﺘﮕﻲ دارد .اﻫﻤﻴﺖ ﺗﻘﺴﻴﻢ ﻛﺮدن ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ ﻛﻮﭼﻚ و ﺗﺎﺛﻴﺮ آن در ﺳﺎدﮔﻲ ﺑﺮﻧﺎﻣﻪ را زﻣﺎﻧﻲ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺑﺴﻴﺎر ﭘﻴﭽﻴﺪه ﺗﺮي ﻧﺴﺒﺖ Unicode
1
٩٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻪ آﻧﻬﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﻧﻮﺷﺘﻪ اﻳﺪ ،ﺑﻨﻮﻳﺴﻴﺪ .در اداﻣﻪ ي اﻳﻦ ﺑﺨﺶ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﺑﻪ ﺷﻤﺎ ﺑﮕﻮﻳﻴﻢ ﭼﺮا و ﭼﮕﻮﻧـﻪ ﺑﺎﻳـﺪ از ﻣﺘـﺪﻫﺎ اﺳـﺘﻔﺎده ﻛﻨﻴﻢ.
ﭼﺮا از ﻣﺘﺪﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ؟ در اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎ ،ﺷﻤﺎ ﺑﺎﻳﺪ اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﺑﺮاي اﺟﺮا ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز دارد را ﻓﺮاﻫﻢ ﻛﻨﻴﺪ ﺗﺎ ﻧﺘﻴﺠﻪ ي ﻣﻄﻠﻮﺑﻲ درﻳﺎﻓﺖ ﻛﻨﻴـﺪ .اﻳـﻦ اﻃﻼﻋﺎت ﻣﻤﻜﻦ اﺳﺖ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ،ﻳﻚ رﺷﺘﻪ ﻣﺘﻨﻲ و ﻳﺎ ﺗﺮﻛﻴﺒﻲ از ﻫﺮ دو ﺑﺎﺷﺪ .اﻳﻦ اﻃﻼﻋﺎت ﺑﻪ ﻋﻨﻮان ﻣﻘﺎدﻳﺮ ورودي ﺷـﻨﺎﺧﺘﻪ ﻣﻴﺸﻮﻧﺪ .اﻟﺒﺘﻪ ﺑﻌﻀﻲ از ﻣﺘﺪﻫﺎ ورودي درﻳﺎﻓﺖ ﻧﻤﻲ ﻛﻨﻨﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ داﺷﺘﻦ ﻣﻘﺪار ورودي ﺑﺮاي ﻳﻚ ﻣﺘﺪ ﻻزم ﻧﻴﺴﺖ .ﻳﻚ ﻣﺘﺪ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ اﻃﻼﻋﺎت ورودي و ﻧﻴﺰ ﻳﻚ ﺳﺮي اﻃﻼﻋﺎت دروﻧﻲ )ﺑﺮاي ﻣﺜﺎل داﻧﺴﺘﻦ اﻃﻼﻋﺎﺗﻲ در راﺑﻄﻪ ﺑﺎ وﺿﻌﻴﺖ ﻛﻨﻮﻧﻲ ﺑﺮﻧﺎﻣﻪ( ﺳﻌﻲ ﻣﻴﻜﻨﺪ ﺗﺎ وﻇﻴﻔﻪ ﺧﻮد را اﻧﺠﺎم دﻫﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻳﻦ اﻃﻼﻋﺎت را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﻓﺮﺳﺘﻴﺪ ،در اﺻﻄﻼح داده ﺑﻪ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎده اﻳﺪ .ﺑﻪ اﻳﻦ داده ﻫﺎ ﭘﺎراﻣﺘﺮ ﻫﻢ ﮔﻔﺘﻪ ﻣﻴـﺸﻮد .در ﻧﻬﺎﻳﺖ ﺑﺮاي اﺳﺘﻔﺎده از ﻳﻚ ﺗﺎﺑﻊ ﺷﻤﺎ ﺑﺎﻳﺪ آن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ .ﺧﻼﺻﻪ ،ﺷﻤﺎ ﻳﻚ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻴﻜﻨﻴﺪ و داده ﻫﺎي ﻣـﻮرد ﻧﻴـﺎز آن را ﺑﻪ وﺳﻴﻠﻪ ﭘﺎراﻣﺘﺮ ﻫﺎ ﺑﻪ آن ﻣﻴﻔﺮﺳﺘﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺒﻞ ﻫﻢ ذﻛﺮ ﺷﺪ ،دﻟﻴﻞ اﺳﺘﻔﺎده از ﻳﻚ ﺗﺎﺑﻊ اﻳﻦ اﺳﺖ ﻛﻪ از ﻳﻚ ﻗﻄﻌﻪ ﻛﺪ ﭼﻨﺪﻳﻦ ﺑﺎر اﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر اﺑﺘـﺪا ﺑﺎﻳﺪ ﺑﺘﻮاﻧﻴﻢ اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ را در ﺣﺎﻟﺖ ﻛﻠﻲ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ و ﺳﭙﺲ ﻗﺴﻤﺘﻬﺎﻳﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﭼﻨﺪ ﺑﺎر ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز ﭘﻴﺪا ﻛﻨﻴﻢ را ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺑﻌﺪ از ﻣﺸﺨﺺ ﻛﺮدن اﻳﻦ ﻗﺴﻤﺘﻬﺎ ،ﻣﻴﺘﻮاﻧﻴﻢ آﻧﻬﺎ را ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎ ﺑﻨﻮﻳﺴﻴﻢ و ﺳﭙﺲ ﻣﺘﺪﻫﺎ را ﭼﻨﺪﻳﻦ ﺑـﺎر در ﺑﺮﻧﺎﻣـﻪ اﺳـﺘﻔﺎده ﻛﻨﻴﻢ. ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ از اﻟﮕﻮرﻳﺘﻢ ﻫﺎي زﻳﺎدي ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .ﺑﻌﻀﻲ از اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﺑﺮاي ﻣﺤﺎﺳـﺒﺎت ﺧـﻮد ﻧﻴـﺎز دارﻧﺪ ﻛﻪ ﺑﺘﻮاﻧﻨﺪ ﻣﺤﻴﻂ داﻳﺮه را ﻣﺤﺎﺳﺒﻪ ﻛﻨﻨﺪ .ﭼﻮن ﺑﻌﻀﻲ از ﻗﺴﻤﺘﻬﺎي اﻟﮕﻮرﻳﺘﻢ ﻣﺎ ﻧﻴﺎز دارﻧﺪ ﻛﻪ ﻧﺤﻮه ﻣﺤﺎﺳﺒﻪ ﻣﺤﻴﻂ داﻳـﺮه را ﺑﺪاﻧﻨـﺪ، اﺳﺘﻔﺎده از ﻳﻚ ﻣﺘﺪ در اﻳﻦ ﻣﻮرد ﻣﻴﺘﻮاﻧﺪ ﻣﻨﺎﺳﺐ ﺑﺎﺷﺪ .ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﻣﺘﺪي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﺘﻮاﻧﺪ ﻣﺤﻴﻂ ﻳﻚ داﻳﺮه را ﺑـﺎ داﻧـﺴﺘﻦ ﺷـﻌﺎع آن ﻣﺤﺎﺳﺒﻪ ﻛﻨﺪ ،ﺳﭙﺲ در ﻫﺮ ﻗﺴﻤﺖ از اﻟﮕﻮرﻳﺘﻢ ﻛﻪ ﺑﻪ ﻣﺤﺎﺳﺒﻪ ﻣﺤﻴﻂ ﻧﻴﺎز ﺑﻮد ﻣﻴﺘﻮاﻧﻴﺪ اﻳﻦ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ .ﺑﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ﻧﻴـﺎزي ﻧﻴﺴﺖ ﻛﺪي ﻛﻪ ﻳﻚ ﻛﺎر ﻣﺸﺨﺺ را اﻧﺠﺎم ﻣﻴﺪﻫﺪ ﭼﻨﺪ ﺑﺎر ﻧﻮﺷﺘﻪ ﺷﻮد .ﺷﻤﺎ ﻓﻘﻂ ﻳﻚ ﺑﺎر ﻛﺪ را ﻣﻲ ﻧﻮﻳـﺴﻴﺪ و ﭼﻨـﺪ ﺑـﺎر از آن اﺳـﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ. ﻫﻤﭽﻨﻴﻦ ﻣﻤﻜﻦ اﺳﺖ ﻳﻚ ﻗﺴﻤﺖ از اﻟﮕﻮرﻳﺘﻢ ﺑﺨﻮاﻫﺪ ﻣﺤﻴﻂ ﻳﻚ داﻳﺮه ﺑﻪ ﺷﻌﺎع 100را ﺑﺪاﻧﺪ و ﻗﺴﻤﺘﻲ دﻳﮕﺮ ﻣﺤـﻴﻂ ﻳـﻚ داﻳـﺮه ﺑـﻪ ﺷﻌﺎع .200ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺘﺪ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﺪ ﺷﻌﺎع داﻳﺮه را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ از ورودي ﺑﮕﻴﺮد و ﺳﭙﺲ ﻣﺤﻴﻂ را ﻣﺤﺎﺳﺒﻪ ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﻳﻦ ﻣﺘﺪ در ﻫﺮ ﺷﺮاﻳﻄﻲ ﻣﻴﺘﻮاﻧﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد. ﻧﻜﺘﻪ :در وﻳﮋوال 2005 C#ﻳﻚ ﻣﺘﺪ ﻳﺎ ﻣﻴﺘﻮاﻧﺪ ﻣﻘﺪاري را ﺑﺮﮔﺮداﻧﺪ و ﻳـﺎ ﻫـﻴﭻ ﻣﻘـﺪاري را ﺑﺮﻧﮕﺮداﻧـﺪ .ﺑـﻪ ﻣﺘـﺪﻫﺎﻳﻲ ﻛـﻪ ﻣﻘـﺪاري را ﺑﺮﻣﻴﮕﺮداﻧﻨﺪ ﻳﻚ ﺗﺎﺑﻊ 1و ﺑﻪ ﻣﺘﺪﻫﺎﻳﻲ ﻛﻪ ﻫﻴﭻ ﻣﻘﺪاري را ﺑﺮﻧﻤﻴﮕﺮداﻧﻨﺪ ﻳﻚ زﻳﺮﺑﺮﻧﺎﻣﻪ 2ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد.
ﻣﺘﺪﻫﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن دﻳﺪه اﻳﺪ:
Function Subroutine
1 2
٩٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻬﺘﺮ اﺳﺖ ﺑﺪاﻧﻴﺪ ﻛﻪ ﺗﺎﻛﻨﻮن در ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻧﻮﺷﺘﻪ اﻳﻢ ،از ﻣﺘﺪﻫﺎي زﻳﺎدي اﺳﺘﻔﺎده ﻛﺮده اﻳﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜـﺎل ﻛـﺪ زﻳﺮ را ﻛﻪ در اﺑﺘﺪاي ﻓﺼﻞ ﻧﻮﺷﺘﻴﺪ ﻣﻼﺣﻈﻪ ﻛﻨﻴﺪ: )private void btnAdd_Click(object sender, EventArgs e { // Define a variable for intNumber ;int intNumber // Set the initial value ;intNumber = 27 // Add 1 to the value of intNumber ;intNumber = intNumber + 1 // Display the new value of intNumber MessageBox.Show("The value of intNumber + 1 = " + ;)"intNumber, "Variables } اﻳﻦ ﻛﺪ ﻳﻚ ﻣﺘﺪ اﺳﺖ زﻳﺮا ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺗﻌﺮﻳﻒ ﻣﺘﺪ ﮔﻔﺘﻴﻢ ،ﻗﻄﻌﻪ ﻛﺪي ﻣﺠﺰا اﺳﺖ ﻛﻪ ﻛﺎر ﺧﺎﺻﻲ را اﻧﺠﺎم ﻣﻲ دﻫـﺪ .در اﻳﻨﺠـﺎ اﻳـﻦ ﻗﻄﻌﻪ ﻛﺪ ﻋﺪد ﻳﻚ را ﺑﻪ ﻣﺘﻐﻴﻴﺮ intNumberاﺿﺎﻓﻪ ﻣﻴﻜﻨﺪ و ﻧﺘﻴﺠﻪ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ. اﻳﻦ ﻣﺘﺪ ﻫﻴﭻ ﻣﻘﺪاري را ﺑﺮ ﻧﻤﻲ ﮔﺮداﻧﺪ ﺑﻨﺎﺑﺮاﻳﻦ ﻧﻮع ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ voidﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ .ﻛﻠﻤﻪ voidﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣـﻲ ﮔﻮﻳـﺪ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻫﻴﭻ ﻣﻘﺪاري را ﺑﺮ ﻧﻤﻲ ﮔﺮداﻧﺪ .اﮔﺮ ﻣﺘﺪي ﻣﻘﺪاري را ﺑﺮﮔﺮداﻧﺪ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از voidﺑﺎﻳﺪ ﻧﻮع ﻣﻘـﺪاري ﻛـﻪ ﺑﺮﮔـﺸﺖ داده ﻣﻲ ﺷﻮد را ﺑﻨﻮﻳﺴﻴﺪ )ﺑﺮاي ﻣﺜﺎل intﻳﺎ doubleﻳﺎ .(...ﻫﺮ دﺳﺘﻮري ﻛﻪ ﺑﻴﻦ دو ﻋﻼﻣﺖ آﻛﻮﻻد ﻧﻮﺷﺘﻪ ﺷﻮد ﺟﺰﺋـﻲ از ﺑﺪﻧـﻪ ي ﻣﺘﺪ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد .ﻳﻚ ﻣﺘﺪ ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد )اﻟﺒﺘﻪ اﻳﻦ ﻣﺘﺪ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ وﻳﮋوال 2005 C#اﻳﺠﺎد ﺷﺪه اﺳﺖ(: )private void btnAdd_Click(object sender, EventArgs e (1
(2 (3 (4
ﻗﺒﻞ از ﻫﺮ ﭼﻴﺰ ،ﻛﻠﻤﻪ privateرا در ﺗﻌﺮﻳﻒ ﺗﺎﺑﻊ ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ .درﺑﺎره اﻳﻦ ﻛﻠﻤـﻪ در ﻓـﺼﻠﻬﺎي ﺑﻌـﺪي ﺑـﻪ ﺗﻔـﺼﻴﻞ ﺑﺤﺚ ﺷﺪه اﺳﺖ .ﻓﻌﻼ ،ﻓﻘﻂ ﺑﺪاﻧﻴﺪ ﻛﻪ اﻳﻦ ﻛﻠﻤﻪ ﻣﻮﺟﺐ ﻣﻴﺸﻮد اﻳﻦ ﻣﺘﺪ ﻓﻘﻂ ﺗﻮﺳﻂ ﺗﻮاﺑﻊ و ﻳﺎ ﻣﺘﺪﻫﺎي دﻳﮕـﺮ داﺧـﻞ ﻫﻤـﺎن ﺑﺨﺶ اﺳﺘﻔﺎده ﺷﻮد. ﻛﻠﻤﻪ ﺑﻌﺪي ،ﻛﻠﻤﻪ voidاﺳﺖ ﻛﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻴﻢ ﺑﻪ وﻳﮋوال C#ﻣﻲ ﮔﻮﻳﺪ اﻳﻦ ﻣﺘﺪ ﻫﻴﭻ ﻣﻘﺪاري را ﺑﺮﻧﻤﻲ ﮔﺮداﻧﺪ. ﺑﻌﺪ از voidﺑﺎ ﻛﻠﻤﻪ btnAdd_Clickروﺑﺮو ﻣﻴﺸﻮﻳﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺣﺪس زده ﺑﺎﺷﻴﺪ ،اﻳﻦ ﻛﻠﻤﻪ ﻧﺎم ﻣﺘﺪي اﺳﺖ ﻛﻪ ﺗﻌﺮﻳﻒ ﻛﺮده اﻳﻢ. ﭼﻬﺎرﻣﻴﻦ ﻣﻮرد در ﺗﻌﺮﻳﻒ اﻳﻦ ﺗﺎﺑﻊ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺑﻪ آن ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ اﻳـﻦ ﺗـﺎﺑﻊ دو ﭘﺎراﻣﺘﺮ را درﻳﺎﻓﺖ ﻣﻴﻜﻨﺪ .ﭘﺎراﻣﺘﺮ اول sender ،از ﻧﻮع objectاﺳﺖ و ﭘﺎراﻣﺘﺮ دوم eاز ﻧـﻮع EventArgs اﺳﺖ .در ﻣﻮرد اﻳﻦ ﭘﺎراﻣﺘﺮ ﻫﺎ در ﺑﺨﺸﻬﺎي ﺑﻌﺪي ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد.
در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﻳﻚ ﻣﺘﺪ اﻳﺠﺎد ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻳﻚ ﻋﺒﺎرت را ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎدر ﭘﻴﻐﺎم در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ و ﺳﭙﺲ اﻳﻦ ﻣﺘﺪ را ﺑﻪ وﺳﻴﻠﻪ ﺳﻪ دﻛﻤﻪ ﻓﺮﻣﺎن ﻣﺘﻔﺎوت ﻓﺮاﺧﻮاﻧﻲ ﺧﻮاﻫﻴﺪ ﻛﺮد.
٩٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎ (1ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺑﺎ وﻳﮋوال 2005 C#اﻳﺠﺎد ﻛﻨﻴﺪ و ﻧﺎم آن را ﺑﺮاﺑﺮ Three Buttonsﻗﺮار دﻫﻴﺪ. (2ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﺳﻪ دﻛﻤﻪ ﻓﺮﻣﺎن ﺑﺮ روي ﻓﺮم ﺧﻮد ﻗﺮار دﻫﻴﺪ. (3روي دﻛﻤﻪ ﻓﺮﻣﺎن اول دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void button1_Click(object sender, EventArgs e { // Call your method ;)(SayHello } )(private void SayHello { // Display a message box ;)"MessageBox.Show("Hello, World!", "Three Buttons } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻓﺮﻣﻲ را ﺑﺎ ﺳﻪ دﻛﻤﻪ ﻓﺮﻣﺎن ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .ﺑﺮ روي ﺑـﺎﻻﺗﺮﻳﻦ دﻛﻤـﻪ ﻓﺮﻣـﺎن ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻛـﺎدر ﭘﻴﻐﺎﻣﻲ ﺑﺎ ﻋﺒﺎرت ! Hello, Worldرا ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﻣﺤﻴﻂ ﻃﺮاﺣﻲ ﺑﺮ روي ﻳﻚ دﻛﻤﻪ ﻓﺮﻣﺎن دو ﺑﺎر ﻛﻠﻴﻚ ﻣﻲ ﻛﻨﻴﺪ ،وﻳﮋوال 2005 C#ﺗﺎﺑﻌﻲ ﻣﺎﻧﻨﺪ زﻳﺮ را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ: )private void button1_Click(object sender, EventArgs e { } ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ روي اﻳﻦ دﻛﻤﻪ در ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﻨﺪ ،اﺻﻄﻼﺣﺎ ﻳﻚ روﻳﺪاد 1در ﺑﺮﻧﺎﻣﻪ رخ داده اﺳـﺖ .وﻳـﮋوال 2005 C#ﻫﻨﮕـﺎم ﻛﺎﻣﭙﺎﻳﻞ اﻳﻦ ﻣﺘﺪ ،ﻛﺪي را ﺑﻪ آن اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ ﺗﺎ اﻳﻦ ﻣﺘﺪ ﻫﻨﮕﺎم رخ دادن روﻳﺪاد ﻛﻠﻴﻚ اﻳﻦ دﻛﻤﻪ اﺟﺮا ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕـﺮ وﻳـﮋوال C#زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮ روي اﻳﻦ دﻛﻤﻪ ﻓﺮﻣﺎن در ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﺮد ،اﻳﻦ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﺘﺪ دو ﭘﺎراﻣﺘﺮ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ،ﻛﻪ ﻓﻌﻼ در ﻣﻮرد آﻧﻬﺎ ﺻﺤﺒﺘﻲ ﻧﻤﻲ ﻛﻨﻴﻢ .در ﻓﺼﻠﻬﺎي ﺑﻌﺪ ﺑﻴﺸﺘﺮ ﺑﺎ روﻳﺪادﻫﺎ و ﻧﺤﻮه اﺳـﺘﻔﺎده از آﻧﻬـﺎ در ﺑﺮﻧﺎﻣـﻪ آﺷـﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
Event
1
٩٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﺑﻴﺮون از اﻳﻦ ﻣﺘﺪ ،ﻣﺘﺪ دﻳﮕﺮي را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ: )(private void SayHello { // Display a message box ;)"MessageBox.Show("Hello, World!", "Three Buttons } اﻳﻦ ﻣﺘﺪ ﺟﺪﻳﺪ SayHello ،ﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد .ﻫﺮ ﭼﻴﺰي ﻛﻪ در ﺑﻴﻦ دو آﻛﻮﻻد ﻣﺘﺪ ﻗﺮار ﺑﮕﻴﺮد ،ﺟﺰﺋﻲ از ﻛﺪ اﻳﻦ ﻣﺘﺪ ﻣﺤﺴﻮب ﻣﻴـﺸﻮد و ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد ،اﺟﺮا ﺧﻮاﻫﺪ ﺷﺪ .در اﻳﻦ ﺣﺎﻟﺖ ،ﻛﺪ ﻧﻮﺷﺘﻪ ﺷﺪه در اﻳﻦ ﻣﺘﺪ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ،وﻳﮋوال 2005 C#ﻣﺘﺪ button1_Clickرا اﺟﺮا ﻣﻴﻜﻨـﺪ و اﻳـﻦ ﻣﺘﺪ ﻧﻴﺰ SayHelloرا اﺣﻀﺎر ﻣﻴﻜﻨﺪ .ﻧﺘﻴﺠﻪ اﻳﻦ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ،ﻛﺪ داﺧﻞ ﻣﺘﺪ SayHelloاﺟﺮا ﻣﻴـﺸﻮد و ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻧﻤﺎﻳﺶ داده ﻣﻴﺸﻮد. )private void button1_Click(object sender, EventArgs e { // Call your method ;)(SayHello } ﺗﺎ اﻳﻨﺠﺎ ﻣﻘﺪاري ﺑﺎ ﺗﻌﺮﻳﻒ ﺗﺎﺑﻊ و ﻧﻴﺰ اﺳﺘﻔﺎده از آن آﺷﻨﺎ ﺷﺪﻳﺪ ،اﻣﺎ ﺳﻮاﻟﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻪ وﺟﻮد آﻳﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﭼﺮا ﻧﻴﺎز دارﻳﺪ ﻣﺘﺪي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻧﻤﺎﻳﺶ دﻫﺪ؟ در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ دﻟﻴﻞ اﻳﻦ ﻛﺎر را ﺑﻴﺸﺘﺮ ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده ﻣﺠﺪد از ﻣﺘﺪﻫﺎ (1اﮔﺮ ﭘﺮوژه ﻗﺒﻠﻲ در ﺣﺎل اﺟﺮا اﺳﺖ ،آن را ﺑﺒﻨﺪﻳﺪ. (2روي دﻛﻤﻪ ﻓﺮﻣﺎن دوم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه وارد ﻛﻨﻴﺪ: )private void button2_Click(object sender, EventArgs e { // Call your method ;)(SayHello } (3ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﺑﺮﮔﺮدﻳﺪ و روي دﻛﻤﻪ ﻓﺮﻣﺎن ﺳﻮم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪ: )private void button3_Click(object sender, EventArgs e { // Call your method ;)(SayHello }
٩٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(4ﺣﺎﻻ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻫﻤﻪ دﻛﻤﻪ ﻫﺎ ﻛﺎدر ﭘﻴﻐـﺎم ﻳﻜـﺴﺎﻧﻲ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ. (5اﺟﺮاي ﺑﺮﻧﺎﻣﻪ را ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ و ﻣﺘﺪ SayHelloرا در ﺑﺨﺶ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﭘﻴﺪا ﻛﻨﻴﺪ .ﻣﺘﻨﻲ ﻛﻪ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤـﺎﻳﺶ داده ﻣﻴﺸﻮد را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: )(private void SayHello { // Display a message box ;)"MessageBox.Show("I have changed!", "Three Buttons } (6ﺑﺮﻧﺎﻣﻪ را ﻣﺠﺪدا اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﻦ ﻣﻮرد ﻧﻤﺎﻳﺶ در ﻛﺎدر ﭘﻴﻐﺎم ﺗﻐﻴﻴﺮ ﻛـﺮده اﺳﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﺮ ﻛﺪام از ﻣﺘﺪﻫﺎي ﻣﺨﺼﻮص ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ،1ﻣﺘﺪ SayHelloرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻨﺪ: )private void button1_Click(object sender, EventArgs e { // Call your method ;)(SayHello } )private void button2_Click(object sender, EventArgs e { // Call your method ;)(SayHello }
)private void button3_Click(object sender, EventArgs e { // Call your method ;)(SayHello } ﻫﻤﺎﻧﻄﻮر ﻛﻪ از اﺳﻢ اﻳﻦ ﻣﺘﺪﻫﺎ ﻧﻴﺰ ﻣﺸﺨﺺ اﺳﺖ ،ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﺑﺮاي ﻛﻨﺘﺮل روﻳﺪاد ﻳﻜﻲ از دﻛﻤﻪ ﻓﺮﻣﺎﻧﻬﺎي روي ﻓﺮم ﻫﺴﺘﻨﺪ.
1ﺑﻪ اﻳﻦ ﻣﺘﺪﻫﺎ ﻛﻪ ﺑﺮاي ﻛﻨﺘﺮل ﻳﻚ روﻳﺪاد ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ Event Handler ،ﻧﻴﺰ ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد.
٩٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻤﺎ ﻧﺤﻮه ﻛﺎرﻛﺮد ﻣﺘﺪ SayHelloرا ﻛﻪ ﻫﺮ ﺳﻪ ﻣﺘﺪ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﺗﻐﻴﻴﺮات ﺑـﻪ ﻫـﺮ ﺳﻪ دﻛﻤﻪ ﻓﺮﻣﺎن اﻋﻤﺎل ﻣﻴﺸﻮد .اﻳﻦ ﻣﻮرد در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻮﺿﻮع ﺑﺴﻴﺎر ﻣﻬﻤﻲ اﺳﺖ .اﮔﺮ ﺷﻤﺎ ﻣﺘﺪﻫﺎي ﻛﺪ ﺧﻮد را ﺑﻪ ﻧﺤـﻮي ﻣﻨﻄﻘـﻲ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ ﺑﺎ ﺗﻐﻴﻴﺮ ﻳﻚ ﻣﺘﺪ در ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ،ﺑﺮ روي ﺗﻤﺎم ﻗﺴﻤﺘﻬﺎي ﺑﺮﻧﺎﻣﻪ ﺗﺎﺛﻴﺮ ﺑﮕﺬارﻳﺪ .ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﻣـﻮرد ﺷـﻤﺎ را از وارد ﻛﺮدن ﻛﺪﻫﺎي ﻳﻜﺴﺎن و ﻣﺸﺎﺑﻪ ﺑﻪ ﺻﻮرت ﺗﻜﺮاري ﻧﻴﺰ ﻧﺠﺎت ﻣﻴﺪﻫﺪ.
اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ: در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺘﺪي ﺧﻮاﻫﻴﺪ ﺳﺎﺧﺖ ﻛﻪ ﻳﻚ ﻣﻘﺪار را ﺑﺮﮔﺮداﻧﺪ .ﺗﺎﺑﻌﻲ ﻛﻪ در اﻳﻦ ﺑﺨﺶ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ﻣﻴﺘﻮاﻧﺪ ﻣﺴﺎﺣﺖ ﻳﻚ داﻳﺮه را ﺑﺮ اﺳﺎس ﺷﻌﺎع آن ﻣﺤﺎﺳﺒﻪ ﻛﻨﺪ .اﻟﮕﻮرﻳﺘﻤﻲ ﻛﻪ ﺑﺮاي اﻳﻦ ﻛﺎر اﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ: (1ﺷﻌﺎع را ﺑﻪ ﺗﻮان دو ﺑﺮﺳﺎن. (2ﻧﺘﻴﺠﻪ را در ﻋﺪد ﭘﻲ ﺿﺮب ﻛﻦ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ (1ﺑﺮاي ﻧﻮﺷﺘﻦ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﻴﺘﻮاﻧﻴﺪ از ﺑﺮﻧﺎﻣﻪ Three Buttonsﻛﻪ در ﻣﺮﺣﻠﻪ ﻗﺒﻞ ﺳﺎﺧﺘﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. (2ﻛﺪ زﻳﺮ را ﺑﺮاي ﺗﻌﺮﻳﻒ ﻳﻚ ﺗﺎﺑﻊ ﺟﺪﻳﺪ در ﻗﺴﻤﺖ ﻛـﺪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ )اﻳـﻦ ﻣﺘـﺪ ﻣﻘـﺪاري را ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ ي ﻓﺮاﺧـﻮان ﺑﺮﻣﻴﮕﺮداﻧﺪ ،ﭘﺲ ﻳﻚ ﺗﺎﺑﻊ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود(. // CalculateAreaFromRadius - find the area of a circle )private double CalculateAreaFromRadius(double radius { // Declare variables ;double dblRadiusSquared ;double dblResult // Square the radius ;dblRadiusSquared = radius * radius // Multiply it by pi ;dblResult = dblRadiusSquared * Math.PI // Return the result ;return dblResult } (3ﺳﭙﺲ ﻛﺪ ﻧﻮﺷﺘﻪ ﺷﺪ در ﻣﺘﺪ button1_Clickرا ﺣﺬف ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را ﺑﻪ ﺟﺎي آن وارد ﻛﻨﻴﺪ: )private void button1_Click(object sender, EventArgs e
١٠٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ // Declare variable ;double dblArea // Calculate the area of a circle with radius 100 ;)dblArea = CalculateAreaFromRadius(100 // Print the results ;)"MessageBox.Show(dblArea, "Area } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻓﺮﻣﺎن Button1ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 13-3ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد:
ﺷﻜﻞ 13-3
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻗﺒﻞ از ﻫﺮ ﭼﻴﺰ ،ﻳﻚ ﻣﺘﺪ ﻣﺠﺰا ﺑﻪ ﻧﺎم CalculateAreaFromRadiusﻣﺎﻧﻨﺪ زﻳﺮ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ: )private double CalculateAreaFromRadius(double radius { } ﻫﺮ ﻛﺪي ﻛﻪ ﺑﻴﻦ دو آﻛﻮﻻد ﻗﺮار ﺑﮕﻴﺮد ﺑﻪ ﻋﻨﻮان ﺑﺪﻧﻪ ﺗﺎﺑﻊ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود و ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ اﺟﺮا ﻣﻴﺸﻮد. ﻗﺴﻤﺖ double radiusﻳﻚ ﭘﺎراﻣﺘﺮ از ﻧﻮع doubleرا ﺑﺮاي اﻳﻦ ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .NET ،ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ را در اﺧﺘﻴﺎر آن ﻗﺮار ﻣﻲ دﻫﺪ ﺗﺎ ﻣﺘﺪ ﺑﺘﻮاﻧﺪ از آن در اﻧﺠﺎم دﺳﺘﻮرات ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﺪ .ﭘﺎراﻣﺘﺮﻫـﺎﻳﻲ ﻛﻪ ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ در ﺑﺪﻧﻪ ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﺷﻮد ،ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ در اﻳﻦ ﻓﻀﺎ ﻛﭙﻲ ﻣﻲ ﺷﻮﻧﺪ ﺗﺎ ﻣﺘﺪ ﺑﺘﻮاﻧﺪ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﺪ .اﻳﻦ ﻋﻤـﻞ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﻫﺮ ﺗﻐﻴﺮي ﻛﻪ ﻣﺘﺪ در ﻣﻘﺪار ﭘﺎراﻣﺘﺮ اﻳﺠﺎد ﻛﻨﺪ ،در ﻣﺘﻐﻴﻴﺮ اﺻﻠﻲ ﺗﺎﺛﻴﺮي ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ. ﻣﺜﻼ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻫﻨﮕﺎم اﺣﻀﺎر ﻣﺘﺪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم radiusدر ﺣﺎﻓﻈﻪ ي ﻣﺨﺼﻮص ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد و ﻣﻘﺪار ارﺳﺎﻟﻲ ﺑـﻪ ﻣﺘﺪ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ در آن ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﻣﻘﺪار 200ﺑﻪ ﻣﺘﺪ ارﺳﺎل ﺷﻮد ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ ﺗﻌﺮﻳﻒ ﺷـﺪه ﺑﺮاﺑـﺮ 200ﺧﻮاﻫـﺪ ﺑﻮد .اﻳﻦ ﻣﻮرد ﻫﻤﺎﻧﻨﺪ اﻳﻦ اﺳﺖ ﻛﻪ در اﺑﺘﺪاي ﻣﺘﺪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم radiusﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﻣﻘﺪار آن را ﺑﺮاﺑﺮ 200ﻗﺮار دﻫﻴﺪ: ;double radius = 200 ﻧﻜﺘﻪ :ﻳﻜﻲ از ﻣﺸﻜﻼت اﻳﻦ روش اﻳﻦ اﺳﺖ ﻛﻪ اﮔﺮ اﻧﺪازه ﻣﺘﻐﻴﻴـﺮ ﺑـﺰرگ ﺑﺎﺷـﺪ ،ﻛﭙـﻲ ﻛـﺮدن آن در از ﺑﺮﻧﺎﻣـﻪ اﺻـﻠﻲ در ﺣﺎﻓﻈـﻪ ي ﻣﺨﺼﻮص ﺑﻪ ﻣﺘﺪ زﻣﺎن زﻳﺎدي را ﻣﻲ ﮔﻴﺮد و ﻫﻤﭽﻨﻴﻦ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﺣﺎﻓﻈﻪ ي زﻳﺎدي اﺷﻐﺎل ﺷﻮد .ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﺸﻜﻞ ﻣـﻲ ﺗـﻮان
١٠١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﺑﺰرگ را ﺑﻪ روش دﻳﮕﺮي ﺑﻪ ﻧﺎم ارﺟﺎع 1ﺑﻪ ﻣﺘﺪﻫﺎ ﻓﺮﺳﺘﺎد .ﺑﺮاي اﻳﻨﻜﻪ ﻳﻚ ﭘﺎراﻣﺘﺮ ﺑﺎ اﺳﺘﻔﺎده از ارﺟﺎع ﺑﻪ ﻣﺘﺪ ﻓﺮﺳﺘﺎده ﺷﻮد ﺑﺎﻳﺪ ﻗﺒﻞ از ﺗﻌﺮﻳﻒ ﭘﺎراﻣﺘﺮ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي refاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﭘﺎراﻣﺘﺮ ﺑﺎ اﺳﺘﻔﺎده از ارﺟﺎع ﺑﻪ ﻳـﻚ ﻣﺘـﺪ ارﺳـﺎل ﺷـﻮد، دﻳﮕﺮ ﻣﻘﺪار ﭘﺎراﻣﺘﺮ در ﺣﺎﻓﻈﻪ ي ﻣﺘﺪ ﻛﭙﻲ ﻧﻤﻲ ﺷﻮد ﺑﻠﻜﻪ آدرس ﻣﺘﻐﻴﻴﺮ اﺻﻠﻲ در ﺣﺎﻓﻈﻪ ،ﺑﻪ ﻣﺘـﺪ ﻓﺮﺳـﺘﺎده ﺧﻮاﻫـﺪ ﺷـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﻫـﺮ ﺗﻐﻴﻴﺮي ﻛﻪ ﻣﺘﺪ در ﻣﻘﺪار ﭘﺎراﻣﺘﺮ اﻳﺠﺎد ﻛﻨﺪ ،ﺑﻼﻓﺎﺻﻠﻪ در ﻣﺘﻐﻴﻴﺮ اﺻﻠﻲ ﻧﻴﺰ ﺗﺎﺛﻴﺮ ﺧﻮاﻫﺪ ﮔﺬاﺷﺖ و ﻣﻘﺪار آن ﻧﻴﺰ ﺗﻐﻴﻴﺮ ﺧﻮاﻫﺪ ﻛﺮد. ﻛﻠﻤﻪ doubleﻛﻪ ﻗﺒﻞ از ﻧﺎم ﻣﺘﺪ آﻣﺪه اﺳﺖ ،ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻣﻘﺪاري را از ﻧﻮع ﻋﺪد اﻋﺸﺎري ﺑﺎ دﻗـﺖ ﻣـﻀﺎﻋﻒ ﺑـﻪ ﺟﺎﻳﻲ ﻛﻪ آن اﺣﻀﺎر ﺷﺪه اﺳﺖ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ: )private double CalculateAreaFromRadius(double radius ﺣﺎﻻ ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﺑﺪﻧﻪ ﺧﻮد ﻣﺘﺪ ﻧﮕﺎه دﻗﻴﻘﺘﺮي ﺑﻲ اﻧﺪازﻳﺪ .ﻗﺒﻞ از ﻫﺮ ﭼﻴﺰ ،ﻣﻴﺪاﻧﻴﺪ ﻛﻪ ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﻣﺴﺎﺣﺖ ﻳﻚ داﻳﺮه ﺑﺎﻳﺪ از اﻟﮕﻮرﻳﺘﻢ زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: (1ﻋﺪدي ﻛﻪ ﺑﻴﺎﻧﮕﺮ ﺷﻌﺎع داﻳﺮه اﺳﺖ را درﻳﺎﻓﺖ ﻛﻨﻴﺪ. (2ﻋﺪد را ﺑﻪ ﺗﻮان دو ﺑﺮﺳﺎﻧﻴﺪ. (3ﺣﺎﺻﻞ را در ﻋﺪد ﭘﻲ ﺿﺮب ﻛﻨﻴﺪ. و ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ،اﻳﻦ ﻫﻤﺎن ﻛﺎري اﺳﺖ ﻛﻪ در ﺑﺪﻧﻪ ﻣﺘﺪ اﻧﺠﺎم داده اﻳﺪ: // Declare variables ;double dblRadiusSquared ;double dblResult // Square the radius ;dblRadiusSquared = radius * radius // Multiply it by pi ;dblResult = dblRadiusSquared * Math.PI ﻋﺒﺎرت Math.PIدر ﻛﺪ ﻗﺒﻠﻲ ﻣﻘﺪار ﺛﺎﺑﺘﻲ اﺳﺖ ﻛﻪ در وﻳﮋوال 2005 C#ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ و ﻣﻘﺪار ﻋﺪد ﭘﻲ را در ﺧﻮد ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ .در ﺧﻂ آﺧﺮ ﺑﺎﻳﺪ ﻧﺘﻴﺠﻪ ﻣﺤﺎﺳﺒﺎت را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮان ﺑﺎزﮔﺮداﻧﻴﺪ .اﻳﻦ ﻛﺎر ﺑﺎ ﻛﺪ زﻳﺮ اﻧﺠﺎم ﻣﻲ ﺷﻮد: // Return the result ;return dblResult ﻛﺪي ﻛﻪ در ﻣﺘﺪ button1_Clickاﺿﺎﻓﻪ ﻛﺮده اﻳﺪ ،ﺗﺎﺑﻊ ﻗﺒﻠﻲ را اﺣﻀﺎر ﻣﻲ ﻛﻨﺪ و ﻧﺘﻴﺠﻪ ﺑﺮﮔﺮداﻧﺪه ﺷﺪه ﺗﻮﺳـﻂ ﺗـﺎﺑﻊ را ﺑـﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ: // Declare variable Reference
1
١٠٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;double dblArea // Calculate the area of a circle with radius 100 ;)dblArea = CalculateAreaFromRadius(100 // Print the results ;)"MessageBox.Show(dblArea, "Area اوﻟﻴﻦ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم dblAreaﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﻛﻪ ﻣﺴﺎﺣﺖ داﻳﺮه را در ﺧﻮد ﻧﮕﻪ دارد .ﺑﻌﺪ از ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ،ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ از آن را ﻣﻲ ﺗﻮاﻧﻴﺪ در اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻧﮕﻬﺪاري ﻛﻨﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از ﭘﺮاﻧﺘﺰ ﻫﺎﻳﻲ ﻛﻪ در آﺧﺮ ﻧﺎم ﺗﺎﺑﻊ آﻣﺪه اﻧـﺪ، ﻣﻴﺘﻮاﻧﻴﺪ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺗﺎﺑﻊ را ﺑﻪ آن ارﺳﺎل ﻛﻨﻴﺪ .در اﻳﻦ ﺟﺎ ﻓﻘﻂ ﺑﺎﻳﺪ ﻳﻚ ﭘﺎراﻣﺘﺮ را ﺑﻪ ﺗﺎﺑﻊ ارﺳﺎل ﻛﻨﻴﺪ و آن ﻫـﻢ ﺷـﻌﺎع داﻳـﺮه ﺧﻮاﻫﺪ ﺑﻮد. ﺑﻌﺪ از اﻳﻨﻜﻪ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮدﻳﺪ ،ﺑﺎﻳﺪ ﺻﺒﺮ ﻛﻨﻴﺪ ﺗﺎ ﻣﺤﺎﺳﺒﺎت آن ﺗﻤﺎم ﺷﻮد .ﭘﺲ از اﺗﻤﺎم ﻣﺤﺎﺳﺒﺎت ﺗﺎﺑﻊ ،ﻧﺘﻴﺠﻪ ﻛـﻪ ﻣـﺴﺎﺣﺖ داﻳـﺮه اﺳﺖ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد و در ﻣﺘﻐﻴﻴﺮ dblAreaﻗﺮار ﻣﻴﮕﻴﺮد .اﻛﻨﻮن ﻣﻴﺘﻮاﻧﻴﺪ ﻧﺘﻴﺠﻪ را ﺑﻪ روش ﻫﻤﻴﺸﮕﻲ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ.
اﻧﺘﺨﺎب ﻧﺎم ﺑﺮاي ﻣﺘﺪ: در ﭼﺎرﭼﻮب .NETﻳﻚ ﺳﺮي اﺳﺘﺎﻧﺪارد ﺑﺮاي ﻧﺎﻣﮕﺬاري ﺗﻮاﺑﻊ و ﻣﺘﺪﻫﺎ ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ ﻛﻪ ﺑﻬﺘﺮ اﺳﺖ ﻫﻨﮕﺎم اﻧﺘﺨـﺎب ﻧـﺎم ﺑـﺮاي ﻣﺘـﺪ آﻧﻬﺎ را رﻋﺎﻳﺖ ﻛﻨﻴﺪ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن راﺣﺖ ﺗﺮ ﺑﺘﻮاﻧﻨﺪ ﻛﺪﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺗﻮﺳﻂ ﺧﻮد را ﺑﻪ زﺑﺎن دﻳﮕﺮي ﻣﻨﺘﻘـﻞ ﻛﻨﻨﺪ .ﺗﻮﺻﻴﻪ ﻣﻴﻜﻨﻴﻢ ﻛﻪ ﻫﻨﮕﺎم ﻧﺎﻣﮕﺬاري ﻣﺘﺪﻫﺎ از روش ﻧﺎﻣﮕﺬاري ﭘﺎﺳﻜﺎل اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻳﻌﻨﻲ ﻓﻘﻂ اوﻟﻴﻦ ﺣـﺮف ﻧـﺎم ﻫـﺮ ﻣﺘـﺪ را ﺑـﻪ ﺻﻮرت ﺑﺰرگ ﺑﻨﻮﻳﺴﻴﺪ .اﻟﺒﺘﻪ اﻳﻦ ﻣﻮرد ﻓﻘﻂ ﻳﻚ ﺗﻮﺻﻴﻪ ﺑﺮاي ﺧﻮاﻧﺎ ﺗﺮ ﺷﺪن ﻛﺪﻫﺎ در وﻳﮋوال 2005 C#اﺳـﺖ و ﻫـﻴﭻ اﺟﺒـﺎري در آن ﻧﻴﺴﺖ .ﺑﻪ ﻣﺜﺎل ﻫﺎي زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
CalculateAreaFromRadius OpenXmlFile GetEnvironmentValue
ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در ﻣﺜﺎل ﻫﺎي ﺑﺎﻻ ﺣﺘﻲ در ﻣﻮاردي ﻛﻪ از ﺣﺮوف ﻣﺨﻔﻒ ﻫﻢ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ ) XMLدر ﻣﺜﺎل دوم( ﺗﻤﺎم ﺣﺮوف ﺑﻪ ﺟﺰ ﺣﺮف اول ﺑﻪ ﺻﻮرت ﻛﻮﭼﻚ ﻧﻮﺷﺘﻪ ﺷﺪه اﻧﺪ .رﻋﺎﻳﺖ اﻳﻦ ﻧﻜﺘﻪ ﺑﻪ ﺧﺼﻮص در زﺑﺎﻧﻬﺎﻳﻲ ﻣﺜـﻞ C#ﻛـﻪ ﺑـﻪ ﻛـﻮﭼﻜﻲ و ﺑﺰرﮔـﻲ ﺣـﺮوف ﺣﺴﺎس ﻫﺴﺘﻨﺪ ،ﻣﻴﺘﻮاﻧﺪ از ﮔﻴﺞ ﺷﺪن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ در ﺑﺮاﺑﺮ ﻧﺎم ﺗﺎﺑﻊ ﺟﻠﻮﮔﻴﺮي ﻛﻨﺪ. ﻗﺎﻋﺪه دﻳﮕﺮ در ﻣﻮرد ﻧﺎﻣﮕﺬاري ﭘﺎراﻣﺘﺮ ﻫﺎ اﺳﺖ .در ﻧﺎﻣﮕﺬاري ﭘﺎراﻣﺘﺮ ﻫﺎ ﺑﻬﺘﺮ اﺳﺖ ﻫﻤﺎﻧﻨﺪ ﻧﺎﻣﮕﺬاري ﺗﻮاﺑﻊ و ﻣﺘﺪﻫﺎ ﻋﻤﻞ ﻛﻨﻴﺪ اﻣﺎ ﺣﺮوف اول ﻫﺮ ﭘﺎراﻣﺘﺮ را ﻧﻴﺰ ﻛﻮﭼﻚ ﻗﺮار دﻫﻴﺪ .ﺑﻪ ﻣﺜﺎل ﻫﺎي زﻳﺮ در اﻳﻦ ﻣﻮرد ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
myAccount customerDetails updatedDnsRecords
در اﻳﻨﺠﺎ ﻧﻴﺰ ،ﻫﻤﻪ ﭼﻴﺰ ﺣﺘﻲ ﻛﻠﻤﺎت اﺧﺘﺼﺎري ﻫﻢ ﺑﺎﻳﺪ از ﻗﻮاﻋﺪ ﻧﺎﻣﮕﺬاري ﭘﻴﺮوي ﻛﻨﻨﺪ )ﻫﻤﺎﻧﻨﺪ DNSدر ﻣﺜﺎل ﺑﺎﻻ(. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ در .NETﻛﺪﻫﺎ ﺑﻪ زﺑﺎن ﺧﺎﺻﻲ واﺑﺴﺘﻪ ﻧﻴﺴﺘﻨﺪ و ﻛﺪﻫﺎي ﻣﻮﺟﻮد در ﻳﻚ زﺑﺎن ﻣﻴﺘﻮاﻧﻨﺪ در زﻳﺎﻧﻬـﺎي دﻳﮕـﺮ ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ از اﻳﻦ ﻗﻮاﻋﺪ ﭘﻴﺮوي ﻛﻨﻴﺪ ﺗﺎ ﻫﻢ در زﺑﺎﻧﻬﺎﻳﻲ ﻛﻪ ﺑﻪ ﻧﻮع ﺣﺮوف ﺣﺴﺎس ﻫﺴﺘﻨﺪ و ﻫﻢ در زﺑﺎﻧﻬﺎﻳﻲ ﻛﻪ ﻧﺴﺒﺖ ﺑﻪ اﻳﻦ ﻣﻮرد ﺣﺴﺎس ﻧﻴﺴﺘﻨﺪ ﺑﺎ ﻣﺸﻜﻠﻲ ﻣﻮاﺟﻪ ﻧﺸﻮﻳﺪ.
١٠٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :زﺑﺎﻧﻬﺎﻳﻲ ﻣﺎﻧﻨﺪ Visual Basicﺑﻪ ﺑﺰرﮔﻲ و ﻛﻮﭼﻜﻲ ﺣﺮوف ﺣﺴﺎس ﻧﻴﺴﺘﻨﺪ اﻣﺎ زﺑﺎﻧﻬﺎي J# ،C#و C++ﺣـﺴﺎس ﺑﻪ ﺣﺮوف ﻫﺴﺘﻨﺪ .ﺑﺮاي ﻣﺜﺎل در اﻳﻦ زﺑﺎﻧﻬﺎ ﻣﺘﻐﻴﻴﺮ intNumberﺑﺎ ﻣﺘﻐﻴﻴﺮ INTNUMBERو ﻳﺎ intnumberﻣﺘﻔﺎوت اﺳﺖ.
ﻣﺤﺪوده ﻫﺎ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻔﺎﻫﻴﻢ ﻣﺘﺪﻫﺎ را ﺑﻴﺎن ﻣﻲ ﻛﺮدﻳﻢ ،ﮔﻔﺘﻴﻢ ﻛﻪ ﻣﺘﺪﻫﺎ ﺟﺎﻣﻊ ﻫﺴﺘﻨﺪ .اﻳﻦ ﻣﻮرد ﺗﺎﺛﻴﺮ ﻣﻬﻤﻲ در ﻧﻮع ﺗﻌﺮﻳﻒ و اﺳـﺘﻔﺎده از ﻣﺘﻐﻴﻴـﺮ ﻫﺎ در ﻣﺘﺪ دارد .ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ دو ﻣﺘﺪ ﺑﻪ ﺻﻮرت زﻳﺮ دارﻳﺪ ﻛﻪ در ﻫﺮ ﻛﺪام ﻣﺘﻐﻴﻴﺮي رﺷﺘﻪ اي ﺑﻪ ﻧﺎم strNameﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ: )(private void DisplaySebastiansName { // Declare variable and set value ;"string strName = "Sebastian Blackwood // Display results ;)"MessageBox.Show(strName, "Scope Demo } )(private void DisplayBalthazarsName { // Declare variable and set value ;"string strName = "Balthazar Keech //Display results ;)"MessageBox.Show(strName, "Scope Demo } ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻫﺮ دوي اﻳﻦ ﻣﺘﻐﻴﻴﺮﻫﺎ از ﻣﺘﻐﻴﻴﺮي ﺑﺎ ﻧﺎم ﻳﻜﺴﺎن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ،اﻣﺎ ﻫﺮ ﻛﺪام از اﻳـﻦ ﻣﺘﻐﻴﻴﺮﻫـﺎ در ﻣﺤـﺪوده ﻣﺘـﺪ ﺧـﻮد ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي اﻳﻦ ﻣﻮرد را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻣﺤﺪوده ﻫﺎ (1ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Scope Demoدر وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻳﺠﺎد ﻛﻨﻴﺪ. (2ﻳﻚ ﻛﻨﺘﺮل Buttonﺟﺪﻳﺪ ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnScopeو ﺧﺎﺻـﻴﺖ Text آن را ﺑﺮاﺑﺮ Scopeدﻫﻴﺪ .روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه ،ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnScope_Click(object sender, EventArgs e { // Call a method
١٠٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
DisplayBalthazarsName(); } private void DisplaySebastiansName() { // Declare variable and set value string strName; strName = "Sebastian Blackwood"; // Display results MessageBox.Show(strName, "Scope Demo"); } private void DisplayBalthazarsName() { // Declare variable and set value string strName; strName = "Balthazar Keech"; // Display results MessageBox.Show(strName, "Scope Demo"); } ﻛــﺎدر ﭘﻴﻐــﺎﻣﻲ را ﻣــﺸﺎﻫﺪه ﺧﻮاﻫﻴــﺪ ﻛــﺮد ﻛــﻪ ﻧــﺎم. ﻛﻠﻴــﻚ ﻛﻨﻴــﺪScope ( ﺑﺮﻧﺎﻣــﻪ را اﺟــﺮا ﻛﻨﻴــﺪ و ﺑــﺮ روي دﻛﻤــﻪ3 . را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪBalthazar Keech
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮﻧﺎﻣﻪ ﺑﻪ درﺳﺘﻲ ﻛﺎر، در اﻳﻦ ﺗﻤﺮﻳﻦ ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ دو ﻣﺘﻐﻴﻴﺮ ﺑﺎ ﻧﺎم ﻳﻜﺴﺎن وﻟﻲ در ﻣﻜﺎﻧﻬﺎي ﻣﺘﻔﺎوت دارﻳﻢ،ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ .ﻣﻲ ﻛﻨﺪ private void DisplaySebastiansName() { // Declare variable and set value string strName; strName = "Sebastian Blackwood"; // Display results MessageBox.Show(strName, "Scope Demo"); } private void DisplayBalthazarsName() { // Declare variable and set value string strName; strName = "Balthazar Keech";
١٠٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Display results ;)"MessageBox.Show(strName, "Scope Demo } ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ ،ﻣﺘﻐﻴﻴﺮ ﻫﺎﻳﻲ ﻛﻪ در آن ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ )در ﻣﺤﺪوده ﺑﺎز ﺷـﺪن آﻛـﻮﻻد و ﺑـﺴﺘﻪ ﺷـﺪن آن( ﻣﺤﺪوده ﻓﻌﺎﻟﻴﺖ ﻣﺤﻠﻲ 1ﻣﻲ ﮔﻴﺮﻧﺪ .ﻣﺤﺪوده ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻛﺪام ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ ﻣﻴﺘﻮاﻧﺪ ﺑﻪ آن دﺳﺘﺮﺳﻲ ﭘﻴـﺪا ﻛﻨـﺪ. ﻣﺤﺪوده ﻓﻌﺎﻟﻴﺖ ﻣﺤﻠﻲ ﻳﻌﻨﻲ ﻣﺘﻐﻴﻴﺮ ﻓﻘﻂ در ﻣﺤﺪوده ي ﻣﺘﺪ ﺟﺎري ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ. در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ،ﻣﺘﻐﻴﻴﺮ strNameﺗﺎ ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ وﺟﻮد ﻧﺪارد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﺪ ﺷـﺮوع ﺑـﻪ ﻛـﺎر ﻛـﺮد .NET ،و وﻳﻨـﺪوز ﺣﺎﻓﻈﻪ ﻣﻮرد ﻧﻴﺎز را در اﺧﺘﻴﺎر اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻗﺮار ﻣﻲ دﻫﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻣﻲ ﺗﻮاﻧﺪ در ﻛﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد .در اﻳﻦ ﺗﻮاﺑﻊ اﺑﺘﺪا ﻣﻘـﺪار ﻣﺘﻐﻴﻴــﺮ را ﺑﺮاﺑــﺮ ﻳــﻚ ﻧــﺎم ﺧــﺎص ﻗــﺮار داده و ﺳــﭙﺲ ﻛــﺎدر ﭘﻴﻐــﺎم را ﻧﻤــﺎﻳﺶ ﻣﻴﺪﻫﻴــﺪ .ﺑﻨــﺎﺑﺮاﻳﻦ در اﻳــﻦ ﻣﺜــﺎل ﻫﻨﮕــﺎﻣﻲ ﺷــﻤﺎ ﻣﺘــﺪ DisplayBathazarNameرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﺪ ،ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﺗﻌﺮﻳﻒ ﺷﺪه در آن ﻣﺘﺪ ﺑﻼﻓﺎﺻﻠﻪ اﻳﺠﺎد ﻣـﻲ ﺷـﻮﻧﺪ ،ﻣﺘـﺪ وﻇﺎﻳﻒ ﺧﻮد را اﻧﺠﺎم ﻣﻲ دﻫﺪ و ﺑﺎ ﭘﺎﻳﺎن ﻳﺎﻓﺘﻦ ﻣﺘﺪ ،ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻧﻴﺰ از ﺣﺎﻓﻈﻪ ﺣﺬف ﻣﻲ ﺷﻮﻧﺪ. ﻧﻜﺘﻪ :در ﺑﺨﺶ ﺑﻌﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﺤﺪوده ﻓﻌﺎﻟﻴﺖ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ داﺧﻞ ﻳﻚ ﺣﻠﻘﻪ در داﺧﻞ ﻣﺘﺪ ﻣﺤﺪود ﺷﻮد.
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ ﻣﺒﺎﺣﺚ و اﺻﻮل ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار را ﺑﻴﺎن ﻛﺮدﻳﻢ .ﺑﻴﺸﺘﺮ اﻳﻦ اﺻـﻮل ﻓﻘـﻂ ﻣﺤـﺪود ﺑـﻪ زﺑـﺎن وﻳـﮋوال C# ﻧﻴﺴﺘﻨﺪ ،ﺑﻠﻜﻪ در ﻫﺮ زﺑﺎﻧﻲ ﺻﺪق ﻣﻴﻜﻨﻨﺪ .ﻓﺼﻞ را ﺑﺎ ﻣﻌﺮﻓﻲ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ آﻏﺎز ﻛﺮدﻳﻢ ﻛﻪ ﭘﺎﻳﻪ و اﺳﺎس ﺗﻤﺎم ﻧﺮم اﻓﺰارﻫـﺎ ﻫـﺴﺘﻨﺪ .ﺳـﭙﺲ ﻣﻔﺎﻫﻴﻢ اوﻟﻴﻪ ﻣﺘﻐﻴﻴﺮ ﻫﺎ را ﻣﻌﺮﻓﻲ ﻛﺮدﻳﻢ و از ﻧﺰدﻳﻚ ﭘﺮﻛﺎرﺑﺮد ﺗﺮﻳﻦ ﻧﻮع ﻫﺎي داده اي را از ﻗﺒﻴـﻞ ،string ،double ،int DateTimeو Booleanﺑﺮرﺳﻲ ﻛﺮدﻳﻢ .ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﻛﺎرﻫﺎي ﮔﻮﻧﺎﮔﻮﻧﻲ روي اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫـﺎ اﻧﺠـﺎم داد .ﻣﺜﻼ اﻧﺠﺎم ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ روي ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻋﺪدي ،اﺗﺼﺎل رﺷﺘﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﺑﻪ ﻫﻢ و اﻳﺠﺎد رﺷﺘﻪ ﺟﺪﻳـﺪ ،ﺑﺪﺳـﺖ آوردن ﻃـﻮل ﻳﻚ رﺷﺘﻪ ،ﺗﻘﺴﻴﻢ ﻳﻚ ﻣﺘﻦ ﺑﻪ ﭼﻨﺪ زﻳﺮرﺷﺘﻪ ،ﺑﺪﺳﺖ آوردن ﺗﺎرﻳﺦ ﺟﺎري ﺳﻴﺴﺘﻢ و ﻳﺎ دﺳﺘﺮﺳﻲ ﺑﻪ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﺗﺎرﻳﺦ از ﻗﺒﻴﻞ ﻣﺎه، ﺳﺎل و ...ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي آن .ﺳﭙﺲ ﻧﺤﻮه ذﺧﻴﺮه ﺷﺪن ﻣﺘﻐﻴﻴﺮ ﻫﺎ در ﺣﺎﻓﻈﻪ ﻳﻚ ﺳﻴﺴﺘﻢ را ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ. ﺑﻌﺪ از اﻳﻦ ﻣﻮارد ﻧﮕﺎﻫﻲ ﺑﻪ ﻣﺘﺪﻫﺎ اﻧﺪاﺧﺘﻴﻢ .اﻳﻦ ﻛﻪ ﻣﺘﺪﻫﺎ ﭼﻴﺴﺘﻨﺪ ،ﭼﺮا ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز ﭘﻴﺪا ﻣﻴﻜﻨﻴﻢ ،ﭼﮕﻮﻧﻪ آﻧﻬـﺎ را اﻳﺠـﺎد ﻛﻨـﻴﻢ و ﺑـﻪ آﻧﻬـﺎ ﭘﺎراﻣﺘﺮ ﺑﻔﺮﺳﺘﻴﻢ .ﻫﻤﭽﻨﻴﻦ ﻣﺤﺪوده ﻓﻌﺎﻟﻴﺖ ﻣﺘﻐﻴﻴﺮ ﻫﺎ را در ﻳﻚ ﻣﺘﺪ را ﻧﻴﺰ ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ. در ﭘﺎﻳﺎن ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ:
اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﭼﻴﺴﺘﻨﺪ و ﭼﮕﻮﻧﻪ در ﺗﻮﺳﻌﻪ ﻧﺮم اﻓﺰار ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ. ﭼﮕﻮﻧﻪ ﻣﺘﻐﻴﻴﺮ ﻫﺎﻳﻲ از ﻧﻮع ﻫﺎي داده اي ﻣﺨﺘﻠﻒ را اﻳﺠﺎد و اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﭼﮕﻮﻧﻪ از ﭘﺮﻛﺎرﺑﺮد ﺗﺮﻳﻦ ﺗﻮاﺑﻊ ﻛﺎر ﺑﺎ رﺷﺘﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﻐﻴﻴﺮي از ﻧﻮع stringدارﻳﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﭼﮕﻮﻧﻪ از ﻧﻮع داده اي DateTimeﺑﺮاي ﻧﮕﻬﺪاري زﻣﺎن و ﺗﺎرﻳﺦ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و آﻧﻬﺎ را ﺑـﺮ اﺳـﺎس ﺗﻨﻈﻴﻤـﺎت ﻣﺤﻠـﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻛﺎرﺑﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. ﭼﮕﻮﻧﻪ ﻣﺘﺪﻫﺎي ﺳﺎده را ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
Local Scope
1
١٠٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻤﺮﻳﻦ:
ﺗﻤﺮﻳﻦ :1 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺑﺎ دو ﻛﻨﺘﺮل Buttonاﻳﺠﺎد ﻛﻨﻴﺪ .در روﻳﺪاد Clickدﻛﻤﻪ اول دو ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋـﺪد ﺻـﺤﻴﺢ اﻳﺠـﺎد ﻛﻨﻴﺪ و ﻣﻘﺪار اوﻟﻴﻪ آﻧﻬﺎ را ﺑﺮاﺑﺮ ﻋﺪدي دﻟﺨﻮاه ﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺗﻌﺪادي از ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ ﻣﺨﺘﻠﻒ را روي اﻳﻦ اﻋﺪاد اﻧﺠﺎم داده و ﻧﺘﻴﺠﻪ را در ﺧﺮوﺟﻲ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. در روﻳﺪاد Clickدﻛﻤﻪ ﻓﺮﻣﺎن دوم دو ﻣﺘﻐﻴﻴﺮ از ﻧﻮع رﺷﺘﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﻣﻘﺪار آﻧﻬﺎ را ﺑﺮاﺑﺮ رﺷﺘﻪ دﻟﺨﻮاه ﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ دو رﺷﺘﻪ را ﺑﻪ ﻫﻢ ﻣﺘﺼﻞ ﻛﺮده و ﻧﺘﻴﺠﻪ را ﻧﻤﺎﻳﺶ دﻫﻴﺪ.
ﺗﻤﺮﻳﻦ :2 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺑﺎ ﻳﻚ ﻛﻨﺘﺮل TextBoxو ﻳﻚ ﻛﻨﺘﺮل Buttonاﻳﺠﺎد ﻛﻨﻴﺪ .در روﻳﺪاد Clickدﻛﻤﻪ ﻓﺮﻣﺎن ،ﺳﻪ ﻛﺎدر ﭘﻴﻐﺎم را ﻧﻤﺎﻳﺶ دﻫﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎم اول ﺑﺎﻳﺪ ﻃﻮل رﺷﺘﻪ ي درون TextBoxرا ﻧﻤﺎﻳﺶ دﻫـﺪ .ﻛـﺎدر ﭘﻴﻐـﺎم دوم ﺑﺎﻳـﺪ ﻧﻴﻤـﻪ اول رﺷﺘﻪ و ﻛﺎدر ﭘﻴﻐﺎم ﺳﻮم ﻧﻴﻤﻪ دوم رﺷﺘﻪ را ﻧﻤﺎﻳﺶ دﻫﺪ.
١٠٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﭼﻬﺎرم :ﻛﻨﺘﺮل روﻧﺪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ در ﻓﺼﻞ ﺳﻮم در ﻣﻮرد اﻟﮕﻮرﻳﺘﻢ ﻫﺎ و ﻛﺎرﺑﺮد آﻧﻬﺎ در ﻧﺮم اﻓﺰار ﻣﻄﺎﻟﺒﻲ را آﻣﻮﺧﺘﻴﺪ .در اﻳﻦ ﻓﺼﻞ ﻧﺤـﻮه ﻛﻨﺘـﺮل روﻧـﺪ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ در ﻃﻮل اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .ﺑﺮاي ﻣﺜﺎل ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﺼﻤﻴﻤﺎﺗﻲ از ﻗﺒﻴﻞ "اﮔﺮ Xﺑـﻪ اﻳـﻦ ﺣﺎﻟـﺖ ﺑﻮد A ،را اﻧﺠﺎم ﺑﺪه در ﻏﻴﺮ اﻳﻦ ﺻﻮرت Bرا اﻧﺠﺎم ﺑﺪه" را در ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد ﭘﻴﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻗﺎﺑﻠﻴﺖ در اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ ﻫـﺎ ﺑـﻪ ﻋﻨـﻮان اﻧﺸﻌﺎب ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﻓﺼﻞ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﻗﻄﻌﻪ ﻛﺪ را ﺑﻪ ﺗﻌﺪاد ﻣﺮﺗﺒﻪ ﻣﺸﺨﺺ و ﻳـﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮط درﺳﺖ اﺳﺖ اﺟﺮا ﻛﻨﻴﺪ. ﺧﺼﻮﺻﺎ در اﻳﻦ ﻓﺼﻞ در ﻣﻮرد ﻣﻮارد زﻳﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد:
دﺳﺘﻮر if switch ﺣﻠﻘﻪ ﻫﺎي forو foreach ﺣﻠﻘﻪ ﻫﺎي do … whileو do … until
ﺗﺼﻤﻴﻢ ﮔﻴﺮي در ﺑﺮﻧﺎﻣﻪ: اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﻫﻤﻮاره داراي ﺗﺼﻤﻴﻤﺎﺗﻲ ﻫﺴﺘﻨﺪ .در واﻗﻊ ،اﻳﻦ ﺗﺼﻤﻴﻤﺎت اﺳﺖ ﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺘﻮاﻧﺪ وﻇﻴﻔﻪ ﺧﻮد را ﺑـﻪ ﺧـﻮﺑﻲ اﻧﺠﺎم دﻫﺪ .ﻫﻨﮕﺎم ﻛﺪ ﻧﻮﻳﺴﻲ ﺑﺎ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻫﺎي زﻳﺎدي ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮﻳﺪ .ﻣﺜﻼ ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻟﻴﺴﺘﻲ ﺷﺎﻣﻞ ده ﻧـﺎم در اﺧﺘﻴـﺎر ﺷـﻤﺎ ﻗﺮار داده اﻧﺪ و ﺑﺎﻳﺪ ﻛﺪي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﻪ اﻋﻀﺎي اﻳﻦ ﻟﻴﺴﺖ ﻧﺎﻣﻪ اي را ﺑﻔﺮﺳﺘﺪ .در ﻫﺮ ﻗﺴﻤﺖ از اﻳﻦ ﻛﺪ ﻣﻲ ﭘﺮﺳـﻴﺪ "آﻳـﺎ ﻟﻴـﺴﺖ ﺗﻤـﺎم ﺷﺪه اﺳﺖ؟" اﮔﺮ ﭼﻨﻴﻦ ﺑﻮد اﻟﮕﻮرﻳﺘﻢ ﺗﻤﺎم ﻣﻲ ﺷﻮد .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻧﺎم ﻧﻔﺮ ﺑﻌﺪي از ﻟﻴﺴﺖ اﺳﺘﺨﺮاج ﻣﻴﺸﻮد و ﻣﺮاﺣـﻞ ارﺳـﺎل ﻧﺎﻣـﻪ ﺑﺮاي او اﻧﺠﺎم ﻣﻴﺸﻮد .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎﻟﻲ دﻳﮕﺮ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻓﺎﻳﻠﻲ را ﺑﺎز ﻛﻨﻴﺪ .در اﻳﻦ ﺣﺎﻟﺖ اﺑﺘﺪا ﻣﻲ ﭘﺮﺳﻴﺪ "آﻳـﺎ ﻓﺎﻳـﻞ ﻣـﻮرد ﻧﻈﺮ وﺟﻮد دارد؟" .در ﺻﻮرت وﺟﻮد ﻓﺎﻳﻞ را ﺑﺎز ﻣﻲ ﻛﻨﻴﺪ و در ﻏﻴﺮ اﻳﻦ ﺻﻮرت اﻟﮕﻮرﻳﺘﻢ را ﺑﻪ اﺗﻤﺎم ﻣﻴﺮﺳﺎﻧﻴﺪ. ﺗﻤﺎم اﻳﻦ ﺗﺼﻤﻴﻢ ﮔﻴﺮﻳﻬﺎ ﺑﻪ ﻳﻚ ﻧﺤﻮ در ﺑﺮﻧﺎﻣﻪ ﭘﻴﺎده ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ .در اﺑﺘﺪا ﺑﻪ ﺑﺮرﺳﻲ دﺳﺘﻮر ifﺑﺮاي ﻛﻨﺘﺮل روﻧـﺪ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻣﻲ ﭘﺮدازﻳﻢ.
دﺳﺘﻮر :if راﺣﺖ ﺗﺮﻳﻦ راه ﺑﺮاي ﺗﺼﻤﻴﻢ ﮔﻴﺮي در وﻳﮋوال 2005 C#اﺳﺘﻔﺎده از دﺳﺘﻮر ifاﺳﺖ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﺑﺎ ﻧﺤﻮه ﻛﺎرﺑﺮد اﻳـﻦ دﺳﺘﻮر آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻳﻚ دﺳﺘﻮر ifﺳﺎده
١٠٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺑﻪ ﻧﺎم Simple Ifاﻳﺠﺎد ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ﻛﻨﺘﺮل Buttonﺑـﺮ روي ﻓﺮم ﻗﺮار داده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ btnIfو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑـﺮ Ifﻗـﺮار دﻫﻴـﺪ .روي اﻳـﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: )private void btnIf_Click(object sender, EventArgs e { // Declare and set a variable ;int intNumber = 27 // Here's where you make a desicion // and tell the user what happend )if (intNumber == 27 { MessageBox.Show("'intNumber' is, indeed, 27!", ;)""Simple If } }
(2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Ifﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 1-4ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﺷﻜﻞ 1-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﺑﺘﺪا ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم intNumberاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ و ﻣﻘﺪار آن را ﺑﺮاﺑﺮ 27ﻗﺮار ﻣﻲ دﻫﻴﺪ )ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ﻫﻢ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ و ﻫﻢ ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ آن در ﻳﻚ ﺧﻂ اﻧﺠﺎم ﺷﺪه اﺳﺖ(: ;int intNumber = 27 ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر ifﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﺑﺎﻳﺪ ﭼﻪ ﻛﺎري اﻧﺠﺎم دﻫﻴﺪ .در اﻳﻨﺠﺎ ﺷﻤﺎ ﻣﻴﮕﻮﻳﻴﺪ "اﮔﺮ intNumberﺑﺮاﺑﺮ ﺑﺎ 27ﺑﻮد."... // Here's where you make a desicion // and tell the user what happend )if (intNumber == 27
١٠٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ MessageBox.Show("'intNumber' is, indeed, 27!", ;)""Simple If } ﻗﻄﻌﻪ ﻛﺪي ﻛﻪ درون آﻛﻮﻻد ﭘﺎﻳﻴﻦ دﺳﺘﻮر ifﻗﺮار دارد ﻓﻘﻂ ﻫﻨﮕﺎﻣﻲ اﺟﺮا ﻣﻴﺸﻮد ﻛﻪ intNumberﺑﺮاﺑﺮ ﺑﺎ 27ﺑﺎﺷﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﺮط داﺧﻞ ﭘﺮاﻧﺘﺰ ﺑﺮاﺑﺮ trueو ﻳﺎ درﺳﺖ ﺑﺎﺷﺪ ،ﻛﺪ داﺧﻞ ﺑﻼك ifاﺟﺮا ﻣﻲ ﺷﻮد. ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻨﺠﺎ ،اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺷﺮوع ﻣﻴﺸﻮد و ﺑﻪ دﺳﺘﻮر ifﻣﻴﺮﺳﺪ .ﺑﻌﺪ از ارزﻳـﺎﺑﻲ ﻋﺒـﺎرت داﺧـﻞ ﭘﺮاﻧﺘـﺰ ﭼـﻮن ﻣﻘـﺪار آن ﺑﺮاﺑـﺮ ﺑـﺎ trueاﺳﺖ ،دﺳﺘﻮرات درون ﺑﻼك ifاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ و ﺳﭙﺲ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ از ﺧﻂ ﺑﻌﺪ از ﺑﻼك ifاداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ. ﻧﻜﺘﻪ :دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻛﺪﻫﺎي درون ﺑﻼك ifﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺑﺎ ﻣﻘﺪاري ﺗﻮرﻓﺘﮕﻲ 1ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .اﻳـﻦ ﻣـﻮرد ﺑﺎﻋـﺚ اﻓـﺰاﻳﺶ ﺧﻮاﻧﺎﻳﻲ ﻛﺪ ﻣﻲ ﺷﻮد ،زﻳﺮا ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻧﮕﺎﻫﻲ ﺳﺮﻳﻊ ﺑﮕﻮﻳﻴﺪ ﻛﻪ ﻛﺪام ﻗﺴﻤﺖ از ﻛﺪ در ﺻﻮرت ﺻﺤﻴﺢ ﺑﻮدن دﺳﺘﻮر ifاﺟﺮا ﻣﻲ ﺷـﻮد. ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﺧﻮاﻧﺎﻳﻲ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﺑﻬﺘﺮ اﺳﺖ ﻗﺒﻞ و ﺑﻌﺪ از ﺑﻼك ifﻣﻘﺪاري ﻓﻀﺎي ﺧﺎﻟﻲ ﻗﺮار دﻫﻴﺪ. ﻳﻚ دﺳﺘﻮر ifﺳﺎده ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻞ ﻣﻴﺘﻮاﻧﺪ ﺑﻮدن ﻫﻴﭻ آﻛﻮﻻدي ﻧﻮﺷﺘﻪ ﺷﻮد .اﻟﺒﺘﻪ اﻳﻦ ﻛﺎر ﻫﻨﮕﺎﻣﻲ اﻣﻜﺎﻧﭙـﺬﻳﺮ اﺳـﺖ ﻛـﻪ ﺑـﻼك ifﻓﻘﻂ ﺷﺎﻣﻞ ﻳﻚ دﺳﺘﻮر ﺑﺎﺷﺪ .ﺑﻪ ﻛﺪ زﻳﺮ ﻧﮕﺎه ﻛﻨﻴﺪ: )if (intNumber == 27 MessageBox.Show("'intNumber' is, indeed, 27!", ;)""Simple If اﻳﻦ دﺳﺘﻮر ﻫﻢ ﻣﺎﻧﻨﺪ دﺳﺘﻮر ifدر ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ﻛﺎر ﻣﻲ ﻛﻨﺪ و ﻣﺰﻳﺖ آن ﻓﻘﻂ اﻳﻦ اﺳﺖ ﻛﻪ ﻛﺪ را ﻛﻮﺗﺎﻫﺘﺮ ﻣﻲ ﻛﻨﺪ. اﻣﺎ اﮔﺮ ﻧﺘﻴﺠﻪ ﻳﻚ ﺷﺮط ﻧﺎدرﺳﺖ ﺑﺎﺷﺪ ،ﭼﻪ اﺗﻔﺎﻗﻲ ﻣﻲ اﻓﺘﺪ؟ در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي اﻳﻦ ﺣﺎﻟﺖ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﺎدرﺳﺖ ﺑﻮدن ﺷﺮط (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ Simple Ifدر ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ .ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑﺮ btnAnotherIfو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑـﺮ Another Ifﻗـﺮار دﻫﻴـﺪ .روي دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن وارد ﻛﻨﻴﺪ: private void btnAnotherIf_Click(object sender, )EventArgs e { // Declare and set a variable ;int intNumber = 27 // Here’s where you make a decision, // and tell the user what happened )if (intNumber == 1000 Indention
1
١١٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ MessageBox.Show("‘intNumber’ is, indeed, " + ;)""1000!", "Simple If } } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﺣﺎﻟﺖ ،ﺟﻮاب ﺳﻮال "آﻳﺎ intNumberﺑﺮاﺑﺮ ﺑﺎ 1000اﺳﺖ؟" ﺧﻴﺮ اﺳﺖ .ﺑﻼك دﺳﺘﻮرات ﻫﻢ ﻓﻘﻂ در ﺣﺎﻟﺘﻲ اﺟﺮا ﻣﻲ ﺷﻮد ﻛﻪ ﻧﺘﻴﺠﻪ ﺷﺮط ﺑﺮاﺑﺮ trueﺑﺎﺷﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺪﻫﺎي اﻳﻦ ﺑﻼك اﺟﺮا ﻧﺨﻮاﻫﻨﺪ ﺷﺪ .در ﭼﻨﻴﻦ ﺷﺮاﻳﻄﻲ ﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ ﺑﻼﻓﺎﺻـﻠﻪ ﺑـﻪ ﺧـﻂ ﺑﻌﺪ از ifﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد و ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ.
دﺳﺘﻮر :Else اﮔﺮ ﺑﺨﻮاﻫﻴﺪ در ﺻﻮرت درﺳﺖ ﺑﻮدن ﺷﺮط ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ و در ﺻﻮرت ﻏﻠﻂ ﺑﻮدن آن ﻗﺴﻤﺘﻲ دﻳﮕﺮ اﺟﺮا ﺷـﻮد ،ﻣـﻲ ﺗﻮاﻧﻴـﺪ از دﺳـﺘﻮر elseاﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﺤﻮه ﻛﺎرﺑﺮد اﻳﻦ دﺳﺘﻮر را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :دﺳﺘﻮر else (1ﻛﺪ درون روﻳﺪاد Clickﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل btnAnotherIfرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: private void btnAnotherIf_Click(object sender, )EventArgs e { // Declare and set a variable ;int intNumber = 27 // Here’s where you make a decision, // and tell the user what happened )if (intNumber == 1000 { MessageBox.Show("‘intNumber’ is, indeed, " + ;)""1000!", "Simple If } else {
١١١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
MessageBox.Show("‘intNumber’ is not 1000!", ;)""Simple If } } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Another Ifﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 2-4را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 2-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﺪي ﻛﻪ در ﺑﻼك elseوارد ﺷﺪه اﺳﺖ ،ﻓﻘﻂ در ﺻﻮرﺗﻲ اﺟﺮا ﻣﻲ ﺷﻮد ﻛﻪ ﻋﺒﺎرت درون ﭘﺮاﻧﺘﺰ ifﻧﺎدرﺳﺖ ﺑﺎﺷﺪ .در اﻳـﻦ ﺣﺎﻟـﺖ، ﻣﻘﺪار intNumberﺑﺮاﺑﺮ ﺑﺎ 27اﺳﺖ ،اﻣﺎ ﭼﻮن در ﺷﺮط ﺑﺎ ﻋﺪد 1000ﻣﻘﺎﻳﺴﻪ ﺷﺪه اﺳﺖ ﺑﻨﺎﺑﺮاﻳﻦ ﺷﺮط ﻏﻠﻂ اﺳـﺖ و ﻛـﺪ ﻧﻮﺷـﺘﻪ ﺷﺪه در ﺑﺨﺶ elseاﺟﺮا ﺧﻮاﻫﺪ ﺷﺪ: else { MessageBox.Show("‘intNumber’ is not 1000!", ;)""Simple If }
ﺑﺮرﺳﻲ ﭼﻨﺪ ﺷﺮط ﺑﺎ :else if اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻴﺶ از ﻳﻚ ﺣﺎﻟﺖ را ﺗﺴﺖ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ از ﺗﺮﻛﻴﺐ دﺳﺘﻮر elseو ifاﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴـﺪ ﺑﻌـﺪي ،ﺑﺮﻧﺎﻣـﻪ Simple Ifرا ﺑﻪ ﻧﺤﻮي ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ ﻛﻪ ﺑﺮاﺑﺮي intNumberرا ﺑﺎ ﭼﻨﺪ ﻋﺪد ﻣﺨﺘﻠﻒ ﺑﺮرﺳﻲ ﻛﻨﺪ و ﻧﺘﻴﺠﻪ را ﻧﻤﺎﻳﺶ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :دﺳﺘﻮر else if (1ﻛﺪ درون ﻣﺘﺪ btnAnotherIf_Clickرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: private void btnAnotherIf_Click(object sender,
١١٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)EventArgs e { // Declare and set a variable ;int intNumber = 27 // Here’s where you make a decision, // and tell the user what happened )if (intNumber == 1000 { MessageBox.Show("‘intNumber’ is, indeed, " + ;)""1000!", "Simple If } )else if (intNumber == 27 { MessageBox.Show("‘intNumber’ is 27!", ;)""Simple If } else { MessageBox.Show("‘intNumber’ is neither 1000" + ;)"" nor 27!", "Simple If } } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ﻓﺮﻣﺎن Another Ifﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 3-4را ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﺷﻜﻞ 3-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ دﺳﺘﻮرات ﺑﺨﺶ else ifاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ،زﻳﺮا intNumberﺑﺮاﺑﺮ ﺑﺎ ﻋﺪد 27اﺳﺖ و ﺑﻨﺎﺑﺮاﻳﻦ ﻋﺒﺎرت داﺧـﻞ else ifدرﺳﺖ ﺧﻮاﻫﺪ ﺑﻮد .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﮔﺮ ﺷﺮط داﺧﻞ else ifﻧﻴﺰ ﻏﻠﻂ ﺑﻮد ،ﻛﺪﻫﺎي ﺑﺨـﺶ elseاﺟـﺮا ﻣﻲ ﺷﺪﻧﺪ. در ﻳﻚ ﺳﺮي دﺳﺘﻮرات ifو else ifﻣﺘﻮاﻟﻲ ،ﺷﺮاﻳﻂ از ﺑﺎﻻﺗﺮﻳﻦ ifﺑﻪ ﺳﻤﺖ ﭘﺎﻳﻴﻦ ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮﻧﺪ و اوﻟﻴﻦ ﻋﺒـﺎرﺗﻲ ﻛـﻪ درﺳﺖ ارزﻳﺎﺑﻲ ﺷﺪ ،دﺳﺘﻮرات ﻣﺮﺑﻮط ﺑﻪ آن اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﭘﺲ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ اﮔﺮ ﺷﺮط اول را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻨﻈﻴﻢ ﻛﻨﻴﻢ ﻛﻪ درﺳﺖ ﺑﺎﺷﺪ )ﺑﺮاي ﻣﺜﺎل داﺧﻞ ﭘﺮاﻧﺘﺰ ﻋﺒﺎرت intNumber > 10را ﻗﺮار دﻫﻴﻢ ﻛﻪ ﺑﻪ ﻋﻠﺖ ﺑﺰرﮔﺘﺮ ﺑﻮدن intNumberاز 10ﺑﺮاﺑـﺮ
١١٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺎ trueاﺳﺖ( ،ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﺷﺮط دوم ﻫﻢ درﺳﺖ اﺳﺖ دﺳﺘﻮرات ﺷﺮط اول اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ و ﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ ﺑـﻪ اوﻟـﻴﻦ ﺧـﻂ ﺑﻌـﺪ از ﺳﺮي دﺳﺘﻮرات ifﻣﻲ رود. )else if (intNumber == 27 { MessageBox.Show("‘intNumber’ is 27!", ;)""Simple If } else { MessageBox.Show("‘intNumber’ is neither 1000" + ;)"" nor 27!", "Simple If } ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻫﺮ ﺗﻌﺪاد ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻗﺴﻤﺘﻬﺎي else ifرا ﺑﻪ ﻳﻚ دﺳﺘﻮر ifﺑﺮاي ﺑﺮرﺳﻲ ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ. اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻳﮋوال C#ﺑﻪ اوﻟﻴﻦ دﺳﺘﻮر ifرﺳﻴﺪ ﺷﺮط داﺧﻞ آن را ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ .اﮔﺮ ﻋﺒﺎرت داﺧﻞ ﭘﺮاﻧﺘـﺰ درﺳﺖ ارزﻳﺎﺑﻲ ﺷﻮد ،دﺳﺘﻮرات داﺧﻞ ﺑﻼك ifاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ و ﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ ﺑﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌـﺪ از ﺳـﺮي دﺳـﺘﻮرات ifو else ﻣﻴﺮود .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ،ﻋﺒﺎرت ﻣﺮﺑﻮط ﺑﻪ اوﻟﻴﻦ else ifارزﻳﺎﺑﻲ ﻣﻲ ﺷﻮد .اﻳﻦ روﻧﺪ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺑﻼﻛـﻲ از دﺳﺘﻮرات ﺑﺮﺳﺪ ﻛﻪ ﺣﺎﺻﻞ آن درﺳﺖ ﺑﺎﺷﺪ .در اﻳﻦ ﺣﺎﻟﺖ دﺳﺘﻮرات اﻳﻦ ﺑﻼك اﺟﺮا ﺷﺪه و ﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺑﻌـﺪ از ﻣﺠﻤﻮﻋـﻪ دﺳـﺘﻮرات ifو elseﻣﻲ رود. ﻧﻜﺘﻪ :ﻫﻨﮕﺎم ﺑﺮرﺳﻲ ﻳﻚ ﺳﺮي از ﺣﺎﻟﺘﻬﺎ ،ﺑﻬﺘﺮ اﺳﺖ آﻧﻬﺎﻳﻲ را ﻛﻪ اﺣﺘﻤﺎل درﺳﺖ ﺑﻮدﻧﺸﺎن ﺑﻴﺸﺘﺮ اﺳﺖ ،اﺑﺘﺪا ﺑﺮرﺳﻲ ﻛﻨﻴـﺪ .اﻳـﻦ ﻣـﻮرد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﻨﮕﺎم اﺟﺮا ،ﺷﺮاﻳﻂ اﺿﺎﻓﻪ را ﺑﺮرﺳﻲ ﻧﻜﻨﺪ و ﻛﺪ ﺳﺮﻳﻌﺘﺮ اﺟﺮا ﺷﻮد. ﻧﻜﺘﻪ :در ﻣﻮاردي ﻛﻪ ﺗﻌﺪاد ﻗﺴﻤﺘﻬﺎي else ifدر ﺑﺮﻧﺎﻣﻪ زﻳﺎد ﺑﺎﺷﺪ و ﺣﺎﻟﺘﻬﺎي زﻳﺎدي را ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ،ﺑﻪ ﺟـﺎي اﺳـﺘﻔﺎده از ifو else ifﻣﻴﺘﻮاﻧﻴﺪ از switchاﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﺑﻌﺪي ﺗﻮﺿﻴﺢ داده ﻣﻲ ﺷﻮﻧﺪ.
دﺳﺘﻮرات ifﺗﻮدرﺗﻮ: ﻋﻼوه ﺑﺮ اﺳﺘﻔﺎده ﻣﺘﻮاﻟﻲ از دﺳﺘﻮرات ،ifﻣﻲ ﺗﻮاﻧﻴﺪ در داﺧﻞ ﻳﻚ ifاز دﺳﺘﻮرات ifدﻳﮕﺮي اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑـﻪ ﻣﺜـﺎل زﻳـﺮ ﺗﻮﺟـﻪ ﻛﻨﻴﺪ: )if (intX > 3 { MessageBox.Show("intX is greater that 3", ;)""Sample If )if (intX == 6 ;)"MessageBox.Show("intX is 6!", "Sample If }
١١٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﺳﺘﻔﺎده از دﺳﺘﻮرات ifﺗﻮدرﺗﻮ ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ ﻧﻴﺴﺖ .اﻟﺒﺘﻪ ﺑﺎﻳﺪ دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﭼﻪ ﺗﻌـﺪاد ifﻫـﺎي ﺗﻮدرﺗـﻮ در ﺑﺮﻧﺎﻣـﻪ ﺑﻴـﺸﺘﺮ ﺑﺎﺷﺪ ،درك آن ﻣﺸﻜﻠﺘﺮ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﺳﻌﻲ ﻛﻨﻴﺪ ﺗﺎ ﺟﺎﻳﻲ ﻛﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﺗﻌﺪاد ifﻫﺎي ﺗﻮدرﺗﻮ را در ﺑﺮﻧﺎﻣﻪ ﻛﻢ ﻛﻨﻴﺪ.
ﻋﻤﻠﮕﺮﻫﺎي ﻣﻘﺎﻳﺴﻪ اي: در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ،ﻧﺤﻮه ﺑﺮرﺳﻲ ﺑﺮاﺑﺮ ﺑﻮدن ﻳﻚ ﻣﺘﻐﻴﻴﺮ را ﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﺨﺘﻠﻒ ﺑﺮاي اﺳﺘﻔﺎده در ﺷﺮط ﻳﻚ دﺳﺘﻮر ifدﻳﺪﻳﻢ .اﻣـﺎ دﺳـﺘﻮر ifﺑﺴﻴﺎر اﻧﻌﻄﺎف ﭘﺬﻳﺮ ﺗﺮ اﺳﺖ .ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﺮاي ﺷﺮط اﻳﻦ دﺳﺘﻮر از ﺳﻮاﻟﻬﺎﻳﻲ ﻣﺜﻞ ﻣﻮارد زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ ﭘﺎﺳﺦ ﻫﻤﻪ آﻧﻬﺎ ﺑﻠﻪ ﻳﺎ ﺧﻴﺮ اﺳﺖ:
آﻳﺎ intNumberﺑﺰرﮔﺘﺮ از 49اﺳﺖ؟ آﻳﺎ intNumberﻛﻮﭼﻜﺘﺮ از 49اﺳﺖ؟ آﻳﺎ intNumberﺑﺰرﮔﺘﺮ ﻳﺎ ﻣﺴﺎوي 49اﺳﺖ؟ آﻳﺎ intNumberﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي 49اﺳﺖ؟ آﻳﺎ strNameﺑﺮاﺑﺮ ﺑﺎ Benاﺳﺖ؟
ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎي رﺷﺘﻪ اي ،ﻣﻌﻤﻮﻻ از ﺷﺮﻃﻬﺎي ﺑﺮاﺑﺮ ﺑﻮدن ﻳﺎ ﻣﺨﺎﻟﻒ ﺑﻮدن اﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﺪ .اﻣﺎ ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻋﺪدي )ﭼﻪ اﻋﺪاد ﺻﺤﻴﺢ و ﭼﻪ اﻋﺪاد اﻋﺸﺎري( ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺗﻤﺎم ﻋﻤﻠﮕﺮ ﻫﺎي رﻳﺎﺿﻲ ﻛﻪ در ﺑﺎﻻ ذﻛﺮ ﺷﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ: ﺗﺎﻛﻨﻮن از ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ اﺳﺘﻔﺎده ﻧﻜﺮده اﻳﻢ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ﻧﺤﻮه اﺳـﺘﻔﺎده از اﻳـﻦ ﻋﻤﻠﮕـﺮ را ﺑـﺎ ﻣﺘﻐﻴﻴـﺮ ﻫـﺎي رﺷـﺘﻪ اي ﺧﻮاﻫﻴﻢ دﻳﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ (1ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم If Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺤﻴﻂ ﻃﺮاﺣﻲ Form1را ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻳﻚ ﻛﻨﺘـﺮل TextBoxو ﻳـﻚ ﻛﻨﺘـﺮل Buttonرا ﺑـﻪ وﺳﻴﻠﻪ ﺟﻌﺒﻪ اﺑﺰار ﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺧﺎﺻﻴﺖ Nameﻛﻨﺘﺮل TextBoxرا ﺑﺮاﺑـﺮ ﺑـﺎ txtNameو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Robbinﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺖ Nameﻛﻨﺘﺮل Buttonرا ﺑﺮاﺑﺮ btnCheckو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Checkﻗﺮار دﻫﻴﺪ. (3روي Buttonدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﺑﺨﺶ روﻳﺪاد Clickﻣﺮﺑﻮط ﺑﻪ آن ﻗﺮار دﻫﻴﺪ: )private void btnCheck_Click(object sender, EventArgs e { // Declare a variable and // get the name from the text box ١١٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;string strName ;strName = txtName.Text ?// Is the name Gretchen )"if (strName != "Gretchen MessageBox.Show("The name is *not* Gretchen.", ;)""If Demo } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Checkﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﻴﮕﻮﻳﺪ ﻧـﺎم داﺧـﻞ ﺟﻌﺒـﻪ ﻣﺘﻨﻲ ﺑﺮاﺑﺮ ﺑﺎ Gretchenﻧﻴﺴﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻋﻤﻠﮕﺮ ﻣﺨـﺎﻟﻒ در زﺑـﺎن C#ﺑـﻪ ﺻـﻮرت =! اﺳـﺖ .ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛـﺎرﺑﺮ روي دﻛﻤـﻪ ﻓﺮﻣـﺎن ﻛﻠﻴـﻚ ﻣـﻲ ﻛﻨـﺪ ،اول ﻣـﺘﻦ درون TextBoxﺑﻪ وﺳﻴﻠﻪ ﺧﺎﺻﻴﺖ Textآن ﺑﺪﺳﺖ آورده ﻣﻲ ﺷﻮد و درون ﻳﻚ ﻣﺘﻐﻴﻴﺮ رﺷﺘﻪ اي ﻗﺮار ﻣﻲ ﮔﻴﺮد. // Declare a variable and // get the name from the text box ;string strName ;strName = txtName.Text ﺑﻌﺪ از اﻳﻨﻜﻪ ﻧﺎم وارد ﺷﺪه در ﻣﺘﻐﻴﻴﺮ ﻗﺮار ﮔﺮﻓﺖ ،ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ ﻣﻘﺪار درون ﻣﺘﻐﻴﻴﺮ رﺷﺘﻪ اي ﺑﺎ ﻳﻚ ﻋﺒﺎرت رﺷﺘﻪ اي دﻳﮕـﺮ ﻣﻘﺎﻳﺴﻪ ﺷﺪه و ﻧﺘﻴﺠﻪ اﻳﻦ ﻣﻘﺎﻳﺴﻪ ﺑﺮاي اﺟﺮاي دﺳﺘﻮرات ifاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. ?// Is the name Gretchen )"if (strName != "Gretchen MessageBox.Show("The name is *not* Gretchen.", ;)""If Demo ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻴﻢ ،دﺳﺘﻮرات درون ﺑﻼك ifﻓﻘﻂ در ﺻﻮرﺗﻲ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻧﺘﻴﺠﻪ داﺧﻞ ﭘﺮاﻧﺘﺰ ﺑﺮاﺑﺮ ﺑـﺎ trueﺑﺎﺷـﺪ .ﻣﻤﻜـﻦ اﺳﺖ ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ در اﺑﺘﺪا ﻣﻘﺪاري ﮔﻴﺞ ﻛﻨﻨﺪه ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ ،اﻣﺎ ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﺳﻮاﻟﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﭘﺮﺳﻴﺪه ﻣﻴﺸﻮد اﻳﻦ اﺳﺖ ﻛﻪ "آﻳﺎ ﻣﻘﺪار strNameﻣﺨﺎﻟﻒ Gretchenاﺳﺖ؟" .در اﻳﻦ ﺣﺎﻟﺖ ﭘﺎﺳـﺦ ﺑـﻪ ﺻـﻮرت "ﺑﻠـﻪ ،ﻣﻘـﺪار strNameﻣﺨـﺎﻟﻒ ﺑـﺎ Gretchenاﺳﺖ" ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﭘﺎﺳﺦ اﻳﻦ ﺳﻮال ﺑﻪ ﺻﻮرت ﺑﻠﻪ اﺳﺖ ﻛﻪ trueارزﻳﺎﺑﻲ ﻣﻴـﺸﻮد .دﻗـﺖ ﻛﻨﻴـﺪ ﻛـﻪ اﮔـﺮ ﻣﻘﺪار Gretchenرا در TextBoxوارد ﻛﻨﻴﺪ ،ﻣﻘﺪار ﺷﺮط ﺑﺮاﺑﺮ ﺑﺎ ﻏﻠﻂ ﺧﻮاﻫﺪ ﺑﻮد و دﺳﺘﻮرات ﺑﻼك ifاﺟﺮا ﻧﺨﻮاﻫﻨﺪ ﺷﺪ. ﻧﻜﺘﻪ :اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﺘﻦ Gretchenرا در TextBoxوارد ﻛﻨﻴﺪ ،ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺣﺘﻤﺎ اﻳﻦ ﻣﺘﻦ ﺑﻪ ﻫﻤﺎن ﺻـﻮرت ﻛـﻪ در ﻛﺪ ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد ﻧﻮﺷﺘﻪ ﺷﻮد )در اﻳﻨﺠﺎ ﺑﺎ Gﺑﺰرگ( .زﻳﺮا ﺑﺮرﺳﻲ ﺷﺮط در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﺣﺮوف اﻧﺠﺎم ﻣﻲ ﺷـﻮد و اﮔﺮ ﻓﺮﺿﺎً ﻋﺒﺎرت gretchenرا وارد ﻛﻨﻴﺪ ،دو ﻣﻘﺪار ﺑﺮاﺑﺮ ﻧﺨﻮاﻫﺪ ﺑﻮد و ﻣﺠﺪدا ﻛﺎدر ﻣﺘﻨﻲ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
١١٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :ﻋﻼﻣﺖ ! در C#ﺑﺮاي ﻣﻌﻜﻮس ﻛﺮدن ﻣﻘﺪار ﻳﻚ ﺷﺮط ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺣﺎﺻﻞ ﺷﺮﻃﻲ ﺑﺮاﺑﺮ ﺑـﺎ trueﺑﺎﺷـﺪ و ﻗﺒﻞ از آن از ﻋﻤﻠﮕﺮ ! اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻧﺘﻴﺠﻪ ﺑﺮاﺑﺮ falseارزﻳﺎﺑﻲ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ strNameﺑﺮاﺑـﺮ ﺑـﺎ Robbinﺑﺎﺷﺪ ،ﺣﺎﺻﻞ ﻋﺒﺎرت زﻳﺮ falseﺧﻮاﻫﺪ ﺑﻮد: ))"if (!(strName == "Robbin ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻋﻤﻠﮕﺮ ﻣﺨﺎﻟﻒ در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ را ﻣﻲ ﺗﻮان ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻮﺷﺖ: ))"if (!(strName == "Gretchen
اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي ﻣﻘﺎﻳﺴﻪ اي: در اﻳﻦ ﺑﺨﺶ ﭼﻬﺎر ﻋﻤﻠﮕﺮ ﻣﻘﺎﻳﺴﻪ اي دﻳﮕﺮ را ﻣﻌﺮﻓﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﻫﺎي ﺑﻌﺪي ﺑﺎ اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﺪ:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻛﻮﭼﻜﺘﺮ (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ If Demoدر ﺣﺎل اﺟﺮا اﺳـﺖ ،آن را ﺑﺒﻨﺪﻳـﺪ .ﻗـﺴﻤﺖ ﻃﺮاﺣـﻲ ﻓـﺮم را ﺑـﺮاي Form1ﺑـﺎز ﻛﻨﻴـﺪ ،ﻳـﻚ TextBoxﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ و ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ txtValueﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﻳـﻚ Button دﻳﮕﺮ ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnCheckNumberو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ Check Numbersﻗﺮار دﻫﻴﺪ. (2روي ﻛﻨﺘﺮل Buttonدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: private void btnCheckNumber_Click(object sender, )EventArgs e { // Declare variable ;int intNumber = 0 try { // Get the number from the text box ;)intNumber = Int32.Parse(txtValue.Text } catch { } ?// Is intNumber less than 27 )if (intNumber < 27 MessageBox.Show("Is ‘intNumber’ less than 27? " + ;)""Yes!", "If Demo ١١٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
else MessageBox.Show("Is ‘intNumber’ less than 27? " + ;)""No!", "If Demo } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻋﺪدي را در TextBoxوارد ﻛﺮده و روي دﻛﻤﻪ Check Numbersﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻛـﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺑﻪ ﺷﻤﺎ ﻣﻴﮕﻮﻳﺪ ﻋﺪد وارد ﺷﺪه در TextBoxﺑﺰرﮔﺘﺮ از 27اﺳﺖ ﻳﺎ ﻧﻪ؟ )ﺷﻜﻞ (4-4
ﺷﻜﻞ 4-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﺑﺘﺪا ﺑﺎﻳﺪ ﻣﻘﺪار ﻋﺪدي وارد ﺷﺪه در TextBoxرا ﺑﺪﺳﺖ آورد .ﺑﺮاي اﻳﻦ ﻛﺎر اﺑﺘﺪا ﺑﺎﻳـﺪ ﻣﻄﻤـﺌﻦ ﺷـﻮﻳﻢ ﻣـﺘﻦ داﺧـﻞ TextBoxﺷﺎﻣﻞ ﻋﺪد اﺳﺖ .زﻳﺮا ﻛﺎرﺑﺮ ﺑﺮﻧﺎﻣﻪ آزاد اﺳﺖ ﻛﻪ ﻫﺮ ﻣﺘﻨﻲ را در اﻳﻨﺠﺎ وارد ﻛﻨﺪ ،و ﻣﻤﻜﻦ اﺳﺖ ﻣـﺘﻦ وارد ﺷـﺪه ﺷـﺎﻣﻞ ﻫﻴﭻ ﻋﺪدي ﻧﺒﺎﺷﺪ ﻛﻪ در اﻳﻦ ﺣﺎﻟﺖ ﺑﺮﻧﺎﻣﻪ در ﺗﺒﺪﻳﻞ آن ﺑﻪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺑﺎ ﺷﻜﺴﺖ ﻣﻮاﺟﻪ ﻣﻲ ﺷـﻮد و ﺑﻘﻴـﻪ ﻛـﺪ اﺟـﺮا ﻧﻤـﻲ ﺷـﻮد. ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﻛﺪي را ﺑﺮاي ﻣﺪﻳﺮﻳﺖ اﻳﻦ اﺳﺘﺜﻨﺎ ﻫﺎ وارد ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ اﮔـﺮ ﻛـﺎرﺑﺮ ﻣﻘـﺪاري ﻏﻴـﺮ از ﻋـﺪد وارد ﻛـﺮد ﻣﺘﻐﻴﻴـﺮ intNumberﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺷﻮد ،در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻋﺪد وارد ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ در آن ﻗﺮار ﮔﻴﺮد. // Declare variable ;int intNumber = 0 try { // Get the number from the text box ;)intNumber = Int32.Parse(txtValue.Text } catch { } ﻧﻜﺘﻪ :دﺳﺘﻮر try…catchدر ﻓﺼﻞ 11ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد ،ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ ﻣﻴﺘﻮاﻧﻴـﺪ از آن ﺻـﺮف ﻧﻈـﺮ ﻛﻨﻴﺪ. ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ رﺷﺘﻪ ﻛﻪ ﺷﺎﻣﻞ ﻋﺪد اﺳﺖ ﺑﻪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺑﺎﻳﺪ از ﺗﺎﺑﻊ Parseدر Int32اﺳﺘﻔﺎده ﻛﻨﻴـﺪ .اﻳـﻦ ﺗـﺎﺑﻊ ﻳـﻚ رﺷﺘﻪ را ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﻋﺪد اﺳﺖ درﻳﺎﻓﺖ ﻛﺮده و ﻋﺪد ﻣﻌﺎدل آن را ﺑﺮﻣﻴﮕﺮداﻧﺪ .اﮔﺮ رﺷﺘﻪ اي ﻛﻪ ﺑﻪ اﻳﻦ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎده ﻣـﻲ ﺷـﻮد ﺷـﺎﻣﻞ ﻋﺪد ﻧﺒﺎﺷﺪ ،ﻳﺎ ﺣﺘﻲ داراي ﻛﺎراﻛﺘﺮي ﻏﻴﺮ ﻋﺪدي ﺑﺎﺷﺪ ،ﺗﺎﺑﻊ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﺷﺪه و اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﺘﻮﻗﻒ ﻣﻲ ﺷﻮد.
١١٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﺑﺨﺶ ﺑﻌﺪي ،ﺑﻪ وﺳﻴﻠﻪ دﺳﺘﻮر ifﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻋﺪد وارد ﺷﺪه در TextBoxﺑﺰرﮔﺘﺮ از 27اﺳﺖ ﻳﺎ ﻧﻪ و ﺑـﺮ اﺳـﺎس آن ﭘﻴﻐﺎم ﻣﻨﺎﺳﺒﻲ را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ. ?// Is intNumber less than 27 )if (intNumber < 27 MessageBox.Show("Is ‘intNumber’ less than 27? " + ;)""Yes!", "If Demo else MessageBox.Show("Is ‘intNumber’ less than 27? " + ;)""No!", "If Demo ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ،در اﻳﻦ ﻗﺴﻤﺖ ﭼﻮن ﻫﻢ در ﺑﺨﺶ ifو ﻫﻢ در ﺑﺨﺶ elseﻓﻘـﻂ ﻳـﻚ دﺳـﺘﻮر وارد ﺷـﺪه اﺳﺖ ﻧﻴﺎزي ﺑﻪ اﺳﺘﻔﺎده از آﻛﻮﻻد در اﺑﺘﺪا و اﻧﺘﻬﺎي دﺳﺘﻮر ﻧﻴﺴﺖ. ﺟﺎﻟﺐ اﻳﻨﺠﺎﺳﺖ ﻛﻪ اﮔﺮ دﻗﻴﻘﺎ ﻣﻘﺪار 27را در TextBoxوارد ﻛﻨﻴﺪ ،ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻋـﺪد ﻛـﻮﭼﻜﺘﺮ از 27ﻧﻴـﺴﺖ .زﻳـﺮا ﻋﻤﻠﮕـﺮ ﻛﻮﭼﻜﺘﺮ ﻓﻘﻂ در ﺻﻮرﺗﻲ ﻣﻘﺪار trueرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ ﻋﺪد ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ ،ﻧﻪ ﺑﺰرﮔﺘﺮ ﻳﺎ ﻣﺴﺎوي .ﺑﺮاي اﻳﻨﻜﻪ ﺷﺮط ﺑﺎﻻ ﺧـﻮد ﻋـﺪد 27را ﻧﻴﺰ ﺷﺎﻣﻞ ﺷﻮد ﺑﺎﻳﺪ از ﻋﻤﻠﮕﺮ ﻛﻮﭼﻜﺘﺮ ﻣﺴﺎوي اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ﺷﺮح داده ﺷﺪه اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي (1ﻛﺪ ﻣﻮﺟﻮد در روﻳﺪاد Clickﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل Buttonدر ﻗﺴﻤﺖ ﻗﺒﻠﻲ را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: // Declare variable ;int intNumber try { // Get the number from the text box ;)intNumber = Int32.Parse(txtValue.Text } catch { } ?// Is intNumber less than or equal to 27 )if (intNumber <= 27 MessageBox.Show("Is ‘intNumber’ less than or " + ;)""equal to 27? Yes!", "If Demo else MessageBox.Show("Is ‘intNumber’ less than or " + ;)""equal to 27? No!", "If Demo
١١٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(2ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻋﺪد 27را در TextBoxوارد ﻛﻨﻴﺪ .روي دﻛﻤﻪ Check Numbersﻛﻠﻴـﻚ ﻛﻨﻴـﺪ. ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 5-4ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 5-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺗﻨﻬﺎ ﺗﻔﺎوﺗﻲ ﻛﻪ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﺴﺒﺖ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ دارد اﻳﻦ اﺳﺖ ﻛﻪ ﺷﺮط دﺳﺘﻮر ifﺧﻮد ﻋﺪد 27را ﻧﻴﺰ ﺷﺎﻣﻞ ﻣﻲ ﺷﻮد .ﻳﻌﻨـﻲ اﮔـﺮ در ﺟﻌﺒﻪ ﻣﺘﻨﻲ ﻋﺪد 27وارد ﻛﻨﻴﺪ ،ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 4-5را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. دو ﻋﻤﻠﮕﺮ دﻳﮕﺮ ﻣﺸﺎﺑﻪ ﻋﻤﻠﮕﺮ ﻫﺎي ﻗﺒﻠﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ در ﺑﺨﺶ ﺑﻌﺪي آﻧﻬﺎ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﺑﺰرﮔﺘﺮ و ﺑﺰرﮔﺘﺮ ﻣﺴﺎوي (1روﻳﺪاد Clickﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل Buttonرا ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: ?// Is intNumber less than or equal to 27 )if (intNumber <= 27 MessageBox.Show("Is ‘intNumber’ less than or" + ;)""equal to 27? Yes!", "If Demo else MessageBox.Show("Is ‘intNumber’ less than or" + ;)""equal to 27? No!", "If Demo ?// Is intNumber greater than 27 ) if (intNumber > 27 MessageBox.Show("Is ‘intNumber’ greater than" + ;)""27? Yes!", "If Demo else MessageBox.Show("Is ‘intNumber’ greater than" + ;)""27? No!", "If Demo ?// Is intNumber greater than or equal to 27 )if( intNumber >= 27
١٢٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
MessageBox.Show("Is ‘intNumber’ greater than" + "or equal to 27? Yes!", "If ;)"Demo else MessageBox.Show("Is ‘intNumber’ greater than" + ;)""or equal to 27? No!", "If Demo (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻣﻘﺪار 99را در ﺟﻌﺒﻪ ﻣﺘﻨﻲ وارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ Check Numbersﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺳﻪ ﻛﺎدر ﭘﻴﻐﺎم ﻣﺘﻮاﻟﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .در ﻛﺎدر ﭘﻴﻐﺎم اول ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﺪد ﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي 27ﻧﻴﺴﺖ .در ﻛـﺎدر ﭘﻴﻐﺎم دوم و ﺳﻮم ﺑﻪ ﺗﺮﺗﻴﺐ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻋﺪد ﺑﺰرﮔﺘﺮ و ﻫﻤﭽﻨﻴﻦ ﺑﺰرﮔﺘﺮ ﻣﺴﺎوي 27اﺳﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻋﻤﻠﮕﺮ ﻫﺎي ﺑﺰرﮔﺘﺮ و ﺑﺰرﮔﺘﺮ ﻣﺴﺎوي دﻗﻴﻘﺎ ﺑﺮ ﻋﻜﺲ ﻋﻤﻠﮕﺮ ﻛﻮﭼﻜﺘﺮ و ﻛﻮﭼﻜﺘﺮ ﻣﺴﺎوي ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ .ﺳـﻮاﻻﺗﻲ ﻛـﻪ در اﻳـﻦ ﻗـﺴﻤﺖ ﺑﺮاي ﺷﺮط ifﻣﻲ ﭘﺮﺳﻴﺪ ﺑﻪ ﺻﻮرت "آﻳﺎ intNumberﺑﺰرﮔﺘﺮ از 27اﺳﺖ؟" و " آﻳﺎ intNumberﺑﺰرﮔﺘﺮ ﻳـﺎ ﻣـﺴﺎوي 27اﺳﺖ؟" ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﺮ اﺳﺎس ﭘﺎﺳﺦ آﻧﻬﺎ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺷﺮط ifاﺟﺮا ﻣﻲ ﺷﻮد.
ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﻣﻨﻄﻘﻲ: 1 در ﺑﻌﻀﻲ از ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﺟﺎي ﻳﻚ ﺷﺮط ،ﭼﻨﺪ ﺷﺮط را در دﺳﺘﻮر ifﺑﺮرﺳﻲ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺧﻮاﻫﻴـﺪ ﺑﺪاﻧﻴـﺪ آﻳﺎ intNumberﺑﺰرﮔﺘﺮ از 27و ﻛﻮﭼﻜﺘﺮ از 10اﺳﺖ ﻳﺎ ﻧﻪ و ﻳﺎ ﻣﻴﺨﻮاﻫﻴﺪ ﺑﺪاﻧﻴﺪ آﻳﺎ strNameﺑﺮاﺑﺮ " "Sydneyو ﻳﺎ " "Stephanieاﺳﺖ ﻳﺎ ﻧﻪ .در اﻳﻦ ﻣﻮارد ﻣﻴﺘﻮاﻧﻴﺪ ﺷﺮﻃﻬﺎي درون دﺳﺘﻮر ifرا ﺑﻪ وﺳﻴﻠﻪ ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﻣﻨﻄﻘﻲ ﺗﺮﻛﻴﺐ ﻛﻨﻴﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،روش اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ Orرا ﺧﻮاﻫﻴﻢ دﻳﺪ .ﻧﺘﻴﺠﻪ ﺗﺮﻛﻴﺐ ﭼﻨﺪ ﺷﺮط ﺑﻪ وﺳـﻴﻠﻪ اﻳـﻦ ﻋﻤﻠﮕـﺮ ﻓﻘـﻂ ﻫﻨﮕﺎﻣﻲ درﺳﺖ ﻛﻪ ﺣﺪاﻗﻞ ﻳﻜﻲ از ﺷﺮوط ﺑﺮاﺑﺮ ﺑﺎ درﺳﺖ ﺑﺎﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي Andو Or (1ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم And Or Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1دو ﻛﻨﺘﺮل TextBoxو ﻳﻚ ﻛﻨﺘﺮل Buttonاﺿﺎﻓﻪ ﻛﻨﻴـﺪ .ﺧﺎﺻـﻴﺖ Nameﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮﻟﻬﺎي TextBoxرا ﺑﺮاﺑﺮ txtName1و txtName2و ﺧﺎﺻـﻴﺖ Nameﻛﻨﺘـﺮل Buttonرا ﺑﺮاﺑﺮ btnOrCheckﻗﺮار دﻫﻴﺪ. (3ﺧﺎﺻﻴﺖ Textﻣﺮﺑﻮط ﺑﻪ TextBoxاول را ﺑﺮاﺑﺮ Sydneyو TextBoxدوم را ﺑﺮاﺑـﺮ Stephanie ﻗﺮار دﻫﻴﺪ .در آﺧﺮ ﺧﺎﺻﻴﺖ Textﻛﻨﺘﺮل Buttonرا ﺑﺮاﺑﺮ Or Checkﻗﺮار دﻫﻴﺪ .ﺑﻌﺪ از اﻳـﻦ ﺗﻨﻈﻴﻤـﺎت ﻓـﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 6-4ﺑﺎﺷﺪ.
1در ﻣﻘﺎﺑﻞ ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﻣﻨﻄﻘﻲ ،ﻋﻤﻠﮕﺮ ﻫﺎي Andو Orﺑﻴﺘﻲ ﻧﻴﺰ وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﺮاي اﻳﺠﺎد ﺗﻐﻴﻴﺮات روي ﺑﻴﺘﻬﺎ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ.
١٢١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
6-4 ﺷﻜﻞ
. آن وارد ﻛﻨﻴﺪClick دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در روﻳﺪادOr Check ( روي دﻛﻤﻪ4 private void btnOrCheck_Click(object sender, EventArgs e) { // Declare variables string strName1 , strName2; // Get the names strName1 = txtName1.Text; strName2 = txtName2.Text; // Is one of the names Sydney? if (strName1 == "Sydney" || strName2 == "Sydney") MessageBox.Show("One of the names is Sydney.", "And Or Demo"); else MessageBox.Show("Neither of the names is Sydney.", "And Or Demo"); } . ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد7-4 ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﺑﻪ ﺷﻜﻞ. ﻛﻠﻴﻚ ﻛﻨﻴﺪOr Check ( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ5
7-4 ﺷﻜﻞ
١٢٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(6روي دﻛﻤﻪ OKﺑﺮ روي ﻛﺎدر ﭘﻴﻐﺎم ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ ﻓـﺮم اﺻـﻠﻲ ﺑﺮﮔﺮدﻳـﺪ .ﺣـﺎل ﻣـﺘﻦ داﺧـﻞ TextBoxاول را ﺑـﻪ Stephanieو ﻣﺘﻦ ﺟﻌﺒﻪ ﻣﺘﻨﻲ دوم را ﺑﻪ Sydneyﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻣﺠـﺪدا روي دﻛﻤـﻪ Or Checkﻛﻠﻴـﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﻲ ﮔﻮﻳﺪ ﻳﻜﻲ از TextBoxﻫﺎ ﺷﺎﻣﻞ Sydneyاﺳﺖ. (7ﻣﺠﺪدا روي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ و در ﺻﻔﺤﻪ اﺻﻠﻲ ﻣﺘﻦ ﻫﺎي داﺧﻞ ﺻﻔﺤﻪ را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛـﻪ ﻫـﻴﭻ ﻳـﻚ از آﻧﻬـﺎ ﺷﺎﻣﻞ Sydneyﻧﺒﺎﺷﺪ و روي دﻛﻤﻪ Or Checkﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣـﻲ ﮔﻮﻳـﺪ ﻫﻴﭻ ﻳﻚ از آﻧﻬﺎ ﺷﺎﻣﻞ Sydneyﻧﻴﺴﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻋﻤﻠﮕﺮ || در C#ﺑﻪ ﻋﻨﻮان "ﻳﺎ" ﻣﻨﻄﻘﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد و ﻣﻌﻤﻮﻻً در ﺑﺮرﺳﻲ ﺷﺮط ﻫﺎ ،ﺑﺮاي ﺗﺮﻛﻴﺐ دو ﺷﺮط ﻣﺘﻔﺎوت از ﻫﻢ ﺑﻪ ﻛﺎر ﻣﻲ رود .در روﻳﺪاد ،Clickاﺑﺘﺪا دو ﻣﺘﻐﻴﻴﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ و ﺳﭙﺲ ﻣﻘﺎدﻳﺮي ﻛﻪ ﻛﺎرﺑﺮ در TextBoxﻫﺎ وارد ﻛـﺮده اﺳـﺖ را آﻧﻬﺎ ﻗﺮار ﻣﻲ دﻫﻴﻢ. // Declare variables ;string strName1 , strName2 // Get the names ;strName1 = txtName1.Text ;strName2 = txtName2.Text ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺒﻴﻨﻴﺪ در اﻳﻦ ﻗﺴﻤﺖ ﻫﺮ دوي ﻣﺘﻐﻴﻴﺮ ﻫﺎ در ﻳﻚ ﺧﻂ ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ .در C#اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﭼﻨﺪ ﻣﺘﻐﻴﻴﺮ از ﻳﻚ ﻧﻮع داﺷـﺘﻪ ﺑﺎﺷﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻫﻤﻪ آﻧﻬﺎ را ﻫﻤﺎﻧﻨﺪ ﻛﺪ ﺑﺎﻻ در ﻳﻚ ﺧﻂ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﻓﻘﻂ ﺑﺎﻳﺪ ﻧﺎم آﻧﻬﺎ را ﺑﺎ وﻳﺮﮔﻮل از ﻫﻢ ﺟﺪا ﻛﻨﻴﺪ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﻓﺸﺮده ﺗﺮ ﺷﻮد و ﺗﻔﺎوﺗﻲ ﺑﺎ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﻫﺎ در ﺧﻄﻬﺎي ﺟﺪاﮔﺎﻧﻪ ﻧﺪارد. ﺣﺎل ﻛﻪ ﻫﺮ دو ﻧﺎم را از داﺧﻞ TextBoxﻫﺎ ﺑﻪ دﺳﺖ آوردﻳﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ آﻧﻬﺎ را در ﻳﻚ ﺷﺮط ifﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕـﺮ || ﺗﺮﻛﻴـﺐ ﻛﻨﻴﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﺳﻮاﻟﻲ ﻛﻪ ﺷﻤﺎ در ﺑﺨﺶ ﺷﺮط ifاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ﺑﻪ ﺻﻮرت "آﻳﺎ ﻣﻘﺪار strName1ﺑﺮاﺑـﺮ ﺑـﺎ Sydney اﺳﺖ و ﻳﺎ ﻣﻘﺪار strName2ﺑﺮاﺑﺮ ﺑﺎ Sydneyاﺳﺖ؟" ﺧﻮاﻫﺪ ﺑﻮد .در اﻳﻦ ﺣﺎﻟﺖ ﻣﻘﺪار ﻫﺮ ﻳﻚ از اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻛـﻪ ﺑﺮاﺑـﺮ ﺑـﺎ Sydneyﺑﺎﺷﺪ ﻣﻮﺟﺐ ﻣﻴﺸﻮد ﻛﻪ ﭘﺎﺳﺦ ﺳﻮال ﺑﺮاﺑﺮ ﺑﺎ trueو ﻳﺎ درﺳﺖ ﺑﺎﺷﺪ. ?// Is one of the names Sydney )"if (strName1 == "Sydney" || strName2 == "Sydney MessageBox.Show("One of the names is Sydney.", ;)""And Or Demo else MessageBox.Show("Neither of the names is Sydney.", ;)""And Or Demo
اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ Andﻣﻨﻄﻘﻲ:
١٢٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻢ ﻣﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ Orﻣﻨﻄﻘﻲ اﺳﺖ ﺑﻪ ﺟﺰ اﻳﻨﻜﻪ ﺑﺮاي درﺳﺖ ﺑﻮدن ﺷﺮط آن ،ﺑﺎﻳﺪ ﺗﻚ ﺗﻚ ﺷﺮط ﻫﺎ درﺳﺖ ارزﻳـﺎﺑﻲ ﺷـﻮﻧﺪ. ﻋﻼﻣﺖ اﻳﻦ ﻋﻤﻠﮕﺮ در C#ﺑﻪ ﺻﻮرت && اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ Andﻣﻨﻄﻘﻲ (1ﻛﻨﺘﺮل Buttonدﻳﮕـﺮي ﺑـﻪ ﻓـﺮم اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnAndCheckو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ And Checkﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﺮده و ﻛﺪ ﻣـﺸﺨﺺ ﺷـﺪه در زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: )private void btnAndCheck_Click(object sender, EventArgs e { // Declare variables ;string strName1, strName2 // Get the names ;strName1 = txtName1.Text ;strName2 = txtName2.Text ?// Are both names Sydney )"if( strName1 =="Sydney" && strName2 =="Sydney MessageBox.Show("Both names are Sydney.", ;)""And Or Demo else MessageBox.Show("One of the names is not" + ;)""Sydney.","And Or Demo } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ And Checkﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛـﺎدر ﭘﻴﻐـﺎﻣﻲ را ﺧﻮاﻫﻴـﺪ دﻳـﺪ ﻛـﻪ ﻣـﻲ ﮔﻮﻳـﺪ ﻳﻜـﻲ از TextBoxﻫﺎ ﺷﺎﻣﻞ Sydneyﻧﻴﺴﺖ. (3اﻟﺒﺘﻪ اﮔﺮ ﻣﺘﻦ داﺧﻞ ﻫﺮ دو TextBoxرا ﺑﻪ Sydneyﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 8-4را ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﺷﻜﻞ 8-4
١٢٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻨﺠﺎ ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ && ﻣﻲ. آﻧﻬﺎ را ﺑﺎ ﻫﻢ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻴﺪ، را ﺑﺪﺳﺖ آوردﻳﺪTextBox ﺑﻌﺪ از اﻳﻨﻜﻪ ﻧﺎﻣﻬﺎي ﻣﻮﺟﻮد در واﺿﺢ اﺳﺖ ﺟـﻮاب اﻳـﻦ ﺳـﻮال."اﺳﺖ؟Sydney ﺑﺮاﺑﺮ ﺑﺎstrName2 وSydney ﺑﺮاﺑﺮ ﺑﺎstrName1 ﭘﺮﺳﻴﺪ "آﻳﺎ . ﺑﺎﺷﻨﺪSydney ﻣﺤﺘﻮي ﻛﻠﻤﻪTextBox ﻫﻨﮕﺎﻣﻲ درﺳﺖ اﺳﺖ ﻛﻪ ﻫﺮ دو // Are both names Sydney? if( strName1 =="Sydney" && strName2 =="Sydney") MessageBox.Show("Both names are Sydney.", "And Or Demo"); else MessageBox.Show("One of the names is not" + "Sydney.","And Or Demo");
: ﻣﻨﻄﻘﻲOr وAnd ﻣﻄﺎﻟﺐ ﺑﻴﺸﺘﺮ در راﺑﻄﻪ ﺑﺎ ﻋﻤﻠﮕﺮ ﻫﺎي اﻣﺎ ﻣﻴﺘﻮاﻧﻴﺪ اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ را ﺑﺎ اﻋﺪاد ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ زﻳﺮ ﺑﻪ، در رﺷﺘﻪ ﻫﺎ آﺷﻨﺎ ﺷﺪه اﻳﺪOr وAnd ﺗﺎﻛﻨﻮن ﺑﺎ ﻧﺤﻮه اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي :ﻛﺎر ﺑﺒﺮﻳﺪ
+
if( intX == 2 && dblY == 2.3) MessageBox.Show("Hello, the conditions has been" "satisfied!"); :ﻳﺎ if( intX == 2 || dblY == 2.3) MessageBox.Show("Hello, the conditions have been" + "satisfied!");
ﻣﻴﺘﻮاﻧﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﺧـﻮد، ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ. ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ ﻧﻴﺴﺖif در ﻳﻚ دﺳﺘﻮرOr وAnd ﻫﻤﭽﻨﻴﻦ در اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ ﻫﺎي :دﺳﺘﻮري ﻣﺸﺎﺑﻪ زﻳﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ if( intA == 1 && intB == 2 && intC intE == 5 && intF == 6 && intG intI == 2 && intJ == 3 && intK intM == 6 && intN == 7 && intO intQ == 3 && intR == 4 && intS intU == 7 && intV == 1 && intW intY == 4 && intZ == 5) MessageBox.Show("That’s quite
١٢٥
www.pupuol.com
== == == == == ==
3 7 4 1 5 2
&& && && && && &&
intD intH intL intP intT intX
== == == == == ==
4 1 5 2 6 3
&& && && && && &&
an If statement!");
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻟﺒﺘﻪ ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﺳﺘﻔﺎده زﻳﺎد از اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ از ﺧﻮاﻧﺎﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﻛﺎﻫﺪ و درك آن را ﻣﺸﻜﻞ ﺗﺮ ﻣﻲ ﻛﻨﺪ .ﭘﺲ ﺗﺎ ﺣـﺪ اﻣﻜﺎن ﺑﺎﻳﺪ از ﺷﺮﻃﻬﺎي ﻛﻤﺘﺮ در دﺳﺘﻮر ifﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﻤﭽﻨﻴﻦ ﻣﻴﺘﻮاﻧﻴﺪ از ﭼﻨﺪ ﻋﻤﻠﮕﺮ Andو Orدر ﺷﺮط ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﻣﻮاﻗﻊ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﭘﺮاﻧﺘﺰﻫﺎ اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ را دﺳﺘﻪ ﺑﻨﺪي ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺧﻮاﻫﻴﺪ اﮔﺮ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮي ﺑﻴﻦ 10ﺗﺎ 20و ﻳﺎ ﺑﻴﻦ 25ﺗﺎ 30ﺑﺎﺷﺪ ،دﺳﺘﻮرات داﺧﻞ ﺷﺮط اﺟﺮا ﺷﻮﻧﺪ. در اﻳﻦ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻴﺪ از دﺳﺘﻮر ifزﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: ))if( (intX > 10 && intX < 20) || (intX > 25 && intX < 30 ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻔﻲ ﺑﺮاي ﺗﺮﻛﻴﺐ ﻋﻤﻠﮕﺮﻫﺎ در ﻫﺮ زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ وﺟﻮد دارد و ﺗﻌﺪاد آﻧﻬﺎ ﺑﻴﺸﺘﺮ از آن اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﻴﻢ آﻧﻬـﺎ را در اﻳـﻦ ﻛﺘﺎب ﻋﻨﻮان ﻛﻨﻴﻢ .اﻣﺎ ﺑﺪاﻧﻴﺪ ﻛﻪ ﻫﺮ ﺷﺮﻃﻲ را ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ﻳﻚ ﺗﺮﻛﻴﺐ از اﻳﻦ ﻋﻤﮕﺮﻫﺎ وﺟﻮد دارد ﻛﻪ ﻧﻴﺎز ﺷـﻤﺎ را ﺑﺮﻃـﺮف ﻛﻨﺪ.
ﻣﻘﺎﻳﺴﻪ رﺷﺘﻪ ﻫﺎ: ﻣﻌﻤﻮﻻ ﻫﻨﮕﺎﻣﻲ ﻛﻪ در دﺳﺘﻮرات ifرﺷﺘﻪ ﻫﺎ را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻴﺪ ،ﺑﻪ ﻋﻠﺖ ﺣﺴﺎﺳﻴﺖ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ و ﺑـﺰرگ ﺑـﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮﻳﺪ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻫﺮ دو ﻛﺎراﻛﺘﺮ " "aو " "Aﺑﺮاي اﻧﺴﺎﻧﻬﺎ ﻳﻚ ﻣﻌﻨﻲ را دارﻧﺪ و ﻳﻜﺴﺎن ﺗﻠﻘﻲ ﻣﻲ ﺷـﻮﻧﺪ ،اﻣـﺎ در ﻛﺎﻣﭙﻴﻮﺗﺮ دو ﻛﺎراﻛﺘﺮ ﻣﺠﺰا از ﻳﻜﺪﻳﮕﺮ ﻫﺴﺘﻨﺪ .اﻳﻦ ﻣﻮرد ﺑﻪ ﻋﻨﻮان ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻛﺪ زﻳﺮ را در ﺑﺮﻧﺎﻣﻪ ﺧﻮد اﺟﺮا ﻛﻨﻴﺪ ،ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻧﺨﻮاﻫﺪ ﺷﺪ: ;"string strName = "winston )"if (strName == "WINSTON ;)"!MessageBox.Show("Aha! you are Winston ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺣﺪس زده ﺑﺎﺷﻴﺪ ،ﻛﻠﻤﻪ WINSTONﻛﻪ ﺑﺎ ﺣﺮوف ﺑﺰرگ اﺳـﺖ ﺑـﺎ ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ strNameﻛـﻪ ﺑـﺎ ﺣﺮوف ﻛﻮﭼﻚ اﺳﺖ ﺗﻔﺎوت دارد و ﺷﺮط اﺟﺮا ﻧﺨﻮاﻫﺪ ﺷﺪ .اﻣﺎ در ﺑﻴﺸﺘﺮ ﻣﻮاﻗﻊ ﺷﻤﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﺪ رﺷﺘﻪ ﻫﺎ را ﺑﻪ اﻳﻦ ﺻﻮرت ﺑﺮرﺳﻲ ﻛﻨﻴـﺪ، ﭘﺲ ﺑﺎﻳﺪ راﻫﻲ را ﭘﻴﺪا ﻛﻨﻴﺪ ﻛﻪ آﻧﻬﺎ را ﺑﻪ ﺣﺎﻟﺖ ﻋﺎدي و ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻧﻮع ﺣﺮوف ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،روﺷﻲ را ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻣﻘﺎﻳﺴﻪ رﺷﺘﻪ ﻫﺎ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻧﻮع ﺣﺮوف (1ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﻛﻨﺘﺮل Buttonدﻳﮕﺮي را ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴـﺪ .ﺧﺎﺻـﻴﺖ Name دﻛﻤﻪ ﻓﺮﻣﺎن را ﺑﺮاﺑﺮ btnStringCompareو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ Compare String ﻗﺮار دﻫﻴﺪ. (2روي ﻛﻨﺘﺮل Buttonدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: private void btnStringCompare_Click(object sender, )EventArgs e
١٢٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ // Declare variable ;string strName // Get the name ;strName = txtName2.Text // Compare the name )if (String.Compare(strName, "STEPHANIE", True) == 0 MessageBox.Show("Hello, Stephanie!", ;)""And Or Demo } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ اي ﻛﻪ ﺟﺪﻳﺪا اﺿﺎﻓﻪ ﻛﺮدﻳﺪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 9-4را ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛﺮد.
ﺷﻜﻞ 9-4 (4روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ و در TextBoxﻋﺒﺎرﺗﻲ را ﻣﺎﻧﻨﺪ STePHaniEﻳﺎ ﻫـﺮ ﺗﺮﻛﻴـﺐ دﻳﮕـﺮي از آن وارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ String Compareﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ ﻛﻪ ﻛﺎدر ﭘﻴﻐـﺎم ﻗـﺴﻤﺖ ﻗﺒـﻞ ﻣﺠـﺪدا ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﻌﺪ از اﻳﻨﻜﻪ اﺳﻢ ﻧﻮﺷﺘﻪ ﺷﺪه در TextBoxرا در ﻣﺘﻐﻴﻴـﺮ ﻗـﺮار دادﻳـﻢ ،ﺑـﻪ ﺟـﺎي اﺳـﺘﻔﺎده از ﻋﻤﻠﮕﺮ == ﺑﺮاي ﻣﻘﺎﻳﺴﻪ آﻧﻬﺎ ،از ﺗﺎﺑﻊ Compareدر System.Stringاﺳﺘﻔﺎده ﻣﻴﻜﻨﻴﻢ .اﻳﻦ ﺗﺎﺑﻊ ﺳﻪ ﭘﺎراﻣﺘﺮ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .ﭘﺎراﻣﺘﺮ اول و دوم رﺷﺘﻪ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺎﻳﺪ ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻣﻘﺎﻳﺴﻪ ﺷﻮﻧﺪ .در اﻳﻦ ﻣﺜﺎل ﺑـﺮاي ﭘـﺎراﻣﺘﺮ اول ﻣﻘـﺪار درون ﻣﺘﻐﻴﻴﺮ strNameو ﺑﺮاي ﭘﺎراﻣﺘﺮ دوم ﺛﺎﺑﺖ رﺷﺘﻪ اي " "STEPHANIEرا ﻓﺮﺳﺘﺎده اﻳﻢ .ﭘﺎراﻣﺘﺮ ﺳﻮم ﻫـﻢ ﺑـﺮاي ﺗـﺎﺑﻊ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ در ﻫﻨﮕﺎم ﻣﻘﺎﻳﺴﻪ ،ﻧﻮع ﺣﺮوف را ﻧﺎدﻳﺪه ﺑﮕﻴﺮد ﻳﺎ ﻧﻪ .در اﻳﻨﺠﺎ ﻣﻘﺪار trueﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛـﻪ ﺑﺰرﮔـﻲ و ﻳـﺎ
١٢٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻮﭼﻜﻲ ﺣﺮوف ﺑﻪ وﺳﻴﻠﻪ ﺗﺎﺑﻊ ﻧﺎدﻳﺪه ﮔﺮﻓﺘﻪ ﺷﻮﻧﺪ .اﮔﺮ ﻣﻘﺪار اﻳﻦ ﭘﺎراﻣﺘﺮ را ﺑﺮاﺑﺮ ﺑﺎ falseﻗﺮار دﻫﻴﺪ ،ﻋﻤﻠﻜﺮد اﻳﻦ ﺗﺎﺑﻊ دﻗﻴﻘﺎ ﻣـﺸﺎﺑﻪ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ == ﺧﻮاﻫﺪ ﺑﻮد. // Compare the name )if (String.Compare(strName, "STEPHANIE", True) == 0 MessageBox.Show("Hello, Stephanie!", ;)""And Or Demo
ﻧﺘﻴﺠﻪ اي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد ﻣﻘﺪاري ﻋﺠﻴﺐ اﺳﺖ .اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﺟﺎي ﻣﻘﺪار trueو ﻳﺎ ،falseﻳﻚ ﻋـﺪد ﺻﺤﻴﺢ را ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .در ﺣﻘﻴﻘﺖ اﻳﻦ ﺗﺎﺑﻊ ﻋﻼوه ﺑﺮ ﻣﺸﺨﺺ ﻛﺮدن ﺑﺮاﺑﺮي و ﻳﺎ ﻧﺎﺑﺮاﺑﺮي دو رﺷﺘﻪ ،ﻣﻲ ﺗﻮاﻧﺪ ﻣﺸﺨﺺ ﻛﻨﺪ ﻛﻪ در ﺻﻮرت ﻧﺎﺑﺮاﺑﺮي آﻧﻬﺎ ﻛﺪاﻣﻴﻚ ﺑﺰرﮔﺘﺮ ﻣﻲ ﺑﺎﺷﻨﺪ .اﮔﺮ ﻣﻘﺪار ﺻﻔﺮ ﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺑﺮﮔﺮداﻧﺪه ﺷﺪ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ دو رﺷﺘﻪ ﺑـﺎ ﻫﻢ ﺑﺮاﺑﺮﻧﺪ ،اﮔﺮ ﻋﺪد ﻣﻨﻔﻲ ﺑﺮﮔﺮداﻧﺪه ﺷﻮد ﻳﻌﻨﻲ رﺷﺘﻪ اول ﻛﻮﭼﻜﺘﺮ از رﺷﺘﻪ دوم اﺳﺖ و ﻋﺪد ﻣﺜﺒﺖ ﻧﻴﺰ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ رﺷـﺘﻪ اول ﺑﺰرﮔﺘﺮ از رﺷﺘﻪ دوم اﺳﺖ .از اﻳﻦ اﻋﺪاد ﻣﻴﺘﻮان ﺑﺮاي ﻧﻮﺷﺘﻦ اﻟﮕﻮرﻳﺘﻢ ﻫﺎي ﻣﺮﺗﺐ ﺳﺎزي و ﻳﺎ ﺟﺴﺘﺠﻮ اﺳﺘﻔﺎده ﻛﺮد.
اﻧﺘﺨﺎب ﺑﻴﻦ ﺣﺎﻟﺘﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از :switch در ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ﺑﺎﻳﺪ ﺷﺮط ﻫﺎﻳﻲ را ﻣﺸﺎﺑﻪ زﻳﺮ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ:
آﻳﺎ ﻧﺎم ﻣﺸﺘﺮي ﺑﺮاﺑﺮ ﺑﺎ Bryanاﺳﺖ؟ در اﻳﻦ ﺻﻮرت ﻋﻤﻞ Aرا اﻧﺠﺎم ﺑﺪه. آﻳﺎ ﻧﺎم ﻣﺸﺘﺮي ﺑﺮاﺑﺮ ﺑﺎ Stephanieاﺳﺖ؟ در اﻳﻦ ﺻﻮرت ﻋﻤﻞ Bرا اﻧﺠﺎم ﺑﺪه. آﻳﺎ ﻧﺎم ﻣﺸﺘﺮي ﺑﺮاﺑﺮ ﺑﺎ Cathyاﺳﺖ؟ در اﻳﻦ ﺻﻮرت ﻋﻤﻞ Cرا اﻧﺠﺎم ﺑﺪه. آﻳﺎ ﻧﺎم ﻣﺸﺘﺮي ﺑﺮاﺑﺮ ﺑﺎ Bettyاﺳﺖ؟ در اﻳﻦ ﺻﻮرت ﻋﻤﻞ Dرا اﻧﺠﺎم ﺑﺪه. آﻳﺎ ﻧﺎم ﻣﺸﺘﺮي ﺑﺮاﺑﺮ ﺑﺎ Edwardاﺳﺖ؟ در اﻳﻦ ﺻﻮرت ﻋﻤﻞ Eرا اﻧﺠﺎم ﺑﺪه.
اﮔﺮ ﺑﺨﻮاﻫﻴﺪ اﻳﻦ ﻛﺎر را ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر ifاﻧﺠﺎم دﻫﻴﺪ ،ﺑﺎﻳﺪ از ﻛﺪي ﻣﺸﺎﺑﻪ زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: )"if (Customer.Name == "Bryan // Do A )"else if(Customer.Name == "Stephanie // Do B )"else if(Customer.Name == "Cathy // Do C )"else if(Customer.Name == "Betty // Do D )"else if(Customer.Name == "Edward // Do E در اﻳﻦ ﺣﺎات اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﺑﻌﺪ از ﻣﺪﺗﻲ ﻛﺪ را ﺑﻪ ﺻﻮرﺗﻲ ﺗﻐﻴﺮ دﻫﻴﺪ ﻛﻪ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻧﺎم ﻣﺸﺘﺮي از ﻧﺎم ﻛﻮﭼﻚ او اﺳﺘﻔﺎده ﻛﻨﺪ ،ﭼﻪ ﻛــــﺎري ﺑﺎﻳــــﺪ ﺑﻜﻨﻴــــﺪ؟ در اﻳــــﻦ ﺣﺎﻟــــﺖ ﺑﺎﻳــــﺪ ﻋﺒــــﺎرت Customer.Nameرا در ﺗﻤــــﺎم دﺳــــﺘﻮرات ifﺑــــﻪ
١٢٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Customer.FirstNameﺗﻐﻴﺮ دﻫﻴﺪ ﻛﻪ ﻛﺎر ﺑﺴﻴﺎر وﻗﺖ ﮔﻴﺮي اﺳﺖ .ﻫﻤﭽﻨﻴﻦ اﺳﺘﻔﺎده از اﻳﻦ روش ﺧﻮاﻧﺎﻳﻲ ﺑﺮﻧﺎﻣﻪ را ﻧﻴﺰ ﻛﻢ ﻣﻲ ﻛﻨﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ﺑﺎ روﺷﻲ آﺷﻨﺎ ﻣﻴﺸﻮﻳﻢ ﻛﻪ ﺑﺘﻮاﻧﻴﻢ ﺑﻬﺘﺮ اﻳﻦ ﺷﺮط ﻫﺎ را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از دﺳﺘﻮر switch (1ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Switch Demoاﻳﺠﺎد ﻛﻨﻴﺪ .ﺳﭙﺲ ﺧﺎﺻـﻴﺖ Nameﻣﺮﺑـﻮط ﺑـﻪ ﻓـﺮم را ﺑﺮاﺑـﺮ Switchﻗﺮار دﻫﻴﺪ. (2ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ListBoxﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ،lstDataﺧﺎﺻـﻴﺖ Dockرا ﺑﻪ Fillو ﺧﺎﺻﻴﺖ IntegralHeightرا ﺑﻪ Falseﺗﻐﻴﻴﺮ دﻫﻴﺪ. (3ﻫﻨﮕﺎﻣﻲ ﻛـﻪ ﻛﻨﺘـﺮل ListBoxدر ﻓـﺮم اﻧﺘﺨـﺎب ﺷـﺪه اﺳـﺖ ،ﺑـﻪ ﭘﻨﺠـﺮه Propertiesﺑﺮوﻳـﺪ و ﺧﺎﺻـﻴﺖ String Itemsرا اﻧﺘﺨــﺎب ﻛﻨﻴــﺪ و ﺑــﺮ روي دﻛﻤــﻪ ﺳــﻤﺖ راﺳــﺖ آن ﻛﻠﻴــﻚ ﻛﻨﻴــﺪ .ﭘﻨﺠــﺮه اي ﺑــﻪ ﻧــﺎم Collection Editorﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ .ﻣﻄﺎﺑﻖ ﺷﻜﻞ ،10-4ﭘﻨﺞ ﻧﺎم ﻣﺨﺘﻠﻒ را در آن وارد ﻛﻨﻴﺪ.
ﺷﻜﻞ 10-4 (4ﺑﺮ روي ﻛﻠﻴﺪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻧﺎﻣﻬﺎ ﺑﻪ ListBoxاﺿﺎﻓﻪ ﺷﻮﻧﺪ .ﺳﭙﺲ ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑـﻮط ﺑﻪ روﻳﺪاد SelectedIndexChangedاﻳﺠﺎد ﺷﻮد .ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: private void lstData_SelectedIndexChanged(object sender, )EventArgs e { // Declare variables ;string strName ;"" = string strFavoriteColor // Get the selected name = strName ;)(lstData.Items[lstData.SelectedIndex].ToString // Use a Switch to get the favorite color // of the selected name ١٢٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
switch(strName) { case "Bryan": strFavoriteColor = "Madras Yellow"; break; case "Stephanie": strFavoriteColor = "Sea Blue"; break; case "Cathy": strFavoriteColor = "Morning Mist"; break; case "Betty": strFavoriteColor = "Passionate Purple"; break; case "Edward": strFavoriteColor = "Battleship Gray"; break; } // Display the favorite color of the selected name MessageBox.Show(strName + "‘s favorite color is " + strFavoriteColor, "Select Demo"); } ﻧﻤـﺎﻳﺶ داده11-4 ﻛـﺎدر ﭘﻴﻐـﺎﻣﻲ ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ، ﻛﻠﻴﻚ ﻛﻨﻴﺪListBox ﻫﺮ ﺑﺎر ﻛﻪ روي ﻧﺎﻣﻲ در.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ5 .ﺧﻮاﻫﺪ ﺷﺪ
11-4 ﺷﻜﻞ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻣﻮرد ﻧﻴـﺎز را ﺗﻌﺮﻳـﻒSelectedIndexChanged اوﻟﻴﻦ ﻛﺎري ﻛﻪ در روﻳﺪاد ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ آﻳﺘﻤـﻲ ﻛـﻪ ﺷـﻤﺎره آن ﺑﺮاﺑـﺮ ﺑـﺎ. اﻧﺘﺨﺎب ﺷﺪه اﺳﺖListBox ﺳﭙﺲ ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﻛﺪام ﻧﺎم در.ﻛﻨﻴﺪ
١٣٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺖ SelectedIndexاﺳﺖ را ﭘﻴﺪا ﻛﻨﻴﺪ و ﻣﺘﻦ داﺧﻞ آن آﻳﺘﻢ را در ﻣﺘﻐﻴﻴﺮ ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻛﺎر ﺑﻪ وﺳﻴﻠﻪ ﻛﺪ زﻳﺮ ﺻﻮرت ﻣﻲ ﮔﻴﺮد: // Declare variables ;string strName ;"" = string strFavoriteColor // Get the selected name = strName ;)(lstData.Items[lstData.SelectedIndex].ToString در اﻳــﻦ ﻗــﺴﻤﺖ از ﻛــﺪ ﺑــﻪ ﭼﻨــﺪ ﻧﻜﺘــﻪ ﺗﻮﺟــﻪ ﻛﻨﻴــﺪ .اول اﻳﻨﻜــﻪ ﻫﻤــﺎﻧﻄﻮر ﻛــﻪ ﻣــﺸﺎﻫﺪه ﻣــﻲ ﻛﻨﻴــﺪ ،ﻫﻨﮕــﺎم ﺗﻌﺮﻳــﻒ ﻣﺘﻐﻴﻴــﺮ strFavoriteColorﺑﻪ آن ﻣﻘﺪار اوﻟﻴﻪ داده اﻳﻢ .اﮔﺮ اﻳﻦ ﻣﻘﺪار اوﻟﻴﻪ را از ﻛﺪ ﺣﺬف ﻛﻨﻴﺪ ،ﺑﺮﻧﺎﻣﻪ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﺑﺎ ﺧﻄـﺎ ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮد. در C#ﻫﺮ ﻣﺘﻐﻴﻴﺮي ﻗﺒﻞ از اﺳﺘﻔﺎده ﺑﺎﻳﺪ داراي ﻣﻘﺪار اوﻟﻴﻪ ﺑﺎﺷﺪ و رﻋﺎﻳﺖ اﻳﻦ ﻣﻮرد در ﻛﺪ ،ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺮرﺳـﻲ ﻣـﻲ ﺷﻮد .ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺣﺘﻤﺎ ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از آﻧﻬﺎ و ﻫﻤﭽﻨﻴﻦ در ﺧﺎرج از ﺑﺨﺸﻬﺎﻳﻲ از ﻛﺪ ﻛﻪ ﻓﻘﻂ در ﺷـﺮاﻳﻂ ﺧـﺎص اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ )ﻫﻤﺎﻧﻨﺪ ﺑﻼك دﺳﺘﻮر ،(ifاﻧﺠﺎم ﺷﻮد. در اﻳﻦ ﻗﺴﻤﺖ ﻗﺒﻞ از اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﻪ آن ﻣﻘﺪار اوﻟﻴﻪ داده اﻳﻢ ،وﻟﻲ اﻳﻦ ﻛﺎر را در ﺑﻼك دﺳﺘﻮرات switchﻗﺮار داده اﻳـﻢ. ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻫﻴﭻ ﻳﻚ از ﺣﺎﻟﺘﻬﺎي دﺳﺘﻮر switchاﺟﺮا ﻧﺸﻮﻧﺪ .در اﻳـﻦ ﺣﺎﻟـﺖ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛﺎﻣﭙـﺎﻳﻠﺮ ﺑـﻪ ﺧـﻂ ﺑﻌـﺪ از دﺳـﺘﻮر switchﺑﺮﺳﺪ و ﺑﺨﻮاﻫﺪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ strFavoriteColotرا ﭼﺎپ ﻛﻨـﺪ ،اﻳـﻦ ﻣﺘﻐﻴﻴـﺮ ﻣﻘـﺪاري ﻧﺨﻮاﻫـﺪ داﺷـﺖ. ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﺧﻮاﻫﺪ ﺷﺪ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ در ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﺑﻪ آن ﻣﻘﺪار اوﻟﻴﻪ داده اﻳﻢ ﺗﺎ در اﻳﻦ ﻣﻮارد ﻫـﻢ ﻣﺘﻐﻴﻴـﺮ داراي ﻣﻘﺪار ﺑﺎﺷﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﺎم اﻧﺘﺨﺎب ﺷﺪه در ﻟﻴﺴﺖ را ﺑﺪﺳﺖ آوردﻳﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ آن را ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر switchﺑﺮرﺳﻲ ﻛﻨﻴﺪ. ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ دﺳﺘﻮر ،ﻧﺎم ﻣﺘﻐﻴﻴﺮي ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ را ﺑﺎﻳﺪ در داﺧﻞ ﭘﺮاﻧﺘﺰ ﻣﻘﺎﺑﻞ دﺳﺘﻮر وارد ﻛﻨﻴﺪ. درون ﺑﻼك دﺳﺘﻮر switchﺑﺎﻳﺪ ﺑﺮاي ﻫﺮ ﺣﺎﻟﺖ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ﻳﻚ دﺳﺘﻮر caseﻣﺠﺰا ﻗﺮار دﻫﻴﺪ .در اﻳـﻦ ﻣﺜـﺎل، ﭘﻨﭻ دﺳﺘﻮر caseدارﻳﺪ ﻛﻪ ﻫﺮ ﻛﺪام ﺑﻪ ﻳﻚ ﻧﺎم ﻣﺮﺑﻮط ﻫﺴﺘﻨﺪ .ﻫﻨﮕﺎم اﺟﺮاي اﻳﻦ ﻛﺪ ،اﮔﺮ وﻳﮋوال C#ﺑﻪ ﻳﻜﻲ از اﻳﻦ ﺣﺎﻟﺘﻬﺎ ﺑﺮﺧﻮرد ﻛﻨﺪ ،ﻛﺪ آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ. در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺑﺮاي اﻳﻨﻜﻪ ﺑﻌﺪ از اﺟﺮاي ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﺑﻼك ،اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻂ ﺑﻌﺪ از دﺳـﺘﻮر switchﻣﻨﺘﻘـﻞ ﺷـﻮد، ﺑﺎﻳﺪ در اﻧﺘﻬﺎي دﺳﺘﻮرات آن ﺑﻼك از دﺳﺘﻮر breakﺑﻪ ﻧﺤﻮي ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. favorite color
;"= "Madras Yellow
;"= "Sea Blue
;"= "Morning Mist
// Use a Switch to get the // of the selected name )switch(strName { case "Bryan": strFavoriteColor ;break case "Stephanie": strFavoriteColor ;break case "Cathy": strFavoriteColor
١٣١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;break case "Betty": ;"strFavoriteColor = "Passionate Purple ;break case "Edward": ;"strFavoriteColor = "Battleship Gray ;break } // Display the favorite color of the selected name MessageBox.Show(strName + "‘s favorite color is " + ;)"strFavoriteColor, "Select Demo در زﻳﺮ ﻣﺮاﺣﻠﻲ ﻛﻪ ﺑﺎ اﻧﺘﺨﺎب ﻳﻚ ﻧﺎم از ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻃﻲ ﻣﻲ ﺷﻮﻧﺪ ،را ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ:
ﻓﺮض ﻛﻨﻴﺪ ﻛﺎرﺑﺮ در ﻟﻴﺴﺖ روي ﻧـﺎم Bettyﻛﻠﻴـﻚ ﻣـﻲ ﻛﻨـﺪ .روﻳـﺪاد SelectedIndexChanged ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد و ﻣﻘﺪار " "Bettyدر ﻣﺘﻐﻴﻴﺮ strNameذﺧﻴﺮه ﻣﻲ ﺷﻮد. ﺑﺮﻧﺎﻣﻪ ﺑﻪ دﺳﺘﻮر switchﻣﻲ رﺳﺪ و ﻣﻘﺪار درون ﻣﺘﻐﻴﻴـﺮ strNameرا ﺑـﺎ ﺗـﻚ ﺗـﻚ ﻣﻘـﺎدﻳﺮي ﻛـﻪ ﺑـﻪ ﻋﻨـﻮان ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ اﻳﻦ دﺳﺘﻮر وارد ﺷﺪه اﻧﺪ ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ. ﺑﻌﺪ از ﺑﺮرﺳﻲ ﺣﺎﻟﺘﻬﺎي وارد ﺷﺪه در دﺳﺘﻮر ،switchﺑﺮﻧﺎﻣﻪ ﻣﺘﻮﺟﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﺣﺎﻟﺖ ﭼﻬـﺎرم ﺑـﺎ ﻣﻘـﺪار ﻣﺘﻐﻴﻴـﺮ ﺑﺮاﺑـﺮ اﺳــﺖ .ﺑﻨــﺎﺑﺮاﻳﻦ دﺳــﺘﻮرات اﻳــﻦ ﺣﺎﻟــﺖ را اﺟــﺮا ﻣــﻲ ﻛﻨــﺪ )ﻳﻌﻨــﻲ ﻣﻘــﺪار strFavoriteColorرا ﺑﺮاﺑــﺮ " "Passionate Purpleﻗﺮار ﻣﻲ دﻫﺪ(. ﺑﺮﻧﺎﻣﻪ از ﺑﻼك دﺳﺘﻮرات switchﺧﺎرج ﺷﺪه و اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ و ﻛﺎدر ﭘﻴﻐﺎم ﻣﻨﺎﺳﺒﻲ را ﺑـﻪ ﻛـﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
اﺳﺘﻔﺎده از switchﺑﺎ و ﺑﺪون ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف: ﻫﻤﺎﻧﻨﺪ دﺳﺘﻮر ،ifدﺳﺘﻮر switchﻫﻢ ﺑﻪ ﺑﺰرﮔﻲ و ﻛﻮﭼﻜﻲ ﺣﺮوف ﺣﺴﺎس اﺳﺖ .ﺑﻪ ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از switchﺑﺎ ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف (1ﻗﺴﻤﺖ ﻃﺮاﺣـﻲ ﻓـﺮم ﻣﺮﺑـﻮط ﺑـﻪ Form1را ﺑـﺎز ﻛـﺮده و ﻛﻨﺘـﺮل ListBoxرا در ﻓـﺮم اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .از ﭘﻨﺠـﺮه Propertiesﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل ،ListBoxﮔﺰﻳﻨﻪ Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و ﺳﭙﺲ روي دﻛﻤﻪ ﺟﻠﻮي اﻳﻦ ﺧﺎﺻﻴﺖ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠﺮه String Collection Editorﺑﺎز ﺷﻮد. (2اﺳﺎﻣﻲ ﻣﻮﺟﻮد در اﻳﻦ ﭘﻨﺠﺮه را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 12-4ﻫﻤﻪ ﺑﺎ ﺣﺮوف ﺑﺰرگ ﻧﻮﺷﺘﻪ ﺷﻮﻧﺪ.
١٣٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 12-4 (3روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺗﻐﻴﺮات اﻳﻦ ﭘﻨﺠﺮه ذﺧﻴﺮه ﺷﻮﻧﺪ و ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد ﻛـﻪ ﺑـﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﻫﺮ ﻳﻚ از ﻧﺎﻣﻬﺎي داﺧﻞ ،ListBoxﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮد ﻧﺎم رﻧﮓ ﻣﻮرد ﻧﻈﺮ را ﻧﻤﺎﻳﺶ ﻧﻤـﻲ دﻫﺪ) .ﺷﻜﻞ (13-4
ﺷﻜﻞ 13-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ دﺳﺘﻮر switchﻫﻢ ﻫﻤﺎﻧﻨﺪ دﺳﺘﻮر ifﻧﺴﺒﺖ ﺑﻪ ﻧﻮع ﺣﺮوف ﺣﺴﺎس اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ در ﺷﺮط دﺳﺘﻮر switchاز ﻧﺎﻣﻬـﺎي BETTYو ﻳﺎ CATHYاﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻫﻴﭻ ﺣﺎﻟﺖ ﻣﻨﺎﺳﺒﻲ ﻳﺎﻓﺘﻪ ﻧﺨﻮاﻫﺪ ﺷﺪ .اﻳﻦ ﻣﻮرد ﻣﺎﻧﻨﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت زﻳﺮ از دﺳـﺘﻮر ifاﺳﺘﻔﺎده ﻛﻨﻴﺪ: )"if ("BETTY" == "Betty ﻳﺎ: )"if ("CATHY" == "Cathy
١٣٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
String.Compare در ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ دﻳﺪﻳﺪ ﻛﻪ ﺑﺮاي ﻣﻘﺎﻳﺴﻪ دو رﺷﺘﻪ ﺑﺪون در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻧﻮع ﺣﺮوف ﻣﻲ ﺗـﻮان از ﺗـﺎﺑﻊ روﺷﻲ را ﺧﻮاﻫﻴﻢ دﻳﺪ ﻛﻪ ﺑﻪ، در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ. ﻧﻤﻲ ﺗﻮاﻧﻴﺪ از اﻳﻦ روش اﺳﺘﻔﺎده ﻛﻨﻴﺪswitch اﻣﺎ در دﺳﺘﻮر.اﺳﺘﻔﺎده ﻛﺮد . را ﻫﻢ ﺑﺪون ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف اﻧﺠﺎم دﻫﻴﺪswitch وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻘﺎﻳﺴﻪ ﻫﺎي دﺳﺘﻮر
ﺑﺪون ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوفswitch اﺳﺘﻔﺎده از:اﻣﺘﺤﺎن ﻛﻨﻴﺪ SelectedIndexChanged ﺑﺎز ﻛﻨﻴﺪ و در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑـﻪ روﻳـﺪادForm1 ( ﺑﺨﺶ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي1 ﻗﺮار ﻣﻴﺪﻫﻴﺪ ﺣﺘﻤـﺎcase دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﺣﺘﻤﺎ رﺷﺘﻪ ﻫﺎﻳﻲ را ﻛﻪ ﺑﺮاي ﺑﺮرﺳﻲ در ﺟﻠﻮي دﺳﺘﻮر.ﺗﻐﻴﺮات زﻳﺮ را اﻧﺠﺎم دﻫﻴﺪ .ﺑﺎ ﺣﺮوف ﻛﻮﭼﻚ ﻧﻮﺷﺘﻪ ﺷﻮﻧﺪ private void lstData_SelectedIndexChanged(object sender, EventArgs e) { // Declare variables string strName; string strFavoriteColor = ""; // Get the selected name strName = lstData.Items[lstData.SelectedIndex].ToString(); // Use a Switch to get the favorite color // of the selected name switch(strName.ToLower()) { case "bryan": strFavoriteColor = "Madras Yellow"; break ; case "stephanie": strFavoriteColor = "Sea Blue"; break; case "cathy": strFavoriteColor = "Morning Mist"; break; case "betty": strFavoriteColor = "Passionate Purple"; break; case "edward": strFavoriteColor = "Battleship Gray"; break; } // Display the favorite color of the selected name MessageBox.Show(strName + "‘s favorite color is " + strFavoriteColor, "Select Demo"); ١٣٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻣﺠﺪدا ﺑﺮ روي ﻳﻜﻲ از اﺳﺎﻣﻲ درون ListBoxﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 14-4ﻛﺎدر ﭘﻴﻐـﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻧﺎم ﻓﺮد اﻧﺘﺨﺎب ﺷﺪه و رﻧﮓ ﻣﻮرد ﻧﻈﺮ او را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﺷﻜﻞ 14-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي اﻳﻦ ﻛﻪ رﺷﺘﻪ ي داﺧﻞ ﻣﺘﻐﻴﻴﺮ strNameﺑﺪون ﺣﺴﺎﺳﻴﺖ ﺑـﻪ ﻧـﻮع ﺣـﺮوف ﺑﺮرﺳـﻲ ﺷـﻮﻧﺪ ،ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﺗـﺎﺑﻊ ToLowerﺗﻤﺎم ﺣﺮوف آن را ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ و ﺳﭙﺲ آن را ﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﺨﺘﻠﻒ ﻣﻘﺎﻳﺴﻪ ﻛﻨﻴﺪ. ))(switch(strName.ToLower اﻳﻦ دﺳﺘﻮر ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ strNameرا اﺑﺘﺪا ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ و ﺳﭙﺲ آن را ﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﻮﺟـﻮد در دﺳـﺘﻮر case ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ .در اﺳﺘﻔﺎده از اﻳﻦ روش ﺑﺎﻳﺪ دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﺗﻤﺎم ﻋﺒﺎرﺗﻬﺎي ﻣﻘﺎﺑﻞ دﺳﺘﻮر caseرا ﺑﺎ ﺣﺮوف ﻛﻮﭼﻚ ﺑﻨﻮﻳﺴﻴﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ،ﺣﺎﻟﺖ ﻣﻮرد ﻧﻈﺮ اﺟﺮا ﻧﺨﻮاﻫﺪ ﺷﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻋﺒﺎرت ﺟﻠﻮي دﺳﺘﻮر caseﺑﺮاﺑـﺮ ﺑـﺎ " "Bettyﺑﺎﺷـﺪ و ﻛﺎرﺑﺮ ﻧﻴﺰ ﻧﺎم BETTYرا از ﻟﻴﺴﺖ ﺑﺎﻛﺲ اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺣﺎﻟﺖ ،اﻳﻦ ﻧﺎم ﺑﺎ اﺳـﺘﻔﺎده از ﺗـﺎﺑﻊ ToLowerﺑـﻪ betty ﺗﺒﺪﻳﻞ ﻣﻴﺸﻮد و ﺳﭙﺲ ﻣﻘﺪار " "Bettyﺑﺎ " "bettyﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ ﻋﻠﺖ ﺑﺮاﺑﺮ ﻧﺒﻮدن اﻳﻦ دو ﻣﻘﺪار ،ﻛﺪ ﻣﺮﺑـﻮط ﺑـﻪ اﻳﻦ ﺑﺨﺶ اﺟﺮا ﻧﺨﻮاﻫﺪ ﺷﺪ.
;"= "Madras Yellow
;"= "Sea Blue
;"= "Morning Mist
;"= "Passionate Purple
case "bryan": strFavoriteColor ; break case "stephanie": strFavoriteColor ;break case "cathy": strFavoriteColor ;break case "betty": strFavoriteColor ١٣٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;break case "edward": ;"strFavoriteColor = "Battleship Gray ;break } در اﻧﺘﻬﺎ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﺎم رﻧﮓ ﻣﻮرد ﻧﻈﺮ را ﺑﺪﺳﺖ آوردﻳﺪ ،آن را ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ. ﻧﻜﺘﻪ :ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﺣﺮوف ﻛﻮﭼﻚ ،ﻣﻴﺘﻮاﻧﻴﺪ ﺗﻤﺎم ﻋﺒﺎرﺗﻬﺎي ﻣﻘﺎﺑﻞ دﺳﺘﻮرات caseرا ﺑﺎ ﺣـﺮوف ﺑـﺰرگ ﺑﻨﻮﻳـﺴﻴﺪ و ﺳـﭙﺲ ﺑـﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ،ToUpperرﺷﺘﻪ ﻣﻮرد ﻧﻈﺮ ﺧﻮدﺗﺎن را ﺑﻪ ﺣﺮوف ﺑﺰرگ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ.
اﻧﺘﺨﺎﺑﻬﺎي ﭼﻨﺪ ﮔﺎﻧﻪ: در ﺑﺮرﺳﻲ ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ در ﺷﺮط ﻣﻘﺎﺑﻞ دﺳﺘﻮر caseاﺟﺒﺎري ﻧﻴﺴﺖ ﻛﻪ ﻓﻘﻂ ﻳﻚ ﺣﺎﻟﺖ را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ،ﺑﻠﻜﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﭼﻨﺪ ﺣﺎﻟﺖ را در ﻣﻘﺎﺑﻞ ﻳﻚ caseﺑﺮرﺳﻲ ﻛﻨﻴﺪ ،ﺗﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﻫﺮ ﻛﺪام از آﻧﻬﺎ رخ داد ،ﻛﺪ ﻣﻮرد ﻧﻈﺮ اﺟﺮا ﺷﻮد .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳـﺮ، ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ ﻛﻪ ﺑﺎ اﻧﺘﺨﺎب ﻧﺎم از ،ListBoxﺟﻨﺴﻴﺖ ﻓﺮد اﻧﺘﺨﺎب ﺷﺪه را ﻧﻤﺎﻳﺶ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻧﺘﺨﺎﺑﻬﺎي ﭼﻨﺪ ﮔﺎﻧﻪ (1ﻣﺤــﻴﻂ وﻳﺮاﻳــﺸﮕﺮ ﻛــﺪ را ﺑــﺮاي Form1ﺑــﺎز ﻛﻨﻴــﺪ و ﺗﻐﻴــﺮات ﻣــﺸﺨﺺ ﺷــﺪه در زﻳــﺮ را در ﻣﺘــﺪ ﻣﺮﺑــﻮط ﺑــﻪ روﻳــﺪاد SelectedIndexChangedاﻋﻤﺎل ﻛﻨﻴﺪ: private void lstData_SelectedIndexChanged(object sender, )EventArgs e { // Declare variables ;string strName // Get the selected name = strName ;)(lstData.Items[lstData.SelectedIndex].ToString // Use a Switch to display a person's gender ))(switch (strName.ToLower { case "bryan": case "edward": ;)"MessageBox.Show("Male", "Switch Demo ;break case "stephanie":
١٣٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
case "cathy": case "betty": ;)"MessageBox.Show("Female", "Switch Demo ;break } } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي ﻳﻜﻲ از اﺳﺎﻣﻲ داﺧﻞ ListBoxﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﺟﻨﺴﻴﺖ ﻓﺮد اﻧﺘﺨﺎب ﺷﺪه را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ) ﺷﻜﻞ .(15-4
ﺷﻜﻞ 15-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ درﻳﺎﻓﺖ ﻧﺎم و ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ ﻣﺘﻐﻴﻴﺮ ﺑﺮاي اﺳﺘﻔﺎده در ،switchﻫﻤﺎﻧﻨﺪ ﻗﺒﻞ اﺳﺖ و ﺗﻔﺎوﺗﻲ ﻧﺪارد .اﮔـﺮ ﺑﺨـﻮاﻫﻴﻢ ﺑﺮاي ﭼﻨﺪ ﺷﺮط ﻣﺨﺘﻠﻒ ﻳﻚ ﻛﺪ اﺟﺮا ﺷﻮد ،ﺑﺎﻳﺪ ﺑﺮاي ﻫﺮ ﺷﺮط ﻳﻚ ﺑﺎر دﺳﺘﻮر caseرا ﺑﻨﻮﻳﺴﻴﻢ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻓﻘﻂ ﺑـﺮاي ﻣـﻮرد آﺧﺮ ،ﻛﺪ و دﺳﺘﻮر breakرا ﻣﻲ ﻧﻮﻳﺴﻴﻢ .در ﺑﻘﻴﻪ دﺳﺘﻮرات ،caseﻓﻘﻂ ﺷﺮط ﻣﻮرد ﻧﻈﺮ را وارد ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﻮرد ﻣﻮﺟـﺐ ﻣـﻲ ﺷﻮد ﻛﻪ اﻳﻦ ﺷﺮط ﻫﺎ ﻫﻤﺎﻧﻨﺪ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ Orدر دﺳﺘﻮر ifﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺗﺮﻛﻴﺐ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﻛﻪ درﺳﺖ ﺑﺎﺷـﺪ، ﻛﺪي ﻛﻪ ﺑﻌﺪ از آﺧﺮﻳﻦ دﺳﺘﻮر caseآﻣﺪه اﺳﺖ اﺟﺮا ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل در ﻣـﻮرد اول ،اﮔـﺮ اﺳـﻢ اﻧﺘﺨـﺎب ﺷـﺪه bryanو ﻳـﺎ edwardﺑﺎﺷﺪ ،ﻛﺪﻫﺎي ﺑﻌﺪ از دو دﺳﺘﻮر caseاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ. case "bryan": case "edward": ;"strFavoriteColor = "Madras Yellow ; break دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺑﺎ اﻳﻦ روش ،در ﺣﻘﻴﻘﺖ در ﺣﺎل ﺗﺮﻛﻴﺐ اﻳﻦ ﺷﺮﻃﻬﺎ ﺑﺎ ﻋﻤﻠﮕﺮ "ﻳﺎ" ﻫﺴﺘﻴﺪ و ﻣﻲ ﮔﻮﻳﻴﺪ "ﻳﺎ اﻳﻦ ﻣﻮرد ﻳﺎ آن ﻣﻮرد" ﻧﻪ اﻳﻨﻜﻪ "اﻳﻦ ﻣﻮرد و آن ﻣﻮرد".
١٣٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
دﺳﺘﻮر :default ﺗﺎﻛﻨﻮن ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﺷﺮﻃﻬﺎي ﻣﺨﺘﻠﻒ را در دﺳﺘﻮر switchﺑﺮرﺳﻲ ﻛﻨﻴﻢ .اﻣﺎ ﺳﻮال اﻳﻦ اﺳﺖ ﻛﻪ اﮔـﺮ ﻫـﻴﭻ ﻳـﻚ از اﻳﻦ ﺷﺮط ﻫﺎ اﺟﺮا ﻧﺸﺪﻧﺪ ﭼﻪ ﻣﻲ ﺷﻮد؟ اﻳﻦ ﻣﻮرد ﻛﻪ ﻫﻴﭻ ﻳﻚ از ﺷﺮط ﻫﺎ اﺟﺮا ﻧﺸﻮﻧﺪ را در ﺑﺨﺶ ﻗﺒﻠﻲ ،ﻫﻨﮕﺎﻣﻲ ﻛـﻪ در ﺣـﺎل ﺑﺮرﺳـﻲ ﻣﻘﺎﻳﺴﻪ ﺑﺎ ﺣﺴﺎﺳﻴﺖ ﺑﻪ ﻧﻮع ﺣﺮوف ﺑﻮدﻳﻢ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ .اﻣﺎ ﭼﮕﻮﻧﻪ ﻣﻲ ﺷﻮد ﻛﺪي را ﺑﻪ ﻧﺤﻮي ﻣﺸﺨﺺ ﻛﺮد ﻛﻪ ﻫﺮ ﮔﺎه ﻫـﻴﭻ ﻳـﻚ از ﺷﺮط ﻫﺎ ﺑﺮﻗﺮار ﻧﺒﻮدﻧﺪ اﺟﺮا ﺷﻮد؟ در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،اﻳﻦ ﻣﻮرد را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از دﺳﺘﻮر default (1ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﻛﻨﺘﺮل ListBoxرا از روي ﻓﺮم اﻧﺘﺨﺎب ﻛﻨﻴـﺪ .ﺳـﭙﺲ ﺑـﻪ ﭘﻨﺠـﺮه Propertiesﺑﺮوﻳــﺪ و ﺑــﺎ اﺳــﺘﻔﺎده از ﺧﺎﺻــﻴﺖ ،Itemsﭘﻨﺠــﺮه String Collection Editorرا ﻣﺠﺪدا ﺑﺎز ﻛﻨﻴﺪ .ﻧﺎم دﻳﮕﺮي ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻛﻨﻴﺪ و روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ. (2در ﻣﺘﺪ lstData_SelectedIndexChangedﺑﺨﺶ ﻣﺮﺑﻮط ﺑﻪ دﺳﺘﻮر switchرا ﺑـﻪ ﺻـﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: ))(switch(strName.ToLower { case "bryan": case "edward": ;)"MessageBox.Show("Male", "Switch Demo ;break case "stephanie": case "cathy": case "betty": ;)"MessageBox.Show("Female", "Switch Demo ;break default: MessageBox.Show("I don’t know this person’s ;)"+ "gender.", "Select Demo ;break }
"
(3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و از ListBoxﻧﺎﻣﻲ ﻛﻪ ﺟﺪﻳﺪاً ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﺷﺪه اﺳﺖ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣـﺸﺎﺑﻪ ﺷﻜﻞ 16-4ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
١٣٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 16-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ دﺳﺘﻮراﺗﻲ ﻛﻪ ﺑﻌﺪ از ﺑﺨﺶ defaultوارد ﻣﻲ ﺷﻮﻧﺪ ،ﻫﻨﮕﺎﻣﻲ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻫﻴﭻ ﻳﻚ از ﺷﺮاﻳﻄﻲ ﻛﻪ در ﺑﺨﺶ caseﻗﻴـﺪ ﺷﺪه اﺳﺖ ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ ﻧﺒﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻻ ﻫﻴﭻ دﺳﺘﻮر caseﺑﺮاي ﻋﺒﺎرت " "Sydneyوارد ﻧـﺸﺪه اﺳـﺖ، ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات ﺑﺨﺶ defaultاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ و ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﻛﻪ ﻣﻲ ﮔﻮﻳﻴﺪ ﺟﻨﺴﻴﺖ ﻓﺮد اﻧﺘﺨـﺎب ﺷـﺪه ﻣﺸﺨﺺ ﻧﻴﺴﺖ. ﻧﻜﺘﻪ :دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻫﻤﻮاره در اﻧﺘﻬﺎي دﺳﺘﻮرات ﺑﺨﺶ caseو ﻳـﺎ ﺑﺨـﺶ defaultاز دﺳـﺘﻮر breakاﺳـﺘﻔﺎده ﻛﻨﻴﺪ ﺗﺎ ﺑﻌﺪ از اﺟﺮاي ﻛﺪ ﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻂ ﺑﻌﺪ از دﺳﺘﻮر switchﺑﺮﮔﺮدد .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺎ ﺧﻄﺎي زﻣـﺎن ﻛﺎﻣﭙﺎﻳـﻞ ﻣﻮاﺟـﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﺳﺘﻔﺎده از ﻧﻮع ﻫﺎي داده اي ﮔﻮﻧﺎﮔﻮن در دﺳﺘﻮر :switch در اﻳﻦ درس ،ﻓﻘﻂ از ﻣﺘﻐﻴﻴﺮ ﻫﺎي رﺷﺘﻪ اي در دﺳﺘﻮر switchاﺳﺘﻔﺎده ﻛﺮدﻳﺪ .اﻣﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ دﺳﺘﻮر را ﺑـﺎ اﻧـﻮاع ﻣﺘﻐﻴﻴـﺮ ﻫـﺎي ﻣﻮﺟﻮد در C#ﻫﻤﺎﻧﻨﺪ اﻋﺪاد ﺻﺤﻴﺢ ) ،(intاﻋـﺪاد اﻋـﺸﺎري ) doubleو (floatو ﻳـﺎ ﻣﺘﻐﻴﻴـﺮ ﻫـﺎي Booleanﻫـﻢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﺮ ﻧﻮع ﻣﺘﻐﻴﻴﺮي ﻛﻪ ﺑﺘﻮاﻧﺪ در دﺳﺘﻮر ifﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ == ﺑﺮرﺳﻲ ﺷﻮد ،ﻣﻴﺘﻮاﻧﺪ در دﺳﺘﻮر switchﻧﻴـﺰ ﺑـﻪ ﻛـﺎر رود .اﻣـﺎ ﻣﻌﻤﻮﻻ از ﻣﺘﻐﻴﻴﺮ ﻫﺎﻳﻲ ﻛﻪ داراي ﻣﻘﺎدﻳﺮ ﭘﻴﻮﺳﺘﻪ ﻫﺴﺘﻨﺪ ﻣﺎﻧﻨﺪ ﻣﺘﻐﻴﻴﺮ ﻫـﺎي رﺷـﺘﻪ اي و ﻳـﺎ اﻋـﺪاد ﺻـﺤﻴﺢ ﺑـﺮاي دﺳـﺘﻮر switch اﺳﺘﻔﺎده ﻣﻴﻜﻨﻨﺪ .زﻳﺮا اﻋﺪاد اﻋﺸﺎري ﻣﻲ ﺗﻮاﻧﻨﺪ ﻣﻘﺪارﻫﺎي ﻛﺴﺮي ﻣﺎﻧﻨﺪ 2,221 ،2,21 ،2,2و … را داﺷﺘﻪ ﺑﺎﺷﺪ و اﺳﺘﻔﺎده از آﻧﻬﺎ در دﺳﺘﻮر switchﻣﻨﻄﻘﻲ ﻧﻴﺴﺖ.
ﺣﻠﻘﻪ ﻫﺎ:
١٣٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﭙﻴﻮﺗﺮي ﻫﺴﺘﻴﺪ ،ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻋﻤﻞ ﻣﺸﺨﺺ را ﭼﻨﺪﻳﻦ ﺑﺎر ﻣﺘﻮاﻟﻲ اﻧﺠﺎم دﻫﻴﺪ ﺗﺎ ﻧﺘﻴﺠﻪ ﻣﻄﻠﻮب ﺧﻮد را درﻳﺎﻓﺖ ﻛﻨﻴﺪ .ﻣﺜﻼ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﺻﻮرت ﺣﺴﺎب ﺗﻠﻔﻦ را ﺑﺮاي ﺗﻤﺎم ﻣﺸﺘﺮﻛﻴﻦ ﺑﺪﺳﺖ آورﻳﺪ و ﻳﺎ 10ﻓﺎﻳـﻞ را از روي ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﺨﻮاﻧﻴﺪ. در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ،ﺑﺮاي اﻧﺠﺎم اﻳﻦ اﻣﻮر ﻣﻌﻤﻮﻻ از ﺣﻠﻘﻪ ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .در اﻳﻦ ﺑﺨﺶ ﺑﺎ ﺳﻪ دﺳـﺘﻪ ﻛﻠـﻲ از ﺣﻠﻘـﻪ ﻫـﺎ ﻛـﻪ در C# وﺟﻮد دارﻧﺪ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ.
ﺣﻠﻘﻪ ﻫﺎي – forاﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ﻣﻌﻤﻮﻻ ﺑﻪ ﺗﻌﺪاد ﻣﺮﺗﺒﻪ ﻣﺸﺨﺼﻲ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ )ﺑﺮاي ﻣﺜﺎل ،دﻗﻴﻘﺎ 10ﺑﺎر(. ﺣﻠﻘﻪ ﻫﺎي – whileاﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ﻣﻌﻤﻮﻻ ﺗﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﺘﻴﺠﻪ ﻳﻚ ﺷﺮط درﺳﺖ ﺷﻮد اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﻨﺪ. ﺣﻠﻘﻪ ﻫﺎي – doﻋﻤﻠﻜﺮد اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﺣﻠﻘﻪ ﻫﺎي whileاﺳﺖ ،ﺑﺎ اﻳﻦ ﺗﻔـﺎوت ﻛـﻪ ﺷـﺮط در ﺣﻠﻘـﻪ ﻫـﺎي whileدر اﺑﺘﺪا ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد وﻟﻲ در اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ،ﺷﺮط در اﻧﺘﻬﺎ ﺑﺮرﺳﻲ ﻣﻴﺸﻮد.
ﺣﻠﻘﻪ :for ﺣﻠﻘﻪ forﺣﻠﻘﻪ اي اﺳﺖ ﻛﻪ درك ﻧﺤﻮه ﻛﺎرﻛﺮد آن ﺑﺴﻴﺎر راﺣﺖ اﺳﺖ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺎ اﻳﻦ دﺳﺘﻮر آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﺣﻠﻘﻪ for (1 (2 (3 (4
ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Loopsاﻳﺠﺎد ﻛﻨﻴﺪ. در ﻓﺮﻣﻲ ﻛﻪ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮد ﻳﻚ ListBoxو ﻳﻚ ﻛﻨﺘﺮل Buttonاﺿﺎﻓﻪ ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ Nameﻣﺮﺑﻮط ﺑﻪ ListBoxرا ﺑﺮاﺑﺮ lstDataو ﺧﺎﺻﻴﺖ IntegralHeightآن را ﺑﺮاﺑﺮ falseﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Nameﻣﺮﺑﻮط ﺑﻪ دﻛﻤـﻪ ﻓﺮﻣـﺎن Buttonرا ﺑﺮاﺑـﺮ btnForLoopو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ For Loopﻗﺮار دﻫﻴﺪ .ﺗﺎﻛﻨﻮن ﻓﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 17-4ﺷﺪه ﺑﺎﺷﺪ.
١٤٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 17-4 (5ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن اﻳﺠﺎد ﺷـﻮد .ﺳـﭙﺲ ﻛـﺪ زﻳـﺮ را در آن وارد ﻛﻨﻴﺪ: )private void btnForLoop_Click(object sender, EventArgs e { // Declare variable ;int intCount // Perform a loop )for(intCount = 1;intCount <= 5;intCount += 1 { // Add the item to the list lstData.Items.Add("I’m item " + intCount + ;)"!" in the list } } (6ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ for Loopﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 18-4ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﺑﺘﺪاي ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ،ﻣﺘﻐﻴﻴﺮي را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ: // Declare variable ;int intCount
١٤١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﺣﻠﻘﻪ ﺑﺎﻳﺪ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي forاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻛﻠﻤﻪ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ وﻳﮋوال C#ﻣﻴﮕﻮﻳﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻳﻚ ﺣﻠﻘﻪ ﺑﺎ ﺗﻌﺪاد دﻓﻌﺎت ﺗﻜﺮار ﻣﺸﺨﺺ اﻳﺠﺎد ﻛﻨﻴﺪ .ﺗﻤﺎم ﻛﻠﻤﺎت و ﻋﻼﻣﺘﻬﺎﻳﻲ ﻛﻪ ﺑﻌﺪ از اﻳﻦ ﻛﻠﻤﻪ ﻣﻲ آﻳﻨﺪ ،ﺑﺮاي ﻣﺸﺨﺺ ﻛـﺮدن ﻧﺤـﻮه ﻋﻤﻠﻜـﺮد اﻳﻦ ﺣﻠﻘﻪ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ .ﺑﺮاي ﺗﻌﻴﻴﻦ ﻧﺤﻮه ﻛﺎرﻛﺮد ﻳﻚ ﺣﻠﻘﻪ ،ﺳﻪ ﻣﻮرد را ﺑﺎﻳﺪ در ﺟﻠﻮي آن ﻣﺸﺨﺺ ﻛﻨﻴﺪ .اﻳﻦ ﺳـﻪ ﻣـﻮرد ،ﻫﻤـﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﺎ ﻛﺎراﻛﺘﺮ ";" از ﻳﻜﺪﻳﮕﺮ ﺟﺪا ﻣﻲ ﺷﻮﻧﺪ.
ﺷﻜﻞ 18-4 در ﻗﺴﻤﺖ اول ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ از ﭼﻪ ﻣﺘﻐﻴﻴﺮي ﻣﻴﺨﻮاﻫﻴﺪ ﺑﺮاي ﺷﻤﺎرش دﻓﻌﺎت ﺗﻜﺮار در اﻳﻦ ﺣﻠﻘﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﺑﺨﺶ ﻣﻘﺪار اوﻟﻴﻪ ﻣﺘﻐﻴﻴﺮ را ﻧﻴﺰ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﺷـﻤﺎرش در ﺣﻠﻘـﻪ از ﭼـﻪ ﻋﺪدي ﺷﺮوع ﺷﻮد .در اﻳﻦ ﻣﺜﺎل ﺑﺮاي ﺷﻤﺎرش ﺣﻠﻘﻪ از ﻣﺘﻐﻴﻴﺮ intCountﻛﻪ در ﺧﻂ ﻗﺒﻞ ﺗﻌﺮﻳﻒ ﻛﺮدﻳﻢ ،اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨـﻴﻢ و ﻣﻘﺪار اوﻟﻴﻪ آن را ﻧﻴﺰ 1ﺗﻌﻴﻴﻦ ﻣﻴﻜﻨﻴﻢ ﺗﺎ ﺷﻤﺎرش ﺣﻠﻘﻪ از ﻋﺪد ﻳﻚ ﺷﺮوع ﺷﻮد. در ﻗﺴﻤﺖ دوم ﺑﺎﻳﺪ ﺗﻌﻴﻴﻦ ﻛﻨﻴﻢ ﻛﻪ ﺣﻠﻘﻪ ،ﺷﻤﺎرش را ﺗﺎ ﭼﻪ ﻋﺪدي اداﻣﻪ دﻫﺪ .در اﻳـﻦ ﻣﺜـﺎل ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻣﺘﻐﻴﻴـﺮ intCount ﻛﻮﭼﻜﺘﺮ و ﻳﺎ ﻣﺴﺎوي 5اﺳﺖ ﺷﻤﺎرش اداﻣﻪ ﭘﻴﺪا ﻣﻴﻜﻨﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺑﺮاي ﺷﺮط اﻳﻦ ﻗﺴﻤﺖ از ﻫﺮ ﻳﻚ از ﻋﻤﻠﮕﺮﻫﺎﻳﻲ ﻛـﻪ در ﺑﺨﺶ ﻗﺒﻞ ﻣﻌﺮﻓﻲ ﻛﺮدﻳﻢ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ ﺑﺰرﮔﺘﺮ ﻣﺴﺎوي و ﻳﺎ ﻋﻤﻠﮕﺮ ﻛﻮﭼﻜﺘﺮ و ...ﻣﻴﺘﻮاﻧﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. در ﻗﺴﻤﺖ آﺧﺮ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ در ﻫﺮ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﭼﻪ ﺗﻐﻴﻴﺮي ﻛﻨﺪ .در اﻳﻦ ﻣﺜﺎل ﻣﻴﺨﻮاﻫﻴﻢ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ را در ﻫﺮ ﻣﺮﺣﻠـﻪ از اﺟﺮاي ﺣﻠﻘﻪ ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ ﻳﺎﺑﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ را ﺑﺎ ﻋﺪد ﻳﻚ ﺟﻤﻊ ﻣﻲ ﻛﻨﻴﻢ. از ﺗﻮﺿﻴﺤﺎت ﻗﺒﻠﻲ ﻣﺸﺨﺺ اﺳﺖ ﻛﻪ اﻳﻦ ﺣﻠﻘﻪ از ﻋﺪد ﻳﻚ ﺷﺮوع ﺑﻪ ﺷﻤﺎرش ﻣﻲ ﻛﻨﺪ و ﺗﺎ ﻋﺪد 5ﺷﻤﺎرش را اداﻣﻪ ﻣﻲ دﻫـﺪ و در ﻫـﺮ ﻣﺮﺣﻠﻪ ﻧﻴﺰ ﻳﻚ واﺣﺪ ﺑﻪ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ ﭘﻨﺞ ﺑﺎر اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ. ﻣﺮاﺣﻠﻲ ﻛﻪ ﺑﺮاي اﺟﺮاي اﻳﻦ ﺣﻠﻘﻪ ﺑﻪ وﺳﻴﻠﻪ وﻳﮋوال C#ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﺳﺖ ﻛﻪ اﺑﺘﺪا ﻣﺘﻐﻴﻴﺮ intCountﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار ﻣﺸﺨﺺ ﺷﺪه در ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد .ﺳﭙﺲ ﺷﺮط وارد ﺷﺪه در ﻗﺴﻤﺖ دوم ﺣﻠﻘﻪ ﺑﺮرﺳﻲ ﻣﻴﺸﻮد .در ﺻﻮرﺗﻲ ﻛـﻪ اﻳـﻦ ﺷـﺮط ﺑﺮﻗـﺮار ﻧﺒﺎﺷﺪ دﺳﺘﻮرات ﺣﻠﻘﻪ اﺟﺮا ﻧﻤﻲ ﺷﻮﻧﺪ و ﺑﺮﻧﺎﻣﻪ از ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘﻪ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ .در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮط ﺣﻠﻘﻪ ﺑﺮﻗـﺮار ﺑﺎﺷـﺪ )ﻳﻌﻨـﻲ در اﻳﻦ ﻣﺜﺎل ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ intCountﻛﻮﭼﻜﺘﺮ ﻳﺎ ﻣﺴﺎوي ﻋﺪد 5ﺑﺎﺷﺪ( دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﺑﻌﺪ از اﻳﻨﻜـﻪ دﺳـﺘﻮرات ﺣﻠﻘﻪ ﺑﺮاي ﻣﺮﺗﺒﻪ اول اﺟﺮا ﺷﺪﻧﺪ ،وﻳﮋوال C#ﺗﻐﻴﻴﺮاﺗﻲ را ﻛﻪ در ﻗﺴﻤﺖ ﺳﻮم ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ ﺑﺮ روي ﻣﺘﻐﻴﻴﺮ اﻋﻤﺎل ﻣﻲ ﻛﻨﺪ )ﺑـﺮاي ﻣﺜﺎل در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻳﻚ واﺣﺪ ﺑﻪ ﻣﺘﻐﻴﻴﺮ intCountاﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ( و ﺳﭙﺲ ﺷـﺮط وارد ﺷـﺪه در ﻗـﺴﻤﺖ دوم ﺣﻠﻘـﻪ forرا
١٤٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺠﺪدا ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ و در ﺻﻮرت درﺳﺖ ﺑﻮدن اﻳﻦ ﺷﺮط دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ ﺷﺮاﻳﻂ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﻨﺪ ﺗﺎ زﻣـﺎﻧﻲ ﻛﻪ ﺷﺮط ﻗﺴﻤﺖ دوم ﺣﻠﻘﻪ forﻧﺎدرﺳﺖ ﺑﺎﺷﺪ .در اﻳﻦ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻠﺮ وﻳﮋوال C#از ﺣﻠﻘﻪ ﺧﺎرج ﻣﻲ ﺷﻮد و ﺑـﻪ اوﻟـﻴﻦ ﺧـﻂ ﺑﻌـﺪ از ﺣﻠﻘﻪ ﻣﻲ رود. // Perform a loop )for(intCount = 1;intCount <= 5;intCount += 1 { // Add the item to the list lstData1.Items.Add("I’m item " + intCount + ;)"!" in the list } ﻧﻜﺘﻪ :در ﻗﺴﻤﺖ ﺳﻮم ﺣﻠﻘﻪ ي ﺑﺎﻻ ،ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻋﺒﺎرت intCount+=1ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ از دﺳﺘﻮر intCount++ ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﻳﻦ دﺳﺘﻮر ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻳﻚ واﺣﺪ ﺑﻪ ﻣﺘﻐﻴﻴﺮ intCountاﺿـﺎﻓﻪ ﺷـﻮد و ﺣﺎﺻـﻞ در ﻫﻤـﺎن ﻣﺘﻐﻴﻴـﺮ ﻗـﺮار ﺑﮕﻴﺮد. )for(intCount = 1;intCount <= 5;intCount++ ﻋﻼوه ﺑﺮ ﻋﻤﻠﮕﺮ ++ﻛﻪ ﻳﻚ واﺣﺪ ﺑﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﺿﺎﻓﻪ ﻣﻴﻜﻨﺪ ،ﻋﻤﻠﮕﺮ --ﻧﻴﺰ وﺟﻮد دارد ﻛﻪ ﻳﻚ واﺣـﺪ از ﻣﻘـﺪار ﻳـﻚ ﻣﺘﻐﻴﻴـﺮ ﻣـﻲ ﻛﺎﻫﺪ.ﻛﺎرﺑﺮد اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﻤﺎﻧﻨﺪ ﻋﻤﻠﮕﺮ ++اﺳﺖ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺗﺎﻛﻨﻮن ﻣﺘﻮﺟﻪ ﺷﺪه اﻳﺪ ،در ﺣﻠﻘﻪ forاﺟﺒﺎري ﻧﻴﺴﺖ ﻛﻪ ﻣﻘﺪار ﺷﺮوع ﺣﻠﻘﻪ را ﻋﺪد ﻳﻚ در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ و ﻳﺎ ﺷـﻤﺎرﻧﺪه در ﻫﺮ ﻣﺮﺣﻠﻪ ﻣﺘﻐﻴﻴﺮ را ﻓﻘﻂ ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ دﻫﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﺣﻠﻘﻪ forﺟﺪﻳﺪي ﺧﻮاﻫﻴﻢ ﺳﺎﺧﺖ ﻛـﻪ از اﻳـﻦ ﻣـﻮارد اﺳـﺘﻔﺎده ﻛﻨﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻧﻌﻄﺎف ﭘﺬﻳﺮي ﺣﻠﻘﻪ for (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ﻫﻤﭽﻨﺎن در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ و ﺳـﭙﺲ ﻛﻨﺘـﺮل Buttonدﻳﮕـﺮي روي ﻓـﺮم اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ. ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ btnNewForLoopو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ New For Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ. private void btnNewForLoop_Click(object sender, EventArgs )e { // Perform a loop )for (int intCount = 4; intCount < 62; intCount += 7 { // add the item to the list ;)lstData.Items.Add(intCount
١٤٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ New For Loopﺟﺪﻳﺪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 19-4را درﻳﺎﻓـﺖ ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 19-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﻪ ﺗﻌﺮﻳﻒ ﺣﻠﻘﻪ forدر اﻳﻦ ﻣﺜﺎل ﺗﻮﺟﻪ ﻛﻨﻴﺪ: // Perform a loop )for (int intCount = 4; intCount < 62; intCount += 7 ﻧﻜﺘﻪ اوﻟﻲ ﻛﻪ در اﻳﻦ ﺣﻠﻘﻪ وﺟﻮد دارد ،ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ intCountدر ﺧﻮد ﺣﻠﻘﻪ اﺳﺖ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺑﺮﻧﺎﻣﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﻪ ﺣﻠﻘﻪ رﺳﻴﺪ ﻣﺘﻐﻴﻴﺮي را ﺑﻪ ﻧﺎم intCountﺗﻌﺮﻳﻒ ﻛﻨﺪ و ﺑﺮاي ﺷﻤﺎرش درون ﺣﻠﻘﻪ از آن اﺳﺘﻔﺎده ﻛﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎر ﺣﻠﻘﻪ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،ﻣﺘﻐﻴﻴﺮ ﻧﻴﺰ از ﺑﻴﻦ ﺧﻮاﻫﺪ رﻓﺖ و ﻓﻀﺎي اﺷﻐﺎل ﺷﺪه ﺗﻮﺳﻂ آن آزاد ﻣﻲ ﺷﻮد .در ﻣﺮﺣﻠﻪ ﺑﻌﺪ ،ﺑﻪ ﺟﺎي اﺳـﺘﻔﺎده از ﻋـﺪد 1ﺑـﻪ ﻋﻨﻮان ﻣﻘﺪار ﺷﺮوع ،از ﻋﺪد 4اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .در ﺣﻘﻴﻘﺖ در اوﻟﻴﻦ دوره اﺟﺮاي ﺣﻠﻘﻪ ﻣﻘﺪار intCountﺑﺮاﺑﺮ ﺑﺎ ﻋـﺪد 4اﺳـﺖ و ﺑﻨﺎﺑﺮاﻳﻦ اوﻟﻴﻦ ﻣﻮرد اﺿﺎﻓﻪ ﺷﺪه ﺑﻪ ﻟﻴﺴﺖ ﻋﺪد 4ﺧﻮاﻫﺪ ﺑﻮد .ﻫﻤﭽﻨﻴﻦ در ﻫﺮ ﻣﺮﺣﻠﻪ از اﺟﺮاي ﺣﻠﻘﻪ 7 ،واﺣﺪ ﺑﻪ ﻣﻘـﺪار intCount اﻓﺰوده ﻣﻲ ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ،دوﻣﻴﻦ ﻣﻮردي ﻛﻪ ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد ﻋﺪد 11اﺳﺖ ،ﻧﻪ ﻋﺪد .5 ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﺣﻠﻘﻪ ﺑﺎﻳﺪ در ﻋﺪد 62ﺑﻪ ﭘﺎﻳﺎن ﺑﺮﺳﺪ ،اﻣﺎ ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ ﻛﻪ ﺣﻠﻘﻪ در ﻋﺪد 60ﺑﻪ ﭘﺎﻳﺎن ﻣﻲ رﺳﺪ .زﻳﺮا ﻋﺪد ﺑﻌـﺪ از آن67 ، ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ از 62ﺑﺰرﮔﺘﺮ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺣﻠﻘﻪ ﺑﺮاي ﻣﺮﺗﺒﻪ ﻧﻬﻢ اﺟﺮا ﻧﺨﻮاﻫﺪ ﺷﺪ.
١٤٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻤﺎرش ﻣﻌﻜﻮس در ﺣﻠﻘﻪ: اﮔﺮ در ﻫﺮ ﻣﺮﺣﻠﻪ از اﺟﺮاي ﺣﻠﻘﻪ ﻋﺪدي را از ﺷﻤﺎرﻧﺪه ي آن ﻛﻢ ﻛﻨﻴﺪ ،ﺣﻠﻘﻪ ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس ﺣﺮﻛﺖ ﺧﻮاﻫﺪ ﻛـﺮد .در اﻣﺘﺤـﺎن ﻛﻨﻴـﺪ ﺑﺨﺶ ﺑﻌﺪ ،اﻳﻦ ﻣﻮرد را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺷﻤﺎرش ﻣﻌﻜﻮس ﺣﻠﻘﻪ (1اﮔﺮ ﻫﻨﻮز ﺑﺮﻧﺎﻣﻪ ﻗﺴﻤﺖ ﻗﺒﻞ در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ و ﺳﭙﺲ ﻛﻨﺘـﺮل Buttonدﻳﮕـﺮي ﺑـﻪ ﻓـﺮم اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ. ﺧﺎﺻـــــﻴﺖ Nameآن را ﺑﺮاﺑـــــﺮ btnBackwardsForLoopو ﺧﺎﺻـــــﻴﺖ Textآن را ﺑﺮاﺑـــــﺮ Backwards For Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن وارد ﻛﻨﻴﺪ: private void btnBackwardsForLoop_Click(object sender, )EventArgs e { // Perform a loop )for (int intCount = 10; intCount >= 1; intCount-- { // Add the item to the list ;)lstData.Items.Add(intCount } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Backwards For Loopﻛﻠﻴﻚ ﻛﻨﻴـﺪ .ﻧﺘﻴﺠـﻪ اي را ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 20-4 ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺖ ﺳﻮم ﺗﻌﺮﻳﻒ ﺣﻠﻘﻪ forﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،در ﻫﺮ ﻣﺮﺗﺒﻪ اﺟﺮاي ﺣﻠﻘﻪ ،اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ --ﻣﻮﺟﺐ ﻣﻲ ﺷـﻮد ﻳﻚ واﺣﺪ از ﻣﻘﺪار intCountﻛﻢ ﺷﻮد .ﭼﻮن ﻣﻘﺪار اوﻟﻴﻪ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺑﺮاﺑﺮ 10در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ ،ﺣﻠﻘـﻪ 10ﺑـﺎر اﺟـﺮا ﻣـﻲ ﺷﻮد و از ﻋﺪد 10ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس ﺑﻪ ﻋﺪد 1ﻣﻲ رﺳﺪ و اﺟﺮاي ﺣﻠﻘﻪ ﺗﻤﺎم ﻣﻲ ﺷﻮد.
١٤٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 20-4
ﺣﻠﻘﻪ ﻫﺎي :foreach در اﺳﺘﻔﺎده روزﻣﺮه از ﺣﻠﻘﻪ forدر ﺑﺮﻧﺎﻣﻪ ﻫﺎ ،ﻛﻤﺘﺮ از اﻳﻦ ﺣﻠﻘﻪ ﺑﻪ ﻧﺤﻮي ﻛـﻪ ﺷـﺮح داده ﺷـﺪ اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد .ﺑـﻪ ﻋﻠـﺖ ﻧﺤـﻮه ﻛﺎرﻛﺮدي ﻛﻪ ﭼﺎرﭼﻮب .NETدارد ،ﻣﻌﻤﻮﻻ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﺎ ﻧﻮع ﺧﺎﺻﻲ از اﻳﻦ ﺣﻠﻘﻪ ﻛﻪ foreachﻧﺎﻣﻴﺪه ﻣﻲ ﺷـﻮد ﺑﻴـﺸﺘﺮ ﻛـﺎر ﺧﻮاﻫﻴﻢ ﻛﺮد. در اﻟﮕﻮرﻳﺘﻢ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻋﻤﻮﻣﺎ ﻫﻨﮕﺎﻣﻲ از ﻳﻚ ﺣﻠﻘﻪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺠﻤﻮﻋﻪ اي از اﺷﻴﺎ را در اﺧﺘﻴﺎر داﺷﺘﻪ ﺑﺎﺷـﻴﺪ و ﺑﺨﻮاﻫﻴـﺪ ﺑـﻴﻦ اﻋﻀﺎي آن ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮﻳﺪ ،ﻛﻪ اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﻫﻢ اﻏﻠﺐ ﺑﻪ ﺻﻮرت ﻳﻚ آراﻳﻪ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﺑﻴﻦ ﺗﻤـﺎم ﻓﺎﻳﻠﻬـﺎي درون ﻳﻚ ﻓﻮﻟﺪر ﺑﮕﺮدﻳﺪ و ﻓﺎﻳﻠﻲ را ﭘﻴﺪا ﻛﻨﻴﺪ ﻛﻪ اﻧﺪازه آن ﺑﻴﺶ از ﺣﺪ ﻣﺠﺎز اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ از ﭼﺎرﭼﻮب .NETﺑﺨﻮاﻫﻴﺪ ﻛﻪ ﻟﻴﺴﺖ ﺗﻤﺎم ﻓﺎﻳﻠﻬﺎ را ﺑﻪ ﺷﻤﺎ ﺑﺮﮔﺮداﻧﺪ ،ﻳﻚ آراﻳﻪ از اﺷﻴﺎ را درﻳﺎﻓﺖ ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻫﺮ ﻛﺪام از اﻋﻀﺎي آن ﻧﺸﺎن دﻫﻨﺪه ي ﻳﻚ ﻓﺎﻳﻞ اﺳـﺖ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺣﻠﻘﻪ داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﺑﻪ ﻧﺤﻮي ﺗﻐﻴﻴﺮ ﺧﻮاﻫﻴﺪ داد ﻛﻪ ﻧﺎم ﺗﻤﺎم ﻓﻮﻟﺪرﻫﺎي داﺧﻞ دراﻳﻮ Cﺷﻤﺎ را ﺑﺮﮔﺮداﻧﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺣﻠﻘﻪ foreach (1ﻛﻨﺘﺮل Buttonﺟﺪﻳـﺪي ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnForEachLoopو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ForEach Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: private void btnForEachLoop_Click(object sender, )EventArgs e { // List each folder at the root of your C Drive foreach (string strFolder
١٤٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
))"\\in System.IO.Directory.GetDirectories("C: { // Add the item to the list ;)lstData.Items.Add(strFolder } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤـﻪ ي ForEach Loopﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .در ListBoxﻧـﺎم ﺗﻤـﺎﻣﻲ ﻓﻮﻟـﺪرﻫﺎي ﻣﻮﺟﻮد در دراﻳﻮ Cﺧﻮد را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي ﺑﺪﺳﺖ آوردن ﻟﻴﺴﺖ ﺗﻤﺎم داﻳﺮﻛﺘﻮري ﻫﺎي ﻣﻮﺟﻮد در ﻳﻚ ﻣـﺴﻴﺮ ﺧـﺎص در ﺑﺮﻧﺎﻣـﻪ ﺑﺎﻳـﺪ از ﺗـﺎﺑﻊ GetFirectories ﻣﺮﺑﻮط ﺑﻪ ﻛﻼس Directoryدر ﻓﻀﺎي ﻧﺎم System.IO 1اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﻳﻦ ﺗـﺎﺑﻊ ﻳـﻚ آراﻳـﻪ رﺷـﺘﻪ اي از ﻧـﺎم ﺗﻤـﺎم داﻳﺮﻛﺘﻮري ﻫﺎي ﻣﻮﺟﻮد در ﻣﺴﻴﺮي ﻛﻪ ﺑﺮاي آن ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از اﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي درﻳﺎﻓﺖ ﻧﺎم ﺗﻤـﺎﻣﻲ داﻳﺮﻛﺘﻮري ﻫﺎي ﻣﻮﺟﻮد در دراﻳﻮ Cاﺳﺘﻔﺎده ﻛﺮده اﻳﻢ. اﺻﻞ ﻛﺎر ﺣﻠﻘﻪ foreachﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي آن ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺑﻴﻦ ﺗﻤـﺎﻣﻲ اﺷـﻴﺎي ﻣﻮﺟـﻮد در ﻳـﻚ آراﻳـﻪ ﺧﺎص )ﻛﻪ ﺗﻌﺪاد آن را ﻧﻴﺰ ﻧﻤﻲ داﻧﻴﺪ( ﺣﺮﻛﺖ ﻛﻨﻴﺪ .ﺑﺮاي اﻳﺠﺎد اﻳﻦ ﺣﻠﻘﻪ ﺑﻪ ﻣﻨﺒﻌﻲ از اﺷﻴﺎ ﻧﻴﺎز دارﻳﺪ )در اﻳﻦ ﻣﺜﺎل ﻳﻚ آراﻳﻪ از رﺷﺘﻪ ﻫﺎ( و ﻳــﻚ ﻣﺘﻐﻴﻴــﺮ ﻛﻨﺘــﺮل ﻛﻨﻨــﺪه ﻛــﻪ در ﻫــﺮ ﻣﺮﺣﻠــﻪ ،ﺷــﻴﺊ ﻣــﻮرد ﺑﺮرﺳــﻲ در آن ﻗــﺮار ﺧﻮاﻫــﺪ ﮔﺮﻓــﺖ .در اﻳــﻦ ﻣﺜــﺎل ﺗــﺎﺑﻊ ،GetDirectoriesآراﻳــﻪ اي از اﺷــﻴﺎ را ﺑــﻪ ﻋﻨــﻮان ﻣﻨﺒــﻊ ﺑــﺮاي ﺣﻠﻘــﻪ foreachﻓــﺮاﻫﻢ ﻣــﻲ ﻛﻨــﺪ و ﻣﺘﻐﻴﻴــﺮ strFolderﺑﻪ ﻋﻨﻮان ﻣﺘﻐﻴﻴﺮ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﺑﻪ ﻛﺎر ﻣﻲ رود: foreach (string strFolder ))"\\in System.IO.Directory.GetDirectories("C: { // Add the item to the list ;)lstData.Items.Add(strFolder } اﻳﻦ ﻋﺒﺎرت ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ در ﻣﺮﺣﻠﻪ اول strFolder ،ﺑﺮاﺑﺮ ﺑﺎ اوﻟﻴﻦ آﻳﺘﻢ در آراﻳﻪ رﺷﺘﻪ اي اﺳﺖ )در اﻳـﻦ ﺟـﺎ ﺑﺮاﺑـﺮ ﺑـﺎ ﻓﻮﻟـﺪر " . ("C:\Documents and Settingsﺷـﻤﺎ ﻣﻴﺘﻮاﻧﻴـﺪ اﻳـﻦ ﻓﻮﻟـﺪر را ﺑـﺎ اﺳـﺘﻔﺎده از دﺳـﺘﻮر زﻳـﺮ ﺑـﻪ ListBoxاﺿﺎﻓﻪ ﻛﻨﻴﺪ. // Add the item to the list ;)lstData.Items.Add(strFolder ﻫﻤﺎﻧﻨﺪ ﺣﻠﻘﻪ ﻫﺎي forﻋﺎدي در ﻫﺮ ﻣﺮﺣﻠﻪ ،ﻳﻜﻲ از ﻋﻨﺎﺻﺮ اﻳﻦ آراﻳﻪ در ﻣﺘﻐﻴﻴﺮ strFolderﻗﺮار ﻣﻴﮕﻴﺮد و ﺳﭙﺲ ﻣﻘـﺪار آن ﺑﻪ ListBoxاﺿﺎﻓﻪ ﻣﻲ ﺷﻮد.
1ﺑﺎ ﻣﻔﻬﻮم ﻓﻀﺎي ﻧﺎم در ﻓﺼﻞ 9آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ.
١٤٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از رﺷﺘﻪ "\ "C:ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﺮاي ﺗﺎﺑﻊ ،GetDirectories از رﺷﺘﻪ "\\ "C:اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .در زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺧﺎﻧﻮاده Cاز ﺟﻤﻠﻪ ،C#ﻛﺎراﻛﺘﺮ \ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻛـﺎراﻛﺘﺮ ﻛﻨﺘﺮﻟـﻲ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد .ﻓﺮض ﻛﻨﻴﺪ ﻣﻴﺨﻮاﻫﻴﺪ رﺷﺘﻪ A " Signرا در ﻳﻚ ﻣﺘﻐﻴﻴﺮ رﺷﺘﻪ اي ذﺧﻴﺮه ﻛﻨﻴﺪ .اﻳﻦ رﺷﺘﻪ ﺷﺎﻣﻞ ﻛﺎراﻛﺘﺮ " اﺳﺖ ﻛﻪ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﻧﺘﻬﺎي رﺷﺘﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﭘﺲ ﻧﻤﻴﺘﻮان ﺑﻪ ﺣﺎﻟﺖ ﻋﺎدي اﻳﻦ رﺷﺘﻪ را در ﻳﻚ ﻣﺘﻐﻴﻴﺮ رﺷﺘﻪ اي ﻗـﺮار داد .ﺑﺮاي اﻳﻨﻜﻪ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﮕﻮﻳﻴﻢ ﻛﺎراﻛﺘﺮ " ﺟﺰﺋﻲ از رﺷﺘﻪ اﺳﺖ ،ﺑﺎﻳﺪ از ﻛﺎراﻛﺘﺮ \ ﻗﺒﻞ از آن اﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺑﻪ ﻫﻤـﻴﻦ ﺗﺮﺗﻴـﺐ ﺑـﺮاي اﻳﻦ ﻛﻪ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﮕﻮﻳﻴﻢ در رﺷﺘﻪ "\ "C:ﻛﺎراﻛﺘﺮ \ ﺟﺰﺋﻲ از رﺷﺘﻪ اﺳﺖ ،ﺑﺎﻳﺪ از دو \ ﺑﻪ ﺻﻮرت ﻣﺘﻮاﻟﻲ اﺳﺘﻔﺎده ﻛﻨﻴﻢ و رﺷﺘﻪ را ﺑﻪ ﺻﻮرت "\\ "C:ﺑﻨﻮﻳﺴﻴﻢ .اﮔﺮ اﻳﻦ ﻋﺒﺎرت را ﺑﻪ ﺻﻮرت "\ "C:ﺑﻨﻮﻳﺴﻴﻢ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺗﺼﻮر ﻣﻴﻜﻨـﺪ ﻛـﻪ ﺷـﻤﺎ اﻧﺘﻬـﺎي رﺷـﺘﻪ را ﻣﺸﺨﺺ ﻧﻜﺮده اﻳﺪ و ﺧﻄﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ،زﻳﺮا " را در اﻧﺘﻬﺎي رﺷﺘﻪ ،ﺑﻪ ﻋﻨﻮان ﺑﺨﺸﻲ از ﻋﺒﺎرت ﻣﺤﺴﻮب ﻣﻲ ﻛﻨﺪ.
ﺣﻠﻘﻪ ﻫﺎي :do ﻧﻮع دﻳﮕﺮي از ﺣﻠﻘﻪ ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﺣﻠﻘﻪ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺗﺎ زﻣﺎن ﺑﺮﻗﺮاري ﻳﻚ ﺷﺮط ﻣـﺸﺨﺺ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﻳﻜﻲ از اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ،ﺣﻠﻘﻪ ﻫﺎي doﻫﺴﺘﻨﺪ. در اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ،اﺑﺘﺪا دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ اﺟﺮا ﺷﺪه ،ﺳﭙﺲ ﺷﺮط ﺣﻠﻘﻪ ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد .در ﺻﻮرت درﺳﺖ ﺑﻮدن ﺷﺮط ﺣﻠﻘﻪ ،دﺳﺘﻮرات ﻣﺮﺑﻮط ﺑﻪ ﺣﻠﻘﻪ ﺑﺎر دﻳﮕﺮ ﻧﻴﺰ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ،دﺳﺘﻮرات اﺟﺮا ﻧﺨﻮاﻫﻨﺪ ﺷﺪ و اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘـﻪ ﻣﻨﺘﻘـﻞ ﻣﻲ ﺷﻮد .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ اي را اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﺗﻌﺪادي ﻋﺪد ﺗﺼﺎدﻓﻲ ﺗﻮﻟﻴﺪ ﻛﻨﺪ .ﺗﻮﻟﻴﺪ اﻳﻦ اﻋﺪاد ﺗﺼﺎدﻓﻲ ﺑـﻪ وﺳـﻴﻠﻪ ﺗﻮاﺑﻊ دروﻧﻲ .NETاﻧﺠﺎم ﻣﻲ ﺷﻮد و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻋﺪد 10ﺗﻮﻟﻴﺪ ﻧﺸﺪه اﺳﺖ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺣﻠﻘﻪ do (1در ﻗــﺴﻤﺖ ﻃﺮاﺣــﻲ ﻓــﺮم ،ﻛﻨﺘــﺮل Buttonدﻳﮕــﺮي ﺑــﻪ ﻓــﺮم اﺿــﺎﻓﻪ ﻛﻨﻴــﺪ .ﺧﺎﺻــﻴﺖ Nameآن را ﺑﺮاﺑــﺮ ﺑــﺎ btnDoLoopو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Do Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪﻫﺎي ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickدﻛﻤﻪ ﻓﺮﻣﺎن ﻗﺮار دﻫﻴﺪ: )private void btnDoLoop_Click(object sender, EventArgs e { // Declare variable ;)(Random objRandom = new Random ;int intRandomNumber = 0 // Clear the list ;)(lstData.Items.Clear // Process the loop until intRandomNumber = 10 do { // Get a random number between 0 and 24 ;)intRandomNumber = objRandom.Next(25 ١٤٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Add the number to the list ;)lstData.Items.Add(intRandomNumber ;)} while (intRandomNumber != 10 } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Do Loopﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 21-4ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد .ﺑـﺎر دﻳﮕﺮ روي اﻳﻦ دﻛﻤﻪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ اﻋﺪاد داﺧﻞ ListBoxﺑﺎ اﻋﺪاد دﻳﮕﺮي ﻋﻮض ﻣﻲ ﺷـﻮﻧﺪ و ﺑـﺎ ﻫﺮ ﺑﺎر ﻛﻠﻴﻚ ﻛﺮدن ﺗﻌﺪادي ﻋﺪد ﺟﺪﻳﺪ در ListBoxﻗﺮار ﻣﻲ ﮔﻴﺮد.
ﺷﻜﻞ 21-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻳﻚ ﺣﻠﻘﻪ doﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﺮط ﺧﺎص ﺑﺮﻗﺮار ﻧﺸﺪه اﺳﺖ اﺟﺮا ﻣـﻲ ﺷـﻮد .در اﻳـﻦ ﺣﻠﻘـﻪ ﻫـﺎ ،ﻫـﻴﭻ ﻣﺘﻐﻴﻴـﺮ ﻛﻨﺘـﺮل ﻛﻨﻨـﺪه و ﻳـﺎ ﺷﻤﺎرﺷﮕﺮي وﺟﻮد ﻧﺪارد ،ﺑﻠﻜﻪ ﺑﺎﻳﺪ ﺧﻮدﺗﺎن ﻣﻜﺎن ﻛﻨﻮﻧﻲ ﺣﻠﻘﻪ را ﻧﮕﻬﺪاري ﻛﻨﻴﺪ .در اﻳﻦ ﻣﺜﺎل اﺑﺘﺪا ﻳﻚ ﻣﺘﻐﻴﻴﺮ )ﺑـﻪ ﻋﺒـﺎرت دﻳﮕـﺮ ﻳـﻚ ﺷﻴﺊ( از ﻛﻼس Randomاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ .اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺗﻮاﺑﻊ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺗﻮﻟﻴﺪ ﻋﺪد ﺗﺼﺎدﻓﻲ را در اﺧﺘﻴﺎر ﺷﻤﺎ ﻗﺮار ﻣﻲ دﻫﺪ. ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺪاﻧﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ اﻳﺠﺎد ﺷﺪ ،ﺑﺎﻳﺪ ﻣﻘﺪار اوﻟﻴﻪ آن را ﻣﺸﺨﺺ ﻛﺮد و ﺳﭙﺲ از آن اﺳـﺘﻔﺎده ﻛـﺮد .ﺑـﺮاي ﺑﻌﻀﻲ از ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻫﻤﺎﻧﻨﺪ اﻋﺪاد ﺻﺤﻴﺢ ،ﺑﻪ راﺣﺘﻲ ﻣﻲ ﺗﻮان ﻣﻘﺪار اوﻟﻴﻪ ﻣﺸﺨﺺ ﻛﺮد .اﻣﺎ ﺑﺴﻴﺎري از ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎ اﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ را ﻧﻤﻲ ﺗﻮان ﻫﻤﺎﻧﻨﺪ اﻋﺪاد ﺻﺤﻴﺢ ﻣﻘﺪار اوﻟﻴﻪ داد .ﺑﺮاي ﻣﻘﺪار دﻫﻲ ﺑﻪ اﻳﻦ اﺷﻴﺎ )ﻫﻤﺎﻧﻨـﺪ ﺷـﻴﺊ objRandomدر ﻣﺜﺎل ﻗﺒﻞ( از ﻛﻠﻤﻪ ﻛﻠﻴﺪي newاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .در اﻳﻦ ﺣﺎﻟﺖ ﺧﻮد ﻛﻼس ،ﺑﺮاي ﺷﻴﺊ ﻳﻚ ﻣﻘﺪار اوﻟﻴﻪ اﻳﺠﺎد ﻛﺮده و آن را ﺑﻪ ﺷﻴﺊ ﻧﺴﺒﺖ ﻣﻲ دﻫﺪ.
١٤٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﻦ ﺷﻴﺊ ﺑﺎ ﭘﻴﺸﻮﻧﺪ objﻧﺎﻣﮕﺬاري ﺷﺪه اﺳﺖ ﺗﺎ ﻣﺸﺨﺺ ﺷﻮد ﻛﻪ ﻳﻚ ﺷﻴﺊ اﺳﺖ ﻛﻪ از ﻳﻚ ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه اﺳﺖ .ﻣﺘﻐﻴﻴﺮ ﺑﻌـﺪي ﻛﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ ،ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﻧﺎم intRandomNumberﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ وﻇﻴﻔﻪ ﻧﮕﻬﺪاري ﻋﺪد ﺗﺼﺎدﻓﻲ ﺗﻮﻟﻴﺪ ﺷﺪه ﺗﻮﺳﻂ objRandomرا ﺑﺮ ﻋﻬﺪه دارد: // Declare variable ;)(Random objRandom = new Random ;int intRandomNumber = 0 در ﻣﺮﺣﻠﻪ ﺑﻌﺪ ،ﻫﺮ ﻣﻮردي را ﻛﻪ ﻗﺒﻼ ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﺷﺪه ﺑﻮد از آن ﭘﺎك ﻣﻲ ﻛﻨﻴﺪ: // Clear the list ;)(lstData.Items.Clear ﺳﭙﺲ ﺣﻠﻘﻪ doرا ﺑﻪ ﻧﺤﻮي اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﺗﺎ ﺗﻮﻟﻴﺪ ﻋﺪد 10ﺑﻪ اﺟﺮاي ﺧـﻮد اداﻣـﻪ دﻫـﺪ .در اﻳـﻦ ﺣﻠﻘـﻪ ،اﺑﺘـﺪا ﺑـﺮاي ﻣﺮﺗﺒـﻪ اول دﺳﺘﻮرات اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ و ﺳﭙﺲ ﺷﺮط ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد .ﺑـﺎ ﻫـﺮ ﺑـﺎر اﺟـﺮاي ﺣﻠﻘـﻪ ﻋـﺪد ﺗـﺼﺎدﻓﻲ ﺟﺪﻳـﺪي ﺗﻮﻟﻴـﺪ و آن را در ﻣﺘﻐﻴﻴـﺮ intRandomNumberذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﺪ .ﺑﺮاي ﺗﻮﻟﻴﺪ ﻋﺪد ﺗﺼﺎدﻓﻲ از ﺗﺎﺑﻊ Nextدر ﺷﻴﺊ objRandomاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻳﻚ ﭘﺎراﻣﺘﺮ ﻣﻲ ﮔﻴﺮد .اﻳﻦ ﭘﺎراﻣﺘﺮ ﺑﺰرﮔﺘﺮﻳﻦ ﻋﺪدي ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﻟﻴﺪ ﻛﻨﺪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .در اﻳﻨﺠﺎ ﻋﺪد 25ﺑـﻪ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎده ﺷﺪه اﺳﺖ و ﻣﺸﺨﺺ ﻣﻴﻜﻨﺪ ﻛﻪ ﺗﺎﺑﻊ ﺑﺎﻳﺪ ﻋﺪد ﺗﺼﺎدﻓﻲ در ﺑﺎزه 0ﺗﺎ 24ﺗﻮﻟﻴﺪ ﻛﻨﺪ .ﺑﻌﺪ از ﺗﻮﻟﻴـﺪ ﻋـﺪد ﺗـﺼﺎدﻓﻲ ،آن را ﺑـﻪ ﻟﻴﺴﺖ ﺧﻮد اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﺪ: // Get a random number between 0 and 24 ;)intRandomNumber = objRandom.Next(25 // Add the number to the list ;)lstData.Items.Add(intRandomNumber در اﻧﺘﻬﺎ ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ آﻳﺎ ﻋﺪد ﺗﻮﻟﻴﺪ ﺷﺪه ﺑﺮاﺑﺮ ﺑﺎ 10ﺑﻮده اﺳﺖ ﻳﺎ ﻧﻪ؟ اﮔﺮ ﻋﺪد ﺗﻮﻟﻴﺪ ﺷﺪه ﻣﺨـﺎﻟﻒ 10ﺑﺎﺷـﺪ ،ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ اﺑﺘـﺪاي دﺳﺘﻮرات ﺣﻠﻘﻪ doﺑﺮﻣﻴﮕﺮدد و ﺑﺎر دﻳﮕﺮ ﺣﻠﻘﻪ را اﺟﺮا ﻣﻲ ﻛﻨﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت از ﺣﻠﻘﻪ ﺧﺎرج ﺷﺪه و ﺑﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘﻪ ﻣـﻲ رود. ﻧﻜﺘﻪ :ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ دﺳﺘﻮرات در اﻳﻦ ﺣﻠﻘﻪ ﻗﺒﻞ از ﺑﺮرﺳـﻲ ﺷـﺮط ﺣﺘﻤـﺎ ﻳـﻚ ﺑـﺎر اﺟـﺮا ﻣـﻲ ﺷـﻮﻧﺪ ،ﻧﻴـﺎزي ﻧﻴـﺴﺖ ﻛـﻪ ﺑـﻪ ﻣﺘﻐﻴﻴـﺮ intRandomNumberﻣﻘﺪار اوﻟﻴﻪ اﺧﺘﺼﺎص دﻫﻴﺪ .زﻳﺮا اﻳﻦ ﻣﺘﻐﻴﻴﺮ در ﻣﺮﺣﻠﻪ اوﻟﻲ ﻛﻪ دﺳﺘﻮرات ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷـﻮﻧﺪ ﻣﻘـﺪار ﻣﻲ ﮔﻴﺮد.
ﺣﻠﻘﻪ :while ﻋﻤﻠﻜﺮد اﻳﻦ ﺣﻠﻘﻪ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﺣﻠﻘﻪ doاﺳﺖ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺷﺮط اﻳﻦ ﺣﻠﻘﻪ در اﺑﺘﺪا ﺑﺮرﺳﻲ ﻣﻲ ﺷـﻮد و ﺳـﭙﺲ ،در ﺻـﻮرت درﺳـﺖ ﺑﻮدن آن دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .در ﺑﺨﺶ ﺑﻌﺪ ﻛﺎرﺑﺮد اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ را در ﺑﺮﻧﺎﻣﻪ ﺧﻮاﻫﻴﻢ دﻳﺪ.
١٥٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺣﻠﻘﻪ ﻫﺎي while (1ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻓﺮم ﺧـﻮد اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnDoWhileLoopو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Do While Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن ﻗﺮار دﻫﻴﺪ: private void btnDoWhileLoop_Click(object sender, )EventArgs e { // Declare variables ;)(Random objRandom = new Random ;int intRandomNumber = 0 // Clear the list ;)(lstData.Items.Clear // Process the loop while intRandomNumber < 15 )while (intRandomNumber < 15 { // Get a random number between 0 and 24 ;)intRandomNumber = objRandom.Next(25 // Add the number to the list ;)lstData.Items.Add(intRandomNumber } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Do While Loopﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 22-4ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. (4ﻫﺮ ﺑﺎر ﻛﻪ روي دﻛﻤﻪ ﻓﺮﻣﺎن ﻛﻠﻴﻚ ﻛﻨﻴﺪ اﻋﺪاد ﺟﺪﻳﺪي درون ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺗﻮﻟﻴﺪ اﻳﻦ اﻋـﺪاد ﺗـﺎ زﻣـﺎﻧﻲ ﻛـﻪ ﻋﺪدي ﺑﺰرﮔﺘﺮ از 15ﺗﻮﻟﻴﺪ ﺷﻮد ،اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻴﻢ ،ﻋﻤﻠﻜﺮد ﺣﻠﻘﻪ whileﻫﻤﺎﻧﻨﺪ ﺣﻠﻘﻪ doاﺳﺖ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ در اﻳﻦ ﻧﻮع ﺣﻠﻘﻪ ،ﺷـﺮط در اﺑﺘـﺪا ﺑﺮرﺳـﻲ ﻣـﻲ ﺷﻮد و در ﺻﻮرت درﺳﺖ ﺑﻮدن آن ،دﺳﺘﻮرات ﺣﻠﻘﻪ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺮﻧﺎﻣﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘﻪ را اﺟﺮا ﻣﻲ ﻛﻨﺪ. در اﻳﻦ ﻣﺜﺎل ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺣﻠﻘﻪ ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ ،در اﺑﺘﺪا ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ ﻛـﻪ آﻳـﺎ ﻣﻘـﺪار intRandomNumberاز 15 ﻛﻮﭼﻜﺘﺮ اﺳﺖ ﻳﺎ ﻧﻪ؟ در ﺻﻮرﺗﻲ ﻛﻪ ﺷﺮط درﺳﺖ ﺑﺎﺷﺪ ،دﺳﺘﻮرات داﺧﻞ ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ. // Process the loop while intRandomNumber < 15 )while (intRandomNumber < 15 {
١٥١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Get a random number between 0 and 24 ;)intRandomNumber = objRandom.Next(25 // Add the number to the list ;)lstData.Items.Add(intRandomNumber } ﺑﻌﺪ از اﻳﻨﻜﻪ ﺣﻠﻘﻪ ﺑﺮاي ﻣﺮﺗﺒﻪ اول اﺟﺮا ﺷﺪ ،ﻋﺪد ﺗﺼﺎدﻓﻲ ﺟﺪﻳﺪ در ﻣﺘﻐﻴﻴﺮ intRandomNumberﻗﺮار ﻣﻲ ﮔﻴﺮد و ﺷﺮط ﺣﻠﻘﻪ ﻣﺠﺪدا ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد .اﮔﺮ ﻋﺪد ﺗﻮﻟﻴﺪ ﺷﺪه از 15ﻛﻮﭼﻜﺘﺮ ﺑﺎﺷﺪ دﺳﺘﻮرات ﺣﻠﻘﻪ دوﺑﺎره اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .در ﻏﻴﺮ اﻳـﻦ ﺻـﻮرت ،ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘﻪ ﻣﻲ ﺷﻮد و دﺳﺘﻮرات آن را اﺟﺮا ﻣﻴﻜﻨﺪ.
ﺷﻜﻞ 22-4
ﺷﺮﻃﻬﺎي ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮاي ﺣﻠﻘﻪ ﻫﺎي doو :while ﻣﻤﻜﻦ اﺳﺖ از ﻋﺒﺎرﺗﻬﺎي ﺷﺮﻃﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ در اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﺗﻌﺠﺐ ﻛﻨﻴﺪ .وﻟﻲ ﻫﺮ ﻋﺒﺎرﺗﻲ را ﻛﻪ ﺑﺘﻮاﻧﻴﺪ در دﺳـﺘﻮر if اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﺑﻪ ﻋﻨﻮان ﺷﺮط ﺣﻠﻘﻪ doو whileﻧﻴﺰ ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ .ﺑﺮاي ﻣﺜﺎل ﺑﻪ ﺷﺮط ﻫﺎي زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ: )while (intX > 10 && intX < 100 ﻳﺎ: do { ;)} while ((intX > 10 && intX < 100) || intY == true ﻳﺎ:
١٥٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)while (String.Compare(strA, strB) > 0 ﺧﻼﺻﻪ ،اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ ﻗﺪرت و اﻧﻌﻄﺎف ﭘﺬﻳﺮي ﺑﺴﻴﺎر زﻳﺎدي دارﻧﺪ.
ﺣﻠﻘﻪ ﻫﺎي ﺗﻮدرﺗﻮ: در ﺑﻌﻀﻲ از ﺷﺮاﻳﻂ ﻣﻤﻜﻦ اﺳﺖ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ در ﺣﻴﻦ اﻳﻦ ﻛﻪ درون ﻳﻚ ﺣﻠﻘﻪ ﻫﺴﺘﻴﺪ ،ﺣﻠﻘﻪ ﺟﺪﻳﺪي را ﺷﺮوع ﻛﻨﻴـﺪ .ﺑـﻪ اﻳـﻦ ﻧـﻮع ﺣﻠﻘﻪ ﻫﺎ ،ﺣﻠﻘﻪ ﻫﺎي ﺗﻮدرﺗﻮ ﻣﻲ ﮔﻮﻳﻨﺪ و در اﺻﻞ ﻫﻤﺎﻧﻨﺪ دﺳﺘﻮرات ifﺗﻮدرﺗﻮ ﻫﺴﺘﻨﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛـﺮد ﻛـﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ از اﻳﻦ ﻧﻮع ﺣﻠﻘﻪ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺣﻠﻘﻪ ﻫﺎي ﺗﻮدرﺗﻮ (1در ﻗــﺴﻤﺖ ﻃﺮاﺣــﻲ ﻓــﺮم ،ﻛﻨﺘــﺮل Buttonدﻳﮕــﺮي ﺑــﻪ ﻓــﺮم اﺿــﺎﻓﻪ ﻛﻨﻴــﺪ ،ﺧﺎﺻــﻴﺖ Nameآن را ﺑﺮاﺑــﺮ ﺑــﺎ btnNestedLoopو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Nested Loopﻗﺮار دﻫﻴﺪ. (2ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickوارد ﻛﻨﻴﺪ. private void btnNestedLoops_Click(object sender, )EventArgs e { // Process an outer loop )for (int intLoop1 = 1; intLoop1 <= 2; intLoop1++ { // Process a nested (inner) loop )for (int intLoop2 = 1; intLoop2 <= 3; intLoop2++ { " lstData.Items.Add(intLoop1 + ", ;)+ intLoop2 } } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ Nested Loopﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷـﻜﻞ 23-4را ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛﺮد.
١٥٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 23-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﺪ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﻼ ﻣﺸﺨﺺ اﺳﺖ و ﺟﺎي اﺑﻬﺎﻣﻲ ﻧﺪارد .ﺣﻠﻘﻪ اول )ﺣﻠﻘﻪ ﺑﻴﺮوﻧﻲ( ﺑﺎ اﺳﺘﻔﺎده از ﺷﻤﺎرﺷﮕﺮ intLoop1از ﻋـﺪد 1 ﺗﺎ 2و ﺣﻠﻘﻪ دوم ﻳﺎ ﺣﻠﻘﻪ دروﻧﻲ ﺑﺎ اﺳﺘﻔﺎده از ﺷﻤﺎرﺷﮕﺮ intLoop2از 1ﺗﺎ 3ﺣﺮﻛﺖ ﻣﻲ ﻛﻨﺪ .در ﺣﻠﻘﻪ دروﻧﻲ ﻛﺪي ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺪار ﻣﺘﻐﻴﻴﺮ ﻫﺎي intLoop1و intLoop2وﺟﻮد دارد: // Process an outer loop )for (int intLoop1 = 1; intLoop1 <= 2; intLoop1++ { // Process a nested (inner) loop )for (int intLoop2 = 1; intLoop2 <= 3; intLoop2++ { " lstData.Items.Add(intLoop1 + ", ;)+ intLoop2 } } در ﺣﻠﻘﻪ ﻫﺎي ﺗﻮ در ﺗﻮ ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﺣﻠﻘﻪ اي ﻛﻪ در درون ﻳﻚ ﺣﻠﻘﻪ دﻳﮕﺮ ﺷﺮوع ﻣﻲ ﺷﻮد ،در ﻫﻤﺎن ﺣﻠﻘﻪ ﻧﻴﺰ ﺗﻤﺎم ﻣﻲ ﺷﻮد. ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻛﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﺣﻠﻘﻪ دروﻧﻲ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ در ﺧﺎرج از ﺣﻠﻘﻪ ﺑﻴﺮوﻧﻲ ﻗﺮار ﺑﮕﻴﺮﻧﺪ .در اﻳﻨﺠﺎ اوﻟﻴﻦ آﻛﻮﻻدي ﻛﻪ ﺑﺴﺘﻪ ﺷـﺪه اﺳﺖ ﻣﺮﺑﻮط ﺑﻪ ﺣﻠﻘﻪ داﺧﻠﻲ اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي اوﻟﻴﻦ ﺑﺎر وارد ﺣﻠﻘﻪ intLoop1ﻣﻲ ﺷﻮد ،ﺣﻠﻘـﻪ intLoop2را ﺳﻪ ﺑﺎر اﺟﺮا ﻣﻲ ﻛﻨﺪ .ﺳﭙﺲ ﻳﻚ واﺣﺪ ﺑﻪ ﺷﻤﺎرﻧﺪه ﺣﻠﻘﻪ intLoop1اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ و ﺑﺎر دﻳﮕﺮ ﺳـﻪ ﺑـﺎر دﺳـﺘﻮرات داﺧـﻞ ﺣﻠﻘـﻪ intLoop2را اﺟﺮا ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﺗﻜﺮار اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ ﺗﺎ دﻓﻌﺎت ﺗﻜﺮار ﺣﻠﻘﻪ اول ﺑﻪ ﭘﺎﻳﺎن ﺑﺮﺳﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮﻧﺎﻣﻪ از ﻫﺮ دو ﺣﻠﻘﻪ ﺧﺎرج ﻣﻲ ﺷﻮد و ﺑﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از آﻧﻬﺎ ﻣﻲ رود.
١٥٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺮوج زودﻫﻨﮕﺎم از ﺣﻠﻘﻪ: ﺑﻌﻀﻲ ﻣﻮاﻗﻊ در ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﻳﻚ ﺣﻠﻘﻪ forﺗﺎ اﻧﺘﻬﺎ اﺟﺮا ﺷﻮد .ﻣﺜﻼ در ﻳﻚ ﻟﻴﺴﺖ ﺑـﻪ دﻧﺒـﺎل ﻣـﻮردي ﺧـﺎص ﻣﻴﮕﺮدﻳـﺪ و ﻣﻴﺨﻮاﻫﻴﺪ ﺑﺎ ﭘﻴﺪا ﺷﺪن آن ﻣﻮرد از ﺣﻠﻘﻪ ﺧﺎرج ﺷﻮﻳﺪ ،زﻳﺮا ﮔﺸﺘﻦ ﺑﻘﻴﻪ ﻋﻨﺎﺻﺮ ﻟﻴﺴﺖ ﻻزم ﻧﻴﺴﺖ. در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﺗﻤﺎم ﻓﻮﻟﺪرﻫﺎي دراﻳـﻮ Cرا ﻧﻤـﺎﻳﺶ ﻣﻴـﺪاد ﺑـﻪ ﻧﺤـﻮي ﺗﻐﻴﻴـﺮ ﻣﻴﺪﻫﻴـﺪ ﻛـﻪ ﺑـﺎ رﺳـﻴﺪن ﺑـﻪ ﻓﻮﻟـﺪر C:\Program Filesﭘﻴﻐﺎﻣﻲ را ﻧﺸﺎن دﻫﺪ و از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﻮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺧﺮوج زودﻫﻨﮕﺎم از ﺣﻠﻘﻪ (1ﻛﻨﺘﺮل Buttonﺟﺪﻳﺪي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑـﺮ btnQuittingAForLoop و ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Quitting a For Loopﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن ﻗﺮار دﻫﻴﺪ: private void btnQuittingAForLoop_Click(object sender, )EventArgs e { // List each folder at the root of your C Drive foreach (string strFolder in ))"\\System.IO.Directory.GetDirectories("C: { // Add the item to the list ;)lstData.Items.Add(strFolder ?// Do you have the folder C:\Program Files if(String.Compare(strFolder, )"c:\\program files",true) == 0 { // Tell the user "MessageBox.Show("Found it, exiting the loop ;)"+ " now.","Loops // Quit the loop early ;break } } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Quitting A For Loopﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷـﻜﻞ 24-4 را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
١٥٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 24-4
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﺮ ﺑﺎر ﻛﻪ ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮد ،ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ String.Compareﻛﻪ ﻧﺤﻮه ﻛﺎر آن ﻗﺒﻼ ﺗﻮﺿﻴﺢ داده ﺷﺪ ،ﺑﺮرﺳﻲ ﻣﻴﻜﻨﻴـﺪ ﻛﻪ آﻳﺎ ﻧﺎم ﻓﻮﻟﺪر ﺑﺮاﺑﺮ ﺑﺎ C:\Program Filesاﺳﺖ ﻳﺎ ﻧﻪ؟ ?// Do you have the folder C:\Program Files )if(String.Compare(strFolder,"c:\\program files",true) == 0 در ﺻﻮرﺗﻲ ﻛﻪ ﻧﺎم ﻓﻮﻟﺪر ﺑﺮاﺑﺮ ﺑﺎ " "C:\Program Filesﺑﻮد اﺑﺘﺪا ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﻴﺪ. // Tell the user ;)"MessageBox.Show("Found it, exiting the loop now.","Loops ﺑﻌﺪ از آن ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر breakاز ﺣﻠﻘﻪ ﺧﺎرج ﻣﻲ ﺷﻮﻳﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻳﮋوال C#ﺑﻪ اﻳﻦ دﺳﺘﻮر ﺑﺮﺳﺪ ،ﺑﻪ اوﻟﻴﻦ ﺧﻂ ﺑﻌﺪ از ﺣﻠﻘﻪ ﻣﻲ رود و آن را اﺟﺮا ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﻣﺜﺎل از دﺳﺘﻮر breakﺑﺮاي ﺧﺮوج از ﺣﻠﻘﻪ forاﺳﺘﻔﺎده ﻛﺮدﻳﻢ اﻣﺎ از اﻳـﻦ دﺳﺘﻮر ﺑﺮاي ﺧﺮوج زودﻫﻨﮕﺎم از ﻫﺮ ﻧﻮع ﺣﻠﻘﻪ اي در C#ﻣﻴﺘﻮاﻧﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. // Quit the loop early ;break
١٥٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻟﺒﺘﻪ اﮔﺮ ﻧﺎم ﻓﻮﻟﺪر ﺑﺮاﺑﺮ ﺑﺎ ﻧﺎﻣﻲ ﻛﻪ ﺑﻪ دﻧﺒﺎل آن ﻫﺴﺘﻴﺪ ﻧﺒﺎﺷﺪ ،ﺟﺴﺘﺠﻮ ﺗﺎ اﻧﺘﻬﺎي ﻟﻴﺴﺖ اداﻣﻪ ﭘﻴﺪا ﻣﻴﻜﻨﺪ .در ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑـﺮاي ﺟـﺴﺘﺠﻮي ﻳﻚ ﻣﻮرد ﺧﺎص ﻣﻌﻤﻮﻻ از ﺣﻠﻘﻪ ﻫﺎي forاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .اﺳﺘﻔﺎده از دﺳﺘﻮر breakﺑﺮاي ﺧﺮوج از ﺣﻠﻘﻪ ﻫﻨﮕﺎم ﭘﻴﺪا ﺷﺪن آﻳﺘﻢ ﻣﻮرد ﻧﻈﺮ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد. ﺗﺼﻮر ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻟﻴﺴﺘﻲ ﺷﺎﻣﻞ 1000آﻳﺘﻢ را ﺟﺴﺘﺠﻮ ﻛﻨﻴﺪ و آﻳﺘﻢ ﻣﻮرد ﻧﻈﺮ ﺷﻤﺎ در ﻣﻜﺎن دﻫﻢ ﻗﺮار دارد .اﮔﺮ ﺑﻌﺪ از ﭘﻴـﺪا ﻛـﺮدن آن از ﺣﻠﻘﻪ ﺧﺎرج ﻧﺸﻮﻳﺪ ،از ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ 990آﻳﺘﻢ را ﺑﻲ دﻟﻴﻞ ﺟﺴﺘﺠﻮ ﻛﻨﺪ ﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺷـﺪت ﻛـﻢ ﺷﻮد. ﻧﻜﺘﻪ :ﺑﻪ ﻧﺤﻮه ﻧﻮﺷﺘﻦ آدرﺳﻬﺎ در ﻋﺒﺎرﺗﻬﺎي رﺷﺘﻪ اي اﻳﻦ ﺑﺮﻧﺎﻣﻪ دﻗﺖ ﻛﻨﻴﺪ .ﻛﺎراﻛﺘﺮ \ در ﺗﻤﺎم آﻧﻬﺎ ﺑﻪ ﺻﻮرت \\ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳـﺖ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ ﻗﺒﻠﻲ ﺷﺮح داده ﺷﺪ ،ﺑﺮاي ﻗﺮار دادن ﻛﺎراﻛﺘﺮ \ در رﺷﺘﻪ ﺑﺎﻳﺪ از \\ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در ﺑﺮﻧﺎﻣﻪ ﺑـﺎﻻ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از رﺷﺘﻪ " "c:\\program filesاز " "c:\program filesاﺳﺘﻔﺎده ﻛﻨﻴﺪ ﺑﺎ ﺧﻄﺎي " "Unrecognized scape sequenceروﺑﺮو ﺧﻮاﻫﻴﺪ ﺷﺪ ،زﻳﺮا ﺑﻌﺪ از ﻛﺎراﻛﺘﺮ \ در ﻳـﻚ رﺷـﺘﻪ ،ﺑﺎﻳـﺪ ﻳـﻚ ﻛﺎراﻛﺘﺮ ﻛﻨﺘﺮﻟﻲ ﺑﺎ ﻣﻌﻨﻲ ﺑﺮاي ﻛﺎﻣﭙﺎﻳﻠﺮ ﻗﺮار ﺑﮕﻴﺮد و ﻛﺎراﻛﺘﺮ pﺟﺰ اﻳﻦ ﻛﺎراﻛﺘﺮﻫﺎ ﻧﻴﺴﺖ. ﻧﻜﺘﻪ :ﺑﻪ ﻛﺪ زﻳﺮ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻳﻚ ﺛﺎﺑﺖ رﺷﺘﻪ اي دﻗﺖ ﻛﻨﻴﺪ: ;"string FileName = @"C:\Test\Temp.txt در اﻳﻦ ﻛﺪ ﺑﺮ ﺧﻼف ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ از دو ﻛﺎراﻛﺘﺮ \ اﺳﺘﻔﺎده ﻧﻜﺮده اﻳﻢ .ﺑﻠﻜﻪ ﻓﻘﻂ ﻳﻚ \ ﺑﻪ ﻛـﺎر ﺑـﺮده اﻳـﻢ و ﻗﺒـﻞ از رﺷـﺘﻪ ﻫـﻢ از ﻋﻼﻣﺖ @ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .در وﻳﮋوال C#اﮔﺮ ﻗﺒﻞ از ﺷﺮوع ﻳﻚ رﺷﺘﻪ از ﻋﻼﻣﺖ @ اﺳـﺘﻔﺎده ﺷـﻮد ،ﺗﻤـﺎم ﻛﺎراﻛﺘﺮﻫـﺎي ﻛﻨﺘﺮﻟـﻲ در رﺷﺘﻪ ﺑﻪ ﺻﻮرت ﻛﺎراﻛﺘﺮﻫﺎي ﻋﺎدي در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﻧﺪ و رﺷﺘﻪ ﺗﺎ ﻋﻼﻣﺖ ﻧﻘﻞ ﻗﻮل ﺑﻌﺪي اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ .در اﻳﻦ رﺷﺘﻪ ﻫﻢ ﻗﺒﻞ از ﺷﺮوع از ﻋﻼﻣﺖ @ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻤﺎم ﻛﺎراﻛﺘﺮ ﻫﺎ )ﺣﺘﻲ \( ﺗﺎ ﻛﺎراﻛﺘﺮ ﻧﻘﻞ ﻗﻮل ﭘﺎﻳﺎﻧﻲ ﺟﺰﺋﻲ از رﺷﺘﻪ ﺑﻪ ﺷﻤﺎر ﻣﻲ روﻧﺪ.
دﺳﺘﻮر :continue در ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ دﺳﺘﻮرات ﺣﻠﻘﻪ در ﺷﺮاﻳﻄﻲ ﺧﺎص اﺟﺮا ﻧﺸﻮﻧﺪ .ﻓـﺮض ﻛﻨﻴـﺪ ﻣﻴﺨﻮاﻫﻴـﺪ اﻋـﺪاد 1ﺗـﺎ 15را ﻛـﻪ ﻣﻀﺮﺑﻲ از 3ﻧﻴﺴﺘﻨﺪ در ListBoxﻗﺮار دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ از ﻳﻚ ﺣﻠﻘﻪ forاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ ﻛـﻪ ﺷـﻤﺎرﻧﺪه آن از ﻳـﻚ ﺗـﺎ ﭘﺎﻧﺰده ،ﻳﻚ واﺣﺪ ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ ﻳﺎﺑﺪ ،اﻣﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد ﺑﺮ ﺳﻪ ﺑﺨﺶ ﭘﺬﻳﺮ ﺑﻮد ﻧﺒﺎﻳﺪ آن را در ListBoxﻗﺮار دﻫﻴـﺪ و ﺑـﻪ ﻋﺪد ﺑﻌﺪي ﺑﺮوﻳﺪ. در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﻧﺤﻮه ﻧﻮﺷﺘﻦ ﭼﻨﻴﻦ ﺑﺮﻧﺎﻣﻪ اي را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :دﺳﺘﻮر continue (1ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ ﺑـﺎ btnContinueو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Continueﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ:
١٥٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)private void btnContinue_Click(object sender, EventArgs e { // Perform a loop )for (int intCount = 1; intCount <= 15; intCount++ { // If the item is dividable by 3, // go to next number )if ((intCount % 3) == 0 ;continue // Add the item to the list ;)lstData.Items.Add(intCount } } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Continueﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛـﻪ ﺗﻤـﺎم اﻋـﺪاد از 1ﺗـﺎ 15ﺑـﻪ ﺟـﺰ ﻣﻀﺎرب ﺳﻪ در ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ دﺳﺘﻮر continueﺑﺎﻋﺚ ﺧﺮوج ﻛﺎﻣﻞ از ﺣﻠﻘﻪ ﻧﻤﻲ ﺷﻮد ،ﺑﻠﻜﻪ در ﻫﺮ ﻗﺴﻤﺘﻲ ﻛﻪ اﺳﺘﻔﺎده ﺷﻮد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺑﻘﻴﻪ دﺳﺘﻮرات ﺣﻠﻘﻪ ﻛﻪ ﺑﻌﺪ از اﻳﻦ دﺳﺘﻮر ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻧﺸﻮﻧﺪ و ﺣﻠﻘﻪ ﻣﺠﺪدا اﺟﺮا ﺷﻮد .در اﻳﻦ ﻣﺜﺎل ﺑـﺮاي اﻋـﺪاد 1و ،2ﺣﻠﻘـﻪ ﺑـﻪ ﺻـﻮرت ﻋﺎدي ﻛﺎر ﻣﻲ ﻛﻨﺪ .ﺑﺎ رﺳﻴﺪن ﺑﻪ ﻋﺪد ﺳﻪ ،ﺑـﻪ ﻋﻠـﺖ اﻳﻨﻜـﻪ ﺑﺎﻗﻴﻤﺎﻧـﺪه اﻳـﻦ ﻋـﺪد ﺑـﺮ ﺳـﻪ ﺑﺮاﺑـﺮ ﺑـﺎ ﺻـﻔﺮ اﺳـﺖ ،ﻛﺎﻣﭙـﺎﻳﻠﺮ ﺑـﻪ دﺳـﺘﻮر continueﻣﻲ رﺳﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻳﮋوال C#ﺑﻪ اﻳﻦ دﺳﺘﻮر رﺳﻴﺪ ،ﺑﻘﻴﻪ دﺳﺘﻮرات ﺣﻠﻘﻪ را اﺟﺮا ﻧﻤﻲ ﻛﻨﺪ ،ﺑﻠﻜﻪ ﺷﻤﺎرﻧﺪه ﺣﻠﻘـﻪ را ﻳﻚ واﺣﺪ اﻓﺰاﻳﺶ ﻣﻴﺪﻫﺪ و ﺣﻠﻘﻪ را ﺑﺮاي ﻋﺪد 4اﺟﺮا ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﺮﺗﺒﻪ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ اﻋﺪاد ﻗﺒﻞ از ،3ﭼﻮن ﻋﺪد 4ﻣـﻀﺮﺑﻲ از 3ﻧﻴـﺴﺖ ﭘﺲ ﺑﺎﻗﻴﻤﺎﻧﺪه ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻧﻤﻲ ﺷﻮد و ﻋﺒﺎرت داﺧﻞ ifدرﺳﺖ ﻧﻴﺴﺖ .ﭘﺲ دﺳﺘﻮر continueاﺟﺮا ﻧﻤﻲ ﺷﻮد و ﺑﻘﻴﻪ دﺳـﺘﻮرات ﺣﻠﻘﻪ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ. ﻧﻜﺘﻪ :ﻋﻤﻠﮕﺮ %ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﺑﺎﻗﻴﻤﺎﻧﺪه ﺗﻘﺴﻴﻢ دو ﻋﺪد ﺑﻪ ﻛﺎر ﻣﻴﺮود .در اﻳﻦ ﻣﺜﺎل اﺳﺘﻔﺎده از اﻳﻦ ﻋﻤﻠﮕﺮ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد در ﻫﺮ ﻣﺮﺣﻠﻪ ﺑﺎﻗﻴﻤﺎﻧﺪه ﺗﻘﺴﻴﻢ intCountﺑﺮ ﺳﻪ ﻣﺤﺎﺳﺒﻪ ﺷﻮد و در ﺷﺮط ifﺑﺮرﺳﻲ ﺷﻮد.
ﺣﻠﻘﻪ ﻫﺎي ﺑﻲ ﻧﻬﺎﻳﺖ: ﻫﻨﮕﺎم اﻳﺠﺎد ﺣﻠﻘﻪ ﻫﺎ ،ﻣﻴﺘﻮاﻧﻴﺪ ﺣﻠﻘﻪ ﻫﺎﻳﻲ اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ ﺑﻴﻨﻬﺎﻳﺖ ﺑﺎر اﺟﺮا ﺷﻮﻧﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﺮوع ﺷﻮﻧﺪ ،ﻫـﻴﭻ وﻗـﺖ ﺗﻤﺎم ﻧﺸﻮﻧﺪ .ﺑﻪ ﺣﻠﻘﻪ اﻳﺠﺎد ﺷﺪه در ﻛﺪ زﻳﺮ ﻧﮕﺎه ﻛﻨﻴﺪ: )for (int intCount = 1; intCount > 0; intCount++ {
١٥٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)lstData.Items.Add(intCount } ﺑﺎ ﺷﺮوع ﺣﻠﻘﻪ ﻣﻘﺪار ﺷﻤﺎرﻧﺪه ﺑﺮاﺑﺮ ﺑﺎ ﻋﺪد 1اﺳﺖ و ﭼﻮن از ﺻﻔﺮ ﺑﺰرﮔﺘﺮ اﺳﺖ ﺣﻠﻘﻪ ﺑﺮاي ﺑﺎر اول اﺟﺮا ﻣﻲ ﺷﻮد .ﺑﻌﺪ از اﺟﺮاي دﺳـﺘﻮرات ﺣﻠﻘﻪ ،ﺷﻤﺎرﻧﺪه ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ و ﺑﺮاﺑﺮ ﺑﺎ دو ﻣﻲ ﺷﻮد .در اﻳﻦ ﻣﺮﺣﻠﻪ ﻧﻴﺰ ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﻋﺪد 2از ﺻﻔﺮ ﺑﺰرﮔﺘﺮ اﺳﺖ ،ﺣﻠﻘﻪ ﻣﺠﺪدا اﺟﺮا ﻣـﻲ ﺷﻮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﺷﻤﺎرﻧﺪه ي اﻳﻦ ﺣﻠﻘﻪ ﻫﻴﭽﮕﺎه ﺑﻪ ﻋﺪدي ﻛﻮﭼﻜﺘﺮ از ﺻﻔﺮ ﻧﻤﻲ رﺳـﺪ ،ﭘـﺲ ﺷـﺮط ﺣﻠﻘـﻪ ﻫﻤـﻮاره درﺳﺖ اﺳﺖ .اﻳﻦ ﺣﻠﻘﻪ ﺑﻴﻨﻬﺎﻳﺖ ﺑﺎر اﺟﺮا ﻣﻲ ﺷﻮد .ﻣﻤﻜﻦ اﺳﺖ ﺑﺮﻧﺎﻣﻪ ﺗﻮﻗﻒ ﻧﻜﻨﺪ اﻣﺎ ﺑﻪ ﻛﻠﻴﻚ ﻫﺎي ﺑﻌﺪي ﭘﺎﺳﺨﻲ ﻧﺨﻮاﻫـﺪ داد و داﺋﻤـﺎ دﺳﺘﻮرات ﺣﻠﻘﻪ را اﺟﺮا ﻣﻲ ﻛﻨﺪ. اﮔﺮ ﺣﺲ ﻛﺮدﻳﺪ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ درون ﻳﻚ ﺣﻠﻘﻪ ﺑﻲ ﻧﻬﺎﻳﺖ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ،ﺑﺎﻳـﺴﺘﻲ آن را ﺑﺒﻨﺪﻳـﺪ .اﮔـﺮ ﺑﺮﻧﺎﻣـﻪ را در ﻣﺤـﻴﻂ وﻳـﮋوال اﺳﺘﻮدﻳﻮ اﺟﺮا ﻛﺮده اﻳﺪ ،ﺑﻪ ﻣﺤﻴﻂ وﻳﮋوال اﺳـﺘﻮدﻳﻮ ﺑﺮﮔﺮدﻳـﺪ و از ﻣﻨـﻮي Debugﮔﺰﻳﻨـﻪ Stop Debuggingرا اﻧﺘﺨـﺎب ﻛﻨﻴﺪ .اﻳﻦ ﮔﺰﻳﻨﻪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ را ﻓﻮرا ﻣﺘﻮﻗﻒ ﻣﻲ ﻛﻨﺪ .اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﭙﺎﻳﻞ ﺷﺪه را در ﻣﺤﻴﻂ وﻳﻨﺪوز اﺟﺮا ﻛـﺮده اﻳـﺪ و درون ﻳـﻚ ﺣﻠﻘـﻪ ﺑﻴﻨﻬﺎﻳﺖ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ،ﺑﺮاي ﺑﺴﺘﻦ آن ﺑﺎﻳـﺪ از Task Managerاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .ﻛﻠﻴـﺪﻫﺎي Ctrl + Alt + Delرا ﻓﺸﺎر دﻫﻴﺪ ،ﺑﺮﻧﺎﻣﻪ Task Managerﺑﺎز ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ در ﺣﻠﻘﻪ ي ﺑﻴﻨﻬﺎﻳﺖ ﻗﺮار دارد ﺑﻪ ﻋﻨﻮان Not Respondingﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺑﺮﻧﺎﻣﻪ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ و ﺑﺮ روي End Taskﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﭘﻨﺠﺮه اي ﺑﺎز ﺧﻮاﻫﺪ ﺷﺪ و ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻮرد ﻧﻈﺮ ﭘﺎﺳﺨﻲ ﻧﻤﻲ دﻫﺪ ،آﻳﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ آن را ﺑﻪ اﺟﺒﺎر ﺑﺒﻨﺪﻳﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻧﻴﺰ ﺑـﺮ روي End Task ﻛﻠﻴﻚ ﻛﻨﻴﺪ. در ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ﻣﻤﻜﻦ اﺳﺖ ﺣﻠﻘﻪ آﻧﻘﺪر ﺣﺎﻓﻈﻪ ﺳﻴﺴﺘﻢ را ﻣﺼﺮف ﻛﻨﺪ ﻛﻪ ﻧﺘﻮاﻧﻴﺪ ﭘﻨﺠﺮه Task Managerرا ﺑﺎز ﻛﻨﻴﺪ و ﻳـﺎ ﺑﻪ ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺮﮔﺮدﻳﺪ .در اﻳﻦ ﻣﻮاﻗﻊ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻘﺪاري ﺻﺒﺮ ﻛﻨﻴﺪ و ﻣﺠﺪدا اﻳﻦ روﺷﻬﺎ را اﻣﺘﺤﺎن ﻛﻨﻴﺪ و ﻳﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد را ﻣﺠﺪدا راه اﻧﺪازي ﻛﻨﻴﺪ. ﻫﺮ ﺑﺎر ﻛﻪ در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻣﻲ ﻛﻨﻴﺪ ،اﺑﺘﺪا ﺑﺮﻧﺎﻣﻪ ﺗﻮﺳﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ در دﻳﺴﻚ ذﺧﻴﺮه ﻣﻲ ﺷﻮد و ﺳﭙﺲ اﺟﺮا ﻣﻲ ﺷﻮد ،ﺗﺎ اﮔﺮ ﺑﻪ ﻋﻠﺘﻲ ﻣﺠﺒﻮر ﺑﻪ راه اﻧﺪازي ﻣﺠﺪد ﻛﺎﻣﭙﻴﻮﺗﺮ ﺷﺪﻳﺪ ﻛﺪﻫﺎي ﺧﻮد را از دﺳﺖ ﻧﺪﻫﻴﺪ.
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ روﺷﻬﺎي ﮔﻮﻧﺎﮔﻮﻧﻲ ﻛﻪ ﻣﻴﺘﻮان ﺑﻪ وﺳﻴﻠﻪ آﻧﻬﺎ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻛﺮده و ﻳﺎ ﻗﺴﻤﺘﻲ از ﻛﺪ را ﭼﻨﺪ ﺑﺎر اﺟﺮا ﻛـﺮد را ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ .اﺑﺘﺪا ﻋﻤﻠﮕﺮ ﻫﺎﻳﻲ را ﻛﻪ ﻣﻴﺘﻮاﻧﻴﻢ در دﺳﺘﻮر ifاﺳﺘﻔﺎده ﻛﻨﻴﻢ ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ ،ﺳﭙﺲ دﻳﺪﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻴﺘﻮان ﺑﺎ اﺳـﺘﻔﺎده از ﻋﻤﻠﮕﺮ || ) (ORو ﻳﺎ && ) (ANDﻣﻴﺘﻮان ﭼﻨﺪ ﻋﻤﻠﮕﺮ را ﺗﺮﻛﻴﺐ ﻛﺮد .ﻫﻤﭽﻨﻴﻦ ﭼﮕﻮﻧﮕﻲ ﻣﻘﺎﻳﺴﻪ رﺷﺘﻪ ﻫﺎ ﺑﺪون در ﻧﻈـﺮ ﮔـﺮﻓﺘﻦ ﻧﻮع ﺣﺮوف را ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ. ﺳﭙﺲ ﺑﺎ دﺳﺘﻮر switchآﺷﻨﺎ ﺷﺪﻳﻢ و دﻳﺪﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﻳﻚ ﺣﺎﻟﺖ ﺧﺎص را از ﺑﻴﻦ ﺗﻌﺪاد زﻳﺎدي ﺣﺎﻟﺖ اﻧﺘﺨﺎب ﻛﺮد .ﺑـﺎ ﻣﻔﻬﻮم ﻛﻠﻲ ﺣﻠﻘﻪ ﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ آﺷﻨﺎ ﺷﺪﻳﻢ و ﺳﻪ ﺣﻠﻘﻪ do ،forو whileرا ﺑﺮرﺳﻲ ﻛـﺮدﻳﻢ .ﺣﻠﻘـﻪ ﻫـﺎي forﺑـﺮاي ﺗﻜﺮار ﻳﻚ ﺳﺮي از دﺳﺘﻮرات ﺑﻪ ﺗﻌﺪاد ﻣﻌﻴﻦ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ و ﺣﻠﻘﻪ foreachﻧﻴﺰ ﻛﻪ از اﻳﻦ ﺣﻠﻘﻪ ﻣﺸﺘﻖ ﻣﻲ ﺷﻮد ،ﺑﺮاي ﺣﺮﻛـﺖ در ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺑﺪون داﻧﺴﺘﻦ ﺗﻌﺪاد آن اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ .ﺣﻠﻘﻪ ﻫﺎي whileﺗﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﺷﺮط ﺧـﺎص ﺑﺮﻗـﺮار اﺳﺖ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﺣﻠﻘﻪ ﻫﺎي doﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﺣﻠﻘﻪ ﻫﺎي whileﻫﺴﺘﻨﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﺷﺮط ﺣﻠﻘﻪ ﻫﺎي whileدر اﺑﺘﺪاي ﺣﻠﻘﻪ ﺑﺮرﺳﻲ ﻣﻲ ﺷﻮد وﻟﻲ ﺷﺮط ﺣﻠﻘﻪ ﻫﺎي doدر اﻧﺘﻬﺎي آن. ﺑﻌﺪ از ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﻧﺤﻮه اﺳﺘﻔﺎده از ﻣﻮارد زﻳﺮ را در ﺑﺮﻧﺎﻣﻪ ﺑﺪاﻧﻴﺪ:
١٥٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
دﺳﺘﻮرات else if ،ifو elseﺑﺮاي ﺗﺴﺖ ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ. دﺳﺘﻮرات ifﺗﻮدرﺗﻮ. ﻋﻤﻠﮕﺮ ﻫﺎي ﻣﻘﺎﻳﺴﻪ اي و ﺗﺎﺑﻊ .Sring.Compare دﺳﺘﻮر switchﺑﺮاي اﻧﺘﺨﺎب ﻳﻚ ﺣﺎﻟﺖ ﺑﻴﻦ ﺣﺎﻟﺘﻬﺎي ﻣﻮﺟﻮد. ﺣﻠﻘﻪ ﻫﺎي forو foreach ﺣﻠﻘﻪ ﻫﺎي do ﺣﻠﻘﻪ ﻫﺎي while
ﺗﻤﺮﻳﻦ:
ﺗﻤﺮﻳﻦ :1 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺑﺎ ﻳﻚ TextBoxو ﻳﻚ Buttonاﻳﺠﺎد ﻛﻨﻴﺪ .در روﻳﺪاد Clickﻣﺮﺑﻮط ﺑﻪ ،Buttonﻋﺪد داﺧﻞ TextBoxرا ﺑﺪﺳﺖ آورﻳﺪ و ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر switchاﮔﺮ ﻋﺪد ﻳﻜﻲ از اﻋﺪاد ﻳﻚ ﺗﺎ ﭘﻨﺞ ﺑﻮد آن را ﺑﻪ وﺳـﻴﻠﻪ ﻳـﻚ ﻛﺎدر ﭘﻴﻐﺎم در ﺧﺮوﺟﻲ ﻧﻤﺎﻳﺶ دﻫﻴﺪ .در ﺻﻮرﺗﻲ ﻛﻪ ﻋﺪد وارد ﺷﺪه در TextBoxدر ﺑﺎزه ﻳﻚ ﺗﺎ ﭘﻨﺞ ﻧﺒﻮد ،ﭘﻴﻐﺎم ﻣﻨﺎﺳﺒﻲ را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ دﻫﻴﺪ.
ﺗﻤﺮﻳﻦ :2 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ ﻛﻨﺘﺮل ListBoxو ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﺎﺷﺪ اﻳﺠـﺎد ﻛﻨﻴـﺪ .در روﻳـﺪاد Click ﻣﺮﺑﻮط ﺑﻪ ،Buttonﻳﻚ ﺣﻠﻘﻪ forاﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ اﻋﺪاد 1ﺗﺎ 10را در ListBoxﻗﺮار دﻫﺪ .ﺳـﭙﺲ ﺣﻠﻘـﻪ دﻳﮕـﺮي اﻳﺠـﺎد ﻛﻨﻴﺪ ﻛﻪ اﻋﺪاد 10ﺗﺎ 1را در ListBoxﻧﻤﺎﻳﺶ دﻫﺪ.
١٦٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﭘﻨﺠﻢ :ﻛﺎرﻛﺮدن ﺑﺎ ﺳﺎﺧﺘﺎرﻫﺎي داده اي در ﻓﺼﻠﻬﺎي ﻗﺒﻠﻲ ﻧﺤﻮه اﺳﺘﻔﺎده از ﻣﺘﻐﻴﺮﻫﺎي ﺳﺎده اي ﻣﺎﻧﻨﺪ ﻣﺘﻐﻴﺮﻫﺎي integerﺑﺮاي اﻋـﺪاد ﺻـﺤﻴﺢ و ﻳـﺎ stringﺑـﺮاي رﺷﺘﻪ ﻫﺎ را ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ اﻳﻦ ﻧﻮع ﻫﺎي داده اي ﺑﺴﻴﺎر ﭘﺮ ﻛﺎرﺑﺮد ﻫﺴﺘﻨﺪ ،اﻣﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭘﻴﭽﻴﺪه ﺗـﺮ ﻧﻴـﺎز دارﻧـﺪ ﻛـﻪ ﺑـﺎ ﺳﺎﺧﺘﺎرﻫﺎي داده اي ﻛﺎر ﻛﻨﻨﺪ .ﺳﺎﺧﺘﺎرﻫﺎي داده اي ﺑﻪ ﻳﻚ ﮔﺮوه از اﻃﻼﻋﺎت ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ در ﻳﻚ واﺣـﺪ ﻣﺠـﺰا ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ.در اﻳﻦ ﻓﺼﻞ ﺑﺎ اﻧﻮاع ﺳﺎﺧﺘﺎرﻫﺎي داده اي ﻣﻮﺟﻮد در C#و ﻧﺤﻮه اﺳﺘﻔﺎده از آﻧﻬﺎ ﺑﺮاي ﻧﮕﻬﺪاري ﻣﺠﻤﻮﻋﻪ ﻫـﺎي داده اي ﭘﻴﭽﻴﺪه آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. در اﻳﻦ ﻓﺼﻞ ﻣﻄﺎﻟﺐ زﻳﺮ را ﺧﻮاﻫﻴﺪ آﻣﻮﺧﺖ:
آراﻳﻪ ﻫﺎ ﺷﻤﺎرﻧﺪه ﻫﺎ ﺛﺎﺑﺖ ﻫﺎ ﺳﺎﺧﺘﺎرﻫﺎ
ﻣﻔﻬﻮم آراﻳﻪ: ﻳﻜﻲ از ﻋﻤﻮﻣﻲ ﺗﺮﻳﻦ ﻧﻴﺎزﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻗﺎﺑﻠﻴﺖ ﻧﮕﻬﺪاري ﻟﻴﺴﺘﻲ از اﻃﻼﻋﺎت ﻣﺸﺎﺑﻪ و ﻳﺎ ﻣﺮﺗﺒﻂ ﺑـﻪ ﻫـﻢ اﺳـﺖ .ﺑـﺮاي اﻳـﻦ ﻣـﻮرد ﺑﺎﻳﺴﺘﻲ از آراﻳﻪ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .آراﻳﻪ ﻫﺎ ،ﻟﻴﺴﺘﻲ از ﻣﺘﻐﻴﺮ ﻫﺎ ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ ﻫﻤﻪ از ﻳﻚ ﻧﻮع ﻫﺴﺘﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳـﺖ ﺑﺨﻮاﻫﻴـﺪ ﺳﻦ ﺗﻤﺎﻣﻲ دوﺳﺘﺎن ﺧﻮد را در ﻳﻚ آراﻳﻪ از اﻋﺪاد ﺻﺤﻴﺢ و ﻳﺎ ﻧﺎم ﺗﻤﺎﻣﻲ آﻧﻬﺎ را در ﻳﻚ آراﻳﻪ از رﺷﺘﻪ ﻫﺎ ﻗﺮار دﻫﻴﺪ. در اﻳﻦ ﺑﺨﺶ ﺑﺎ ﻧﺤﻮه اﻳﺠﺎد ،ﭘﺮ ﻛﺮدن و اﺳﺘﻔﺎده از آراﻳﻪ ﻫﺎ در ﺑﺮﻧﺎﻣﻪ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده از آراﻳﻪ ﻫﺎ: ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻳﻚ آراﻳﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ ،در ﺣﻘﻴﻘﺖ ﻣﺘﻐﻴﺮي اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﺑﻴﺶ از ﻳﻚ ﻋﻨﺼﺮ را ﺑﺘﻮاﻧﺪ در ﺧﻮد ﻧﮕﻬـﺪاري ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻳﻚ ﻣﺘﻐﻴﺮ رﺷﺘﻪ اي را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﻓﻘﻂ ﻳﻚ رﺷﺘﻪ را ﻣﻴﺘﻮاﻧﻴﺪ در آن ﻧﮕﻬﺪاري ﻛﻨﻴﺪ: ;string strName اﻣﺎ آراﻳﻪ ﻫﺎ ﺑﺎﻋﺚ اﻳﺠﺎد ﻧﻮﻋﻲ ﺣﺎﻟﺖ اﻓﺰاﻳﺸﻲ در ﻣﺘﻐﻴﺮ ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﻴﺶ از ﻳﻚ ﻣﻘﺪار را ﻣﻲ ﺗﻮاﻧﻴﺪ در ﻳـﻚ ﻣﺘﻐﻴـﺮ ذﺧﻴـﺮه ﻛﻨﻴﺪ .اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻣﺘﻐﻴﺮ را ﺑﻪ ﺻﻮرت آراﻳﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﺑﺎﻳﺪ در ﻣﻘﺎﺑﻞ ﻧﻮع ﻣﺘﻐﻴﺮ از ﻋﻼﻣﺖ ][ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻛﺪ زﻳـﺮ ﻣﺘﻐﻴﺮي اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﺘﻮاﻧﺪ 10ﻋﻨﺼﺮ را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ: ;]string[] strName = new string[10
١٦١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ آراﻳﻪ را اﻳﺠﺎد ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺗﻚ ﺗﻚ ﻋﻨﺎﺻﺮ آن ﺑﺎ اﺳﺘﻔﺎده از اﻧﺪﻳﺲ آن ﻋﻨـﺼﺮ دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛﻨﻴـﺪ .اﻧـﺪﻳﺲ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ ﻫﻤﻮاره ﻋﺪدي ﺑﻴﻦ ﺻﻔﺮ و ﺷﻤﺎره ي آﺧﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ اﺳﺖ .ﺷﻤﺎره ي آﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻫﺮ آراﻳﻪ ﻫﻢ ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ واﺣﺪ ﻛﻤﺘﺮ از ﻃﻮل آراﻳﻪ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ اﻧﺪﻳﺲ ﻫﺮ آراﻳﻪ ﻋﺪدي ﺑﻴﻦ ﺻﻔﺮ ﺗﺎ ﻳﻚ واﺣﺪ ﻛﻤﺘﺮ از آﺧﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ اﺳﺖ. ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻣﻘﺪار ﻋﻨﺼﺮ ﺳﻮم آراﻳﻪ ﻗﺒﻠﻲ را ﺑﺮاﺑﺮ ﺑﺎ رﺷﺘﻪ ي " "Katieﻗﺮار دﻫﻴﺪ ﺑﺎﻳﺪ از ﻛﺪ زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: ;"strName[2] = "Katie ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار ﻳﻚ ﻋﻨﺼﺮ از آراﻳﻪ ﻫﻢ ﻣﻴﺘﻮاﻧﻴﺪ از ﻫﻤﻴﻦ روش اﺳﺘﻔﺎده ﻛﻨﻴﺪ: ;)]MessageBox.Show(strName[2 ﻧﻜﺘﻪ ي ﻣﻬﻢ در اﻳﻨﺠﺎ اﻳﻦ اﺳﺖ ﻛﻪ اﮔﺮ ﻳﻜﻲ از ﻋﻨﺎﺻﺮ آراﻳﻪ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻣﻘﺪار ﺑﻘﻴﻪ ﻋﻨﺎﺻﺮ ﺗﻐﻴﺮي ﻧﺨﻮاﻫﺪ ﻛﺮد .ﺑﺮاي ﻣﺜـﺎل اﮔـﺮ ﻛـﺪ زﻳﺮ را در ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ: ;"strName[3] = "Betty ﻣﻘﺪار ] strName[2ﻫﻤﭽﻨﺎن ﺑﺮاﺑﺮ ﺑﺎ " "Katieﺧﻮاﻫﺪ ﻣﺎﻧﺪ. اﺣﺘﻤﺎﻻ ﺑﻬﺘﺮﻳﻦ روش ﺑﺮاي ﻓﻬﻤﻴﺪن اﻳﻦ ﻛﻪ آراﻳﻪ ﻫﺎ ﭼﻴﺴﺘﻨﺪ و ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ اي ﺑﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده از ﻳﻚ آراﻳﻪ ﺳﺎده (1 (2 (3 (4
ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005روي ﻣﻨﻮي Fileﻛﻠﻴﻚ ﻛـﺮده و ﺳـﭙﺲ New Projectرا اﻧﺘﺨـﺎب ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه New Projectﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺑﻪ ﻧﺎم Array Demoاﻳﺠﺎد ﻛﻨﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﻳﻚ ﻛﻨﺘﺮل ListBoxﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Name اﻳﻦ ﻛﻨﺘﺮل را ﺑﺮاﺑﺮ ﺑﺎ lstFriendsو ﺧﺎﺻﻴﺖ IntegralHeightآن را ﺑﺮاﺑﺮ ﺑﺎ Falseﻗﺮار دﻫﻴﺪ. اﻛﻨﻮن ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑﺎ btnArrayElementsو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Array Elementsﻗﺮار دﻫﻴﺪ .ﻓﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 1-5ﺷﺪه ﺑﺎﺷﺪ. روي ﻛﻨﺘﺮل Buttonدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: private void btnArrayElements_Click(object sender, )EventArgs e { // Declare an array ;]string[] strFriends = new string[5 array ;""Robbin ;""Bryan ;""Stephanie ;""Sydney
// Populate the = ]strFriends[0 = ]strFriends[1 = ]strFriends[2 = ]strFriends[3
١٦٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;"strFriends[4] = "Katie // Add the first array item to the list ;)]lstFriends.Items.Add(strFriends[0 }
ﺷﻜﻞ 1-5 (5ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Array Elementsﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﻨﺘﺮل ListBoxروي ﻓـﺮم ﺑـﺎ ﻧـﺎم Robbinﭘﺮ ﻣﻲ ﺷﻮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻳﻚ آراﻳﻪ را ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،اﺑﺘﺪا ﺑﺎﻳﺪ ﻧﻮع داده اي و اﻧﺪازه آن را ﻣﺸﺨﺺ ﻛﻨﻴﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺧـﻮاﻫﻴﻢ ﻳـﻚ آراﻳﻪ از ﻧﻮع رﺷﺘﻪ اي و ﺑﻪ ﻃﻮل 5ﻋﻨﺼﺮ اﻳﺠﺎد ﻛﻨﻴﻢ .ﭘﺲ از ﻛﺪ زﻳﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ: // Declare an array ;]string[] strFriends = new string[5 ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ آراﻳﻪ اي ﺑﻪ ﻃﻮل 5اﻳﺠﺎد ﻛﺮده اﻳﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻣﻴﺘﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ آراﻳﻪ اي دارﻳـﻢ ﻛـﻪ ﺷـﺎﻣﻞ 5ﻋﻨـﺼﺮ اﺳﺖ. ﺑﻌﺪ از اﻳﺠﺎد آراﻳﻪ ،ﻳﻚ آراﻳﻪ ﺑﺎ ﭘﻨﺞ ﻋﻨﺼﺮ ﺧﻮاﻫﻴﺪ داﺷﺖ ﻛﻪ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﻪ ﻫﺮ ﻳﻚ از ﻋﻨﺎﺻﺮ آن ﺑﺎ اﺳـﺘﻔﺎده از اﻧـﺪﻳﺲ آن دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛﻨﻴﺪ.ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻳﻚ ﻋﻨﺼﺮ ﺧﺎص ﺑﺎﻳﺪ اﻧﺪﻳﺲ آن ﻋﻨﺼﺮ را در داﺧﻞ ﻛﺮوﺷﻪ ﺑﻌﺪ از ﻧﺎم آراﻳﻪ ﺑﻴﺎورﻳﺪ .اﻧﺪﻳﺲ ﻫـﺎ از ﺷـﻤﺎره ﺻـﻔﺮ ﺷﺮوع ﻣﻲ ﺷﻮﻧﺪ و ﺗﺎ ﻳﻚ واﺣﺪ ﻛﻤﺘﺮ از ﻃﻮل آراﻳﻪ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻋﻨﺼﺮ اول آراﻳﻪ داراي اﻧﺪﻳﺲ ﺻـﻔﺮ ،ﻋﻨـﺼﺮ دوم آراﻳـﻪ
١٦٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
داراي اﻧﺪﻳﺲ ﻳﻚ و ...اﺳﺖ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ آراﻳﻪ را ﺑﻪ ﻃﻮل 5ﺗﻌﺮﻳﻒ ﻛﺮده ،وﻟﻲ ﺑﺮاي ﭘﺮ ﻛﺮدن آن از اﻋﺪاد 0ﺗﺎ 4 اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ. array ;""Robbin ;""Bryan ;""Stephanie ;""Sydney ;""Katie
// Populate the = ]strFriends[0 = ]strFriends[1 = ]strFriends[2 = ]strFriends[3 = ]strFriends[4
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺑﺮاي ﻣﻘﺪار دﻫﻲ ﺑﻪ ﻳﻚ ﻋﻨﺼﺮ ﺧﺎص ﺑﺎﻳﺪ از اﻧﺪﻳﺲ آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار آن ﻋﻨﺼﺮ از آراﻳﻪ ﻧﻴـﺰ ﻣـﻲ ﺗﻮاﻧﻴﺪ از اﻧﺪﻳﺲ آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﻧﻪ ﺻﻔﺮم آراﻳﻪ ﻛﻪ ﺑﺮاﺑﺮ ﺑـﺎ اوﻟـﻴﻦ ﻣﻘـﺪار آراﻳـﻪ )"("Robbin اﺳﺖ را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ: // Add the first array item to the list ;)]lstFriends.Items.Add(strFriends[0 ﻋﻠﺖ اﻳﻦ ﻛﻪ اﻧﺪﻳﺲ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در آراﻳﻪ و ﻃﻮل آن آراﻳﻪ ﻣﻘﺪاري ﮔﻴﺞ ﻛﻨﻨﺪه ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ اﻳﻦ اﺳﺖ ﻛﻪ اﻧﺪﻳﺴﻬﺎ در ﻳﻚ آراﻳـﻪ از ﺻﻔﺮ ﺷﺮوع ﻣﻲ ﺷﻮﻧﺪ ،اﻣﺎ ﻣﻌﻤﻮﻻ اﻧﺴﺎﻧﻬﺎ اوﻟﻴﻦ ﻋﻨﺼﺮ ﻫﺮ ﻣﺠﻤﻮﻋﻪ اي را ﺑﺎ ﻳﻚ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴـﺪ ﻣﻘـﺪاري را در آراﻳﻪ ﻗﺮار دﻫﻴﺪ و ﻳﺎ ﻣﻘﺪار ﻳﻚ ﻋﻨﺼﺮ از آراﻳﻪ را ﺑﺪﺳﺖ آورﻳﺪ ،ﺑﺎﻳﺪ ﻳﻚ واﺣﺪ از ﻣﻜﺎن ﻋﻨﺼﺮ ﻣﻮرد ﻧﻈﺮﺗﺎن ﻛﻢ ﻛﻨﻴﺪ ﺗﺎ اﻧـﺪﻳﺲ آن را ﺑﺪﺳﺖ آورﻳﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﻨﺼﺮ ﭘﻨﺠﻢ در آراﻳﻪ ﺑﺮاﺑﺮ ﺑﺎ اﻧﺪﻳﺲ 4و اوﻟﻴﻦ ﻋﻨﺼﺮ در آراﻳﻪ ﺑﺮاﺑﺮ ﺑﺎ اﻧﺪﻳﺲ 0اﺳﺖ. ﻧﻜﺘﻪ :ﺳﻮاﻟﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ در اﻳﻦ ﻗﺴﻤﺖ اﻳﺠﺎد ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ ﭼﺮا اﻧﺪﻳﺴﻬﺎ از ﺻﻔﺮ ﺷﺮوع ﻣﻴﺸﻮﻧﺪ؟ ﺑـﻪ ﺧـﺎﻃﺮ دارﻳـﺪ ﻛـﻪ ﺑـﺮاي ﻛﺎﻣﭙﻴﻮﺗﺮ ،ﻳﻚ ﻣﺘﻐﻴﺮ آدرس ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻳﻚ ﻋﻨﺼﺮ از آراﻳﻪ اﻧـﺪﻳﺲ آن را ﻣـﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ ،وﻳﮋوال C#اﻳﻦ اﻧﺪﻳﺲ را در اﻧﺪازه ي ﻳﻜﻲ از ﻋﻨﺎﺻﺮ آراﻳﻪ ﺿﺮب ﻣﻲ ﻛﻨﺪ 1و ﺣﺎﺻﻞ را ﺑﺎ آدرس آراﻳﻪ ﺟﻤﻊ ﻣﻲ ﻛﻨـﺪ ﺗـﺎ ﺑـﻪ آدرس ﻋﻨﺼﺮ ﻣﺸﺨﺺ ﺷﺪه ﺑﺮﺳﺪ .آدرس ﺷﺮوع ﻳﻚ آراﻳﻪ ﻫﻢ در ﺣﻘﻴﻘﺖ آدرس اوﻟﻴﻦ ﻋﻨﺼﺮ آن آراﻳﻪ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ اوﻟﻴﻦ ﻋﻨﺼﺮ آراﻳﻪ ﺑﻪ اﻧﺪازه ﺻﻔﺮ ﺿﺮﺑﺪر اﻧﺪازه ﻋﻨﺼﺮ ،از ﻧﻘﻄﻪ ﺷﺮوع آراﻳﻪ ﻓﺎﺻﻠﻪ دارد ،دوﻣﻴﻦ ﻋﻨﺼﺮ ﺑﻪ اﻧﺪازه ﻳﻚ ﺿـﺮﺑﺪر اﻧـﺪازه ﻋﻨـﺼﺮ از ﺷـﺮوع آراﻳـﻪ ﻓﺎﺻﻠﻪ دارد و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ.
اﺳﺘﻔﺎده از :foreach ﻳﻜﻲ از ﻋﻤﻮﻣﻲ ﺗﺮﻳﻦ روﺷﻬﺎي اﺳﺘﻔﺎده از آراﻳﻪ ﻫﺎ ،ﺑﻪ وﺳﻴﻠﻪ ﺣﻠﻘﻪ ﻫﺎي foreachاﺳﺖ.اﻳﻦ ﻧﻮع ﺣﻠﻘﻪ ﻫﺎ در ﻓﺼﻞ ،4ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺎ آراﻳﻪ رﺷﺘﻪ اي ﺑﺮﮔﺮداﻧﺪه ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﺑﻊ GetDirectoriesﻛﺎر ﻣﻲ ﻛﺮدﻳﺪ ،ﻣﻌﺮﻓﻲ ﺷﺪﻧﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴـﺪ ﺑﻌـﺪ، ﻣﻼﺣﻈﻪ ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ از اﻳﻦ ﺣﻠﻘﻪ ﻫﺎ در آراﻳﻪ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﻢ.
1اﻳﻦ ﻣﻮرد ﻛﻪ اﻧﺪازه ﻛﺪام ﻋﻨﺼﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮد اﻫﻤﻴﺘﻲ ﻧﺪارد ،زﻳﺮا ﻫﻤﻪ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ از ﻳﻚ ﻧﻮع ﻫﺴﺘﻨﺪ و اﻧﺪازه آﻧﻬﺎ ﺑﺎ ﻫﻢ ﺑﺮاﺑﺮ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اﻧـﺪازه ﻫـﺮ ﻳﻚ از ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ از ﻧﻮع ،intﺑﺮاﺑﺮ ﺑﺎ 4ﺑﺎﻳﺖ اﺳﺖ.
١٦٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺣﻠﻘﻪ ﻫﺎي foreachﺑﺎ آراﻳﻪ ﻫﺎ (1اﮔﺮ ﺑﺮﻧﺎﻣﻪ ي Arrays Demoدر ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ .ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﺑﺎﻻﺗﺮﻳﻦ ﻗﺴﻤﺖ در ﺑﺪﻧﻪ ﻛﻼس ﺧﻮد وارد ﻛﻨﻴﺪ: public partial class Form1 : Form { // Declare a form level array ;]private string[] strFriends = new string[5 (2ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮﮔﺮدﻳﺪ و ﺑﺮ روي ﻗﺴﻤﺖ ﺧﺎﻟﻲ ﻓﺮم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳـﺪاد Loadﻓﺮم ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮد .ﺣﺎل ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void Form1_Load(object sender, EventArgs e { // Populate the array ;"strFriends[0] = "Robbin ;"strFriends[1] = "Bryan ;"strFriends[2] = "Stephanie ;"strFriends[3] = "Sydney ;"strFriends[4] = "Katie } (3ﻣﺠﺪدا ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Nameاﻳﻦ ﻛﻨﺘﺮل را ﺑﺮاﺑﺮ ﺑﺎ btnEnumerateArrayو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Enumerate Arrayﻗﺮار دﻫﻴﺪ. (4روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: private void btnEnumerateArray_Click(object sender, )EventArgs e { // Enumerate the array )foreach (string strName in strFriends { // Add the array item to the list ;)lstFriends.Items.Add(strName } } (5ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤـﻪ ي Enumerate Arrayﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻧﺘﻴﺠـﻪ اي را ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 2-5 ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
١٦٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 2-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﻳﻦ ﺗﻤﺮﻳﻦ را ﺑﺎ ﺗﻌﺮﻳﻒ ﻳﻚ ﻣﺘﻐﻴﺮ ﻛﻪ در ﺗﻤﺎم ﻓﺮم ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ ﺷﺮوع ﻣﻲ ﻛﻨﻴﻢ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﻳﻦ آراﻳﻪ ﺑـﺮاي ﺗﻤـﺎم ﻣﺘـﺪﻫﺎي ﻣﻮﺟﻮد در ﻛﻼس Form1ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ .ﻫﺮ ﮔﺎه ﻣﺘﻐﻴﺮي در ﺧﺎرج از ﻣﺘﺪﻫﺎ درون ﻳﻚ ﻛﻼس ﺗﻌﺮﻳﻒ ﺷﻮد ،در ﺗﻤﺎﻣﻲ ﻣﺘـﺪﻫﺎي آن ﻛﻼس ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺧﻮاﻫﺪ ﺑﻮد. // Declare a form level array ;]private string[] strFriends = new string[5 ﺳﭙﺲ ﻣﺘﺪي را ﺑﺮاي روﻳﺪاد Loadﻣﺮﺑﻮط ﺑﻪ Form1اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﭘﺮ ﻛﺮدن آراﻳﻪ را در آن ﻗﺮار ﻣﻲ دﻫﻴﺪ .اﻳﻦ ﻣﺘﺪ ﻫﻨﮕﺎﻣﻲ اﺟﺮا ﻣﻲ ﺷﻮد ﻛﻪ اﻳﻦ ﻓﺮم از ﺑﺮﻧﺎﻣﻪ ﺑﺨﻮاﻫﺪ در ﺣﺎﻓﻈﻪ ﺑﺎر ﮔﺬاري ﺷﺪه و ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻄﻤﺌﻦ ﻣﻲ ﺷﻮﻳﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد آراﻳﻪ ﺷﻤﺎ ﭘﺮ ﺷﺪه اﺳﺖ. )private void Form1_Load(object sender, EventArgs e { // Populate the array ;"strFriends[0] = "Robbin ;"strFriends[1] = "Bryan ;"strFriends[2] = "Stephanie ;"strFriends[3] = "Sydney ;"strFriends[4] = "Katie }
١٦٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﻓﺼﻞ ﭼﻬﺎر ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻳﻚ ﺣﻠﻘﻪ foreachدر ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ از رﺷﺘﻪ ﻫﺎ ﺣﺮﻛﺖ ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﻣﺜـﺎل ﻫﻢ ﻫﻤﺎن ﻣﺮاﺣﻞ را ﺗﻜﺮار ﻣﻲ ﻛﻨﻴﻢ .ﻳﻚ ﻣﺘﻐﻴﺮ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ،ﻫﻢ ﻧﻮع ﺑﺎ ﻋﻨﺎﺻﺮ آراﻳﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ و آن را ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑـﻪ ﺗـﻚ ﺗﻚ ﻋﻨﺎﺻﺮ آراﻳﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ دﻫﻴﻢ. ﺣﻠﻘﻪ foreachاز ﻋﻨﺼﺮ ﺻﻔﺮم آراﻳﻪ ﺷﺮوع ﻣﻲ ﻛﻨﺪ و ﺗﺎ رﺳﻴﺪن ﺑﻪ آﺧﺮﻳﻦ ﻋﻨﺼﺮ در آراﻳﻪ ،ﺑﻴﻦ ﺗﻤﺎم ﻋﻨﺎﺻﺮ ﺟﺎ ﺑﻪ ﺟﺎ ﻣﻲ ﺷﻮد .در ﻫﺮ ﺑﺎر ﺗﻜﺮار ﺣﻠﻘﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻋﻨﺼﺮي ﻛﻪ در ﻣﺘﻐﻴﺮ ﻛﻨﺘﺮل ﻛﻨﻨﺪه ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﻣﺜﺎل اﻳﻦ ﻣﻘﺪار را ﺑـﻪ ﻟﻴـﺴﺖ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ. // Enumerate the array )foreach (string strName in strFriends { // Add the array item to the list ;)lstFriends.Items.Add(strName } ﻫﻤﭽﻨﻴﻦ ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻋﻨﺎﺻﺮ ﺑﻪ ﻫﻤﺎن ﺗﺮﺗﻴﺒﻲ ﻛﻪ در آراﻳﻪ وارد ﺷﺪه اﻧﺪ داﺧﻞ ﻟﻴﺴﺖ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .اﻳﻦ ﻣﻮرد ﺑﻪ اﻳﻦ دﻟﻴﻞ اﺳﺖ ﻛـﻪ ﺣﻠﻘﻪ foreachاز ﻋﻨﺼﺮ ﺻﻔﺮم ﺗﺎ آﺧﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ را ﺑﻪ ﻫﻤﺎن ﺗﺮﺗﻴﺒﻲ ﻛﻪ ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ ﻃﻲ ﻣﻲ ﻛﻨﺪ.
اﻧﺘﻘﺎل آراﻳﻪ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ: در ﺑﺴﻴﺎري از ﻣﻮارد ﻣﻤﻜﻦ اﺳﺖ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻳﻚ آراﻳﻪ را ﻛﻪ ﻣﺤﺘﻮي ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ اﺳﺖ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ ﻳﻚ ﻣﺘﺪ ﺑﻔﺮﺳﺘﻴﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻧﺤﻮه اﻧﺠﺎم اﻳﻦ ﻋﻤﻞ را ﺧﻮاﻫﻴﻢ دﻳﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻧﺘﻘﺎل آراﻳﻪ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ (1ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﻛﻨﺘﺮل Buttonدﻳﮕﺮي را ﺑﻪ Form1اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﺎﺻﻴﺖ Nameاﻳﻦ ﻛﻨﺘـﺮل را ﺑﺮاﺑـﺮ ﺑـﺎ btnArraysAsParametersو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ ﺑـﺎ Arrays as Parametersﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪاد Clickآن وارد ﻛﻨﻴـﺪ .ﭘﻴﻐـﺎﻣﻲ را ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﻲ ﮔﻮﻳﺪ زﻳﺮﺑﺮﻧﺎﻣﻪ AddItemsToListﺗﻌﺮﻳﻒ ﻧﺸﺪه اﺳﺖ .ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي اﻳﻦ ﭘﻴﻐﺎم ،وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﻣﺘﺪ را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﭘﻴﻐﺎم را ﻧﺎدﻳﺪه ﺑﮕﻴﺮﻳﺪ ،زﻳﺮا اﻳﻦ ﻣﺘﺪ را در ﻣﺮﺣﻠﻪ ﺑﻌﺪي ﺗﻌﺮﻳﻒ ﺧﻮاﻫﻴﻢ ﻛﺮد: private void btnArraysAsParameters_Click(object sender, )EventArgs e { // List your friends ;)AddItemsToList(strFriends }
١٦٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3ﻫﻢ اﻛﻨﻮن ﻣﺘﺪ AddItemsToListرا ﺑﻪ ﺻﻮرت زﻳﺮ در ﻛﻼس ﺧﻮد ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ: )private void AddItemsToList(string[] arrayList { // Enumerate the array )foreach (string strName in arrayList { // Add the array item to the list ;)lstFriends.Items.Add(strName } } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و روي دﻛﻤﻪ ي Arrays as Parametersﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠـﻪ اي را ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 2-5ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻧﻜﺘﻪ اي ﻛﻪ در ﻣﺘﺪ AddItemsToListوﺟﻮد دارد اﻳﻦ اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮ ﻣﻮرد ﻧﻴﺎز اﻳﻦ ﻣﺘﺪ ،آراﻳـﻪ اي از ﻧـﻮع رﺷـﺘﻪ اﺳـﺖ. ﺑﺮاي اﻳﻦ ﻛﻪ ﭘﺎراﻣﺘﺮ ﻳﻚ ﻣﺘﺪ را از ﻧﻮع آراﻳﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ در ﻣﻘﺎﺑﻞ ﻧﻮع داده اي آن ،از ﻳﻚ ﻛﺮوﺷﻪ ﺧﺎﻟﻲ )][( اﺳﺘﻔﺎده ﻛﻨﻴﺪ: )private void AddItemsToList(string[] arrayList ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺗﻌﺮﻳﻒ ﭘﺎراﻣﺘﺮﻫﺎي ﻳﻚ ﻣﺘﺪ ،آراﻳﻪ اي را ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ اﻣﺎ ﻃﻮل آن را ﻣﺸﺨﺺ ﻧﻤﻲ ﻛﻨﻴـﺪ ،در ﺣﻘﻴﻘـﺖ ﺑـﻪ ﻛﺎﻣﭙـﺎﻳﻠﺮ وﻳﮋوال C#ﻣﻲ ﮔﻮﻳﻴﺪ ﻛﻪ ﻫﺮ آراﻳﻪ اي از اﻳﻦ ﻧﻮع ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ اﻳﻦ ﻣﺘﺪ ﻓﺮﺳﺘﺎده ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﻧﺪازه آراﻳﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ اﻳﻦ ﻣﺘﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮﻧﺪ ﻣﻬﻢ ﻧﻴﺴﺖ و ﻓﻘﻂ ﻧﻮع آراﻳﻪ ﻣﻬﻢ اﺳﺖ .در زﻳﺮﺑﺮﻧﺎﻣﻪ btnArraysAsParametersﻣﻲ ﺗﻮاﻧﻴﺪ آراﻳﻪ اﺻﻠﻲ ﺧﻮد را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻨﺘﻘﻞ ﻛﻨﻴﺪ: // List your friends ;)AddItemsToList(strFriends در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،آراﻳﻪ اي ﺑﺎ ﻃﻮل ﻣﺘﻔﺎوﺗﻲ را ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ و ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن آن ﺑﻪ ﻟﻴﺴﺖ از ﻣﺘﺪ ﻗﺒﻠـﻲ اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن دوﺳﺘﺎن ﺑﻴﺸﺘﺮ
١٦٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1اﮔﺮ ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﺑﺒﻨﺪﻳﺪ و ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑـﻮط ﺑـﻪ Form1ﺑﺮﮔﺮدﻳـﺪ .ﻛﻨﺘـﺮل Button دﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑـﺎ btnMoreArrayParametersو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ More Array Parametersﻗﺮار دﻫﻴﺪ. (2ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickوارد ﻛﻨﻴﺪ: private void btnMoreArrayParameters_Click(object sender, )EventArgs e { // Declare an array ;]string[] strMoreFriends = new string[2 // Populate the array ;"strMoreFriends[0] = "Matt ;"strMoreFriends[1] = "Margie // List your friends ;)AddItemsToList(strFriends ;)AddItemsToList(strMoreFriends } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ اي ﻛﻪ ﺟﺪﻳﺪاً اﺿﺎﻓﻪ ﻛﺮده اﻳﺪ ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻧﺘﻴﺠـﻪ اي ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 3-5را ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 3-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
١٦٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﻣﺜﺎل آراﻳﻪ اي را ﺑﻪ ﻃﻮل دو اﻳﺠﺎد ﻛﺮدﻳﻢ و آن را ﺑﻪ ﻣﺘﺪ AddItemsToListﻓﺮﺳﺘﺎدﻳﻢ ﺗﺎ آن را ﺑـﻪ ﻟﻴـﺴﺖ اﺿـﺎﻓﻪ ﻛﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻃﻮل آراﻳﻪ اي ﻛﻪ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ اﻳﻦ ﻣﺘﺪ ارﺳﺎل ﻣﻲ ﻛﻨﻴﺪ ،اﻫﻤﻴﺘﻲ ﻧﺪارد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺴﺘﻴﺪ ،اﮔﺮ ﻳﻚ ﻣﺘﺪ ،ﭘﺎراﻣﺘﺮ ﺧﻮد را ﺑﻪ ﺻﻮرت آراﻳﻪ درﻳﺎﻓﺖ ﻛﻨﺪ ،در ﭘﻨﺠـﺮه اي ﻛـﻪ ﺑـﺮاي ﺗﻜﻤﻴـﻞ ﻫﻮﺷﻤﻨﺪاﻧﻪ ي ﻧﺎم ﻣﺘﺪ ﺗﻮﺳﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎز ﻣﻲ ﺷﻮد ،در ﻣﻘﺎﺑﻞ ﻧﻮع داده اي آراﻳﻪ ﻳﻚ ﻛﺮوﺷﻪ ﺧﺎﻟﻲ ﻗﺮار دارد) .ﺷﻜﻞ (4-5
ﺷﻜﻞ 4-5 ﻧﻜﺘﻪ :در ﭘﻨﺠﺮه ﺑﺎز ﺷﺪه ﻧﻪ ﺗﻨﻬﺎ آراﻳﻪ اي ﺑﻮدن ﻳﻚ ﭘﺎراﻣﺘﺮ ﻗﺎﺑﻞ ﺗﺸﺨﻴﺺ اﺳﺖ ،ﺑﻠﻜﻪ ﻧﻮع اﻳﻦ ﭘﺎراﻣﺘﺮ ﻧﻴﺰ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻣﺮﺗﺐ ﺳﺎزي آراﻳﻪ ﻫﺎ: ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ ﻫﻤﻮاره ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ آراﻳﻪ ﻫﺎ ﻣﻮرد ﻧﻴﺎز ﺑﻮده اﺳﺖ ،ﻣﺮﺗﺐ ﻛﺮدن آراﻳﻪ اﺳﺖ .در ﺑﺨﺶ اﻣﺘﺤـﺎن ﻛﻨﻴـﺪ ﺑﻌـﺪ ،ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان آراﻳﻪ ﻫﺎ را ﻣﺮﺗﺐ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻣﺮﺗﺐ ﺳﺎزي آراﻳﻪ ﻫﺎ (1در ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ Form1اﺿﺎﻓﻪ ﻛـﺮده ،ﺳـﭙﺲ ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ ﺑـﺎ btnSortingArraysو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ Sorting Arraysﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: private void btnSortingArrays_Click(object sender, )EventArgs e { // Sort the array ;)Array.Sort(strFriends // List your friends ;)AddItemsToList(strFriends } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي اﻳﻦ دﻛﻤﻪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻟﻴﺴﺖ ،اﺳﺎﻣﻲ ﻣﻮﺟﻮد در آراﻳﻪ را ﻛﻪ ﺑـﻪ ﺻـﻮرت اﻟﻔﺒﺎﻳﻲ ﻣﺮﺗﺐ ﺷﺪه اﻧﺪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
١٧٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺗﻤﺎم آراﻳﻪ ﻫﺎ ﺑﻪ ﺻﻮرت دروﻧﻲ از ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم System.Arrayﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻳﻜـﻲ از ﻣﺘـﺪﻫﺎي اﻳـﻦ ﻛﻼس ﺑﻪ ﻧﺎم Sortاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﺘﺪ ﻓﻘﻂ ﻳﻚ ﭘﺎراﻣﺘﺮ ﻣﻲ ﮔﻴﺮد و آن ﭘﺎراﻣﺘﺮ ﻧﻴﺰ ﻧﺎم آراﻳﻪ اي اﺳﺖ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴـﺪ آن را ﻣﺮﺗﺐ ﻛﻨﻴﺪ .ﺳﭙﺲ اﻳﻦ ﻣﺘﺪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ از ﻧﺎم آن ﻣﺸﺨﺺ اﺳﺖ ،آراﻳﻪ را ﺑﺮ اﺳﺎس ﻧﻮع داده اي ﻋﻨﺎﺻﺮ آن ،ﻣﺮﺗﺐ ﻣﻲ ﻛﻨـﺪ و ﺑـﺎز ﻣـﻲ ﮔﺮداﻧﺪ.در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻋﻠﺖ اﻳﻦ ﻛﻪ ﻧﻮع ﻋﻨﺎﺻﺮ رﺷﺘﻪ اي اﺳﺖ ،آراﻳﻪ ﺑﻪ ﺻﻮرت اﻟﻔﺒﺎﻳﻲ ﻣﺮﺗﺐ ﻣﻲ ﺷﻮد .اﮔﺮ از اﻳﻦ ﻣﺘـﺪ ﺑـﺮاي ﻣﺮﺗـﺐ ﺳﺎزي ﻳﻚ آراﻳﻪ از اﻋﺪاد ﺻﺤﻴﺢ و ﻳﺎ اﻋﺪاد اﻋﺸﺎري اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،آراﻳﻪ ﺑﻪ ﺻﻮرت ﻋﺪدي ﻣﺮﺗﺐ ﺧﻮاﻫﺪ ﺷﺪ. // Sort the array ;)Array.Sort(strFriends اي ﻗﺎﺑﻠﻴﺖ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﻣﻲ ﺗﻮاﻧﺪ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ از ﻧﻮع ﻫﺎي داده اي ﻣﺨﺘﻠﻒ را درﻳﺎﻓﺖ ﻛﻨﺪ ،ﺳﭙﺲ ﺑﺮ اﺳﺎس ﻧﻮع ﭘﺎراﻣﺘﺮ ﻋﻤﻠﻴﺎت ﻣﻨﺎﺳﺒﻲ را ﺑﺮ روي آن اﻧﺠﺎم دﻫﺪ ،ﺳﺮﺑﺎر ﮔﺬاري 1ﻣﺘﺪﻫﺎ ﻣﻲ ﻧﺎﻣﻨﺪ .در اﻳﻨﺠﺎ ﻣﻲ ﮔﻮﻳﻴﻢ ﻛﻪ ﺗﺎﺑﻊ Sortﻳﻚ ﺗﺎﺑﻊ ﺳﺮﺑﺎر ﮔﺬاري ﺷـﺪه اﺳـﺖ .در ﻓﺼﻞ دﻫﻢ ﺑﻴﺸﺘﺮ در ﻣﻮرد ﺳﺮﺑﺎر ﮔﺬاري ﻣﺘﺪﻫﺎ و ﻧﺤﻮه اﻳﺠﺎد ﭼﻨﻴﻦ ﻣﺘﺪﻫﺎﻳﻲ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد.
ﺣﺮﻛﺖ ﺑﻪ ﻋﻘﺐ در آراﻳﻪ ﻫﺎ: ﺣﻠﻘﻪ ﻫﺎي foreachﻓﻘﻂ در ﻳﻚ ﺟﻬﺖ در ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ ﺣﺮﻛﺖ ﻣﻲ ﻛﻨﻨﺪ .آﻧﻬﺎ از ﻋﻨﺼﺮ ﺻﻔﺮم ﻳﻚ آراﻳﻪ ﺷﺮوع ﻣﻲ ﻛﻨﻨﺪ و ﺗﺎ آﺧﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ ﭘﻴﺶ ﻣﻲ روﻧﺪ .اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﺑﻴﻦ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ ﺑﻪ ﺻﻮرت ﺑﺮﻋﻜﺲ ﺣﺮﻛﺖ ﻛﻨﻴـﺪ )ﻳﻌﻨـﻲ از ﻋﻨـﺼﺮ آﺧـﺮ ﺑـﻪ ﻋﻨﺼﺮ اول ﺑﺮﮔﺮدﻳﺪ( دو راه در اﺧﺘﻴﺎر دارﻳﺪ. راه اول اﻳﻦ اﺳﺖ ﻛﻪ از ﺣﻠﻘﻪ ﻫﺎي forﻣﻌﻤﻮﻟﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت ﺑﺎﻳﺪ ﻣﻘﺪار اوﻟﻴﻪ ﺷﻤﺎرﻧﺪه ﺣﻠﻘـﻪ را ﻳـﻚ واﺣـﺪ ﻛﻤﺘـﺮ از ﻃﻮل آراﻳﻪ ﻗﺮار دﻫﻴﺪ 2و ﺳﭙﺲ ﺣﻠﻘﻪ را ﻃﻮري ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﻛﻪ ﺗﺎ ﻋﺪد ﻳﻚ ﺑﺮﮔﺮدد .در ﻗﺴﻤﺖ زﻳﺮ اﻳﻦ روش را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ: ;)for (int intIndex = strFriends.GetUpperBound(0 )intIndex >= 0; intIndex-- { // Add the array item to the list ;)]lstFriends.Items.Add(strFriends[intIndex } روش دوم اﻳﻦ اﺳﺖ ﻛﻪ از ﻣﺘﺪ Reverseدر ﻛﻼس Arrayاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻣﺘﺪ ﻋﻨﺎﺻﺮ ﻳﻚ آراﻳﻪ را ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس در آراﻳﻪ ﻗﺮار ﻣﻲ دﻫﺪ .ﺑﻌﺪ از اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ از ﺣﻠﻘﻪ ﻫﺎي foreachﻣﻌﻤـﻮﻟﻲ ﺑـﺮاي ﻧﻤـﺎﻳﺶ آراﻳـﻪ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،اﻳﻦ روش را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
1
Overloading 2ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺑﻪ ﺧﺎﻃﺮ دارﻳﺪ ،اﻧﺪﻳﺲ آﺧﺮﻳﻦ ﻋﻨﺼﺮ ﻫﺮ آراﻳﻪ ﻳﻚ واﺣﺪ ﻛﻤﺘﺮ از ﻃﻮل آن آراﻳﻪ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﺑﺎزﮔﺸﺘﻦ از آﺧﺮﻳﻦ ﻋﻨﺼﺮ آراﻳﻪ ﺑﺎﻳﺪ از ﻳـﻚ واﺣـﺪ ﻛﻤﺘﺮ از ﻃﻮل ﺑﻪ ﻋﻨﻮان ﻋﺪد ﺷﺮوع اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
١٧١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻣﻌﻜﻮس ﻛﺮدن ﻳﻚ آراﻳﻪ (1ﻛﻨﺘـــﺮل Buttonدﻳﮕـــﺮي ﺑـــﻪ ﻗـــﺴﻤﺖ ﻃﺮاﺣـــﻲ ﻓـــﺮم اﺿـــﺎﻓﻪ ﻛـــﺮده ،ﺧﺎﺻـــﻴﺖ Nameآن را ﺑﺮاﺑـــﺮ ﺑـــﺎ btnReversingAnArrayو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Reversing an Arrayﻗﺮار دﻫﻴﺪ. (2روي اﻳﻦ دﻛﻤﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: private void btnReversingAnArray_Click(object sender, )EventArgs e { – // Reverse the order // elements will be in descending order ;)Array.Reverse(strFriends // List your friends ;)AddItemsToList(strFriends } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Reversing an Arrayﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ ﻛـﻪ ﻫﻤﺎﻧﻨـﺪ ﺷﻜﻞ 5-5ﻧﺎﻣﻬﺎي ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس ﻧﻤﺎﻳﺶ داده ﺷﺪه اﻧﺪ.
ﺷﻜﻞ 5-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
١٧٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﺎﺑﻊ Reverseﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در ﻳﻚ آراﻳﻪ ي ﻳﻚ ﺑﻌﺪي را ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس در آن آراﻳﻪ ﻗﺮار ﻣﻲ دﻫﺪ .ﻫﻨﮕﺎﻣﻲ ﻛـﻪ آراﻳـﻪ ي strFriendsرا ﺑﻪ اﻳﻦ ﻣﺘﺪ ارﺳﺎل ﻣﻲ ﻛﻨﻴﺪ ،در ﺣﻘﻴﻘﺖ از ﻣﺘﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ ﻋﻨﺎﺻﺮ اﻳﻦ آراﻳﻪ را از آﺧﺮ ﺑﻪ اول ﻗﺮار دﻫﺪ: – // Reverse the order // elements will be in descending order ;)Array.Reverse(strFriends ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻋﻨﺎﺻﺮ آراﻳﻪ ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس در آن ﻗﺮار ﮔﺮﻓﺘﻨﺪ ،ﻛﺎﻓﻲ اﺳﺖ آراﻳﻪ را ﺑﻪ ﻣﺘﺪ AddItemsToListﺑﻔﺮﺳﺘﻴﺪ ﺗـﺎ آن را در ﻟﻴﺴﺖ ﻧﻤﺎﻳﺶ دﻫﺪ. // List your friends ;)AddItemsToList(strFriends ﻧﻜﺘﻪ :اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ آراﻳﻪ ﺑﻪ ﺻﻮرت ﻧﺰوﻟﻲ اﻟﻔﺒﺎﻳﻲ ﻣﺮﺗﺐ ﺷﻮد ،ﻛﺎﻓﻲ اﺳﺖ آراﻳﻪ را ﺑﻪ وﺳﻴﻠﻪ ﺗﺎﺑﻊ Sortﺑﻪ ﺻﻮرت ﺻﻌﻮدي اﻟﻔﺒﺎﻳﻲ ﻣﺮﺗﺐ ﻛﻨﻴﺪ ،ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ Reverseآن را ﺑﻪ ﺻﻮرت ﻣﻌﻜﻮس درآورﻳﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت آراﻳﻪ ﺑﻪ ﺻﻮرت اﻟﻔﺒـﺎﻳﻲ ﻧﺰوﻟـﻲ ﻣﺮﺗﺐ ﻣﻲ ﺷﻮد.
ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ آراﻳﻪ ﻫﺎ: در وﻳﮋوال C#ﻣﻲ ﺗﻮاﻧﻴﺪ آراﻳﻪ ﻫﺎ را در ﻫﻤﺎن ﺧﻄﻲ ﻛﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ ،ﻣﻘﺪار دﻫﻲ ﻛﻨﻴﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻧﻴـﺎزي ﻧﻴـﺴﺖ ﻛـﻪ ﺑﻌـﺪ از ﺗﻌﺮﻳﻒ آراﻳﻪ از ﭼﻨﺪﻳﻦ ﺧﻂ ﻛﺪ ﻫﻤﺎﻧﻨﺪ زﻳﺮ ﺑﺮاي ﭘﺮ ﻛﺮدن آراﻳﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: // Declare an array ;]string[] strFriends = new string[4 array ;""Robbin ;""Bryan ;""Stephanie ;""Sydney ;""Katie
// Populate the = ]strFriends[0 = ]strFriends[1 = ]strFriends[2 = ]strFriends[3 = ]strFriends[4
در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ،ﺑﺎ ﭼﮕﻮﻧﮕﻲ ﻣﻘﺪاردﻫﻲ آراﻳﻪ ﻫﺎ در ﻳﻚ ﺧﻂ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻣﻘﺪاردﻫﻲ اوﻟﻴﻪ ﺑﻪ آراﻳﻪ ﻫﺎ (1در ﻗـﺴﻤﺖ ﻃﺮاﺣـﻲ ﻓــﺮم ،ﻛﻨﺘـﺮل Buttonدﻳﮕــﺮي را ﺑـﻪ Form1اﺿـﺎﻓﻪ ﻛــﺮده ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑــﺮ btnInitializingArrayWithValuesو ﺧﺎﺻـــــــﻴﺖ Textآن را ﺑﺮاﺑـــــــﺮ ﺑـــــــﺎ Initializing Array With Valuesﻗﺮار دﻫﻴﺪ. ١٧٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(2روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن وارد ﻛﻨﻴﺪ: (private void btnInitializingArrayWithValues_Click )object sender, EventArgs e { // Declare an populate an array { ][String[] strMyFriends = new string "Robbin","Bryan","Stephanie", ;}""Sudney","Katie // List your friends ;)AddItemsToList(strMyFriends } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ي ﺟﺪﻳﺪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻟﻴﺴﺖ ،ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در آراﻳﻪ ﭘـﺮ ﻣـﻲ ﺷﻮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ آراﻳﻪ را ﺗﻌﺮﻳﻒ ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻘﺎدﻳﺮ ﻫﺮ ﻳﻚ از ﻋﻨﺎﺻﺮ آن را ﺑﻪ ﺗﺮﺗﻴﺐ در ﻳﻚ ﺟﻔـﺖ آﻛـﻮﻻد وارد ﻛﻨﻴـﺪ .در اﻳـﻦ ﺣﺎﻟﺖ ،وﻳﮋوال C#از ﺧﺎﻧﻪ ﺻﻔﺮم آراﻳﻪ ﺷﺮوع ﻣﻲ ﻛﻨﺪ و ﻣﻘﺎدﻳﺮ وارد ﺷﺪه را ﺑﻪ ﺗﺮﺗﻴﺐ در ﺧﺎﻧﻪ ﻫﺎي آراﻳﻪ ﻗﺮار ﻣﻲ دﻫﺪ .در اﻳـﻦ ﻣﺜـﺎل ﭘﻨﺞ رﺷﺘﻪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ وﻳﺮﮔﻮل از ﻳﻜﺪﻳﮕﺮ ﺟﺪا ﺷﺪه اﻧﺪ را در آراﻳﻪ ﻗﺮار داده اﻳﻢ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﻃﻮل آراﻳﻪ را وارد ﻧﻜﺮده اﻳﻢ ،ﺑﻠﻜﻪ ﻃﻮل آراﻳﻪ ﺑﺮ اﺳﺎس ﻣﻘﺎدﻳﺮ وارد ﺷﺪه در داﺧﻞ آﻛﻮﻻد ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﺤﺎﺳﺒﻪ ﻣﻴﺸﻮد. // Declare an populate an array { ][String[] strMyFriends = new string "Robbin","Bryan","Stephanie", ;}""Sudney","Katie اﻟﺒﺘﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ اﻳﻦ روش ﺑﺮاي ﻣﻘﺪار دﻫﻲ ﺑﻪ آراﻳﻪ ﻫﺎي ﺑﺰرگ ﻣﻨﺎﺳﺐ ﻧﻴﺴﺖ .اﮔﺮ در ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ آراﻳﻪ ﺑﺰرﮔﻲ را ﭘـﺮ ﻛﻨﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ از روﺷﻲ ﻛﻪ در ﺑﺨﺶ ﻗﺒﻞ ﮔﻔﺘﻪ ﺷﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻳﻌﻨﻲ ﺑﺎ اﺳﺘﻔﺎده از ﻧﺎم آراﻳﻪ و اﻧـﺪﻳﺲ ﺧﺎﻧـﻪ ﻣـﻮرد ﻧﻈـﺮ ،ﻣﻘـﺪار آن ﻋﻨﺼﺮ را وارد ﻛﻨﻴﺪ.
ﻣﻔﻬﻮم ﺷﻤﺎرﻧﺪه ﻫﺎ:
١٧٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺘﻐﻴﺮﻫﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن اﻳﺠﺎد ﻛﺮده اﻳﻢ ،ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ در ﻧﻮع اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺴﺘﻨﺪ در ﺧﻮد ذﺧﻴﺮه ﻛﻨﻨﺪ ﻧﺪاﺷﺘﻨﺪ .ﺑﺮاي ﻣﺜﺎل اﮔـﺮ ﻣﺘﻐﻴﺮي را از ﻧﻮع intﺗﻌﺮﻳﻒ ﻣﻲ ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﺴﺘﻴﺪ ﻫﺮ ﻋﺪد ﺻﺤﻴﺤﻲ را در آن ﻧﮕﻬـﺪاري ﻛﻨﻴـﺪ .1اﻳـﻦ ﻣـﺴﺌﻠﻪ ﺑـﺮاي ﻣﺘﻐﻴﺮﻫـﺎي stringو doubleﻫﻢ وﺟﻮد داﺷﺖ. اﻣﺎ در ﺑﻌﻀﻲ از ﺷﺮاﻳﻂ ،ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻣﺘﻐﻴﺮ ﺷﻤﺎ ،اﻋﺪاد ﻣﺤﺪودي را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻣـﻲ ﺧﻮاﻫﻴـﺪ ﻣﺘﻐﻴﺮي از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و ﺗﻌﺪاد درﻫﺎي ﻳﻚ اﺗﻮﻣﺒﻴﻞ را در آن ذﺧﻴﺮه ﻛﻨﻴﺪ .ﻗﻄﻌﺎ ﻧﻤـﻲ ﺧﻮاﻫﻴـﺪ اﺟـﺎزه دﻫﻴـﺪ ﻛـﻪ ﻋـﺪد 16327در اﻳﻦ ﻣﺘﻐﻴﺮ ذﺧﻴﺮه ﺷﻮد .ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺷﻤﺎرﻧﺪه ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ: ﺑﺎ اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﻧﻮع ﻫﺎي داده اي ﺟﺪﻳﺪي ﺑﺮ اﺳﺎس ﻧﻮع ﻫﺎي داده اي ﻣﻮﺟﻮد از ﻗﺒﻴـﻞ short ،long ،int و ﻳﺎ byteﺑﺴﺎزﻳﺪ .ﻣﺘﻐﻴﺮﻫﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻧﻮع داده ي ﺟﺪﻳﺪ اﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ ،ﻓﻘـﻂ ﻣـﻲ ﺗﻮاﻧﻨـﺪ ﻣﻘـﺪاري را داﺷـﺘﻪ ﺑﺎﺷـﻨﺪ ﻛـﻪ ﺷـﻤﺎ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻴﺘﻮاﻧﻴﺪ در ﺑﺮﻧﺎﻣﻪ از وارد ﺷﺪن اﻋﺪاد ﻏﻴﺮ ﻣﻨﻄﻘﻲ در ﻣﺘﻐﻴﺮ ﻫﺎ ﺟﻠـﻮﮔﻴﺮي ﻛﻨﻴـﺪ .ﻫﻤﭽﻨـﻴﻦ اﺳـﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ در ﻛﺪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﺧﻮاﻧﺎﻳﻲ و وﺿﻮح ﻣﻲ ﺷﻮد .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد ﻛـﻪ ﭼﮕﻮﻧـﻪ ﻣﻴﺘـﻮان ﺑﺮﻧﺎﻣﻪ اي ﺳﺎﺧﺖ ﻛﻪ ﺑﺮ اﺳﺎس ﺳﺎﻋﺖ ،ﻳﻜﻲ از اﻋﻤﺎل ﻗﺎﺑﻞ اﺟﺮا در ﻳﻚ روز را اﻧﺘﺨﺎب ﻛﻨﺪ.
آﻣﺎده ﺷﺪن ﺑﺮاي رﻓﺘﻦ ﺑﻪ ﻣﺤﻞ ﻛﺎر. رﻓﺘﻦ ﺑﻪ ﻣﺤﻞ ﻛﺎر. در ﻣﺤﻞ ﻛﺎر ﺑﻮدن. رﻓﺘﻦ ﺑﺮاي ﻧﻬﺎر. ﺑﺮﮔﺸﺘﻦ از ﻣﺤﻞ ﻛﺎر. ﺑﺎ دوﺳﺘﺎن ﺑﻮدن. آﻣﺎده ﺷﺪن ﺑﺮاي ﺧﻮاب. ﺧﻮاﺑﻴﺪن.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ (1ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﻨﻴﺪ و ﻧﺎم آن را ﺑﺮاﺑﺮ ﺑﺎ Enum Demoﻗـﺮار دﻫﻴﺪ. (2ﺷﻤﺎرﻧﺪه ﻫﺎ ﻣﻌﻤﻮﻻ ﺑﻪ ﻋﻨﻮان ﻋﻀﻮي از ﻛﻼﺳﻲ ﻛﻪ در ﺣﺎل ﻛﺪ ﻧﻮﻳﺴﻲ در آن ﻫﺴﺘﻴﺪ ،ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮﻧﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﺑﺎز ﺷﺪ ،روي ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ و ﮔﺰﻳﻨﻪ ي View Codeرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮاي اﻳﻦ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﺑـﺎﻻي ﭘﻨﺠـﺮه ،ﺑﻌـﺪ از ﻧـﺎم ﻛﻼس وارد ﻛﻨﻴﺪ:
1اﻟﺒﺘﻪ ﺑﻪ ﺧﺎﻃﺮ ﻣﺤﺪود ﺑﻮدن ﻓﻀﺎي ﺣﺎﻓﻈﻪ اي ﻛﻪ ﺑﻪ ﻳﻚ ﻣﺘﻐﻴﺮ intاﺧﺘﺼﺎص داده ﻣﻲ ﺷﻮد ،ﻓﻘﻂ اﻋـﺪاد در ﺑـﺎزه ﺧﺎﺻـﻲ را ﻣﻴﺘـﻮان در اﻳـﻦ ﻧـﻮع ﻣﺘﻐﻴﻴـﺮ ﻫـﺎ ﻧﮕﻬﺪاري ﻛﺮد .اﻣﺎ ﻫﺮ ﻋﺪدي ﻛﻪ در اﻳﻦ ﺑﺎزه وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ را ﻣﻴﺘﻮان در ﻣﺘﻐﻴﺮﻫﺎي ﻋﺪد ﺻﺤﻴﺢ ذﺧﻴﺮه ﻛﺮد و در ﺑﻴﻦ اﻋﺪاد ﻣﻮﺟﻮد در اﻳﻦ ﺑﺎزه ﻣﺤـﺪودﻳﺘﻲ وﺟـﻮد ﻧﺪارد.
١٧٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
public partial class Form1 : Form { private enum DayAction { GettingReadyForWork = 0, TravelingToWork, AtWork, AtLunch, TravelingFromWork, RelaxingForFriends, GettingReadyForBed, Asleep ;} (3ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻤﺎرﻧﺪه را ﺗﻌﺮﻳﻒ ﻛﺮدﻳﺪ ،ﻣﻴﺘﻮاﻧﻴﺪ ﻣﺘﻐﻴﺮي ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﻛﻪ ﻧﻮع داده اي آن ﺑﺮاﺑﺮ ﺑﺎ اﻳﻦ ﺷـﻤﺎرﻧﺪه ﺑﺎﺷـﺪ .ﻣﺘﻐﻴـﺮ زﻳﺮ را در ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ Form1ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ: // Declare variable ;private DayAction CurrentState (4ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﺑﺮﮔﺮدﻳﺪ و ﺧﺎﺻﻴﺖ Textﻓﺮم را ﺑﺮاﺑـﺮ ﺑـﻪ ? What's Matt Doingﺗﻐﻴـﺮ دﻫﻴﺪ. (5ﺣﺎل ﻳﻚ ﻛﻨﺘﺮل DateTimePickerﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ زﻳﺮ ﻗﺮار دﻫﻴﺪ:
ﺧﺎﺻﻴﺖ Nameآن را ﺑﻪ dtpHourﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Formatآن را ﺑﻪ Timeﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺧﺎﺻﻴﺖ ShowUpDownرا ﺑﺮاﺑﺮ ﺑﺎ trueﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار Valueرا 00:00 AMوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ Sizeرا ﺑﺮاﺑﺮ ﺑﺎ 91;20وارد ﻛﻨﻴﺪ.
(6ﻳﻚ ﻛﻨﺘﺮل Labelدر ﻓـﺮم ﻗـﺮار داده ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑـﻪ lblStateو ﺧﺎﺻـﻴﺖ Textآن را ﺑـﻪ State Not Initializedﺗﻐﻴﻴﺮ دﻫﻴﺪ .اﻧﺪازه ﻓﺮم ﺧﻮد را ﻧﻴﺰ ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﻓﺮم ﺷﻤﺎ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 6-5ﺷﻮد.
ﺷﻜﻞ 6-5
١٧٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﭙﺲ ﻛﺪﻫﺎي ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ. اﻳﺠﺎد ﺷﻮدForm1 ﻣﺮﺑﻮط ﺑﻪLoad ( ﺑﺮ روي زﻣﻴﻨﻪ ي ﻓﺮم ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ روﻳﺪاد7 .را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ private void Form1_Load(object sender, EventArgs e) { // Set the hour property to the current hour this.Hour = DateTime.Now.Hour; } :( ﺣﺎل ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در اﻳﻦ ﻗﺴﻤﺖ را در ﭘﺎﻳﻴﻦ ﻛﺪي ﻛﻪ در ﻗﺴﻤﺖ ﺳﻮم اﻳﻦ ﺑﺨﺶ وارد ﻛﺮدﻳﺪ ﻗﺮار دﻫﻴﺪ8 // Hour property private int Hour { get { // Return the current hour displayed return dtpHour.Value.Hour; } set { // Set the date using the hour // passed to this property dtpHour.Value = new DateTime( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, value, 0, 0); // Set the display text lblState.Text = "At " + value + ":00 Matt is "; } } ﻣﺘــﺪ ﻣﺮﺑــﻮط ﺑــﻪ روﻳــﺪاد. دو ﺑــﺎر ﻛﻠﻴــﻚ ﻛﻨﻴــﺪdtpHour ( ﺑــﻪ ﻗــﺴﻤﺖ ﻃﺮاﺣــﻲ ﻓــﺮم ﺑﺮﮔﺮدﻳــﺪ و ﺑــﺮ روي ﻛﻨﺘــﺮل9 ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿـﺎﻓﻪ. اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﺧﻮاﻫﺪ ﺷﺪValueChanged :ﻛﻨﻴﺪ private void dtpHour_ValueChanged(object sender,EventArgs e) { // Update the hour property this.Hour = dtpHour.Value.Hour; } ﻣـﺸﺎﻫﺪه. ﻛﻠﻴـﻚ ﻛﻨﻴـﺪDateTimePicker ( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي ﻋﻼﻣﺖ ﻫﺎي ﺑﺎﻻ و ﭘﺎﻳﻴﻦ ﻛﻨﺎر ﻛﻨﺘﺮل10 .(7-5 ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﺘﻦ داﺧﻞ ﻛﻨﺘﺮل ﻟﻴﺒﻞ ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ و ﺳﺎﻋﺖ اﻧﺘﺨﺎب ﺷﺪه را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ )ﺷﻜﻞ
١٧٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 7-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻛﺎرﺑﺮ ﻣﻴﺘﻮاﻧﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل DateTimePickerﻳﻚ ﺳﺎﻋﺖ از ﺷﺒﺎﻧﻪ روز را اﻧﺘﺨﺎب ﻛﻨﺪ .ﺳﭙﺲ ﺷﻤﺎ ﺑـﺎ ﺗﻮﺟﻪ ﺑﻪ ﺳﺎﻋﺖ اﻧﺘﺨﺎب ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺖ در آن ﺳﺎﻋﺖ ﻣﺸﻐﻮل اﻧﺠﺎم ﻛﺪاﻣﻴﻚ از ﻫﺸﺖ ﻛـﺎر ﺗﻌﺮﻳـﻒ ﺷـﺪه اﺳﺖ .ﺑﺮاي اﻳﻦ ﻛﺎر اﺑﺘﺪا ﺑﺎﻳﺪ ﺳﺎﻋﺖ ﻣﺸﺨﺺ ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ را در ﻣﻜﺎﻧﻲ ﻧﮕﻬﺪاري ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻳﻚ ﺧﺎﺻﻴﺖ ﺟﺪﻳﺪ ﺑﻪ ﻓﺮﻣﻲ ﻛﻪ در ﺣﺎل ﻛﺎر ﺑﺎ آن ﻫﺴﺘﻴﻢ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻫﻤﺎﻧﻨﺪ دﻳﮕﺮ ﺧﺎﺻﻴﺘﻬﺎي ﻓﺮم ﻣﺜﻞ Nameاﺳﺖ .ﻧﺎم اﻳـﻦ ﺧﺎﺻـﻴﺖ ﺟﺪﻳـﺪ Hourاﺳﺖ و ﺑﺮاي ﺗﻨﻈﻴﻢ ﺳﺎﻋﺖ در ﻛﻨﺘﺮل DateTimePickerو ﻛﻨﺘﺮل ﻟﻴﺒـﻞ ﺑـﻪ ﻛـﺎر ﻣـﻲ رود .ﺑـﺮاي ﺗﻌﺮﻳـﻒ ﻳـﻚ ﺧﺎﺻﻴﺖ ﺟﺪﻳﺪ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻧﻮع داده اي و ﻧﺎم آن را ﻣﺸﺨﺺ ﻛﻨﻴﺪ و ﺳﭙﺲ ﻣﺎﻧﻨﺪ زﻳﺮ در ﺑﺪﻧـﻪ آن ﺧﺎﺻـﻴﺖ ،دو ﺑـﻼك ﺑـﻪ ﻧﺎﻣﻬـﺎي setو getﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ: private int Hour { get { … ;return dtpHour.Value.Hour } set { … } } ﺑﻪ ﺑﻼﻛﻬﺎي getو setدرون ﺧﺎﺻﻴﺖ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .دﺳﺘﻮرات ﺑﻼك getﻛﻪ ﺷـﺎﻣﻞ دﺳـﺘﻮر returnﻫـﻢ ﻫـﺴﺘﻨﺪ زﻣـﺎﻧﻲ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﻘﺪار ذﺧﻴﺮه ﺷﺪه در ﺧﺎﺻﻴﺖ را ﺑﺪﺳﺖ آورﻳﻢ .در ﺑﻼك getﻻزم ﻧﻴﺴﺖ ﻧﻮع ﻣﻘﺪار ﺑﺮﮔﺮداﻧـﺪه ﺷـﺪه ﺗﻮﺳﻂ آن را ﻣﺸﺨﺺ ﻛﻨﻴﻢ ،زﻳﺮا اﻳﻦ ﻧﻮع ﻫﻢ اﻛﻨﻮن در ﺧﻮد ﺗﻌﺮﻳﻒ ﺧﺎﺻﻴﺖ ﺑﻪ ﺻﻮرت intﻣـﺸﺨﺺ ﺷـﺪه اﺳـﺖ .ﭘـﺲ دﺳـﺘﻮرات ﺑﻼك getﺑﺎﻳﺪ ﻣﻘﺪاري را از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﺮﮔﺮداﻧﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻫﻨﮕﺎﻣﻲ ﻛﻪ از اﻳﻦ ﺧﺎﺻﻴﺖ در ﺳـﻤﺖ راﺳـﺖ ﻋﻼﻣـﺖ ﻣـﺴﺎوي اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎز دارد ﻛﻪ ﺑﻪ ﻣﻘﺪار آن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ ،ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ دﺳـﺘﻮرات ﺑﺨـﺶ getرا اﺟـﺮا ﻣﻲ ﻛﻨﺪ. دﺳﺘﻮرات ﺑﺨﺶ setزﻣﺎﻧﻲ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﺨﻮاﻫﻴﻢ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ از اﻳـﻦ ﺧﺎﺻـﻴﺖ در ﺳـﻤﺖ ﭼﭗ ﻳﻚ ﺗﺴﺎوي اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ ،setﺣﺎﺻﻞ ﻋﺒﺎرت ﺳﻤﺖ راﺳﺖ ﺗﺴﺎوي را در ﺧﺎﺻﻴﺖ ﻗﺮار ﻣﻲ دﻫﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻧﻴﺰ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻧﺎم و ﻳﺎ ﻧﻮع داده اي ﻣﻘﺪاري ﻛﻪ ﺑﻪ ﺑﻼك setﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد را ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﻧﻮع داده اي اﻳﻦ ﻣﻘـﺪار
١٧٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ﻧﻮع داده اي ﺧﺎﺻﻴﺖ ﺧﻮاﻫﺪ ﺑﻮد .ﻣﻘﺪار ﻓﺮﺳﺘﺎده ﺷﺪه ﻫﻢ ﺑﺎ ﻛﻠﻤﻪ ﻛﻠﻴـﺪي valueﺑـﻪ ﺑـﻼك setارﺳـﺎل ﻣـﻲ ﺷـﻮد. ﺑﻨﺎﺑﺮاﻳﻦ در ﺑﻼك setﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار ﻓﺮﺳﺘﺎده ﺷﺪه ،ﺑﺎﻳﺴﺘﻲ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي valueاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﺮوع ﻣﻲ ﺷﻮد ،ﻣﻘﺪار ﺧﺎﺻﻴﺖ Hourرا ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار ﻛﻨﻮﻧﻲ ﺳﺎﻋﺖ ﺳﻴﺴﺘﻢ ﻗﺮار ﻣﻲ دﻫﻴﻢ .ﺑـﺮاي دﺳﺘﺮﺳـﻲ ﺑـﻪ ﻣﻘﺪار ﻛﻨﻮﻧﻲ ﺳﺎﻋﺖ ﺳﻴﺴﺘﻢ ،ﻣﻲ ﺗﻮاﻧﻴﻢ از ﺧﺎﺻﻴﺖ Nowدر ﻛﻼس DateTimeاﺳﺘﻔﺎده ﻛﻨﻴﻢ: )private void Form1_Load(object sender, EventArgs e { // Set the hour property to the current hour ;this.Hour = DateTime.Now.Hour } ﻳﻜـﻲ از ﻣــﻮاﻗﻌﻲ ﻛــﻪ ﺑﺎﻳــﺪ ﺧﺎﺻــﻴﺖ Hourرا در ﻓــﺮم ﺗﻨﻈــﻴﻢ ﻛﻨﻴـﺪ ،زﻣــﺎﻧﻲ اﺳــﺖ ﻛــﻪ ﺧﺎﺻــﻴﺖ Valueﻣﺮﺑــﻮط ﺑــﻪ ﻛﻨﺘــﺮل DateTimePickerﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ ،ﻳﺎ ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻛﺎرﺑﺮ زﻣﺎن ﻧﻤﺎﻳﺶ داده ﺷﺪه در اﻳﻦ ﻛﻨﺘﺮل را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫـﺪ .ﺑـﺮاي اﻳﻦ ﻛﺎر از ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ValueChangedﻛﻨﺘﺮل DateTimePickerاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ: private void dtpHour_ValueChanged(object sender,EventArgs )e { // Update the hour property ;this.Hour = dtpHour.Value.Hour } ﻫﻤﭽﻨﻴﻦ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺧﺎﺻﻴﺖ Hourدر ﻓﺮم ﺗﻐﻴﻴﺮ ﻛﺮد ﺑﺎﻳﺪ ﻣﻘﺪار ﻧﻤﺎﻳﺶ داده ﺷﺪه ﺗﻮﺳﻂ ﻛﻨﺘﺮل DateTimePickerو ﻧﻴﺰ ﻛﻨﺘﺮل ﻟﻴﺒﻞ را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار ﺟﺪﻳﺪ ﻗﺮار دﻫﻴﺪ .ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻣﻮرد را ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺑﻼك setدر ﺧﺎﺻﻴﺖ وارد ﻛﻨﻴﺪ ﺗﺎ ﺑﺎ ﻫﺮ ﺑﺎر ﺗﻐﻴﻴﺮ ﻣﻘﺪار ،Hourاﺟﺮا ﺷﻮد. اوﻟﻴﻦ ﻣﻮردي ﻛﻪ ﺑﺎﻳﺪ در ﺑﻼك setﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻣﻘـﺪار ﻛﻨﺘـﺮل DateTimePickerاﺳـﺖ .ﻣﻤﻜـﻦ اﺳـﺖ ﺗـﺼﻮر ﻛﻨﻴـﺪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار ﺳﺎﻋﺖ اﻳﻦ ﻛﻨﺘﺮل از ﺧﺎﺻﻴﺖ Value.Hourاﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ ،ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﺎ ﺗﻨﻈﻴﻢ اﻳـﻦ ﺧﺎﺻﻴﺖ ﻣﻮﺟﺐ ﺷﻮﻳﻢ ﻛﻪ ﻣﻘﺪار ﺟﺪﻳﺪي در اﻳﻦ ﻛﻨﺘﺮل ﻧﻤﺎﻳﺶ داده ﺷﻮد .اﻣﺎ ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ ﻣﺎﻧﻨﺪ Hourاز ﻧﻮع ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﻫﺴﺘﻨﺪ و ﻧﻤﻲ ﺗﻮان آﻧﻬﺎ را ﺑﻪ ﺗﻨﻬﺎﻳﻲ ﺗﻨﻈﻴﻢ ﻛﺮد .ﺑﺮاي ﺗﻨﻈﻴﻢ ﻣﻘﺪار ﺳﺎﻋﺖ در اﻳﻦ ﻛﻨﺘﺮل ،ﺑﺎﻳﺪ ﻣﻘﺪار ﻛﻞ ﺧﺎﺻﻴﺖ Valueرا ﺗﻐﻴﻴـﺮ دﻫـﻴﻢ. ﺧﺎﺻﻴﺖ Valueﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع DateTimeرا درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي اﻳﻨﻜﻪ ﻓﻘﻂ ﻣﻘﺪار Hourرا ﺗﻐﻴﻴـﺮ دﻫـﻴﻢ، ﻳﻚ ﻣﺘﻐﻴﺮ ﺟﺪﻳﺪ از ﻧﻮع DateTimeﺗﻌﺮﻳﻒ ﻛﺮده و ﺗﻤﺎم ﻣﻘﺎدﻳﺮ آن ﺑﻪ ﺟﺰ ﻣﻘﺪار Hourرا ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ ﻗﺒﻠﻲ ﻗﺮار ﻣﻲ دﻫﻴﻢ. ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﻣﺘﻐﻴﺮ ﺟﺪﻳﺪ از ﻧﻮع DateTimeاز دﺳﺘﻮر newاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ )در ﻓﺼﻞ 10ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ ﺑﺎ اﻳﻦ دﺳﺘﻮر آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﺪ( .ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﻣﺘﻐﻴﺮ ﺟﺪﻳﺪ از ﻧﻮع DateTimeﺑﺎﻳﺪ ﻣﻘﺎدﻳﺮ ﻣﺨﺘﻠﻒ زﻣﺎن را ﺑﺮاي آن ﻓـﺮاﻫﻢ ﻛـﺮد .ﻣﻘـﺪار ،Year Monthو Dayرا ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ Nowﻛﻼس DateTimeﺑﺪﺳﺖ ﻣـﻲ آورﻳـﻢ .ﺳـﺎﻋﺖ را ﺑﺮاﺑـﺮ ﺑـﺎ ﺳـﺎﻋﺖ ﻣـﻮرد ﻧﻈﺮﻣﺎن )ﺳﺎﻋﺖ ﻓﺮﺳﺘﺎده ﺷﺪه ﺑﻪ ﺧﺎﺻﻴﺖ (Hourﻗﺮار ﻣﻲ دﻫﻴﻢ و دﻗﻴﻘﻪ و ﺛﺎﻧﻴﻪ را ﻫﻢ ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ. // Set the date using the hour passed to this property dtpHour.Value = new DateTime(DateTime.Now.Year, ;)DateTime.Now.Month, DateTime.Now.Day, value, 0, 0
١٧٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺘﻦ ﻧﺸﺎن داده ﺷﺪه در ﻛﻨﺘﺮل ﻟﻴﺒﻞ اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ﻣﻘـﺪار ﺟﺪﻳـﺪ ﺳـﺎﻋﺖ را ﻧﻤـﺎﻳﺶ، ﺗﻐﻴﻴﺮ ﻛﻨﺪset دوﻣﻴﻦ ﻣﻮردي ﻛﻪ ﺑﺎﻳﺪ در ﺑﻼك :دﻫﺪ // Set the display text lblState.text = "At " + value + ":00 Matt is "; اﻳﻦ ﻣﻮرد را ﻧﻴﺰ اﻧﺠﺎم ﻣﻲ، در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ.در اﻳﻦ ﺑﺨﺶ ﻣﺸﺨﺺ ﻧﻜﺮدﻳﻢ ﻛﻪ ﻣﺖ در آن ﺳﺎﻋﺖ ﻣﺸﻐﻮل ﺑﻪ ﭼﻪ ﻛﺎري اﺳﺖ .دﻫﻴﻢ
:ﺗﻌﻴﻴﻦ ﻣﻮﻗﻴﺖ ﺑـﺮاي اﻳـﻦ ﻛـﺎر. ﻣﻮﻗﻌﻴﺖ ﻣﺖ را ﻣـﺸﺨﺺ ﻛـﺮد، ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ ﺗﻐﻴﻴﺮ ﺳﺎﻋﺖ،در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﻴﺪ و ﺳﭙﺲ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴـﺪ ﻛـﻪ ﻛـﺪاﻣﻴﻚ از ﻣﻘـﺎدﻳﺮ ﻣﻮﺟـﻮد درDateTimePicker ﺳﺎﻋﺖ را از ﻛﻨﺘﺮل . آن را ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ، ﺑﻌﺪ از ﺗﻌﻴﻴﻦ اﻳﻦ ﻣﻮرد. ﺑﺮاي اﻳﻦ ﺳﺎﻋﺖ ﻣﻨﺎﺳﺐ اﺳﺖDayAction ﺷﻤﺎرﻧﺪه
ﺗﻌﻴﻴﻦ ﻣﻮﻗﻌﻴﺖ:اﻣﺘﺤﺎن ﻛﻨﻴﺪ را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴـﺮHour ﺧﺎﺻﻴﺖset ﺑﺎز ﻛﻨﻴﺪ و ﻛﺪ ﻣﻮﺟﻮد در ﺑﻼكForm1 ( ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ را ﺑﺮاي1 :دﻫﻴﺪ set { // Set the date using the hour passed to this property dtpHour.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, value, 0, 0); // Determine the state if (value >= 6 && value < 7) CurrentState = DayAction.GettingReadyForWork; else if (value > 7 && value < 8) CurrentState = DayAction.TravelingToWork; else if (value >= 8 && value < 13) CurrentState = DayAction.AtWork; else if (value >= 13 && value < 14) CurrentState = DayAction.AtLunch; else if (value >= 14 && value < 17) CurrentState = DayAction.AtWork; else if (value >= 17 && value < 18) CurrentState = DayAction.TravelingFromWork; else if (value >= 18 && value < 22)
١٨٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;CurrentState = DayAction.RelaxingForFriends )else if (value >= 22 && value < 23 ;CurrentState = DayAction.GettingReadyForBed else ;CurrentState = DayAction.Asleep // Set the display text lblState.Text = "At " + value + ":00 Matt is " + ;CurrentState } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي ﻋﻼﻣﺖ ﻫﺎي ﺑﺎﻻ و ﭘﺎﻳﻴﻦ ﻛﻨﺘﺮل DateTimePickerﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 8-5ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 8-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در ﺣﺎل ﻧﻮﺷﺘﻦ اﻳﻦ ﻛﺪﻫﺎ ،ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻣﻘﺪار ﻣﺘﻐﻴﺮ CurrentStateرا ﺗﻨﻈﻴﻢ ﻛﻨﻴـﺪ ،ﻟﻴـﺴﺘﻲ در وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎز ﺷﺪه و ﻣﻘﺎدﻳﺮ ﻣﻤﻜﻦ ﺑﺮاي اﻳﻦ ﻣﺘﻐﻴﺮ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ )ﺷﻜﻞ .(9-5 وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻣﻲ داﻧﺪ ﻛﻪ ﻣﺘﻐﻴﺮ CurrentSateاز ﻧﻮع DayActionﺗﻌﺮﻳﻒ ﺷـﺪه اﺳـﺖ .ﻫﻤﭽﻨـﻴﻦ وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﻣﻲ داﻧﺪ ﻛﻪ DayActionﻳﻚ ﺷﻤﺎرﻧﺪه اﺳﺖ ﻛﻪ ﻫﺸﺖ ﻣﻘﺪار ﻣﺨﺘﻠﻒ را ﻣﻲ ﺗﻮاﻧﺪ در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ ،و ﻫﺮ ﻛـﺪام از اﻳﻦ ﻣﻘﺎدﻳﺮ در ﭘﻨﺠﺮه اي ﻛﻪ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻛﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ ﻧﺸﺎن داده ﻣﻲ ﺷﻮد.
ﺷﻜﻞ 9-5
١٨١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ در ﻫﻨﮕﺎم ﻧﻤﺎﻳﺶ ﻣﻘﺪار CurrentStateدر ﻟﻴﺒﻞ ﻣﺘﻨﻬﺎي دﻳﮕﺮ را ﻧﻤﺎﻳﺶ ﻧﺪﻫﻴﺪ و ﻓﻘﻂ ﻣﺘﻐﻴﺮ CurrentState را در ﻟﻴﺒﻞ ﻗﺮار دﻫﻴﺪ ﻣﺎﻧﻨﺪ ﻛﺪ زﻳﺮ ،ﻫﻨﮕﺎم ﺧﻄﺎ ﺑﺎ ﻛﺎﻣﭙﺎﻳﻞ روﺑﺮو ﺧﻮاﻫﻴﺪ ﺷﺪ. ;lblState.Text = CurrentState اﻳﻦ ﺧﻄﺎ ﺑﻪ اﻳﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ ﻧﻮع ﻣﺘﻐﻴﺮ CurrentStateدر ﺣﻘﻴﻘﺖ از ﻧﻮع ﻋﺪد ﺻـﺤﻴﺢ اﺳـﺖ و ﻧﻤـﻲ ﺗﻮاﻧـﺪ ﺑـﻪ ﺻـﻮرت ﻣﺴﺘﻘﻴﻢ در ﻳﻚ ﻟﻴﺒﻞ ﻗﺮار ﺑﮕﻴﺮد .ﺑﺮاي اﻳﻦ ﻛﻪ اﻳﻦ ﻣﻘﺪار را در ﻟﻴﺒﻞ ﻗﺮار دﻫﻴﺪ ﺑﺎﻳﺪ آن را ﺑﻪ رﺷﺘﻪ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻳﻦ ﻣﺘﻐﻴﺮ را ﺑــﺎ دﻳﮕــﺮ رﺷــﺘﻪ ﻫــﺎ اﺳــﺘﻔﺎده ﻣــﻲ ﻛﻨﻴــﺪ )ﻫﻤﺎﻧﻨــﺪ ﻛــﺪ ﻧﻮﺷــﺘﻪ ﺷــﺪه در ﺑﺮﻧﺎﻣــﻪ( ،وﻳــﮋوال C#ﺑــﻪ ﺻــﻮرت اﺗﻮﻣﺎﺗﻴــﻚ ﻣﻘــﺪار CurrentStateرا ﺑــﻪ رﺷــﺘﻪ ﺗﺒــﺪﻳﻞ ﻣــﻲ ﻛﻨــﺪ و در ﻟﻴﺒــﻞ ﻗــﺮار ﻣــﻲ دﻫــﺪ .در ﻣــﻮاﻗﻌﻲ ﻛــﻪ ﻣــﻲ ﺧﻮاﻫﻴــﺪ ﻣﻘــﺪار CurrentStateرا ﺑﻪ ﺗﻨﻬﺎﻳﻲ ﻧﻤﺎﻳﺶ دﻫﻴﺪ ﺑﺎﻳﺴﺘﻲ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ )( ToStringآن را ﺑﻪ رﺷـﺘﻪ ﺗﺒـﺪﻳﻞ ﻛﻨﻴـﺪ و ﺳﭙﺲ در ﻟﻴﺒﻞ ﻗﺮار دﻫﻴﺪ. اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻋﺪد ﺧﺎص را از ﺑﻴﻦ ﻳﻚ ﺳﺮي ﻣﻘﺎدﻳﺮ ﻣﺸﺨﺺ اﻧﺘﺨﺎب ﻛﻨﻴـﺪ ﺑـﺴﻴﺎر ﻣﻨﺎﺳـﺐ اﺳـﺖ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﻴﺸﺘﺮ ﺑﺎ ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎي داﺧﻠﻲ .NETﻛﺎر ﻛﻨﻴﺪ ،ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﺑﺴﻴﺎري از ،.NETاز ﺷﻤﺎرﻧﺪه ﻫﺎ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ.
ﻣﻔﻬﻮم ﺛﺎﺑﺖ ﻫﺎ: ﻳﻜﻲ دﻳﮕﺮ از ﺗﻤﺮﻳﻦ ﻫﺎي ﺧﻮب ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻛﻪ ﺑﺎﻳﺪ ﺑﺎ آن آﺷﻨﺎ ﺷﻮﻳﺪ اﺳﺘﻔﺎده از ﺛﺎﺑﺖ ﻫﺎ اﺳﺖ .ﺗﺼﻮر ﻛﻨﻴﺪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﻣﺎﻟﻴﺎت ﺑﺮاي ﺣﻘﻮق ﻛﺎرﻣﻨﺪان ﻳﻚ ﺷﺮﻛﺖ ﻫﺴﺘﻴﺪ .در ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ،درﺻﺪ ﻣﺎﻟﻴﺎﺗﻲ ﻛﻪ ﺑﺎﻳﺪ از ﺣﻘـﻮق ﻫـﺮ ﻛﺎرﻣﻨـﺪ ﻛﻢ ﺷﻮد ﻓﺮﺿﺎً Aدرﺻﺪ اﺳﺖ .ﺑﻌﺪ از ﻣﺪﺗﻲ اﻳﻦ ﻣﻘﺪار ﺑﻪ ﻋﺪدي ﻣﺎﻧﻨﺪ Bﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎﻳﺪ ﺗﻤﺎم ﻗﺴﻤﺘﻬﺎﻳﻲ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﻣﺎﻟﻴﺎت را Aدرﺻﺪ وارد ﻛﺮده اﻳﺪ ﭘﻴﺪا ﻛﻨﻴﺪ و ﻋﺪد Aرا ﺑﻪ Bﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺣﺎل اﮔﺮ ﺣﺠﻢ ﺑﺮﻧﺎﻣﻪ ﺑﺰرگ ﺑﺎﺷﺪ ،ﻛﺎر ﺑﺴﻴﺎر ﺧﺴﺘﻪ ﻛﻨﻨﺪه و ﻃﻮﻻﻧﻲ را ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از ﺛﺎﺑﺖ ﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺑﺮوز ﭼﻨﻴﻦ ﻣﺸﻜﻼﺗﻲ ﺟﻠـﻮﮔﻴﺮي ﻛﻨﻴـﺪ .ﻫﻤﭽﻨـﻴﻦ ﺛﺎﺑـﺖ ﻫـﺎ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺧﻮاﻧﺎﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺰ اﻓﺰاﻳﺶ ﭘﻴﺪا ﻛﻨﺪ.
اﺳﺘﻔﺎده از ﺛﺎﺑﺖ ﻫﺎ: ﻓﺮض ﻛﻨﻴﺪ در ﺑﺮﻧﺎﻣﻪ ي زﻳﺮ دو ﻣﺘﺪ ﻣﺘﻔﺎوت ﻣﺎﻧﻨﺪ زﻳﺮ دارﻳﺪ و در ﻫﺮ ﻛﺪام ﻣﻲ ﺧﻮاﻫﻴﺪ ﻓﺎﻳﻞ ﻣﺸﺨﺼﻲ را ﺑﺎز ﻛﻨﻴـﺪ و روي آن ﻋﻤﻠﻴـﺎﺗﻲ اﻧﺠﺎم دﻫﻴﺪ: )(public void DoSomething { ?// What's the file name ;"string FileName = @"C:\Temp\Demo.txt // Open the file ... } )(public void DoSomethingElse
١٨٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ // What's the file name ;"string FileName = @"C:\Temp\Demo.txt // Open the file ... } در اﻳﻦ ﻛﺪ دو ﺛﺎﺑﺖ رﺷﺘﻪ اي ﺗﻌﺮﻳﻒ ﺷﺪه و ﻧﺎم ﻓﺎﻳﻞ در آﻧﻬﺎ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ .اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺿﻌﻒ ﻫﺎي زﻳﺎدي دارد ،ﺑـﻪ اﻳـﻦ ﻋﻠﺖ ﻛﻪ ﻧﺎم ﻓﺎﻳﻞ در دو ﻣﺘﻐﻴﺮ ﻣﺠﺰا ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ و اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻧﺎم ﻓﺎﻳﻞ را ﺗﻐﻴﺮ دﻫﻴﺪ ﺑﺎﻳﺪ در ﻫﺮ دو ﻣﺘﺪ ﺗﻐﻴﻴﺮ اﻳﺠﺎد ﻛﻨﻴﺪ. در اﻳﻦ ﻣﺜﺎل ﻫﺮ دو ﻣﺘﺪ در ﻛﻨﺎر ﻫﻢ ﻗﺮار دارﻧﺪ و ﺣﺠﻢ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺰ ﻛﻮﭼﻚ اﺳﺖ ،اﻣﺎ ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑـﺴﻴﺎر ﺑـﺰرگ ﺑﺎﺷـﺪ و از اﻳـﻦ رﺷﺘﻪ ﺑﺨﻮاﻫﻴﺪ در 50 ،10و ﻳﺎ ﺑﻴﺶ از 1000ﻗﺴﻤﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻧﺎم ﻓﺎﻳﻞ را ﺗﻐﻴﻴﺮ دﻫﻴـﺪ ،ﺑﺎﻳـﺪ در ﺗﻤـﺎم اﻳﻦ ﻗﺴﻤﺘﻬﺎ ﻧﺎم را ﻋﻮض ﻛﻨﻴﺪ .اﻳﻦ ﻣﻮرد ،دﻗﻴﻘﺎ ﻳﻜﻲ از ﻣﻮاردي اﺳﺖ ﻛﻪ ﻣﻮﺟﺐ ﺑﻪ وﺟﻮد آﻣﺪن ﺧﻄﺎﻫﺎي زﻳـﺎد در ﻧﻮﺷـﺘﻦ و ﻧﮕﻬـﺪاري ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد. ﺑﺮاي رﻓﻊ اﻳﻦ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﻧﺎم ﻛﻠﻲ ﺑﺮاي اﻳﻦ ﺛﺎﺑﺖ رﺷﺘﻪ اي ﭘﻴﺪا ﻛﻨﻴﺪ و در ﺑﺮﻧﺎﻣﻪ از اﻳﻦ ﻧﺎم ﺑﻪ ﺟﺎي ﻧﺎم ﻓﺎﻳﻞ اﺳﺘﻔﺎده ﻛﻨﻴـﺪ. ﺑﻪ اﻳﻦ ﻛﺎر ﺗﻌﺮﻳﻒ ﻳﻚ "ﺛﺎﺑﺖ" ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ،ﺛﺎﺑﺖ ﻧﻮع ﺧﺎﺻﻲ از ﻣﺘﻐﻴﺮ اﺳﺖ ﻛﻪ ﻣﻘـﺪار آن در ﻃـﻮل ﺑﺮﻧﺎﻣـﻪ ﻗﺎﺑـﻞ ﺗﻐﻴﻴﺮ ﻧﻴﺴﺖ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﺨﺶ ﺑﻌﺪ ،ﻧﺤﻮه ﺗﻌﺮﻳﻒ و اﺳﺘﻔﺎده از آﻧﻬﺎ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺛﺎﺑﺘﻬﺎ (1ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺟﺪﻳﺪي اﻳﺠﺎد ﻛﺮده و ﻧﺎم آن را Constants Demoﻗﺮار دﻫﻴﺪ. (2در ﻣﺤﻴﻂ ﻃﺮاﺣﻲ ﻓﺮم ،ﺳﻪ ﻛﻨﺘﺮل Buttonﺑﺮ روي ﻓﺮم ﻗﺮار داده و ﺧﺎﺻـﻴﺖ Nameآﻧﻬـﺎ را ﺑـﻪ ﺗﺮﺗﻴـﺐ ﺑـﺎ ﻣﻘـﺎدﻳﺮ btnTwo ،btnOneو btnThreeﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺖ Textاﻳﻦ ﻛﻨﺘﺮل ﻫـﺎ را ﺑﺮاﺑـﺮ ﺑـﺎ ،One Twoو Threeﻗﺮار دﻫﻴﺪ .ﺑﻌﺪ از اﻳﻦ ﻣﻮارد ﻓﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 10-5ﺑﺎﺷﺪ.
ﺷﻜﻞ 10-5 (3ﺑﻪ ﺑﺨﺶ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮوﻳﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﺑﺎﻻي ﻛﺪ ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ﻛﻼس From1ﻗﺮار دﻫﻴﺪ: public partial class Form1 : Form
١٨٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ =
strFileName
string
// File name constant private const ;"@"C:\Temp\Demo.txt
(4ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﺑﺮ روي دﻛﻤﻪ btnOneدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪاد Clickآن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void btnOne_Click(object sender, EventArgs e { // Using a constant MessageBox.Show("1: " + strFileName, "Constants ;)"Demo } (5ﻣﺠﺪدا ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و روي دﻛﻤﻪ btnTwoدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ روﻳﺪاد Clickآن ﻧﻴﺰ اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳﺮ را در آن ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void btnTwo_Click(object sender, EventArgs e { // Using a constant MessageBox.Show("2: " + strFileName, "Constants ;)"Demo } (6در آﺧﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن ﺳﻮم روي ﻓﺮم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻗـﺴﻤﺖ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪاد Clickآن وارد ﻛﻨﻴﺪ: )private void btnThree_Click(object sender, EventArgs e { // Using a constant MessageBox.Show("3: " + strFileName, "Constants ;)"Demo } (7ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن اول ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 11-5ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 11-5 ١٨٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ ﺑﺮ روي دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن دوم و ﺳﻮم ﻫﻢ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﻫﻤﻴﻦ ﻧﺎم ﻓﺎﻳﻞ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ،ﺛﺎﺑﺖ ﻫﺎ ﻫﻤﺎﻧﻨﺪ ﻣﺘﻐﻴﺮ ﻫﺎ ﻫﺴﺘﻨﺪ ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻣﻘﺪار آﻧﻬﺎ در ﻃﻮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲ ﺗﻮاﻧـﺪ ﺗﻐﻴﻴـﺮ ﻛﻨـﺪ .ﺗﻌﺮﻳـﻒ ﺛﺎﺑﺖ ﻫﺎ ﻫﻤﺎﻧﻨﺪ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﻴﺮ ﻫﺎ اﺳﺖ ،ﺑﺎ اﻳﻦ ﺗﻔﺎوت ﻛﻪ ﻗﺒﻞ از ﺗﻌﺮﻳﻒ ﻧﻮع داده اي ﺑﺎﻳﺪ از ﻳﻚ ﻋﺒﺎرت constﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮد. // File name constant ;"private const string strFileName = @"C:\Temp\Demo.txt ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺛﺎﺑﺘﻬﺎ ﻫﻢ ﻣﺎﻧﻨﺪ ﻣﺘﻐﻴﺮﻫﺎ داراي ﻳﻚ ﻧﻮع داده اي ﻫﺴﺘﻨﺪ و ﺑﺎﻳﺪ داراي ﻣﻘﺪار اوﻟﻴﻪ ﺑﺎﺷﻨﺪ ﻛﻪ ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ آن را ﻣـﺸﺨﺺ ﻣﻲ ﻛﻨﻴﻢ. ﺑﺮاي اﺳﺘﻔﺎده از ﺛﺎﺑﺘﻬﺎ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻣﺘﻐﻴﺮﻫﺎ ،ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻧﺎم آﻧﻬﺎ را در ﺑﺮﻧﺎﻣﻪ وارد ﻛﻨﻴﻢ: )private void btnOne_Click(object sender, EventArgs e { // Using a constant MessageBox.Show("1: " + strFileName, "Constants ;)"Demo } ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼ ﮔﻔﺘﻢ ،ﻣﺰﻳﺖ اﺳﺘﻔﺎده از ﺛﺎﺑﺘﻬﺎ در اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺑﺎ ﺗﻐﻴﻴﺮ ﻗﺴﻤﺘﻲ از ﻛﺪ ،در ﺑﺨﺸﻬﺎي زﻳﺎدي از ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﺮ اﻳﺠﺎد ﻛﻨﻴﺪ .اﻟﺒﺘﻪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺘﻬﺎ را ﻓﻘﻂ در ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ و ﻫﻨﮕﺎﻣﻲ ﻛـﻪ ﺑﺮﻧﺎﻣـﻪ در ﺣـﺎل اﺟﺮا ﺑﺎﺷﺪ اﻳﻦ ﻣﻘﺎدﻳﺮ ﺛﺎﺑﺖ ﻫﺴﺘﻨﺪ. ﻧﻜﺘﻪ :ﻣﻤﻜﻦ اﺳﺖ ﺗﻌﺮﻳﻒ ﻣﻔﻬﻮم ﺛﺎﺑﺖ در اﺑﺘﺪا ﻛﻤﻲ ﺧﻨﺪه دار ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ" ،ﺛﺎﺑﺖ ﻣﺘﻐﻴﺮي اﺳﺖ ﻛﻪ ﻣﻘﺪار آن ﻧﻤﻲ ﺗﻮاﻧﺪ ﺗﻐﻴﻴﺮ ﻛﻨـﺪ". اﻣﺎ اﻳﻦ ﺗﻌﺮﻳﻒ را ﻓﻘﻂ ﺑﺮاي درك ﺑﻬﺘﺮ اﻳﻦ ﻣﻔﻬﻮم ﺑﻪ ﻛﺎر ﺑﺮده ام .در ﺣﻘﻴﻘﺖ اﺳﺘﻔﺎده ﻛﺮدن و ﻳﺎ ﻧﻜﺮدن از ﺛﺎﺑﺖ ﻫﺎ ﻫﻴﭻ ﺗﻔـﺎوﺗﻲ در ﻛـﺪ ﻧﻬﺎﻳﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ )ﻛﺪ ﻣﺤﻠﻲ و ﻳﺎ ﻛﺪ (MSILو ﻳﺎ در ﺳﺮﻋﺖ اﺟﺮاي آن ﻧﺪارد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺛﺎﺑﺖ ﻫﺎ ﻓﻘﻂ ﺑـﺮاي اﻓـﺰاﻳﺶ ﺧﻮاﻧـﺎﻳﻲ ﺑﺮﻧﺎﻣﻪ و ﻫﻤﭽﻨﻴﻦ ﺳﺎدﮔﻲ ﺗﻐﻴﻴﺮات آﺗﻲ آن ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ .اﮔﺮ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ از ﺛﺎﺑﺘﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺗﻤـﺎم ﻛـﺪ ﺑﺮﻧﺎﻣﻪ را ﺟﺴﺘﺠﻮ ﻛﺮده و ﻫﺮ ﺟﺎ ﺑﻪ ﻧﺎم ﺛﺎﺑﺖ ﺑﺮﺧﻮرد ﻛﻨﺪ ،ﻣﻘﺪار آن را ﺑﺎ ﻣﻘﺪار ﻣﺸﺨﺺ ﺷﺪه ﺑﺮاي ﺛﺎﺑﺖ ﻋﻮض ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺗﻌﺮﻳﻒ ﻳﻚ ﺛﺎﺑﺖ ﺑﺮ ﺧﻼف ﻣﺘﻐﻴﺮ ﻫﻴﭻ ﻓﻀﺎﻳﻲ از ﺑﺮﻧﺎﻣﻪ را در زﻣﺎن اﺟﺮا اﺷﻐﺎل ﻧﻤﻲ ﻛﻨﺪ.
ﺛﺎﺑﺘﻬﺎ ﺑﺎ ﻧﻮﻋﻬﺎي داده اي ﮔﻮﻧﺎﮔﻮن: در اﻳﻦ ﺑﺨﺶ ،ﻓﻘﻂ از ﻧﻮع داده اي رﺷﺘﻪ ﺑﺮاي ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﻫﺎ اﺳﺘﻔﺎده ﻛﺮدﻳﻢ ،اﻣﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي واﻗﻌﻲ از ﻫﺮ ﻧﻮع داده اي ﻛﻪ ﺗـﺎﻛﻨﻮن ﺑﺎ آن آﺷﻨﺎ ﺷﺪه اﻳﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻳﻚ ﺛﺎﺑﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻟﺒﺘﻪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ اﺷﻴﺎﻳﻲ ﻛﻪ از ﻛﻼﺳﻬﺎ ﺑﻪ وﺟﻮد ﻣﻲ آﻳﻨﺪ )ﭼـﻪ
١٨٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در .NETو ﭼﻪ ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ آﻧﻬﺎ را ﻣﻲ ﺳﺎزد( ﻧﻤﻲ ﺗﻮاﻧﻨﺪ در ﺛﺎﺑﺖ ﻫﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ .در ﻣﻮرد ﻛﻼﺳﻬﺎ در ﻓﺼﻞ 9ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. ﺑﺮاي ﻣﺜﺎل ،اﻋﺪاد ﺻﺤﻴﺢ ﻳﻜﻲ از ﻧﻮع ﻫﺎي داده اي ﻫﺴﺘﻨﺪ ﻛﻪ در ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﻫﺎ زﻳﺎد ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ: ;public const int intHourAsleepPerDay = 8
ﺳﺎﺧﺘﺎرﻫﺎ: ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻧﺮم اﻓﺰار در ﺑﻴﺸﺘﺮ ﻣﻮاﻗﻊ ﻧﻴﺎز ﺧﻮاﻫﻴﺪ داﺷﺖ ﻣﻘﺪاري اﻃﻼﻋﺎت ﻛﻪ ﻫﺮ ﻛﺪام ﻧﻮع داده اي ﻣﺘﻔﺎوﺗﻲ دارﻧﺪ ،وﻟـﻲ ﻫﻤﮕـﻲ ﺑـﻪ ﻳﻚ ﻣﻮﺿﻮع ﻣﺮﺗﺒﻂ ﻣﻲ ﺷﻮﻧﺪ را در ﻳﻚ ﮔﺮوه ذﺧﻴﺮه ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺧﻮاﻫﻴﺪ اﻃﻼﻋﺎت ﻣﺮﺑـﻮط ﺑـﻪ ﻳـﻚ ﻣـﺸﺘﺮك از ﻗﺒﻴـﻞ ﻧـﺎم و آدرس او )از ﻧﻮع رﺷﺘﻪ اي( و ﻧﻴﺰ ﻣﻘﺪار داراﻳﻲ او )از ﻧﻮع ﻋﺪدي( را در ﻳﻚ ﮔﺮوه اﻃﻼﻋﺎت ذﺧﻴﺮه ﻛﻨﻴﺪ .ﺑﺮاي ﻧﮕﻬﺪاري ﭼﻨﻴﻦ اﻃﻼﻋﺎﺗﻲ، ﻳﻚ ﻛﻼس وﻳﮋه ﻃﺮاﺣﻲ ﻣﻲ ﻛﻨﻴﺪ و اﻃﻼﻋﺎت را در ﻳﻚ ﺷﻴﺊ از آن ﻛﻼس ﻗﺮار ﻣﻲ دﻫﻴﺪ ﻛﻪ اﻳﻦ روش در ﻓﺼﻞ 9ﺗﻮﺿـﻴﺢ داده ﻣـﻲ ﺷﻮد .اﻣﺎ روش دﻳﮕﺮ ﺑﺮاي ﻧﮕﻬﺪاري اﻳﻦ ﻣﺠﻤﻮﻋﻪ اﻃﻼﻋﺎت ،اﺳﺘﻔﺎده از ﺳﺎﺧﺘﺎرﻫﺎ اﺳﺖ .ﺳﺎﺧﺘﺎرﻫﺎ ﻧﻴﺰ ﻛﺎرﺑﺮدي ﻣﺎﻧﻨﺪ ﻛﻼﺳﻬﺎ دارﻧـﺪ اﻣـﺎ ﺳﺎده ﺗﺮ ﻫﺴﺘﻨﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ آﻧﻬﺎ را در اﻳﻦ ﻗﺴﻤﺖ ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. ﺑﻌﺪﻫﺎ ﻫﻨﮕﺎم ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ،ﻧﻴﺎز ﺧﻮاﻫﻴﺪ داﺷﺖ ﻛﻪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳﺪ ﺑﺮاي ﻳﻚ ﺣﺎﻟﺖ ﺧﺎص ﺑﺎﻳﺪ از ﻛﻼﺳﻬﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻳﺎ از ﺳﺎﺧﺘﺎرﻫﺎ. ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻗﺎﻧﻮن ﻛﻠﻲ ﻫﻤﻮاره در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﺘﺪﻫﺎ ،ﺗﻮاﺑﻊ ،ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﻐﻴﺮﻫﺎي زﻳﺎدي را ﻛﻪ ﻫﻤﮕﻲ ﺑﻪ ﻫﻢ ﻣﺮﺗﺒﻂ ﻫﺴﺘﻨﺪ در ﻳﻚ ﮔﺮوه ﻗﺮار دﻫﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ از ﻛﻼﺳﻬﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺳﺎﺧﺘﺎرﻫﺎ را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ .ﻓﻘﻂ در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﮔﺮ ﻳﻚ ﺳﺮي اﻃﻼﻋﺎت را در ﻳﻚ ﺳﺎﺧﺘﺎر ﻗﺮار دﻫﻴﺪ و ﭘﺲ از ﻣﺪﺗﻲ ﺑﺨﻮاﻫﻴﺪ آن را ﺑﻪ ﻳﻚ ﻛـﻼس ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ ،ﻣﺸﻜﻞ زﻳﺎدي را ﺧﻮاﻫﻴﺪ داﺷﺖ .ﭘﺲ ﺑﻬﺘﺮ اﺳﺖ ﻗﺒﻞ از ﺗﻌﺮﻳﻒ ﻛﻼس و ﻳﺎ ﺳﺎﺧﺘﺎر ،ﺑﻪ دﻗﺖ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ﻛـﻪ ﻛـﺪام ﻣـﻮرد ﺑﺮاي اﺳﺘﻔﺎده ﺷﻤﺎ ﻣﻨﺎﺳﺐ ﺗﺮ اﺳﺖ.
اﻳﺠﺎد ﺳﺎﺧﺘﺎرﻫﺎ: در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ،ﺑﺎ ﻧﺤﻮه اﻳﺠﺎد ﻳﻚ ﺳﺎﺧﺘﺎر آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﺳﺎﺧﺘﺎر (1ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم Structure Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﺑﻌﺪ از اﻳﻦ ﻛﻪ ﭘﺮوژه اﻳﺠﺎد ﺷﺪ ،در ﭘﻨﺠﺮه Solution Explorerﺑﺮ روي ﻧﺎم ﭘﺮوژه ﻛﻠﻴـﻚ راﺳـﺖ ﻛـﺮده ،از ﻣﻨﻮي ﻧﻤﺎﻳﺶ داده ﺷﺪه ﮔﺰﻳﻨﻪ Addرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ از زﻳﺮ ﻣﻨﻮي ﺑﺎز ﺷـﺪه ﮔﺰﻳﻨـﻪ … Classرا اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ. ﭘﻨﺠﺮه اي ﺑﻪ ﻧﺎم Add New Item – Structure Demoﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ .در ﻗﺴﻤﺖ ﻧـﺎم، ﻋﺒﺎرت Customerرا وارد ﻛﺮده و ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ آﻳﺘﻢ ﺟﺪﻳﺪي ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﻮد. (3ﺑﻌﺪ از اﻳﻨﻜﻪ ﺻﻔﺤﻪ اي ﻛﻪ ﺟﺪﻳﺪاً اﻳﺠﺎد ﻛﺮده اﻳﺪ ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﻛﺪﻫﺎي داﺧﻞ آن را ﭘﺎك ﻛﻨﻴﺪ و ﻛﺪﻫﺎي زﻳﺮ را ﺑﻪ ﺟـﺎي آن وارد ﻛﻨﻴﺪ:
١٨٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
public struct Customer { // Public members ;public string FirstName ;public string LastName ;public string Email } ﻧﻜﺘﻪ :ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ ﻛﻪ ﺑﺨﺶ ﺗﻌﺮﻳﻒ ﻛﻼس ،ﺑﺎ ﺗﻌﺮﻳﻒ ﺳﺎﺧﺘﺎر ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴﺪي structﺟﺎﻳﮕﺰﻳﻦ ﺷﺪه اﺳﺖ. (4ﺑﻪ ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮﮔﺮدﻳﺪ .ﭼﻬﺎر ﻛﻨﺘﺮل ،Labelﭼﻬﺎر ﻛﻨﺘﺮل TextBoxو ﻳـﻚ ﻛﻨﺘـﺮل Buttonﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ را ﺑﻪ ﻧﺤﻮي ﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ ﻛﻪ ﻓﺮم ﺷـﻤﺎ ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 12-5 ﺷﻮد. (5ﺧﺎﺻﻴﺖ Nameﻛﻨﺘﺮل ﻫﺎ را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ:
label1را ﺑﻪ lblNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. textBox1را ﺑﻪ txtNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. Label2را ﺑﻪ lblFirstNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. textBox2را ﺑﻪ txtFirstNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. Label3را ﺑﻪ lblLastNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. textBox3را ﺑﻪ txtLastNameﺗﻐﻴﻴﺮ دﻫﻴﺪ. Label4را ﺑﻪ lblEmailﺗﻐﻴﻴﺮ دﻫﻴﺪ. textBox4را ﺑﻪ txtEmailﺗﻐﻴﻴﺮ دﻫﻴﺪ. Button1را ﺑﻪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ.
(6ﺧﺎﺻﻴﺖ Textﻛﻨﺘﺮﻟﻬﺎي زﻳﺮ را ﺑﻪ ﻣﻘﺎدﻳﺮ ﻣﺸﺨﺺ ﺷﺪه ﺗﻐﻴﻴﺮ دﻫﻴﺪ:
ﻛﻨﺘﺮل lblNameرا ﺑﻪ Nameﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﻛﻨﺘﺮل lblFirstNameرا ﺑﻪ First Nameﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﻛﻨﺘﺮل lblLastNameرا ﺑﻪ Last Nameﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﻛﻨﺘﺮل lblEmailرا ﺑﻪ Emailﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﻛﻨﺘﺮل btnTestرا ﺑﻪ Testﺗﻐﻴﻴﺮ دﻫﻴﺪ.
١٨٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
12-5 ﺷﻜﻞ ﺳﭙﺲ ﻛـﺪﻫﺎي ﻣـﺸﺨﺺ، اﻳﻦ ﻛﻨﺘﺮل اﻳﺠﺎد ﺷﻮدClick دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ روﻳﺪادButton ( ﺑﺮ روي ﻛﻨﺘﺮل7 :ﺷﺪه در زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ private void btnTest_Click(object sender, EventArgs e) { // Create a new customer Customer objCustomer; objCustomer.FirstName = "Michael"; objCustomer.LastName = "Dell"; objCustomer.Email = "mdell@somecompany.com"; // Display the customer DisplayCustomer(objCustomer); } : وارد ﻛﻨﻴﺪForm1 ( ﺳﭙﺲ زﻳﺮﺑﺮﻧﺎﻣﻪ زﻳﺮ را در ﻛﻼس8 private void DisplayCustomer(Customer objCustomer) { // Display the customer details on the form txtFirstName.Text = objCustomer.FirstName; txtLastName.Text = objCustomer.LastName; txtEmail.Text = objCustomer.Email; } . را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد13-5 ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ. ﻛﻠﻴﻚ ﻛﻨﻴﺪTest ( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي9
١٨٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 13-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي ﺗﻌﺮﻳﻒ ﻳﻚ ﺳﺎﺧﺘﺎر ﺑﺎﻳﺪ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي structدر C#اﺳﺘﻔﺎده ﻛﻨﻴﺪ .درون ﺑﻼك اﻳﻦ ﺳﺎﺧﺘﺎر ﺑﺎﻳـﺪ ﻣﺘﻐﻴﺮﻫـﺎﻳﻲ ﻛـﻪ ﻣـﻲ ﺧﻮاﻫﻴﺪ در اﻳﻦ ﮔﺮوه ﺑﺎﺷﻨﺪ را ﺑﻪ ﻫﻤﺮاه اﺳﻢ و ﻧﻮع داده اي آﻧﻬﺎ ﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻋﻀﻮ ﻫﺎي اﻳﻦ ﺳﺎﺧﺘﺎر ﻣﻲ ﮔﻮﻳﻨﺪ. public struct Customer { // Public members ;public string FirstName ;public string LastName ;public string Email } ﺑﻪ ﻛﻠﻤﻪ ﻛﻠﻴﺪي publicدر ﻣﻘﺎﺑﻞ ﻫﺮ ﻳﻚ از ﻣﺘﻐﻴﻴﺮ ﻫﺎ و ﻫﻤﭽﻨﻴﻦ ﻗﺒﻞ از ﺧﻮد ﺗﻌﺮﻳﻒ ﺳﺎﺧﺘﺎر ﺗﻮﺟﻪ ﻛﻨﻴﺪ .در ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﻗﺒﻠـﻲ، ﻛﻠﻤﻪ privateﻧﻴﺰ ﻛﻪ ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ ﺑﻪ ﻛﺎر ﻣﻲ رﻓﺖ را دﻳﺪه ﺑﻮدﻳﺪ .ﻛﻠﻤﻪ publicﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺷﻤﺎ در ﻛﺪﻫﺎي ﺧﺎرج از ﺳﺎﺧﺘﺎر Customerﻫﻢ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﻪ ﻣﺘﻐﻴﺮﻫﺎي آن )ﻣﺎﻧﻨﺪ (FirstNameدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ و ﻣﻘﺪار آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. در داﺧــﻞ ﻣﺘــﺪ btnTest_Clickﻣﺘﻐﻴــﺮي را از ﻧــﻮع داده اي Customerﺗﻌﺮﻳــﻒ ﻣــﻲ ﻛﻨﻴــﺪ .اﮔــﺮ ﺳــﺎﺧﺘﺎر Customerرا از ﻧﻮع ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﺮدﻳﺪ ،در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﻣﻘﺪار اوﻟﻴـﻪ آن را ﻧﻴـﺰ ﺑـﺎ اﺳـﺘﻔﺎده از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي new ﻣﺸﺨﺺ ﻣﻲ ﻛﺮدﻳﺪ .ﻧﺤﻮه اﻳﻦ ﻛﺎر در ﻓﺼﻞ 10ﺗﻮﺿﻴﺢ داده ﺷﺪه اﺳﺖ. )private void btnTest_Click(object sender, EventArgs e { // Create a new customer ;Customer objCustomer ﺑﻌﺪ از ﺗﻌﺮﻳﻒ اﻳـﻦ ﻣﺘﻐﻴـﺮ از ﻧـﻮع ،Customerﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﻪ ﻫـﺮ ﻳـﻚ از ﻣﺘﻐﻴﺮﻫـﺎي ﻣﻮﺟـﻮد در اﻳـﻦ ﺳـﺎﺧﺘﺎر ﺑـﺎ اﺳـﺘﻔﺎده از objCustomerدﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧﺎم objCustomerرا وارد ﻛﺮدﻳﺪ ﻳﻚ ﻧﻘﻄﻪ ﻧﻴﺰ ﻗـﺮار دﻫﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻤﺎم اﻋﻀﺎي اﻳﻦ ﺳﺎﺧﺘﺎر ﺑﻪ وﺳﻴﻠﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﻨﺪ ﺷﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻘﺪار ﻫـﺮ ﻳـﻚ از آﻧﻬـﺎ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ١٨٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;"objCustomer.FirstName = "Michael ;"objCustomer.LastName = "Dell ;"objCustomer.Email = "mdell@somecompany.com // Display the customer ;)DisplayCustomer(objCustomer } در اﻧﺘﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻫﻢ ﻣﺘﺪ DisplayCustomerرا ﻣـﻲ ﻧﻮﻳـﺴﻴﻢ .وﻇﻴﻔـﻪ اﻳـﻦ ﻣﺘـﺪ اﻳـﻦ اﺳـﺖ ﻛـﻪ ﻳـﻚ ﺳـﺎﺧﺘﺎر از ﻧـﻮع Customerرا ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ورودي درﻳﺎﻓﺖ ﻛﻨﺪ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻣﻘـﺎدﻳﺮ وارد ﺷـﺪه در اﻋـﻀﺎي اﻳـﻦ ﺳـﺎﺧﺘﺎر ﺧﺎﺻـﻴﺖ Textﻫﺮ ﻛﺪام از TextBoxﻫﺎي روي ﻓﺮم را ﺗﻨﻈﻴﻢ ﻛﻨﺪ. )private void DisplayCustomer(Customer objCustomer { // Display the customer details on the form ;txtFirstName.Text = objCustomer.FirstName ;txtLastName.Text = objCustomer.LastName ;txtEmail.Text = objCustomer.Email }
اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ ﺑﻪ ﺳﺎﺧﺘﺎرﻫﺎ: ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻳﻚ ﺳﺎﺧﺘﺎر ،ﻋﻼوه ﺑﺮ ﻣﺘﻐﻴﺮ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺖ ﻧﻴﺰ ﺑﺮاي آن ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ .ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻫﻤﺎن روﺷﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ Enum Demoﺑﻪ ﻛﺎر ﺑﺮدﻳﻢ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﭼﮕﻮﻧﮕﻲ اﻳﻦ ﻛﺎر را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ Name (1وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي ﺳﺎﺧﺘﺎر Customerﺑﺎز ﻛﻨﻴﺪ و ﺳﭙﺲ ﻛﺪ زﻳﺮ را ﺑﻪ اﻳﻦ ﺳﺎﺧﺘﺎر اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ﺗـﺎ ﻳـﻚ ﺧﺎﺻـﻴﺖ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﻪ اﻳﻦ ﺳﺎﺧﺘﺎر اﺿﺎﻓﻪ ﺷﻮد: // Public members ;public string FirstName ;public string LastName ;public string Email // Name Property public string Name { get { ١٩٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;return FirstName + " " + LastName } } ﻧﻜﺘﻪ :ﺧﺎﺻﻴﺘﻬﺎي ﻳﻚ ﻛﻼس و ﻳﺎ ﻳﻚ ﺳﺎﺧﺘﺎر ﺑﻪ ﺳﻪ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻨﺪ ﺗﻌﺮﻳﻒ ﺷﻮﻧﺪ :ﻳﺎ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﺎﺷﻨﺪ ،ﻳﺎ ﻓﻘﻂ-ﻧﻮﺷﺘﻨﻲ ﺑﺎﺷﻨﺪ و ﻳﺎ ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ ﺑﺎﺷﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﻪ ﺑﺘﻮان ﻣﻘﺪار ﻳﻚ ﺧﺎﺻﻴﺖ را ﺗﻨﻈﻴﻢ ﻛﺮد ﺑﺎﻳﺪ ﺑﺨﺶ setرا در آن ﻗـﺮار داد .ﺑـﺮاي اﻳـﻦ ﻛـﻪ ﺑﺘﻮان ﻣﻘﺪار ﻛﻨﻮﻧﻲ آن را ﺑﺪﺳﺖ آورد ﺑﺎﻳﺪ ﺑﺨﺶ getرا در آن وارد ﻛﺮد .اﮔﺮ ﻳﻚ ﺧﺎﺻﻴﺖ داراي ﻫﺮ دو ﺑﺨﺶ ﺑﺎﺷﺪ ،ﺧﺎﺻﻴﺖ از ﻧـﻮع ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ ﺧﻮاﻫﺪ ﺑﻮد .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺮاي اﻳﻦ ﻛﻪ ﺧﺎﺻﻴﺖ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﺎﺷﺪ ،ﻗﺴﻤﺖ setرا ﺑﺮاي آن ﻗﺮار ﻧـﺪادﻳﻢ و ﻓﻘـﻂ ﺑﺨﺶ getدر آن ﻧﻮﺷﺘﻴﻢ. (2اﻛﻨﻮن وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳـﺮ را ﺑـﻪ ﻣﺘـﺪ DisplayCustomer اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void DisplayCustomer(Customer objCustomer { // Display the customer details on the form ;txtName.Text = objCustomer.Name ;txtFirstName.Text = objCustomer.FirstName ;txtLastName.Text = objCustomer.LastName ;txtEmail.Text = objCustomer.Email } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Testﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﺎدر Nameﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ )ﺷﻜﻞ (13-5ﺧﺎﻟﻲ ﻣﻲ ﻣﺎﻧﺪ ،ﺣﺎﻻ ﺑﺎ ﻧﺎم و ﻧﺎم ﺧﺎﻧﻮادﮔﻲ ﻣﺸﺘﺮك ﭘﺮ ﻣﻲ ﺷﻮد.
ﻛﺎر ﺑﺎ ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي: ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ ﻣﻴﺨﻮاﻫﻴﺪ ﻟﻴﺴﺘﻲ از اﻃﻼﻋﺎت ﺗﻤﺎم ﻣﺸﺘﺮﻛﻴﻦ ﺧﻮد داﺷﺘﻪ ﺑﺎﺷﻴﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ از آراﻳﻪ ﻫـﺎ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ ،اﻣـﺎ ﻫﻤﻴﺸﻪ ﻫﻢ ﻛﺎر ﺑﺎ آراﻳﻪ ﻫﺎ ﭼﻨﺪان ﺳﺎده ﻧﻴﺴﺖ.
اﮔﺮ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻳﻚ ﻣﺸﺘﺮك ﺟﺪﻳﺪ را ﺑﻪ آراﻳﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ اﻧﺪازه آراﻳﻪ را ﺗﻐﻴﻴﺮ دﻫﻴـﺪ و ﺳـﭙﺲ ﻣـﺸﺘﺮك را ﺑـﻪ اﻧﺘﻬﺎي آراﻳﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ آراﻳﻪ اي ﺟﺪﻳﺪ ﻛﻪ ﻳﻚ واﺣﺪ ﺑﺰرﮔﺘﺮ از آراﻳﻪ ﻛﻨﻮﻧﻲ اﺳﺖ اﻳﺠـﺎد ﻛﻨﻴـﺪ و ﺳـﭙﺲ ﺗﻤﺎم ﻋﻨﺎﺻﺮ آراﻳﻪ ﻛﻨﻮﻧﻲ را ﺑﻪ آراﻳﻪ ﺟﺪﻳﺪ ﻣﻨﺘﻘﻞ ﻛﻨﻴﺪ و ﻣﺸﺘﺮك ﺟﺪﻳﺪ را ﻧﻴﺰ ﺑﻪ آراﻳﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .در اﻧﺘﻬﺎ ﻧﻴﺰ آراﻳﻪ اول را از ﺑﻴﻦ ﺑﺒﺮﻳﺪ. اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻣﺸﺘﺮك را از آراﻳﻪ ﺣﺬف ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت ﺧﻄﻲ در ﺗﻤﺎم ﻋﻨﺎﺻﺮ آراﻳﻪ ﺑﻪ دﻧﺒﺎل ﻣﺸﺘﺮك ﺑﮕﺮدﻳﺪ و ﭘـﺲ از ﭘﻴﺪا ﻛﺮدن ﻣﻜﺎن آن ،ﺗﻤﺎم ﻋﻨﺎﺻﺮ اﻳﻦ آراﻳﻪ را ﺑﻪ ﺟﺰ ﻋﻨﺼﺮي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺣﺬف ﻛﻨﻴﺪ ،در ﻳﻚ آراﻳﻪ ﺟﺪﻳﺪ ﻗﺮار دﻫﻴﺪ و آراﻳﻪ ﻛﻨﻮﻧﻲ را از ﺑﻴﻦ ﺑﺒﺮﻳﺪ. ﺑﺮاي اﻳﻦ ﻛﻪ ﻳﻜﻲ از ﻣﺸﺘﺮﻛﻴﻦ ﻟﻴﺴﺖ را ﺑﺎ ﻣﺸﺘﺮك دﻳﮕﺮي ﺗﻌﻮﻳﺾ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﻣﺸﺘﺮك اول را در آراﻳﻪ ﭘﻴﺪا ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﻪ ﺻﻮرت دﺳﺘﻲ ﻣﺸﺘﺮك اول را ﺑﺎ ﻣﺸﺘﺮك دوم ﺟﺎ ﺑﻪ ﺟﺎ ﻛﻨﻴﺪ.
١٩١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺎ اﺳﺘﻔﺎده از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي در .NETﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﻼس ArrayListﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻫﺴﺘﻨﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑـﻪ راﺣﺘـﻲ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ آراﻳﻪ ﻫﺎ را ﻛﻨﺘﺮل ﻛﻨﻴﺪ.
اﺳﺘﻔﺎده از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي: ﻧﺤﻮه اﺳﺘﻔﺎده از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي در اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﺷﺮح داده ﺷﺪه اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي (1ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﻳﻚ ﻛﻨﺘﺮل ListBoxرا ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﻣﻜـﺎن ﻛﻨﺘـﺮل ﻫـﺎي روي ﻓـﺮم را ﺑـﻪ ﻧﺤــﻮي ﺗﻐﻴﻴــﺮ دﻫﻴــﺪ ﻛــﻪ ﻓــﺮم ﺷــﻤﺎ ﻣــﺸﺎﺑﻪ ﺷــﻜﻞ 14-5ﺷــﻮد .ﺧﺎﺻــﻴﺖ Nameاﻳــﻦ ListBoxرا ﺑﺮاﺑــﺮ ﺑــﺎ lstCustomersو ﺧﺎﺻﻴﺖ IntegralHeightآن را ﺑﺮاﺑﺮ ﺑﺎ Falseﻗﺮار دﻫﻴﺪ. ﻧﻜﺘﻪ :ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻠﻴﺪ Ctrl+Aﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎي روي ﻓﺮم را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺳﭙﺲ آﻧﻬﺎ را ﺑﻪ ﻣﻮﻗﻌﻴﺖ ﺟﺪﻳﺪﺷﺎن ﺑﺒﺮﻳﺪ.
ﺷﻜﻞ 14-5 (2وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﺮده و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﺑﺘﺪاي ﻛﻼس ،Form1ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ﻛﻼس اﺿﺎﻓﻪ ﻛﻨﻴﺪ: public partial class Form1 : Form { // Form level members
١٩٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
private ArrayList objCustomers = new ArrayList(); ﺑﻪ ﻋﺒﺎرت دﻳﮕـﺮ اﻳـﻦ ﻛـﻼس را ﺟـﺰ، را ﻛﺎﻣﻞ ﻧﻜﺮدArrayList وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﺎم ﻛﻼس، اﮔﺮ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ اﻳﻦ ﻛﺪ:ﻧﻜﺘﻪ اﻳــﻦ ﻛــﻼس در ﻓــﻀﺎي ﻧــﺎم.ﻛﻼﺳــﻬﺎي ﺗﻌﺮﻳــﻒ ﺷــﺪه ﻧﺪاﺷــﺖ ﺑﺎﻳــﺴﺘﻲ ﻓــﻀﺎي ﻧــﺎم آن را ﺑــﻪ ﺑﺮﻧﺎﻣــﻪ ﺧــﻮد اﺿــﺎﻓﻪ ﻛﻨﻴــﺪ ﺑـﺮاي. ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮدusing ﻳﻚ ﻓﻀﺎي ﻧﺎم ﺑﺎ اﺳﺘﻔﺎده از ﻛﻠﻤﻪ ﻛﻠﻴﺪي. ﻗﺮار داردSystem.Collection ﺑﺮوﻳـﺪ و ﻛـﺪForm1 ﺑﻪ ﺑﺎﻻﺗﺮﻳﻦ ﺧﻂ در ﻗﺴﻤﺖ ﻛﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ،System.Collection اﺿﺎﻓﻪ ﻛﺮدن ﻓﻀﺎي ﻧﺎم :زﻳﺮ را وارد ﻛﻨﻴﺪ using System.Collections; . ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮدusing در ﻓﺼﻞ ﻧﻬﻢ در راﺑﻄﻪ ﺑﺎ ﻛﻠﻤﻪ ﻛﻠﻴﺪي :( ﺣﺎل ﻣﺘﺪ زﻳﺮ را ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﻣﺸﺘﺮك ﺟﺪﻳﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ3 public void CreateCustomer(string FirstName, string LastName, string Email) { // Declare a customer object Customer objNewCustomer; // Create the new customer objNewCustomer.FirstName = FirstName; objNewCustomer.LastName = LastName; objNewCustomer.Email = Email; // Add the new customer to the list objCustomers.Add(objNewCustomer); // Add the new customer to the ListBox control lstCustomers.Items.Add(objNewCustomer); } : را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪbtnTest_Click ( ﺳﭙﺲ ﻣﺘﺪ4 private void btnTest_Click(object sender, EventArgs e) { // Create some customers CreateCustomer("Darrel", "Hilton", "dhilton@somecompany.com"); CreateCustomer("Frank", "Peoples", "fpeoples@somecompany.com"); CreateCustomer("Bill", "Scott", "bscott@somecompany.com"); } ١٩٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(5ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Testﻛﻠﻴﻚ ﻛﻨﻴﺪ ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 15-5را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 15-5 ﺷﻤﺎ ﭼﻨﺪﻳﻦ ﻣﺘﻐﻴﺮ از ﺳﺎﺧﺘﺎر Customerرا ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻛﺮدﻳﺪ ،اﻣﺎ ﭼﻴﺰي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﻨﺘـﺮل ListBoxﻧﻤـﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﭼﻨﺪﻳﻦ ﻋﺒﺎرت Customerاﺳﺖ .ﻛﻨﺘﺮل ListBoxﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺎدﻳﺮ رﺷﺘﻪ اي را ﺑﻪ ﻟﻴﺴﺖ ﺧﻮد اﺿـﺎﻓﻪ ﻛﻨـﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﺮ از ﺳﺎﺧﺘﺎر Customerرا ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل ﻣﻲ ﻓﺮﺳﺘﻴﺪ ،وﻳﮋوال C#ﻣﺘﺪ )( ToStringرا ﺑﺮاي اﻳـﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ،اﻳﻦ ﻣﺘﺪ ﻧﺎم ﺳﺎﺧﺘﺎر و ﻳﺎ ﻛﻼس را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻧﻪ ﻣﺤﺘﻮﻳﺎﺗﻲ از آن ﺳـﺎﺧﺘﺎر را ﻛـﻪ ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ .ﻛﺎري ﻛﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘﺪ )( ToStringرا ﺑﻪ ﻧﺤﻮي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﻋﺒـﺎرت ﺑﺎ ﻣﻌﻨﻲ ﺗﺮي را ﺑﺮﮔﺮداﻧﺪ .ﭼﮕﻮﻧﮕﻲ اﻳﻦ ﻛﺎر را در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺑﺎزﻧﻮﻳﺴﻲ ﻣﺘﺪ )(ToString (1ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮاي ﺳﺎﺧﺘﺎر Customerرا ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ در اﻳﻦ ﺳﺎﺧﺘﺎر ،ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻫﺎ ﻗﺮار دﻫﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﺗﺎﺑﻊ داراي XML Document Commentاﺳﺖ .از ﻓـﺼﻞ ﺳـﻪ ﺑـﻪ ﺧﺎﻃﺮ دارﻳﺪ ﻛﻪ ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن اﻳﻦ ﻧﻮع ﺗﻮﺿﻴﺤﺎت ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ از ﺳﻪ ﻛﺎراﻛﺘﺮ /ﻣﺘﻮاﻟﻲ ﻗﺒﻞ از ﻣﺘﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. >/// <summary /// Overrides the default ToString method >/// </summary >/// <returns>String</returns /// <remarks>Returns the customer name and email >address</remarks )(public override string ToString {
١٩٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;" )" return Name + " (" + Email + } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Testﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﺘﻴﺠﻪ اي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 16-5ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 16-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع داده اي Customerﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﺷﻮد ،ﻛﻨﺘﺮل ListBoxﺗﺎﺑﻊ ToSringاﻳﻦ ﻣﺘﻐﻴـﺮ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده و رﺷﺘﻪ اي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .در اﻳـﻦ ﻛـﺪ ،ﻣﺘـﺪ ToStringرا ﺑـﻪ ﺻﻮرﺗﻲ ﺑﺎزﻧﻮﻳﺴﻲ ﻛﺮدﻳﻢ ﻛﻪ ﺑﻪ ﺟﺎي ﺑﺮﮔﺮداﻧﺪن ﻧﺎم ﺧﻮد ﺳﺎﺧﺘﺎر ،ﻳﻚ ﻋﺒﺎرت ﺑﺎ ﻣﻌﻨﻲ را ﻧﻤﺎﻳﺶ دﻫﺪ. >/// <summary /// Overrides the default ToString method >/// </summary >/// <returns>String</returns /// <remarks>Returns the customer name and email >address</remarks )(public override string ToString { ;" )" return Name + " (" + Email + } ﻧﻜﺘﻪ :ﺑﻪ اﻳﻦ ﻋﻤﻞ overrideﻛﺮدن ﻣﺘﺪﻫﺎ ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ در ﻓﺼﻞ ﻧﻬﻢ ﺑﻴﺸﺘﺮ ﺑﺎ آن آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﻢ.
١٩٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
را، از ﻫﺮ ﻧﻮﻋﻲ ﻛﻪ ﺑﺎﺷـﻨﺪ، ﻣﻲ ﺗﻮاﻧﺪ ﻟﻴﺴﺘﻲ از اﺷﻴﺎ و ﻳﺎ ﺳﺎﺧﺘﺎرﻫﺎ، اﻳﺠﺎد ﻣﻲ ﺷﻮدArrayList ﻳﻚ ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻣﻲ ﺗﻮاﻧﻴﺪ اﺷﻴﺎﻳﻲ از ﻧﻮع ﻫﺎي ﮔﻮﻧﺎﮔﻮن را در اﻳﻦ ﻟﻴﺴﺖ ذﺧﻴﺮه ﻛﻨﻴﺪ )اﻳﻦ ﻣﻮرد ﻣﻘﺪاري ﺟﻠﻮﺗﺮ در.در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ اﻳﺠﺎد ﻛﺮدﻳﻢ ﻛﻪ ﺑﺮ اﺳـﺎس ﭘﺎراﻣﺘﺮﻫـﺎﻳﻲCreateCustomer در اﻳﻦ ﻣﺜﺎل ﻣﺘﺪي ﺑﻪ ﻧﺎم.(اﻳﻦ ﻓﺼﻞ ﺑﻴﺸﺘﺮ ﺗﻮﺿﻴﺢ داده ﺷﺪه : را اﻳﺠﺎد ﻣﻲ ﻛﺮدCustomer ﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع،ﻛﻪ ﺑﻪ آن ﻓﺮﺳﺘﺎده ﺷﺪه ﺑﻮد public void CreateCustomer(string FirstName, string LastName, string Email) { // Declare a customer object Customer objNewCustomer; // Create the new customer objNewCustomer.FirstName = FirstName; objNewCustomer.LastName = LastName; objNewCustomer.Email = Email; ﺑــﻪ ﻧــﺎمArrayList آن را ﺑــﻪ ﻟﻴــﺴﺖ ﭘﻴﻮﻧــﺪﻳﻲ ﻛــﻪ از ﻛــﻼس،ﻫﻨﮕــﺎﻣﻲ ﻛــﻪ ﻣﺘﻐﻴــﺮ ﻣــﻮرد ﻧﻈﺮﻣــﺎن را اﻳﺠــﺎد ﻛــﺮدﻳﻢ . اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﻢ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢobjCustomers // Add the new customer to the list objCustomers.Add(objNewCustomer); :ﻫﻤﭽﻨﻴﻦ ﻣﺘﻐﻴﺮ اﻳﺠﺎد ﺷﺪه را ﺑﻪ ﻛﻨﺘﺮل ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻧﻴﺰ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ آن را ﻧﻤﺎﻳﺶ دﻫﺪ // Add the new customer to the ListBox control lstCustomers.Items.Add(objNewCustomer); } ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ آن ﻳﻚ ﻣﺸﺘﺮك ﺟﺪﻳﺪ ﺗﻌﺮﻳﻒ ﻛﺮده و آن را ﺑﻪ، را ﺗﻌﺮﻳﻒ ﻛﺮدﻳﺪCreateCustomer ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﺪ :ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻧﻴﺰ اﺿﺎﻓﻪ ﻛﻨﻴﺪ private void btnTest_Click(object sender, EventArgs e) { // Create some customers CreateCustomer("Darrel", "Hilton", "dhilton@somecompany.com"); CreateCustomer("Frank", "Peoples", "fpeoples@somecompany.com"); CreateCustomer("Bill", "Scott", "bscott@somecompany.com"); }
١٩٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
:ﺣﺬف ﻳﻚ ﻋﻨﺼﺮ از ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي ﻛﺎرﻫﺎﻳﻲ ﻛﻪ اﻧﺠﺎم آﻧﻬـﺎ ﺑـﺎ، در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻧﻮع ﻟﻴﺴﺖ ﻫﺎ.ﺗﺎﻛﻨﻮن ﺑﺎ ﻣﺒﺎﻧﻲ ﻛﺎر ﺑﺎ ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي آﺷﻨﺎ ﺷﺪﻳﺪ در. ﺑﺮاي ﻣﺜﺎل ﺗﻮاﻧﺴﺘﻴﻢ ﭼﻨﺪﻳﻦ ﻋﻨﺼﺮ ﺟﺪﻳﺪ را ﺑﻪ راﺣﺘﻲ ﺑﻪ اﻳﻦ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻛﻨـﻴﻢ.آراﻳﻪ ﻫﺎ ﺑﺴﻴﺎر ﻣﺸﻜﻞ ﺑﻮد را ﺑﻪ راﺣﺘﻲ اﻧﺠﺎم دادﻳﻢ .اﻳﻦ ﺑﺨﺶ ﭼﮕﻮﻧﮕﻲ ﭘﺎك ﻛﺮدن ﺑﻌﻀﻲ از ﻋﻨﺎﺻﺮ ﻳﻚ ﻟﻴﺴﺖ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد
ﭘﺎك ﻛﺮدن ﻣﺸﺘﺮﻛﻴﻦ:اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺳـﭙﺲ ﺧﺎﺻـﻴﺖ. ﺟﺪﻳﺪ ﺑـﻪ ﻗـﺴﻤﺖ ﭘـﺎﻳﻴﻦ ﻓـﺮم اﺿـﺎﻓﻪ ﻛﻨﻴـﺪButton ﻳﻚ ﻛﻨﺘﺮل،( ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم1 . ﺗﻐﻴﻴﺮ دﻫﻴﺪDelete آن را ﺑﻪText و ﺧﺎﺻﻴﺖbtnDelete آن را ﺑﻪName : آن وارد ﻛﻨﻴﺪClick ( ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد2 private void btnDelete_Click(object sender, EventArgs e) { // If no customer is selected in the ListBox then... if (lstCustomers.SelectedIndex == -1) { // Display a message MessageBox.Show("You must select a customer to " + "delete!", "Structure Demo"); // Exit the method return; } // Prompt the user to delete the selected customer DialogResult result = MessageBox.Show( "Are you sure you want to delete " + SelectedCustomer.Name + "? ", "Structure Demo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { // Get the customer to be deleted Customer objCustomerToDelete = SelectedCustomer; // Remove the customer from the ArrayList objCustomers.Remove(objCustomerToDelete); // Remove the customer from the ListBox lstCustomers.Items.Remove(objCustomerToDelete); } } ١٩٧
www.pupuol.com
(3ﺳﭙﺲ ﺧﺎﺻﻴﺖ SelectedCustomerﻛﻪ در ﻛـﺪ ﺑـﺎﻻ اﺳـﺘﻔﺎده ﺷـﺪه اﺳـﺖ را ﺑـﻪ ﺻـﻮرت زﻳـﺮ ﺑـﻪ ﻛـﻼس Form1اﺿﺎﻓﻪ ﻛﻨﻴﺪ. public Customer SelectedCustomer { get { // Return the selected customer [return (Customer)lstCustomers.Items ;]lstCustomers.SelectedIndex } } (4ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Testﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﺪون اﻳﻨﻜﻪ ﻣﺸﺘﺮﻛﻲ را از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﺑﺮ روي دﻛﻤـﻪ Deleteﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﻲ ﮔﻮﻳﺪ ﺑﺎﻳﺪ ﻳﻚ ﻣﺸﺘﺮك را از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻛﻨﻴـﺪ ﺗـﺎ ﺑﺘﻮاﻧﻴﺪ آن را ﺣﺬف ﻛﻨﻴﺪ. (5ﺣﺎل ﻳﻚ ﻣﺸﺘﺮك را اﻧﺘﺨﺎب ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ي Deleteﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد ﻛـﻪ ﺑﺮاي ﺣﺬف ﻣﺸﺘﺮك از ﺷﻤﺎ ﺳﻮال ﻣﻲ ﻛﻨﺪ؟ )ﺷﻜﻞ (17-5 (6ﺑﺮ روي ﮔﺰﻳﻨﻪ Yesﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﮔﺰﻳﻨﻪ اﻧﺘﺨﺎﺑﻲ ﺷﻤﺎ از ﻟﻴﺴﺖ ﭘﺎك ﻣﻲ ﺷﻮد.
ﺷﻜﻞ 17-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
١٩٨
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻳﻜﻲ از ﻧﻜﺘﻪ ﻫﺎي اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﺧﺎﺻﻴﺘﻲ ﺑﻮد ﻛـﻪ ﻣـﺸﺘﺮك اﻧﺘﺨـﺎب ﺷـﺪه در ﻛﻨﺘـﺮل ListBoxرا ﺑﺮﻣـﻲ ﮔﺮداﻧـﺪ .ﺧﺎﺻـﻴﺖ SelectedIndexدر ﻛﻨﺘﺮل ،ListBoxاﻧﺪﻳﺲ ﻋﻨﺼﺮ اﻧﺘﺨﺎب ﺷﺪه در ﻟﻴﺴﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﻣﺎ اﮔﺮ ﻫﻴﭻ ﻋﻨﺼﺮي در ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻧﺸﺪه ﺑﺎﺷﺪ ،اﻳﻦ ﺗﺎﺑﻊ ﻋﺪد -1را ﻧﺘﻴﺠﻪ ﻣﻲ دﻫﺪ. public Customer SelectedCustomer { get { // Return the selected customer [return (Customer)lstCustomers.Items ;]lstCustomers.SelectedIndex } } ﻫﻤﺎﻧﻨﺪ ﺧﺎﺻﻴﺖ Nameدر ﺳﺎﺧﺘﺎر ،Customerاﻳﻦ ﺧﺎﺻﻴﺖ ﻧﻴﺰ از ﻧﻮع ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ اﻳﺠﺎد ﺷﺪه اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛـﻪ ﻣـﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﺧﺎﺻﻴﺖ ﻓﻘﻂ داراي ﺑﻼك getاﺳﺖ و ﺑﻼك setﻧﺪارد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ در ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﻪ ﻣﻘـﺪار ﻛﻨـﻮﻧﻲ اﻳﻦ ﺧﺎﺻﻴﺖ دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﻢ و ﻧﻤﻲ ﺗﻮاﻧﻴﻢ ﻣﻘﺪار آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﻢ. درون ﻛﻨﺘﺮل ﻛﻨﻨﺪه ي روﻳﺪاد Clickﺑﺮاي دﻛﻤﻪ Deleteاﺑﺘﺪا ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ آﻳﺎ ﻣﺸﺘﺮﻛﻲ از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﺷﺪه اﺳـﺖ ﻳﺎ ﻧﻪ؟ در ﺻﻮرﺗﻲ ﻛﻪ ﻫﻴﭻ ﻓﺮدي از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻧﺸﺪه ﺑﻮد ،ﺑﺎ ﻧﻤﺎﻳﺶ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻛﺎرﺑﺮ ﻣﻲ ﮔـﻮﻳﻴﻢ ﻛـﻪ ﺑﺎﻳـﺪ ﻳـﻚ ﻣـﺸﺘﺮك را اﻧﺘﺨﺎب ﻛﻨﺪ ﺗﺎ ﺑﺘﻮاﻧﺪ آن را ﺣﺬف ﻛﻨﺪ .ﺳﭙﺲ از ﻣﺘﺪ ﺧﺎرج ﻣﻲ ﺷﻮﻳﻢ و ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﻴﻢ ﻛﻪ ﻓﺮدي را از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻛﻨﺪ. // If no customer is selected in the ListBox then... )if (lstCustomers.SelectedIndex == -1 { // Display a message " MessageBox.Show("You must select a customer to ;)""delete!", "Structure Demo
+
// Exit the method ;return } اﮔﺮ ﻛﺎرﺑﺮ ﻣﺸﺘﺮﻛﻲ را از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻛﺮده ﺑﻮد ،ﻧﺎم او را در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ ﺗﺎ ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ ﻛﺎرﺑﺮ ﻣﻲ ﺧﻮاﻫـﺪ آن را از ﻟﻴﺴﺖ ﺣﺬف ﻛﻨﺪ. (DialogResult result = MessageBox.Show "Are you sure you want to delete " + SelectedCustomer.Name + "? ", "Structure Demo", MessageBoxButtons.YesNo, ;)MessageBoxIcon.Question )if (result == DialogResult.Yes {
١٩٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﺤﻮه اﺳﺘﻔﺎده از ﺗﺎﺑﻊ MessageBox.Showدر اﻳﻦ ﻗﺴﻤﺖ ،ﻣﻘﺪاري ﺑﺎ دﻓﻌﺎت ﻗﺒﻞ ﺗﻔﺎوت دارد .ﻫﻤﺎﻧﻄﻮر ﻛـﻪ ﭘـﻴﺶ ﺗـﺮ ﻧﻴـﺰ ﮔﻔﺘﻢ 1ﻳﻚ ﺗﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﺪ در ﺣﺎﻟﻲ ﻛﻪ ﻓﻘﻂ ﻳﻚ ﻧﺎم دارد ،ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺨﺘﻠﻔﻲ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻛﻨﺪ .اﮔﺮ در ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ راﻫﻨﻤﺎﻳﻲ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ درﺑﺎره اﻳﻦ ﺗﺎﺑﻊ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ دﻗﺖ ﻛﻨﻴﺪ ،ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﭼﻨـﺪﻳﻦ روش ﻣـﻲ ﺗﻮاﻧﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد .ﻳﻜﻲ از اﻳﻦ روﺷﻬﺎ ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻧﻴﺰ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ ،ﻳﻚ رﺷﺘﻪ را ﺑﻪ ﻋﻨﻮان ﻣﺘﻦ اﺻﻠﻲ و رﺷﺘﻪ دﻳﮕﺮي را ﻧﻴﺰ ﺑﺮاي ﻧﻤﺎﻳﺶ در ﻋﻨﻮان ﭘﻨﺠﺮه درﻳﺎﻓﺖ ﻣﻲ ﻛﺮد و ﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﺑﺮ اﺳﺎس اﻳﻦ اﻃﻼﻋﺎت ﻧﻤﺎﻳﺶ ﻣﻲ داد. در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻳﻜﻲ دﻳﮕﺮ از ﺣﺎﻟﺘﻬﺎي ﺗﺎﺑﻊ MessageBox.Showاﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .اﻳﻦ ﺣﺎﻟﺖ ﻋﻼوه ﺑﺮ ﭘﺎراﻣﺘﺮﻫﺎي ﻗﺒﻠﻲ، دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن و آﻳﻜـﻮﻧﻲ ﻛـﻪ ﺑﺎﻳـﺪ در ﻛـﺎدر ﻧﻤـﺎﻳﺶ دﻫـﺪ را ﻧﻴـﺰ درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪ .دﻛﻤـﻪ ﻫـﺎي ﻓﺮﻣـﺎن ﺑﺎﻳـﺪ از ﺷـﻤﺎرﻧﺪه ي MessageBoxButtonsو آﻳﻜﻮن ﺑﺎﻳﺪ از ﺷﻤﺎرﻧﺪه ي MessageBoxIconاﻧﺘﺨﺎب ﺷﻮد .در اﻳﻨﺠـﺎ ﻋـﻼوه ﺑـﺮ ﻣﺸﺨﺺ ﻛﺮدن ﻣﺘﻨﻬﺎﻳﻲ ﻛﻪ ﺑﺎﻳﺪ در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﺑﻪ وﻳﮋوال C#ﮔﻔﺘﻪ اﻳﻢ ﻛﻪ ﺑﻪ ﺟﺎي دﻛﻤﻪ ،OKدﻛﻤﻪ ﻫﺎي Yesو No را ﺑﻪ ﻫﻤﺮاه ﻳﻚ ﻋﻼﻣﺖ ﺳﻮال ﺑﺮ روي ﻛﺎدر ﻧﻤﺎﻳﺶ دﻫﺪ .ﺑﺮاي اﻳﻦ ﻛﻪ ﺑﻔﻬﻤﻴﻢ ﻛﺎرﺑﺮ ﻛﺪام ﮔﺰﻳﻨﻪ را اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ ،ﺑﺎﻳـﺪ از ﻧﺘﻴﺠـﻪ اي ﻛﻪ ﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﻳﻦ ﺗﺎﺑﻊ ﻧﺘﻴﺠﻪ ﺧﻮد را ﺑﻪ ﺻﻮرت ﺷﻴﺊ از ﻛﻼس DialogResultﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﺑﺘﺪا ﻣﺘﻐﻴﺮي از اﻳﻦ ﻛﻼس اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ ،ﺳﭙﺲ ﻧﺘﻴﺠﻪ ﺑﺮﮔﺮداﻧﺪه ﺷﺪه ﺗﻮﺳﻂ ﺗﺎﺑﻊ را در آن ﻗﺮار ﻣﻲ دﻫﻴﻢ. ﺣﺎل ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ دﻛﻤﻪ Yesرا ﻓﺸﺮده اﺳﺖ ﻳﺎ ﻧﻪ؟ ﺑﺮاي اﻳﻦ ﻛﺎر از دﺳﺘﻮر ifاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .اﮔﺮ ﻣﻘـﺪار ﻣﺘﻐﻴـﺮي ﻛﻪ از ﻧﻮع DialogResultﺗﻌﺮﻳﻒ ﻛﺮدﻳﻢ ﺑﺮاﺑﺮ ﺑﺎ DialogResult.Yesﺑﺎﺷﺪ ،ﺑﻪ اﻳﻦ ﻣﻌﻨـﻲ اﺳـﺖ ﻛـﻪ ﻛـﺎرﺑﺮ ﮔﺰﻳﻨﻪ Yesرا اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﻛﺎرﺑﺮ از ﺣﺬف ﻣﺸﺘﺮك ﻣﻨـﺼﺮف ﺷـﺪه اﺳـﺖ و ﮔﺰﻳﻨـﻪ Noرا اﻧﺘﺨـﺎب ﻛـﺮده اﺳﺖ.2 ﺑﺮاي ﺣﺬف ﻛﺎرﺑﺮ از ﻟﻴﺴﺖ ،ﻣﺘﻐﻴﺮي را از ﻧﻮع ﺳﺎﺧﺘﺎر Customerﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ و ﻣﺸﺘﺮﻛﻲ را ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ از ﻟﻴﺴﺖ ﺣـﺬف ﻛﻨﻴﻢ در آن ﻗﺮار ﻣﻲ دﻫﻴﻢ: // Get the customer to be deleted ;Customer objCustomerToDelete = SelectedCustomer ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ Removeﻛﻼس ArrayListﻣﻲ ﺗﻮاﻧﻴﻢ ﻣﺸﺘﺮك اﻧﺘﺨﺎب ﺷﺪه را از ﻟﻴﺴﺖ ﺣﺬف ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﻣﺘﻐﻴﺮي را ﻛﻪ در ﻣﺮﺣﻠﻪ ﻗﺒﻞ ،ﻣﺸﺘﺮك را در آن ذﺧﻴﺮه ﻛﺮدﻳﻢ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ ﻣﺘﺪ ﺑﻔﺮﺳﺘﻴﻢ: // Remove the customer from the ArrayList ;)objCustomers.Remove(objCustomerToDelete ﺑﺮاي ﺣﺬف ﻛﺎرﺑﺮ از ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻫﻢ ﺑﺎﻳﺪ از روﺷﻲ ﻣﺸﺎﺑﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: // Remove the customer from the ListBox ;)lstCustomers.Items.Remove(objCustomerToDelete
ﻧﻤﺎﻳﺶ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي:
1رﺟﻮع ﻛﻨﻴﺪ ﺑﻪ ﺑﺨﺶ ﻣﺮﺗﺐ ﺳﺎزي آراﻳﻪ ﻫﺎ در ﻫﻤﻴﻦ ﻓﺼﻞ 2در ﻓﺼﻞ ﻫﻔﺘﻢ در ﻣﻮرد اﺳﺘﻔﺎده از ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﺗﻔﺼﻴﻞ ﺑﺤﺚ ﺧﻮاﻫﻴﻢ ﻛﺮد.
٢٠٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﻛﺎﻣﻞ ﺷﺪن ﺑﺮﻧﺎﻣﻪ ،ﺑﺎﻳﺪ ﻳﻚ ﺳﺮي از ﻗﺎﺑﻠﻴﺖ ﻫﺎ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ ﺑﻬﺒﻮد ﭘﻴﺪا ﻛﻨﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﻛﺪ درون روﻳﺪاد SelectedIndexChangedﻣﺮﺑﻮط ﺑﻪ ListBoxرا ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ ﺧﻮاﻫﻴﺪ داد ﺗﺎ ﻫـﺮ ﺑﺎر ﻛﻪ ﻣﺸﺘﺮك ﺟﺪﻳﺪي را از ListBoxاﻧﺘﺨﺎب ﻛﻨﻴﺪ ،اﻃﻼﻋﺎت او ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﻣﺸﺘﺮك اﻧﺘﺨﺎب ﺷﺪه در ﺻﻔﺤﻪ (1در ﺑﺨــﺶ ﻃﺮاﺣــﻲ ﻓــﺮم ﺑــﺮ روي ﻟﻴــﺴﺖ ﺑــﺎﻛﺲ دو ﺑــﺎر ﻛﻠﻴــﻚ ﻛﻨﻴــﺪ .ﺑــﻪ اﻳــﻦ ﺗﺮﺗﻴــﺐ ﻣﺘــﺪ ﻣﺮﺑــﻮط ﺑــﻪ روﻳــﺪاد SelectedIndexChangedﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮد .ﻛﺪ ﻣﺸﺨﺺ ﺷـﺪه در زﻳـﺮ را ﺑـﻪ اﻳـﻦ ﻣﺘـﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: (private void lstCustomers_SelectedIndexChanged )object sender, EventArgs e { // Display the customer details ;)DisplayCustomer(SelectedCustomer } (2ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ي ﻓﺮﻣﺎن Testﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ آﻳﺘﻢ ﻫﺎي ﻣﻮرد ﻧﻴﺎز در ListBoxﻗـﺮار ﮔﻴﺮﻧـﺪ. ﺣﺎل اﮔﺮ ﺑﺮ روي ﻧﺎم ﻳﻜﻲ از ﻣﺸﺘﺮﻛﻴﻦ در ﻟﻴﺴﺖ ﺑﺎﻛﺲ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 18-5اﻃﻼﻋـﺎت او در ﻛﺎدرﻫـﺎي ﻣﺘﻨـﻲ روي ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ.
ﺷﻜﻞ 18-5
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٢٠١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ArrayListﻳﻜﻲ از اﻧﻮاع ﻛﻠﻜﺴﻴﻮن ﻫﺎي ﻣﻮﺟﻮد در .NETاﺳﺖ ﻛﻪ از آن اﺳﺘﻔﺎده زﻳﺎدي ﺷﺪه اﺳﺖ .ﻳﻚ ﻛﻠﻜـﺴﻴﻮن راﻫـﻲ اﺳﺖ ﺑﺮاي ﺳﺎﺧﺘﻦ راﺣﺖ ﮔﺮوه ﻫﺎﻳﻲ از ﻋﻨﺎﺻﺮ ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ .اﮔﺮ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ي Structure Demoﻧﮕـﺎﻫﻲ ﺑﻴﻨﺪازﻳـﺪ و ﻛـﺪ ﺗﺎﺑﻊ CreateCustomerرا ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ،ﻣﺘﻮﺟﻪ ﻣﻲ ﺷﻮﻳﺪ ﻛﻪ ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻣﺸﺘﺮك ﺑﻪ ﻟﻴـﺴﺖ ،ﻫﻤﺎﻧﻨـﺪ اﺿـﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻣﺸﺘﺮك ﺑﻪ ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ،از ﺗﺎﺑﻊ Addاﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﺪ. // Add the new customer to the list ;)objCustomers.Add(objNewCustomer // Add the new customer to the ListBox control ;)lstCustomers.Items.Add(objNewCustomer ﺑﺮاي ﺣﺬف ﻳﻚ ﻣﺸﺘﺮك ﻫﻢ )ﭼﻪ در ﻟﻴﺴﺖ ﺑﺎﻛﺲ و ﭼﻪ در ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي( از ﻣﺘﺪ Removeاﺳﺘﻔﺎده ﻛﺮدﻳﺪ: // Remove the customer from the ArrayList ;)objCustomers.Remove(objCustomerToDelete // Remove the customer from the ListBox ;)lstCustomers.Items.Remove(objCustomerToDelete ﭘﻴﺸﻨﻬﺎد ﻣﻲ ﺷﻮد ﻛﻪ ﻫﻨﮕﺎم ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻟﻴﺴﺘﻲ از ﻋﻨﺎﺻﺮ ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ را ﻧﮕﻬﺪاري ﻛﻨﻴﺪ ،از ﻛﻠﻜـﺴﻴﻮن ﻫـﺎ اﺳـﺘﻔﺎده ﻛﻨﻴﺪ .در زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ .NETو ﻫﻤﭽﻨﻴﻦ در ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس ،.NETﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺳﻌﻲ ﻛﺮده اﺳﺖ ﺗﻤﺎم ﻛﻠﻜﺴﻴﻮن ﻫﺎ ﺻﺮﻓﻨﻈﺮ از ﻧﻮع ﻣﻘﺪاري ﻛﻪ ﺑﺎﻳﺪ ذﺧﻴﺮه ﻛﻨﻨﺪ ،ﺑﻪ ﻳﻚ روش ﻛﺎر ﻛﻨﻨﺪ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﺟـﺎ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻋﻨﺼﺮي را ﺣﺬف ﻛﻨﻴﺪ از ﻣﺘﺪ Removeو اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻋﻨﺼﺮي را اﺿﺎﻓﻪ ﻛﻨﻴﺪ از ﻣﺘﺪ Addاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ،ﭼـﻪ در ﺣﺎل ﻛﺎر ﺑﺎ ﻳﻚ ArrayListﺑﺎﺷﻴﺪ ،ﭼﻪ در ﺣﺎل ﻛﺎر ﺑﺎ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در ﻳﻚ ﻟﻴﺴﺖ ﺑﺎﻛﺲ. اﻳﻦ ﺛﺒﺎت و ﻳﻜﺴﺎﻧﻲ در ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﺎ ﺑﺘﻮاﻧﺪ آﻣﻮﺧﺘﻪ ﻫـﺎي ﺧـﻮد را از ﻳـﻚ ﻣﻮﺿـﻮع ،ﺑـﺮاي ﻛـﺎر ﺑـﺎ ﻣﻮﺿﻮﻋﺎت ﻣﺸﺎﺑﻪ ﻧﻴﺰ ﺑﻪ ﻛﺎر ﺑﺒﺮد .ﭘﺲ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد ﺳﺎﺧﺘﺎرﻫﺎي داده اي ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ اﻳﻦ ﻗﻮاﻋﺪ را ﻧﻴﺰ رﻋﺎﻳﺖ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در ﺣﺎل اﻳﺠﺎد ﻳﻚ ﻛﻼس ﻫﻤﺎﻧﻨﺪ ﻛﻠﻜﺴﻴﻮن ﻫﺎ ﻫﺴﺘﻴﺪ و ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ ﻣﺘـﺪي ﺑـﺮاي ﺣـﺬف ﻋﻨﺎﺻﺮ در آن ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﺑﻬﺘﺮ اﺳﺖ ﻧﺎم آن را ﺑﺮاﺑﺮ ﺑﺎ Removeﻗﺮار دﻫﻴﺪ ،ﻧﻪ ﻋﺒﺎرﺗﻬﺎي ﻣﺸﺎﺑﻪ ﻣﺎﻧﻨﺪ Deleteو ﻳﺎ … .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺨﻮاﻫﺪ از ﻛﻼس ﺷﻤﺎ اﺳﺘﻔﺎده ﻛﻨﺪ ،ﻧﺎم Removeﺑﺮاي او آﺷﻨﺎ ﺧﻮاﻫﺪ ﺑﻮد و ﻣﻲ ﺗﻮاﻧﺪ ﻋﻤﻠﻜﺮد اﻳﻦ ﻣﺘـﺪ را ﺣﺪس ﺑﺰﻧﺪ.
اﻳﺠﺎد ﺟﺪاول ﻗﺎﺑﻞ ﺟﺴﺘﺠﻮ ﺑﺎ Hashtableﻫﺎ: ﺗﺎﻛﻨﻮن اﮔﺮ ﻣﻲ ﺧﻮاﺳﺘﻴﺪ ﻋﻨﺼﺮي را در ﻳﻚ آراﻳﻪ ﻳﺎ ﻳﻚ ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ﭘﻴﺪا ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ اﻧﺪﻳﺲ ﻋﺪد ﺻﺤﻴﺢ آن ﻋﻨﺼﺮ را ﻛﻪ ﻣﻌﺮف ﻣﻜﺎن ﻗﺮار ﮔﺮﻓﺘﻦ آن ﻋﻨﺼﺮ ﺑﻮد ﻣﺸﺨﺺ ﻣﻲ ﻛﺮدﻳﺪ .اﻣﺎ اﮔﺮ ﻣﻲ ﺧﻮاﺳﺘﻴﺪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ آن ﻋﻨﺼﺮ از ﻣﻘﺪار دﻳﮕﺮي ﺑﻪ ﺟﺰ اﻧﺪﻳﺲ اﺳـﺘﻔﺎده ﻛﻨﻴﺪ ،ﻧﻤﻲ ﺗﻮاﻧﺴﺘﻴﺪ اﻳﻦ روش را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ ﻣﻲ ﺧﻮاﺳـﺘﻴﺪ اﻃﻼﻋـﺎت ﻣـﺸﺘﺮﻛﻴﻦ را ﺑـﺮ اﺳـﺎس آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ آﻧﻬﺎ ﺑﺪﺳﺖ آورﻳﺪ. در اﻳﻦ ﻗﺴﻤﺖ ﻧﻮع ﺧﺎﺻﻲ از ﻛﻠﻜﺴﻴﻮن ﻫﺎ ﺑﻪ ﻧﺎم Hashtableرا ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ روﺷﻬﺎي ﺑﻬﺘﺮي را ﺑﺮاي ﺟﺴﺘﺠﻮ اراﺋﻪ ﻣﻲ دﻫﻨﺪ .اﻳﻦ ﻛﻠﻜﺴﻴﻮن ﻫﺎ ﺑﺮ اﺳﺎس ﻳﻚ ﻣﻘﺪار ﻛﻠﻴﺪي ﻛﻪ ﺑﺮاي آﻧﻬﺎ ﻣﺸﺨﺺ ﻣﻲ ﺷﻮد ،آراﻳﻪ را ﺟﺴﺘﺠﻮ ﻣﻲ ﻛﻨﻨﺪ.
٢٠٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده از :Hashtable Hashtableﻧﻮﻋﻲ ﻛﻠﻜﺴﻴﻮن اﺳﺖ ﻛﻪ ﻫﺮ ﻋﻨﺼﺮ آن داراي ﻳﻚ ﻛﻠﻴﺪ اﺳﺖ .ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻛﻠﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻣﻘﺪار ﻋﻨﺼﺮ در ﻛﻠﻜﺴﻴﻮن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ اﻃﻼﻋﺎت ﻣﺸﺘﺮﻛﻲ ﺑﺎ ﻧﺎم Darrelرا ﻛﻪ از ﻧـﻮع Customerاﺳـﺖ در ﻳﻚ Hashtableﻗﺮار ﻣﻲ دﻫﻴﺪ و ﻣﻘﺪار ﻛﻠﻴﺪي اﻳﻦ ﻋﻨﺼﺮ را ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ او ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت اﮔﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت اﻳﻦ ﻣﺸﺘﺮك آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ او را وارد ﻛﻨﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺮﻋﺖ او را در ﻟﻴـﺴﺖ ﭘﻴـﺪا ﻛﻨﻴﺪ. ﻫﻨﮕـــﺎﻣﻲ ﻛـــﻪ دو ﻋﻨـــﺼﺮ ﻛﻠﻴـــﺪ و ﻣﻘـــﺪار را ﺑـــﻪ Hashtableاﺿـــﺎﻓﻪ ﻣـــﻲ ﻛﻨﻴـــﺪ ،ﻋﻨـــﺼﺮ ﻛﻠﻴـــﺪ ﺗـــﺎﺑﻌﻲ ﺑـــﻪ ﻧـــﺎم )( System.Object.GetHashCodeرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﻣﻨﺤﺼﺮ ﺑﻪ ﻓـﺮد را ﺑـﺮاي ﻛﻠﻴﺪ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺷﻨﺎﺳﻪ ي آن اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .اﻳﻦ ﻋﺪد ﺑﻪ ﺻﻮرﺗﻲ اﺳﺖ ﻛﻪ اﮔﺮ ﭼﻨﺪ ﺑﺎر دﻳﮕﺮ ﻫﻢ ﺗﺎﺑﻊ ﺑﺮاي اﻳﻦ ﻋﻨﺼﺮ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد ﻋﺪد ﻳﻜﺴﺎﻧﻲ ﺑﺮﻣﻲ ﮔﺮدد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻋﻨـﺼﺮي در ﻳـﻚ Hashtableدﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛﻨﻴﺪ ،ﻛﻠﻴﺪ آن ﻋﻨﺼﺮ از ﺷﻤﺎ ﮔﺮﻓﺘﻪ ﺷﺪه و ﺗﺎﺑﻊ GetHashCodeﻣﺮﺑﻮط ﺑﻪ آن ﻛﻠﻴﺪ اﺟﺮا ﻣﻲ ﺷﻮد .ﺷﻨﺎﺳﻪ اي ﻛﻪ ﺑـﻪ وﺳـﻴﻠﻪ ي اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ دﺳﺖ ﻣﻲ آﻳﺪ ﺑﺎ ﺗﻤﺎم ﺷﻨﺎﺳﻪ ﻫﺎي ﻣﻮﺟﻮد در Hashtableﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮد .اﮔﺮ آن ﺷﻨﺎﺳﻪ در ﻟﻴـﺴﺖ وﺟـﻮد داﺷـﺘﻪ ﺑﺎﺷﺪ ،ﻣﻘﺪار ﻣﺮﺗﺒﻂ ﺑﻪ آن ﻛﻠﻴﺪ ﺑﺮﻣﻲ ﮔﺮدد. ﺟﺴﺘﺠﻮ در ﻳﻚ Hashtableﺑﺴﻴﺎر ﺳﺮﻳﻊ اﻧﺠﺎم ﻣﻲ ﺷﻮد .زﻳﺮا ﺻﺮﻓﻨﻈﺮ از ﻧﻮع ﻋﻨﺼﺮي ﻛﻪ در اﻳﻦ ﺟﺪول ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﺪ ،ﻳـﻚ ﻋﺪد ﺻﺤﻴﺢ ﻛﻮﭼﻚ ﺑﻪ ﻋﻨﻮان ﺷﻨﺎﺳﻪ ﻋﻨﺼﺮ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻧﺤـﻮه اﺳـﺘﻔﺎده از Hashtableﻫـﺎ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد. ﻧﻜﺘﻪ :ﻋﺪد ﺻﺤﻴﺤﻲ ﻛﻪ ﺑﺮاي ذﺧﻴﺮه ﺷﻨﺎﺳﻪ ي ﻳﻚ ﻛﻠﻴﺪ در Hashtableﺑﻪ ﻛﺎر ﻣﻲ رود ﻓﻘﻂ 4ﺑﺎﻳﺖ از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣـﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ رﺷﺘﻪ اي ﺷﺎﻣﻞ 100ﻛﺎراﻛﺘﺮ را ﻛﻪ 200ﺑﺎﻳﺖ ﻓﻀﺎ اﺷﻐﺎل ﻣﻲ ﻛﻨﺪ ﺑﻪ ﻋﻨﻮان ﻛﻠﻴﺪ در ﻧﻈﺮ ﺑﮕﻴﺮﻳـﺪ ،ﺑـﺮاي ﺟـﺴﺘﺠﻮ در ﺟﺪول ﻓﻘﻂ اﻋﺪاد 4ﺑﺎﻳﺘﻲ ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﻣﻲ ﺷﻮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از Hashtableﻫﺎ (1وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي ﻓﺮم ﺑﺎز ﻛﺮده و ﺗﻐﻴﻴﺮ زﻳﺮ را در ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ objCustomersاﻳﺠﺎد ﻛﻨﻴﺪ: public partial class Form1 : Form { // Form level members ;)(private Hashtable objCustomers = new Hashtable (2ﺑﻪ ﻗﺴﻤﺖ ﻛﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ CreateCustomerﺑﺮوﻳﺪ و ﻛﺪﻫﺎي آن را ﺑﻪ ﺻﻮرت ﻣـﺸﺨﺺ ﺷـﺪه در زﻳـﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: public void CreateCustomer(string FirstName, string )LastName, string Email
٢٠٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ // Declare a customer object Customer objNewCustomer; // Create the new customer objNewCustomer.FirstName = FirstName; objNewCustomer.LastName = LastName; objNewCustomer.Email = Email; // Add the new customer to the list objCustomers.Add(Email.ToLower(),objNewCustomer); // Add the new customer to the ListBox control lstCustomers.Items.Add(objNewCustomer); : ﺑﺮوﻳﺪ و ﺗﻐﻴﺮات ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در آن اﻳﺠﺎد ﻛﻨﻴﺪbtnDelete_Click ( ﺑﻪ ﺑﺨﺶ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻣﺘﺪ3 // Prompt the user to delete the selected customer DialogResult result = MessageBox.Show( "Are you sure you want to delete " + SelectedCustomer.Name + "? ", "Structure Demo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { // Get the customer to be deleted Customer objCustomerToDelete = SelectedCustomer; // Remove the customer from the ArrayList objCustomers.Remove(txtEmail.Text.ToLower()); // Remove the customer from the ListBox lstCustomers.Items.Remove(objCustomerToDelete); } اﻳﻦ ﻛﻨﺘﺮل را ﺑﺮاﺑﺮName ﺧﺎﺻﻴﺖ. ﺟﺪﻳﺪي را ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪButton ( ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﻛﻨﺘﺮل4 ﻓﺮم ﺷﻤﺎ در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ. ﻗﺮار دﻫﻴﺪLookup آن را ﺑﺮاﺑﺮ ﺑﺎText و ﺧﺎﺻﻴﺖbtnLookup ﺑﺎ . ﺑﺎﺷﺪ19-5
٢٠٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
19-5 ﺷﻜﻞ ﺳﭙﺲ ﻛﺪﻫﺎي زﻳـﺮ را. آن اﻳﺠﺎد ﺷﻮدClick دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪادLookup ( ﺑﺮ روي دﻛﻤﻪ ي5 :ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ private void btnLookup_Click(object sender, EventArgs e) { // If the customer found in the Hashtable if (objCustomers.Contains(txtEmail.Text.ToLower()) == true) // Display the customer name MessageBox.Show("The customer name is: " + ((Customer)objCustomers[txtEmail.Text.ToLower()]).Name , "Structure Demo"); else //Display an error MessageBox.Show("There is no custome rwith the " + "email address: " + txtEmail.Text, "Structure Demo"); } اﮔـﺮ ﻳـﻚ آدرس ﭘـﺴﺖ. ﻛﻠﻴﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻟﻴـﺴﺖ از ﻧـﺎم ﻣـﺸﺘﺮﻛﻴﻦ ﭘـﺮ ﺷـﻮدTest ( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ6 ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﻛـﺎدرLookup وارد ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤـﻪEmail اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻛﻪ در ﻟﻴﺴﺖ وﺟﻮد ﻧﺪارد را در ﺑﺨﺶ . ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد20-5 ﭘﻴﻐﺎﻣﻲ را ﻣﺸﺎﺑﻪ ﺷﻜﻞ
٢٠٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 20-5 (7اﮔﺮ ﻳﻚ آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻛﻪ در ﻟﻴﺴﺖ وﺟﻮد دارد ،ﺑـﺮاي ﻣﺜـﺎل dhilton@somecompany.com را در ﻗﺴﻤﺖ Emailوارد ﻛﻨﻴﺪ و دﻛﻤﻪ Lookupرا ﻓﺸﺎر دﻫﻴﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛـﻪ ﻧـﺎم ﻓـﺮد در ﻛـﺎدر ﭘﻴﻐـﺎم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي اﻳﺠﺎد ﻳﻚ ،HashTableﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ objCustomersرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ: // Form level members ;)(private Hashtable objCustomers = new Hashtable ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻧﻮع داده اي ﻣﺘﻐﻴﺮ ،objCustomersاز ﻧﻮع HashTableﺧﻮاﻫـﺪ ﺑـﻮد و ﻋﻨﺎﺻـﺮ اﻳﺠـﺎد ﺷـﺪه در ﻣﺘـﺪ CreateCustomerﺑﻪ ﺟﺎي ذﺧﻴﺮه ﺷﺪن در ArrayListدر ﻳﻚ HashTableذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪ. ﺑﺮ ﺧﻼف ﻣﺘﺪﻫﺎي Addﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻣﺘﺪ Addﻣﺮﺑﻮط ﺑﻪ HashTableدو ﭘﺎراﻣﺘﺮ درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨﺪ .اوﻟﻴﻦ ﭘﺎراﻣﺘﺮ ﻋﻨﺼﺮ ﻛﻠﻴﺪ اﺳﺖ ،ﻛﻪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﺑﻪ ﻋﻨﻮان ﻛﻠﻴﺪ اﺳﺘﻔﺎده ﻛـﺮده اﻳـﻢ .در اﺿـﺎﻓﻪ ﻛـﺮدن ﻳﻚ آﻳﺘﻢ ﺑﻪ HashTableاز ﻫﺮ ﻋﻨﺼﺮي ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻋﻨﻮان ﻛﻠﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻓﻘﻂ ﺑﺎﻳﺪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﻳﻦ ﻋﻨﺼﺮ ﺑﺎﻳﺪ در آراﻳﻪ ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد ﺑﺎﺷﺪ و ﻧﻤﻲ ﺗﻮاﻧﻴﺪ از ﻳﻚ ﻋﻨﺼﺮ ﺑﻪ ﻋﻨﻮان ﻛﻠﻴﺪ دو آﻳـﺘﻢ در HashTableاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .در ﻏﻴـﺮ اﻳـﻦ ﺻﻮرت ﺑﺮﻧﺎﻣﻪ ﻫﻨﮕﺎم اﺟﺮا ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﺷﺪه و ﺑﺴﺘﻪ ﻣﻲ ﺷﻮد .ﭘﺎراﻣﺘﺮ دوم اﻳﻦ ﻣﺘﺪ ،آﻳﺘﻤﻲ اﺳﺖ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻫﻤﺮاه ﺑﺎ اﻳـﻦ ﻛﻠﻴـﺪ در HashTableﻗﺮار دﻫﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﺮ ﺑﺎر ﻛﻪ اﻳﻦ ﻛﻠﻴﺪ را ﺑﻪ HashTableﺑﺪﻫﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ اﻳـﻦ آﻳـﺘﻢ دﺳﺘﺮﺳـﻲ ﭘﻴﺪا ﻛﻨﻴﺪ. // Add the new customer to the list ;)objCustomers.Add(Email.ToLower(),objNewCustomer
٢٠٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﺣﺬف ﻳﻚ آﻳﺘﻢ از HashTableﺑﺎﻳﺪ ﻛﻠﻴﺪ آن را ﻛﻪ ﻫﻤﺎن آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ اﺳﺖ ﻣﺸﺨﺺ ﻛﻨﻴﺪ. // Remove the customer from the ArrayList ;))(objCustomers.Remove(txtEmail.Text.ToLower ﻧﻜﺘﻪ :ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از ﺣﺴﺎﺳﻴﺖ ﻧﺴﺒﺖ ﺑﻪ ﻧﻮع ﺣﺮوف ﻫﻨﮕﺎم اﺿﺎﻓﻪ و ﻳﺎ ﺣﺬف ﻛﺮدن ﻳﻚ آﻳﺘﻢ ﺑـﻪ ،HashTableاﺑﺘـﺪا ﺗﻤـﺎم ﺣﺮوف آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ را ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ToLowerﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﻴﻢ ،ﺳﭙﺲ رﺷﺘﻪ ﺟﺪﻳﺪ را ﺑﻪ ﻋﻨﻮان ﻛﻠﻴﺪ آراﻳﻪ در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ. ﺣﺎل ﻣﻲ ﺧﻮاﻫﻴﻢ در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ btnLookupﻛﺪي ﻗﺮار دﻫﻴﻢ ﻛـﻪ ﻛـﺎرﺑﺮ ﺑﺘﻮاﻧـﺪ ﺑـﺎ وارد ﻛـﺮدن آدرس ﭘـﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ،ﻧﺎم ﻣﺸﺘﺮك را ﻣﺸﺎﻫﺪه ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﺑﺎ اﺳﺘﻔﺎده از آدرس وارد ﺷـﺪه در HashTableﺑـﻪ دﻧﺒـﺎل ﻣـﺸﺘﺮك ﺑﮕﺮدﻳﻢ .ﺑﺮاي اﻃﻼع از اﻳﻨﻜﻪ آﻳﺎ آﻳﺘﻢ ﻣﻮرد ﻧﻈﺮ ﻣﺎ در HashTableوﺟﻮد دارد ﻳـﺎ ﻧـﻪ ،ﺑﺎﻳـﺪ از ﺗـﺎﺑﻊ Containsاﺳـﺘﻔﺎده ﻛﻨﻴﻢ .اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﻛﻠﻴﺪ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﻣﻲ ﮔﻴﺮد و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺘﻤﻲ ﺑﺎ ﻛﻠﻴﺪ داده ﺷﺪه در ﻟﻴﺴﺖ وﺟﻮد دارد ﻳﺎ ﻧـﻪ؟ اﮔـﺮ ﻣﻘﺪار ﺑﺮﮔﺮداﻧﺪه ﺷﺪه ﺗﻮﺳﻂ اﻳﻦ ﺗﺎﺑﻊ ﺑﺮاﺑﺮ ﺑﺎ trueﺑﻮد ،ﻳﻌﻨﻲ آﻳﺘﻢ در ﻟﻴﺴﺖ وﺟﻮد دارد. // If the customer found in the Hashtable == ))(if (objCustomers.Contains(txtEmail.Text.ToLower )true ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ آﻳﺘﻢ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻫﻤﺎﻧﻨﺪ دﺳﺘﺮﺳﻲ ﺑﻪ ﻋﻨﺎﺻﺮ در ﻳﻚ آراﻳﻪ ﻋﻤﻞ ﻛﻨﻴﻢ و ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻳـﻚ ﻋـﺪد ﺻـﺤﻴﺢ ،از ﻛﻠﻴﺪ ﻛﻪ در اﻳﻨﺠﺎ ﻫﻤﺎن آدرس ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ اﺳﺖ ﺑﻪ ﻋﻨﻮان اﻧﺪﻳﺲ اﺳﺘﻔﺎده ﻛﻨﻴﻢ: // Display the customer name MessageBox.Show("The customer name is: " + ((Customer)objCustomers[txtEmail.Text.ToLower()]).Name, ;)""Structure Demo ﺗﻤﺎم آﻳﺘﻢ ﻫﺎ ﻗﺒﻞ از اﻳﻦ ﻛﻪ در HashTableذﺧﻴﺮه ﺷﻮﻧﺪ ،ﺑﻪ ﺷﻴﺊ از ﻛﻼس Objectﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻌﺪ از اﻳﻦ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻠﻴﺪ ،ﻣﻜﺎن آﻧﻬﺎ را در آراﻳﻪ ﭘﻴﺪا ﻛﺮدﻳﻢ ،ﻗﺒﻞ از اﺳﺘﻔﺎده ﺑﺎﻳﺪ آﻧﻬﺎ را ﺑﻪ ﻧﻮع داده اي اﺻﻠﻲ ﺧﻮد ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺒﻞ ﮔﻔﺘﻢ 1ﺑﺮاي اﻳﻨﻜﻪ ﻳﻚ ﻣﺘﻐﻴﺮ را ﺑﻪ ﻧﻮع داده اي دﻳﮕﺮي ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ ﺑﺎﻳﺪ از ﻋﻤﻠﮕﺮ )( اﺳﺘﻔﺎده ﻛﻨـﻴﻢ .در اﻳـﻦ ﻗـﺴﻤﺖ ﺑـﺮاي ﺗﺒﺪﻳﻞ آﻳﺘﻢ ذﺧﻴﺮه ﺷﺪه در HashTableاز ﻧﻮع Objectﺑﻪ ﻧﻮع Customerﺑﻪ ﺻﻮرت زﻳﺮ ﻋﻤﻞ ﻣﻲ ﻛﻨﻴﻢ: ])((Customer)objCustomers[txtEmail.Text.ToLower ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ Nameﻧﺎم ﻣﺮﺑﻮط ﺑﻪ ﻣﺸﺘﺮك را در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ دﻫﻴﻢ.
1رﺟﻮع ﻛﻨﻴﺪ ﺑﻪ ﺑﺨﺶ ﺗﺒﺪﻳﻞ ﻧﻮﻋﻬﺎي داده اي
٢٠٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺟﻠﻮﮔﻴﺮي از وارد ﺷﺪن ﻋﻨﺎﺻﺮ ﺗﻜﺮاري: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ از ﻳﻚ ﻛﻠﻴﺪ ﻧﻤﻲ ﺗﻮان دو ﺑﺎر در ﻳﻚ HashTableاﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﻛﺎر ﺑﺎﻋﺚ ﺑـﻪ وﺟـﻮد آﻣـﺪن ﺧﻄـﺎ در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﺎﻳﺪ ﻗﺒﻞ از اﻳﻨﻜﻪ ﻋﻨﺼﺮي را ﺑﻪ ﻳﻚ HashTableاﺿﺎﻓﻪ ﻛﻨﻴﻢ ،از ﻣﻨﺤﺼﺮ ﺑـﻪ ﻓـﺮد ﺑﻮدن آن ﻣﻄﻤﺌﻦ ﺷﻮﻳﻢ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﭼﮕﻮﻧﮕﻲ ﺟﻠﻮﮔﻴﺮي از اﻳﻦ ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ را ﺧﻮاﻫﻴﺪ دﻳﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺟﻠﻮﮔﻴﺮي از وارد ﺷﺪن ﻋﻨﺎﺻﺮ ﺗﻜﺮاري (1ﺑﺮاي ﻣﺸﺎﻫﺪه اﻳﻦ ﻛﻪ در ﺻﻮرت وارد ﻛﺮدن ﻛﻠﻴﺪ ﺗﻜﺮاري ﺑﻪ ،HashTableﭼﮕﻮﻧﻪ ﺧﻄﺎ اﻳﺠﺎد ﻣﻲ ﺷﻮد ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و روي دﻛﻤﻪ ي Testﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻟﻴﺴﺖ ﻣﺸﺘﺮﻛﻴﻦ ﭘﺮ ﺷﻮد .ﺣﺎل ﻣﺠﺪدا ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Testﻛﻠﻴـﻚ ﻛﻨﻴﺪ .ﭘﻨﺠﺮه ﺧﻄﺎﻳﻲ را ﻣﺸﺎﺑﻪ ﺷﻜﻞ 21-5ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 21-5 (2ﺑﺮ روي دﻛﻤﻪ ي Stop Debuggingدر ﻧﻮار اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻣﺘﻮﻗـﻒ ﺷﻮد. (3وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﺑﻪ ﻣﺤﻞ ﻣﺘﺪ CreateCustomerﺑﺮوﻳﺪ .ﻛـﺪ زﻳـﺮ را ﺑـﻪ اﻳـﻦ ﻣﺘـﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ ﻫﺮ ﺑﺎر ﻗﺒﻞ از اﻳﻨﻜﻪ ﻣﺸﺘﺮك ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﺷﻮد از ﻋﺪم وﺟﻮد آن در ﻟﻴﺴﺖ ﻣﻄﻤﺌﻦ ﺷﻮﻳﻢ: public void CreateCustomer(string FirstName, )string LastName, string Email { // Declare a customer object ;Customer objNewCustomer // Create the new customer ;objNewCustomer.FirstName = FirstName
٢٠٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
objNewCustomer.LastName = LastName; objNewCustomer.Email = Email; // Check if the customer isn't currently in the list if (objCustomers.Contains(Email.ToLower()) == false) { // Add the new customer to the list objCustomers.Add(Email.ToLower(), objNewCustomer); // Add the new customer to the ListBox control lstCustomers.Items.Add(objNewCustomer); } else { MessageBox.Show("The customer: " + FirstName + " + LastName + " is currently in the list! ", "Structure Demo");
" } }
. ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻟﻴﺴﺖ ﻣﺸﺘﺮﻛﻴﻦ ﻛﺎﻣﻞ ﺷﻮدTest ( ﻣﺠﺪدا ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ي4 ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻣﺸﺘﺮﻛﻲ را ﺑـﺮاي ﺑـﺎر دوم ﺑـﻪ. ﻛﻠﻴﻚ ﻛﻨﻴﺪTest ( ﺣﺎل دوﺑﺎره روي دﻛﻤﻪ ي5 در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﻛﻪ ﻣﺸﺘﺮك ﻫﻢ اﻛﻨﻮن در ﻟﻴﺴﺖ وﺟـﻮد دارد و ﻧﻤـﻲ ﺗﻮاﻧﻴـﺪ آن را،ﻟﻴﺴﺖ وارد ﻛﻨﻴﺪ .ﻣﺠﺪدا ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻛﻨﻴﺪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ زﻳـﺮا در. دﻟﻴﻞ آن ﻧﻴﺰ ﻣﺸﺨﺺ اﺳـﺖ.ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﺮاي ﺑﺎر دوم ﻛﻪ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻣﻲ ﻛﻨﻴﺪ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﻧﻤﻲ ﺷﻮﻳﺪ در اﻳﻦ ﺻﻮرت اﮔﺮ ﻛﻠﻴﺪ.اﺟﺮاي دوم ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ در ﺻﻮرﺗﻲ ﻳﻚ آﻳﺘﻢ ﺑﻪ ﻟﻴﺴﺖ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﻠﻴﺪ آن در ﺟﺪول وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ را ﺑﺮﮔﺮداﻧﺪه و ﺑﺮﻧﺎﻣﻪ آﻳﺘﻢ را ﺑﻪ ﻟﻴـﺴﺖ اﺿـﺎﻓﻪ ﻣـﻲfalse ﺗﺎﺑﻊ ﻣﻘﺪار، ﺑﻔﺮﺳﺘﻴﻢContains آﻳﺘﻢ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ ﺗﺎﺑﻊ :ﻛﻨﺪ // Check if the customer isn't currently in the list if (objCustomers.Contains(Email.ToLower()) == false) { // Add the new customer to the list objCustomers.Add(Email.ToLower(), objNewCustomer); // Add the new customer to the ListBox control lstCustomers.Items.Add(objNewCustomer); }
٢٠٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ ﺗﺎﺑﻊ Containsﻣﻘﺪار trueرا ﺑﺮﮔﺮداﻧﺪ ،ﻣﻲ ﺗﻮان ﻧﺘﻴﺠﻪ ﮔﺮﻓﺖ ﻛﻪ آﻳﺘﻢ در ﻟﻴﺴﺖ وﺟﻮد داﺷﺘﻪ اﺳﺖ .ﭘﺲ ﺑﺎ ﻧﻤﺎﻳﺶ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم اﻳﻦ ﻣﻮرد را ﺑﻪ اﻃﻼع ﻛﺎرﺑﺮ ﻣﻲ رﺳﺎﻧﻴﻢ و از ﺗﺎﺑﻊ ﺧﺎرج ﻣﻲ ﺷﻮﻳﻢ. else { " MessageBox.Show("The customer: " + FirstName + + LastName + " is currently in the list! ", ;)""Structure Demo
" }
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ روﺷﻬﺎﻳﻲ را ﺑﺮاي ﻣﺪﻳﺮﻳﺖ و ﻧﮕﻬﺪاري ﮔﺮوه ﻫﺎي ﭘﻴﭽﻴﺪه داده اي ﻓﺮا ﮔﺮﻓﺘﻴﻢ .ﻓﺼﻞ را ﺑﺎ آﻣـﻮﺧﺘﻦ ﻣﻔـﺎﻫﻴﻢ آراﻳـﻪ ﺷـﺮوع ﻛﺮده و ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﻣﺘﻐﻴﺮﻫﺎﻳﻲ را اﻳﺠﺎد ﻛﺮد ﻛﻪ ﺑﻴﺶ از ﻳﻚ ﻣﻘﺪار را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﻨﺪ. ﺳﭙﺲ ﺑﻪ ﺑﺮرﺳﻲ ﻣﻔﺎﻫﻴﻢ ﺷﻤﺎرﻧﺪه ﻫﺎ و ﺛﺎﺑﺖ ﻫﺎ ﭘﺮداﺧﺘﻴﻢ .دﻳﺪﻳﻢ ﻛﻪ ﭼﮕﻮﻧﻪ اﻳﻦ دو ﻗﺎﺑﻠﻴﺖ ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮﻧﺪ ﻛـﻪ ﻛـﺪﻫﺎي ﺧﻮاﻧـﺎﺗﺮي ﺑﻨﻮﻳﺴﻴﻢ .ﺑﺎ اﺳﺘﻔﺎده از ﺷﻤﺎرﻧﺪه ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻣﺘﻐﻴﺮﻫﺎي اﺑﺘﺪاﻳﻲ ،ﻧﻮع ﻫﺎي ﻗﺎﺑﻞ ﻓﻬﻢ ﺗﺮي را اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﻣـﺜﻼ ﺑـﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻛﺪ " "mode = 3ﻣﻲ ﺗﻮاﻧﻴﻢ از ﻛﺪ " "mode = MyMode.Menuاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺛﺎﺑﺖ ﻫـﺎ اﻳـﻦ اﺟﺎزه را ﻣﻲ دﻫﻨﺪ ﻛﻪ ﻳﻚ اﺳﻢ ﺧﺎص را ﺑﻪ ﻳﻚ ﻣﻘﺪار ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻛﺪ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ ﻧـﺴﺒﺖ دﻫـﻴﻢ و در ﻛـﺪ از اﺳـﻢ ﻣﺸﺨﺺ ﺷﺪه اﺳﺘﻔﺎده ﻛﻨﻴﻢ. ﺳﭙﺲ ﺳﺎﺧﺘﺎرﻫﺎ را ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ .دﻳﺪﻳﻢ ﻛﻪ ﺳﺎﺧﺘﺎرﻫﺎ ﻫﻤﺎﻧﻨﺪ ﻛﻼﺳﻬﺎ ﻫﺴﺘﻨﺪ و اﺟﺎزه ﻣﻲ دﻫﻨﺪ اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻓـﺮد ﻳـﺎ ﻣـﻮرد ﺧﺎص را در ﻳﻚ ﮔﺮوه ﻗﺮار دﻫﻴﻢ .ﺳﭙﺲ ﺑﺎ اﻧﻮاع ﻣﺨﺘﻠﻒ ﻛﻠﻜﺴﻴﻮن ﻫﺎ از ﻗﺒﻴﻞ ArrayListآﺷـﻨﺎ ﺷـﺪﻳﻢ در آﺧـﺮ ﻫـﻢ ﻛـﻼس HashTableو ﻓﻮاﻳﺪ آن را ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ و ﻣـﺸﺎﻫﺪه ﻛـﺮدﻳﻢ ﻛـﻪ ﭼﮕﻮﻧـﻪ ﻣـﻲ ﺗـﻮان ﺑـﺎ اﺳـﺘﻔﺎده از آن ﻛﻠﻜـﺴﻴﻮﻧﻲ ﻗـﻮﻳﺘﺮ از ArrayListﻫﺎ اﻳﺠﺎد ﻛﺮد. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﺗﻌﺮﻳﻒ آراﻳﻪ اي از ﻋﻨﺎﺻﺮ ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ ﺣﺮﻛﺖ در ﺑﻴﻦ ﻋﻨﺎﺻﺮ آراﻳﻪ و ﭘﻴﺪا ﻛﺮدن آﺧﺮﻳﻦ ﻋﻨﺼﺮ آن ﺗﻌﺮﻳﻒ ﻳﻚ ﺷﻤﺎرﻧﺪه ﺑﺎ اﺳﺘﻔﺎده از enum اﻳﺠﺎد و اﺳﺘﻔﺎده از ﺳﺎﺧﺘﺎرﻫﺎ ﺑﺮاي ﻧﮕﻬﺪاري داده ﻫﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ اﺳﺘﻔﺎده از ArrayListﺑﺮاي ﻧﮕﻬﺪاري اﻧﻮاع ﻣﺘﻐﻴﻴﺮ ﻫﺎ اﺳﺘﻔﺎده از ﻛﻠﻜﺴﻴﻮن ﻫﺎ ﺑﺮاي ﻧﮕﻬﺪاري و ﻣﺪﻳﺮﻳﺖ داده ﻫﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ
ﺗﻤﺮﻳﻦ:
٢١٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻤﺮﻳﻦ :1 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ وﻳﻨﺪوز اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ ﺷﺎﻣﻞ ﺳﻪ ﻛﻨﺘﺮل Buttonﺑﺎﺷﺪ .ﻳﻚ ﺷﻤﺎرﻧﺪه ﺷﺎﻣﻞ ﺳﻪ ﻧﺎم را ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ. ﺑﺮاي ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickﻫﺮ ﻳﻚ از دﻛﻤﻪ ﻫﺎ ﻛﺪي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻣﺤﺘﻮي ﻳﻜﻲ از ﻧﺎم ﻫﺎ و ﻣﻘﺪار ﻣﺘﻨﺎﻇﺮ آن را در ﺷﻤﺎرﻧﺪه ﻧﻤﺎﻳﺶ دﻫﺪ) .ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺪار ﻋﺪدي ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻫﺮ ﻳﻚ از آﻳﺘﻢ ﻫﺎي ﺷﻤﺎرﻧﺪه ،ﻧﻮع آن را ﺑﻪ ﻋﺪد ﺻﺤﻴﺢ ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ(
٢١١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﺷﺸﻢ :اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﭘﻴﺶ ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،در C#ﭘﻨﺠﺮه ﻫﺎ ﺑﻪ ﻧﺎم ﻓﺮم ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .در ﭘﻨﺞ ﻓﺼﻞ ﻗﺒﻠﻲ از اﻳﻦ ﻓﺮم ﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﺪ ،اﻣﺎ درك ﻛﺎﻣﻠﻲ از آن ﻧﺪاﺷﺘﻴﺪ و ﺑﻴﺸﺘﺮ ﺑﺮ روي ﻛﺪﻫﺎﻳﻲ ﻛﻪ درون آن ﻣﻲ ﻧﻮﺷـﺘﻴﺪ ﺗﻤﺮﻛـﺰ ﻣـﻲ ﻛﺮدﻳﺪ. در اﻳﻦ ﻓﺼﻞ ،ﺑﻴﺸﺘﺮ ﺑﺎ ﺟﺰﺋﻴﺎت ﻓﺮﻣﻬﺎي وﻳﻨﺪوزي آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ و ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑـﺎ اﺳـﺘﻔﺎده از ﻓﺮﻣﻬـﺎي وﻳﻨﺪوزي در وﻳﮋوال ،C#ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﺑﺎ اﻣﻜﺎﻧﺎت ﻛﺎﻣﻞ ﻧﻮﺷﺖ .در اﻳﻦ ﻓﺼﻞ ﺑﻪ ﺻﻮرت ﻛﻠﻲ ﺑﻪ ﺑﺮرﺳﻲ ﻣﺒﺎﺣﺚ زﻳﺮ ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ:
اﺿﺎﻓﻪ ﻛﺮدن ﺧﺼﻮﺻﻴﺎت ﺑﻴﺸﺘﺮ ﺑﻪ ﻓﺮم ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮﻟﻬﺎي TextBox ،Buttonو .RadioButton اﻳﺠﺎد ﻳﻚ ﻧﻮار اﺑﺰار ﺳﺎده ﻛﻪ داراي دﻛﻤﻪ ﻫﺎﻳﻲ ﺑﺮاي ﭘﺎﺳﺦ ﺑﻪ روﻳﺪادﻫﺎ ﺑﺎﺷﺪ. اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻛﻪ داراي ﺑﻴﺶ از ﻳﻚ ﻓﺮم ﺑﺎﺷﻨﺪ.
ﭘﺎﺳﺦ ﺑﻪ روﻳﺪادﻫﺎ: اﻳﺠﺎد ﻳﻚ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﻛﺎرﺑﺮ 1ﺑﺎ اﺳﺘﻔﺎده از ﻓﺮﻣﻬﺎي وﻳﻨﺪوزي ﺗﺎ ﺣﺪ زﻳﺎدي ﺑﻪ ﭘﺎﺳﺦ دادن ﺑﻪ روﻳﺪادﻫﺎ ﺑﺴﺘﮕﻲ دارد .ﺑـﻪ ﻫﻤـﻴﻦ ﻋﻠـﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺮاي وﻳﻨﺪوز ﻋﻤﻮﻣﺎً ﺑﻪ ﻋﻨﻮان ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ روﻳﺪاد ﮔﺮا ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒـﻞ ﻣـﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﻓﺮم ﺑﺎ اﺳﺘﻔﺎده از ﻣﺎوس ﻛﻨﺘﺮل ﻫﺎي ﻣﻮرد ﻧﻈﺮﺗـﺎن را ﺑـﺮ روي ﻳـﻚ ﻓـﺮم ﺧـﺎﻟﻲ ﻛـﻪ در ﺑﺨـﺶ Forms Designerاﺳﺖ ﻗﺮار ﻣﻲ دﻫﻴﺪ .ﻫﺮ ﻛﺪام از اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﺷﻤﺎ ﺑﮕﻮﻳﻨﺪ ﻛﻪ ﭼﻪ زﻣﺎﻧﻲ ﻳﻚ روﻳﺪاد اﺗﻔـﺎق ﻣـﻲ اﻓﺘـﺪ. ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎﻧﻲ ﻛﻪ ﺑﺮ روي ﻓﺮم ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ﻛﻠﻴﻚ ﻛﻨﻴﺪ آن دﻛﻤﻪ ،روﻳﺪاد ﻛﻠﻴﻚ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﻃﻼع ﻣﻲ دﻫﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ ﻓﺮﺻﺖ ﺑﻪ ﺷﻤﺎ داده ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺪﻫﺎﻳﻲ را در ﺑﺮﻧﺎﻣﻪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﺎ ﺑﺎ ﻛﻠﻴﻚ ﺷﺪن ﺑـﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن اﺟﺮا ﺷﻮﻧﺪ .ﻧﺤﻮه اﺳﺘﻔﺎده از اﻳﻦ ﻣﻮارد را در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ.
ﺗﻨﻈﻴﻢ ﻳﻚ روﻳﺪاد ﺑﺮاي ﻛﻨﺘﺮل :Button ﻳﻚ روش ﺧﻮب ﺑﺮاي ﺗﻮﺿﻴﺢ ﻣﻔﻬﻮم روﻳﺪاد ،اﻳﺠﺎد ﻳﻚ روﻳﺪاد ﺑﺮاي دﻛﻤﻪ ﻓﺮﻣﺎن اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻳﻚ روﻳﺪاد ﻛﻠﻴﻚ ﻛﻪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ آن ﻫﻨﮕﺎم ﻛﻠﻴﻚ ﺷﺪن ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن اﺟﺮا ﺷﻮد .در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي روﻳﺪادﻫﺎي زﻳﺎدي وﺟﻮد دارﻧﺪ ﻛﻪ ﻫـﺮ ﻳـﻚ در ﻣﻮاﻗـﻊ ﺧﺎﺻﻲ رخ ﻣﻲ دﻫﻨﺪ .ﺗﺎﻛﻨﻮن اﺳﺘﻔﺎده از روﻳﺪاد ﻛﻠﻴﻚ ﻣﺮﺑﻮط ﺑﻪ دﻛﻤﻪ ﻓﺮﻣـﺎن را در ﻋﻤـﻞ دﻳـﺪه اﻳـﺪ ..در ﺑﺨـﺶ اﻣﺘﺤـﺎن ﻛﻨﻴـﺪ ﺑﻌـﺪ، روﻳﺪادﻫﺎي ﺑﻴﺸﺘﺮي از ﻛﻨﺘﺮل دﻛﻤﻪ ﻓﺮﻣﺎن را ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻧﻜﺮدﻳﺪ ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از روﻳﺪادﻫﺎي دﻛﻤﻪ ﻓﺮﻣﺎن
1راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﻛﺎرﺑﺮ ﻳﺎ ،GUIﻣﺤﻴﻄﻲ اﺳﺖ ﻛﻪ در آن ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻳﺎ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ،ﺑﻪ آﻧﻬﺎ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ
٢١٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1وﻳﮋوال اﺳﺘﻮدﻳﻮ را اﺟﺮا ﻛﻨﻴﺪ و ﮔﺰﻳﻨﻪ … File New Projectرا از ﻣﻨﻮي وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه ،New Projectﮔﺰﻳﻨـﻪ Visual C#را از ﻗـﺴﻤﺖ Project Typesو ﮔﺰﻳﻨـﻪ Windows Applicationرا از ﻗــﺴﻤﺖ Templatesاﻧﺘﺨــﺎب ﻛﻨﻴــﺪ .در ﻗــﺴﻤﺖ ،Nameﻧــﺎم Hello World 2را وارد ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد. (2ﺑﺮ روي ﻓﺮم اﻳﺠﺎد ﺷـﺪه ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ و ﺳـﭙﺲ در ﭘﻨﺠـﺮه Propertiesﺧﺎﺻـﻴﺖ Textرا از Form1ﺑـﻪ Hello, World! 2.0ﺗﻐﻴﻴﺮ دﻫﻴﺪ. (3ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒـﻪ اﺑـﺰار ﻳـﻚ ﻛﻨﺘـﺮل Buttonﺑـﺮ روي ﻓـﺮم ﻗـﺮار داده ،ﺧﺎﺻـﻴﺖ Textآن را ﺑـﻪ Hello ! Worldو ﺧﺎﺻﻴﺖ Nameآن را ﺑﻪ btnSayHelloﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺳﭙﺲ اﻧﺪازه ﻓـﺮم و ﻛﻨﺘـﺮل Button را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 6-1ﺷﻮد.
ﺷﻜﻞ 1-6 (4ﺑﺮ روي ﻛﻨﺘﺮل Buttonﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ. )private void btnSayHello_Click(object sender, EventArgs e { // Display a MessageBox ;)MessageBox.Show("Hello World!", this.Text } (5در ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ،ﺑﻪ دو ﻛﺎدر ﺑﺎﻻي ﺻﻔﺤﻪ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .ﻛﺎدر ﺳﻤﺖ ﭼـﭗ ﻣﺮﺑـﻮط ﺑـﻪ ﻧﻤـﺎﻳﺶ ﻛﻼﺳـﻬﺎ اﺳـﺖ و ﻧـﺎم ﻛﻼﺳﻬﺎي ﺗﻌﺮﻳﻒ ﺷﺪه در اﻳﻦ ﻗﺴﻤﺖ ،در اﻳﻦ ﻛﺎدر ﻗﺮار ﻣﻲ ﮔﻴﺮد .در ﺣﺎﻟﺖ ﻋﺎدي ﻓﻘﻂ ﻳﻚ ﻛﻼس ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ اﺳﺖ در اﻳﻦ ﻗﺴﻤﺖ وﺟﻮد دارد .اﻣﺎ اﮔﺮ ﻛﻼﺳﻬﺎي دﻳﮕﺮي را در اﻳﻦ ﻗﺴﻤﺖ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،ﻧﺎم آﻧﻬﺎ ﻧﻴﺰ ﺑﻪ اﻳـﻦ ﻟﻴـﺴﺖ اﺿـﺎﻓﻪ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم TempClassدر ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﻛﻼس Form1در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ ﻣﺤﺘﻮﻳﺎت اﻳﻦ ﻛﺎدر ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 2-6ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻜﻞ 2-6 (6ﺑﻌﺪ از اﻳﻨﻜﻪ ﻳﻜﻲ از ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﺳﻤﺖ ﭼﭗ را اﻧﺘﺨﺎب ﻛﺮدﻳﺪ ،اﻋﻀﺎي آن ﻛﻼس ﻣﺎﻧﻨﺪ ﻣﺘﺪﻫﺎ ،ﺧﺎﺻﻴﺖ ﻫﺎ و ...در ﻟﻴﺴﺖ ﺳﻤﺖ راﺳﺖ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در ﻟﻴﺴﺖ ﺳﻤﺖ ﭼﭗ ،ﻛﻼس ﻣﺮﺑﻮط ﺑـﻪ ﻓـﺮم Form1را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،اﻋﻀﺎي آن ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 3-6ﺧﻮاﻫﻨﺪ ﺑﻮد .ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻟﻴﺴﺖ در زﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ:
٢١٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ﻣﺤﺘﻮﻳﺎت اﻳﻦ ﻟﻴﺴﺖ ﺑﺮ اﺳﺎس ﻧﺎم ﻛﻼﺳﻲ ﻛﻪ در ﺳﻤﺖ ﭼﭗ اﻧﺘﺨﺎب ﻣﻲ ﻛﻨﻴﺪ ﺗﻐﻴﻴـﺮ ﻣـﻲ ﻛﻨـﺪ .ﺑـﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻟﻴﺴﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻴﻦ اﻋﻀﺎي ﻣﻮﺟﻮد در ﻳﻚ ﻛﻼس ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮﻳﺪ .اﻟﺒﺘـﻪ وﻇﻴﻔـﻪ اﺻـﻠﻲ اﻳـﻦ ﻟﻴـﺴﺖ ﻧﻤﺎﻳﺶ ﺗﻤﺎم اﻋﻀﺎي ﻣﺮﺗﺒﻂ ﺑﺎ ﻛﻼﺳﻲ اﺳﺖ ﻛﻪ در ﻟﻴﺴﺖ ﺳﻤﺖ ﭼﭗ اﻧﺘﺨﺎب ﻛﺮده اﻳﺪ. در اﺑﺘﺪاي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻳﻚ دﻛﻤﻪ ﻓﺮﻣﺎن ﺑﻪ ﻧﺎم btnSayHelloﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮدﻳﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻟﻴﺴﺖ ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻓﺮم ﻣﺎ داراي ﻳﻚ ﻋﻀﻮ از ﻧـﻮع ﻛﻨﺘـﺮل Buttonﺑـﻪ ﻧـﺎم btnSayHello اﺳﺖ .ﺑﺎ اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ از ﻟﻴﺴﺖ ﺳﻤﺖ ﭼﭗ ،وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺷﻤﺎ را ﺑﻪ ﺧﻄﻲ از ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺑﺮد ﻛﻪ اﻳـﻦ ﻛﻨﺘـﺮل در آن ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ.
ﺷﻜﻞ 3-6 ﺑﻌــﺪ از اﻳﻨﻜــﻪ ﻛﻨﺘــﺮل Buttonرا ﺑــﻪ ﻓــﺮم اﺿــﺎﻓﻪ ﻛــﺮدﻳﻢ ،ﻣﺘــﺪي ﺑــﺮاي روﻳــﺪاد ﻛﻠﻴــﻚ آن ﺑــﻪ ﻧــﺎم btnSayHello_Clickاﻳﺠــﺎد ﻛــﺮدﻳﻢ .ﭘــﺲ ﻳﻜــﻲ دﻳﮕــﺮ از اﻋــﻀﺎي ﻓــﺮم ﻣــﺎ ﻧﻴــﺰ ﻣﺘــﺪي ﺑــﻪ ﻧــﺎم btnSayHello_Clickﺧﻮاﻫﺪ ﺑﻮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻟﻴﺴﺖ ﻣـﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ ،اﻳـﻦ ﻋـﻀﻮ از ﻛـﻼس Form1ﻧﻴﺰ در ﻟﻴﺴﺖ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺎ اﻧﺘﺨﺎب آن ﻣﻜﺎن ﻧﻤﺎ ﺑﻪ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻗـﺮار دارد ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد. ﻫﺮ ﻛﻼس داراي ﻣﺘﺪي ﻫﻤﻨﺎم ﺑﺎ ﻧﺎم ﻛﻼس اﺳﺖ .اﮔﺮ ﺑﻪ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﺳﻤﺖ راﺳﺖ دﻗﺖ ﻛﻨﻴﺪ ،ﻣﺘﺪي را ﺑﺎ ﻧﺎم Form1ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .اﻳﻦ ﻣﺘﺪ ﻛﻪ ﺑﻪ ﻧﺎم ﺳﺎزﻧﺪه ﻛﻼس ﻧﻴﺰ ﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮد ،ﺷﺎﻣﻞ ﻛﺪﻫﺎﻳﻲ اﺳﺖ ﻛﻪ در اﺑﺘﺪاي اﺟﺮاي ﻛﻼس ،ﺷﺮاﻳﻂ اوﻟﻴﻪ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻛﻼس را ﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺑﺨﻮاﻫﻴـﺪ ﻛـﺪي ﻫﻨﮕﺎم اﻳﺠﺎد ﺷﺪن ﻳﻚ ﺷﻴﺊ از ﻳﻚ ﻛﻼس اﺟﺮا ﺷﻮد ،ﺑﺎﻳﺪ آن را در اﻳﻦ ﻗﺴﻤﺖ ﻗﺮار دﻫﻴﺪ. ﻳﻜﻲ دﻳﮕﺮ از ﮔﺰﻳﻨﻪ ﻫﺎي اﻳﻦ ﻟﻴﺴﺖ ،ﮔﺰﻳﻨﻪ Disposeاﺳﺖ .ﻛﻼس ﺗﺸﻜﻴﻞ دﻫﻨـﺪه ﻓـﺮم داراي ﺗـﺎﺑﻌﻲ ﺑـﻪ ﻧـﺎم Disposeاﺳﺖ ﻛﻪ ﻣﻨﺎﺑﻊ ﮔﺮﻓﺘﻪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ﻛﻨﺘﺮﻟﻬﺎي ﻛﻼس را در ﭘﺎﻳﺎن اﺟﺮاي اﻳﻦ ﻓﺮم از ﺑﺮﻧﺎﻣـﻪ آزاد ﻣـﻲ ﻛﻨﺪ. ﻳﻜــــﻲ دﻳﮕــــﺮ از اﻋــــﻀﺎي ﻛــــﻼس Form1ﻛــــﻪ در ﻟﻴــــﺴﺖ ﻣــــﺸﺎﻫﺪه ﻣــــﻲ ﻛﻨﻴــــﺪ ،ﻣﺘــــﺪ InitializeComponentاﺳﺖ ﻛﻪ ﻣﺴﺌﻮل ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟـﻮد در ﻛـﻼس اﺳـﺖ. ﺑﺮاي ﻣﺜﺎل ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺗﻨﻈﻴﻢ ﻧﺎم ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻓﺮم ،ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺖ Textآﻧﻬﺎ و ﻳﺎ ﻫﺮ ﺗﻐﻴﻴﺮ دﻳﮕـﺮي ﻛـﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ Form Designerﺑﻪ وﺟﻮد ﻣﻲ آورﻳﺪ ،در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺗﺎ ﺣﺪ اﻣﻜﺎن ﻛﺪﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻣﺘـﺪ را ﺑـﻪ ﺻـﻮرت دﺳـﺘﻲ ﺗﻐﻴﻴـﺮ ﻧﺪﻫﻴﺪ و از ﺑﺨﺶ Form Designerﺑﺮاي ﺗﻐﻴﻴﺮ ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ وﻳﮋوال 2005 C#آﻳﻜﻮن ﻛﻮﭼﻜﻲ را در ﺳﻤﺖ ﭼﭗ ﻫﺮ ﻳﻚ از ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟـﻮد در ﻟﻴﺴﺖ ﻗﺮار ﻣﻲ دﻫﺪ .ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ آﻳﻜﻮﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﻮع آﻧﻬﺎ را ﺗﺸﺨﻴﺺ دﻫﻴﺪ .ﺑﺮاي ﻣﺜﺎل ،ﻳـﻚ ﺟﻌﺒـﻪ ي ﺻـﻮرﺗﻲ
٢١٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
رﻧﮓ ﻛﻮﭼﻚ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻳﻚ ﻣﺘﺪ اﺳﺖ ،ﻳﻚ ﺟﻌﺒﻪ آﺑﻲ رﻧﮓ ﻛﻮﭼﻚ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻳﻚ ﻋﻀﻮ از ﻛﻼس اﺳـﺖ و .... ﻧﻜﺘﻪ :در ﻛﻨﺎر اﻳﻦ آﻳﻜﻮﻧﻬﺎ ﻛﻪ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻧﻮع ﻋﻀﻮﻫﺎي ﻳﻚ ﻛﻼس ﺑﻪ ﻛﺎر ﻣﻲ رود ،آﻳﻜﻮﻧﻬﺎي ﻛﻮﭼـﻚ دﻳﮕـﺮي ﻧﻴـﺰ ﻗـﺮار دارﻧﺪ ﻛﻪ ﻧﻮع ﺗﻌﺮﻳﻒ ﺷﺪن آن ﻋﻀﻮ از ﻛﻼس را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ،ﻛﻠﻴﺪ زرد رﻧﮓ ﻛﻮﭼﻚ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ آن ﻋﻀﻮ از ﻧﻮع Protectedاﺳﺖ ،و ﻳﺎ ﻗﻔﻞ ﺧﺎﻛﺴﺘﺮي رﻧﮓ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻋﻀﻮ از ﻧﻮع privateﺗﻌﺮﻳﻒ ﺷـﺪه اﺳـﺖ .در ﻣﻮرد ﻣﻔﻬﻮم اﻳﻦ ﻛﻠﻤﺎت در ﻓﺼﻠﻬﺎي ﺑﻌﺪ ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. (7ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮاي Form1ﺑﺮﮔﺮدﻳﺪ و دﻛﻤﻪ ﻓﺮﻣﺎن btnSayHelloرا در ﻓﺮم اﻧﺘﺨﺎب ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه Propertiesﺑﺮ روي آﻳﻜﻮن زرد رﻧﮓ ﺑﺎﻻي ﭘﻨﺠﺮه ﻳﻌﻨﻲ آﻳﻜﻮن Eventsﻛﻠﻴﻚ ﻛﻨﻴﺪ )ﺷﻜﻞ .(4-6ﺑﻪ اﻳـﻦ ﺗﺮﺗﻴﺐ ﻟﻴﺴﺘﻲ ﻃﻮﻻﻧﻲ از ﻣﺘﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل دﻛﻤﻪ ﻓﺮﻣﺎن را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
٢١٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 4-6 ﻳﻜﻲ از اﻳﻦ روﻳﺪاد ﻫﺎ ،روﻳﺪاد ﻛﻠﻴﻚ اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﭘﺮرﻧﮓ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ .ﻋﻠﺖ اﻳﻦ ﺗﻔﺎوت در اﻳﻦ اﺳـﺖ ﻛـﻪ ﺷﻤﺎ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺮاي روﻳﺪاد ﻛﻠﻴﻚ اﻳﻦ ﻛﻨﺘﺮل ،ﻳﻚ ﻣﺘﺪ را ﻣﺸﺨﺺ ﻛﺮده اﻳﺪ .اﮔﺮ ﺑﺮ روي روﻳﺪاد ﻛﻠﻴﻚ در اﻳﻦ ﻗـﺴﻤﺖ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﺑﻪ ﺑﺨﺶ ﺗﻌﺮﻳﻒ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ روﻳﺪاد در ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺧﻮاﻫﻴﺪ رﻓﺖ. (8ﺣــﺎل روﻳــﺪاد دﻳﮕــﺮي را ﺑــﺮاي ﻛﻨﺘــﺮل Buttonﺗﻌﺮﻳــﻒ ﻣــﻲ ﻛﻨــﻴﻢ .از ﻟﻴــﺴﺖ ﻧﻤــﺎﻳﺶ داده ﺷــﺪه در ﭘﻨﺠــﺮه Propertiesﮔﺰﻳﻨﻪ MouseEnterرا ﭘﻴﺪا ﻛﺮده و ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴـﺪ .روﻳـﺪاد ﺟﺪﻳـﺪي ﺑـﺮاي ﻛﻨﺘﺮل Buttonاﻳﺠﺎد ﻣﻲ ﺷﻮد .ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳﻦ روﻳﺪاد اﺿﺎﻓﻪ ﻛﻨﻴﺪ:
٢١٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
private void btnSayHello_MouseEnter(object sender, )EventArgs e { // Change the Button text ;"!btnSayHello.Text = "The Mouse is here } اﻳﻦ روﻳﺪاد زﻣﺎﻧﻲ اﺟﺮا ﻣﻲ ﺷﻮد ﻛﻪ اﺷﺎره ﮔﺮ ﻣﺎوس وارد ﻛﻨﺘﺮل ﺷﻮد ،ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ از ﻣﺤﺪوده ي ﺧـﺎرج از Button ﺑﻪ ﻟﺒﻪ ي Buttonﺑﺮﺳﺪ. (9ﺑﺮاي ﺗﻜﻤﻴﻞ اﻳﻦ ﺑﺨﺶ ،ﺑﺎﻳﺪ ﻳﻚ روﻳﺪاد دﻳﮕﺮ ﻧﻴﺰ اﻳﺠﺎد ﻛﻨﻴﺪ .ﻣﺠﺪداً ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮﮔـﺸﺘﻪ و ﭘﺲ از اﻧﺘﺨﺎب ﻛﻨﺘﺮل ،Buttonدر ﺑﺎﻻي ﭘﻨﺠﺮه ي Propertiesﺑﺮ روي آﻳﻜﻮن Eventsﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻟﻴﺴﺖ ﺗﻤﺎم روﻳﺪادﻫﺎي اﻳﻦ ﻛﻨﺘﺮل را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .از ﻟﻴﺴﺖ ﻧﻤﺎﻳﺶ داده ﺷـﺪه ﮔﺰﻳﻨـﻪ MouseLeaveرا اﻧﺘﺨـﺎب ﻛﺮده و ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﺪ دﻳﮕﺮي ﺑﺮاي اﻳﻦ روﻳﺪاد اﻳﺠﺎد ﻣﻲ ﺷﻮد .ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳـﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ. private void btnSayHello_MouseLeave(object sender, )EventArgs e { // Chenage the Button text ;"!btnSayHello.Text = "The mouse has gone } روﻳﺪاد MouseLeaveﻫﻨﮕﺎﻣﻲ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد ﻛﻪ اﺷﺎره ﮔﺮ ﻣﺎوس از ﻣﺤﺪوده ي ﻳﻚ ﻛﻨﺘﺮل ﺧﺎرج ﺷـﻮد .ﺑـﺮاي ﻣﺜﺎل در اﻳﻨﺠﺎ ﻫﻨﮕﺎﻣﻲ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد ﻛﻪ اﺷﺎره ﮔﺮ ﻣﺎوس از روي ﻛﻨﺘﺮل Buttonﺑﻪ ﻛﻨﺎر ﺑﺮود. (10ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده ،ﻣﺎوس را ﺑﺮ روي ﻛﻨﺘﺮل Buttonﺑﺒﺮﻳﺪ و از روي آن رد ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣـﺘﻦ روي ﻛﻨﺘﺮل ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 5-6ﺗﻐﻴﻴﺮ ﺧﻮاﻫﺪ ﻛﺮد.
ﺷﻜﻞ 5-6
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﻏﻠﺐ ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ داراي ﺗﻌﺪاد زﻳﺎدي روﻳﺪاد ﻫﺴﺘﻨﺪ .اﻟﺒﺘﻪ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻋﺎدي ،ﺗﻌﺪاد ﻛﻤـﻲ از آﻧﻬـﺎ ﺑـﻪ ﻃﻮر ﺛﺎﺑﺖ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺑﺮاي ﻣﺜﺎل روﻳﺪاد ﻛﻠﻴﻚ ﻛﻨﺘﺮل ،Buttonﻳﻜﻲ از روﻳﺪادﻫﺎﻳﻲ اﺳـﺖ ﻛـﻪ ﺑـﻪ ﺷـﺪت ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد.
٢١٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در وﻳﮋوال C#ﻫﺮ ﻛﻨﺘﺮل ﻳﻚ روﻳﺪاد ﭘﻴﺶ ﻓﺮض دارد ﻛﻪ ﺑﺎ دو ﺑﺎر ﻛﻠﻴﻚ ﺑـﺮ روي آن ﻛﻨﺘـﺮل ،ﻣﺘـﺪ ﻣﺮﺑـﻮط ﺑـﻪ آن روﻳـﺪاد ﺑـﻪ ﻃـﻮر اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮد .اﻳﻦ روﻳﺪاد ﻣﻌﻤﻮﻻً ﭘﺮ ﻛﺎرﺑﺮد ﺗﺮﻳﻦ روﻳﺪاد آن ﻛﻨﺘﺮل اﺳﺖ .ﺑﺮاي ﻣﺜﺎل در ﻛﻨﺘﺮل ،Buttonروﻳﺪاد ﻛﻠﻴـﻚ ﺑﻪ ﻋﻨﻮان روﻳﺪاد ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد. ﻳﻜﻲ دﻳﮕﺮ از روﻳﺪادﻫﺎي ﻛﻨﺘﺮل ،Buttonروﻳﺪاد MouseEnterاﺳﺖ ﻛﻪ ﺑﺎ وارد ﺷﺪن اﺷﺎره ﮔﺮ ﻣﺎوس ﺑﻪ ﻣﺤﺪوده ﻛﻨﺘﺮل ﻓﻌﺎل ﻣﻲ ﺷﻮد. private void btnSayHello_MouseEnter(object sender, )EventArgs e { // Change the Button text ;"!btnSayHello.Text = "The Mouse is here } در اﻳﻦ ﻫﻨﮕﺎم ﻣﻲ ﺗﻮاﻧﻴﻢ ﺧﺎﺻﻴﺖ Textﻛﻨﺘﺮل را ﺗﻐﻴﻴﺮ دﻫﻴﻢ ﺗﺎ ﺗﻐﻴﻴﺮ ﻣﻮﻗﻌﻴﺖ اﺷﺎره ﮔﺮ ﻣﺎوس را ﻧـﺸﺎن دﻫـﺪ .در ﻗـﺴﻤﺘﻬﺎي ﻗﺒﻠـﻲ ﺑﺮاي ﺗﻐﻴﻴﺮ ﻳﻜﻲ از ﺧﺎﺻﻴﺖ ﻫﺎي ﻳﻚ ﻛﻨﺘﺮل ،از ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم در زﻣﺎن ﻃﺮاﺣﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴﺪ ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻲ ﺗﻮان از ﻛﺪﻫﺎي زﻣﺎن اﺟﺮا ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮد. ﻧﻜﺘﻪ :زﻣﺎن ﻃﺮاﺣﻲ 1در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ زﻣﺎﻧﻲ اﻃﻼق ﻣﻲ ﺷﻮد ﻛﻪ در ﺣﺎل ﻃﺮاﺣﻲ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﺑﺮﻧﺎﻣـﻪ و ﻳـﺎ ﺣﺘـﻲ ﻧﻮﺷـﺘﻦ ﻛـﺪ ﻣﺮﺑﻮط ﺑﻪ آن ﻫﺴﺘﻴﺪ .در ﻣﻘﺎﺑﻞ ﺑﻪ زﻣﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا اﺳﺖ ،زﻣﺎن اﺟﺮا 2ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد.
اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده: وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005داراي ﻣﺠﻤﻮﻋﻪ ﻛﺎﻣﻠﻲ از ﻛﻨﺘﺮل ﻫﺎ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮاي ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد از آﻧﻬـﺎ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .در ﻃﺮاﺣﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،اﻏﻠﺐ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﻣﻴﺘﻮان ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﺮد .اﻣﺎ در ﻓﺼﻞ 13ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻣﺨﺼﻮص ﺑﻪ ﺧﻮدﺗﺎن ﺑﺴﺎزﻳﺪ. در ﻗﺴﻤﺖ ﺑﻌﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ ﺗﺮﻛﻴﺐ اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ،ﺑﺮﻧﺎﻣﻪ ﺳﺎده اي را اﻳﺠﺎد ﻛﺮد .در ﻗﺴﻤﺖ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺳﺎده وﻳﻨﺪوزي اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﺪ ﻣﺘﻨﻲ را در ﻳﻚ ﻛﺎدر وارد ﻛﻨﺪ .ﺳـﭙﺲ ﺑﺮﻧﺎﻣـﻪ ﺗﻌـﺪاد ﺣـﺮوف ﻣﺘﻦ و ﺗﻌﺪاد ﻛﻠﻤﺎت آن را ﺷﻤﺮده و آن را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
اﻳﺠﺎد ﻓﺮم: ﺑﺮاي ﻧﻮﺷﺘﻦ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،اوﻟﻴﻦ ﻛﺎر اﻳﺠﺎد ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ و ﺳـﺎﺧﺘﻦ ﻳـﻚ ﻓـﺮم ﺑـﺮاي ﺑﺮﻧﺎﻣـﻪ اﺳـﺖ .اﻳـﻦ ﻓـﺮم ﺷـﺎﻣﻞ ﻳـﻚ ﻛﻨﺘـﺮل TextBoxﭼﻨﺪ ﺧﻄﻲ ﺧﻮاﻫﺪ ﺑﻮد ﺗﺎ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧـﺪ ﻣـﺘﻦ ﻣـﻮرد ﻧﻈـﺮ ﺧـﻮد را در آن وارد ﻛﻨـﺪ .ﻫﻤﭽﻨـﻴﻦ ﺑﺮﻧﺎﻣـﻪ ﺷـﺎﻣﻞ دو ﻛﻨﺘـﺮل RadioButtonﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ،ﺑﻴﻦ ﺷﻤﺮدن ﻛﻠﻤﺎت ﻣﺘﻦ و ﻳﺎ ﺣﺮوف آن ﻳﻚ ﻣﻮرد را اﻧﺘﺨﺎب ﻛﻨﺪ.
Design Time Run Time
1 2
٢١٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻓﺮم (1از ﻣﻨﻮي وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﮔﺰﻳﻨﻪ … File New Projectرا اﻧﺘﺨـﺎب ﻛـﺮده و ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ وﻳﻨﺪوزي ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﻨﻴﺪ .ﻧﺎم ﭘﺮوژه را Word Counterﻗﺮار دﻫﻴﺪ و ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد. (2ﺑﺮ روي ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ اﻧﺘﺨﺎب ﺷﻮد .ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه Propertiesﺧﺎﺻﻴﺖ Sizeرا ﺑﺮاﺑـﺮ ﺑﺎ ،424;312ﺧﺎﺻﻴﺖ StartPositionرا ﺑﺮاﺑﺮ ﺑﺎ CenterScreenو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Word Counterﻗﺮار دﻫﻴﺪ. (3ﻳﻚ ﻛﻨﺘﺮل TextBoxﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ و ﺧﺎﺻﻴﺘﻬﺎي آن را ﻣﻄﺎﺑﻖ ﺑﺎ ﻟﻴﺴﺖ زﻳﺮ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ txtWordsﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Locationرا ﺑﺮاﺑﺮ ﺑﺎ 8,23ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Multilineرا ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ ScrollBarsرا ﺑﺮاﺑﺮ ﺑﺎ Verticalﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Sizeرا ﺑﺮاﺑﺮ ﺑﺎ 400,217ﻗﺮار دﻫﻴﺪ. (4ﺑﺮاي اﻳﻦ ﻛﻪ ﻛﺎرﺑﺮ را در اﺳﺘﻔﺎده از ﻓﺮم راﻫﻨﻤﺎﻳﻲ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﻳﻚ ﺑﺮﭼﺴﺐ ﻧﻴﺰ در ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر از ﺟﻌﺒﻪ اﺑـﺰار ﻛﻨﺘﺮل Labelرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و آن را ﺑﺎ اﺳﺘﻔﺎده از ﻣﺎوس ﻫﻤﺎﻧﻨﺪ ﻗﺮار دادن ﻛﻨﺘﺮل ،TextBoxﺑﺮ روي ﻓـﺮم ﻗـﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺖ Textاﻳﻦ ﻛﻨﺘﺮل را ﺑﺮاﺑﺮ ﺑﺎ Enter some text into this boxﻗﺮار دﻫﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ،در اﻳﻦ ﻗﺴﻤﺖ ﺧﺎﺻﻴﺖ Nameﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل ﻟﻴﺒﻞ را ﺗﻐﻴﻴﺮ ﻧﺪادﻳﻢ .دﻟﻴـﻞ اﻳـﻦ اﻣـﺮ در اﻳﻦ اﺳﺖ ﻛﻪ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻧﺨﻮاﻫﻴﺪ از ﻳﻚ ﻛﻨﺘﺮل در ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﺮاي آن ﻳﻚ ﻧـﺎم ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻧﻴﺎز دارﻳﻢ از ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘـﺮل TextBoxدر ﻛـﺪ اﺳـﺘﻔﺎده ﻛﻨـﻴﻢ ﺗـﺎ ﺑﺘﻮاﻧﻴﻢ ﻛﻠﻤﺎت و ﺣﺮوف داﺧﻞ آن را ﺑﺸﻤﺎرﻳﻢ .اﻣﺎ ﻧﻴﺎزي ﻧﺪارﻳﻢ ﻛﻪ از ﻛﻨﺘﺮل ﻟﻴﺒﻞ اﻃﻼﻋﺎﺗﻲ را درﻳﺎﻓﺖ ﻛﻨـﻴﻢ و ﻳـﺎ در ﻃـﻮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﺎﺻﻴﺘﻲ از آن را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﻧﺎم آن را ﺗﻐﻴﻴﺮ ﻧﻤﻲ دﻫﻴﻢ و اﺟﺎزه ﻣﻲ دﻫﻴﻢ ﻫﻤـﺎن ﻣﻘـﺪار اوﻟﻴـﻪ ﺑـﺎﻗﻲ ﺑﻤﺎﻧﺪ. (5ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻗﺎدر ﺧﻮاﻫﺪ ﺑﻮد ﺗﻌﺪاد ﻛﻠﻤﺎت و ﻧﻴﺰ ﺗﻌﺪاد ﺣﺮوف داﺧﻞ ﻳﻚ ﻣﺘﻦ را ﺑﺸﻤﺎرد .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎﻳﺪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻛـﻪ ﺷﻤﺎرش ﺗﻌﺪاد ﻛﻠﻤﺎت و ﻳﺎ ﺗﻌﺪاد ﺣﺮوف را اﻧﺘﺨﺎب ﻛﻨﺪ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻣـﻲ ﺗﻮاﻧﻴـﺪ از دو ﻛﻨﺘـﺮل RadioButton اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،دو ﻛﻨﺘﺮل RadioButtonدر ﻛﻨﺎر ﻫﻢ و در ﭘـﺎﻳﻴﻦ TextBoxﺑـﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ وارد ﻛﻨﻴﺪ. ﺑﺮاي دﻛﻤﻪ رادﻳﻮﻳﻲ اول:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ radCountCharsﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Checkedرا ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Charsﻗﺮار دﻫﻴﺪ.
ﺑﺮاي دﻛﻤﻪ رادﻳﻮﻳﻲ دوم:
٢١٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ radCountWordsﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Wordsﻗﺮار دﻫﻴﺪ.
(6ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻣﺘﻨﻲ را در ﻛﺎدر ﻣﺸﺨﺺ ﺷﺪه وارد ﻛﺮد ،ﺑﺮﻧﺎﻣﻪ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎ و ﻳﺎ ﺗﻌﺪاد ﻛﻠﻤﺎت آن را ﺧﻮاﻫﺪ ﺷﻤﺮد .در ﻣﺮﺣﻠﻪ ﺑﻌﺪ اﻳﻦ ﺗﻌﺪاد ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ،ﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ دو ﻛﻨﺘﺮل ﻟﻴﺒـﻞ را در ﻛﻨﺎر ﻛﻨﺘﺮﻟﻬﺎي RadioButtonدر ﻓﺮم ﻗﺮار دﻫﻴﺪ. (7ﻛﻨﺘﺮل ﻟﻴﺒﻞ اول )ﻛﻪ داراي ﻧﺎم label2اﺳﺖ( ﻓﻘﻂ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﻣﺘﻦ ﺛﺎﺑـﺖ در ﻃـﻮل ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﻛـﺎر ﻣـﻲ رود، ﺑﻨﺎﺑﺮاﻳﻦ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﻧﺎم آن را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺧﺎﺻﻴﺖ Textآن را ﺑﺎ The result are: ﺗﻨﻈﻴﻢ ﻛﻨﻴﻢ .ﻟﻴﺒﻞ دوم ﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﺘﻴﺠﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻨﺎﺑﺮاﻳﻦ ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑـﺎ lblResults ﻗﺮار ﻣﻲ دﻫﻴﻢ و ﻣﺘﻦ داﺧﻞ ﻗﺴﻤﺖ Textآن را ﻧﻴﺰ ﭘﺎك ﻣﻲ ﻛﻨﻴﻢ .ﺑﻌﺪ از اﻧﺠﺎم اﻳﻦ ﻣﻮارد ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﺷـﻤﺎ ﺑﺎﻳـﺪ ﻣـﺸﺎﺑﻪ ﺷﻜﻞ 6-6ﺑﺎﺷﺪ. (8ﺣﺎل ﻛﻪ ﻛﻨﺘﺮل ﻫﺎ را در ﻣﻜﺎن ﻣﻮرد ﻧﻈﺮﺗﺎن ﺑﺮ روي ﻓﺮم ﻗﺮار دادﻳﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﻛﺎري ﻛﻨﻴﺪ ﻛـﻪ در ﺟـﺎي ﺧـﻮد ﺛﺎﺑـﺖ ﺑـﺎﻗﻲ ﺑﻤﺎﻧﻨﺪ و ﻣﻮﻗﻌﻴﺖ ﺷﺎن ﺑﻪ ﻃﻮر ﺗﺼﺎدﻓﻲ ﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻳﻜﻲ از ﻛﻨﺘﺮﻟﻬﺎي روي ﻓﺮم را اﻧﺘﺨﺎب ﻛﺮده و ﺳﭙﺲ ﮔﺰﻳﻨﻪ Format Lock Controlsرا از ﻧﻮار ﻣﻨﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺧﺎﺻـﻴﺖ Lockedﻫﻤـﻪ ﻛﻨﺘﺮل ﻫﺎ ﺑﺮاﺑﺮ ﺑﺎ Trueﺧﻮاﻫﺪ ﺷﺪ و اﺣﺘﻤﺎل اﻳﻦ وﺟﻮد ﻧﺨﻮاﻫﺪ داﺷﺖ ﻛﻪ ﻳﻜﻲ از اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﻃـﻮر ﺗـﺼﺎدﻓﻲ ﭘـﺎك ﺷﻮد ،اﻧﺪازه اش ﺗﻐﻴﻴﺮ داده ﺷﻮد و ﻳﺎ ﻣﻜﺎن آن در ﻓﺮم ﺗﻐﻴﻴﺮ ﻛﻨﺪ.
ﺷﻜﻞ 6-6
ﺷﻤﺎرش ﻛﺎراﻛﺘﺮ ﻫﺎ: ﺣﺎل ﻛﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻃﺮاﺣﻲ ﺷﺪ ،ﺑﺎﻳﺪ ﺗﻌـﺪادي ﻣﺘـﺪ ﺑـﺮاي روﻳـﺪادﻫﺎي ﻣـﻮرد ﻧﻴـﺎز ﻃﺮاﺣـﻲ ﻛﻨﻴـﺪ ﺗـﺎ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛـﺎرﺑﺮ ﻣﺘﻨـﻲ را در TextBoxوارد ﻛﺮد ،ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي آن ﻣﺘﻦ در ﭘﺎﻳﻴﻦ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﺑﺮ روي ﻧﺎم ﻓـﺮم در ﻗـﺴﻤﺖ Solution
٢٢٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Explorerو ﻳﺎ ﺑﺮ روي ﺧﻮد ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ و از ﻣﻨﻮي ﺑﺎز ﺷﺪه ﮔﺰﻳﻨﻪ View Codeرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮوﻳﺪ .ﺑﺮاي اﻳﻨﻜﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻫﻢ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي ﻳﻚ ﻣﺘﻦ و ﻫﻢ ﺗﻌﺪاد ﻛﻠﻤـﺎت آن را ﺑـﺸﻤﺎرﻳﺪ ﻧﻴﺎز دارﻳﺪ ﻛﻪ ﺗﻮاﺑﻌﻲ ﺟﺪاﮔﺎﻧﻪ ﺑﺮاي اﻳﻦ دو ﻣﻮرد ﺑﻨﻮﻳﺴﻴﺪ .در ﻗﺴﻤﺖ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﻛﺪي ﺧﻮاﻫﻴﻢ ﻧﻮﺷـﺖ ﻛـﻪ ﺗﻌـﺪاد ﻛﺎراﻛﺘﺮﻫـﺎي ﻳﻚ ﻣﺘﻦ را ﺑﺸﻤﺎرد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺷﻤﺎرش ﻛﺎراﻛﺘﺮ ﻫﺎ (1در ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ،ﻛﺪ زﻳﺮ را درون ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ Form1وارد ﻛﻨﻴﺪ .ﺑﻪ ﻳﺎد دارﻳﺪ ﻛﻪ ﺑﺮاي ﻗﺮار دادن ﺑﺨـﺸﻬﺎي ﺗﻮﺿﻴﺤﻲ از ﻧﻮع XML Document Commentﺑﺎﻳﺪ ﺳﻪ ﻛﺎراﻛﺘﺮ /را ﺑﻪ ﻃﻮر ﻣﺘﻮاﻟﻲ ﻗﺒﻞ از ﺗﺎﺑﻊ وارد ﻛﻨﻴﺪ. >/// <summary /// Count the characters in a blick of text >/// </summary /// <param name="text">The string containing the text to >/// count characters in</param /// <returns>The number of characters in the >/// string</returns )private int CountCharacters(string text { ;return text.Length } (2ﺣﺎل ﺑﺎﻳﺪ ﻳﻚ ﻣﺘﺪ ﺑﺮاي روﻳﺪاد TextChangedﻛﻨﺘﺮل TextBoxاﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﻪ ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺎزﮔﺮدﻳﺪ و ﻛﻨﺘﺮل txtWordsرا ﺑﺮ روي ﻓﺮم اﻧﺘﺨﺎب ﻛﻨﻴـﺪ .در ﺑـﺎﻻي ﭘﻨﺠـﺮه Propertiesﺑـﺮ روي آﻳﻜﻮن Eventsﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻟﻴﺴﺘﻲ از ﻣﺘﺪﻫﺎي ﻣﺮﺑﻮط ﺑـﻪ ﻛﻨﺘـﺮل TextBoxﻧﻤـﺎﻳﺶ داده ﺷـﻮد .در اﻳـﻦ ﻟﻴﺴﺖ ﮔﺰﻳﻨﻪ TextChangedرا اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳـﻦ روﻳـﺪاد ﺑـﻪ ﻃـﻮر اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﺧﻮاﻫﺪ ﺷﺪ .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ. private void txtWords_TextChanged(object sender, )EventArgs e { // Count the number of characters ;)int intChars = CountCharacters(txtWords.Text // Display the results ;"lblResults.Text = intChars + " characters } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻣﺘﻨﻲ را در TextBoxوارد ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺗﻌـﺪاد ﻛﺎراﻛﺘﺮﻫـﺎي ﻣﻮﺟـﻮد در ﻣـﺘﻦ در ﭘﺎﻳﻴﻦ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد )ﺷﻜﻞ .(7-6
٢٢١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻼﺣﻈﻪ ﻣﻲ ﻛﻨﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎراﻛﺘﺮي را در TextBoxوارد ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻨﺘﺮل ﻟﻴﺒﻞ ﭘﺎﻳﻴﻦ ﻓـﺮم ﺗﻌـﺪاد ﻛﺎراﻛﺘﺮﻫـﺎي ﻣﻮﺟﻮد در ﻣﺘﻦ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .زﻳﺮا ﻫﺮ ﺑﺎر ﻛﻪ ﻣﺘﻦ داﺧﻞ TextBoxﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ ،روﻳﺪاد TextChangedﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﺮ ﺑﺎر ﻛﻪ ﻣﺘﻦ ﺟﺪﻳﺪي وارد ﺷﻮد ،ﻗﺴﻤﺘﻲ از ﻣﺘﻦ ﻗﺒﻠﻲ ﺣﺬف ﺷﻮد و در ﻛﻞ ﻗﺴﻤﺘﻲ از ﻣﺘﻦ ﺑﻪ ﻫﺮ ﻧﺤﻮي ﺗﻐﻴﻴﺮ ﻛﻨـﺪ، ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ روﻳﺪاد ﺗﺎﺑﻊ CountCharactersرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ و ﻣﺘﻦ داﺧﻞ TextBoxرا ﺑﻪ ﻋﻨﻮان ﭘـﺎراﻣﺘﺮ ﺑﻪ اﻳﻦ ﻣﺘﺪ ﻣﻲ ﻓﺮﺳﺘﺪ .اﻳﻦ ﻣﺘﺪ ﻧﻴﺰ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي ﻣﻮﺟﻮد در ﻣﺘﻦ را ﺷﻤﺮده و ﻧﺘﻴﺠﻪ را در ﻣﺘﻐﻴﺮ intCharsﻗﺮار ﻣﻲ دﻫﺪ.
ﺷﻜﻞ 7-6
// Count the number of characters ;)int intChars = CountCharacters(txtWords.Text ﺳﭙﺲ ﻋﺪد ﺑﻪ دﺳﺖ آﻣﺪه ﺑﺎ ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ در ﻛﻨﺘﺮل ﻟﻴﺒﻞ ﻗﺮار ﻣﻲ ﮔﻴﺮد ﺗﺎ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮﻫﺎي ﻣﻮﺟﻮد در ﻣﺘﻦ ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع داده ﺷﻮد. // Display the results ;"lblResults.Text = intChars + " characters
ﺷﻤﺎرش ﻛﻠﻤﺎت: اﮔﺮﭼﻪ ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال 2005 C#ﺑﺴﻴﺎر ﺳﺎده ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ ،اﻣﺎ اراﺋﻪ ﻳﻚ راه ﺣﻞ ﻇﺮﻳﻒ و ﻛﺎرآﻣﺪ ﺑﺮاي ﻳﻚ ﻣﺴﺌﻠﻪ ﺑﻪ ﺗﺮﻛﻴﺒﻲ از ﺗﺠﺮﺑﻪ و اﺳﺘﺪﻻل ﻧﻴﺎز دارد.
٢٢٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﻣﺜﺎل ﻫﻤﻴﻦ ﺑﺮﻧﺎﻣﻪ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ دﻛﻤﻪ رادﻳـﻮﻳﻲ Wordsاﻧﺘﺨـﺎب ﺷـﺪه ﺑـﻮد ،ﺑﺮﻧﺎﻣـﻪ ﺗﻌـﺪاد ﻛﻠﻤﺎت را ﺑﺸﻤﺎرد و ﻫﻨﮕﺎﻣﻲ ﻛﻪ دﻛﻤﻪ رادﻳﻮﻳﻲ Charsاﻧﺘﺨﺎب ﺷﺪه ﺑﻮد ﺑﺮﻧﺎﻣﻪ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎ را ﺑﺸﻤﺎرد .در اﻳﻦ ﻣﻮرد ﺑﺎﻳﺪ ﺑـﻪ دو ﻣﻮرد ﺗﻮﺟﻪ ﻛﻨﻴﺪ .اول اﻳﻨﻜﻪ زﻣﺎﻧﻲ ﻛﻪ ﺑﻪ روﻳﺪاد TextChangedﭘﺎﺳﺦ ﻣﻲ دﻫﻴﺪ ،ﺑﺮاي ﺷﻤﺎرش ﺗﻌﺪاد ﻛﻠﻤﺎت ﺑﺎﻳﺪ از ﻳﻚ ﺗـﺎﺑﻊ و ﺑﺮاي ﺷﻤﺎرش ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎ ﺑﺎﻳﺪ از ﺗﺎﺑﻌﻲ دﻳﮕﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻟﺒﺘﻪ اﻳﻦ ﻣﻮرد زﻳﺎد ﺳﺨﺖ ﻧﻴﺴﺖ. دوم اﻳﻨﻜﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي ﻳﻜﻲ از ﻛﻨﺘﺮﻟﻬﺎي RadioButtonﻛﻠﻴﻚ ﻣـﻲ ﻛﻨـﺪ ،ﺑﺎﻳـﺪ ﻣـﺘﻦ ﻧﻤـﺎﻳﺶ داده ﺷـﺪه را از " "Charactersﺑﻪ " "Wordsو ﻳﺎ ﺑﺮﻋﻜﺲ ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺣﺎل ،ﺗﻌﺪاد ﺑﻴﺸﺘﺮي روﻳﺪاد را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ و ﺑﻌﺪ از ﺗﻤﺎم ﺷﺪن ﺑﺮﻧﺎﻣﻪ ،ﻣﻨﻄﻘﻲ ﻛﻪ در ﭘﺸﺖ ﺗﻜﻨﻴﻜﻬﺎي آن ﺑﻪ ﻛﺎر رﻓﺘﻪ اﺳﺖ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺷﻤﺎرش ﻛﻠﻤﺎت (1اﮔﺮ ﻫﻤﭽﻨﺎن ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا اﺳﺖ ،آن را ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ .اوﻟﻴﻦ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴـﺪ اﻳـﻦ اﺳـﺖ ﻛـﻪ ﺗـﺎﺑﻊ دﻳﮕـﺮي ﺑﻨﻮﻳــﺴﻴﺪ ﻛــﻪ ﺗﻌــﺪاد ﻛﻠﻤــﺎت ﻣﻮﺟــﻮد در ﻳــﻚ ﻣــﺘﻦ ﻣــﺸﺨﺺ را ﺑـﺸﻤﺎرد .ﻛــﺪ زﻳــﺮ را ﺑــﻪ ﺑﺮﻧﺎﻣــﻪ اﺿــﺎﻓﻪ ﻛﻨﻴــﺪ ﺗــﺎ ﺗــﺎﺑﻊ CountWordsاﻳﺠﺎد ﺷﻮد: >/// <summary /// Counts the number of words in a block of text >/// </summary /// <param name="text">The string containing the text to >/// count words in</param >/// <returns>The number of words in the string</returns )private int CountWords(string text { // Is the text box empty )if (txtWords.Text == String.Empty ;return 0 // Split the words ;)' '(string[] strWords = text.Split // Return the number of words ;return strWords.Length } (2در اﻳﻦ ﻣﺮﺣﻠﻪ زﻳﺮﺑﺮﻧﺎﻣﻪ اي ﺑﻪ ﻧﺎم UpdateDisplayاﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﻣـﺘﻦ را از TextBoxدرﻳﺎﻓـﺖ ﻛﻨﺪ و ﺑﻌﺪ از ﺗﺸﺨﻴﺺ اﻳﻨﻜﻪ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎ را ﺑﺎﻳﺪ ﺑﺸﻤﺎرد و ﻳﺎ ﺗﻌﺪاد ﻛﻠﻤﺎت را ،ﻋﺪد ﻣﻮرد ﻧﻈﺮ را در ﺻﻔﺤﻪ ﻧﻤـﺎﻳﺶ دﻫـﺪ. ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن اﻳﻦ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻛﺪ زﻳﺮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )(private void UpdateDisplay { ?// Do we want to count words
٢٢٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
if (radCountWords.Checked == true) { // Update the results lblResults.Text = CountWords(txtWords.Text) + " words"; } else { // Update the results lblResults.Text = CountCharacters(txtWords.Text) + " characters"; } } ﺗـﺎﺑﻊ، را ﻓﺮاﺧـﻮاﻧﻲ ﻛﻨـﻴﻢCountCharacters ﺗـﺎﺑﻊ،( ﺣﺎل ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ در ﻣﺘـﺪ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪاد ﻛﻠﻴـﻚ3 . ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻐﻴﻴﺮات زﻳﺮ را در اﻳﻦ ﻣﺘﺪ اﻳﺠﺎد ﻛﻨﻴﺪ. را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﻢUpdateDisplay private void txtWords_TextChanged(object sender, EventArgs e) { // Something chenged, so display the results UpdateDisplay(); } و ﻳﺎ ﺑﺮ ﻋﻜﺲ ﺗﻐﻴﻴﺮWords ﺑﻪChars ( در آﺧﺮ ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ دﻛﻤﻪ رادﻳﻮﻳﻲ از4 ﻳﻜﻲCheckedChanged ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻲ ﺗﻮاﻧﻴﺪ از روﻳﺪاد. ﻋﺪد ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﺻﻔﺤﻪ ﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻛﻨﺪ،ﻛﺮد را اﻧﺘﺨـﺎب ﻛـﺮده و درradCountWords ﻛﻨﺘـﺮل، در ﻗﺴﻤﺖ ﻃﺮاﺣـﻲ ﻓـﺮم.از دﻛﻤﻪ ﻫﺎي رادﻳﻮﻳﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ روﻳﺪادﻫﺎي ﻣﺮﺑﻮط ﺑﻪ اﻳـﻦ ﻛﻨﺘـﺮل ﻧﻤـﺎﻳﺶ دادهEvents ﺑﺮ روي آﻳﻜﻮنProperties ﭘﻨﺠﺮه در ﻣﺘـﺪ. را اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴـﺪCheckedChanged روﻳﺪاد، از ﻟﻴﺴﺖ روﻳﺪادﻫﺎ.ﺷﻮﻧﺪ : ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪ،اﻳﺠﺎد ﺷﺪه ﺑﺮاي اﻳﻦ روﻳﺪاد private void radCountWords_CheckedChanged(object sender, EventArgs e) { // Something chenged, so display the results UpdateDisplay(); } : ﻧﻴﺰ ﺗﻜﺮار ﻛﻨﻴﺪradCountChars ( ﻣﺮاﺣﻞ ﻗﺒﻞ را ﺑﺮاي ﻛﻨﺘﺮل5 private void radCountChars_CheckedChanged(object sender, EventArgs e) { // Something chenged, so display the results ٢٢٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
UpdateDisplay(); } . ﻛﻠﻴـﻚ ﻛﻨﻴـﺪWords ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ رادﻳـﻮﻳﻲ.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﻣﺘﻨﻲ را در ﻗﺴﻤﺖ ﻣﺸﺨﺺ ﺷﺪه وارد ﻛﻨﻴﺪ6 .(8-6 ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﻦ ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﻓﺮم ﺗﻐﻴﻴﺮ ﻛﺮده و ﺗﻌﺪاد ﻛﻠﻤﺎت را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ )ﺷﻜﻞ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ : را ﺑﺮرﺳﻲ ﻛﻨﻴﻢCountWords ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﻧﺤﻮه ﻋﻤﻠﻜﺮد ﺗﺎﺑﻊ،ﻗﺒﻞ از اﻳﻨﻜﻪ ﺑﻪ ﺑﺮرﺳﻲ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ﺑﭙﺮدازﻳﻢ /// <summary> /// Counts the number of words in a block of text /// </summary> /// <param name="text">The string containing the text to /// count words in</param> /// <returns>The number of words in the string</returns> private int CountWords(string text) { // Is the text box empty if (txtWords.Text == String.Empty) return 0; // Split the words string[] strWords = text.Split(' '); // Return the number of words return strWords.Length; }
٢٢٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 8-6 در اﺑﺘﺪاي ﺗﺎﺑﻊ ،ﻣﻘﺪار ﺧﺎﺻﻴﺖ Textﻣﺮﺑﻮط ﺑﻪ TextBoxرا ﺑﺎ ﻋﻀﻮ Emptyاز ﻛﻼس Stringﺑﺮرﺳﻲ ﻣﻲ ﻛﻨـﻴﻢ ﺗـﺎ از وﺟﻮد ﻣﺘﻦ در آن ﻣﻄﻤﺌﻦ ﺷﻮﻳﻢ .ﻋﻀﻮ Emptyاز ﻛﻼس Stringﺑﺮاﺑﺮ ﺑﺎ رﺷﺘﻪ اي ﺑﻪ ﻃﻮل ﺻﻔﺮ )""( اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ اﮔـﺮ ﻣﻘﺪار داﺧﻞ ﺧﺎﺻﻴﺖ Textﺑﺮاﺑﺮ ﺑﺎ اﻳﻦ ﻋﻀﻮ ﺑﺎﺷﺪ ﻣﻲ ﺗﻮان ﻓﻬﻤﻴﺪ ﻛﻪ ﻣﺘﻨﻲ داﺧﻞ TextBoxوارد ﻧﺸﺪه اﺳﺖ .در اﻳـﻦ ﺣﺎﻟـﺖ ﺗﺎﺑﻊ ﻣﻘﺪار ﺻﻔﺮ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ. ﺗﺎﺑﻊ Splitاز ﻛﻼس Stringﻳﻚ رﺷﺘﻪ را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و آن را ﺑﻪ آراﻳﻪ اي از رﺷﺘﻪ ﻫﺎ ﺗﺒﺪﻳﻞ ﻛﺮده و ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﻳﻦ ﺗﺎﺑﻊ ﻳﻚ ﻛﺎراﻛﺘﺮ و ﻳﺎ آراﻳﻪ اي از ﻛﺎراﻛﺘﺮ ﻫﺎ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻛﺮده و از ﻛﺎراﻛﺘﺮ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﺟﺪا ﻛﻨﻨﺪه اﺳﺘﻔﺎده ﻣﻲ ﻛﻨـﺪ ﺗـﺎ رﺷﺘﻪ وارد ﺷﺪه را ﺑﻪ ﭼﻨﺪ زﻳﺮ رﺷﺘﻪ ﺗﻘﺴﻴﻢ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل در اﻳﻦ ﺑﺮﻧﺎﻣﻪ رﺷﺘﻪ داﺧﻞ TextBoxرا ﺑﻪ ﻫﻤﺮاه ﻛﺎراﻛﺘﺮ ﻓﺎﺻـﻠﻪ ) ‘ ‘( ﺑﻪ ﺗﺎﺑﻊ ﻣﻲ ﻓﺮﺳﺘﻴﻢ .ﺗﺎﺑﻊ ﻧﻴﺰ رﺷﺘﻪ را ﺑﻪ ﭼﻨﺪ زﻳﺮ رﺷﺘﻪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻓﺎﺻﻠﻪ از ﻫﻢ ﺟﺪا ﺷﺪه اﻧﺪ ﺗﺒﺪﻳﻞ ﻛﺮده و ﻧﺘﻴﺠﻪ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ. ﺑﻨﺎﺑﺮاﻳﻦ آراﻳﻪ اي ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﺣﺎوي ﻛﻠﻤﺎت رﺷﺘﻪ ورودي ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻌﺪ از آن ﻣﻲ ﺗﻮاﻧﻴﻢ ﻃﻮل آراﻳﻪ ﻛﻪ در ﺣﻘﻴﻘﺖ ﺗﻌﺪاد ﻛﻠﻤﺎت رﺷﺘﻪ اﺻﻠﻲ اﺳﺖ را ﺑﺮﮔﺮداﻧﻴﻢ. ﻧﻜﺘﻪ :در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻓﺮض ﻛﺮده اﻳﻢ ﻛﻪ رﺷﺘﻪ ﺑﻪ ﺻﻮرت اﺳﺘﺎﻧﺪارد در TextBoxوارد ﺷﺪه اﺳﺖ ،ﻳﻌﻨﻲ ﺗﻤﺎم ﻛﻠﻤﺎت ﻓﻘﻂ ﺑـﺎ ﻳـﻚ ﻛﺎراﻛﺘﺮ ﻓﺎﺻﻠﻪ از ﻳﻜﺪﻳﮕﺮ ﺟﺪا ﺷﺪه اﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺑﻴﻦ ﻛﻠﻤﺎت ﻣﺘﻨﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ وارد ﻣﻲ ﻛﻨﻴﺪ ﺑﻴﺶ از ﻳﻚ ﻓﺎﺻﻠﻪ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ، ﺗﻌﺪاد ﻛﻠﻤﺎت ﺑﻪ ﺻﻮرت ﻧﺎدرﺳﺖ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ﺗﺎﺑﻊ Splitﻳﻚ ﻛﺎراﻛﺘﺮ و ﻳﺎ آراﻳﻪ اي از ﻛﺎراﻛﺘﺮ ﻫﺎ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻣﻲ ﻛﻨـﺪ ،ﺑﻨـﺎﺑﺮاﻳﻦ اﮔـﺮ ﺑﺨﻮاﻫﻴﺪ ﻛﺎراﻛﺘﺮ ﻓﺎﺻﻠﻪ را ﺑﻪ ﺗﺎﺑﻊ ﺑﻔﺮﺳﺘﻴﺪ ﺑﺎﻳﺪ از ' ' اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻧﻪ از " " .زﻳﺮا در C#ﻋﻼﻣﺖ " ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن رﺷﺘﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود و ﻋﻼﻣﺖ ' ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻛﺎراﻛﺘﺮ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ،ﻋﺒﺎرت " " ﺑﻪ ﻋﻨﻮان ﻳﻚ رﺷﺘﻪ ﺑـﺎ ﻃـﻮل ﻳـﻚ در ﻧﻈـﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد و ﻋﺒﺎرت ' ' ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻛﺎراﻛﺘﺮ. ﻳﻜﻲ از ﻋﺎدت ﻫﺎي ﺧﻮب ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ در اﻳﻦ اﺳﺖ ﻛﻪ ﻓﻘﻂ ﺑﻪ ﻣﻘﺪار ﻣﻮرد ﻧﻴﺎز در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﻛﺪ ﻧﻮﺷﺘﻪ ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﮔـﺮ در ﻣﻮﻗﻌﻴﺘﻲ ﻣﺠﺒﻮر ﺷﺪﻳﺪ ﻛﻪ از ﻳﻚ ﻛﺪ دوﺑﺎر اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،روﺷﻲ را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ ﻛﻪ آن ﻛﺪ را ﻓﻘﻂ ﻳﻚ ﺑﺎر ﺑﻨﻮﻳﺴﻴﺪ .ﺑﺮاي ﻣﺜـﺎل در اﻳـﻦ
٢٢٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮﻧﺎﻣﻪ ،در دو ﻗﺴﻤﺖ ﻧﻴﺎز داﺷﺘﻴﺪ ﻛﻪ ﻣﺘﻦ داﺧﻞ lblResultsرا ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﺗﻌﺪاد درﺳﺖ ﻛﻠﻤﺎت و ﻳﺎ ﻛﺎراﻛﺘﺮ ﻫـﺎ را ﻧﻤـﺎﻳﺶ دﻫﺪ .ﺑﻬﺘﺮﻳﻦ روش ﺑﺮاي اﻳﻦ ﻛﺎر در اﻳﻦ اﺳﺖ ﻛﻪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺗﻐﻴﻴﺮ ﻣﺘﻦ داﺧﻞ lblResultsرا در داﺧـﻞ ﻳـﻚ ﻣﺘـﺪ ﻣﺠـﺰا ﻣﺎﻧﻨﺪ UpdateDisplayﻗﺮار دﻫﻴﺪ .ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ﺑـﻪ راﺣﺘـﻲ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻫﻨﮕـﺎم ﻧﻮﺷـﺘﻦ ﻛـﺪ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪادﻫﺎي TextChangedو CheckedChanedﻓﻘﻂ ﻣﺘﺪ ﻗﺒﻠﻲ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﻦ داﺧﻞ lblResultsﺗﺼﺤﻴﺢ ﺷﻮد .ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ روش ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻪ ﺗﻨﻬﺎ ﻛﻮﺗﺎﻫﺘﺮ ﺷﺪه و ﻧﮕﻬﺪاري و ﺗﻐﻴﻴﺮ آن در آﻳﻨﺪه راﺣﺖ ﺗﺮ ﻣﻲ ﺷﻮد ،ﺑﻠﻜﻪ ﻫﻨﮕﺎم اﻳﺠﺎد ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ ﺗﺼﺤﻴﺢ آن راﺣﺖ ﺗﺮ ﺻﻮرت ﻣﻲ ﮔﻴﺮد. )(private void UpdateDisplay { ?// Do we want to count words )if (radCountWords.Checked == true { // Update the results = lblResults.Text ;"CountWords(txtWords.Text) + " words } else { // Update the results = lblResults.Text ;"CountCharacters(txtWords.Text) + " characters } }
اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭘﻴﭽﻴﺪه ﺗﺮ: ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻋﺎدي ﻋﻼوه ﺑﺮ ﻛﻨﺘﺮﻟﻬﺎﻳﻲ ﻣﺎﻧﻨﺪ Buttonو ﻳﺎ TextBoxو ،...ﻋﻤﻮﻣﺎ داراي ﺑﺨﺸﻬﺎﻳﻲ ﻣﺎﻧﻨـﺪ ﻧـﻮار اﺑـﺰار و ﻧـﻮار وﺿﻌﻴﺖ ﻧﻴﺰ ﻫﺴﺘﻨﺪ .اﻳﺠﺎد اﻳﻦ ﻗﺴﻤﺘﻬﺎ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در وﻳﮋوال C#ﻛﺎر ﺑﺴﻴﺎر ﺳﺎده اي اﺳﺖ. در ﺑﺨﺶ ﺑﻌﺪ ﺑﺮﻧﺎﻣﻪ اي ﺧﻮاﻫﻴﻢ ﻧﻮﺷﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﻴﻢ ﻣﺘﻦ وارد ﺷﺪه در ﺑﺮﻧﺎﻣﻪ را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺑﺮاي ﻣﺜﺎل رﻧـﮓ ﻣـﺘﻦ را ﺗﻐﻴﻴـﺮ دﻫﻴﻢ و ﻳﺎ آن را ﺑﻪ ﺣﺮوف ﺑﺰرگ و ﻳﺎ ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ.
ﺑﺮﻧﺎﻣﻪ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ: در ﻗﺴﻤﺖ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ،ﺑﺮﻧﺎﻣﻪ اي ﺧﻮاﻫﻴﻢ ﻧﻮﺷﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮان ﻣﺘﻦ وارد ﺷﺪه در ﻳﻚ TextBoxرا وﻳـﺮاﻳﺶ ﻛـﺮد. در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻳﻚ ﻧﻮار اﺑﺰار اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﺑﻪ وﺳﻴﻠﻪ آن رﻧﮓ ﻣﺘﻦ را ﺗﻐﻴﻴﺮ دﻫﻴﻢ و ﻳﺎ آن را ﺑﻪ ﺣﺮوف ﺑﺰرگ و ﻳﺎ ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ. ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻳﻚ ﻧﻮار وﺿﻌﻴﺖ ﻧﻴﺰ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﺑﺘﻮاﻧﻴﻢ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮ روي ﻳﻜﻲ از ﻛﻠﻴﺪﻫﺎي ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﺷـﺪ، وﺿﻌﻴﺖ ﺑﺮﻧﺎﻣﻪ را ﺑﺮ اﺳﺎس آن ﻧﻤﺎﻳﺶ دﻫﻴﻢ. اوﻟﻴﻦ ﻣﺮﺣﻠﻪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ اﺳﺖ.
٢٢٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ (1ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﺮده و ﻧﺎم آن را Text Editorﻗﺮار دﻫﻴﺪ. (2در اﻏﻠﺐ ﻣﻮارد ﻧﺎم Form1ﺑﺮاي ﻳﻚ ﻓﺮم ﻣﻨﺎﺳﺐ ﻧﻴﺴﺖ ،زﻳﺮا در ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﺳﻴﻠﻪ ي اﻳﻦ ﻧـﺎم ﻧﻤـﻲ ﺗـﻮان ﻓـﺮم ﻫـﺎ را از ﻳﻜﺪﻳﮕﺮ ﺗﺸﺨﻴﺺ داد .ﺑﺮاي ﺗﻐﻴﻴﺮ ﻧﺎم ﻓﺮم اﻳﻦ ﺑﺮﻧﺎﻣـﻪ ،در ﭘﻨﺠـﺮه Solution Explorerﺑـﺮ روي ﻧـﺎم ﻓـﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﺮده و از ﻣﻨﻮي ﺑﺎز ﺷﺪه ﮔﺰﻳﻨﻪ Renameرا اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .ﺳـﭙﺲ ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ 9-6ﻧـﺎم ﻓـﺮم را ﺑـﻪ TextEditor.csﺗﻐﻴﻴﺮ دﻫﻴﺪ.
ﺷﻜﻞ 9-6 (3ﺣﺎل ﺑﺮ روي ﻓﺮم در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗـﺎ اﻧﺘﺨـﺎب ﺷـﻮد .ﺳـﭙﺲ در ﭘﻨﺠـﺮه Propertiesﺧﺎﺻـﻴﺖ Textآن را ﺑﻪ Text Editorو ﺧﺎﺻﻴﺖ Sizeﻓﺮم را ﺑﻪ 600;460ﺗﻐﻴﻴﺮ دﻫﻴﺪ. در ﻗﺴﻤﺖ ﺑﻌﺪ ﺑﻪ ﻃﺮاﺣﻲ راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ.
اﻳﺠﺎد ﻧﻮار اﺑﺰار: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﻳﻚ ﻧﻮار اﺑﺰار ﻣﺠﻤﻮﻋﻪ اي از ﻛﻨﺘﺮل ﻫﺎ اﺳﺖ ﻛﻪ اﻏﻠﺐ آﻧﻬﺎ Buttonﻫﺴﺘﻨﺪ ،ﻫﻤﺎﻧﻨـﺪ ﻧـﻮار اﺑـﺰار ﻣﻮﺟـﻮد در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ .2005در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻳﻚ ﻧﻮار اﺑﺰار ﺑﺮاي ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻛﺮده و Buttonﻫﺎي ﻣﻮرد ﻧﻴﺎز را ﻧﻴـﺰ ﺑﻪ آن اﺿﺎﻓﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻧﻮار اﺑﺰار
٢٢٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1 (2
(3 (4
ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ ﺟﻌﺒﻪ اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﻛﻨﺘﺮل ToolStripرا اﻧﺘﺨﺎب ﻛﺮده و ﺑـﻪ وﺳـﻴﻠﻪ ﻣـﺎوس آن را ﺑـﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ در ﺑﺎﻻي ﻓﺮم ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ. ﺑﺮاي اﻳﻦ ﻛﻪ ﺑﺘﻮاﻧﻴﻢ ﺗﻌﺪادي ﻛﻨﺘﺮل را ﺑـﻪ ﻧـﻮار اﺑـﺰار اﺿـﺎﻓﻪ ﻛﻨـﻴﻢ ،ﺑﺎﻳـﺪ از ﭘﻨﺠـﺮه Items Collection Editorاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺑﺮاي ﻧﻤﺎﻳﺶ اﻳﻦ ﭘﻨﺠﺮه ﺑﺮ روي ﻧﻮار اﺑﺰار در ﺑﺎﻻي ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ و از ﻣﻨﻮي ﺑﺎز ﺷـﺪه ﮔﺰﻳﻨﻪ … Edit Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﺷﺶ ﻛﻨﺘﺮل Buttonﺑﻪ ﻧﻮار اﺑﺰار اﺿﺎﻓﻪ ﻛﻨـﻴﻢ ﺗـﺎ در ﺑﺮﻧﺎﻣـﻪ از آﻧﻬـﺎ اﺳـﺘﻔﺎده ﻛﻨـﻴﻢ .دﻛﻤـﻪ ﻫـﺎي UpperCase ،LowerCase ،Blue ،Red ،Clearو دﻛﻤﻪ .About ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه ي Items Collection Editorﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮرد ﻧﻴـﺎز ﺧـﻮد را ﺑـﻪ ﻧـﻮار اﺑﺰار اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﺮاي اﻧﺘﺨﺎب ﻧﻮع ﻛﻨﺘﺮل ﺑﺎﻳﺪ از ComboBoxاي ﻛﻪ در ﮔﻮﺷﻪ ﺑﺎﻻي ﺳـﻤﺖ ﭼـﭗ ﺻـﻔﺤﻪ ﻗـﺮار دارد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .از ﻟﻴﺴﺖ اﻳﻦ ﻗﺴﻤﺖ ﮔﺰﻳﻨﻪ Buttonرا اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻳﻚ ﻛﻨﺘـﺮل Buttonﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﺷﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻟﻴﺴﺘﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل را ،ﻫﻤﺎﻧﻨﺪ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮﺟـﻮد در ﭘﻨﺠﺮه Propertiesﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .ﺑﺮاي ﺗﻤﺎم ﻛﻨﺘﺮﻟﻬﺎﻳﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ اﺿـﺎﻓﻪ ﻣـﻲ ﻛﻨـﻴﻢ ﺑﺎﻳـﺪ ﻧـﺎم و ﻧﺤﻮه ﻧﻤﺎﻳﺶ آﻧﻬﺎ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻳﻚ آﻳﻜﻮن ﻣﻨﺎﺳﺐ ﺑﺮاي آﻧﻬﺎ اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﻣـﺘﻦ داﺧـﻞ آﻧﻬـﺎ را ﭘـﺎك ﻛﻨﻴـﺪ و ﻳـﻚ ﻣـﺘﻦ راﻫﻨﻤــﺎي ﻣﻨﺎﺳــﺐ ﺑــﺮاي آﻧﻬــﺎ ﻗــﺮار دﻫﻴــﺪ .ﺧﺎﺻــﻴﺖ Nameﻛﻨﺘــﺮل Buttonﺟﺪﻳــﺪ را ﻫﻤﺎﻧﻨــﺪ ﺷــﻜﻞ 10-6ﺑــﻪ tbrClearﺗﻐﻴﻴﺮ دﻫﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﺑﺮاي ﭘﺎك ﻛﺮدن ﻣﺘﻦ وارد ﺷﺪه در داﺧﻞ وﻳﺮاﻳﺸﮕﺮ ﺑﻪ ﻛﺎر ﻣﻲ رود.
ﺷﻜﻞ 10-6 (5ﺧﺎﺻﻴﺖ DisplayStyleآن را ﻧﻴﺰ ﺑﻪ Imageﺗﻐﻴﻴﺮ دﻫﻴﺪ. (6در ﻟﻴﺴﺖ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮﺟﻮد ﺑﺮاي اﻳﻦ ﻛﻨﺘﺮل ،ﺧﺎﺻﻴﺖ Imageرا اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي ﻋﻼﻣﺖ … روﺑﺮوي آن ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠﺮه Select Resourceﺑﺎز ﺷﻮد .در اﻳﻦ ﭘﻨﺠﺮه ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Importﻛﻠﻴﻚ ﻛﻨﻴﺪ .در ﭘﻨﺠﺮه Openﺑﻪ آدرس زﻳﺮ ﺑﺮوﻳﺪ و ﻓﺎﻳﻞ document.icoرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ) .اﮔﺮ ﺑﺮﻧﺎﻣﻪ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ را در ﻓﻮﻟﺪر دﻳﮕﺮي ﻧﺼﺐ ﻛﺮده اﻳﺪ ﺑﻪ ﺟﺎي اﻳﻦ آدرس از آدرﺳﻲ ﻛﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ در آن ﻗﺮار دارد اﺳﺘﻔﺎده ﻛﻨﻴﺪ(
٢٢٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
\C:\Program Files\Microsoft Visual Studio 8 \Common7 VS2005ImageLibrary\icons\WinXP ﺳـﭙﺲ ﺑـﺮ روي دﻛﻤـﻪ OKدر ﭘﻨﺠـﺮه Select Resourceﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﺑـﻪ ﻗـﺴﻤﺖ Items Collection Editorﺑﺎزﮔﺮدﻳﺪ. (7ﺧﺎﺻــﻴﺖ ImageScalingرا ﺑــﻪ noneو ﺧﺎﺻــﻴﺖ ToolTipTextرا ﺑﺮاﺑــﺮ ﺑــﺎ Newﻗــﺮار دﻫﻴــﺪ. ﻫﻤﭽﻨﻴﻦ ﻣﻘﺪار وارد ﺷﺪه ﺑﺮاي ﺧﺎﺻﻴﺖ Textرا ﻧﻴﺰ ﭘﺎك ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻨﺘﺮل Buttonاول اﻳﺠﺎد ﺷﺪه اﺳﺖ. (8دﻛﻤﻪ ي ﺑﻌﺪي ﻛﻪ اﺿﺎﻓﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد ،دﻛﻤﻪ ي Redاﺳﺖ .اﻣﺎ اﺑﺘﺪا ﺑﺎﻳﺪ ﻳﻚ ﺧﻂ ﺟـﺪا ﻛﻨﻨـﺪه ﺑـﻴﻦ دﻛﻤـﻪ Clearو دﻛﻤﻪ Redﻗﺮار دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر در ﭘﻨﺠﺮه Item Collection Editorاز ﻟﻴﺴﺖ ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒـﻲ، ﮔﺰﻳﻨﻪ Seperatorرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﺮ روي ﻛﻠﻴﺪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻧﻴـﺎزي ﻧﻴـﺴﺖ ﻛـﻪ ﺧﺎﺻـﻴﺘﻬﺎي اﻳـﻦ ﻛﻨﺘﺮل را ﺗﻐﻴﻴﺮ دﻫﻴﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻤﺎم ﺧﺎﺻﻴﺘﻬﺎي ﭘﻴﺶ ﻓﺮض آن را ﻗﺒﻮل ﻛﻨﻴﺪ. (9ﻣﺮاﺣﻞ 4ﺗﺎ 7را ﺑﺮاي اﻳﺠﺎد دﻛﻤﻪ ﻓﺮﻣﺎن دوم ﺗﻜﺮار ﻛﻨﻴﺪ و ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ دﻛﻤﻪ ﻓﺮﻣﺎن را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ زﻳﺮ ﻗﺮار دﻫﻴـﺪ .از اﻳﻦ دﻛﻤﻪ ﻓﺮﻣﺎن ﺑﺮاي ﺗﻐﻴﻴﺮ رﻧﮓ ﻣﺘﻦ ﺑﻪ رﻧﮓ ﻗﺮﻣﺰ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن دﻛﻤﻪ ﻓﺮﻣـﺎن ﻗﺒـﻞ از اﻳﻨﻜـﻪ ﺑـﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﮔﺰﻳﻨﻪ Buttonدر ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ اﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ tbrRedوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleرا ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار دﻫﻴﺪ. ﺑﺮاي ﺧﺎﺻﻴﺖ Imageاز آدرس \VS2005ImageLibrary\icons\Misc\servicestopped.i coاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ImageScalingرا ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ Textرا ﭘﺎك ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ToolTipTextرا ﺑﺮاﺑﺮ ﺑﺎ Redﻗﺮار دﻫﻴﺪ.
(10ﻣﺮاﺣﻞ 4ﺗﺎ 7را ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن دﻛﻤﻪ ﻓﺮﻣﺎن Blueﺗﻜﺮار ﻛﻨﻴﺪ و در اﻳﻦ ﻣﺮﺣﻠﻪ از ﺧﺎﺻﻴﺘﻬﺎي زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ tbrBlueوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleرا ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار دﻫﻴﺪ. ﺑﺮاي ﺧﺎﺻﻴﺖ Imageاز آدرس \VS2005ImageLibrary\icons\Misc\services.icoاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ImageScalingرا ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ Textرا ﭘﺎك ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ToolTipTextرا ﺑﺮاﺑﺮ ﺑﺎ Blueﻗﺮار دﻫﻴﺪ.
(11در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﺑﻴﻦ دﻛﻤﻪ ﻫﺎي Blueو UpperCaseﻧﻴﺰ ﻳﻚ ﺧﻂ ﺟﺪا ﻛﻨﻨﺪه ﻗـﺮار دﻫـﻴﻢ .در ﺟﻌﺒـﻪ ﺗﺮﻛﻴﺒـﻲ ﺻﻔﺤﻪ ي Items Collection Editorﮔﺰﻳﻨﻪ Seperatorرا اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻧﻴﺰ ﻧﻴﺎزي ﻧﻴﺴﺖ ﺧﺎﺻﻴﺘﻲ از اﻳﻦ ﻛﻨﺘﺮل را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. (12ﺣﺎل ﺑﺎﻳﺪ ﻛﻨﺘﺮل Buttonﺟﺪﻳﺪي اﺿﺎﻓﻪ ﻛﻨﻴﻢ ﺗﺎ ﻣﺘﻦ داﺧﻞ وﻳﺮاﻳﺸﮕﺮ را ﺑﻪ ﺣﺮوف ﺑﺰرگ ﺗﺒﺪﻳﻞ ﻛﻨﺪ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻣﺮاﺣﻞ 4ﺗﺎ 7را ﺑﺮاي اﻳﺠﺎد دﻛﻤﻪ ﻓﺮﻣﺎن UpperCaseﺗﻜﺮار ﻛﻨﻴﺪ و در اﻳﻦ ﻣﺮﺣﻠﻪ از ﺧﺎﺻﻴﺘﻬﺎي زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ:
٢٣٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ tbrUpperCaseوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleرا ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار دﻫﻴﺪ. ﺑﺮاي ﺧﺎﺻﻴﺖ Imageاز آدرس \VS2005ImageLibrary\icons\WinXP\fonFile.icoاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ImageScalingرا ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ Textرا ﭘﺎك ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ToolTipTextرا ﺑﺮاﺑﺮ ﺑﺎ Upper Caseﻗﺮار دﻫﻴﺪ.
(13ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﺮاي Lowercaseاﻳﺠﺎد ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﻴﻢ ﻣﺘﻦ را ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﺗﺒـﺪﻳﻞ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﻨﺘﺮل از ﺧﺎﺻﻴﺘﻬﺎي زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ tbrLowerCaseوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleرا ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار دﻫﻴﺪ. ﺑﺮاي ﺧﺎﺻﻴﺖ Imageاز آدرس \VS2005ImageLibrary\icons\WinXP\fonfont.icoاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ImageScalingرا ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ Textرا ﭘﺎك ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ToolTipTextرا ﺑﺮاﺑﺮ ﺑﺎ Lower Caseﻗﺮار دﻫﻴﺪ.
(14ﺑﺎ ﺗﻐﻴﻴﺮ ﮔﺰﻳﻨﻪ اﻧﺘﺨﺎب ﺷﺪه در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﺑـﻪ Seperatorو ﻛﻠﻴـﻚ ﻛـﺮدن ﺑـﺮ روي دﻛﻤـﻪ Addﺟـﺪا ﻛﻨﻨـﺪه دﻳﮕﺮي ﺑﻴﻦ دﻛﻤﻪ ﻫﺎي LowerCaseو Aboutﻗﺮار دﻫﻴﺪ. (15در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ دﻛﻤﻪ اي ﺑﺮاي ﻗﺴﻤﺖ Aboutﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﺮاﺣﻞ 4ﺗﺎ 7را ﺑـﺮاي اﻳﺠـﺎد ﻳـﻚ دﻛﻤﻪ ﻓﺮﻣﺎن ﺟﺪﻳﺪ ﺗﻜﺮار ﻛﻨﻴﺪ و اﻳﻦ ﺑﺎر از ﺧﺎﺻﻴﺘﻬﺎي زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ tbrHelpAboutوارد ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleرا ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار دﻫﻴﺪ. ﺑﺮاي ﺧﺎﺻﻴﺖ Imageاز آدرس \VS2005ImageLibrary\icons\WinXP\help.icoاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ImageScalingرا ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار دﻫﻴﺪ. ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ Textرا ﭘﺎك ﻛﻨﻴﺪ. ﺧﺎﺻﻴﺖ ToolTipTextرا ﺑﺮاﺑﺮ ﺑﺎ Aboutﻗﺮار دﻫﻴﺪ.
(16در ﭘﻨﺠﺮه Items Collection Editorﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠـﺮه ﺑـﺴﺘﻪ ﺷـﻮد و ﺑـﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ. (17ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي دﻛﻤﻪ Save Allدر ﻧﻮار اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﺗﻐﻴﻴﺮات اﻳﺠﺎد ﺷﺪه در ﺑﺮﻧﺎﻣﻪ را ذﺧﻴﺮه ﻛﻨﻴﺪ.
٢٣١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﻨﺘﺮل ToolStripﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﻓﺮم ﻗﺮار داده ﺷﻮد ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺑﻪ ﻳﻜﻲ از ﻛﻨﺎره ﻫﺎي ﻓﺮم ﻣﺘﺼﻞ ﻣﻲ ﺷﻮد .در اﻳـﻦ ﺑﺮﻧﺎﻣﻪ ،اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺑﺎﻻي ﻓﺮم ﻣﺘﺼﻞ ﺷﺪه اﺳﺖ. ﺷﺶ ﻛﻨﺘﺮل Buttonو ﺳﻪ ﺟﺪا ﻛﻨﻨﺪه اي ﻛﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﺪه اﻧﺪ ،ﻫﺮ ﻳﻚ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻌﻤﻮﻟﻲ ﻛﻪ ﺑـﺮ روي ﻓـﺮم ﻗـﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ،ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﺷﺪن ﻫﺴﺘﻨﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﻧﺘﺨﺎب آﻧﻬﺎ ،ﺧﺼﻮﺻﻴﺎت آﻧﻬﺎ را در ﻗﺴﻤﺖ Propertiesﻣﺸﺎﻫﺪه ﻛﻨﻴـﺪ و ﻧﻴﺰ ﺑﻪ روﻳﺪادﻫﺎي اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ .در ﻗﺴﻤﺘﻬﺎي ﺑﻌﺪي ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑـﻪ روﻳـﺪادﻫﺎي اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﻫﻤﺎﻧﻨﺪ روﻳﺪاد ﻛﻠﻴﻚ ﭘﺎﺳﺦ دﻫﻴﻢ. ﻳﻚ ﻛﻨﺘﺮل در ﻧﻮار اﺑﺰار ﻣﻲ ﺗﻮاﻧﺪ ﻓﻘﻂ داراي ﻋﻜﺲ ﺑﺎﺷﺪ ،ﻓﻘﻂ داراي ﻧﻮﺷﺘﻪ ﺑﺎﺷﺪ و ﻳﺎ داراي ﻫﻢ ﻋﻜﺲ و ﻫﻢ ﻧﻮﺷﺘﻪ ﺑﺎﺷﺪ .اﻣﺎ در ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ دﻛﻤﻪ ﻫﺎي روي ﻧﻮار اﺑﺰار ﻓﻘﻂ داراي ﻋﻜﺲ ﻫﺴﺘﻨﺪ .ﺑﻪ ﻫﻤﻴﻦ ﻋﻠﺖ ﺧﺎﺻـﻴﺖ DisplayStyleاﻳـﻦ ﻛﻨﺘـﺮل ﻫـﺎ را ﺑﺮاﺑﺮ ﺑﺎ Imageﻗﺮار ﻣﻲ دﻫﻴﻢ ﺗﺎ ﻓﻘﻂ ﻳﻚ ﻋﻜﺲ ﺑﺮاي ﻫﺮ دﻛﻤﻪ ﻓﺮﻣﺎن ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﻫﻤﭽﻨﻴﻦ ﺑﺮاي اﻳﻨﻜـﻪ اﻧـﺪازه ﻋﻜـﺴﻬﺎي ﻣﺸﺨﺺ ﺷﺪه ﺑﺮاي ﻛﻨﺘﺮل ﻫﺎ ﺗﻐﻴﻴﺮ ﻧﻜﻨﺪ و ﺗﻤﺎم ﻋﻜﺴﻬﺎ در اﻧﺪازه اوﻟﻴﻪ ﺧﻮد ﺑﺎﻗﻲ ﺑﻤﺎﻧﻨـﺪ ،ﺧﺎﺻـﻴﺖ ImageScalingآﻧﻬـﺎ را ﺑﺮاﺑﺮ ﺑﺎ Noneﻗﺮار ﻣﻲ دﻫﻴﻢ. ﺧﺎﺻﻴﺖ ToolTipTextﺑﻪ وﻳﮋوال C#اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﻛﻪ ﻳﻚ راﻫﻨﻤﺎي ﻣﺨﺘﺼﺮ ﺑﺮاي ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻧﻮار اﺑـﺰار اﻳﺠﺎد ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﺷﺎره ﮔﺮ ﻣﺎوس ﺑﺮاي ﻣﺪت ﻛﻮﺗﺎﻫﻲ ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل ﻣﺎﻧﺪ ،ﭘﻨﺠﺮه ﻛﻮﭼﻜﻲ ﺑﺎز ﻣﻲ ﺷﻮد و ﻣـﺘﻦ ﻧﻮﺷﺘﻪ ﺷﺪه در اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﻪ ﻋﻨﻮان راﻫﻨﻤﺎ ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ﻧﻮار اﺑﺰار ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 11-6ﺷﺪه ﺑﺎﺷﺪ.
ﺷﻜﻞ 11-6
اﻳﺠﺎد ﻧﻮار وﺿﻌﻴﺖ: ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي دﻳﮕﺮ ﻣﺸﺎﻫﺪه ﻛﺮده اﻳﺪ ،ﻳﻚ ﻧﻮار وﺿﻌﻴﺖ ،ﭘﻨﻞ ﻛﻮﭼﻜﻲ اﺳﺖ ﻛﻪ در ﭘﺎﻳﻦ ﺻﻔﺤﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮد و وﺿﻌﻴﺖ ﻛﻨﻮﻧﻲ ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻧﺤﻮه اﻳﺠﺎد ﻧﻮار وﺿﻌﻴﺖ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﻧﻮار وﺿﻌﻴﺖ (1ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﻳﻚ ﻛﻨﺘﺮل StatusStripرا در ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛـﻪ اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ در ﻗﺴﻤﺖ ﭘﺎﻳﻦ ﻓﺮم ﻗﺮار ﮔﺮﻓﺘﻪ و ﻃﻮل آن ﻧﻴﺰ ﺑﻪ اﻧﺪازه ﻃـﻮل ﺻـﻔﺤﻪ ﺧﻮاﻫـﺪ ﺷـﺪ .ﺧﺎﺻـﻴﺖ RenderModeاﻳﻦ ﻛﻨﺘﺮل را ﺑﻪ Systemﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﻛﻨﺘﺮل ﺑﻪ ﺻﻮرت ﻣﺴﻄﺢ درآﻳﺪ. (2در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﻳﻚ ﻛﻨﺘﺮل ﻟﻴﺒﻞ را ﺑﻪ ﻟﻴﺴﺖ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در StatusStripاﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗـﺎ ﺑﺘﻮاﻧﻴـﺪ ﻣـﺘﻦ ﻫﺎي ﻣﻮرد ﻧﻈﺮﺗﺎن را در آن ﻧﻤﺎﻳﺶ دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺮ روي ﻧﻮار وﺿﻌﻴﺖ اﺿﺎﻓﻪ ﺷﺪه ﺑﻪ ﻓـﺮم ﻛﻠﻴـﻚ راﺳـﺖ ﻛـﺮده و از ﻣﻨﻮي ﺑﺎز ﺷﺪه ﮔﺰﻳﻨﻪ … Edit Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠﺮه Items Collection Editor
٢٣٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺎز ﺷﻮد .اﻳﻦ ﭘﻨﺠﺮه ﻧﻴﺰ ﻣﺸﺎﺑﻪ ﭘﻨﺠﺮه ي Items Collection Editorﺑﺮاي ﻛﻨﺘﺮل ﻧﻮار اﺑﺰار اﺳﺖ .در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﺳﻤﺖ ﭼﭗ اﻳﻦ ﭘﻨﺠﺮه ،ﮔﺰﻳﻨﻪ StatusLabelرا اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ و ﺳـﭙﺲ ﺑـﺮ روي دﻛﻤـﻪ ي Add ﻛﻠﻴﻚ ﻛﻨﻴﺪ. (3ﺧﺎﺻﻴﺖ ﻫﺎي ﻛﻨﺘﺮل ﻟﻴﺒﻞ اﺿﺎﻓﻪ ﺷﺪه ﺑﻪ ﻧﻮار وﺿﻌﻴﺖ را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ زﻳﺮ ﻗﺮار دﻫﻴﺪ:
ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑﺎ sspStatusﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ DisplayStyleآن را ﺑﻪ Textﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textآن را ﺑﻪ Readyﺗﻐﻴﻴﺮ دﻫﻴﺪ.
(4ﺑﺮ روي دﻛﻤﻪ OKدر ﭘﻨﺠﺮه Items Collection Editorﻛﻠﻴﻚ ﻛﻨﻴﺪ. (5ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮوﻳﺪ و ﻛﺪ زﻳﺮ را در ﺑﻪ ﻛﻼس ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: // Get or set the text on the status bar public string StatusText { get { ;return sspStatus.Text } set { ;sspStatus.Text = value } } در اﻳﻦ ﻣﺮﺣﻠﻪ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ ،زﻳﺮا ﻫﻨﻮز ﻛﺪ اﺻﻠﻲ آن را وارد ﻧﻜﺮده اﻳﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ ﻣﺮوري ﺑـﺮ ﻗـﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005وﻳﮋﮔﻴﻬﺎي زﻳﺎدي ﺑﺮاي راﺣﺖ ﺗﺮ ﻛﺮدن ﻃﺮاﺣﻲ ﻓﺮم دارد .ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ ﻫﻤﻮاره در ﻧﺴﺨﻪ ﻫﺎي ﻗﺒﻠﻲ ﺑﺎﻋﺚ دردﺳﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﻲ ﺷﺪ ،ﺗﻨﻈﻴﻢ اﻧﺪازه ي ﻛﻨﺘﺮل ﻫﺎ ﻫﻨﮕﺎم ﺗﻐﻴﻴﺮ اﻧﺪازه ﻓﺮم ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﺑﻮد .ﺑﺮاي ﻣﺜﺎل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻓﺮم را ﺑـﺮاي اﻧﺪازه 600*400ﻃﺮاﺣﻲ ﻣﻲ ﻛﺮد .اﻣﺎ ﻫﻨﮕﺎم اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ،ﻛﺎرﺑﺮ اﻧﺪازه ي ﻓﺮم را ﺑﻪ 800*700و ﻳﺎ ﻫﺮ اﻧﺪازه دﻳﮕـﺮي ﺗﻐﻴﻴـﺮ ﻣـﻲ داد. ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﻃﻮر ﻧﺎﻣﺮﺗﺐ ﺑﺮ روي ﻓﺮم ﻗﺮار ﻣﻲ ﮔﺮﻓﺘﻨﺪ. در وﻳــﮋوال اﺳــﺘﻮدﻳﻮ ،2005ﻛﻨﺘــﺮل ﻫـﺎ ﻣــﻲ ﺗﻮاﻧﻨــﺪ ﺑــﻪ ﻳﻜــﻲ از ﻟﺒــﻪ ﻫــﺎي ﻓــﺮم ﻣﺘــﺼﻞ ﺷــﻮﻧﺪ .ﺑــﻪ ﺻــﻮرت ﭘــﻴﺶ ﻓــﺮض ﻛﻨﺘــﺮل StatusStripﺑﻪ ﭘﺎﻳﻦ ﻓﺮم ﻣﺘﺼﻞ ﻣﻲ ﺷﻮد .اﻟﺒﺘﻪ اﻳﻦ ﺧﺎﺻﻴﺖ ﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ اﺳﺖ و ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺻـﻮرت ﻟـﺰوم ﺑـﺎ اﺳـﺘﻔﺎده از
٢٣٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺖ Dockآن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .1ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻧﺪازه ﻓﺮم ﺗﻐﻴﻴﺮ ﻛﻨﺪ ،ﭼﻪ در زﻣﺎن ﻃﺮاﺣﻲ و ﭼـﻪ در زﻣـﺎن اﺟـﺮا ،ﻧـﻮار وﺿﻌﻴﺖ )ﻛﻨﺘﺮل (StatusStripﻣﻮﻗﻌﻴﺖ ﺧﻮد را ﺑﺎ اﻧﺪازه ﺟﺪﻳﺪ ﻓﺮم ﺗﻨﻈﻴﻢ ﺧﻮاﻫﺪ ﻛﺮد. ﻣﻤﻜﻦ اﺳﺖ ﺑﭙﺮﺳﻴﺪ ﻛﻪ ﭼﺮا در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﺧﺎﺻﻴﺖ ﺑﻪ ﻧﺎم StatusTextاﻳﺠﺎد ﻛﺮده ام و وﻇﻴﻔـﻪ ي ﺗﻨﻈـﻴﻢ ﻛـﺮدن ﻣـﺘﻦ داﺧﻞ ﻧﻮار وﺿﻌﻴﺖ را ﺑﻪ آن ﺳﭙﺮده ام .ﺧﻮب اﻳﻦ ﻣﻮرد ﺑﻪ ﻋﻠﺖ ﺗﺠﺮد 2ﺑﺮﻧﺎﻣﻪ اﺳﺖ .ﻓﺮض ﻛﻨﻴﻢ در آﻳﻨﺪه اﻓـﺮادي ﺑﺨﻮاﻫﻨـﺪ از ﺑﺮﻧﺎﻣـﻪ ي وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻨﻲ ﻛﻪ ﺷﻤﺎ ﻧﻮﺷﺘﻪ اﻳﺪ ،ﺑﻪ ﻋﻨﻮان ﻳﻜﻲ از ﻓﺮﻣﻬﺎي ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻨﺪ .ﺣﺎل ﻣﻤﻜﻦ اﺳﺖ اﻳـﻦ اﻓـﺮاد در ﻗـﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﺑﺨﻮاﻫﻨﺪ ﻛﻪ ﻣﺘﻦ داﺧﻞ ﻧﻮار وﺿﻌﻴﺖ اﻳﻦ ﻓﺮم را ﺗﻐﻴﻴﺮ دﻫﻨﺪ .اﮔﺮ در ﺑﺮﻧﺎﻣﻪ از ﻳﻚ ﺧﺎﺻﻴﺖ ﺑﺮاي ﺗﻐﻴﻴﺮ و ﻳﺎ دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺘﻦ ﻧـﻮار وﺿﻌﻴﺖ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،آن اﻓﺮاد در آﻳﻨﺪه ﺻﺮﻓﻨﻈﺮ از اﻳﻨﻜﻪ ﻣﺎ ،از ﭼﻪ ﻧﻮار اﺑﺰاري در وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ ﺧﻮد اﺳﺘﻔﺎده ﻣـﻲ ﻛﻨـﻴﻢ و ﻳـﺎ ﺑـﺪون ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ آن ﻧﻮار اﺑﺰار ﺑﻪ ﭼﻪ ﺻﻮرت ﻣﺘﻦ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ،ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺘﻦ داﺧـﻞ ﻧـﻮار اﺑـﺰار را ﺗﻐﻴﻴـﺮ دﻫﻨﺪ. دﻟﻴﻞ اﻳﻨﻜﻪ اﻳﻦ ﺧﺎﺻﻴﺖ را از ﻧﻮع publicﺗﻌﺮﻳﻒ ﻛﺮده ام ﻧﻴﺰ ﺑﻪ ﻫﻤﻴﻦ ﻣﻮرد ﺑﺮﻣﻲ ﮔﺮدد .در ﺣﻘﻴﻘﺖ ﻋﺒﺎرت publicﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻛﺪﻫﺎي دﻳﮕﺮي ﻛﻪ در ﺧﺎرج از اﻳﻦ ﻓﺎﻳﻞ ﻫﺴﺘﻨﺪ ،ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ اﻳﻦ ﺧﺎﺻﻴﺖ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ و از آن اﺳﺘﻔﺎده ﻛﻨﻨﺪ. اﮔﺮ ﻧﺨﻮاﻫﻴﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ اﻳﻦ ﺧﺎﺻﻴﺖ را ﺗﻐﻴﻴﺮ دﻫﻨﺪ ،ﺑﺎﻳﺪ اﻳﻦ ﺧﺎﺻﻴﺖ را از ﻧﻮع privateﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ .در ﻓﺼﻮل 9ﺗـﺎ 13 ﺑﻴﺸﺘﺮ ﺑﺎ اﻳﻦ ﻣﻔﺎﻫﻴﻢ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. در ﻗﺴﻤﺘﻬﺎي ﺑﻌﺪي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺑﻌﻀﻲ از ﻣﺘﺪﻫﺎ و ﻳﺎ ﺧﺎﺻﻴﺖ ﻫﺎ ﺑﻪ ﺻﻮرت privateو ﺑﺮﺧﻲ دﻳﮕـﺮ ﺑـﻪ ﺻﻮرت publicﺗﻌﺮﻳﻒ ﺷﺪه اﻧﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻮﺟﻪ ﻣﻲ ﺷﻮﻳﺪ ﻛﻪ ﻛﺪاﻣﻴﻚ ﺑﻪ وﺳﻴﻠﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳـﺴﺎن دﻳﮕـﺮ ﻧﻴـﺰ ﻗﺎﺑـﻞ اﺳـﺘﻔﺎده ﻫﺴﺘﻨﺪ و ﻛﺪاﻣﻴﻚ ﻧﻤﻲ ﺗﻮاﻧﻨﺪ ﺗﻮﺳﻂ آﻧﺎن ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮﻧﺪ.
اﻳﺠﺎد ﻗﺴﻤﺖ وﻳﺮاﻳﺶ ﻣﺘﻦ: در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪTextBox ،اي را در ﻓﺮم ﻗﺮار ﻣﻲ دﻫﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻣﺘﻦ ﻣـﻮرد ﻧﻈـﺮ ﺧـﻮد را در آن وارد ﻛﻨـﺪ .ﻫـﺮ ﻛﻨﺘﺮل TextBoxداراي ﺧﺎﺻﻴﺘﻲ ﺑﻪ ﻧﺎم Multilineاﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﭘـﻴﺶ ﻓـﺮض ﺑﺮاﺑـﺮ ﺑـﺎ Falseاﺳـﺖ .اﻳـﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﻛﻨﺘﺮل ﻣﻲ ﺗﻮاﻧﺪ ﺑﻴﺶ از ﻳﻚ ﺧﻂ ﻣﺘﻦ را در ﺧﻮد ﺟﺎي دﻫﺪ ﻳﺎ ﺧﻴﺮ .اﮔﺮ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﺮاﺑﺮ ﺑـﺎ trueﻗﺮار دﻫﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ اﻧﺪازه ي TextBoxرا ﺑﻪ ﻫﺮ اﻧﺪازه اي ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ و ﻛﻨﺘﺮل ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﻫﺮ ﭼﻨﺪ ﺧﻂ ﻣﺘﻦ ﻛﻪ در آن وارد ﺷﻮد را ﻧﻤﺎﻳﺶ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻗﺴﻤﺖ وﻳﺮاﻳﺶ ﻣﺘﻦ (1ﺑﻪ ﻗﺴﻤﺖ ﻣﺮﺑﻮط ﺑﻪ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻳﻚ ﻛﻨﺘﺮل TextBoxﺑـﺮ روي ﻓـﺮم ﻗﺮار دﻫﻴﺪ. (2ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل را ﻣﻄﺎﺑﻖ ﺑﺎ ﻣﻘﺎدﻳﺮ زﻳﺮ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑﺎ txtEditﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Dockآن را ﺑﺮاﺑﺮ ﺑﺎ Fillﻗﺮار دﻫﻴﺪ.
1ﻳﻜﻲ دﻳﮕﺮ از ﺧﺎﺻﻴﺘﻬﺎي ﭘﺮ ﻛﺎرﺑﺮد ﻫﻤﺎﻧﻨﺪ ،Dockﺧﺎﺻﻴﺖ Anchorاﺳﺖ ﻛﻪ ﻓﺎﺻﻠﻪ ﻳﻚ ﻛﻨﺘﺮل را ﺑﺎ ﺑﻌﻀﻲ از ﻟﺒﻪ ﻫﺎي ﻓﺮم ﺑﻪ اﻧﺪازه ﻣﺸﺨﺼﻲ ﻧﮕـﻪ ﻣـﻲ دارد .ﺑﺮاي اﻃﻼﻋﺎت ﺑﻴﺸﺘﺮ در ﻣﻮرد اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﻪ راﻫﻨﻤﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ. 2 Abstraction
٢٣٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺖ MultiLineرا ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ ScrollBarsرا ﺑﺮاﺑﺮ ﺑﺎ Verticalﻗﺮار دﻫﻴﺪ.
ﺑﻌﺪ از اﻳﻦ ﻣﻮارد ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 12-6ﺑﺎﺷﺪ.
ﭘﺎك ﻛﺮدن ﺑﺨﺶ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ: در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ،ﺧﺎﺻﻴﺘﻲ ﺑﻪ ﻧﺎم EditTextاﻳﺠﺎد ﺧﻮاﻫﻴﺪ ﻛـﺮد ﻛـﻪ ﺑـﻪ وﺳـﻴﻠﻪ آن ﺑﺘﻮاﻧﻴـﺪ ﻣـﺘﻦ ﻣـﻮارد ﺷـﺪه در TextBoxرا درﻳﺎﻓﺖ ﻛﺮده و ﻳﺎ آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﭘﺎك ﻛﺮدن ﻣﺘﻦ داﺧﻞ TextBoxﺑﺴﻴﺎر ﺳـﺎده ﺧﻮاﻫـﺪ ﺑـﻮد، ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ رﺷﺘﻪ ﺧﺎﻟﻲ ﻣﺎﻧﻨﺪ String.Emptyﻗﺮار دﻫﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﭘﺎك ﻛﺮدن ﻣﺘﻦ داﺧﻞ وﻳﺮاﻳﺸﮕﺮ
ﺷﻜﻞ 12-6
(1ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺑﺮوﻳﺪ و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ:
٢٣٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Gets or sets the text that you are editing public string EditText { get { ;return txtEdit.Text } set { ;txtEdit.Text = value } } ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻞ ،ﺑﺎ ﺗﻌﺮﻳﻒ ﻳﻚ ﺧﺎﺻﻴﺖ ﺑﺮاي ﺗﻨﻈﻴﻢ ﻣﺘﻦ داﺧﻞ وﻳﺮاﻳﺸﮕﺮ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن دﻳﮕﺮي ﻛﻪ ﺑﺨﻮاﻫﻨﺪ از اﻳـﻦ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻨﺪ اﺟﺎزه ﻣﻲ دﻫﻴﻢ ﺻﺮﻓﻨﻈﺮ از اﻳﻨﻜﻪ ﭼﮕﻮﻧﻪ ﻣﺘﻦ داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ ،از اﻳﻦ ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛـﺮده و ﻣﺘﻦ را ﺗﻐﻴﻴﺮ دﻫﻨﺪ .اﻟﺒﺘﻪ اﻳﻦ ﻧﻜﺘﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻛﺎرﺑﺮد ﻛﻤﺘـﺮي دارد .اﻳـﻦ ﻧﻜﺘـﻪ ﺑﻴـﺸﺘﺮ در ﻃﺮاﺣـﻲ ﻛﻼﺳـﻬﺎ، ﻛﻨﺘﺮل ﻫﺎ و ﻳﺎ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ ﺑﻪ ﻛﺎر ﻣﻲ رود ،ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ ﻫﻢ اﻛﻨﻮن از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﻣﺎﻧﻨـﺪ .Button در ﻓﺼﻮل ﺑﻌﺪي ﺑﺎ اﻳﻦ ﻣﻮارد ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. (2ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺘﺪي اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺧﺎﺻﻴﺖ ،ﻣﺘﻦ داﺧﻞ وﻳﺮاﻳﺸﮕﺮ را ﭘﺎك ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻛﺪ زﻳﺮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: // Clears the txtEdit control )(public void ClearEditBox { // Set the EditText property ;EditText = String.Empty // Reset the font color ;txtEdit.ForeColor = Color.Black // Set the status bar text ;"!StatusText = "Text box cleared } (3ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﻛﻨﺘﺮل TextBoxرا در ﻓﺮم اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﺎ دو ﺑﺎر ﻛﻠﻴﻚ ﺑﺮ روي اﻳﻦ ﻛﻨﺘـﺮل ،ﻣﺘـﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد TextChangedرا اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: private void txtEdit_TextChanged(object sender, EventArgs )e { // Reset the status bar text ;"StatusText = "Ready }
٢٣٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اوﻟﻴﻦ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ ،ﭘﺎك ﻛﺮدن TextBoxاﺳﺖ .در ﺑﺨﺶ ﺑﻌﺪي ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ClearEditBoxدر ﻧﻮار اﺑﺰار ،ﻣﺘﻦ داﺧﻞ TextBoxرا ﭘﺎك ﻛﺮد. ﺗﻨﻬﺎ ﻛﺎري ﻛﻪ اﻳﻦ ﻣﺘﺪ اﻧﺠﺎم ﻣﻲ دﻫﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﺧﺎﺻﻴﺖ EditTextرا ﺑﺮاﺑﺮ ﺑﺎ ﻳﻚ رﺷﺘﻪ ﺧـﺎﻟﻲ ﻣﺎﻧﻨـﺪ ﻋـﻀﻮ Emptyاز ﻛﻼس Stringﻗﺮار دﻫﺪ .ﺳﭙﺲ ﺧﺎﺻﻴﺖ ForeColorاز TextBoxرا ﺑﺮاﺑﺮ ﺑﺎ رﻧﮓ ﺳﻴﺎه ﻗﺮار ﻣﻲ دﻫﺪ .اﻳﻦ ﺧﺎﺻﻴﺖ رﻧﮓ ﻣﺘﻦ ﻣﻮﺟﻮد در TextBoxرا ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .در اﻧﺘﻬﺎ ﻧﻴﺰ ﻋﺒﺎرت Text box clearedرا در ﻧﻮار اﺑـﺰار ﻣـﻲ ﻧﻮﻳﺴﺪ ﺗﺎ ﻣﺸﺨﺺ ﻛﻨﺪ ﻛﻪ ﻣﺘﻦ داﺧﻞ وﻳﺮاﻳﺸﮕﺮ ﭘﺎك ﺷﺪه اﺳﺖ. // Clears the txtEdit control )(public void ClearEditBox { // Set the EditText property ;EditText = String.Empty // Reset the font color ;txtEdit.ForeColor = Color.Black // Set the status bar text ;"!StatusText = "Text box cleared } ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ EditTextﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎﻧﻲ ﻛﻪ ﺑﺨﻮاﻫﻨـﺪ از اﻳـﻦ ﺑﺮﻧﺎﻣـﻪ اﺳـﺘﻔﺎده ﻛﻨﻨـﺪ، ﺑﺘﻮاﻧﻨﺪ ﺑﺪون ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ ﺷﻤﺎ ﭼﮕﻮﻧﻪ ﻣﺘﻦ داﺧﻞ ﺑﺮﻧﺎﻣﻪ را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﺪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم دﻫﻨﺪ. // Gets or sets the text that you are editing public string EditText { get { ;return txtEdit.Text } set { ;txtEdit.Text = value } }
ﭘﺎﺳﺦ ﺑﻪ روﻳﺪادﻫﺎي ﻧﻮار اﺑﺰار: در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻧﻮﺷﺘﻦ ﻛﺪﻫﺎي ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻧﻮار اﺑـﺰار را ﺷـﺮوع ﺧـﻮاﻫﻴﻢ ﻛـﺮد .در ﻓـﺼﻞ ﻫﺸﺘﻢ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺎ اﻳﺠﺎد ﻣﻨﻮ در ﺑﺮﻧﺎﻣﻪ ﻫﺎ آﺷﻨﺎ ﺷﺪﻳﺪ ،ﻣﺘﻮﺟﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ ﻛﻪ در ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻧﻮار اﺑﺰار ﻫﻤﺎن
٢٣٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﺎري را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ ﻛﻪ ﻣﻨﻮ ﻫﺎ اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﻤﻠﻜﺮد دﻛﻤﻪ Newدر ﻧﻮار اﺑـﺰار ﻣﻌـﺎدل ﻋﻤﻠﻜـﺮد ﮔﺰﻳﻨـﻪ Newدر ﻣﻨﻮي Fileﺧﻮاﻫﺪ ﺑﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺧﻮاﻫﻴﺪ ﺗﻮاﻧﺴﺖ ﺑﺮاي ﻫﺮ دوي اﻳﻦ ﻣﻮارد از ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪﻫﺎي ﻳﻜﺴﺎن اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﭘﺎﺳﺦ دادن ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ﻣﻮﺟﻮد در ﻧﻮار اﺑﺰار (1ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و در ﻧﻮار اﺑﺰار ﺑﺎﻻي ﻓﺮم ،ﺑﺮ روي دﻛﻤﻪ ي ) tbrClearاوﻟﻴﻦ دﻛﻤﻪ ﻓﺮﻣﺎن در ﻧﻮار اﺑـﺰار( دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ روﻳﺪاد ﻣﺮﺑﻮط ﺑﻪ ﻣﺘﺪ Clickاﻳﻦ ﻛﻨﺘﺮل اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳـﻦ ﻣﺘـﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void tbrClear_Click(object sender, EventArgs e { // Clear the edit box ;)(ClearEditBox } (2ﺑﺮاي ﻛﻨﺘﺮل Buttonدوم ﺑﺎﻳﺪ زﻳﺮﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻣﺘﻦ داﺧﻞ TextBoxرا ﺑﻪ رﻧﮓ ﻗﺮﻣﺰ درآورد و اﻳﻦ ﻣﻮرد را در ﻧﻮار وﺿﻌﻴﺖ ﻧﻴﺰ اﻋﻼم ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺘﺪ زﻳﺮ را در ﺑﺨﺶ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ وارد ﻛﻨﻴﺪ: )(public void RedText { // Make the text red ;txtEdit.ForeColor = Color.Red // Update the status bar text ;"StatusText = "The text is red } (3ﺣﺎل ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺸﺘﻪ ،دﻛﻤﻪ ي tbrRedرا در ﻧﻮار اﺑﺰار اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي آن دو ﺑـﺎر ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ. ﺳﭙﺲ در ﻣﺘﺪ اﻳﺠﺎد ﺷﺪه ﺑﺮاي روﻳﺪاد Clickاﻳﻦ ﻛﻨﺘﺮل ،ﻛﺪ زﻳﺮ را ﺑﻨﻮﻳﺴﻴﺪ: )private void tbrRed_Click(object sender, EventArgs e { // Make the text red ;)(RedText } ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﻣﺘﻨﻲ را در TextBoxوارد ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ Redدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﺘﻦ وارد ﺷﺪه ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 13-6ﺑﻪ رﻧﮓ ﻗﺮﻣﺰ درﻣﻲ آﻳﺪ .اﮔﺮ ﺑﻌﺪ از آن ﻣﺘﻦ ،ﻣﺘﻨﻲ را ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴﺪ ،رﻧﮓ آن ﻧﻴﺰ ﻗﺮﻣﺰ ﺧﻮاﻫﺪ ﺑﻮد.
٢٣٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 13-6 (4ﺣﺎل ﺑﺮ روي دﻛﻤﻪ ي Clearﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﺘﻦ وارد ﺷﺪه از ﺑﺮﻧﺎﻣﻪ ﭘﺎك ﻣﻲ ﺷﻮد و رﻧـﮓ ﻣـﺘﻦ ﻧﻴﺰ ﺑﻪ ﺣﺎﻟﺖ اوﻟﻴﻪ ﺑﺎزﻣﻲ ﮔﺮدد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﻣﺘﻨﻲ را در ﺑﺮﻧﺎﻣﻪ وارد ﻛﻨﻴﺪ رﻧﮓ آن ﺳﻴﺎه ﺧﻮاﻫﺪ ﺑﻮد. (5ﺑﺮﻧﺎﻣﻪ را ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ و ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮﮔﺮدﻳﺪ .ﻛﺪ زﻳﺮ را ﺑﻪ اﻳﻦ ﻗﺴﻤﺖ اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ زﻳﺮﺑﺮﻧﺎﻣﻪ اي اﻳﺠﺎد ﺷﻮد ﻛﻪ رﻧﮓ ﻣﺘﻦ را ﺑﻪ آﺑﻲ ﺗﻐﻴﻴﺮ دﻫﺪ: )(public void BlueText { // Make the text blue ;txtEdit.ForeColor = Color.Blue // Update the status bar text ;"StatusText = "The text is blue } (6در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ،دﻛﻤﻪ ي tbrBlueرا از ﻧﻮار اﺑﺰار اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي آن دو ﺑـﺎر ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ روﻳـﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void tbrBlue_Click(object sender, EventArgs e {
٢٣٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Make the text blue BlueText(); } ﺑﺮاي اﻳﻦ ﻛﺎر ﻛﺪ زﻳﺮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ.( ﺣﺎل ﺑﻪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ اي ﻧﻴﺎز دارﻳﻢ ﻛﻪ ﻣﺘﻦ داﺧﻞ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺣﺮوف ﺑﺰرگ ﺗﺒﺪﻳﻞ ﻛﻨﺪ7 :ﻛﻨﻴﺪ public void UppercaseText() { // Make the text uppercase EditText = EditText.ToUpper(); // Update the status bar text StatusText = "The text is all uppercase"; } در ﻧﻮار اﺑﺰار دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳـﺪادtbrUpperCase ﺑﺮ روي دﻛﻤﻪ ي،( در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم8 : ﺳﭙﺲ ﻛﺪ زﻳﺮ را در آن ﻣﺘﺪ وارد ﻛﻨﻴﺪ.ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد private void tbrUpperCase_Click(object sender, EventArgs e) { // Make the text uppercase UppercaseText(); } :( ﺑﺮاي ﺗﻐﻴﻴﺮ ﻣﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﻧﻴﺰ ﺑﻪ ﻣﺘﺪ زﻳﺮ ﻧﻴﺎز دارﻳﻢ9 public void LowercaseText() { // Make the text lowercase EditText = EditText.ToLower(); // Update the status bar text StatusText = "The text is all lowercase"; } : را اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪtbrLowerCase ( ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ي10 private void tbrLowerCase_Click(object sender, EventArgs e) { // Make the text lowercase LowercaseText(); }
٢٤٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(11ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﻣﺘﻨﻲ را در آن وارد ﻛﻨﻴـﺪ ﻛـﻪ ﺗﺮﻛﻴﺒـﻲ از ﺣـﺮوف ﻛﻮﭼـﻚ و ﺑـﺰرگ ﺑﺎﺷـﺪ .ﺳـﭙﺲ ﺑـﺮ روي دﻛﻤـﻪ ي Upper Caseﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﻦ وارد ﺷﺪه ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 14-6ﺑﻪ ﺣـﺮوف ﺑـﺰرگ ﺗﺒـﺪﻳﻞ ﻣـﻲ ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﺮ روي دﻛﻤﻪ Lower Caseﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻣﺘﻦ ﺑﻪ ﺣﺮوف ﻛﻮﭼﻚ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷـﻮد .ﻛﻠﻴـﻚ ﻛﺮدن ﺑﺮ روي دﻛﻤﻪ ﻫﺎي Redو Blueﻧﻴﺰ ﺑﺎﻋﺚ ﺗﻐﻴﻴﺮ رﻧﮓ ﺑﺮﻧﺎﻣـﻪ ﻣـﻲ ﺷـﻮد .در اﻧﺘﻬـﺎ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺮ روي دﻛﻤـﻪ Clearﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﻦ ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ ﭘﺎك ﺷﺪه و ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺣﺎﻟﺖ اول ﺑﺮﮔﺮدد.
ﺷﻜﻞ 14-6
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﻳﻦ ﺑﺨﺶ از اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﺴﻴﺎر ﺳﺎده ﺑـﻮد .در ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﻗﺒﻠـﻲ ﭼﮕـﻮﻧﮕﻲ اﻳﺠـﺎد ﻣﺘـﺪي ﺑـﺮاي روﻳـﺪاد Clickﻳـﻚ ﻛﻨﺘـﺮل Buttonرا ﻣﺸﺎﻫﺪه ﻛﺮده ﺑﻮدﻳﺪ ،اﻳﺠﺎد روﻳﺪاد Clickﺑﺮاي ﻛﻨﺘﺮﻟﻬﺎي Buttonﻣﻮﺟﻮد در ﻧﻮار اﺑﺰار ﻧﻴﺰ ﻛﺎﻣﻼً ﻣﺸﺎﺑﻪ ﻣﻮارد ﻗﺒﻠﻲ اﺳﺖ .اوﻟﻴﻦ ﻛﺎري ﻛﻪ اﻧﺠﺎم دادﻳﻢ ،اﻳﺠﺎد روﻳﺪاد Clickﺑﺮاي دﻛﻤﻪ ي Clearو اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪي ﺑـﻮد ﻛـﻪ زﻳﺮﺑﺮﻧﺎﻣـﻪ ClearEditBoxرا ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ: )private void tbrClear_Click(object sender, EventArgs e { // Clear the edit box ;)(ClearEditBox
٢٤١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} در ﻣﺮﺣﻠﻪ ﺑﻌﺪ ،زﻳﺮﺑﺮﻧﺎﻣﻪ اي ﻧﻮﺷﺘﻴﻢ ﻛﻪ رﻧﮓ ﻣﺘﻦ وارد ﺷﺪه در ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﻗﺮﻣﺰ ﺗﻐﻴﻴﺮ دﻫﺪ و اﻳﻦ ﺗﻐﻴﻴﺮ را در ﻧﻮار وﺿـﻌﻴﺖ ﻧﻴـﺰ اﻋـﻼم ﻛﻨﺪ .ﺑﺮاي ﺗﻐﻴﻴﺮ رﻧﮓ ﻣﺘﻦ وارد ﺷﺪه در TextBoxﺑﺎﻳﺪ از ﺧﺎﺻﻴﺖ ForeColorاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺑﺮاي ﺗﻌﻴﻴﻦ رﻧﮓ ﻣﻮرد ﻧﻈﺮ ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﻴﻢ از ﺷﻤﺎرﻧﺪه ي Colorاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺧﺎﺻﻴﺖ ForeColorﺑﻪ رﻧﮓ ﻗﺮﻣﺰ ﺑﺎﻗﻲ ﻣﻲ ﻣﺎﻧﺪ ﺗﺎ آن را ﻣﺠﺪداً ﺗﻐﻴﻴـﺮ دﻫﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺎ ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Clearﻛﻠﻴﻚ ﻧﻜﻨﻴﻢ ،رﻧﮓ ﻣﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺻﻮرت ﻗﺮﻣﺰ ﺧﻮاﻫﺪ ﺑﻮد .ﻛﻠﻴـﻚ ﻛـﺮدن ﺑـﺮ روي دﻛﻤﻪ Clearﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻣﺘﻨﻲ ﻛﻪ از آن ﺑﻪ ﺑﻌﺪ در ﺑﺮﻧﺎﻣﻪ وارد ﻣﻲ ﺷﻮد .ﺑﻪ رﻧﮓ ﺳﻴﺎه ﻧﻤﺎﻳﺶ داده ﺷﻮد: )(public void RedText { // Make the text red ;txtEdit.ForeColor = Color.Red // Update the status bar text ;"StatusText = "The text is red } ﺑﻌﺪ از اﻳﻨﻜﻪ رﻧﮓ ﻣﺘﻦ ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﻗﺮﻣﺰ ﺗﻐﻴﻴﺮ دادﻳﻢ ،اﻳﻦ ﺗﻐﻴﻴﺮ در ﻧﻮار وﺿﻌﻴﺖ ﻧﻴﺰ ﻧﺸﺎن داده ﻣﻲ ﺷﻮد .ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛـﺎرﺑﺮ ﻣﺘﻨﻲ را در ﺑﺮﻧﺎﻣﻪ ﺗﺎﻳﭗ ﻛﻨﺪ ،ﻣﺘﻦ ﻧﻮار وﺿﻌﻴﺖ ﻧﻴﺰ ﺑﻪ Readyﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ .زﻳﺮا در اﻳﻦ ﺣﺎﻟﺖ ﻣـﺘﻦ داﺧـﻞ TextBoxﺗﻐﻴﻴـﺮ ﻛﺮده و ﺑﻨﺎﺑﺮاﻳﻦ روﻳﺪاد TextChangedﻣﺮﺑﻮط ﺑﻪ ﻛﻨﺘﺮل TextBoxﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .اﻳﻦ روﻳﺪاد ﻧﻴﺰ ﻣﺘﻦ ﻧﻮار وﺿـﻌﻴﺖ را ﺑﻪ Readyﺗﻐﻴﻴﺮ ﻣﻲ دﻫﺪ. اﮔﺮ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Upper Caseدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﺪ ،ﺑﺮﻧﺎﻣـﻪ ﻣﺘـﺪ UppercaseTextرا ﻓﺮاﺧـﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ ،اﻳﻦ ﻣﺘﺪ ﻧﻴﺰ ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ToUpperﻣﺘﻦ ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ EditTextرا ﺑﻪ ﺣﺮوف ﺑﺰرگ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ: // Make the text uppercase ;)(EditText = EditText.ToUpper ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي دﻛﻤﻪ ي Lower Caseﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻣﺘﻦ ﻣﻮﺟـﻮد در ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﺣـﺮوف ﻛﻮﭼـﻚ ﺗﺒﺪﻳﻞ ﺷﻮد: // Make the text lowercase ;)(EditText = EditText.ToLower ﺗﻤﺎﻣﻲ اﻳﻦ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ روﻳﺪاد ﻛﻠﻴﻚ ﻣﺮﺑﻮط ﺑﻪ دﻛﻤﻪ ي ﻣﺮﺑﻮط ﺑﻪ ﺧﻮدﺷﺎن در ﻧﻮار اﺑﺰار ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮﻧﺪ و ﺑﻌـﺪ از اﻳﻨﻜـﻪ ﺗﻐﻴﻴﺮ ﻣﻮرد ﻧﻈﺮ را در ﻣﺘﻦ اﻳﺠﺎد ﻛﺮدﻧﺪ ،ﻣﺘﻦ ﻣﻮﺟﻮد در ﻧﻮار وﺿﻌﻴﺖ را ﻧﻴﺰ ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ ﻛﻪ ﻧﺸﺎن دﻫﻨﺪه ي ﺗﻐﻴﻴـﺮ اﻳﺠـﺎد ﺷﺪه در ﺑﺮﻧﺎﻣﻪ ﺑﺎﺷﺪ.
ﻣﻔﻬﻮم ﻓﻮﻛﻮس:
٢٤٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ ﻫﻨﮕﺎم اﺟﺮاي ﺑﺮﻧﺎﻣﻪ دﻗﺖ ﻛﻨﻴﺪ ،ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ در ﺣﺎل اﺟﺮا اﺳﺖ و ﺷﻤﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ دﻳﮕﺮي ﻣﻲ روﻳـﺪ و ﺳﭙﺲ ﺑﻪ ﻫﻤﻴﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎز ﻣﻴﮕﺮدﻳﺪ ،ﺗﻤﺎم ﻣﺘﻦ وارد ﺷﺪه در ﺟﻌﺒﻪ ﻣﺘﻨﻲ ﺑﻪ ﺻﻮرت اﻧﺘﺨﺎب ﺷﺪه در ﻣﻲ آﻳﺪ .اﻳﻦ ﻣـﻮرد ﺑـﻪ اﻳـﻦ دﻟﻴـﻞ اﺳﺖ ﻛﻪ ﻓﻮﻛﻮس 1ﺑﺮﻧﺎﻣﻪ ﺑﺮ روي ﻛﻨﺘﺮل TextBoxﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ .در اﺻﻄﻼح ،ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻳـﻚ ﻛﻨﺘـﺮل در ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ اﻧﺘﺨﺎب ﺷﻮد ،ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻓﻮﻛﻮس ﺑﺮ روي آن ﻛﻨﺘﺮل ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﺑﻪ ﺷﻜﻞ 15-6دﻗﺖ ﻛﻨﻴﺪ .در اﻳـﻦ ﺷـﻜﻞ دو ﻛﻨﺘﺮل Buttonﺑﺮ روي ﻓﺮم ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ در اﻳﻦ ﻓﺮم ﻳﻜﻲ از ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﺻﻮرت اﻧﺘﺨـﺎب ﺷـﺪه اﺳـﺖ. ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﻛﻠﻴﺪ Enterﻓﺸﺎر داده ﺷﻮد ،ﻫﻤﺎﻧﻨﺪ اﻳﻦ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﺎ ﻣﺎوس ﺑﺮ روي دﻛﻤﻪ ي اﻧﺘﺨـﺎب ﺷـﺪه ﻛﻠﻴـﻚ ﺷـﻮد و ﻛـﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن اﺟﺮا ﻣﻲ ﺷﻮد.
ﺷﻜﻞ 15-6 اﮔﺮ ﭼﻨﺪﻳﻦ ﻛﻨﺘﺮل TextBoxدر ﻳﻚ ﻓﺮم ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﻨﻲ را در ﺑﺮﻧﺎﻣﻪ ﺗﺎﻳﭗ ﻛﻨﻴﺪ ،ﻣﺘﻦ در ﻛﻨﺘﺮﻟﻲ ﻧﻮﺷﺘﻪ ﻣـﻲ ﺷﻮد ﻛﻪ داراي ﻓﻮﻛﻮس اﺳﺖ. ﺑﺮاي اﻳﻦ ﻛﻪ ﺑﻴﻦ ﻛﻨﺘﺮل ﻫﺎي ﻣﻮﺟﻮد در ﻳﻚ ﻓﺮم ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮﻳﺪ و ﻛﻨﺘﺮل دﻳﮕﺮي را ﺑﻪ ﺻﻮرت اﻧﺘﺨﺎب ﺷﺪه در آورﻳﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻛﻠﻴﺪ Tabدر ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل در ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﺷﻜﻞ 15-6اﮔﺮ ﻛﺎرﺑﺮ ﻛﻠﻴﺪ Tabرا ﻓﺸﺎر دﻫﺪ ،دﻛﻤـﻪ ﻓﺮﻣـﺎن " "I do notﺑﻪ ﺻﻮرت اﻧﺘﺨﺎب ﺷﺪه در ﻣﻲ آﻳﺪ .ﺑﺎ ﻓﺸﺎر ﻣﺠﺪد ﻛﻠﻴـﺪ Tabﻓﻮﻛـﻮس ﺑـﻪ دﻛﻤـﻪ ﻓﺮﻣـﺎن "I Have " Focusﺑﺮﻣﻲ ﮔﺮدد. اﻳﻦ ﻛﻪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓﺸﺎر ﻛﻠﻴﺪ Tabﻓﻮﻛﻮس ﭼﮕﻮﻧﻪ ﺑﻴﻦ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در ﻓﺮم ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮد ﺑﻪ ﺻﻮرت اﺗﻔﺎﻗﻲ اﻧﺘﺨﺎب ﻧﻤـﻲ ﺷﻮد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﻃﺮاﺣﻲ ﻓﺮم ،ﻛﻨﺘﺮﻟﻲ را ﺑﺮ روي ﻓﺮم ﻗﺮار ﻣﻲ دﻫﻴﺪ ﻋﺪدي ﺑﻪ ﺧﺎﺻﻴﺖ TabIndexآن ﻛﻨﺘﺮل ﻧﺴﺒﺖ داده ﻣﻲ ﺷﻮد .ﺑﺮاي اوﻟﻴﻦ ﻛﻨﺘﺮل اﻳﻦ ﻋﺪد ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد ،ﺑﺮاي ﻛﻨﺘﺮل دوم ﻳﻚ ،ﺑﺮاي ﻛﻨﺘﺮل ﺳﻮم ﻋﺪد دو و … .ﺑﻨـﺎﺑﺮاﻳﻦ اﮔـﺮ ﻫﻨﮕـﺎم اﺟـﺮاي ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﺪ Tabرا ﻓﺸﺎر دﻫﻴﺪ ،ﻓﻮﻛﻮس ﺑﻪ ﺗﺮﺗﻴﺐ ﻗﺮار ﮔﺮﻓﺘﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﺮ روي ﻓﺮم ﺑﻴﻦ آﻧﻬﺎ ﺟﺎ ﺑﻪ ﺟﺎ ﻣﻲ ﺷﻮد .اﻟﺒﺘﻪ ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻓﺮم ﻣﻲ ﺗﻮاﻧﻴﺪ ﻋﺪد ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ TabIndexرا ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﻓﻮﻛﻮس ﺑﻪ ﺷﻜﻠﻲ ﻛﻪ ﺗﻤﺎﻳﻞ دارﻳﺪ ﺑـﻴﻦ ﻛﻨﺘـﺮل ﻫـﺎ ﺣﺮﻛـﺖ ﻛﻨﺪ. ﻧﻜﺘﻪ :ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻛﻨﺘﺮل ﻟﻴﺒﻞ داراي ﺧﺎﺻﻴﺖ TabIndexاﺳﺖ ،اﻣﺎ ﻫﻨﮕﺎم اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اﻳﻦ ﻛﻨﺘﺮل ﻧﻤﻲ ﺗﻮاﻧﺪ داراي ﻓﻮﻛﻮس ﺑﺎﺷﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻓﻮﻛﻮس ﺑﻪ ﻛﻨﺘﺮل ﺑﻌﺪي ﻣﺎﻧﻨﺪ TextBoxو ﻳﺎ Buttonﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد. ﺗﻐﻴﻴﺮ ﻋﺪد ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ TabIndexﺑﺮاي ﺗﻨﻈﻴﻢ ﺗﻐﻴﻴﺮ ﻓﻮﻛﻮس ﺑﻴﻦ ﻛﻨﺘﺮل ﻫﺎ ﻛﺎر ﻣﺸﻜﻠﻲ اﺳـﺖ .وﻳـﮋوال اﺳـﺘﻮدﻳﻮ 2005 داراي اﺑﺰاري اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮان اﻳﻦ ﻛﺎر را ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ اﻧﺠـﺎم داد .ﮔﺰﻳﻨـﻪ View Tab Orderرا در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻓﺮم ﺷﻤﺎ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 16-6ﺧﻮاﻫﺪ ﺷﺪ. اﻋﺪادي ﻛﻪ در ﻛﻨﺎر ﻛﻨﺘﺮل ﻫﺎ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ ،ﺗﺮﺗﻴﺐ ﺗﻐﻴﻴﺮ ﻓﻮﻛﻮس ﺑﻴﻦ ﻛﻨﺘﺮل ﻫﺎ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .اﻳﻦ اﻋﺪاد ﺑﻪ ﺗﺮﺗﻴﺐ ﻗـﺮار ﮔﺮﻓﺘﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﺮ روي ﻓﺮم ﺗﻨﻈﻴﻢ ﺷﺪه اﻧﺪ .ﺑﺮاي اﻳﻨﻜﻪ اﻳﻦ ﺗﺮﺗﻴﺐ را ﺧﻮدﺗﺎن ﻣﺸﺨﺺ ﻛﻨﻴﺪ ،ﺑﺮ روي اﻳﻦ اﻋﺪاد ﺑﻪ ﺗﺮﺗﻴﺒـﻲ ﻛـﻪ ﻣـﻲ
Focus
1
٢٤٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﻮاﻫﻴﺪ ﻓﻮﻛﻮس ﺗﻐﻴﻴﺮ ﻛﻨﺪ ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﺑﻌـﺪ از ﻣـﺸﺨﺺ ﻛـﺮدن ﺗﺮﺗﻴـﺐ ﺗﻐﻴﻴـﺮ ﻓﻮﻛـﻮس ﻣﺠـﺪدا ﮔﺰﻳﻨـﻪ View Tab Orderرا از ﻧﻮار ﻣﻨﻮي وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ اﻋﺪاد ﻧﻤﺎﻳﺶ داده ﺷﺪه از ﻛﻨﺎر ﻛﻨﺘﺮل ﻫﺎ ﺣﺬف ﺷﻮﻧﺪ.
اﺳﺘﻔﺎده از ﭼﻨﺪﻳﻦ ﻓﺮم در ﺑﺮﻧﺎﻣﻪ: ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي داراي دو ﻧﻮع ﭘﻨﺠﺮه ﻫﺴﺘﻨﺪ :ﭘﻨﺠﺮه ﻫﺎي ﻣﻌﻤﻮﻟﻲ و ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي .ﻳﻚ ﭘﻨﺠﺮه ﻣﻌﻤﻮﻟﻲ ،ﺻﻔﺤﻪ اﺻﻠﻲ راﺑﻂ ﻛﺎرﺑﺮ را در ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﺑﺮاي ﻣﺜﺎل در ﺑﺮﻧﺎﻣﻪ ،Wordﻛﺎرﺑﺮ از ﻳﻚ ﭘﻨﺠﺮه ﻋﺎدي ﻛﻪ ﺻﻔﺤﻪ اﺻﻠﻲ ﺑﺮﻧﺎﻣـﻪ را ﺗـﺸﻜﻴﻞ ﻣﻲ دﻫﺪ ﺑﺮاي وارد ﻛﺮدن و ﻳﺎ وﻳﺮاﻳﺶ ﻣﺘﻦ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ.
ﺷﻜﻞ 16-6 ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻋﻤﻞ ﺧﺎﺻﻲ را در ﺑﺮﻧﺎﻣﻪ اﻧﺠﺎم دﻫﻴﺪ ،ﻳﻚ ﻛﺎدر ﻣﺤﺎوره اي ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .اﻳﻦ ﻧﻮع از ﭘﻨﺠﺮه ﻫﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺑﺴﺘﻪ ﻧﺸﺪه اﻧﺪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎره ﻧﻤﻲ دﻫﻨﺪ ﻛﻪ ﺑﻪ ﺻﻔﺤﻪ اﺻﻠﻲ ﺑﺮﻧﺎﻣـﻪ دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛﻨـﺪ .ﺑـﺮاي ﻣﺜـﺎل اﮔـﺮ در ﺑﺮﻧﺎﻣـﻪ Wordﮔﺰﻳﻨﻪ Printرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﻳﻚ ﻛﺎدر ﻣﺤﺎوره اي ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑـﺮ روي دﻛﻤـﻪ ﻫﺎي OKو ﻳﺎ Cancelﻛﺎدر را ﻧﺒﻨﺪﻳﺪ ،ﻧﺨﻮاﻫﻴﺪ ﺗﻮاﻧﺴﺖ ﻣﺘﻦ داﺧﻞ ﺳﻨﺪ Wordرا ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻛﺎدرﻫﺎﻳﻲ ﻛﻪ ﺑﻪ اﻳﻦ ﺻـﻮرت در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻪ ﻓﺮﻣﻬﺎي ﻣﻘﻴﺪ 1و ﻳﺎ ﻓﺮﻣﻬﺎي ﻣﻮدال ﻣﻌﺮوف ﻫﺴﺘﻨﺪ.
Modal Forms
1
٢٤٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي ﻫﻤﺎﻧﻨﺪ ﻛﺎدر ﻣﺮﺑﻮط ﺑﻪ ﭼﺎپ و ﻳﺎ ﻛﺎدرﻫﺎي ﻣﺸﺎﺑﻪ ﺑﺎ آن ،در ﻓﺼﻞ ﻫﻔﺘﻢ ﺑﺮرﺳﻲ ﺧﻮاﻫﻨﺪ ﺷﺪ .در اﻳﻦ ﺑﺨﺶ ﺑﺮ روي اﺿﺎﻓﻪ ﻛﺮدن ﻓﺮﻣﻬﺎي ﻋﺎدي ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺗﻤﺮﻛﺰ ﺧﻮاﻫﻴﻢ ﻛﺮد و در ﺗﻤﺮﻳﻦ ﺑﻌﺪ ،ﻳﻚ ﻓﺮم ﺳﺎده را ﺑﻪ ﺻﻮرت ﻣﻮدال ﻧﻤﺎﻳﺶ ﺧﻮاﻫﻴﻢ داد.
ﻓﺮم :About ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ داراي ﻳﻚ ﻛﺎدر ﻣﺤﺎوره اي Aboutﻫﺴﺘﻨﺪ ﻛﻪ ﻧﺎم ﺑﺮﻧﺎﻣﻪ و ﻫﻤﭽﻨﻴﻦ ﺣﻘﻮق ﻣﻮﻟﻒ آن را ﺷﺮح ﻣﻲ دﻫـﺪ .در ﺑﺮﻧﺎﻣـﻪ ﻗﺒﻠﻲ ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﺮاي اﻳﻦ ﻗﺴﻤﺖ در ﻧﻮار اﺑﺰار ﻗﺮار دادﻳﻢ .ﺣﺎل ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ آن را اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻓﺮم About (1ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻓﺮم ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﭘﻨﺠﺮه Solution Explorerاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛـﺎر در اﻳﻦ ﭘﻨﺠﺮه ﺑﺮ روي ﻧﺎم ﭘﺮوژه ي Text Editorﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ و از ﻣﻨﻮي ﺑـﺎز ﺷـﺪه ﮔﺰﻳﻨـﻪ Add Windows Formsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .در ﭘﻨﺠـﺮه Add New Item – Text Editorﻫﻤﺎﻧﻨـﺪ ﺷﻜﻞ 17-6در ﻗﺴﻤﺖ Templatesﮔﺰﻳﻨﻪ About Boxرا اﻧﺘﺨـﺎب ﻛـﺮده و ﺳـﭙﺲ در ﻛـﺎدر Nameﻧـﺎم About.csرا وارد ﻛﻨﻴﺪ .در اﻧﺘﻬﺎ ﺑﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻓﺮم ﺟﺪﻳﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﻮد.
ﺷﻜﻞ 17-6 (2ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮاي ﭘﻨﺠﺮه Aboutﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺗﻤﺎم ﻗـﺴﻤﺘﻬﺎﻳﻲ ﻛـﻪ در ﻳﻚ ﻛﺎدر Aboutﻣﻌﻤﻮﻟﻲ وﺟﻮد دارد ،در اﻳﻦ ﻓﺮم ﻧﻴﺰ ﻗﺮار داده ﺷﺪه اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻓﺮم ،داراي ﻗـﺴﻤﺘﻬﺎﻳﻲ ﺑـﺮاي ﻗـﺮار دادن ﻧﺎم ﺑﺮﻧﺎﻣﻪ ،ﻧﺴﺨﻪ ي ﺑﺮﻧﺎﻣﻪ ،اﻃﻼﻋﺎت ﺣﻘﻮق ﻣﻮﻟﻒ و ...اﺳﺖ.
٢٤٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3ﺑﺮ روي ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ و ﮔﺰﻳﻨﻪ View Codeرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺗﺎﺑﻊ ﺳﺎزﻧﺪه ي ﻣﺮﺑﻮط ﺑﻪ ﻛﻼس اﻳﻦ ﻓﺮم داراي ﭼﻨﺪﻳﻦ ﺧﻂ ﻛﺪ اﺳﺖ ﻛﻪ ﻫﻨﮕﺎم ﻧﻤﺎﻳﺶ داده ﺷﺪن ﻓﺮم ،اﻃﻼﻋﺎت ﺑﺮﻧﺎﻣﻪ را در ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟـﻮد در ﻓﺮم ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .در اﺑﺘﺪاي ﻛﺪﻫﺎ ﺗﻮﺿﻴﺤﺎﺗﻲ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﺗﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﻃﻼع دﻫﺪ ﻛﻪ ﺑﺮاي ﻧﻤـﺎﻳﺶ درﺳـﺖ اﻃﻼﻋﺎت در ﻓﺮم ،Aboutﺑﺎﻳﺪ اﻃﻼﻋﺎت ﺑﺮﻧﺎﻣـﻪ را در ﻗـﺴﻤﺖ Assembly Informationﺑﺮﻧﺎﻣـﻪ وارد ﻛﻨﺪ. (4ﺑـﺮ روي ﻧـﺎم ﭘـﺮوژه در ﭘﻨﺠـﺮه Solution Explorerﻛﻠﻴـﻚ راﺳـﺖ ﻛـﺮده و از ﻣﻨـﻮي ﺑـﺎز ﺷـﺪه ﮔﺰﻳﻨـﻪ Propertiesرا اﻧﺘﺨﺎب ﻛﻨﻴـﺪ .ﺻـﻔﺤﻪ ي Applicationاز ﭘﻨﺠـﺮه Propertiesﻣﺮﺑـﻮط ﺑـﻪ ﭘﺮوژه ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .در اﻳﻦ ﺻﻔﺤﻪ ﺑﺮ روي دﻛﻤﻪ ي Assembly Informationﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻛﺎدر Assembly Informationﻧﻤﺎﻳﺶ داده ﺷﻮد .اﻃﻼﻋﺎت ﻧﻮﺷﺘﻪ ﺷﺪه در ﻛﺎدرﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﭘﻨﺠﺮه را ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 18-6ﺗﻐﻴﻴﺮ دﻫﻴﺪ و ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠﺮه ﺑﺴﺘﻪ ﺷﻮد.
ﺷﻜﻞ 18-6 (5ﺣﺎل در ﻓﺮم اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ )ﻓﺮم (TextEditor.csﺑﻪ زﻳﺮﺑﺮﻧﺎﻣﻪ اي ﻧﻴﺎز دارﻳﺪ ﻛﻪ ﻛﺎدر Aboutرا ﻧﻤﺎﻳﺶ دﻫﺪ. ﺑﺮاي اﻳﻦ ﻛﺎر ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم TextEditorرا ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: )(public void ShowAboutBox { // Display the About dialog box ;)(About objAbout = new About ;)objAbout.ShowDialog(this }
٢٤٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(6در اﻧﺘﻬﺎ ﺑﺎﻳﺪ ﻛﺪي ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي آن ﻫﻨﮕﺎم ﻛﻠﻴﻚ ﺷﺪن ﺑﺮ روي دﻛﻤﻪ Aboutدر ﻧﻮار اﺑـﺰار ،ﻓـﺮم About ﻧﻤــﺎﻳﺶ داده ﺷــﻮد .ﺑــﺮاي اﻳــﻦ ﻛــﺎر در ﻗــﺴﻤﺖ ﻃﺮاﺣــﻲ ﻓــﺮم ﻣﺮﺑــﻮط ﺑــﻪ TextEditorﺑــﺮ روي ﻛﻨﺘــﺮل tbrHelpAboutدر ﻧﻮار اﺑﺰار دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳـﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void tbrHelpAbout_Click(object sender, EventArgs e { // Display the about dialog box ;)(ShowAboutBox } (7ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Aboutدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎدري ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ -6 19ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﺷﻜﻞ 19-6
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در زﺑﺎن C#ﻫﺮ ﻓﺮم ،از ﻳﻚ ﻛﻼس ﻫﻢ ﻧﺎم ﺑﺎ ﻓﺮم ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .ﺑﺮاي ﻧﻤﺎﻳﺶ ﻓﺮم اﺑﺘﺪا ﺑﺎﻳﺪ ﻳﻚ ﺷﻴﺊ از آن ﻛﻼس اﻳﺠـﺎد ﻛـﺮد. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻣﺘﺪ ShowAboutBoxﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﺑﺘﺪا از ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم Aboutﻳـﻚ ﺷـﻴﺊ ﺟﺪﻳـﺪ اﻳﺠـﺎد ﻛﺮده اﻳﻢ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ ShowDialogاز ﺷﻴﺊ اﻳﺠﺎد ﺷﺪه ،ﻓﺮم را ﺑﻪ ﺻـﻮرت ﻣـﻮدال در ﺻـﻔﺤﻪ ﻧﻤـﺎﻳﺶ داده اﻳـﻢ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻋﺒﺎرت thisرا ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ اﻳﻦ ﻣﺘﺪ ﻣﻲ ﻓﺮﺳﺘﻴﺪ ،در ﺣﻘﻴﻘﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎدر ﻣﺤﺎوره اي About
٢٤٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم TextEditorاﺳﺖ و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﻛﺎدر ﺑﺴﺘﻪ ﻧﺸﺪه اﺳﺖ ﻛﺎرﺑﺮ ﻧﻤﻲ ﺗﻮاﻧـﺪ ﺑـﻪ ﻓـﺮم TextEditor دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. )(public void ShowAboutBox { // Display the About dialog box ;)(About objAbout = new About ;)objAbout.ShowDialog(this } ﺑﺮاي ﻧﻤﺎﻳﺶ ﻓﺮم Aboutﺑﺎﻳﺪ در روﻳـﺪاد Clickﻣﺮﺑـﻮط ﺑـﻪ ﻛﻨﺘـﺮل tbrHelpAboutزﻳـﺮ ﺑﺮﻧﺎﻣـﻪ ﻧﻮﺷـﺘﻪ ﺷـﺪه را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ: )private void tbrHelpAbout_Click(object sender, EventArgs e { // Display the about dialog box ;)(ShowAboutBox } در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻓﺮﻣﻬﺎي از ﭘﻴﺶ ﻃﺮاﺣﻲ ﺷﺪه زﻳﺎدي وﺟﻮد دارد ﻛﻪ ﺑﺎﻋﺚ ﺗﺴﺮﻳﻊ در ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻲ ﺷﻮد .ﻳﻜﻲ از اﻳﻦ ﻓﺮم ﻫـﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﭘﻨﺠﺮه Aboutاﺳﺖ ﻛﻪ ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن آن ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛـﺎدر Aboutرا در ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺻﻔﺤﻪ Aboutﺑﺨﻮاﻫﺪ در ﺣﺎﻓﻈﻪ ﻗﺮار ﺑﮕﻴﺮد ،ﺗﺎﺑﻊ ﺳﺎزﻧﺪه آن اﺟﺮا ﻣﻲ ﺷﻮد و اﻳﻦ ﺗﺎﺑﻊ ﻧﻴﺰ ﺑـﻪ ﻃـﻮر اﺗﻮﻣﺎﺗﻴـﻚ ﺣـﺎوي ﻛﺪي اﺳﺖ ﻛﻪ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻓﺮم Aboutرا ﺑﺮ اﺳﺎس اﻃﻼﻋﺎت ﺑﺮﻧﺎﻣﻪ ﺗﻜﻤﻴﻞ ﻣﻲ ﻛﻨﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﮔﻔﺘﻢ 1ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﭼﻪ ﺗﻮﻟﻴﺪ ﻛﻨﻨﺪه ي ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ) (EXEﺑﺎﺷﺪ ،ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫـﺎﻳﻲ ﻛـﻪ ﺗـﺎﻛﻨﻮن اﻳﺠﺎد ﻛﺮده اﻳﻢ و ﭼﻪ ﻣﺤﺘﻮي ﻛﻼﺳﻬﺎ و ﺗﻮاﺑﻌﻲ ﺑﺮاي اﺳﺘﻔﺎده در ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﺑﺎﺷﺪ ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ در ﻓﺼﻮل 12و 13اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد ،ﺑﻌﺪ از ﻛﺎﻣﭙﺎﻳﻞ در ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛﻪ ﺑﻪ اﺳﻤﺒﻠﻲ ﻣﻌﺮوف ﻫﺴﺘﻨﺪ ذﺧﻴﺮه ﻣﻲ ﺷـﻮد .ﻫﻤﭽﻨـﻴﻦ ذﻛـﺮ ﺷـﺪ ﻛـﻪ اﻳـﻦ ﻓﺎﻳﻠﻬـﺎ ﺣـﺎوي اﻃﻼﻋﺎﺗﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ اﻃﻼﻋﺎت ﻣﺘﺎ ﻣﻌﺮوف اﺳﺖ و ﺷﺎﻣﻞ ﻣﺸﺨﺼﺎت اﺳﻤﺒﻠﻲ ﻣﻲ ﺷﻮد .ﺣﺎل اﮔﺮ ﺑﻪ ﻛﺪﻫﺎي ﻣﻮﺟﻮد در ﺗﺎﺑﻊ ﺳﺎزﻧﺪه اﻳﻦ ﻓــﺮم ﻧﮕـــﺎﻫﻲ ﺑﻴﻨﺪازﻳــﺪ ،ﻣﺘﻮﺟـــﻪ ﻣــﻲ ﺷـــﻮﻳﺪ ﻛــﻪ اﻳـــﻦ ﻛــﺪﻫﺎ ﺑـــﺎ اﺳــﺘﻔﺎده از ﻛـــﻼس Assemblyدر ﻓــﻀﺎي ﻧـــﺎم System.Reflectionﺑﻪ اﻃﻼﻋـﺎت ﻣﺘـﺎي اﺳـﻤﺒﻠﻲ ﺑﺮﻧﺎﻣـﻪ دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛـﺮده و ﻣﺸﺨـﺼﺎت ﻻزم ﺑـﺮاي ﺻـﻔﺤﻪ Aboutرا از آﻧﻬﺎ اﺳﺘﺨﺮاج ﻣﻲ ﻛﻨﻨﺪ .ﺳﭙﺲ اﻳﻦ اﻃﻼﻋﺎت را در ﻗﺴﻤﺘﻬﺎي ﻣﻨﺎﺳﺐ در ﺻﻔﺤﻪ Aboutﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻓﺮم ﻫﺎ در وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﻣﻲ ﺗﻮان ﺑﻪ راﺣﺘﻲ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ را ﺗﻜﻤﻴﻞ ﻛﺮد.
ﻧﺘﻴﺠﻪ:
1رﺟﻮع ﻛﻨﻴﺪ ﺑﻪ ﻓﺼﻞ دوم "ﭼﺎرﭼﻮب .NETو ارﺗﺒﺎط آن ﺑﺎ "C#
٢٤٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﻓﺼﻞ ﺑﻪ ﻣﻌﺮﻓﻲ وﻳﮋﮔﻴﻬﺎي ﭘﻴﺸﺮﻓﺘﻪ ﺗﺮ ﻓﺮم ﻫﺎ در ﺑﺮﻧﺎﻣﻪ و ﻧﻴﺰ ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮﺟﻮد در وﻳﮋوال اﺳـﺘﻮدﻳﻮ ﭘـﺮداﺧﺘﻴﻢ .ﻃﺒﻴﻌـﺖ روﻳـﺪاد ﮔــﺮاي وﻳﻨــﺪوز را ﺑﺮرﺳــﻲ ﻛــﺮدﻳﻢ و ﺑــﺎ ﺳــﻪ روﻳــﺪاد ﭘــﺮ ﻛــﺎرﺑﺮد ﻛﻨﺘــﺮل دﻛﻤــﻪ ﻓﺮﻣــﺎن ) MouseEnter ،Clickو (MouseLeaveآﺷﻨﺎ ﺷﺪﻳﻢ. در اﺑﺘﺪا ﺑﺮﻧﺎﻣﻪ ﺳﺎده اي اﻳﺠﺎد ﻛﺮدﻳﺪ ﻛﻪ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ داد ﻣﺘﻨﻲ را وارد ﻛﻨﻴﺪ و ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ ﺗﻌﺪاد ﻛﻠﻤـﺎت و ﻳـﺎ ﺗﻌـﺪاد ﻛﺎراﻛﺘﺮﻫـﺎي ﻣﺘﻦ را ﻧﻤﺎﻳﺶ ﻣﻲ داد. ﺳﭙﺲ ﺗﻮﺟﻪ ﺧﻮد را ﺑﺮ روي ﺑﺮﻧﺎﻣﻪ ي ﭘﻴﭽﻴﺪه ﺗﺮي ﻣﺘﻤﺮﻛﺰ ﻛﺮدﻳﻢ و ﺑﺮﻧﺎﻣﻪ اي ﻃﺮاﺣﻲ ﻛﺮدﻳﻢ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﺴﺘﻴﺪ رﻧﮓ و ﻳـﺎ ﺣﺎﻟﺖ ﺣﺮوف وارد ﺷﺪه در آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .در اﻳﻦ ﭘﺮوژه ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﻧـﻮار اﺑـﺰار و ﻧـﻮار وﺿـﻌﻴﺖ، ﻗﺎﺑﻠﻴﺘﻬﺎي ﺑﺮﻧﺎﻣﻪ را اﻓﺰاﻳﺶ داد .ﻫﻤﭽﻨﻴﻦ ﻓﺮم دﻳﮕﺮي اﺿﺎﻓﻪ ﻛﺮدﻳﻢ ﺗﺎ اﻃﻼﻋﺎت ﻣﺨﺘﺼﺮي از ﻗﺒﻴﻞ ﻧﺎم ﺑﺮﻧﺎﻣﻪ ،ﻧـﺴﺨﻪ ﺑﺮﻧﺎﻣـﻪ و ﺣﻘـﻮق ﻣﻮﻟﻒ آن را ﻧﻤﺎﻳﺶ دﻫﺪ. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﻧﻮﺷﺘﻦ ﻛﺪي ﻛﻪ ﺑﻪ روﻳﺪادﻫﺎي ﻣﺨﺘﻠﻒ ﻳﻚ ﻛﻨﺘﺮل ﭘﺎﺳﺦ دﻫﺪ. ﺧﺎﺻﻴﺘﻬﺎي ﻳﻚ ﻛﻨﺘﺮل را ﺑﺮاي ﺗﻨﻈﻴﻢ ﻇﺎﻫﺮ آن ﻛﻨﺘﺮل ﺗﻐﻴﻴﺮ دﻫﻴﺪ. از ﻛﻨﺘﺮﻟﻬﺎي ToolStripو StatusStripﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﻮار اﺑﺰار و ﻧﻮار وﺿﻌﻴﺖ در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. در ﺑﺮﻧﺎﻣﻪ ﺧﻮد از ﺑﻴﺶ از ﻳﻚ ﻓﺮم اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﺗﻤﺮﻳﻦ:
ﺗﻤﺮﻳﻦ :1 ﻳﻚ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي اﻳﺠﺎد ﻛﻨﻴﺪ و ﺑﻪ وﺳﻴﻠﻪ ﺟﻌﺒـﻪ اﺑـﺰار ،دو دﻛﻤـﻪ ﻓﺮﻣـﺎن ﺑـﺮ روي ﻓـﺮم ﺑﺮﻧﺎﻣـﻪ ﻗـﺮار دﻫﻴـﺪ .ﻣﺘـﺪي ﺑـﺮاي روﻳـﺪاد MouseUpدﻛﻤﻪ ﻓﺮﻣﺎن اول ﺑﻪ وﺟﻮد آورﻳﺪ و در آن ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ دﻫﻴﺪ .ﻫﻤﻴﻦ ﻛﺎر را ﺑﺮاي روﻳـﺪاد LostFocus دﻛﻤﻪ ﻓﺮﻣﺎن دوم ﺗﻜﺮار ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ روﻳﺪادﻫﺎ ﭼﻪ ﻫﻨﮕﺎم رخ ﻣﻲ دﻫﻨﺪ.
ﺗﻤﺮﻳﻦ :2 ﻳﻚ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي اﻳﺠﺎد ﻛﻨﻴﺪ و ﻳﻚ ﻧﻮار اﺑﺰار و ﻳﻚ ﻧﻮار وﺿﻌﻴﺖ ﺑﺮ روي ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻗﺮار دﻫﻴﺪ .در ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﻃﺮاﺣـﻲ ﻓـﺮم ﺑـﺮ روي ﻛﻨﺘﺮل ToolStripﻛﻠﻴﻚ راﺳﺖ ﻛﺮده و ﮔﺰﻳﻨﻪ Insert Standard Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ دﻛﻤـﻪ ﻫﺎي ﻓﺮﻣﺎن اﺳﺘﺎﻧﺪارد ﻧﻮار اﺑﺰار ﺑﻪ آن اﺿﺎﻓﻪ ﺷﻮﻧﺪ .ﺑﺮاي روﻳﺪاد ﻛﻠﻴﻚ ﻫﺮ ﻛﺪام از اﻳﻦ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ﻛﺪي را اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ﻛـﻪ ﺑـﺎ ﻧﻤﺎﻳﺶ ﭘﻴﻐﺎﻣﻲ در ﻧﻮار وﺿﻌﻴﺖ ﻣﺸﺨﺺ ﻛﻨﺪ ﻛﺪام دﻛﻤﻪ ﻓﺮﻣﺎن ﻓﺸﺎر داده ﺷﺪه اﺳﺖ.
٢٤٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﻫﻔﺘﻢ :ﻧﻤﺎﻳﺶ ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي وﻳﮋوال 2005 C#داراي ﭼﻨﺪﻳﻦ ﻛﺎدر ﻣﺤﺎوره اي دروﻧﻲ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ در ﻃﺮاﺣﻲ ﻇﺎﻫﺮ ﺑﺮﻧﺎﻣﻪ ،ﻛﻤﻚ زﻳﺎدي ﻛﻨﺪ .اﻳﻦ ﻛﺎدرﻫﺎ ،در ﺣﻘﻴﻘﺖ ﻫﻤﺎن ﭘﻨﺠﺮه ﻫﺎي ﻋﻤﻮﻣﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وﻳﻨﺪوز ﻣـﺸﺎﻫﺪه ﻛـﺮده اﻳـﺪ .ﺑـﻪ ﻋـﻼوه اﻳـﻦ ﻛﺎدرﻫـﺎ داراي ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻓﺮاواﻧﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﻛﺎدرﻫﺎ را ﺑﺎ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد ﻫﻤﺎﻫﻨﮓ ﻛﻨﻴﺪ. در اﻳﻦ ﻓﺼﻞ:
ﺑﺎ روﺷﻬﺎي ﻣﺨﺘﻠﻒ اﻳﺠﺎد ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑﺎ آﻳﻜﻮﻧﻬﺎ و ﻳﺎ دﻛﻤﻪ ﻫﺎي ﮔﻮﻧﺎﮔﻮن آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﺑﺎ ﻧﺤﻮه ي اﻳﺠﺎد ﻳﻚ ﻛﺎدر Openﻛﻪ ﺑﺘﻮاﻧﻴﺪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻓﺎﻳﻠﻬﺎ از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﻳﻚ ﻛﺎدر Saveﻛﻪ ﺑﺘﻮاﻧﻴﺪ از آن ﺑﺮاي ذﺧﻴﺮه اﻃﻼﻋﺎت ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎدر Fontﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻓﻮﻧﺖ ﻣﻮرد ﻧﻈـﺮ ﺧـﻮد را اﻧﺘﺨـﺎب ﻛﻨﺪ. ﺑﺎ ﻛﺎدر Colorو ﻣﻮارد اﺳﺘﻔﺎده از آن در ﺑﺮﻧﺎﻣﻪ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎدر Printﻗﺎﺑﻠﻴﺘﻬﺎي ﻣﺮﺑﻮط ﺑﻪ اﻣﻮر ﭼﺎپ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد.
در اﻳﻦ ﻓﺼﻞ ،اﻳﻦ ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي را ﺑﻪ ﺗﻔﺼﻴﻞ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﺧﻮاﻫﻴﻢ داد و ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﻪ وﺳﻴﻠﻪ آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ داراي ﻇﺎﻫﺮي ﺣﺮﻓﻪ اي ﺗﺮ ﻫﺴﺘﻨﺪ را ﻃﺮاﺣﻲ ﻛﻨﻴﻢ.
ﻛﺎدر ﻣﺤﺎوره اي :MessageBox ﻫﻤﺎﻧﻄﻮر ﻛﻪ از اﺑﺘﺪاي ﻛﺘﺎب ﺗﺎ ﻛﻨﻮن ﻣﺘﻮﺟﻪ ﺷﺪه اﻳﺪ ،ﻛﺎدر MessageBoxﻳﻜﻲ از ﻛﺎدرﻫﺎﻳﻲ اﺳﺖ ﻛﻪ در اﻏﻠﺐ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد .از اﻳﻦ ﻛﺎدر ﻋﻤﻮﻣﺎً ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﭘﻴﻐﺎم ﺑﻪ ﻛﺎرﺑﺮ و درﻳﺎﻓﺖ ﺟﻮاب ﻛﺎرﺑﺮ ﺑﻪ آن ﭘﻴﻐﺎم اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﺑﻪ ﺻﻮرت ﻳﻜﻨﻮاﺧﺖ از اﻳﻦ ﻛﺎدر اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ ،اﻣﺎ اﻳﻦ ﻛﺎدر ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮ اﺳﺎس ﻣﻮﻗﻌﻴـﺖ ﺑﺮﻧﺎﻣـﻪ داراي ﻇﺎﻫﺮي ﻣﺘﻔﺎوت ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﻢ ﻋﻼوه ﺑﺮ ﻧﻤﺎﻳﺶ ﻣﺘﻦ در آن ،آﻳﻜﻮن ﺧﺎﺻﻲ را ﻧﻴﺰ ﺑﺮاي آن ﻣﺸﺨﺺ ﻛﻨﻴﻢ و ﻳﺎ دﻛﻤﻪ ﻫﺎي دﻳﮕﺮي ﺑﻪ ﺟﺰ دﻛﻤﻪ OKدر آن ﻗﺮار دﻫﻴﻢ. در اﺳﺘﻔﺎده ي روزﻣﺮه از ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ،ﻛﺎدرﻫﺎي ﭘﻴﻐﺎم ﮔﻮﻧﺎﮔﻮﻧﻲ را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ داراي آﻳﻜﻮﻧﻬـﺎﻳﻲ ﻣﺎﻧﻨـﺪ آﻳﻜﻮﻧﻬـﺎي ﺷﻜﻞ 1-7ﻫﺴﺘﻨﺪ .در اﻳﻦ ﺑﺨﺶ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان از اﻳﻦ آﻳﻜﻮﻧﻬﺎ در ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي اﺳﺘﻔﺎده ﻛﺮد.
ﺷﻜﻞ 1-7 ﻫﻨﮕﺎم اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ،در ﻣﻮاﻗﻌﻲ ﻧﻴﺎز دارﻳﺪ ﻛﻪ ﻣﻮردي را ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع دﻫﻴﺪ و ﻳﺎ ﺑﻪ ﻛﺎرﺑﺮ ﻫﺸﺪار دﻫﻴﺪ ﻛﻪ ﻳـﻚ ﭘﻴـﺸﺎﻣﺪ ﻏﻴﺮ ﻣﻨﺘﻈﺮه رخ داده اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻛﺎرﺑﺮ اﻃﻼﻋﺎﺗﻲ از ﺑﺮﻧﺎﻣﻪ را ﺗﻐﻴﻴﺮ داده اﺳﺖ و ﺑﺪون ذﺧﻴﺮه ﻛـﺮدن ﺗﻐﻴﻴـﺮات ﺳـﻌﻲ در ﺑﺴﺘﻦ ﺑﺮﻧﺎﻣﻪ دارد .در اﻳﻦ ﺣﺎﻟﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﺣﺎوي آﻳﻜﻮن ﻫﺸﺪار )ﺳﻮﻣﻴﻦ آﻳﻜـﻮن از ﭼـﭗ( و ﻳـﺎ آﻳﻜـﻮن اﻃﻼﻋـﺎت )اوﻟـﻴﻦ آﻳﻜﻮن از ﭼﭗ( و ﻳﻚ ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ دﻫﻴﺪ و ﺑﮕﻮﻳﻴﺪ ﻛﻪ در ﺻﻮرت ﺑﺴﺘﻪ ﺷﺪه ﺑﺮﻧﺎﻣﻪ ﺗﻤﺎم اﻃﻼﻋـﺎت ذﺧﻴـﺮه ﻧـﺸﺪه از
٢٥٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻴﻦ ﻣﻲ روﻧﺪ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ دﻛﻤﻪ ﻫﺎي OKو Cancelرا در ﻛﺎدر ﭘﻴﻐﺎم ﻗﺮار دﻫﻴﺪ ﺗﺎ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﺑﻪ ﺑﺴﺘﻦ ﺑﺮﻧﺎﻣﻪ اداﻣﻪ دﻫﺪ و ﻳﺎ اﻳﻦ ﻋﻤﻞ را ﻟﻐﻮ ﻛﻨﺪ. در ﻣﻮاردي ﻣﺸﺎﺑﻪ ﻣﻮرد ﺑﺎﻻ ،اﺳﺘﻔﺎده از ﻛﺎدر ﭘﻴﻐﺎم ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺗﺴﺮﻳﻊ ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻛﻤﻚ ﻛﻨﺪ .زﻳﺮا ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻧﻤـﺎﻳﺶ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻣﻨﺎﺳﺐ ﺷﺎﻣﻞ آﻳﻜﻮن و دﻛﻤﻪ ﻫﺎي ﻣﻮرد ﻧﻈﺮ ،ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ در ﻣﻮرد ﻳـﻚ ﻣـﺴﺌﻠﻪ ﺧـﺎص ﺗـﺼﻤﻴﻢ ﮔﻴـﺮي ﻛﻨـﺪ. ﻫﻤﭽﻨﻴﻦ ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎدر ﭘﻴﻐﺎم در ﺑﺨﺶ ﻣﺪﻳﺮﻳﺖ ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﻄﺎﻫﺎي اﺗﻔﺎق اﻓﺘﺎده در ﺑﺮﻧﺎﻣﻪ را ﺑﺎ آﻳﻜﻮن و دﻛﻤﻪ ﻫﺎي ﻣﻨﺎﺳﺐ ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع دﻫﻴﺪ. ﻗﺒﻞ از اﻳﻨﻜﻪ اﺳﺘﻔﺎده از ﻛﺎدرﻫﺎي ﭘﻴﻐﺎم ﮔﻮﻧﺎﮔﻮن را در ﻛﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ،اﺑﺘﺪا ﺑﻬﺘﺮ اﺳﺖ ﺑﺎ ﻛـﻼس MessageBoxآﺷـﻨﺎ ﺷـﻮﻳﻢ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ اﻳﻦ ﻛﻼس داراي ﻣﺘﺪي ﺑﻪ ﻧﺎم Showاﺳﺖ ﻛﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑـﻪ ﻛـﺎر ﻣـﻲ رود .ﻋﻨـﻮان ﻛـﺎدر ﭘﻴﻐﺎم ،ﻣﺘﻦ ﻧﻤﺎﻳﺶ داده ﺷﺪه در آن ،آﻳﻜﻮﻧﻬﺎ و ﻧﻴﺰ دﻛﻤﻪ ﻫﺎي ﻓﺮﻣﺎن ﻛﺎدر ﭘﻴﻐﺎم ﻫﻤﻪ ﺑﻪ وﺳﻴﻠﻪ ﭘﺎراﻣﺘﺮﻫﺎي اﻳﻦ ﻣﺘﺪ ﻣﺸﺨﺺ ﻣﻲ ﺷﻮﻧﺪ. اﻳﻦ ﻣﻮرد در اﺑﺘﺪا ﻣﻤﻜﻦ اﺳﺖ ﻣﻘﺪاري ﭘﻴﭽﻴﺪه ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ ،اﻣﺎ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ اﺳﺘﻔﺎده از آن ﺑﺴﻴﺎر ﺳﺎده اﺳﺖ.
آﻳﻜﻮﻧﻬﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم: آﻳﻜﻮن ﻫﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم را در ﺷﻜﻞ 1-7ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ .در ﺟﺪول زﻳﺮ ﭼﻬﺎر آﻳﻜﻮن ﻗﺎﺑﻞ اﺳـﺘﻔﺎده در ﻛـﺎدر ﭘﻴﻐـﺎم آورده ﺷﺪه اﺳﺖ .در ﺣﻘﻴﻘﺖ آﻳﻜﻮن ﻣﻮرد اﺳﺘﻔﺎده در اﻳﻦ ﻗﺴﻤﺖ از ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد و ﻓﻌﻼً ﭼﻬﺎر آﻳﻜﻮن ﺑﺮاي اﻳﻦ ﻣـﻮارد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺮاي ﻫﻤﺎﻫﻨﮕﻲ ﺑﻌﻀﻲ از آﻧﻬﺎ داراي ﭼﻨﺪ ﻧﺎم ﻫﺴﺘﻨﺪ: ﻧﺎم ﻋﻀﻮ
ﺗﻮﺿﻴﺢ
Asterisk
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن اﻃﻼﻋﺎت در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Information
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن اﻃﻼﻋﺎت در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Error
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن ﺧﻄﺎ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Hand
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن ﺧﻄﺎ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Stop
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن ﺧﻄﺎ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Exclamation
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن ﻫﺸﺪار در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Warning
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ آﻳﻜﻮن ﻫﺸﺪار در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
Question
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ ﻋﻼﻣﺖ ﺳﻮال در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﺷﻮد.
None
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﻜﻮﻧﻲ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻧﺸﻮد.
دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد ﺑﺮاي ﻛﺎدر ﭘﻴﻐﺎم: در ﻫﺮ ﻛﺎدر ﭘﻴﻐﺎم ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻜﻲ از ﭼﻨﺪﻳﻦ ﮔﺮوه دﻛﻤﻪ ي ﻣﻮﺟﻮد را ﻧﻤﺎﻳﺶ دﻫﻴﺪ .در ﺟﺪول زﻳﺮ ﮔﺰﻳﻨﻪ ﻫﺎي ﻗﺎﺑﻞ اﻧﺘﺨـﺎب ﺑـﺮاي اﻳـﻦ ﻣﻮرد ﺷﺮح داده ﺷﺪه اﻧﺪ:
٢٥١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﺎم ﻋﻀﻮ
ﺷﺮح
AbortRetryIgnore
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ ﻫـﺎي Retry ،Abortو Cancel ﺑﺎﺷﺪ.
OK
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ OKﺑﺎﺷﺪ.
OKCancel
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ ﻫﺎي OKو Cancelﺑﺎﺷﺪ.
RetryCancel
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ ﻫﺎي Retryو Cancelﺑﺎﺷﺪ.
YesNo
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ ﻫﺎي Yesو Noﺑﺎﺷﺪ.
YesNoCancel
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﺷﺎﻣﻞ دﻛﻤﻪ ﻫﺎي Yesو Noو Cancelﺑﺎﺷﺪ.
ﺗﻨﻈﻴﻢ دﻛﻤﻪ ي ﭘﻴﺶ ﻓﺮض: ﻫﻨﮕﺎم ﺗﻨﻈﻴﻢ وﻳﮋﮔﻴﻬﺎي ﻣﺨﺘﻠﻒ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑﺮاي ﻧﻤﺎﻳﺶ ،ﻋﻼوه ﺑﺮ ﻣﺸﺨﺺ ﻛﺮدن دﻛﻤﻪ ﻫﺎي آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣـﺸﺨﺺ ﻛﻨﻴـﺪ ﻛـﻪ ﻛﺪام دﻛﻤﻪ ﺑﻪ ﻋﻨﻮان ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ وﻳﮋﮔﻲ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ در ﺑﻴﻦ دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻛﺎدر ،ﻛﺪام دﻛﻤﻪ ﺑﺎﻳﺪ داراي ﻓﻮﻛﻮس ﺑﺎﺷﺪ .ﺑﺎ ﺗﻨﻈﻴﻢ اﻳﻦ ﻣﻮرد ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻛﻪ ﺑﻌـﺪ از ﺧﻮاﻧـﺪن ﻣـﺘﻦ ﻛـﺎدر ﭘﻴﻐﺎم ،ﺑﺎ ﻓﺸﺎر دادن ﻛﻠﻴﺪ Enterو ﺑﺪون ﺣﺮﻛﺖ ﻣﺎوس ،دﻛﻤﻪ ي ﭘﻴﺶ ﻓﺮض را اﻧﺘﺨﺎب ﻛﻨﺪ .ﺑﺮاي ﺗﻨﻈﻴﻢ اﻳﻦ ﻣﻮرد ﺑﺎﻳﺪ از ﺷﻤﺎرﻧﺪه MessageBoxDefaultButtonاﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ ﺷﺮح ﮔﺰﻳﻨﻪ ﻫﺎي آن در ﺟﺪول زﻳﺮ آﻣﺪه اﺳﺖ: ﻧﺎم ﻋﻀﻮ
ﺷﺮح
Button 1
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻛﻤﻪ اول در ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد.
Button 2
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻛﻤﻪ دوم در ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد.
Button 3
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻛﻤﻪ ﺳﻮم در ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد.
ﺗﺮﺗﻴﺐ اﻳﻦ دﻛﻤﻪ ﻫﺎ از ﺳﻤﺖ ﭼﭗ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در ﻛﺎدر ﭘﻴﻐﺎم ﺳﻪ دﻛﻤﻪ Yesو Noو Cancelداﺷﺘﻪ ﺑﺎﺷﻴﺪ و دﻛﻤﻪ ﺳﻮم را ﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﭘﻴﺶ ﻓﺮض ﻣﺸﺨﺺ ﻛﻨﻴﺪ ،دﻛﻤﻪ Cancelﭘﻴﺶ ﻓﺮض ﺧﻮاﻫﺪ ﺑﻮد .ﻫﻤﭽﻨـﻴﻦ اﮔـﺮ در ﻛـﺎدر ﭘﻴﻐﺎم دو دﻛﻤﻪ Yesو Noداﺷﺘﻪ ﺑﺎﺷﻴﺪ و دﻛﻤﻪ ﺳﻮم را ﺑﻪ ﻋﻨﻮان ﭘﻴﺶ ﻓﺮض ﻣﺸﺨﺺ ﻛﻨﻴﺪ ،دﻛﻤﻪ Yesﭘﻴﺶ ﻓﺮض ﺧﻮاﻫﺪ ﺑﻮد.
ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﻛﺎدر ﭘﻴﻐﺎم:
٢٥٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻨﮕــﺎم ﻛــﺎر ﺑــﺎ ﻛــﺎدر ﭘﻴﻐــﺎم ﻋــﻼوه ﺑــﺮ ﮔﺰﻳﻨــﻪ ﻫــﺎي ﺑــﺎﻻ ،ﻣــﻮارد دﻳﮕــﺮي ﻧﻴــﺰ ﻗﺎﺑــﻞ ﺗﻨﻈــﻴﻢ اﺳــﺖ ﻛــﻪ در ﺷــﻤﺎرﻧﺪه MessageBoxOptionsﻗﺮار دارد .ﺑﻌﻀﻲ از ﻣﻮارد ﭘﺮ ﻛﺎرﺑﺮد ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﻗﺎﺑﻞ ﺗﻨﻈﻴﻢ ﻫﺴﺘﻨﺪ ،در ﺟﺪول زﻳﺮ ﺗﻮﺿﻴﺢ داده ﺷﺪه اﻧﺪ: ﻧﺎم ﻋﻀﻮ
ﺷﺮح
RightAlign
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﺘﻦ داﺧﻞ ﻛﺎدر ﭘﻴﻐﺎم ﺑﺎﻳﺪ از ﺳﻤﺖ راﺳﺖ ﻧﻮﺷﺘﻪ ﺷﻮد .اﻳـﻦ ﺣﺎﻟـﺖ ﺑـﺮ ﻋﻜـﺲ ﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض اﺳﺖ ﻛﻪ ﻣﺘﻦ از ﺳﻤﺖ ﭼﭗ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد.
RTLReading
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎدر ﭘﻴﻐﺎم ﺑﺎﻳﺪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﺘﻦ راﺳﺖ ﺑﻪ ﭼﭗ ،ﺗﻨﻈﻴﻢ ﺷﻮد .اﻳﻦ ﺣﺎﻟﺖ ﺑـﺮاي ﻧﻤﺎﻳﺶ ﻣﺘﻦ ﺑﻪ زﺑﺎﻧﻬﺎﻳﻲ ﻣﻨﺎﺳﺐ اﺳﺖ ﻛﻪ از راﺳﺖ ﺑﻪ ﭼﭗ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷـﻮﻧﺪ )ﻣﺎﻧﻨـﺪ ﻓﺎرﺳـﻲ( .ﺑـﺮاي ﻣﺜﺎل در اﻳﻦ ﺣﺎﻟﺖ آﻳﻜﻮن ﻛﺎدر ﭘﻴﻐﺎم در ﺳﻤﺖ راﺳﺖ ﻣﺘﻦ ﻗﺮار ﻣﻲ ﮔﻴﺮد.
ﺣﺎﻟﺘﻬﺎي ﻣﺨﺘﻠﻒ اﺳﺘﻔﺎده از ﻣﺘﺪ :Show ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم از ﻣﺘﺪ Showﻛﻼس MessageBoxاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﻛﺪي ﻛﻪ در زﻳـﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻣﺘﺪ Showرا ﺑﻪ ﮔﻮﻧﻪ اي ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﻣﺸﺎﺑﻪ ﺷﻜﻞ 2-7را ﻧﻤﺎﻳﺶ دﻫﺪ .در اﻳﻦ ﻛﺪ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ اول ﺑﻪ ﻣﺘﺪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد و ﺑﻪ دﻧﺒﺎل آن ﻧﻴﺰ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ در ﻧـﻮار ﻋﻨـﻮان ﻛـﺎدر ﻗﺮار ﺑﮕﻴﺮد وارد ﻣﻲ ﺷﻮد .ﺳﭙﺲ دﻛﻤﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد و ﻧﻴﺰ آﻳﻜﻮن ﻛﺎدر ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ .در اﻧﺘﻬﺎ ﻧﻴﺰ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ ﻛﻪ ﻛﺪام دﻛﻤﻪ ﻓﺮﻣﺎن ﺑﻪ ﻋﻨﻮان ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد. MessageBox.Show("My Text", "My Caption", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, ;)MessageBoxDefaultButton.Button1
ﺷﻜﻞ 2-7 ﺣﺎل ﻛـﻪ ﺑـﺎ آﻳﻜﻮﻧﻬـﺎ و دﻛﻤـﻪ ﻫـﺎي ﻗﺎﺑـﻞ اﺳـﺘﻔﺎده در ﻛـﺎدر ﭘﻴﻐـﺎم آﺷـﻨﺎ ﺷـﺪﻳﺪ ،ﺑﻬﺘـﺮ اﺳـﺖ ﺑـﻪ ﺑﺮرﺳـﻲ ﻣﺘـﺪ Showاز ﻛـﻼس MessageBoxﺑﭙﺮدازﻳﻢ .اﻳﻦ ﻣﺘﺪ ﺑﻪ ﭼﻨﺪﻳﻦ روش ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ و ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﭘﺎراﻣﺘﺮﻫﺎي ﮔﻮﻧﺎﮔﻮﻧﻲ را ﺑﻪ آن ارﺳﺎل ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل در ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ از اﺑﺘﺪاي ﻛﺘﺎب ﺗﺎﻛﻨﻮن ﻧﻮﺷﺘﻪ اﻳﻢ ،ﺗﻨﻬﺎ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﺪ را ﺑﻪ اﻳﻦ ﻣﺘﺪ ﻣﻲ ﻓﺮﺳﺘﺎدﻳﻢ ،اﻣﺎ در ﻣﺜﺎل ﻗﺒﻞ ﺑﻴﺸﺘﺮ ﺟﺰﺋﻴﺎت ﻛﺎدر ﭘﻴﻐﺎم را ﺑﺮاي ﻣﺘﺪ ﻣﺸﺨﺺ ﻛﺮدﻳﻢ .ﭘﺮ ﻛﺎرﺑﺮد ﺗﺮﻳﻦ ﻧﻮﻋﻬﺎي ﻓﺮاﺧـﻮاﻧﻲ اﻳـﻦ ﻣﺘـﺪ در ﻟﻴﺴﺖ زﻳﺮ آﻣﺪه اﺳﺖ:
٢٥٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)MessageBox.Show(Text )MessageBox.Show(Text,Caption )MessageBox.Show(Text,Caption,Button )MessageBox.Show(Text,Caption,Button,Icon MessageBox.Show(Text,Caption,Button,Icon,DefaultButton )
در اﻳﻦ ﻟﻴﺴﺖ ﭘﺎراﻣﺘﺮ Textﻛﻪ ﻳﻚ ﭘﺎراﻣﺘﺮ اﺟﺒﺎري اﺳﺖ ،ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺘﻨﻲ اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ﺗﻮﺳﻂ ﻛﺎدر ﻧﻤـﺎﻳﺶ داده ﺷـﻮد و ﻣـﻲ ﺗﻮاﻧﺪ ﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ و ﻳﺎ ﻳﻚ ﻣﺘﻐﻴﺮ رﺷﺘﻪ اي ﺑﺎﺷﺪ .ﺑﻘﻴﻪ ﭘﺎراﻣﺘﺮﻫﺎي اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﺻﻮرت اﺧﺘﻴﺎري ﻫﺴﺘﻨﺪ:
:Captionﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺘﻨﻲ اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ در ﻧﻮار ﻋﻨﻮان ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد .اﮔﺮ اﻳﻦ ﭘﺎراﻣﺘﺮ ﺑﻪ ﺗـﺎﺑﻊ ﻓﺮﺳـﺘﺎده ﻧﺸﻮد ،ﻣﺘﻨﻲ در ﻧﻮار ﻋﻨﻮان ﻧﻤﺎﻳﺶ داده ﻧﻤﻲ ﺷﻮد. :Buttonﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﻘﺪاري از ﺷﻤﺎرﻧﺪه MessageBoxButtonsاﺳﺖ .اﻳﻦ ﭘـﺎراﻣﺘﺮ ﺑـﻪ ﺷـﻤﺎ اﻳـﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﻛﻪ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ ﻛﺪام دﻛﻤﻪ ﻫﺎ در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ .اﮔﺮ اﻳﻦ ﭘﺎراﻣﺘﺮ ﺣﺬف ﺷﻮد ،ﻓﻘﻂ دﻛﻤـﻪ OKدر ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. :Iconﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﻘﺪاري از ﺷﻤﺎرﻧﺪه MessageBoxIconاﺳﺖ و ﺑﺮاي ﺗﻌﻴﻴﻦ آﻳﻜﻮﻧﻲ ﻛﻪ ﺑﺎﻳﺪ در ﻛـﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد ﺑﻪ ﻛﺎر ﻣﻲ رود .اﮔﺮ اﻳﻦ ﭘﺎراﻣﺘﺮ ﺣﺬف ﺷﻮد آﻳﻜﻮﻧﻲ در ﻛﺎرد ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻧﺨﻮاﻫﺪ ﺷﺪ. :DefaultButtonﻣــﺸﺨﺺ ﻛﻨﻨــﺪه ﻣﻘــﺪاري از ﺷــﻤﺎرﻧﺪه MessageBoxDefaultButton اﺳﺖ و ﺑﺮاي ﺗﻌﻴﻴﻦ دﻛﻤﻪ ﻓﺮﻣﺎن ﭘﻴﺶ ﻓﺮض در ﻓﺮم ﺑﻪ ﻛﺎر ﻣﻲ رود .اﮔﺮ اﻳﻦ ﻣﻘﺪار در ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﺗﻌﻴﻴﻦ ﻧﺸﻮد ،دﻛﻤﻪ اول ﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﻓﺮﻣﺎن ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد.
ﺗﻤﺎم ﺣﺎﻟﺘﻬﺎي ﻣﺘﺪ Showﻛﻪ در ﺑﺎﻻ ذﻛﺮ ﺷﺪ ﻣﻘـﺪاري را از ﻧـﻮع ﺷـﻤﺎرﻧﺪه DialogResultﺑﺮﻣـﻲ ﮔﺮداﻧﻨـﺪ .اﻳـﻦ ﻣﻘـﺪار ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﺪاﻣﻴﻚ از دﻛﻤﻪ ﻫﺎي ﻛﺎدر ﭘﻴﻐﺎم ﺗﻮﺳﻂ ﻛـﺎرﺑﺮ اﻧﺘﺨـﺎب ﺷـﺪه اﺳـﺖ .در ﺟـﺪول زﻳـﺮ ﺗﻤـﺎم ﮔﺰﻳﻨـﻪ ﻫـﺎي ﺷـﻤﺎرﻧﺪه DialogResultﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ. ﻧﺎم ﻋﻀﻮ
ﺷﺮح
Abort
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Abortاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Abortﻛﻠﻴﻚ ﻛﺮده اﺳﺖ.
Cancel
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Cancelاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤـﻪ Cancelﻛﻠﻴـﻚ ﻛـﺮده اﺳﺖ.
Ignore
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Ignoreاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤـﻪ Ignoreﻛﻠﻴـﻚ ﻛـﺮده اﺳﺖ.
No
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Noاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Noﻛﻠﻴﻚ ﻛﺮده اﺳﺖ.
None
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Noneاﺳﺖ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫﻨﻮز ﮔﺰﻳﻨﻪ اي از ﻛﺎدر ﭘﻴﻐﺎم ﺗﻮﺳﻂ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﻧﺸﺪه اﺳﺖ.
OK
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Cancelاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤـﻪ Cancelﻛﻠﻴـﻚ ﻛـﺮده اﺳﺖ.
٢٥٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Retry
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Retryاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Retryﻛﻠﻴﻚ ﻛﺮده اﺳﺖ.
Yes
ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ Yesاﺳﺖ و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Yesﻛﻠﻴﻚ ﻛﺮده اﺳﺖ.
ﻛﺎدرﻫﺎي ﭘﻴﻐﺎم ﻧﻤﻮﻧﻪ: در ﻣﻮاردي ﻛﻪ ﻓﻘﻂ ﻳﻚ دﻛﻤﻪ در ﻛﺎدر ﭘﻴﻐﺎم ﺑﻪ ﻛﺎر ﻣﻲ رود ﻧﻴﺎزي ﺑﻪ ﺑﺮرﺳﻲ ﻧﺘﻴﺠﻪ ﻛﺎدر ﭘﻴﻐﺎم ﻧﺪارﻳﻢ ،اﻣﺎ اﮔﺮ در ﻛﺎدر ﭘﻴﻐﺎم از ﺑـﻴﺶ از ﻳﻚ دﻛﻤﻪ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﺑﻌﺪ از ﻧﻤﺎﻳﺶ ﺑﺎﻳﺪ ﻧﺘﻴﺠﻪ را ﻧﻴﺰ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧﻪ ﻣـﻲ ﺗﻮان ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم ﺑﺎ ﺑﻴﺶ از ﻳﻚ دﻛﻤﻪ ﻧﻤﺎﻳﺶ داد و ﺳﭙﺲ ﻣﺸﺨﺺ ﻛﺮد ﻛﻪ ﻛﺎرﺑﺮ ﻛﺪام دﻛﻤﻪ را اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻛﺎدر ﭘﻴﻐﺎم ﺑﺎ دو دﻛﻤﻪ (1
(2 (3 (4
وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را اﺟﺮا ﻛﺮده و از ﻧﻮار ﻣﻨﻮ ،ﮔﺰﻳﻨﻪ … File New Projectرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. در ﭘﻨﺠﺮه ي New Projectاز ﻗﺴﻤﺖ Templatesﮔﺰﻳﻨـﻪ Windows Applicationرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ و در ﺑﺨﺶ Nameﻧﺎم Simple MessageBoxرا وارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤـﻪ OKﻛﻠﻴـﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد. Simple ﺑــﺮ روي ﻓــﺮم ﺑﺮﻧﺎﻣــﻪ در ﻗــﺴﻤﺖ ﻃﺮاﺣــﻲ ﻓــﺮم ﻛﻠﻴــﻚ ﻛــﺮده و ﺳــﭙﺲ ﺧﺎﺻــﻴﺖ Textآن را ﺑــﻪ MessageBoxﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ ﺑـﺎ btnShowو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Showﻗﺮار دﻫﻴﺪ. ﺳﭙﺲ ﻳﻚ ﻛﻨﺘﺮل Labelدر ﻓﺮم ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﺑﺮاي ﻧﻤﺎﻳﺶ ﮔﺰﻳﻨﻪ اي ﺑﻪ ﻛﺎر ﻣﻲ رود ﻛﻪ ﻛﺎرﺑﺮ از ﻛـﺎدر ﭘﻴﻐـﺎم اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ .ﺧﺎﺻﻴﺖ Nameاﻳﻦ ﮔﺰﻳﻨﻪ را ﺑﻪ lblResultو ﺧﺎﺻﻴﺖ Textآن را ﺑﻪ Nothing Clickedﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺳﭙﺲ اﻧﺪازه ﻓﺮم را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﻛﻪ ﻓﺮم ﺷﻤﺎ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 3-7ﺷﻮد.
ﺷﻜﻞ 3-7 (5ﺑﺮ روي دﻛﻤﻪ ي Showدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: )private void btnShow_Click(object sender, EventArgs e { (if ( MessageBox.Show "Your Internet Connection will be closed now!", "Dial-Up Networking Notification",
٢٥٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
MessageBoxButtons.OKCancel, MessageBoxIcon.None, )MessageBoxDefaultButton.Button1 == )DialogResult.OK { ;"!lblResult.Text = "OK Clicked // Call some method here... } else { ;"!lblResult.Text = "Cancel Clicked // Call some method here... } } (6ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Showﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 4-7ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 4-7 (7ﺑﺮ روي دﻛﻤﻪ ي OKو ﻳﺎ دﻛﻤﻪ Cancelﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻧﺘﻴﺠﻪ اﻧﺘﺨﺎب ﺷﻤﺎ در ﻟﻴﺒﻞ ﻧﻤـﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﻛﺪ اﺑﺘﺪا ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ Showﻛﺎدر ﭘﻴﻐﺎﻣﻲ را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ دادﻳﻢ .ﺳﭙﺲ در ﻳﻚ دﺳﺘﻮر ifﺑﺮرﺳﻲ ﻛﺮده اﻳﻢ ﻛﻪ ﻛـﺎرﺑﺮ ﭼﻪ ﮔﺰﻳﻨﻪ اي را اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ: (MessageBox.Show "Your Internet Connection will be closed now!", "Dial-Up Networking Notification", MessageBoxButtons.OKCancel, null, )MessageBoxDefaultButton.Button1 == )DialogResult.OK
( if
ﺗﻮﺟﻪ ﻛﻨﻴﺪ در ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ Showﻣﺸﺨﺺ ﻛﺮده اﻳﻢ ﻛﻪ دﻛﻤﻪ ﻫﺎي OKو Cancelﺑﺮ روي ﻓـﺮم ﻗـﺮار ﺑﮕﻴﺮﻧـﺪ و ﻫﻤﭽﻨـﻴﻦ دﻛﻤﻪ OKﺑﻪ ﻋﻨﻮان دﻛﻤﻪ ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد.
٢٥٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﭽﻨـــﻴﻦ ﻣـــﺸﺎﻫﺪه ﻣـــﻲ ﻛﻨﻴـــﺪ ﻛـــﻪ در دﺳـــﺘﻮر ،ifﻣﻘـــﺪار ﺑﺮﮔـــﺸﺖ داده ﺷـــﺪه ﺗﻮﺳـــﻂ ﺗـــﺎﺑﻊ Showرا ﺑـــﺎ ﻣﻘـــﺪار DialogResult.OKﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ .در ﺻﻮرﺗﻲ ﻛﻪ اﻳﻦ دو ﻣﻘﺪار ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻣﺴﺎوي ﻧﺒﻮدﻧﺪ ﻣﻲ ﺗﻮان ﻓﻬﻤﻴﺪ ﻛﺎرﺑﺮ ﮔﺰﻳﻨﻪ ي Cancelرا اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﺴﺘﻴﺪ در اﻳﻦ ﻣﻘﺎﻳﺴﻪ از ﮔﺰﻳﻨـﻪ ي DialogResult.Cancel ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. اﺳﺘﻔﺎده از اﻳﻦ روش ﻣﻘﺎﻳﺴﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ دو دﻛﻤﻪ در ﻛﺎدر وﺟﻮد دارد روش ﻣﻨﺎﺳﺒﻲ اﺳﺖ .اﻣﺎ ﺑﺮاي ﺷﺮاﻳﻄﻲ ﻛﻪ ﺳﻪ دﻛﻤﻪ در ﻛﺎدر ﻗﺮار دارﻧﺪ ﻣﻲ ﺗﻮان از روﺷﻬﺎي ﻛﻮﺗﺎه ﺗﺮي اﺳﺘﻔﺎده ﻛﺮد .در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،اﻳﻦ ﻣﻮرد را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺳﻪ دﻛﻤﻪ ﻓﺮﻣﺎن در ﻛﺎدر ﭘﻴﻐﺎم (1اﮔﺮ ﻫﻤﭽﻨﺎن ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﻣﺘﻮﻗﻒ ﻛﺮده و ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮوﻳﺪ. (2دﻛﻤﻪ ي دﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑـﺎ btn3Buttonsو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ 3 Buttonsﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺑﺮ روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷـﻮد. ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void btn3Buttons_Click(object sender, EventArgs e { // Declare a variable ;DialogResult intResult
+
// Get the results of the button clicked (intResult = MessageBox.Show ""The A Drive is not ready.\n\nPlease insert a " diskette into drive.", "Device Not Ready", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, ;)MessageBoxDefaultButton.Button2 // Process the results of the button clicked )switch (intResult { case DialogResult.Abort: // Do abort processing here... ;"!lblResult.Text = "Abort clicked ;break case DialogResult.Retry: // Do retry processing here... ;"!lblResult.Text = "Retry clicked ;break case DialogResult.Ignore: // Do ignore processing here... ;"!lblResult.Text = "Ignore clicked ;break } ٢٥٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي 3 Buttonsﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﺎدر ﭘﻴﻐﺎﻣﻲ ﺑـﺎ ﺳـﻪ دﻛﻤـﻪ ﻣـﺸﺎﺑﻪ ﺷﻜﻞ 5-7را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻛﺎدر ﭘﻴﻐﺎم ،دﻛﻤﻪ ي دوم ﺑﻪ ﺻﻮرت ﭘـﻴﺶ ﻓـﺮض اﻧﺘﺨـﺎب ﺷـﺪه اﺳﺖ.
ﺷﻜﻞ 5-7
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در ﻓﺼﻞ ﭘﻨﺠﻢ ﻛﻪ در ﻣﻮرد ﺷﻤﺎرﻧﺪه ﻫﺎ ﺻﺤﺒﺖ ﻣﻲ ﻛﺮدﻳﻢ ،ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﺷﻤﺎرﻧﺪه ﻫﺎ در ﺣﻘﻴﻘﺖ ﻧﻮﻋﻲ ﻋﺪد ﺻﺤﻴﺢ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ ﻫﺮ ﻳﻚ از آﻧﻬﺎ ﻋﺪدي ﻧﺴﺒﺖ داده ﻣﻲ ﺷﻮد .ﻧﻮع DialogResultﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي ﻣﺘﺪ Showﺑﺮﮔﺸﺘﻪ ﻣﻲ ﺷﻮد ﻧﻴﺰ ﻧـﻮﻋﻲ ﻋﺪد ﺻﺤﻴﺢ اﺳﺖ .در اﻳﻦ ﻣﺜﺎل اﺑﺘﺪا ﻣﺘﻐﻴﺮي از ﻧﻮع ﺷﻤﺎرﻧﺪه DialogResultﺗﻌﺮﻳﻒ ﻛﺮده و ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ از ﻣﺘﺪ Show را )ﻣﻘﺪاري ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ي ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ( در آن ﻗﺮار دﻫﻴﻢ. // Declare a variable ;DialogResult intResult
+
// Get the results of the button clicked (intResult = MessageBox.Show ""The A Drive is not ready.\n\nPlease insert a " diskette into drive.", "Device Not Ready", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error, ;)MessageBoxDefaultButton.Button2
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻠﻬﺎي ﻗﺒﻞ ﮔﻔﺘﻢ ،ﺑﺮاي اﺳﺘﻔﺎده از ﻛﺎراﻛﺘﺮ ﻫﺎي ﻛﻨﺘﺮﻟﻲ در ﻳﻚ رﺷـﺘﻪ از ﻋﻼﻣـﺖ \ اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨﻨـﺪ .1ﻳﻜـﻲ از ﻛﺎراﻛﺘﺮ ﻫﺎي ﻛﻨﺘﺮﻟﻲ ،ﻛﺎراﻛﺘﺮ nاﺳﺖ ﻛﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد اداﻣﻪ ﻣﺘﻦ در ﻳﻚ ﺧﻂ ﺟﺪﻳﺪ ﻧﻤﺎﻳﺶ داده ﺷﻮد .در اﻳﻨﺠـﺎ ﺑـﺮاي اﻳﻨﻜـﻪ اداﻣـﻪ ﻣﺘﻨﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ در ﻛﺎدر ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ دﻫﻴﻢ در دو ﺧﻂ ﭘﺎﻳﻴﻦ ﺗﺮ ﻗﺮار ﺑﮕﻴﺮد از ﻛﺎراﻛﺘﺮ ﻛﻨﺘﺮﻟﻲ nدو ﺑﺎر اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ. در اﻧﺘﻬﺎ ﻧﻴﺰ ﻧﺘﻴﺠﻪ ﺑﺮﮔﺸﺖ داده ﺷﺪه ﺗﻮﺳﻂ ﻛﺎدر ﭘﻴﻐﺎم را ﺗﻮﺳﻂ ﻳﻚ دﺳﺘﻮر switchﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ: // Process the results of the button clicked 1رﺟﻮع ﻛﻨﻴﺪ ﺑﻪ ﻓﺼﻞ ﭼﻬﺎرم ﺑﺨﺶ ﺣﻠﻘﻪ ﻫﺎي foreach
٢٥٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)switch (intResult { case DialogResult.Abort: // Do abort processing here... ;"!lblResult.Text = "Abort clicked ;break case DialogResult.Retry: // Do retry processing here... ;"!lblResult.Text = "Retry clicked ;break case DialogResult.Ignore: // Do ignore processing here... ;"!lblResult.Text = "Ignore clicked ;break } ﻧﻜﺘﻪ :ﻫﻤﻮاره دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ از ﻛﺎدر ﭘﻴﻐﺎم ﺑﻴﺶ از اﻧﺪازه اﺳﺘﻔﺎده ﻧﻜﻨﻴﺪ و ﺳﻌﻲ ﻛﻨﻴﺪ ﺑﺮاي اﺳﺘﻔﺎده از آن دﻟﻴﻞ ﻣﻨﺎﺳﺒﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،زﻳﺮا اﺳﺘﻔﺎده ﺑﻴﺶ از اﻧﺪازه از آن ﺑﺎﻋﺚ ﻧﺎراﺣﺘﻲ ﻛﺎرﺑﺮ ﻣﻲ ﺷﻮد .در ﻣﻮاﻗﻌﻲ از ﻛـﺎدر ﭘﻴﻐـﺎم اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ ﻛـﻪ ﺑﺨﻮاﻫﻴـﺪ ﻛـﺎرﺑﺮ را از رخ دادن ﺧﻄﺎﻳﻲ در ﺑﺮﻧﺎﻣﻪ آﮔﺎه ﻛﻨﻴﺪ و ﻳﺎ ﺑﻪ ﻛﺎرﺑﺮ در ﻣﻮرد ﻳﻚ ﻣﺴﺌﻠﻪ ﻣﻬﻢ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﺎﻋﺚ اﻳﺠﺎد ﺧﻄﺎ و ﻳﺎ از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﺷـﻮد ﻫﺸﺪار دﻫﻴﺪ .ﻳﻚ ﻣﺜﺎل ﺑﺮاي ﻛﺎر ﻫﻨﮕﺎﻣﻲ اﺳﺖ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺪون ذﺧﻴﺮه ﺗﻐﻴﺮات ﺳﻌﻲ در ﺧﺎرج ﺷـﺪن از ﺑﺮﻧﺎﻣـﻪ را داﺷـﺘﻪ ﺑﺎﺷـﺪ .در اﻳـﻦ ﻣﻮاﻗﻊ ،ﺑﺎﻳﺪ ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع دﻫﻴﺪ ﻛﻪ اﮔﺮ اداﻣﻪ دﻫﺪ ﻣﻤﻜﻦ اﺳﺖ ﺗﻤﺎم ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻛﺮده اﺳﺖ از ﺑﻴﻦ ﺑﺮود.
ﻛﻨﺘﺮل :OpenFileDialog ﺗﻘﺮﻳﺒﺎً در ﻧﻮﺷﺘﻦ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﺷﺮاﻳﻄﻲ وﺟﻮد دارد ﻛﻪ ﺑﺨﻮاﻫﻴﺪ داده ﻫﺎﻳﻲ را در ﻓﺎﻳﻞ ﻧﻮﺷﺘﻪ و ﻳﺎ از آن ﺑﺨﻮاﻧﻴﺪ ،ﭘـﺲ ﺑـﻪ ﻛﻨﺘﺮﻟﻲ ﻧﻴﺎز دارﻳﺪ ﺗﺎ ﺑﻪ وﺳﻴﻠﻪ ي آن ﺑﺘﻮاﻧﻴﺪ ﻓﺎﻳﻠﻲ را ﺑﺎز ﻛﻨﻴﺪ و ﻳﺎ داده ﻫﺎﻳﻲ را در ﻳﻚ ﻓﺎﻳـﻞ ذﺧﻴـﺮه ﻛﻨﻴـﺪ .در ﭼـﺎرﭼﻮب .NETدو ﻛﻨﺘﺮل ﺑﺮاي اﻳﻦ ﻣﻮارد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ OpenFileDialog :و .SaveFileDialogدر اﻳﻦ ﺑﺨـﺶ ﺑـﻪ ﺑﺮرﺳﻲ ﻛﻨﺘﺮل OpenFileDialogﻣـﻲ ﭘـﺮدازﻳﻢ و در ﺑﺨـﺶ ﺑﻌـﺪ ﻧﻴـﺰ ﻛﻨﺘـﺮل SaveFileDialogرا ﺑﺮرﺳـﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻣﺎﻧﻨﺪ Wordو ﻳﺎ Paintﻛﺎر ﻣﻲ ﻛﻨﻴﺪ ،ﻣﻌﻤﻮﻻ ﺑﺮاي ﺑﺎز ﻛﺮدن ﻳﻚ ﻓﺎﻳﻞ و ﻳـﺎ ذﺧﻴـﺮه آن و ﻳﺎ ...ﺑﺎ ﻣﺤﻴﻄﻲ ﻳﻜﺴﺎن روﺑﺮو ﻣﻲ ﺷﻮﻳﺪ .اﻳﻦ ﻧﻮع ﻛﺎدرﻫﺎ ،ﺑﻪ ﺻﻮرت ﻳﻚ ﻣﺠﻤﻮﻋﻪ ي اﺳﺘﺎﻧﺪارد در وﻳﻨﺪوز وﺟﻮد دارد و ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﺎن ﻣﻲ ﺗﻮاﻧﻨﺪ از آﻧﻬﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻨﺪ. در .NETﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﭘﻨﺠﺮه Openاز اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﺑﺎﻳـﺪ از ﻛـﻼس OpenFileDialogاﺳـﺘﻔﺎده ﻛـﺮد .ﺑـﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼس در .NETﻣﺎﻧﻨﺪ ﻫﺮ ﻛﻼس دﻳﮕﺮي ﺑﺎﻳﺪ ﻳﻚ ﻣﺘﻐﻴﺮ از آن اﻳﺠﺎد و ﺳﭙﺲ ﺧﺎﺻﻴﺘﻬﺎي آن را ﺑﻪ وﺳﻴﻠﻪ ﻛﺪ ﺗﻨﻈـﻴﻢ ﻛﺮد ،و ﻳﺎ ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻓﺮم اﻳﻦ ﻛﻨﺘﺮل را در ﺑﺮﻧﺎﻣﻪ ﻗﺮار داده و از آن اﺳﺘﻔﺎده ﻛـﺮد .در ﻫـﺮ دو ﺣﺎﻟـﺖ ﺷﻴﺊ اﻳﺠﺎد ﺷﺪه داراي ﻣﺘﺪﻫﺎ ،روﻳﺪادﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي ﻳﻜﺴﺎن ﺧﻮاﻫﺪ ﺑﻮد. ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل در ﺟﻌﺒﻪ اﺑﺰار ،ﺑﺎﻳﺪ ﺑﻪ ﺑﺨﺶ Dialogsآن ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ و ﺑﺎ اﺳﺘﻔﺎده از ﻣﺎوس اﻳﻦ ﻛﻨﺘﺮل را ﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺑﻌﺪ از آن ﺗﻨﻬﺎ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ ،اﻳﻦ اﺳﺖ ﻛﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮرد ﻧﻈﺮﺗﺎن ﺑﻪ وﺳﻴﻠﻪ ﭘﻨﺠﺮه Properties ﺗﻨﻈﻴﻢ ﻛﺮده و ﺳﭙﺲ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ ﻧﻤﺎﻳﺶ آن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ.
٢٥٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي اﺳﺘﻔﺎده از ﻛﻨﺘﺮل OpenFileDialogﺑﻪ ﺻﻮرت ﻛﻼس ،اﺑﺘﺪا ﺑﺎﻳﺪ ﺷﻴﺊ از ﻧﻮع اﻳـﻦ ﻛـﻼس اﻳﺠـﺎد ﻛﻨﻴـﺪ .ﺳـﭙﺲ در ﻣﻮاﻗﻌﻲ ﻛﻪ ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺎز داﺷﺘﻴﺪ ،ﺑﻪ اﻳﻦ ﺷﻴﺊ ﻣﻘﺪار ﺑﺪﻫﻴﺪ و از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﭘﺲ از ﭘﺎﻳﺎن اﺳﺘﻔﺎده ﻧﻴﺰ ﻣـﻲ ﺗﻮاﻧﻴـﺪ آن را ﻧـﺎﺑﻮد ﻛﻨﻴﺪ ﺗﺎ ﻣﻨﺎﺑﻊ اﺷﻐﺎل ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ آن آزاد ﺷﻮﻧﺪ. در اﻳﻦ ﻓﺼﻞ ﺑﺎ OpenFileDialogﺑﻪ ﺻﻮرت ﻳﻚ ﻛﻨﺘﺮل ﺑﺮﺧﻮرد ﻣﻲ ﻛﻨﻴﻢ .اﻣـﺎ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛـﺎﻣﻼً ﻣﻔﻬـﻮم آن را درك ﻛﺮدﻳﺪ و ﺗﻮاﻧﺴﺘﻴﺪ ﺑﻪ راﺣﺘﻲ در ﺑﺮﻧﺎﻣﻪ از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ از اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺻﻮرت ﻳﻚ ﻛـﻼس ﻧﻴـﺰ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .ﻣﻔﻬـﻮم ﻛﻼﺳﻬﺎ و ﻧﺤﻮه اﺳﺘﻔﺎده از آﻧﻬﺎ در ﻓﺼﻞ ﻧﻬﻢ ﺑﻪ ﻃﻮر ﻣﻔﺼﻞ ﺷﺮح داده ﺷﺪه اﻧﺪ. ﺑﺮاي ﻧﻤﺎﻳﺶ ﭘﻨﺠﺮه ي Openﻛﺎﻓﻲ اﺳﺖ ﻣﺘﺪ ShowDialogآن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﭘﻨﺠـﺮه اي ﻣـﺸﺎﺑﻪ ﺷـﻜﻞ 6-7ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 6-7
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :OpenFileDialog اﮔﺮﭼﻪ ﻛﺎدر ﻣﺤﺎوره اي ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﺷﻜﻞ 6-7ﻳﻚ ﺻﻔﺤﻪ Openاﺳﺘﺎﻧﺪارد در وﻳﻨﺪوز اﺳﺖ و ﻣﻌﻤﻮﻻً ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻳﻦ ﻛﺎدر را در ﺑﺮﻧﺎﻣﻪ اي ﻣـﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ ﻓﻘـﻂ ﻓﺎﻳﻠﻬـﺎي ﺧﺎﺻـﻲ در آن ﻧﻤـﺎﻳﺶ داده ﺷـﺪه اﺳـﺖ )ﺑـﺮاي ﻣﺜـﺎل اﻳـﻦ ﻛـﺎدر در ﺑﺮﻧﺎﻣـﻪ ي Notepadﻓﻘﻂ ﻓﺎﻳﻠﻬﺎي ﻣﺘﻨﻲ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ( ،اﻣﺎ در اﻳﻦ ﻛﺎدر ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ در ﻧﻮع ﻓﺎﻳﻠﻬﺎي ﻗﺎﺑﻞ ﻧﻤﺎﻳﺶ دﻳﺪه ﻧﻤﻲ ﺷﻮد. در اﻳﻦ ﭘﻨﺠﺮه ﺗﻤﺎم ﻓﺎﻳﻠﻬﺎي ﻣﻮﺟﻮد در ﻓﻮﻟﺪر ﺟﺎري را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ و ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﭼـﻪ ﻧـﻮع ﻓﺎﻳﻠﻬـﺎﻳﻲ را ﻧﻤـﺎﻳﺶ دﻫﺪ .ﺑﺮاي ﻓﻴﻠﺘﺮ ﻛﺮدن ﻧﻮع ﻓﺎﻳﻠﻬﺎي ﻧﻤﺎﻳﺶ داده ﺷﺪه در اﻳﻦ ﻛﺎدر ﺑﺎﻳﺪ از ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل اﺳﺘﻔﺎده ﻛﺮده و آﻧﻬﺎ را ﺑﻪ ﻧﺤﻮي ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎدر ،ﻓﺎﻳﻠﻬﺎي ﻣﻮرد ﻧﻈﺮ ﺷﻤﺎ را ﻧﻤﺎﻳﺶ دﻫﺪ.
٢٦٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻟﺒﺘﻪ اﻳﻦ ﻳﻜﻲ از ﻣﻮاردي اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل ﻗﺎﺑﻞ ﺗﻨﻈﻴﻢ اﺳﺖ .در ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﭘﺮ ﻛـﺎرﺑﺮد اﻳﻦ ﻛﻨﺘﺮل را ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ: ﺧﺎﺻﻴﺖ
ﺷﺮح
AddExtension
اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﮔﺮ ﻛﺎرﺑﺮ ﭘﺴﻮﻧﺪي را ﺑـﺮاي ﻓﺎﻳـﻞ ﻣـﺸﺨﺺ ﻧﻜـﺮد، ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ ﭘﺴﻮﻧﺪ را ﺑﻪ ﻓﺎﻳﻞ اﺿﺎﻓﻪ ﻛﻨﺪ ﻳﺎ ﻧﻪ؟ اﻳﻦ ﻣﻮرد ﺑﻴﺸﺘﺮ در ﭘﻨﺠـﺮه SaveFileDialogﻛﻪ در ﺑﺨﺶ ﺑﻌﺪ ﺗﻮﺿﻴﺢ داده ﺧﻮاﻫﺪ ﺷﺪ اﺳﺘﻔﺎده ﻣـﻲ ﺷﻮد.
CheckFileExist
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ آدرس ﻓﺎﻳﻠﻲ را وارد ﻛﺮد ﻛﻪ وﺟـﻮد ﻧﺪاﺷـﺖ ،ﺑﺮﻧﺎﻣـﻪ ﭘﻴﻐـﺎم ﺧﻄﺎﻳﻲ را ﻧﻤﺎﻳﺶ ﺑﺪﻫﺪ ﻳﺎ ﻧﻪ؟
CheckPathExist
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ آدرس ﻣﺴﻴﺮي را وارد ﻛﺮد ﻛﻪ وﺟﻮد ﻧﺪاﺷﺖ ،ﺑﺮﻧﺎﻣـﻪ ﭘﻴﻐـﺎم ﺧﻄﺎﻳﻲ را ﻧﻤﺎﻳﺶ ﺑﺪﻫﺪ ﻳﺎ ﻧﻪ؟
DefaultExt
ﭘﺴﻮﻧﺪ ﭘﻴﺶ ﻓﺮض را ﺑﺮاي ﻓﺎﻳﻞ اﻧﺘﺨﺎب ﺷﺪه ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
DereferenceLinks
ﺑﺎ ﺷﻮرت ﻛﺎت ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﮔﺮ ﻛﺎرﺑﺮ ﻳﻚ ﺷﻮرت ﻛـﺎت را اﻧﺘﺨﺎب ﻛﺮد ،ﻣﺴﻴﺮ ﻓﺎﻳﻞ اﺻﻠﻲ ﺑﺮﮔﺸﺖ داده ﺷﻮد ) (Trueو ﻳﺎ ﻣﺴﻴﺮ ﺧـﻮد ﻓﺎﻳـﻞ ﺷﻮرت ﻛﺎت ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺮدد).(False
FileName
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻧﺎم ﻓﺎﻳﻠﻲ اﺳﺖ ﻛﻪ در اﻳﻦ ﭘﻨﺠﺮه اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ.
FileNames
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻧﺎم ﻓﺎﻳﻠﻬﺎﻳﻲ اﺳﺖ ﻛﻪ در اﻳﻦ ﭘﻨﺠﺮه اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ .اﻳﻦ ﺧﺎﺻﻴﺖ از ﻧﻮع ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ اﺳﺖ.
Filter
اﻳﻦ ﺧﺎﺻﻴﺖ ﺣﺎوي رﺷﺘﻪ اي اﺳﺖ ﻛﻪ ﺑﺮاي ﻓﻴﻠﺘﺮ ﻛﺮدن ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛـﻪ ﺑﺎﻳـﺪ در ﭘﻨﺠـﺮه Openﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ رﺷـﺘﻪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ،ﭼﻨـﺪﻳﻦ ﮔﺮوه ﻓﻴﻠﺘﺮ را ﺑﺮاي اﻳﻦ ﭘﻨﺠﺮه ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﺎ در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﻣﻮﺟﻮد در اﻳﻦ ﭘﻨﺠـﺮه ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ و ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻳﻜﻲ از آﻧﻬﺎ را اﻧﺘﺨﺎب ﻛﻨﺪ.
FilterIndex
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﺷﻤﺎره ﻓﻴﻠﺘﺮي اﺳﺖ ﻛﻪ ﻛﺎرﺑﺮ ﻫﻢ اﻛﻨﻮن در اﻳﻦ ﺻﻔﺤﻪ اﻧﺘﺨـﺎب ﺷـﺪه اﺳﺖ.
InitialDirectory
ﻣﺸﺨﺺ ﻛﻨﻨﺪه آدرس ﻣﺴﻴﺮي اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ در اﺑﺘﺪا ،در ﭘﻨﺠﺮه Openﻧﻤـﺎﻳﺶ داده ﺷﻮد.
Multiselect
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﭼﻨﺪﻳﻦ ﻓﺎﻳﻞ را در اﻳﻦ ﭘﻨﺠﺮه اﻧﺘﺨﺎب ﻛﻨﺪ و ﻳﺎ ﻧﻪ؟
ReadOnlyChecked
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻗﺴﻤﺖ ReadOnlyدر ﭘﻨﺠﺮه Openاﻧﺘﺨﺎب ﺷﺪه اﺳـﺖ و ﻳﺎ ﻧﻪ؟
RestoreDirectory
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛﺎدر Openﺑﺎﻳﺪ آدرس ﻣﺴﻴﺮي ﻛﻪ ﻗﺒﻞ از ﺑﺴﺘﻪ ﺷﺪن در آن ﻗﺮار داﺷﺖ را ﺑﺮﮔﺮداﻧﺪ ﻳﺎ ﻧﻪ؟
ShowHelp
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ دﻛﻤﻪ Helpﻧﻴﺰ در ﭘﻨﺠﺮه Openﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
٢٦١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ShowReadOnly
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ اﻣﻜﺎن ﺗﻌﻴﻴﻦ اﻳﻦ ﻛﻪ ﻓﺎﻳﻞ ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﺎز ﺷﻮد ﺑﺮاي ﻛﺎرﺑﺮ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
Title
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺘﻨﻲ اﺳﺖ ﻛﻪ در ﻧﻮار ﻋﻨﻮان ﭘﻨﺠﺮه Openﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ValidateNames
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﭘﻨﺠﺮه ﻓﻘﻂ ﺑﺎﻳﺪ ﻧﺎم ﻓﺎﻳﻠﻬﺎي ﻣﻌﺘﺒﺮ وﻳﻨﺪوزي را ﻗﺒﻮل ﻛﻨﺪ و ﻳﺎ ﻫﺮ ﻧﺎﻣﻲ را ﻣﻲ ﺗﻮاﻧﺪ درﻳﺎﻓﺖ ﻛﻨﺪ؟
ﻣﺘﺪﻫﺎي :OpenFileDialog اﮔﺮﭼﻪ ﻣﺘﺪﻫﺎي زﻳﺎدي در ﻛﻨﺘﺮل OpenFileDialogوﺟـﻮد دارﻧـﺪ ،اﻣـﺎ در ﻣﺜـﺎل ﻫـﺎي اﻳـﻦ ﺑﺨـﺶ ﺑﻴـﺸﺘﺮ ﺑـﺮ روي ﻣﺘـﺪ ShowDialogﺗﻤﺮﻛﺰ ﺧﻮاﻫﻴﻢ ﻛﺮد .در ﻟﻴﺴﺖ زﻳﺮ ،ﻧﺎم و ﺷﺮح اﺳﺘﻔﺎده ﺑﻌﻀﻲ از ﺗﻮاﺑﻊ ﭘﺮ ﻛﺎرﺑﺮد اﻳﻦ ﻛﻨﺘﺮل آﻣﺪه اﺳﺖ:
:Disposeﺣﺎﻓﻈﻪ اﺷﻐﺎل ﺷﺪه ﺗﻮﺳﻂ اﻳﻦ ﻛﻨﺘﺮل را آزاد ﻣﻲ ﻛﻨﺪ. :OpenFileﻓﺎﻳﻠﻲ را ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ در ﭘﻨﺠﺮه Openاﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﺎز ﻣﻲ ﻛﻨﺪ. ﻧﺎم ﻓﺎﻳﻞ ﺑﻪ وﺳﻴﻠﻪ ﺧﺎﺻﻴﺖ FileNameﻣﺸﺨﺺ ﻣﻲ ﺷﻮد. :Resetﻣﻘﺪار ﺗﻤﺎم ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل OpenFileDialogرا ﺑﻪ ﺣﺎﻟﺖ اوﻟﻴﻪ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ. :ShowDialogﻛﺎدر ﻣﺤﺎوره اي ﭘﻨﺠﺮه Openرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ShowDialogﺑﺴﻴﺎر واﺿﺢ اﺳﺖ ،زﻳﺮا اﻳﻦ ﻣﺘﺪ ﻫﻴﭻ ﭘﺎراﻣﺘﺮي را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻧﻤـﻲ ﻛﻨـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﻗﺒﻞ از اﻳﻨﻜﻪ اﻳﻦ ﺗﺎﺑﻊ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﺗﻤﺎم ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮردﻧﻈﺮ را در ﻛﻨﺘﺮل ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ ﭘﻨﺠـﺮه Openﻧﻤـﺎﻳﺶ داده ﺷﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﺑﺮرﺳﻲ ﻣﻘﺪار ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﭼﻪ ﻓﺎﻳﻞ و ﻳﺎ ﭼﻪ ﻓﺎﻳﻠﻬﺎﻳﻲ ،در ﭼﻪ ﻣﺴﻴﺮﻫﺎﻳﻲ اﻧﺘﺨﺎب ﺷﺪه اﻧﺪ. ﻳﻚ ﻧﻤﻮﻧﻪ از ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﻣﺘﺪ در ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ: ;)(openFileDialog1.ShowDialog اﻳﻦ ﻣﺘﺪ ﻣﻘﺪاري از ﻧﻮع ﺷﻤﺎرﻧﺪه ي DialogResultﺑﻪ ﺻﻮرت OKو ﻳﺎ Cancelﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﻣﻘﺪار OKﺑـﻪ ﻣﻌﻨـﻲ ﻛﻠﻴﻚ ﻛﺮدن ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ ي Openو ﻣﻘﺪار Cancelﺑﺮاﺑﺮ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن روي Cancelاﺳﺖ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷـﻴﺪ ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﻫﻴﭻ ﻓﺎﻳﻠﻲ را ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎز ﻧﻤﻲ ﻛﻨﺪ و ﻳﺎ ﻣﺤﺘﻮﻳﺎت آن را ﻧﻤﻲ ﺧﻮاﻧﺪ .اﻳﻦ ﻛﻨﺘﺮل ﻓﻘﻂ راﺑﻄﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﻛـﺎرﺑﺮ اﺟـﺎزه ﻣﻲ دﻫﺪ ﻳﻚ ﻳﺎ ﭼﻨﺪ ﻓﺎﻳﻞ را ﺑﺮاي ﺑﺎز ﺷﺪن ﺑﻪ وﺳﻴﻠﻪ ي ﺑﺮﻧﺎﻣﻪ ﻣﺸﺨﺺ ﻛﻨﺪ .ﺑﻌـﺪ از اﻳـﻦ ﻣﺮﺣﻠـﻪ ،ﺷـﻤﺎ ﺑﺎﻳـﺪ در ﺑﺮﻧﺎﻣـﻪ ﻧـﺎم و آدرس ﻓﺎﻳﻠﻬﺎي ﻣﺸﺨﺺ ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ را ﺑﻪ وﺳﻴﻠﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل OpenFileDialogﺑﺪﺳـﺖ آورده و ﺳـﭙﺲ آﻧﻬـﺎ را ﺑـﺎز ﻛﻨﻴﺪ.
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :OpenFileDialog ﺣﺎل ﻛﻪ ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﻬﻢ ﻛﻨﺘﺮل OpenFileDialogرا ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ ،ﺑﻬﺘﺮ اﺳﺖ از اﻳﻦ ﻛﻨﺘﺮل در ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﺗﺎ ﺑﺎ ﻧﺤﻮه اﺳﺘﻔﺎده از آن در ﺑﺮﻧﺎﻣﻪ آﺷﻨﺎ ﺷﻮﻳﻢ.
٢٦٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل OpenFileDialogﺑﺮﻧﺎﻣﻪ اي ﺧﻮاﻫﻴﺪ ﻧﻮﺷﺖ ﻛﻪ ﻛـﺎرﺑﺮ ﺑﺘﻮاﻧـﺪ در آن ﻳـﻚ ﻓﺎﻳـﻞ ﻣﺘﻨﻲ را ﻣﺸﺨﺺ ﻛﻨﺪ و ﺑﺮﻧﺎﻣﻪ ﻣﺤﺘﻮﻳﺎت آن ﻓﺎﻳﻞ را در ﻳﻚ TextBoxﻧﻤﺎﻳﺶ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل OpenFileDialog (1در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻳﻚ ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Dialogsاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﺑﺮاي ﺗﻐﻴﻴﺮ ﻧﺎم ﻓﺮم ﺧﻮد ،در ﭘﻨﺠﺮه Solution Explorerﺑﺮ روي ﻧﺎم ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﺮده و از ﻣﻨﻮي ﺑﺎز ﺷﺪه ﮔﺰﻳﻨﻪ Renameرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ ﻧﺎم ﻓﺮم را ﺑـﻪ Dialogs.csﺗﻐﻴﻴـﺮ دﻫﻴـﺪ .ﺑـﺎ اﺳـﺘﻔﺎده از ﭘﻨﺠـﺮه Propertiesﺧﺎﺻﻴﺘﻬﺎي ﻓﺮم را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ:
ﺧﺎﺻﻴﺖ Sizeآن را ﺑﺮاﺑﺮ ﺑﺎ 456;304ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ StartPositionرا ﺑﺮاﺑﺮ ﺑﺎ CenterScreenﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Dialogsﻗﺮار دﻫﻴﺪ.
(3ﺑﺮاي اﻳﻦ ﻛﻪ ﻓﺎﻳﻞ ﻣﺸﺨﺺ ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ را در ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ ،ﺑﻪ ﻳﻚ ﻛﻨﺘﺮل TextBoxﻧﻴﺎز دارﻳﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﺎﻳﺪ ﻳﻚ ﻛﻨﺘﺮل Buttonﻧﻴﺰ ﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ ﺗﺎ ﻛﺎرﺑﺮ ﺑـﻪ وﺳـﻴﻠﻪ آن ﺑﺘﻮاﻧـﺪ ﭘﻨﺠـﺮه Openرا ﻧﻤـﺎﻳﺶ دﻫـﺪ. ﺑﻨﺎﺑﺮاﻳﻦ ﻳﻚ ﻛﻨﺘﺮل TextBoxو ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﻪ ﻓﺮم ﺧﻮد اﺿﺎﻓﻪ ﻛـﺮده و ﺧﺎﺻـﻴﺘﻬﺎي آن را ﺑـﺮ اﺳـﺎس ﻟﻴﺴﺖ زﻳﺮ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameﻛﻨﺘﺮل TextBoxرا ﺑﺮاﺑﺮ ﺑﺎ ،txtFileﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ ،Top Right،Left،Bottomﺧﺎﺻﻴﺖ Locationرا ﺑﺮاﺑﺮ ﺑﺎ 8,8ﺧﺎﺻﻴﺖ MultiLineرا ﺑﺮاﺑﺮ ﺑﺎ Trueﺧﺎﺻﻴﺖ ScrollBarsرا ﺑﺮاﺑﺮ ﺑـﺎ Verticalو ﺧﺎﺻـﻴﺖ Sizeرا ﺑﺮاﺑـﺮ ﺑـﺎ 352;264ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Nameدﻛﻤﻪ ﻓﺮﻣﺎن را ﺑﺮاﺑﺮ ﺑﺎ btnOpenﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ ﺑـﺎ Openﺧﺎﺻـﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ Top,Rightو ﺧﺎﺻﻴﺖ Locationرا ﺑﺮاﺑﺮ ﺑﺎ 367,8ﻗﺮار دﻫﻴﺪ.
(4ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﻨﺘﺮل ﻫﺎ را در ﻓﺮم ﻗﺮار دادﻳﺪ و ﺧﺎﺻﻴﺖ آﻧﻬﺎ را ﻃﺒﻖ ﻟﻴﺴﺖ ﻗﺒﻠﻲ ﺗﻨﻈﻴﻢ ﻛﺮدﻳﺪ ،ﻓﺮم ﺑﺮﻧﺎﻣـﻪ ﺷـﻤﺎ ﺑﺎﻳـﺪ ﻣـﺸﺎﺑﻪ ﺷﻜﻞ 7-7ﺷﺪه ﺑﺎﺷﺪ.
٢٦٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 7-7 ﻧﻜﺘﻪ :ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاي ﻛﻨﺘﺮﻟﻬﺎي اﻳﻦ ﻓﺮم ﺗﻨﻈﻴﻢ ﻛﻨﻴﻢ ،ﺑﺎ ﺗﻐﻴﻴﺮ اﻧﺪازه ﻓﺮم ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ اﻧﺪازه ﻛﻨﺘـﺮل ﻫـﺎ ﻧﻴﺰ ﺑﻪ ﺻﻮرت ﻣﺘﻨﺎﺳﺐ ﺗﻐﻴﻴﺮ ﺧﻮاﻫﺪ ﻛﺮد. (5در ﻧﻮار اﺑﺰار ﺑﻪ ﻗﺴﻤﺖ Dialogsﺑﺮوﻳﺪ ،ﻛﻨﺘﺮل FileOpenDialogرا اﻧﺘﺨﺎب ﻛﺮده و ﺑـﺮ روي آن دو ﺑـﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﻣﺤﻴﻂ ﻃﺮاﺣﻲ وﻳﮋوال اﺳﺘﻮدﻳﻮ اﺿﺎﻓﻪ ﺧﻮاﻫﺪ ﺷﺪ .ﺣـﺎل ﻣـﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﻛﻨﺘﺮل را در اﻳﻦ ﻗﺴﻤﺖ اﻧﺘﺨﺎب ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ آن را ﺑﻪ وﺳﻴﻠﻪ ﭘﻨﺠﺮه Propertiesﺗﻨﻈـﻴﻢ ﻛﻨﻴﺪ .ﺑﺎ وﺟﻮد اﻳﻦ ﻓﻌﻼً ﻧﺎم و ﺧﺎﺻﻴﺘﻬﺎي ﭘﻴﺶ ﻓﺮض اﻳﻦ ﻛﻨﺘـﺮل را ﻗﺒـﻮل ﻛﻨﻴـﺪ .در ﻗـﺴﻤﺘﻬﺎي ﺑﻌـﺪي ﺑـﺎ اﺳـﺘﻔﺎده از ﻛـﺪ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮرد ﻧﻈﺮ را در اﻳﻦ ﻛﻨﺘﺮل ﺗﻐﻴﻴﺮ ﺧﻮاﻫﻴﻢ داد. (6ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮوﻳﺪ و در اﺑﺘﺪاي ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم ،ﻳﻚ ﻣﺘﻐﻴﺮ رﺷﺘﻪ اي ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﺗﺎ ﻧﺎم ﻓﺎﻳﻞ در آن ذﺧﻴﺮه ﺷﻮد .در ﻗﺴﻤﺘﻬﺎي ﺑﻌﺪي ﺑﺮﻧﺎﻣﻪ ،ﻧﺎم ﻓﺎﻳﻠﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎدر Openﺑﺮﮔﺸﺘﻪ ﻣﻲ ﺷﻮد را در اﻳـﻦ ﻣﺘﻐﻴﻴـﺮ ذﺧﻴـﺮه ﺧـﻮاﻫﻴﻢ ﻛﺮد: public partial class Dialogs : Form { // Declare variables ;private string strFileName (7ﺣﺎل ﺑﺎﻳﺪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺑﺎز ﻛﺮدن ﻛﺎدر Openرا در روﻳﺪاد ﻛﻠﻴﻚ ﻛﻨﺘﺮل btnOpenﻗﺮار دﻫﻴﻢ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﺑـﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و ﺑﺮ روي اﻳﻦ ﻛﻨﺘﺮل دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴـﻚ آن اﻳﺠـﺎد ﺷـﻮد .ﺳـﭙﺲ ﻛﺪﻫﺎي ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnOpen_Click(object sender, EventArgs e { // Set the OpenFileDialog properties
٢٦٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
"|openFileDialog1.Filter = "Text files (*.txt) |*.txt ;"*+ " All files (*.*) |*. ;openFileDialog1.FilterIndex = 1 ;"openFileDialog1.Title = "Demo Open File Dialog // Show the OpenFileDialog and if the user clicks the // Open button, load the file )if (openFileDialog1.ShowDialog() == DialogResult.OK { // Save the file name ;strFileName = openFileDialog1.FileName // Read the contents of the file = txtFile.Text ;)System.IO.File.ReadAllText(strFileName } } (8ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮم اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﺑﺮ روي دﻛﻤﻪ ي Openﻛﻠﻴﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻛـﺎدر ﻣﺤﺎوره اي Openﻧﻤﺎﻳﺶ داده ﺷﻮد .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻋﻨﻮان اﻳﻦ ﻛﺎدر ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ ﻣﺸﺨﺺ ﻛﺮده ﺑﻮدﻳﺪ ﺗﻐﻴﻴﺮ ﻛـﺮده اﺳﺖ .در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ Files of type:در ﭘﺎﻳﻴﻦ ﻛﺎدر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ دو ﻧﻮع ﻓﻴﻠﺘﺮ ﺑـﺮاي ﻧﻤﺎﻳﺶ ﻓﺎﻳﻠﻬﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ. (9ﻳﻜﻲ از ﻓﻴﻠﺘﺮﻫﺎي ﻧﻤﺎﻳﺶ داده ﺷﺪه در اﻳﻦ ﻗﺴﻤﺖ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ ﻳﻚ ﻓﺎﻳﻞ ﻣﺘﻨﻲ را در دﻳﺴﻚ ﻣﺸﺨﺺ ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ Openﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 8-7ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ در ﻓـﺮم ﻧﻤـﺎﻳﺶ داده ﺧﻮاﻫـﺪ ﺷﺪ. (10ﺑﺮاي اﻣﺘﺤﺎن ،از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﻮﻳﺪ و ﻣﺠﺪداً آن را اﺟﺮا ﻛﻨﻴـﺪ .ﺳـﭙﺲ ﺑـﺮ روي دﻛﻤـﻪ ي Openﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻛﺎدر Openداﻳﺮﻛﺘﻮري را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ﻛﻪ در اﺟﺮاي ﻗﺒﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻓﺎﻳﻞ را از آن اﻧﺘﺨﺎب ﻛﺮدﻳﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻗﺒﻞ از ﻧﻤﺎﻳﺶ دادن ﻛﺎدر ﻣﺤﺎوره اي Openﺑﺎﻳﺪ ﺑﻌﻀﻲ از ﺧﺼﻮﺻﻴﺎت آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر ﺑـﻪ ﻧﺤـﻮي ﻣﻨﺎﺳـﺐ ﺑـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد .اوﻟﻴﻦ ﺧﺎﺻﻴﺘﻲ ﻛﻪ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻢ ﺷﻮد ،ﺧﺎﺻﻴﺖ Filterاﺳﺖ .اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﻓﻴﻠﺘﺮﻫـﺎﻳﻲ ﻛـﻪ در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ Files of type:در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﻓﻴﻠﺘﺮ ﺑﺮاي ﭘﺴﻮﻧﺪي ﺧﺎص اﻳﺠﺎد ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ اﺑﺘﺪا ﺗﻮﺿﻴﺢ آن ﻓﻴﻠﺘﺮ را وارد ﻛﺮده ،ﺳﭙﺲ ﻳﻚ ﺧﻂ ﻋﻤﻮدي )|( ﻗﺮار دﻫﻴﺪ و در اﻧﺘﻬﺎ ﻧﻴﺰ ﭘـﺴﻮﻧﺪ ﻓﺎﻳـﻞ را وارد ﻛﻨﻴﺪ .اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﭼﻨﺪﻳﻦ ﻓﻴﻠﺘﺮ در اﻳﻦ ﻛﺎدر وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،ﺑﺎﻳﺪ ﻫﺮ ﻳﻚ از آﻧﻬﺎ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﺧﻂ ﻋﻤﻮدي از ﻳﻜـﺪﻳﮕﺮ ﺟـﺪا ﻛﻨﻴﺪ.
٢٦٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 8-7
// Set the OpenFileDialog properties = openFileDialog1.Filter ;"*"Text files (*.txt) |*.txt| All files (*.*) |*. دوﻣﻴﻦ ﺧﺎﺻﻴﺘﻲ ﻛﻪ ﺑﺎﻳﺪ ﺗﻨﻈﻴﻢ ﺷﻮد ،ﺧﺎﺻﻴﺖ FilterIndexاﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﺪام ﻓﻴﻠﺘﺮ ﺑﺎﻳـﺪ ﺑـﻪ ﺻـﻮرت ﭘـﻴﺶ ﻓﺮض در ﻓﺮم در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد .ﻣﻘﺪار 1ﺑﺮاي اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻓﻴﻠﺘﺮ اول ﺑﻪ ﻋﻨﻮان ﻓﻴﻠﺘﺮ ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘـﻪ ﻣﻲ ﺷﻮد. ;openFileDialog1.FilterIndex = 1 در اﻧﺘﻬﺎ ﻧﻴﺰ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ Titleﻋﻨﻮان ﭘﻨﺠﺮه Openرا ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ: ;"openFileDialog1.Title = "Demo Open File Dialog ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر Openﺑﺎﻳﺪ از ﺗﺎﺑﻊ Showاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺪاري از ﻧـﻮع DialogResult را ﺑﺮﻣﻴﮕﺮداﻧﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاﺑﺮ ﺑﺎ DialogResult.OKو ﻳﺎ DialogResult.Cancelﺑﺎﺷﺪ .اﮔﺮ ﻛﺎرﺑﺮ در ﭘﻨﺠﺮه Openﺑﺮ روي دﻛﻤﻪ Openﻛﻠﻴﻚ ﻛﻨﺪ ﻣﻘﺪار DialogResult.OKﺗﻮﺳﻂ ﺗﺎﺑﻊ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ دﻛﻤﻪ Cancelرا اﻧﺘﺨﺎب ﻛﻨﺪ ﻣﻘﺪار ﺑﺎزﮔﺸﺘﻲ ﺑﺮاﺑﺮ ﺑﺎ DialogResult.Cancelﺧﻮاﻫﺪ ﺑﻮد. // Show the OpenFileDialog and if the user clicks the // Open button, load the file )if (openFileDialog1.ShowDialog() == DialogResult.OK
٢٦٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﭼﺎرﭼﻮب ،.NETﻓﻀﺎي ﻧﺎم System.IOداراي ﺗﻤﺎم ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﻛﻨﺘﺮل ورودي و ﺧﺮوﺟﻲ ﻣﻲ ﺑﺎﺷﺪ. ﺑﺮاي درﻳﺎﻓﺖ اﻃﻼﻋﺎت درون ﻓﺎﻳﻞ ﻣﺘﻨﻲ ﻣﻲ ﺗﻮاﻧﻴﻢ از ﻛﻼس Fileدر اﻳﻦ ﻓﻀﺎي ﻧﺎم اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﮔﺮ ﻳﻚ ﻓﻀﺎي ﻧﺎم ﺑﺎ اﺳـﺘﻔﺎده از دﺳﺘﻮر usingدر اﺑﺘﺪاي ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻛﻼس ﻣﺸﺨﺺ ﺷﻮد ،در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗـﻮان ﺑـﺪون ذﻛـﺮ ﻛـﺮدن ﻓـﻀﺎي ﻧـﺎم ،از ﻛﻼﺳﻬﺎي داﺧﻞ آن اﺳﺘﻔﺎده ﻛﺮد .1ﺑﺮاي ﻣﺜﺎل ﻛﻼس MessageBoxﻛﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر ﭘﻴﻐﺎم از آن اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨـﻴﻢ در ﻓﻀﺎي ﻧﺎم System.Windows.Formsﻗﺮار دارد .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﺑﺪون اﻳﻨﻜﻪ ﻓﻀﺎي ﻧﺎم اﻳـﻦ ﻛـﻼس را ﻣـﺸﺨﺺ ﻛﻨـﻴﻢ از آن در ﺑﺮﻧﺎﻣـﻪ اﺳـﺘﻔﺎده ﻛـﺮده اﻳـﻢ .اﻳـﻦ ﻣـﻮرد ﺑـﻪ اﻳـﻦ ﻋﻠـﺖ اﺳـﺖ ﻛـﻪ ﻓـﻀﺎي ﻧـﺎم System.Windows.Formsﺑﺎ اﺳﺘﻔﺎده از راﻫﻨﻤﺎي usingدر اﺑﺘﺪاي ﻛﺪ )ﻗﺒﻞ از ﺗﻌﺮﻳﻒ ﻛﻼس( ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿـﺎﻓﻪ ﺷﺪه اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼس ﻧﻴﺎزي ﺑﻪ ذﻛﺮ ﻛﺮدن ﻓﻀﺎي ﻧﺎم آن ﻧﺪارﻳﻢ. اﻣﺎ در ﻣﻮرد ﻛﻼس Fileاﮔﺮ ﺑﻪ اﺑﺘﺪاي ﻛﺪ ﻧﮕﺎه ﻛﻨﻴﺪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻓﻀﺎي ﻧﺎم ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﻼس ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻧـﺸﺪه اﺳﺖ ،ﭘﺲ ﺑﺮاي اﺳﺘﻔﺎده از آن ﺑﺎﻳﺪ ﻧﺎم ﻛﻼس را ﺑﻪ ﻫﻤﺮاه ﻓﻀﺎي ﻧﺎم آن ﻳﻌﻨﻲ ﺑﻪ ﺻﻮرت System.IO.Fileﺑﻪ ﻛﺎر ﺑﺒﺮﻳﻢ. // Read the contents of the file = txtFile.Text ;)System.IO.File.ReadAllText(strFileName ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ ReadAllTextدر ﻛﻼس System.IO.Fileﻣﻲ ﺗﻮاﻧﻴﻢ ﻣﺤﺘﻮﻳﺎت ﻳﻚ ﻓﺎﻳﻞ ﻣﺘﻨﻲ را از دﻳﺴﻚ ﺑﺨﻮاﻧﻴﻢ .دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﺗﺎﺑﻊ ReadAllTextﺑﻪ ﮔﻮﻧﻪ اي ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﻛﻪ ﺑﺮاي اﺳﺘﻔﺎده از آن ﻻزم ﻧﻴﺴﺖ اﺑﺘﺪا ﻳـﻚ ﺷـﻴﺊ از ﻛﻼس Fileاﻳﺠﺎد ﻛﻨﻴﻢ .اﻳﻦ ﻧﻮع ﺗﻮاﺑﻊ ،ﺗﻮاﺑﻊ Staticﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ در ﻓﺼﻞ دﻫﻢ ﺑﺎ ﻣﻔﻬﻮم آﻧﻬﺎ آﺷﻨﺎ ﺧـﻮاﻫﻴﻢ ﺷـﺪ. اﻳﻦ ﺗﺎﺑﻊ ﭘﺎراﻣﺘﺮي از ﻧﻮع رﺷﺘﻪ ﻛﻪ ﺣﺎوي آدرس ﻓﺎﻳﻞ ﻣﻮرد ﻧﻈﺮ اﺳﺖ را درﻳﺎﻓﺖ ﻛﺮده و ﻣﺘﻦ داﺧﻞ ﻓﺎﻳـﻞ را ﺑـﻪ ﺻـﻮرت رﺷـﺘﻪ ﺑﺮﻣـﻲ ﮔﺮداﻧﺪ. در اﻳــﻦ ﺑﺮﻧﺎﻣــﻪ اﺑﺘــﺪا آدرﺳــﻲ ﻛــﻪ ﺑــﻪ وﺳــﻴﻠﻪ ﻛﻨﺘــﺮل OpenFileDialogﻣــﺸﺨﺺ ﺷــﺪه اﺳــﺖ را در ﻣﺘﻐﻴﻴــﺮ strFileNameﻗﺮار ﻣﻲ دﻫﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻟﻴﺴﺖ ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻧﺎم ﻓﺎﻳﻞ اﻧﺘﺨـﺎب ﺷـﺪه ﺗﻮﺳـﻂ ﻛﺎرﺑﺮ در ﺧﺎﺻﻴﺖ FileNameآن ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر زﻳﺮ ﻧﺎم ﻓﺎﻳﻞ را در ﻣﺘﻐﻴﻴـﺮ strFileName ﻗﺮار ﻣﻲ دﻫﻴﻢ. // Save the file name ;strFileName = openFileDialog1.FileName ﺳﭙﺲ ﺑـﺎ اﺳـﺘﻔﺎده از ﺗـﺎﺑﻊ ReadAllTextﻛـﻼس Fileو ارﺳـﺎل ﻣﺘﻐﻴﻴـﺮ strFileNameﺑـﻪ ﻋﻨـﻮان ﭘـﺎراﻣﺘﺮ، ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ را ﺧﻮاﻧﺪه و ﻧﺘﻴﺠﻪ را ﻛﻪ ﺑﻪ ﺻﻮرت ﻣﺘﻐﻴﺮ رﺷﺘﻪ اي ﺑﺮﮔﺸﺖ داده ﻣﻲ ﺷﻮد در TextBoxﻗﺮار ﻣﻲ دﻫﻴﻢ. // Read the contents of the file ;)txtFile.Text = System.IO.File.ReadAllText(strFileName در اﻳﻦ ﺗﻤﺮﻳﻦ ﺑﺎ ﻗﺴﻤﺘﻲ از ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻛﻼس OpenFileDialogآﺷﻨﺎ ﺷﺪﻳﻢ .اﻣﺎ ﻫﻤﭽﻨﺎن ﺗﻌﺪاد زﻳﺎدي از آﻧﻬـﺎ ﺑﺎﻗﻲ ﻣﺎﻧﺪه اﺳﺖ ﻛﻪ درﺑﺎره آﻧﻬﺎ ﺻﺤﺒﺘﻲ ﻧﻜﺮده اﻳﻢ .ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﺗﻤﺮﻳﻦ و اﺳﺘﻔﺎده از اﻳﻦ ﻛﻨﺘﺮل در ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﮔﻮﻧـﺎﮔﻮن ﺑـﺎ ﺗﻮاﺑـﻊ و ﻗﺎﺑﻠﻴﺘﻬﺎي ﻓﺮاواﻧﻲ ﻛﻪ اراﺋﻪ ﻣﻲ دﻫﺪ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺷﻮﻳﺪ. 1راﻫﻨﻤﺎي usingدر زﺑﺎن C#ﺑﺎ دﺳﺘﻮر usingدر C++ﻣﻘﺪاري ﻣﺘﻔﺎوت اﺳﺖ و ﺑﻴﺸﺘﺮ ﻣﻲ ﺗﻮان آن را ﻣﺸﺎﺑﻪ دﺳـﺘﻮر ﭘـﻴﺶ ﭘﺮدازﻧـﺪه include در C++ﺗﻠﻘﻲ ﻛﺮد .در ﻣﻮرد usingدر اداﻣﻪ ي ﻛﺘﺎب ﺑﻴﺸﺘﺮ ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد.
٢٦٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻨﺘﺮل :SaveFileDialog ﺣﺎل ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل OpenFileDialogﻳﻚ ﻓﺎﻳﻞ را ﺑﺎز ﻛﺮده و از اﻃﻼﻋﺎت آن در ﺑﺮﻧﺎﻣﻪ اﺳـﺘﻔﺎده ﻛﻨﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﺑﺮرﺳﻲ ﻛﻨﺘﺮل SaveFileDialogﺑﭙﺮدازﻳﻢ ﺗﺎ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ﻛـﻪ ﭼﮕﻮﻧـﻪ ﻣـﻲ ﺗـﻮان ﺑـﻪ وﺳـﻴﻠﻪ آن اﻃﻼﻋﺎﺗﻲ را در دﻳﺴﻚ ذﺧﻴﺮه ﻛﺮد .ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮل ،OpenFileDialogاﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﻫﻢ ﺑﻪ ﺻﻮرت ﻳﻚ ﻛﻨﺘـﺮل و ﻫﻢ ﺑﻪ ﺻﻮرت ﻳﻚ ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد .اﻟﺒﺘﻪ در اﻳﻦ ﻗﺴﻤﺖ از SaveFileDialogﺑـﻪ ﻋﻨـﻮان ﻳـﻚ ﻛﻨﺘـﺮل اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ،اﻣﺎ ﺑﻌﺪ از اﻳﻨﻜﻪ ﺑﺎ اﻳﻦ ﻛﻨﺘﺮل ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺷﺪﻳﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ از آن ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻛﻼس ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺑﻌﺪ از اﻳﻨﻜﻪ ﻓﺎﻳﻠﻲ را در ﺑﺮﻧﺎﻣﻪ ﺑﺎز ﻛﺮدﻳﺪ ،ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﺗﻐﻴﻴﺮاﺗﻲ در آن اﻳﺠﺎد ﻛﺮده و ﻧﺘﻴﺠﻪ را در دﻳﺴﻚ ذﺧﻴﺮه ﻛﻨﻴـﺪ .در اﻳـﻦ ﺷﺮاﻳﻂ اﺳﺖ ﻛﻪ ﻛﻨﺘﺮل SaveFileDialogﻣﻲ ﺗﻮاﻧﺪ ﻣﻮﺛﺮ واﻗﻊ ﺷﻮد .ﻛﻨﺘﺮل SaveFileDialogﻧﻴﺰ ﻛـﺎرﻛﺮدي ﻣﺸﺎﺑﻪ ﻛﻨﺘﺮل OpenFileDialogدارد ،اﻟﺒﺘﻪ در ﺟﻬﺖ ﻋﻜﺲ .اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﻳﻚ ﻧـﺎم و آدرس را ﺑـﺮاي ذﺧﻴﺮه ي ﻳﻚ ﻓﺎﻳﻞ در دﻳﺴﻚ از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻛﻨﻴﺪ .ﻣﺠﺪداً ﺑﺎﻳﺪ ذﻛﺮ ﻛـﻨﻢ ﻛـﻪ ﻫﻤﺎﻧﻨـﺪ ﻛﻨﺘـﺮل OpenFileDialogاﻳـﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﻓﺎﻳﻠﻲ را در دﻳﺴﻚ ذﺧﻴﺮه ﻧﻤﻲ ﻛﻨﺪ ،ﺑﻠﻜﻪ ﻓﻘﻂ ﻳﻚ راﺑﻂ اﺳﺘﺎﻧﺪارد را ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﺟﻮد ﻣﻲ آورد ﺗـﺎ ﻛـﺎرﺑﺮ ﺑـﻪ وﺳـﻴﻠﻪ آن ﺑﺘﻮاﻧﺪ ﻣﺤﻠﻲ را ﺑﺮاي ذﺧﻴﺮه اﻃﻼﻋﺎت ﻣﺸﺨﺺ ﻛﻨﺪ.
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :SaveFileDialog در ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﺧﺼﻮﺻﻴﺖ ﻫﺎي ﭘﺮ ﻛﺎرﺑﺮد ﻛﻨﺘﺮل SaveFileDialogﺑـﻪ ﻫﻤـﺮاه ﻛـﺎرﺑﺮد آﻧﻬـﺎ آورده ﺷـﺪه اﺳـﺖ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ اﻳﻦ ﻛﻨﺘﺮل )و ﻳﺎ اﻳﻦ ﻛﻼس ،ﺑﺴﺘﻪ ﺑﻪ ﻧﻮﻋﻲ ﻛﻪ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ( ،ﺧﺎﺻﻴﺘﻬﺎي زﻳﺎدي دارد ﻛﻪ ﻣﻲ ﺗﻮان ﺑﻪ وﺳﻴﻠﻪ آﻧﻬﺎ ،رﻓﺘﺎر ﻛﻨﺘﺮل را در ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﻴﺮ داد. ﺧﺎﺻﻴﺖ
ﺷﺮح
AddExtension
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﭘﺴﻮﻧﺪ ﻓﺎﻳﻞ را ﺗﻌﻴﻴﻦ ﻧﻜﺮد ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ ﭘﺴﻮﻧﺪ را ﺑﻪ ﻓﺎﻳﻞ اﺿﺎﻓﻪ ﻛﻨﺪ.
CheckFileExist
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﻧﺎم ﻓﺎﻳﻠﻲ را ﻣﺸﺨﺺ ﻛﺮد ﻛـﻪ در دﻳـﺴﻚ وﺟـﻮد داﺷـﺖ، ﭘﻴﻐﺎم ﻫﺸﺪاري ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟ اﻳﻦ ﻣﻮرد ﻣﻌﻤﻮﻻ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻛـﺎرﺑﺮ ﺑﺨﻮاﻫـﺪ ﻓﺎﻳﻞ را ﺑﺮ روي ﻳﻚ ﻓﺎﻳﻞ ﻣﻮﺟﻮد ﺑﻨﻮﻳﺴﺪ ﻛﺎرﺑﺮد دارد.
CheckPathExist
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ آدرس ﻓﺎﻳﻠﻲ را ﻣﺸﺨﺺ ﻛﺮد ﻛﻪ در دﻳﺴﻚ وﺟﻮد ﻧﺪاﺷﺖ، ﭘﻴﻐﺎم ﻫﺸﺪاري ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
CreatePrompt
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﻓﺎﻳﻠﻲ را ﻣﺸﺨﺺ ﻛﺮد ﻛﻪ وﺟﻮد ﻧﺪاﺷـﺖ ،ﺑـﺮاي اﻳﺠـﺎد آن ﻓﺎﻳﻞ از ﻛﺎرﺑﺮ ﺳﻮال ﺷﻮد ﻳﺎ ﻧﻪ؟
DefaultExt
ﭘﺴﻮﻧﺪ ﭘﻴﺶ ﻓﺮض را در اﻳﻦ ﻛﺎدر ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
DereferenceLinks
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﻳﻚ ﺷﻮرت ﻛﺎت را اﻧﺘﺨﺎب ﻛﺮد ،آدرس ﻓﺎﻳـﻞ اﺻـﻠﻲ ﻛـﻪ ﺷﻮرت ﻛﺎت ﺑﻪ آن اﺷﺎره ﻣﻲ ﻛﻨﺪ ﺑﺮﮔﺸﺘﻪ ﺷﻮد و ﻳﺎ آدرس ﺧﻮد ﻓﺎﻳﻞ ﺷـﻮرت ﻛـﺎت ﺑـﻪ
٢٦٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺮدد. FileName
ﻧﺎم ﻓﺎﻳﻠﻲ ﻛﻪ در ﻛﺎدر ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ اﺳﺖ.
FileNames
ﻧﺎم ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛﻪ در ﻛﺎدر ﺗﻮﺳﻂ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﻳـﻦ ﺧﺎﺻـﻴﺖ ﻛﻪ ﺷﺎﻣﻞ ﻳﻚ آراﻳﻪ رﺷﺘﻪ اي اﺳﺖ ﻧﻴﺰ ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ اﺳﺖ.
Filter
اﻳﻦ ﺧﺎﺻﻴﺖ ﺣﺎوي رﺷﺘﻪ اي اﺳﺖ ﻛﻪ ﺑﺮاي ﻓﻴﻠﺘﺮ ﻛﺮدن ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛـﻪ ﺑﺎﻳـﺪ در ﭘﻨﺠـﺮه Saveﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ رﺷـﺘﻪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ،ﭼﻨـﺪﻳﻦ ﮔﺮوه ﻓﻴﻠﺘﺮ را ﺑﺮاي اﻳﻦ ﭘﻨﺠﺮه ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﺎ در ﺟﻌﺒﻪ ﺗﺮﻛﻴﺒﻲ ﻣﻮﺟﻮد در اﻳﻦ ﭘﻨﺠـﺮه ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ و ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻳﻜﻲ از آﻧﻬﺎ را اﻧﺘﺨﺎب ﻛﻨﺪ.
FilterIndex
ﻣﺸﺨﺺ ﻛﻨﻨﺪه اﻧﺪﻳﺲ ﻓﻴﻠﺘﺮي اﺳﺖ ﻛﻪ ﻫﻢ اﻛﻨﻮن در ﻛﺎدر ﻣﺤﺎوره اي اﻧﺘﺨـﺎب ﺷـﺪه اﺳﺖ.
InitialDirectory
ﻣﺸﺨﺺ ﻛﻨﻨﺪه آدرس داﻳﺮﻛﺘﻮري اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ در اﺑﺘـﺪا ،در ﭘﻨﺠـﺮه Saveﻧﻤـﺎﻳﺶ داده ﺷﻮد.
OverwritePrompt
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﺧﻮاﺳﺖ ﻓﺎﻳﻞ را ﺑﺮ روي ﻓﺎﻳﻞ دﻳﮕﺮي ذﺧﻴـﺮه ﻛﻨـﺪ ،ﭘﻴﻐـﺎم ﻫﺸﺪار ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
ResotreDirectory
ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛﺎدر Saveﺑﺎﻳﺪ آدرس داﻳﺮﻛﺘﻮري را ﻛﻪ ﻗﺒﻞ از ﺑﺴﺘﻪ ﺷﺪن در آن ﻗﺮار داﺷﺖ ،ﺑﺮﮔﺮداﻧﺪ ﻳﺎ ﻧﻪ؟
ShowHelp
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ دﻛﻤﻪ Helpﻧﻴﺰ در ﭘﻨﺠﺮه Openﻧﻤـﺎﻳﺶ داده ﺷـﻮد ﻳـﺎ ﻧﻪ؟
Title
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺘﻨﻲ اﺳﺖ ﻛﻪ در ﻧﻮار ﻋﻨﻮان ﭘﻨﺠﺮه Openﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ValidateNames
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﭘﻨﺠﺮه ﻓﻘﻂ ﺑﺎﻳﺪ ﻧﺎم ﻓﺎﻳﻠﻬﺎي ﻣﻌﺘﺒﺮ وﻳﻨﺪوزي را ﻗﺒﻮل ﻛﻨﺪ و ﻳﺎ ﻫﺮ ﻧﺎﻣﻲ را ﺑﺘﻮاﻧﺪ درﻳﺎﻓﺖ ﻛﻨﺪ؟
ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل :SaveFileDialog ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل SaveFileDialogﻫﻤﺎﻧﻨﺪ ﻣﺘﺪﻫﺎي OpenFileDialogﻫﺴﺘﻨﺪ .ﺑﺮاي ﻣﻄﺎﻟﻌﻪ ﻣﺘﺪﻫﺎي ﻛﻨﺘـﺮل OpenFileDialogﻣــﻲ ﺗﻮاﻧﻴــﺪ ﺑــﻪ ﺑﺨــﺶ ﻗﺒﻠــﻲ ﻣﺮاﺟﻌــﻪ ﻛﻨﻴــﺪ .در ﺗﻤــﺎم ﻣﺜــﺎل ﻫــﺎي ﺑﻌــﺪي ﻧﻴــﺰ ﻫﻤﺎﻧﻨــﺪ ﻛﻨﺘــﺮل OpenFileDialogاز ﺗﺎﺑﻊ ShowDialogﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر Saveاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :SaveFileDialog
٢٦٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﺑﺮرﺳﻲ ﻧﺤﻮه ﻛﺎرﻛﺮد ﻛﻨﺘﺮل ،SaveFileDialogاز ﭘﺮوژه Dialogsدر ﻗﺴﻤﺖ ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .در اﻳـﻦ ﻗﺴﻤﺖ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺻﻮرﺗﻲ ﺗﻐﻴﻴﺮ دﻫﻴﻢ ﻛﻪ ﻣﺘﻦ داﺧﻞ TextBoxرا در ﻓﺎﻳﻠﻲ ذﺧﻴﺮه ﻛﻨﺪ. در اﻳﻦ ﻗﺴﻤﺖ ،ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل SaveFileDialogﭘﻨﺠﺮه Save Fileرا ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ داده و ﺑـﻪ او اﺟـﺎزه ﻣﻲ دﻫﻴﻢ ﺗﺎ ﻣﻜﺎﻧﻲ را ﺑﺮاي ذﺧﻴﺮه ﻣﺤﺘﻮﻳﺎت TextBoxﻣﺸﺨﺺ ﻛﻨﺪ .ﺳﭙﺲ ﻣﺤﺘﻮﻳﺎت داﺧﻞ آن را در ﻓﺎﻳﻠﻲ در ﻣـﺴﻴﺮ ﻣـﺸﺨﺺ ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل SaveFileDialog (1ﺑﺮﻧﺎﻣﻪ Dialogsرا ﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﻢ ،ﻣﺠﺪدا ﺑﺎز ﻛﻨﻴﺪ. (2در ﻓﺮم اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻛﻨﺘﺮل Buttonدﻳﮕﺮي اﺿﺎﻓﻪ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﺑﺮاﺑﺮ ﺑﺎ ﻟﻴﺴﺖ زﻳﺮ ﻗﺮار دﻫﻴﺪ.
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ btnSaveﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Saveﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ Top,Rightﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Locationرا ﺑﺮاﺑﺮ ﺑﺎ 367;38ﻗﺮار دﻫﻴﺪ.
(3در ﺟﻌﺒﻪ اﺑﺰار ﺑﻪ ﻗﺴﻤﺖ Dialogsﺑﺮوﻳﺪ و ﺑﺮ روي ﻛﻨﺘﺮل SaveFileDialogدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳـﻦ ﺗﺮﺗﻴﺐ ﻳﻚ ﻛﻨﺘﺮل SaveFileDialogدر ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﻃﺮاﺣﻲ ﻓﺮم ﻗﺮار ﻣﻲ ﮔﻴﺮد. (4ﺑﺮ روي دﻛﻤﻪ ي btnSaveدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛـﺪ زﻳـﺮ را در آن ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void btnSave_Click(object sender, EventArgs e { // Set the save dialog properties ;"saveFileDialog1.DefaultExt = "txt ;saveFileDialog1.FileName = strFileName = saveFileDialog1.Filter ;"*"Text files (*.txt)|*.txt|All files (*.*)|*. ;saveFileDialog1.FilterIndex = 1 ;saveFileDialog1.OverwritePrompt = true ;"saveFileDialog1.Title = "Demo Save File Dialog // Show the Save file dialog and if the user clicks // Save button, save the file )if (saveFileDialog1.ShowDialog() == DialogResult.OK { // Save the file name ;strFileName = saveFileDialog1.FileName
the
// Write the contents of the text box in file (System.IO.File.WriteAllText
٢٧٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)strFileName, txtFile.Text } } (5در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﺗﺴﺖ ﻛﻨﻴﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﭘﺮوژه را اﺟﺮا ﻛﺮده و ﻣﺘﻦ ﺳﺎده اي را داﺧﻞ آن وارد ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ ي Saveﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻛﺎدر ﻣﺤﺎوره اي Saveﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ. (6ﻧﺎﻣﻲ را ﺑﺮاي ﻓﺎﻳﻞ اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻦ داﺧـﻞ TextBoxدر ﻓـﺎﻳﻠﻲ ﺑﺎ ﻧﺎم و ﻣﺴﻴﺮي ﻛﻪ ﻣﺸﺨﺺ ﻛﺮده ﺑﻮدﻳﺪ ذﺧﻴﺮه ﻣﻲ ﺷﻮد .ﺑﺮاي اﻣﺘﺤﺎن اﻳﻦ ﻣﻮرد ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑـﺮ روي دﻛﻤـﻪ ي Openﻓﺎﻳﻞ اﻳﺠﺎد ﺷﺪه را ﻣﺠﺪداً در ﺑﺮﻧﺎﻣﻪ ﺑﺎز ﻛﺮده و ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ. (7ﺑﺮاي ﺗﺴﺖ ﻋﻤﻠﻜﺮد ﺧﺎﺻﻴﺖ OverwritePromptدر ﻛﻨﺘﺮل SaveFileDialogﻣﺘﻦ دﻳﮕﺮي را در TextBoxوارد ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ ي Saveﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺠﺪداً ﻣﺴﻴﺮ و ﻧﺎم ﻓﺎﻳﻞ ﻗﺒﻠـﻲ را ﺑـﺮاي ذﺧﻴـﺮه ﻓﺎﻳـﻞ ﺟﺪﻳﺪ وارد ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭘﻴﻐﺎﻣﻲ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 9-7ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﻓﺎﻳﻠﻲ ﺑﺎ اﻳـﻦ ﻧـﺎم ﻣﻮﺟﻮد اﺳﺖ .آﻳﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ آن را ﺑﺎ اﻳﻦ ﻓﺎﻳﻞ ﺗﻌﻮﻳﺾ ﻛﻨﺪ؟ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺮ روي ﮔﺰﻳﻨﻪ Yesﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻓﺎﻳـﻞ ﻗﺒﻠـﻲ ﭘﺎك ﻣﻲ ﺷﻮد و ﻓﺎﻳﻞ ﺟﺪﻳﺪ ﺑﻪ ﺟﺎي آن ﻗﺮار ﻣﻲ ﮔﻴﺮد .اﮔﺮ ﺑﺮ روي ﮔﺰﻳﻨﻪ Noﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﺑﻪ ﻛﺎدر Saveﺑﺮﻣﻲ ﮔﺮدﻳﺪ ﺗﺎ ﻧﺎم دﻳﮕﺮي را ﺑﺮاي ﻓﺎﻳﻞ اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
ﺷﻜﻞ 9-7 ﻧﻜﺘﻪ :ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺻﻔﺤﻪ Saveو ﻳﺎ Openﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ،ﻣﻨﻮﻳﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﻠﻴﻚ راﺳﺖ ﻧﻤﺎﻳﺶ داده اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﺎرﻫﺎﻳﻲ را از ﻗﺒﻴﻞ اﻧﺘﻘﺎل ﻓﺎﻳﻞ ﺑﻪ ﻣﺤﻠﻲ دﻳﮕﺮ ،ﺣﺬف ﻓﺎﻳﻞ و ﻳﺎ ﺗﻐﻴﻴﺮ ﻧﺎم آن را اﻧﺠﺎم دﻫﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﺮ ﺣﺴﺐ اﻳﻨﻜﻪ ﭼﻪ ﻧﺮم اﻓﺰارﻫﺎﻳﻲ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﺷﻤﺎ ﻧﺼﺐ ﺷﺪه ﺑﺎﺷﻨﺪ ﮔﺰﻳﻨﻪ ﻫﺎي دﻳﮕﺮي ﻧﻴﺰ در اﻳﻦ ﻣﻨﻮ ﻧﻤﺎﻳﺶ داده ﻣـﻲ ﺷـﻮﻧﺪ .ﺑـﺮاي ﻣﺜـﺎل اﮔـﺮ WinZipﻳـﺎ WinRarﺑﺮ روي ﺳﻴﺴﺘﻢ ﺷﻤﺎ ﻧﺼﺐ ﺷﺪه ﺑﺎﺷﺪ ،در اﻳﻦ ﭘﻨﺠﺮه ﻣﻲ ﺗﻮاﻧﻴﺪ ﻓﺎﻳﻠﻬﺎ را ﻓﺸﺮده ﻛﻨﻴﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻗﺒﻞ از ﻧﻤﺎﻳﺶ ﻛﻨﺘﺮل SaveFileDialogﺑﺎﻳﺪ ﺑﻌﻀﻲ از ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﺗﺎ ﺑﺘﻮاﻧﻴﺪ از آن ﺑﻪ ﺻﻮرت ﻣﻨﺎﺳﺐ در ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اول ﺧﺎﺻﻴﺖ DefaultExtرا ﺗﻨﻈﻴﻢ ﻛﺮده اﻳﻢ .اﮔﺮ ﻛﺎرﺑﺮ ﻫﻨﮕﺎم ﻣﺸﺨﺺ ﻛﺮدن ﻧﺎم ﻓﺎﻳﻞ ﭘﺴﻮﻧﺪي ﺑﺮاي آن ﻣﺸﺨﺺ ﻧﻜﺮده ﺑﺎﺷﺪ ،ﭘﺴﻮﻧﺪي ﻛﻪ در اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ ﺑﻪ اﻧﺘﻬﺎي ﻓﺎﻳﻞ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻛﺎرﺑﺮ ﻫﻨﮕﺎم ذﺧﻴﺮه ﻓﺎﻳﻞ ﻧﺎم testرا ﺑﺪون ﻫﻴﭻ ﭘـﺴﻮﻧﺪي وارد ﻛـﺮده و ﺑـﺮ روي دﻛﻤـﻪ Save ﻛﻠﻴﻚ ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺣﺎﻟﺖ ﭘﺴﻮﻧﺪي ﻛﻪ در اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ ﺑﻪ اﻧﺘﻬـﺎي ﻓﺎﻳـﻞ اﺿـﺎﻓﻪ ﺷـﺪه و ﺳـﭙﺲ ﻓﺎﻳـﻞ ﺑـﺎ ﻧـﺎم test.txtدر دﻳﺴﻚ ذﺧﻴﺮه ﻣﻲ ﺷﻮد.
٢٧١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;"saveFileDialog1.DefaultExt = "txt ﺳﭙﺲ ﺧﺎﺻﻴﺖ FileNameاز اﻳﻦ ﻛﻨﺘﺮل را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار ﻣﺘﻐﻴﺮ strFileNameﻗﺮار ﻣﻲ دﻫﻴﻢ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻓﺎﻳـﻞ را ﺑﺎ اﺳﺘﻔﺎده از دﻛﻤﻪ ي Openﺑﺎز ﻛﻨﻴﺪ ،ﻧﺎم آن در اﻳﻦ ﻣﺘﻐﻴﺮ ذﺧﻴﺮه ﻣﻲ ﺷﻮد .ﺑﺎ ﻗﺮار دادن اﻳﻦ ﻣﺘﻐﻴﺮ در ﺧﺎﺻـﻴﺖ FileName ﻛﻨﺘﺮل SaveFileDialogﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻳﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺪون وارد ﻛﺮدن ﻧﺎم ﻓﺎﻳﻞ ﺑﺘﻮاﻧﺪ ﻳﻚ ﻓﺎﻳﻞ را ﺑﺎز ﻛﺮده ،آن را وﻳﺮاﻳﺶ ﻛﻨﺪ و ﺳﭙﺲ آن را ذﺧﻴﺮه ﻛﻨﺪ .اﻟﺒﺘﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﺗﻐﻴﻴﺮ اﻳﻦ ﻧﺎم در ﻛﺎدر Saveﻧﺎم ﺟﺪﻳﺪي ﺑﺮاي ﻓﺎﻳﻞ اﻧﺘﺨﺎب ﻛﻨﺪ و ﻳـﺎ ﻓﺎﻳـﻞ را در ﻣﺴﻴﺮ دﻳﮕﺮي ذﺧﻴﺮه ﻛﻨﺪ. ;saveFileDialog1.FileName = strFileName در دو ﺧﻂ ﺑﻌﺪي ﺧﺎﺻﻴﺖ Filterو FilterIndexﻛﻨﺘﺮل را ﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻓﺎﻳﻠﻬﺎي ﺧﺎﺻـﻲ در ﻛـﺎدر ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﻨﺪ ﺷﺪ: = saveFileDialog1.Filter ;"*"Text files (*.txt)|*.txt|All files (*.*)|*. ;saveFileDialog1.FilterIndex = 1
ﺧﺎﺻﻴﺖ OverwritePromptﻣﻘﺪاري را از ﻧﻮع Booleanﻗﺒﻮل ﻣﻲ ﻛﻨﺪ .اﮔﺮ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﺮاﺑﺮ ﺑﺎ True ﻗﺮار دﻫﻴﺪ ،در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺨﻮاﻫﺪ ﻓﺎﻳﻠﻲ را ﺑﺮ روي ﻓﺎﻳﻞ دﻳﮕﺮي ذﺧﻴﺮه ﻛﻨﺪ ﺑﻪ او ﻫﺸﺪار داده ﻣﻲ ﺷﻮد .اﮔﺮ ﻣﻘـﺪار اﻳـﻦ ﺧﺎﺻـﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ Falseﺑﺎﺷﺪ ،در ﺻﻮرت رخ دادن ﭼﻨﻴﻦ ﻣﺸﻜﻠﻲ ،ﺑﺪون اﻳﻨﻜﻪ ﻣﻮردي ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع داده ﺷﻮد ﻓﺎﻳﻞ ﻗﺒﻠﻲ ﭘﺎك ﻣﻲ ﺷـﻮد و ﻓﺎﻳﻞ ﺟﺪﻳﺪ ﺑﺮ روي آن ذﺧﻴﺮه ﻣﻲ ﺷﻮد. ;saveFileDialog1.OverwritePrompt = true در اﻧﺘﻬﺎ ﻧﻴﺰ ﻋﻨﻮان ﭘﻨﺠﺮه Saveرا ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﻢ ﺗﺎ ﺑﺎ ﻧﺎم ﺑﺮﻧﺎﻣﻪ ﻫﻤﺎﻫﻨﮓ ﺷﻮد: ;"saveFileDialog1.Title = "Demo Save File Dialog ﺑﻌﺪ از اﻳﻨﻜﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻣﺨﺘﻠﻒ ﻛﺎدر Saveرا ﺗﻨﻈﻴﻢ ﻛﺮدﻳﻢ ،ﻣﻲ ﺗﻮاﻧﻴﻢ ﻛﺎدر را ﻧﻤـﺎﻳﺶ دﻫـﻴﻢ .ﺳـﭙﺲ ﺑـﺎ اﺳـﺘﻔﺎده از دﺳـﺘﻮر if ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Saveﻛﻠﻴﻚ ﻛﺮده اﺳﺖ و ﻳﺎ ﺑﺮ روي دﻛﻤﻪ .Cancelدر اﻳـﻦ ﻛﻨﺘـﺮل ﻫـﻢ ﻫﻤﺎﻧﻨـﺪ ﻛﻨﺘﺮل OpenFileDialogاﮔﺮ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ Saveﻛﻠﻴـﻚ ﻛﻨـﺪ ﻣﻘـﺪار DialogResult.OKو اﮔـﺮ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ ﻓﺮﻣﺎن Cancelﻛﻠﻴﻚ ﻛﻨﺪ ﻣﻘﺪار DialogResult.Cancelﺑﺮﮔﺸﺖ داده ﻣﻲ ﺷﻮد. )if (saveFileDialog1.ShowDialog() == DialogResult.OK اﮔﺮ ﻛﺎرﺑﺮ ﮔﺰﻳﻨﻪ Saveرا اﻧﺘﺨﺎب ﻛﺮده ﺑﻮد ،اﺑﺘﺪا ﺑﺎﻳﺪ ﻧﺎم ﻓﺎﻳﻞ را در ﻣﺘﻐﻴﺮ strFileNameذﺧﻴﺮه ﻛﻨـﻴﻢ .ﺳـﭙﺲ ﻣﺠـﺪداً از ﻛﻼس Fileﺑﺮاي ذﺧﻴﺮه ﻣﺤﺘﻮﻳﺎت ﻓﺮم ،درون ﻓﺎﻳﻞ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .اﻣﺎ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ از ﻣﺘﺪ WriteAllTextدر اﻳﻦ ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ ﻧﻴﺰ ﺑﻪ ﻧﻤﻮﻧﻪ ﺳﺎزي از اﻳﻦ ﻛﻼس ﻧﻴﺎزي ﻧﺪارد .اﻳﻦ ﻣﺘﺪ آدرس ﻳـﻚ ﻓﺎﻳـﻞ و ﻳـﻚ ﻣﺘﻐﻴﻴـﺮ
٢٧٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
رﺷﺘﻪ اي ﻛﻪ ﺣﺎوي ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ اﺳﺖ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻛﺮده و در آدرس ﺗﻌﻴﻴﻦ ﺷﺪه ،ﻓﺎﻳﻠﻲ را ﺑـﺎ ﻣﺤﺘﻮﻳـﺎﺗﻲ ﻛـﻪ ﺑـﻪ آن ﻓﺮﺳﺘﺎده ﺷﺪه اﺳﺖ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ: // Save the file name ;strFileName = saveFileDialog1.FileName // Write the contents of the text box in file (System.IO.File.WriteAllText ;)strFileName, txtFile.Text
ﻛﻨﺘﺮل :FontDialog ﺑﻌﻀﻲ ﻣﻮاﻗﻊ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻛﻪ ﻓﻮﻧﺖ ﺧﺎﺻﻲ را اﻧﺘﺨـﺎب ﻛﻨـﺪ ﺗـﺎ اﻃﻼﻋـﺎت او ﺑـﺎ آن ﻓﻮﻧـﺖ ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ ،و ﻳﺎ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻟﻴﺴﺘﻲ از ﺗﻤﺎم ﻓﻮﻧﺖ ﻫﺎﻳﻲ ﻛﻪ در ﺳﻴﺴﺘﻢ ﻛﺎرﺑﺮ ﻧـﺼﺐ ﺷـﺪه اﺳـﺖ را در ﺑﺮﻧﺎﻣـﻪ اﺳـﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﻣﻮاﻗﻊ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻛﻨﺘﺮل FontDialogاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﺗﻤﺎم ﻓﻮﻧﺘﻬﺎي ﻧﺼﺐ ﺷﺪه در ﺳﻴـﺴﺘﻢ ﻛـﺎرﺑﺮ را در ﻳﻚ ﻛﺎدر اﺳﺘﺎﻧﺪارد ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﺎ ﻓﻮﻧﺖ ﺧﺎﺻﻲ را ﺑﻴﻦ آﻧﻬﺎ اﻧﺘﺨﺎب ﻛﻨﺪ. ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي OpenFileDialogو ،SaveFileDialogﻛﺎدر ﻣﺤﺎوره اي FontDialogﻫـﻢ ﻣـﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻳﻚ ﻛﻨﺘﺮل و ﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻳﻚ ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد .اﺳﺘﻔﺎده از اﻳـﻦ ﻛـﺎدر ﺑـﺴﻴﺎر راﺣـﺖ اﺳـﺖ. ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺗﻌﺪادي از ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ،ﻛﺎدر را ﻧﻤﺎﻳﺶ دﻫﻴﺪ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي ﻛﺎدر ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛـﻪ ﻛﺪام ﻓﻮﻧﺖ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ.
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :FontDialog ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﭘﺮ ﻛﺎرﺑﺮد FontDialogرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. ﺧﺎﺻﻴﺖ
ﺷﺮح
AllowScriptChange
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛـﺎرﺑﺮ ﻣـﻲ ﺗﻮاﻧـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﻗـﺴﻤﺖ Scriptﻛـﺎدر، ﻣﺠﻤﻮﻋﻪ ﻛﺎراﻛﺘﺮﻫﺎﻳﻲ ﺟﺪاي از آﻧﭽﻪ در ﻗﺴﻤﺖ Scriptﻣﺸﺨﺺ ﺷﺪه اﺳﺖ را اﻧﺘﺨﺎب ﻛﻨﺪ ﻳﺎ ﻧﻪ؟ در ﺻﻮرت اﻳﻨﻜﻪ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ Trueﺑﺎﺷﺪ ،ﺗﻤـﺎم ﻣﺠﻤﻮﻋﻪ ﻛﺎراﻛﺘﺮ ﻫﺎي ﻣﻮﺟﻮد در ﻗﺴﻤﺖ Scriptﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
Color
رﻧﮓ ﻓﻮﻧﺖ اﻧﺘﺨﺎب ﺷﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
Font
ﻧﺎم ﻓﻮﻧﺖ اﻧﺘﺨﺎب ﺷﺪه را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
FontMustExist
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ اﮔﺮ ﻛﺎرﺑﺮ ﻧﺎم ﻓﻮﻧﺘﻲ را اﻧﺘﺨﺎب ﻛﺮد ﻛﻪ وﺟﻮد ﻧﺪاﺷﺖ ،ﻛﺎدر ﭘﻴﻐـﺎﻣﻲ ﺑﺮاي ﺧﻄﺎ ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
MaxSize
ﺣﺪاﻛﺜﺮ اﻧﺪازه اي ﻛﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﻓﻮﻧﺖ اﻧﺘﺨﺎب ﻛﻨﺪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
٢٧٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
MinSize
ﺣﺪاﻗﻞ اﻧﺪازه اي ﻛﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﻓﻮﻧﺖ اﻧﺘﺨﺎب ﻛﻨﺪ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
ShowApply
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﺎدر ﻣﺤﺎوره اي ﻛﻪ ﻧﻤﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد ﺑﺎﻳـﺪ داراي دﻛﻤـﻪ ي Applyﻧﻴﺰ ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
ShowColor
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ در ﻛﺎدر ﻓﻮﻧﺖ ،اﻣﻜﺎن اﻧﺘﺨﺎب رﻧﮓ ﻧﻴﺰ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
ShowEffects
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛﺎدر ﻓﻮﻧﺖ ﺑﺎﻳﺪ داراي ﻗﺴﻤﺘﻲ ﺑﺮاي ﺗﻌﻴﻴﻦ ﺧﻂ دار ﺑـﻮدن ،زﻳـﺮ ﺧﻂ دار ﺑﻮدن و ﻳﺎ اﻧﺘﺨﺎب رﻧﮓ ﻣﺘﻦ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
ShowHelp
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻛﺎدر ﻓﻮﻧﺖ داراي دﻛﻤﻪ ﻓﺮﻣﺎن Helpﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل :FontDialog در ﻣﺜﺎل ﻫﺎي ﺑﻌﺪي ﻓﻘﻂ از ﻳﻜﻲ از ﻣﺘﺪﻫﺎي ﻛﻨﺘﺮل FontDialogاﺳﺘﻔﺎده ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ آن ﻧﻴﺰ ﻣﺘـﺪ ShowDialog ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر ﻣﺤﺎوره اي ﺧﻮاﻫﺪ ﺑﻮد .ﻋﻼوه ﺑﺮ اﻳﻦ ﻣﺘﺪ ﻣﺘﺪﻫﺎي زﻳﺎدي ﺑﺮاي اﻳﻦ ﻛﻨﺘﺮل وﺟﻮد دارﻧـﺪ ،ﻣﺎﻧﻨـﺪ ﻣﺘـﺪ Resetﻛـﻪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻣﻘﺪار ﺗﻤﺎم ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل ﺑﻪ ﺣﺎﻟﺖ اول ﺑﺮﮔﺮدد.
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :FontDialog ﺑــﺮاي ﻧﻤــﺎﻳﺶ ﻛﻨﺘــﺮل FontDialogﻧﻴــﺎز ﺑــﻪ ﺗﻨﻈــﻴﻢ ﻫــﻴﭻ ﻣﻘــﺪاري ﻧﻴــﺴﺖ ،ﺑﻠﻜــﻪ ﻣــﻲ ﺗــﻮان ﺑــﻪ ﻃــﻮر ﻣــﺴﺘﻘﻴﻢ ﻣﺘــﺪ ShowDialogاﻳﻦ ﻛﻨﺘﺮل را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد ﺗﺎ ﻛﺎدر ﻣﺤﺎوره اي ﻧﻤﺎﻳﺶ داده ﺷﻮد. ;)(fontDialog1.ShowDialog در اﻳﻦ ﺻﻮرت ﻛﺎدر ﻣﺤﺎوره اي ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 10-7ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
٢٧٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 10-7 ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎدر ﻓﻮﻧﺖ داراي ﻳﻚ ﺑﺨﺶ Effectsاﺳﺖ ﻛﻪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﻌﻴﻴﻦ ﻛﻨﺪ ﻳﻚ ﻓﻮﻧﺖ داراي ﺧﻂ و ﻳﺎ زﻳﺮ ﺧﻂ ﻧﻴﺰ ﺑﺎﺷﺪ .ﻧﻤﺎﻳﺶ اﻳﻦ ﺑﺨﺶ ﺑﻪ اﻳﻦ ﻋﻠﺖ اﺳﺖ ﻛﻪ ﺧﺎﺻـﻴﺖ ShowEffectsﺑـﻪ ﻃـﻮر ﭘـﻴﺶ ﻓـﺮض داراي ﻣﻘـﺪار trueاﺳــﺖ .در اﻳــﻦ ﻛــﺎدر ﻗــﺴﻤﺖ Colorﺑــﺮاي اﻧﺘﺨــﺎب رﻧــﮓ ﻧﻤــﺎﻳﺶ داده ﻧــﺸﺪه اﺳــﺖ ،زﻳــﺮا ﻣﻘــﺪار ﭘــﻴﺶ ﻓــﺮض ShowColorﺑﺮاﺑﺮ ﺑﺎ Falseاﺳﺖ .ﺑﺮاي ﻧﻤﺎﻳﺶ ﻗﺴﻤﺖ رﻧﮓ ،ﺑﺎﻳﺴﺘﻲ ﻗﺒﻞ از ﻓﺮاﺧﻮاﻧﻲ ﺗـﺎﺑﻊ ShowDialogﻣﻘـﺪار اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار داد. ;fontDialog1.ShowColor = true ;)(fontDialog1.ShowDialog ﻣﺘــﺪ ShowDialogاز اﻳــﻦ ﻛــﺎدر ﻣﺤــﺎوره اي ﻧﻴــﺰ ،ﻫﻤﺎﻧﻨــﺪ ﺗﻤــﺎم ﻣﺘــﺪﻫﺎي ShowDialogﻣﻘــﺪاري را از ﻧــﻮع DialogResultﺑﺮﻣـــﻲ ﮔﺮداﻧـــﺪ .اﻳـــﻦ ﻣﻘـــﺪار ﻣـــﻲ ﺗﻮاﻧـــﺪ ﺑﺮاﺑـــﺮ ﺑـــﺎ DialogResult.OKو ﻳـــﺎ DialogResult.Cancelﺑﺎﺷﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎدر ﻓﻮﻧﺖ ﻧﻤﺎﻳﺶ داده ﺷﺪ و ﻛﺎرﺑﺮ ﺑﺮ روي ﮔﺰﻳﻨﻪ OKﻛﻠﻴﻚ ﻛﺮد ،ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﺧﺎﺻـﻴﺘﻬﺎي Colorو Fontﻛﻨﺘﺮل FontDialogﺑﺮرﺳﻲ ﻛﻨﻴﺪ ﻛﻪ ﻛﺎرﺑﺮ ﭼﻪ ﻧﻮع ﻓﻮﻧﺖ و ﭼﻪ رﻧﮕﻲ را اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ و ﺳﭙﺲ آن را در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻳﺎ در ﻣﺘﻐﻴﺮي ﻗﺮار داده و در ﺑﺨﺸﻬﺎي ﺑﻌﺪي اﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﺣﺎل ﻛﻪ ﺑﺎ اﻳﻦ ﻛﺎدر و ﻧﺤﻮه ﻛﺎرﻛﺮد آن آﺷﻨﺎ ﺷﺪﻳﺪ ،در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ از آن اﺳﺘﻔﺎده ﺧﻮاﻫﻴﻢ ﻛﺮد .در ﺑﺨﺶ ﺑﻌﺪ ،از ﺑﺮﻧﺎﻣـﻪ اي ﻛـﻪ در دو ﻣﺜﺎل ﻗﺒﻠﻲ اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﻢ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ و آن را ﻣﻘﺪاري ﮔﺴﺘﺮش ﻣﻲ دﻫﻴﻢ .در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺴﺖ در ﺑﺮﻧﺎﻣـﻪ ﻓﺎﻳﻠﻲ را ﺑﺎز ﻛﺮده ،ﺗﻐﻴﻴﺮاﺗﻲ را در آن اﻧﺠﺎم دﻫﺪ و ﺳﭙﺲ ﻓﺎﻳﻞ را ذﺧﻴﺮه ﻛﻨﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺨﺸﻲ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿـﺎﻓﻪ ﻣـﻲ ﻛﻨـﻴﻢ ﻛـﻪ ﻛﺎرﺑﺮ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﺪ ﻓﻮﻧﺖ ﻣﺘﻦ درون TextBoxرا ﺗﻐﻴﻴﺮ دﻫﺪ.
٢٧٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل FontDialog (1ﻣﺠﺪدا ﭘﺮوژه Dialogsرا ﺑﺎز ﻛﻨﻴﺪ. (2در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ،ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﻣﻄﺎﺑﻖ ﻟﻴﺴﺖ زﻳﺮ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ btnFontﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ Top, Rightﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ 367;68ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Fontﻗﺮار دﻫﻴﺪ.
(3ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر ﻓﻮﻧﺖ ﺑﺎﻳﺪ ﻳﻚ ﻛﻨﺘﺮل FontDialogﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺑﺮاي اﻳـﻦ ﻛـﺎر در ﺟﻌﺒـﻪ اﺑـﺰار ﺑـﻪ ﻗﺴﻤﺖ Dialogsﺑﺮوﻳﺪ و در آﻧﺠﺎ ﺑﺮ روي ﻛﻨﺘﺮل FontDialogدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴـﺪ .ﺑـﻪ اﻳـﻦ ﺻـﻮرت ﻳـﻚ ﻛﻨﺘﺮل FontDialogدر ﻗﺴﻤﺖ ﭘﺎﻳﻦ ﻣﺤﻴﻂ ﻃﺮاﺣﻲ در وﻳﮋوال اﺳﺘﻮدﻳﻮ اﺿﺎﻓﻪ ﺧﻮاﻫﺪ ﺷـﺪ .ﺗﻤـﺎم ﺗﻨﻈﻴﻤـﺎت ﭘـﻴﺶ ﻓﺮض اﻳﻦ ﻛﻨﺘﺮل را ﻗﺒﻮل ﻛﻨﻴﺪ و ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻐﻴﻴﺮ ﻧﺪﻫﻴﺪ. (4ﺑﺮ روي دﻛﻤﻪ ي btnFontدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳـﺮ را ﺑـﻪ آن ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnFont_Click(object sender, EventArgs e { // Set the FontDialog control properties ;fontDialog1.ShowColor = true // Show the Font dialog )if (fontDialog1.ShowDialog() == DialogResult.OK { // If the OK button was clicked set the font // in the text box on the form ;txtFile.Font = fontDialog1.Font // Set the color of the font in the text box // on the form ;txtFile.ForeColor = fontDialog1.Color } } (5ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي دﻛﻤﻪ Startدر ﻧﻮار اﺑﺰار ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪ ﺑـﺮ روي دﻛﻤـﻪ ي Fontﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر ﻣﺤﺎوره اي Fontﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 11-7ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﻓﻮﻧﺖ و رﻧﮓ ﺟﺪﻳﺪي را ﺑﺮاي TextBoxاﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ. (6ﺣﺎل ﭼﻨﺪﻳﻦ ﺧﻂ ﻣﺘﻦ را در ﻓﺮم وارد ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻣﺘﻦ ﺑﺎ ﻓﻮﻧﺖ و رﻧﮓ ﺟﺪﻳﺪ ﻧﻮﺷﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ. (7ﻫﻤﭽﻨﻴﻦ اﮔﺮ ﻓﺎﻳﻠﻲ را ﺑﺎ اﺳﺘﻔﺎده از دﻛﻤﻪ ي Openﺑﺎز ﻛﻨﻴﺪ ،رﻧﮓ و ﻓﻮﻧﺖ ﺟﺪﻳﺪ در آن اﻋﻤﺎل ﻣﻲ ﺷﻮد .ﺑﺮاي ﺗﺴﺖ اﻳـﻦ ﻣﻮرد روي دﻛﻤﻪ ي Openﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر Openﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﺳﭙﺲ ﻳﻚ ﻓﺎﻳﻞ ﻣﺘﻨﻲ را اﻧﺘﺨﺎب ﻛـﺮده و آن را ﺑﺎز ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ ﺑﺎ رﻧﮓ و ﻓﻮﻧﺖ ﺟﺪﻳﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
٢٧٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ،ﻗﺴﻤﺖ رﻧﮓ ﻛﺎدر Fontﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻧﻤﺎﻳﺶ داده ﻧﻤﻲ ﺷﻮد ﭘﺲ ﺑﺮﻧﺎﻣـﻪ را ﺑـﺎ ﺗﻨﻈـﻴﻢ ﻣﻘـﺪار اﻳـﻦ ﺧﺎﺻﻴﺖ ﺑﺎ Trueآﻏﺎز ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﻫﻨﮕﺎم ﻧﻤﺎﻳﺶ ﻛﺎدر ،Fontﻗﺴﻤﺖ Colorﻧﻴﺰ ﻧﻤﺎﻳﺶ داده ﺷﻮد. // Set the FontDialog control properties ;fontDialog1.ShowColor = true
ﺷﻜﻞ 11-7 ﺳﭙﺲ ﻛﺎدر Fontرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﻢ و ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ دﺳﺘﻮر ifﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴـﻚ ﻛـﺮده اﺳــﺖ و ﻳــﺎ ﺑــﺮ روي دﻛﻤــﻪ .Cancelاﮔــﺮ ﻛــﺎرﺑﺮ ﺑــﺮ روي دﻛﻤــﻪ OKﻛﻠﻴــﻚ ﻛــﺮده ﺑﺎﺷــﺪ ،ﻫﻤﺎﻧﻨــﺪ ﻛﺎدرﻫــﺎي دﻳﮕــﺮ ،ﻣﻘــﺪار DialogResult.OKﺑﻪ وﺳﻴﻠﻪ ﺗﺎﺑﻊ ShowDialogﺑﺮﮔﺸﺘﻪ ﻣﻲ ﺷﻮد. // Show the Font dialog )if (fontDialog1.ShowDialog() == DialogResult.OK { // If the OK button was clicked set the font // in the text box on the form ;txtFile.Font = fontDialog1.Font // Set the color of the font in the text box // on the form ;txtFile.ForeColor = fontDialog1.Color ٢٧٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} ﺑﺮاي ﺗﻐﻴﻴﺮ ﻓﻮﻧﺖ ، TextBoxﺧﺎﺻﻴﺖ Fontآن را ﺑﺮاﺑﺮ ﺑﺎ ﻓﻮﻧﺘﻲ ﻗﺮار ﻣﻲ دﻫﻴﻢ ﻛـﻪ ﻛـﺎرﺑﺮ در ﻛﻨﺘـﺮل FontDialog اﻧﺘﺨﺎب ﻛـﺮده اﺳـﺖ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﺑﺎﻳـﺪ از ﺧﺎﺻـﻴﺖ Fontﻛﻨﺘـﺮل FontDialogاﺳـﺘﻔﺎده ﻛﻨـﻴﻢ .ﻫﻤﭽﻨـﻴﻦ ﺧﺎﺻـﻴﺖ ForeColorﻛﻨﺘﺮل TextBoxرا ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ ﺧﺎﺻﻴﺖ Colorﻛﻨﺘﺮل FontDialogﻗﺮار ﻣﻲ دﻫـﻴﻢ .ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴﺐ رﻧﮓ ﻣﺘﻦ داﺧﻞ TextBoxﺑﺮاﺑﺮ ﺑﺎ رﻧﮕﻲ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮ در ﻛﺎدر Fontاﻧﺘﺨﺎب ﻛﺮده اﺳﺖ.
ﻛﻨﺘﺮل :ColorDialog در ﻣﻮاﻗﻌﻲ ﻣﻤﻜﻦ اﺳﺖ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ رﻧﮕﻲ را در ﺑﺮﻧﺎﻣﻪ اﻧﺘﺨﺎب ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ از اﻳﻦ رﻧﮓ در ﺗﻨﻈﻴﻢ رﻧﮓ ﭘﺲ زﻣﻴﻨﻪ ي ﻓﺮم ،در ﺗﻨﻈﻴﻢ رﻧﮓ ﻳﻚ ﻛﻨﺘﺮل و ﻳﺎ ﺑﺮاي ﺗﻨﻈﻴﻢ رﻧﮓ ﻣﺘﻦ داﺧـﻞ TextBoxاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ. وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻫﻤﺎﻧﻨﺪ ﻛﺎدر ،Fontﻳﻚ ﻛﺎدر اﺳﺘﺎﻧﺪارد ﻧﻴﺰ ﺑﺮاي اﻧﺘﺨﺎب رﻧﮓ در اﺧﺘﻴﺎر ﺑﺮﻧﺎﻣـﻪ ﻧـﻮﻳﺲ ﻗـﺮار ﻣـﻲ دﻫـﺪ ﻛـﻪ ColorDialogﻧﺎم دارد .ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ،ﻛﺎدر ColorDialogﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻛﻨﺘﺮل و ﻫﻢ ﺑـﻪ ﻋﻨﻮان ﻳﻚ ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد. ﻛﻨﺘﺮل ColorDialogﻛﻪ در ﺷﻜﻞ 12-7ﻧﺸﺎن داده ﺷﺪه اﺳﺖ ،ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣـﻲ دﻫـﺪ ﺑـﻴﻦ 48رﻧـﮓ اﺑﺘـﺪاﻳﻲ رﻧﮕـﻲ را اﻧﺘﺨﺎب ﻛﻨﺪ.
ﺷﻜﻞ 12-7 دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻋﻼوه ﺑﺮ اﻳﻦ رﻧﮕﻬﺎي اﺑﺘﺪاﻳﻲ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮ روي دﻛﻤﻪ ي Define Custom Colorﻛﻠﻴﻚ ﻛـﺮده و ﺑﺎ ﺗﺮﻛﻴﺐ رﻧﮕﻬﺎ ،رﻧﮓ ﻣﻮرد ﻧﻈﺮ ﺧﻮد را اﻳﺠﺎد ﻛﻨﺪ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ اﻧﻌﻄﺎف ﭘﺬﻳﺮي ﺑﻴﺸﺘﺮ اﻳﻦ ﻛﺎدر ﻣﻲ ﺷﻮد و ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ رﻧﮓ ﻣﻮرد ﻧﻈﺮ ﺧﻮد را اﻳﺠﺎد ﻛﺮده و در ﺑﺮﻧﺎﻣﻪ از آن اﺳﺘﻔﺎده ﻛﻨﺪ )ﺷﻜﻞ .(13-7
٢٧٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :ColorDialog ﻗﺒﻞ از اﻳﻨﻜﻪ از اﻳﻦ ﻛﻨﺘﺮل در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﺑﻬﺘﺮ اﺳﺖ ﺑﻌﻀﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﭘﺮ ﻛﺎرﺑﺮد آن را ﺑﺮرﺳـﻲ ﻛﻨـﻴﻢ .در ﺟـﺪول زﻳـﺮ ﻧـﺎم ﺗﻌﺪادي از آن ﺧﺎﺻﻴﺖ ﻫﺎ و ﻧﻴﺰ ﻛﺎرﺑﺮد آﻧﻬﺎ ﺷﺮح داده ﺷﺪه اﺳﺖ: ﺧﺎﺻﻴﺖ
ﺷﺮح
AllowFullOpe n
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ از ﻗﺴﻤﺖ Custom Colorﻧﻴﺰ ﺑﺮاي ﺗﻌﺮﻳـﻒ رﻧﮓ ﺟﺪﻳﺪ اﺳﺘﻔﺎده ﻛﻨﺪ ﻳﺎ ﻧﻪ .در ﺻﻮرﺗﻲ ﻛﻪ ﻣﻘﺪار اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاﺑﺮ ﺑﺎ Falseﺑﺎﺷـﺪ ،دﻛﻤـﻪ ﻓﺮﻣﺎن Define Custom Colorsﻏﻴﺮ ﻓﻌﺎل ﺧﻮاﻫﺪ ﺑﻮد.
AnyColor
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﻛﺎدر ﻣﺤﺎوره اي ﺗﻤﺎم رﻧﮕﻬﺎي ﻣﻮﺟﻮد را ﺑﻪ ﻋﻨـﻮان رﻧﮕﻬـﺎي اﺑﺘـﺪاﻳﻲ ﻧﻤﺎﻳﺶ دﻫﺪ ﻳﺎ ﻧﻪ؟
Color
رﻧﮕﻲ ﻛﻪ در ﻛﺎدر ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
CustomColors
ﻣﺠﻤﻮﻋﻪ رﻧﮕﻬﺎﻳﻲ را ﻛﻪ در ﺑﺨﺶ Custom Colorﻛﺎدر ﻧﻤـﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ.
FullOpen
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛـﻪ ﻫﻨﮕـﺎم ﻧﻤـﺎﻳﺶ داده ﺷـﺪن ﻛـﺎدر Colorﻗـﺴﻤﺖ Colorﻫﻢ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض دﻳﺪه ﺷﻮد ﻳﺎ ﻧﻪ؟
ShowHelp
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ دﻛﻤﻪ ﻓﺮﻣﺎن Helpدر ﻛﺎدر Colorﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
Custom
ﺷﻜﻞ 13-7
٢٧٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل ﻧﺴﺒﺖ ﺑﻪ ﻛﻨﺘﺮل ﻫﺎي ﻗﺒﻠﻲ ﻛﻤﺘﺮ اﺳﺖ .ﻫﻤﻴﻦ ﻣﻮرد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ اﺳﺘﻔﺎده از اﻳﻦ ﻛﻨﺘﺮل ﺣﺘﻲ از ﻛﻨﺘﺮﻟﻬﺎي ﻗﺒﻠﻲ ﻧﻴﺰ راﺣﺖ ﺗﺮ ﺑﺎﺷﺪ. ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي ﻗﺒﻠﻲ ،ﻛﻨﺘﺮل ColorDialogﻧﻴﺰ داراي ﺗﺎﺑﻊ ShowDialogاﺳﺖ ﻛﻪ ﺑﺎﻋـﺚ ﻧﻤـﺎﻳﺶ آن ﻣـﻲ ﺷـﻮد. ﻧﺤﻮه ﻛﺎرﻛﺮد اﻳﻦ ﺗﺎﺑﻊ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ از ﺗﻮﺿﻴﺢ ﻣﺠﺪد آن ﺻﺮﻓﻨﻈﺮ ﻣﻲ ﻛﻨﻴﻢ.
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :ColorDialog ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر Colorﺗﻨﻬﺎ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻣﺘﺪ ShowDialogآن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ: ;)(colorDialog1.ShowDialog اﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺪاري را از ﻧﻮع DialogResultﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﺎرﺑﺮ در ﻛﺎدر ﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﺮده اﺳﺖ و ﻳﺎ ﺑﺮ روي دﻛﻤﻪ .Cancelﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ دﺳﺘﻮر ifﻧﺘﻴﺠﻪ ﻛﺎدر را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ. ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار رﻧﮕﻲ ﻛﻪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ در اﻳﻦ ﻛﺎدر اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ﺑﺎﻳﺪ از ﺧﺎﺻﻴﺖ Colorاﻳـﻦ ﻛﻨﺘـﺮل اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ. ﺳﭙﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ رﻧﮓ را ﺑﻪ ﻛﻨﺘﺮﻟﻬﺎﻳﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ رﻧﮓ آﻧﻬﺎ را ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ ﻧﺴﺒﺖ دﻫﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ رﻧـﮓ ﻣـﺘﻦ ﻳـﻚ TextBoxرا ﺑﺮاﺑﺮ ﺑﺎ رﻧﮓ اﻧﺘﺨﺎب ﺷﺪه در اﻳﻦ ﻛﺎدر ﻗﺮار دﻫﻴﺪ: ;txtFile.ForeColor = colorDialog1.Color در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﻪ ﭘﺮوژه ﻗﺒﻠﻲ اﻣﻜﺎﻧﻲ را اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﺑﻪ وﺳﻴﻠﻪ آن رﻧﮓ زﻣﻴﻨﻪ ﻓﺮم را ﺗﻐﻴﻴﺮ دﻫﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل ColorDialog (1ﭘﺮوژه Dialogsرا ﺑﺎز ﻛﺮده و ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻣﺮﺑﻮط ﺑﻪ Form1ﺑﺮوﻳﺪ. (2ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ﻛﻨﺘﺮل Buttonﺑﺮ روي ﻓﺮم ﻗﺮار داده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﻣﻄـﺎﺑﻖ ﺑـﺎ ﻣﻘـﺎدﻳﺮ زﻳـﺮ ﺗﻨﻈـﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑﺎ btnColorﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorآن را ﺑﺮاﺑﺮ ﺑﺎ Top,Rightﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Locationآن را ﺑﺮاﺑﺮ ﺑﺎ 367;98ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Colorﻗﺮار دﻫﻴﺪ.
(3ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻗﺴﻤﺖ Dialogsﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ﻛﻨﺘﺮل ColorDialogﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .اﻳـﻦ ﻛﻨﺘﺮل ﺑﻪ ﻗﺴﻤﺖ ﭘﺎﻳﻦ ﻃﺮاﺣﻲ ﻓﺮم اﺿﺎﻓﻪ ﺧﻮاﻫﺪ ﺷﺪ.
٢٨٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(4ﺑﺮ روي دﻛﻤﻪ ي btnColorدو ﺑﺎر ﻛﻠﻴﻚ ﻛﺮده ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳـﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )private void btnColoe_Click(object sender, EventArgs e { // Show the Color dialog )if (colorDialog1.ShowDialog() == DialogResult.OK { // Set the BackColor property of the form ;this.BackColor = colorDialog1.Color } } (5 (6
(7 (8
ﺗﻤﺎم ﻛﺪي ﻛﻪ ﺑﺎﻳﺪ وارد ﻣﻲ ﻛﺮدﻳﺪ ﻫﻤﻴﻦ ﺑﻮد .ﺑﺮاي اﻣﺘﺤﺎن ﺑﺮﻧﺎﻣﻪ ﺑﺮ روي دﻛﻤﻪ Startدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﺑﺮ روي دﻛﻤﻪ ي Colorﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر ﻣﺤـﺎوره اي Colorﻧﻤـﺎﻳﺶ داده ﺷﻮد .در اﻳﻦ ﻛﺎدر ﻳﻜﻲ از رﻧﮕﻬﺎي اﺑﺘﺪاﻳﻲ را اﻧﺘﺨﺎب ﻛﺮده و ﻳﺎ روي دﻛﻤـﻪ Define Custom Color ﻛﻠﻴﻚ ﻛﻨﻴﺪ و رﻧﮕﻲ را از آن ﻗﺴﻤﺖ اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر ﺑﺴﺘﻪ ﺷﻮد. ﺑﺎ ﻛﻠﻴﻚ روي دﻛﻤﻪ OKدر ﻛﺎدر Colorرﻧﮓ زﻣﻴﻨﻪ ﻓﺮم ﺑﺎ رﻧﮕﻲ ﻛﻪ در ﻛﺎدر اﻧﺘﺨﺎب ﻛﺮده ﺑﻮدﻳﺪ ﺗﻌﻮﻳﺾ ﻣﻲ ﺷﻮد. ﻫﻤﺎﻧﻨﺪ ﻛﺎدر Fontﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﻗﺒﻞ از ﻧﻤﺎﻳﺶ ﻓﺮم ،ﺧﺎﺻﻴﺖ Colorرا ﺑﺮاﺑﺮ رﻧﮓ اﻧﺘﺨﺎب ﺷﺪه در ﻣﺮﺣﻠـﻪ ﻗﺒﻠـﻲ ﻗﺮار دﻫﻴﺪ .زﻳﺮا ﻛﻨﺘﺮل ColorDialogﺧﻮد ﻣﻘﺪار رﻧﮕﻲ ﻛﻪ آﺧﺮﻳﻦ ﺑﺎر ﺗﻮﺳﻂ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ را ﻧﮕﻬـﺪاري ﻣﻲ ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﻌﺪ از اﻳﻨﻜﻪ ﻛﺎرﺑﺮ ﻣﺠﺪداً وارد اﻳﻦ ﻛﺎدر ﺷﺪ ،ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﺪ رﻧﮕﻲ ﻛﻪ در ﻣﺮﺣﻠﻪ ﻗﺒﻞ اﻧﺘﺨﺎب ﻛـﺮده ﺑﻮد ،ﻫﻤﭽﻨﺎن ﺑﻪ ﺻﻮرت اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﻳﻦ ﻣﺮﺗﺒﻪ ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ShowDialogﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻛﺎدر Colorرا ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺑﻪ ﻫﻤـﻴﻦ دﻟﻴـﻞ ﺑـﻪ ﻗﺴﻤﺖ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ درون دﺳﺘﻮر ifﻣﻲ روﻳﻢ .ﻫﻤﺎﻧﻨﺪ ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ ،اﮔﺮ ﻛﺎرﺑﺮ در ﻛـﺎدر Colorروي دﻛﻤـﻪ ي OKﻛﻠﻴـﻚ ﻛﻨﺪ ﺗﺎﺑﻊ ShowDialogﻣﻘﺪار DialogResult.OKرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﻪ ﻫﻤﻴﻦ ﻋﻠـﺖ در دﺳـﺘﻮر ifﺑﺮرﺳـﻲ ﻣـﻲ ﻛﻨﻴﻢ ﻛﻪ ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ از ﺗﺎﺑﻊ ﺑﺮاﺑﺮ ﺑﺎ DialogResult.OKﻫﺴﺖ ﻳﺎ ﻧﻪ؟ // Show the Color dialog )if (colorDialog1.ShowDialog() == DialogResult.OK اﮔﺮ ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ ﺑﺮاﺑﺮ ﺑﺎ DialogResult.OKﺑﻮد ﺑﺎﻳﺪ رﻧﮓ ﭘﻴﺶ زﻣﻴﻨﻪ ﻓﺮم را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ در ﻗـﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﻧﻴﺰ ﮔﻔﺘﻴﻢ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻳﻚ ﻛﻼس ،درون ﺧﻮد ﻛـﻼس ﺑﺎﻳـﺪ از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي thisاﺳـﺘﻔﺎده ﻛﻨـﻴﻢ .ﺑـﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻓﺮم ﻧﻴﺰ ،ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ درون ﻛﻼس ﻓﺮم ﻫﺴﺘﻴﻢ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي thisاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﺳـﭙﺲ ﺧﺎﺻـﻴﺖ BackColorﻓﺮم را ﺑﺮاﺑﺮ ﺑﺎ رﻧﮕﻲ ﻗﺮار ﻣﻲ دﻫﻴﻢ ﻛﻪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ در ﻛﺎدر Colorاﻧﺘﺨﺎب ﺷﺪه اﺳﺖ. // Set the BackColor property of the form ;this.BackColor = colorDialog1.Color ٢٨١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻨﺘﺮل :PrintDialog ﻫﺮ ﺑﺮﻧﺎﻣﻪ اي ﻣﻌﻤﻮﻻً در ﻗﺴﻤﺘﻲ ﻧﻴﺎز ﺑﻪ اﻣﻜﺎن ﭼﺎپ دارد .اﻳﻦ ﻧﻴﺎز ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻧﻴﺎز ﺑـﻪ ﭼـﺎپ ﺳـﺎده ي ﻳـﻚ ﻣـﺘﻦ و ﻳـﺎ ﻣـﻮارد ﭘﻴﺸﺮﻓﺘﻪ ﺗﺮي ﻣﺎﻧﻨﺪ ﭼﺎپ ﻗﺴﻤﺘﻲ از ﻣﺘﻦ و ﻳﺎ ﺻﻔﺤﺎت ﻣﺸﺨﺼﻲ از آن ﺑﺎﺷﺪ .در ﻗﺴﻤﺖ ﺑﻌﺪ ﺑﻪ ﺑﺮرﺳﻲ ﭼﮕﻮﻧﮕﻲ ﭼﺎپ ﻳﻚ ﻣـﺘﻦ ﺳـﺎده ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ و ﻧﺤﻮه اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎي ﻣﺮﺑﻮط ﺑﻪ ﭼﺎپ در .NETرا ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد. ﻳﻜﻲ از ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ در وﻳﮋوال 2005 C#ﺑﺮاي ﭼﺎپ ﺑﻪ ﻛﺎر ﻣﻲ رود ،ﻛﻨﺘﺮل PrintDialogاﺳﺖ .اﻳﻦ ﻛﻨﺘﺮل ﻛﺎر ﭼـﺎپ را اﻧﺠﺎم ﻧﻤﻲ دﻫﺪ ،ﺑﻠﻜﻪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﭼﺎﭘﮕﺮي را ﺑﺮاي ﭼﺎپ اﻧﺘﺨﺎب ﻛﺮده و ﺗﻨﻈﻴﻤﺎت ﻗﺒﻞ از ﭼﺎپ را در آن ﭼﺎﭘﮕﺮ اﻧﺠـﺎم دﻫﺪ .ﺑﺮاي ﻣﺜﺎل ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ در اﻳﻦ ﻛﺎدر ﺟﻬﺖ ﺻﻔﺤﻪ ،ﻛﻴﻔﻴﺖ ﭼﺎپ و ﻳﺎ ﻣﺤﺪوده ﻣﻮردﻧﻈﺮ ﺑﺮاي ﭼﺎپ را ﺗﻌﻴﻴﻦ ﻛﻨـﺪ .ﺷـﻤﺎ از اﻳـﻦ وﻳﮋﮔﻲ ﻫﺎ در ﻣﺜﺎل ﺑﻌﺪي اﺳﺘﻔﺎده ﻧﺨﻮاﻫﻴﺪ ﻛﺮد ،اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 14-7ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺗﻤﺎم اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﻫﺎ ﺑﻪ وﺳـﻴﻠﻪ ﻛـﺎدر PrintDialogﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ. ﻫﻤﺎﻧﻨﺪ ﺗﻤﺎم ﻛﺎدرﻫﺎﻳﻲ ﻛﻪ در ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻛﺎدر Printﻧﻴﺰ داراي دو دﻛﻤﻪ OKو Cancelاﺳﺖ .ﺑﻨـﺎﺑﺮاﻳﻦ ﺗـــــﺎﺑﻊ ShowDialogﻣﺮﺑـــــﻮط ﺑـــــﻪ اﻳـــــﻦ ﻛـــــﺎدر ﻫـــــﻢ ﻣﻘـــــﺪار DialogResult.OKو ﻳـــــﺎ DialogResult.Cancelرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ از دﺳﺘﻮر ifﺑﺮاي ﺑﺮرﺳﻲ ﻧﺘﻴﺠـﻪ ﺑﺮﮔـﺸﺖ داده ﺷـﺪه ﺗﻮﺳـﻂ ﻛﺎدر اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﺷﻜﻞ 14-7
٢٨٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :PrintDialog در ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﭘﺮ ﻛﺎرﺑﺮد ﻛﻨﺘﺮل PrintDialogو ﻧﻴﺰ ﺗﻮﺿﻴﺢ آﻧﻬﺎ آﻣﺪه اﺳﺖ: ﺧﺎﺻﻴﺖ
ﺷﺮح
AllowPrintToFile
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ در ﻛﺎدر ﮔﺰﻳﻨﻪ Print To Fileﻓﻌﺎل ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
AllowSelection
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ در ﻛﺎدر ،دﻛﻤﻪ رادﻳﻮﻳﻲ Selectinﻓﻌﺎل ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
AllowSomePages
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ در ﻛﺎدر ،دﻛﻤﻪ رادﻳﻮﻳﻲ Pagesﻓﻌﺎل ﺑﺎﺷﺪ ﻳﺎ ﻧﻪ؟
Document
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﺳﻨﺪي اﺳﺖ ﻛﻪ ﺑﺮاي ﭼﺎپ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
PrinterSettings
ﺗﻨﻈﻴﻤﺎﺗﻲ ﻛﻪ در ﻛﺎدر ،ﺑﺮاي ﭼﺎﭘﮕﺮ اﻧﺘﺨﺎﺑﻲ اﻋﻤﺎل ﻣﻲ ﺷﻮد را ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ.
PrintToFile
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﮔﺰﻳﻨﻪ Print to fileاﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟
ShowHelp
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ دﻛﻤﻪ ﻓﺮﻣﺎن Helpدر ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
ShowNetwork
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ دﻛﻤﻪ ﻓﺮﻣﺎن Networkدر ﻛﺎدر Printﻧﻤﺎﻳﺶ داده ﺷـﻮد ﻳﺎ ﻧﻪ؟
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :PrintDialog ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر Printﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺗﺎﺑﻊ ShowDialogآن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﺎدر Printﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 14-7ﻧﺸﺎن داده ﺧﻮاﻫﺪ ﺷﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﭘﻴﺸﺘﺮ ﻧﻴﺰ ﮔﻔﺘﻢ ﻛﻨﺘﺮل PrintDialogﻓﻘﻂ ﻛﺎدري را ﺑﺮاي ﺗﻨﻈﻴﻤـﺎت ﭼـﺎپ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﻫﻴﭻ ﻣﺘﻨﻲ را ﻧﻤﻲ ﺗﻮاﻧﺪ ﭼﺎپ ﻛﻨﺪ .ﻗﻄﻌﻪ ﻛﺪ زﻳﺮ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻛﺎدر Printﻣﻲ ﺗﻮاﻧﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد: ;)(printDialog1.ShowDialog
ﻛﻼس :PrintDocument ﻗﺒﻞ از اﻳﻨﻜﻪ ﺗﺎﺑﻊ ShowDialogدر ﻛﻨﺘﺮل PrintDialogرا ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﺧﺎﺻﻴﺖ Documentﻛـﻼس PrintDialogرا ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﻘﺪاري را از ﻧﻮع ﻛﻼس PrintDocumentدرﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .ﻛـﻼس PrintDocumentﻣﻲ ﺗﻮاﻧﺪ ﺗﻨﻈﻴﻤﺎت ﭼﺎﭘﮕﺮ را درﻳﺎﻓﺖ ﻛﺮده و ﺳﭙﺲ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ آن ﺗﻨﻈﻴﻤﺎت ،ﺧﺮوﺟﻲ ﺧﻮد )ﻛﻪ در ﺣﻘﻴﻘﺖ ﻫﻤـــﺎن اﻃﻼﻋـــﺎت ﻣـــﻮرد ﻧﻈـــﺮ ﻣـــﺎ اﺳـــﺖ( را ﺑـــﺮاي ﭼـــﺎپ ﺑـــﻪ ﭼـــﺎﭘﮕﺮ ﻣـــﻲ ﻓﺮﺳـــﺘﺪ .اﻳـــﻦ ﻛـــﻼس در ﻓـــﻀﺎي ﻧـــﺎم System.Drawing.Printingﻗﺮار دارد .ﭘﺲ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﻗﺒﻞ از اﺳﺘﻔﺎده از آن ﺑﺮاي اﻳﻨﻜﻪ ﻫﺮ ﺑﺎر ﻧﺎم ﻛﺎﻣﻞ اﻳﻦ ﻓﻀﺎي ﻧﺎم را وارد ﻧﻜﻨﻴﻢ ،ﺑﺎ اﺳﺘﻔﺎده از راﻫﻨﻤﺎي usingآن را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﻢ.
٢٨٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺼﻮﺻﻴﺎت ﻛﻼس :PrintDocument ﻗﺒﻞ از اداﻣﻪ ﺑﻬﺘﺮ اﺳﺖ ﻧﮕﺎﻫﻲ ﺑﻪ ﺑﻌﻀﻲ از ﺧﺼﻮﺻﻴﺎت ﻣﻬﻢ ﻛﻼس PrintDocumentﻛﻪ در ﺟﺪول زﻳـﺮ آﻣـﺪه اﻧـﺪ داﺷـﺘﻪ ﺑﺎﺷﻴﻢ. ﺧﺼﻮﺻﻴﺖ
ﺷﺮح
DefaultPageSettings
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ي ﺗﻨﻈﻴﻤﺎت ﭘﻴﺶ ﻓﺮض ﭼﺎﭘﮕﺮ ﺑـﺮاي ﭼـﺎپ ﺳـﻨﺪ )اﻃﻼﻋـﺎت( ﻣﻮرد ﻧﻈﺮ اﺳﺖ.
DocumentName
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻧﺎﻣﻲ اﺳﺖ ﻛﻪ ﻫﻨﮕﺎم ﭼﺎپ ﺳﻨﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﻧﺎم در ﻛﺎدر Print Statusو در ﻟﻴﺴﺖ اﺳﻨﺎد ﻣﻮﺟـﻮد در ﺻـﻒ ﭼﺎپ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﺳﻨﺪ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮد.
PrintController
ﻣﺤﺘﻮي ﺷﻴﺊ از ﻛﻼس PrintControllerاﺳﺖ ﻛﻪ ﭘﺮوﺳﻪ ﭼﺎپ را ﻣﺪﻳﺮﻳﺖ ﻣﻲ ﻛﻨﺪ.
PrinterSettings
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﭼﺎﭘﮕﺮي اﺳﺖ ﻛﻪ ﺑﺮاي ﭼﺎپ اﻳﻦ ﺳﻨﺪ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
ﭼﺎپ ﻳﻚ ﺳﻨﺪ: ﻣﺘـــﺪ Printاز ﻛـــﻼس PrintDocumentﺳـــﻨﺪي را ﺑـــﻪ وﺳـــﻴﻠﻪ ﭼـــﺎﭘﮕﺮ ﻣـــﺸﺨﺺ ﺷـــﺪه در ﺧﺎﺻـــﻴﺖ PrinterSettingsﭼﺎپ ﻣﻲ ﻛﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ را در ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ،ﻫﺮ ﺑﺎر ﻛـﻪ ﺻـﻔﺤﻪ اي ﺑﺨﻮاﻫـﺪ ﺑـﻪ وﺳﻴﻠﻪ اﻳﻦ ﺗﺎﺑﻊ ﭼﺎپ ﺷﻮد ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد PrintPageاز ﻛﻼس PrintDocumentﻧﻴﺰ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ ﺷـﻮد. ﺗﺎﺑﻊ Printﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﻣﺘﺪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻛﺪام ﺑﺨﺶ از ﻓﺎﻳﻞ ﺑﺎﻳﺪ در ﺻﻔﺤﻪ ﺟﺎري ﭼﺎپ ﺷـﻮد .ﺑﻨـﺎﺑﺮاﻳﻦ ﻗﺒـﻞ از اﻳﻨﻜـﻪ ﺑﺘﻮاﻧﻴﺪ ﻣﺘﻨﻲ را ﭼﺎپ ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﻣﺘﺪي را ﺑﺮاي اﻳﻦ روﻳﺪاد اﻳﺠﺎد ﻛﻨﻴﺪ .ﺳﭙﺲ در اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ ﻳﻚ ﺻﻔﺤﻪ از ﻣـﺘﻦ را ﺑـﻪ وﺳـﻴﻠﻪ ﻛـﻼس StreamReaderاز ﻓﺎﻳﻞ ﺧﻮاﻧﺪه و آن را ﺑﻪ ﭼﺎﭘﮕﺮ ﺑﻔﺮﺳﺘﻴﺪ ﺗﺎ ﭼﺎپ ﺷﻮد. در ﺑﺨــﺶ اﻣﺘﺤــﺎن ﻛﻨﻴــﺪ زﻳــﺮ ﻣــﺸﺎﻫﺪه ﺧــﻮاﻫﻴﻢ ﻛــﺮد ﻛــﻪ ﭼﮕﻮﻧــﻪ ﻣــﻲ ﺗــﻮان ﻣﺤﺘﻮﻳــﺎت ﻳــﻚ ﻓﺎﻳــﻞ ﻣﺘﻨــﻲ را ﺑــﻪ وﺳــﻴﻠﻪ ﻛــﻼس PrintDocumentﭼﺎپ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل PrintDialog (1 (2
در ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﭘﺮوژه Dialogsرا ﺑﺎز ﻛﻨﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻛﻨﺘﺮل Buttonدﻳﮕﺮي را ﺑﺮ روي ﻓﺮم ﻗﺮار داده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﻣﻄﺎﺑﻖ ﻟﻴﺴﺖ زﻳﺮ ﺗﻨﻈـﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ btnPrintﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ Top,Rightﻗﺮار دﻫﻴﺪ.
٢٨٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
. ﻗﺮار دﻫﻴﺪ367;128 را ﺑﺮاﺑﺮ ﺑﺎLocation ﺧﺎﺻﻴﺖ . ﻗﺮار دﻫﻴﺪPrint را ﺑﺮاﺑﺮ ﺑﺎText ﺧﺎﺻﻴﺖ
دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑـﺮ رويPrintDialog ﺑﺮوﻳﺪ و ﺑﺮ روي ﻛﻨﺘﺮلPrinting در ﺟﻌﺒﻪ اﺑﺰار ﺑﻪ ﻗﺴﻤﺖ در ﭘﺎﻳﻴﻦ ﻗـﺴﻤﺖ ﻃﺮاﺣـﻲ ﻓـﺮم ﻗـﺮار ﻣـﻲ، ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي ﻗﺒﻠﻲ.ﻓﺮم ﻗﺮار ﺑﮕﻴﺮد .ﮔﻴﺮد : ﻓﻀﺎي ﻧﺎﻣﻬﺎي زﻳﺮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪusing ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﺑﺮوﻳﺪ و ﺑﺎ اﺳﺘﻔﺎده از راﻫﻨﻤﺎي
(3
(4
using System.IO; using System.Drawing.Printing; :ﺣﺎل ﻣﺘﻐﻴﺮﻫﺎي زﻳﺮ را ﺑﻪ ﺻﻮرت ﻋﻤﻮﻣﻲ در اﺑﺘﺪاي ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ
(5
// Declare variables private string strFileName; private StreamReader objStreamToPrint; private Font objPrintFont; دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آنbtnPrint ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و ﺑﺮ روي دﻛﻤﻪ ي : ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ.اﻳﺠﺎد ﺷﻮد
(6
private void btnPrint_Click(object sender, EventArgs e) { // Declare an object for the PrintDocument class PrintDocument objPrintDocument = new PrintDocument(); // Set the DocumentName property objPrintDocument.DocumentName = "Text File Print Demo"; // Set the PrintDialog properties printDialog1.AllowPrintToFile = false; printDialog1.AllowSelection = false; printDialog1.AllowSomePages = false; // Set the Document property for // the objPrintDocument object printDialog1.Document = objPrintDocument; // Show the Print dialog if (printDialog1.ShowDialog() == DialogResult.OK) { // If the user clicked on the OK button ٢٨٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// then set the StreamReader object to // the file name in the strFileName variable objStreamToPrint = new StreamReader(strFileName); // Set the printer font objPrintFont = new Font("Arial", 10); // Set the PrinterSettings property of the // objPrintDocument Object to the // PrinterSettings property returned from the // PrintDialog control objPrintDocument.PrinterSettings = printDialog1.PrinterSettings; // Add an event handler for the PrintPage event of // the objPrintDocument object objPrintDocument.PrintPage += new PrintPageEventHandler(prtPage); // Print the text file objPrintDocument.Print(); // Clean up objStreamToPrint.Close(); objStreamToPrint = null; } } :ﺳﭙﺲ ﻣﺘﺪ زﻳﺮ را در ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ وارد ﻛﻨﻴﺪ
(7
private void prtPage(object sender, PrintPageEventArgs e) { // Declare variables float sngLinesPerpage = 0; float sngVerticalPosition = 0; int intLineCount = 0; float sngLeftMargin = e.MarginBounds.Left; float sngTopMargin = e.MarginBounds.Top; string strLine; // Work out the number of lines per page. // Use the MarginBounds on the event to do this sngLinesPerpage = e.MarginBounds.Height / objPrintFont.GetHeight(e.Graphics);
٢٨٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Now iterate through the file printing out each line. // This assumes that a single line is not wider than // the page width. Check intLineCount first so that we // don’t read a line that we won’t print strLine = objStreamToPrint.ReadLine(); while((intLineCount < sngLinesPerpage) && (strLine != null)) { // Calculate the vertical position on the page sngVerticalPosition = sngTopMargin + (intLineCount * objPrintFont.GetHeight(e.Graphics)); // Pass a StringFormat to DrawString for the // Print Preview control e.Graphics.DrawString(strLine, objPrintFont, Brushes.Black, sngLeftMargin, sngVerticalPosition, new StringFormat()); // Increment the line count intLineCount = intLineCount + 1; // If the line count is less than the lines per // page then read another line of text if (intLineCount < sngLinesPerpage) { strLine = objStreamToPrint.ReadLine(); } } // If we have more lines then print another page if (strLine != null) { e.HasMorePages = true; } else { e.HasMorePages = false; } } در ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴـﺪ ﺗـﺎStart ﺑﻨﺎﺑﺮاﻳﻦ روي دﻛﻤﻪ.ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﻋﻤﻠﻜﺮد ﻛﺪﻫﺎي اﻳﻦ ﻗﺴﻤﺖ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد
٢٨٧
www.pupuol.com
(8
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(9در ﻓﺮم اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ روي دﻛﻤﻪ ي Openﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻓﺎﻳﻠﻲ را ﺑﺎز ﻛﻨﻴﺪ ﺗﺎ ﻣﺤﺘﻮﻳـﺎت آن در ﻓـﺮم ﻧﻤـﺎﻳﺶ داده ﺷـﻮد. ﺳﭙﺲ ﺑﺮ روي دﻛﻤﻪ ي Printﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻛﺎدر ﻣﺤﺎوره اي Printﻫﻤﺎﻧﻨﺪ ﺷـﻜﻞ 15-7ﻧﻤـﺎﻳﺶ داده ﺷـﻮد. ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻛﺎدر ﮔﺰﻳﻨﻪ Print to fileو ﻫﻤﭽﻨﻴﻦ ﻗـﺴﻤﺘﻬﺎي Selectionو Pages ﻏﻴﺮ ﻓﻌﺎل ﻫﺴﺘﻨﺪ .دﻟﻴﻞ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن اﻳﻦ ﻗﺴﻤﺘﻬﺎ ﺑﻪ ﺧﺎﻃﺮ اﻳﻦ اﺳﺖ ﻛﻪ ﻗﺒـﻞ از ﻓﺮاﺧـﻮاﻧﻲ ﺗـﺎﺑﻊ ShowDialog ﺧﺎﺻـــــﻴﺘﻬﺎي AllowSelection ،AllowPrintToFileو AllowSomePagesرا ﺑﺮاﺑﺮ ﺑﺎ Falseﻗﺮار دادﻳﻢ .اﮔﺮ در ﺳﻴﺴﺘﻢ ﺧﻮد ﺑﻴﺶ از ﻳﻚ ﭼﺎﭘﮕﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 15-7ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻌﻴـﻴﻦ ﻛﻨﻴﺪ ﻛﻪ ﻓﺎﻳﻞ ﺑﺎز ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ﻛﺪام ﭼﺎﭘﮕﺮ ،ﭼﺎپ ﺷﻮد. (10روي دﻛﻤﻪ Printدر ﻛﺎدر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ ﭼﺎپ ﺷﻮﻧﺪ.
ﺷﻜﻞ 15-7
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﻗﺴﻤﺘﻬﺎي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ،ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ي btnPrintاﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴـﺪ اﻳﻦ ﻣﺘﺪ را ﺑﺎ ﺗﻌﺮﻳﻒ ﻳﻚ ﺷﻴﺊ از ﻛﻼس PrintDocumentآﻏﺎز ﻛﺮدﻳﻢ .ﻋﻤﻞ اﺻﻠﻲ ﭼﺎپ ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﺷﻴﺊ ﺻـﻮرت ﻣـﻲ ﮔﻴﺮد: ;)(PrintDocument objPrintDocument = new PrintDocument
٢٨٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﭙﺲ ﺧﺎﺻﻴﺖ DocumentNameﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﺷﻴﺊ را ﺗﻨﻈﻴﻢ ﻛﺮدﻳﻢ .اﮔﺮ ﻫﻤﺰﻣﺎن ﭼﻨﺪ ﺑﺮﻧﺎﻣـﻪ ﺑﺨﻮاﻫﻨـﺪ از ﭼـﺎﭘﮕﺮ اﺳـﺘﻔﺎده ﻛﻨﻨﺪ ،ﺳﻨﺪﻫﺎي آﻧﻬﺎ در ﻳﻚ ﺻﻒ ﭼﺎپ ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﻧﺎﻣﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ وارد ﻣﻲ ﻛﻨﻴﻢ ،ﺑﺮاي ﻣـﺸﺨﺺ ﻛـﺮدن ﺳـﻨﺪ ﻣﺮﺑـﻮط ﺑـﻪ ﺑﺮﻧﺎﻣﻪ ﻣﺎ در ﺻﻒ ﭼﺎپ ﺑﻪ ﻛﺎر ﻣﻲ رود. Print
File
"Text
=
objPrintDocument.DocumentName ;"Demo
در ﻗﺴﻤﺖ ﺑﻌﺪ ،ﺑﻪ ﺗﻨﻈﻴﻢ ﺑﻌﻀﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل PrintDialogﻣﻲ ﭘﺮدازﻳﻢ .در اﻳﻦ ﺑﺨﺶ ﻓﻘﻂ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ ﻋﻤـﻞ ﭼﺎپ ﺳﺎده را اﻧﺠﺎم دﻫﻴﻢ ،ﺑـﻪ ﻫﻤـﻴﻦ دﻟﻴـﻞ ﺑﻬﺘـﺮ اﺳـﺖ ﻗـﺴﻤﺘﻬﺎي Print to fileو ﻫﻤﭽﻨـﻴﻦ Selectionو Pagesرا در ﻛﺎدر Printﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻛﺎﻓﻲ اﺳﺖ ﺧﺎﺻﻴﺘﻬﺎي ﻣﺮﺑـﻮط ﺑـﻪ آﻧﻬـﺎ را ﺑﺮاﺑـﺮ ﺑـﺎ falseﻗـﺮار دﻫﻴﻢ: ;printDialog1.AllowPrintToFile = false ;printDialog1.AllowSelection = false ;printDialog1.AllowSomePages = false ﻗﺒﻞ از ﻧﻤﺎﻳﺶ ﻛﺎدر Printﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﻨﻈﻴﻤﺎﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ در اﻳﻦ ﻛﺎدر ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ،ﺑﺮاي ﭼﺎپ ﭼﻪ ﺳﻨﺪي ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﺧﺎﺻﻴﺖ Documentﻛﻨﺘﺮل PrintDialogرا ﺑﺮاﺑﺮ ﺑـﺎ ﺷـﻴﺊ PrintDocumentاي ﻗﺮار دﻫﻴﺪ ﻛﻪ ﻧﺸﺎن دﻫﻨﺪه ي ﺳﻨﺪ ﻣﻮرد ﻧﻈﺮ اﺳﺖ. ;printDialog1.Document = objPrintDocument ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﻢ ﻛﺎدر Printرا ﻧﻤﺎﻳﺶ دﻫﻴﻢ .ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي ﻗﺒﻠﻲ ،ﺑﺮاي اﻳﻦ ﻛﺎر ﻛﺎﻓﻲ اﺳﺖ ﻣﺘﺪ ShowDialogﻣﺮﺑـﻮط ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﺘﺪ ﻧﻴﺰ ﻣﻘﺪاري را از ﻧﻮع DialogResultﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﮔﺮ ﻛﺎرﺑﺮ در ﻛـﺎدر روي دﻛﻤـﻪ ي Printﻛﻠﻴــﻚ ﻛﻨــﺪ ،ﺗــﺎﺑﻊ DialogResult.OKو اﮔــﺮ ﻛــﺎرﺑﺮ روي دﻛﻤــﻪ ي Cancelﻛﻠﻴــﻚ ﻛﻨــﺪ ،ﺗــﺎﺑﻊ DialogResult.Cancelرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر ifﻧﺘﻴﺠﻪ را ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ. )if (printDialog1.ShowDialog() == DialogResult.OK اﮔﺮ ﻛﺎرﺑﺮ در ﻛﺎدر روي دﻛﻤﻪ Printﻛﻠﻴﻚ ﻛﻨﺪ ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻠﻲ ﻛﻪ آدرس آن در ﻣﺘﻐﻴﺮ strFileNameﻗـﺮار دارد را ﭼﺎپ ﻛﻨﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ اﺑﺘﺪا ﻳﻚ ﺷﻴﺊ از ﻧﻮع StreamReaderﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﺷﻴﺊ ﺑﺮاي دﺳﺘﺮﺳـﻲ ﺑـﻪ ﻣﺤﺘﻮﻳـﺎت ﻳـﻚ ﻓﺎﻳﻞ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ آن ﺑﺎﻳﺪ آدرس ﻓﺎﻳﻞ ﻣﻮرد ﻧﻈﺮ را ﺑﻪ آن ﺑﻔﺮﺳﺘﻴﻢ .ﭘﺲ ﻣﺘﻐﻴﻴﺮ strFileName ﻛﻪ ﺣﺎوي آدرس ﻓﺎﻳﻞ اﺳﺖ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ اﻳﻦ ﺷﻴﺊ ارﺳﺎل ﻣﻲ ﻛﻨﻴﻢ. ;)objStreamToPrint = new StreamReader(strFileName ﺳﭙﺲ ﺑﺎﻳﺪ ﻓﻮﻧﺖ و اﻧﺪازه ﻣﺘﻦ را ﺑﺮاي ﭼﺎپ ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺑﻪ ﻫﻤﻴﻦ ﻋﻠﺖ ﺷﻴﺊ را ز ﻧﻮع Fontﺗﻌﺮﻳﻒ ﻛﺮده و ﻓﻮﻧـﺖ Arialو اﻧﺪازه 10را ﺑﺮاي آن ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ.
٢٨٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)objPrintFont = new Font("Arial", 10 ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﻧﻴﺰ ﮔﻔﺘﻢ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ روﻳﺪاد ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﻛﻼس رخ ﻣﻲ دﻫﺪ ،ﺗﻌﺪادي از ﺗﻮاﺑﻊ ﺑﺮاي ﭘﺎﺳـﺦ دادن ﺑﻪ آن روﻳﺪاد اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮاي ﻣﺜﺎل در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﺑﺎ دو ﺑﺎر ﻛﻠﻴﻚ ﺑﺮ روي ﻳﻚ ﻛﻨﺘـﺮل Buttonدر زﻣـﺎن ﻃﺮاﺣﻲ ،ﻣﺘﺪي اﻳﺠﺎد ﻣﻲ ﺷﺪ و اﻳﻦ ﻣﺘﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ روي آن ﻛﻨﺘﺮل در ﻃﻲ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻣﻲ ﻛﺮد ،ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﺪ .ﺑﺮاي ﺑﺮرﺳﻲ دﻗﻴﻘﺘﺮ اﻳﻦ ﻣﻮرد ﺑﺎﻳﺪ ﺑﮕﻮﻳﻢ ﻛﻪ ﻫﺮ روﻳﺪاد ﺷﺎﻣﻞ ﻟﻴﺴﺘﻲ از ﺗﻮاﺑﻊ اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ روﻳﺪاد رخ ﻣﻲ دﻫـﺪ ،ﻛـﻼس ﻣﺮﺑﻮﻃﻪ ﺗﻤﺎم ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﻣﺮﺑﻮط ﺑﻪ آن روﻳﺪاد را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﭼﻨﺪﻳﻦ ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و آﻧﻬﺎ را ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ﻳﻚ Buttonاﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮ روي آن دﻛﻤﻪ ﻛﻠﻴﻚ ﺷﻮد ﺗﻤﺎم ﻣﺘﺪﻫﺎﻳﻲ ﻛﻪ ﺑـﻪ آن اﺿـﺎﻓﻪ ﻛﺮده اﻳﺪ اﺟﺮا ﺧﻮاﻫﻨﺪ ﺷﺪ. در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﮔﻔﺘﻢ ﻛﻪ ﻛﻼس PrintDocumentﺑﺮاي اﻳﻨﻜﻪ ﺗﺸﺨﻴﺺ دﻫﺪ ﭼﻪ ﻣﺘﻨﻲ را ﺑﺎﻳﺪ ﭼﺎپ ﻛﻨﺪ ،در ﻫﺮ ﺻـﻔﺤﻪ روﻳﺪاد PrintPageرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻗﻴﻖ ﺗﺮ ﺑﺎﻳﺪ ﺑﮕﻮﻳﻴﻢ ﻛﻪ اﻳﻦ ﻛﻼس در ﻫﺮ ﻣﺮﺣﻠﻪ ﺗﻤﺎم ﺗﻮاﺑﻌﻲ ﻛﻪ در ﻟﻴﺴﺖ روﻳــﺪاد PrintPageﻫــﺴﺘﻨﺪ را اﺟــﺮا ﻣــﻲ ﻛﻨــﺪ .ﭘــﺲ ﺑﺎﻳــﺪ ﻣﺘــﺪي را اﻳﺠــﺎد ﻛﻨــﻴﻢ و آن را ﺑــﻪ ﻟﻴــﺴﺖ ﻣﺘــﺪﻫﺎي روﻳــﺪاد PrintPageاﺿﺎﻓﻪ ﻛﻨـﻴﻢ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻣﺘـﺪ prtPageرا اﻳﺠـﺎد ﻛـﺮده و آن را ﺑـﻪ وﺳـﻴﻠﻪ دﺳـﺘﻮر زﻳـﺮ ﺑـﻪ روﻳـﺪاد PrintPageاﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ:1 =objPrintDocument.PrintPage + ;)new PrintPageEventHandler(prtPage ﺣﺎل ﺑﺎﻳﺪ ﭼﺎﭘﮕﺮ ﻣﻮرد اﺳﺘﻔﺎده ﺑﺮاي ﭼﺎپ و ﻫﻤﭽﻨﻴﻦ ﺗﻨﻈﻴﻢ ﻫﺎي آن را ،ﺑﺮاي ﺷﻴﺊ PrintDocumentﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺑـﺮاي اﻳﻦ ﻛﺎر ﻛﺎﻓﻲ اﺳﺖ ﺗﻨﻈﻴﻤﻬﺎﻳﻲ ﻛﻪ ﻛﺎرﺑﺮ در ﻛﺎدر Printﻣـﺸﺨﺺ ﻛـﺮده اﺳـﺖ را ﺑـﻪ اﻳـﻦ ﺷـﻴﺊ ﺑﻔﺮﺳـﺘﻴﻢ .ﺗﻨﻈـﻴﻢ ﻫـﺎي ﻛـﺎدر Printدر ﺧﺎﺻــــﻴﺖ PrinterSettingsذﺧﻴــــﺮه ﻣــــﻲ ﺷــــﻮﻧﺪ .ﭘــــﺲ ﻛــــﺎﻓﻲ اﺳــــﺖ ﺧﺎﺻــــﻴﺖ objPrintDocument.PrinterSettingsرا ﺑﺮاﺑﺮ ﺑﺎ آن ﻗﺮار دﻫﻴﻢ. = objPrintDocument.PrinterSettings ;printDialog1.PrinterSettings ﺣﺎل ﺑﺎﻳﺪ ﻣﺘﺪ Printرا ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﺘﺪ روﻳﺪاد PrintPageرا اﺣﻀﺎر ﻣﻲ ﻛﻨﺪ و اﺣﻀﺎر اﻳﻦ روﻳﺪاد ﻧﻴﺰ ﺑﺎﻋـﺚ ﻣـﻲ ﺷﻮد ﻛﻪ ﻛﺪ درون ﻣﺘﺪ prtPageاﺟﺮا ﺷﻮد. ;)(objPrintDocument.Print ﻧﻜﺘﻪ دﻳﮕﺮي ﻛﻪ در اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻣﺘﺪ ﺑﻪ ﻳﻚ روﻳﺪاد ﺑﺎﻳﺪ در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘـﺪﻫﺎﻳﻲ ﻛـﻪ ﻣـﻲ ﺗﻮاﻧﻨـﺪ ﺑـﻪ روﻳـﺪاد PrintPageاﺿﺎﻓﻪ ﺷﻮﻧﺪ ﺑﺎﻳﺪ داراي ﺳﺎﺧﺘﺎر ﺧﺎﺻﻲ ﺑﺎﺷﻨﺪ .اﻳﻦ ﻣﺘﺪﻫﺎ ﻧﺒﺎﻳﺪ ﻣﻘﺪاري را ﺑﺮﮔﺮداﻧﻨﺪ )ﻣﻘﺪار ﺑﺮﮔـﺸﺘﻲ آﻧﻬـﺎ ﺑﺎﻳـﺪ ﺑـﻪ ﺻﻮرت voidﺗﻌﺮﻳﻒ ﺷﻮد( .ﻫﻤﭽﻨﻴﻦ ﺑﺎﻳﺪ دو ﭘﺎراﻣﺘﺮ را از ورودي درﻳﺎﻓﺖ ﻛﻨﻨﺪ :اوﻟﻴﻦ ﭘﺎراﻣﺘﺮ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﺷـﻴﺊ اﺳـﺖ ﻛـﻪ اﻳـﻦ روﻳﺪاد را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده اﺳﺖ .ﻧﺎم اﻳﻦ ﭘﺎراﻣﺘﺮ senderو ﻧﻮع آن از ﻧﻮع ﻛﻼس Objectﺧﻮاﻫﺪ ﺑﻮد .دوﻣﻴﻦ ﭘﺎراﻣﺘﺮ ﺑﺎﻳﺪ ﺷﻴﺊ از ﻧﻮع ﻛﻼس PrintPageEventArgsﺑﺎﺷﺪ .اﻳﻦ ﭘﺎراﻣﺘﺮ ﺣﺎوي اﻃﻼﻋﺎﺗﻲ در ﻣﻮرد ﺻﻔﺤﻪ اي ﻛﻪ ﺑﺎﻳﺪ ﭼﺎپ ﺷﻮد ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺘﺪ prtPageﻛﻪ ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ روﻳﺪاد PrintPageﻓﺮاﺧﻮاﻧﻲ ﺷﻮد ﻣﺸﺎﺑﻪ زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
1در دو ﻓﺼﻞ ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا و ﻓﺼﻮل ﺑﻌﺪ از آن ،ﻣﺘﺪﻫﺎ را دﻗﻴﻖ ﺗﺮ ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
٢٩٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)private void prtPage(object sender, PrintPageEventArgs e ﺣﺎل ﺑﻪ ﺑﺮرﺳﻲ ﻛﺪﻫﺎﻳﻲ ﻣﻲ ﭘﺮدازﻳﻢ ﻛﻪ در داﺧﻞ اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ اﺟﺮا ﺷﻮﻧﺪ .اﺑﺘﺪا ﺑﺎﻳﺪ ﺗﻌﺪادي ﻣﺘﻐﻴﻴﺮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ و ﻣﻘﺎدﻳﺮ آﻧﻬﺎ را ﺗﻨﻈـﻴﻢ ﻛﻨﻴﻢ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻣﻘﺎدﻳﺮ ﻣﺘﻐﻴﺮﻫﺎي sngLeftMarginو sngTopMarginﺑﻪ وﺳﻴﻠﻪ ﻣﻘﺎدﻳﺮ ﻣﻮﺟـﻮد در ﭘـﺎراﻣﺘﺮ PrintPageEventArgsﻛﻪ ﺑﻪ ﻣﺘﺪ ارﺳﺎل ﻣﻲ ﺷﻮد ﺗﻨﻈﻴﻢ ﺧﻮاﻫﺪ ﺷﺪ. ;float sngLinesPerpage = 0 ;float sngVerticalPosition = 0 ;int intLineCount = 0 ;float sngLeftMargin = e.MarginBounds.Left ;float sngTopMargin = e.MarginBounds.Top ;string strLine ﺣﺎل ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ ﻛﻪ در ﻫﺮ ﺻﻔﺤﻪ ﭼﻨﺪ ﺧﻂ ﻣﻲ ﺗﻮاﻧﺪ ﭼﺎپ ﺷﻮد .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ارﺗﻔﺎع ﻗﺎﺑﻞ ﭼـﺎپ در ﺻـﻔﺤﻪ را ﺑـﺮ ارﺗﻔـﺎع ﻓﻮﻧــﺖ )ارﺗﻔــﺎع ﻫــﺮ ﺧــﻂ( ﺗﻘــﺴﻴﻢ ﻛﻨــﻴﻢ .ﺑــﺮاي دﺳﺘﺮﺳــﻲ ﺑــﻪ ارﺗﻔــﺎع ﻗﺎﺑــﻞ ﭼــﺎپ در ﺻــﻔﺤﻪ ﻣــﻲ ﺗــﻮاﻧﻴﻢ از ﺧﺎﺻــﻴﺖ MarginBounds.Heightدر ﺷﻴﺊ eاز ﻛﻼس PrintPageEventArgsاﺳﺘﻔﺎده ﻛﻨﻴﻢ )اﻳﻦ ﺷﻴﺊ ،ﺑـﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ ﻣﺘﺪ ﻓﺮﺳﺘﺎده ﺷﺪه اﺳﺖ(. ارﺗﻔﺎع ﻗﺎﺑﻞ ﭼﺎپ در ﺻﻔﺤﻪ در ﻛﺎدر PrintDialogﺗﻨﻈﻴﻢ ﺷـﺪه و در ﺧﺎﺻـﻴﺖ PrinterSettingsﻗـﺮار ﻣـﻲ ﮔﻴﺮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ در ﻛﺪﻫﺎي ﻗﺒﻠﻲ اﻳـﻦ ﺧﺎﺻـﻴﺖ را در ﺧﺎﺻـﻴﺖ PrinterSettingsﻣﺮﺑـﻮط ﺑـﻪ ﺷـﻴﺊ objPrintDocumentﻗــﺮار دادﻳــﻢ .ﺷــﻴﺊ objPrintDoumentﻫــﻢ ﻫﻨﮕــﺎﻣﻲ ﻛــﻪ ﺑﺨﻮاﻫــﺪ روﻳــﺪاد PrintPageرا ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪ ،اﻳﻦ ﻣﻘﺪار را ﺑﻪ وﺳـﻴﻠﻪ ﺷـﻴﺊ از ﻛـﻼس PrintPageEventArgsﺑـﻪ ﻣﺘـﺪﻫﺎي ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه ﻣﻲ ﻓﺮﺳﺘﺪ. sngLinesPerpage = e.MarginBounds.Height / ;)objPrintFont.GetHeight(e.Graphics ﭘﺲ ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻐﻴﻴﺮ sngLinesPerPageﺣﺎوي ﺗﻌﺪاد ﺧﻄﻮﻃﻲ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ در ﻫﺮ ﺻﻔﺤﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺣﺎل ﺑﺎﻳﺪ ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ را ﺧﻂ ﺑﻪ ﺧﻂ ﺧﻮاﻧﺪه و در ﺻﻔﺤﻪ ﺑﺮاي ﭼﺎپ ﻗﺮار دﻫﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺣﻠﻘﻪ ،ﻣﺘﻦ داﺧﻞ ﻓﺎﻳﻞ را ﺧـﻂ ﺑﻪ ﺧﻂ در ﺻﻔﺤﻪ وارد ﻣﻲ ﻛﻨﻴﻢ .اﺟﺮاي اﻳﻦ ﺣﻠﻘﻪ ﺗﺎ زﻣﺎﻧﻲ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻳﺎ ﻣﺘﻦ داﺧﻞ ﻓﺎﻳﻞ ﺗﻤﺎم ﺷﻮد و ﺑﻪ اﻧﺘﻬﺎي ﻓﺎﻳﻞ ﺑﺮﺳﻴﻢ و ﻳﺎ ﺗﻌﺪاد ﺧﻄﻬﺎﻳﻲ ﻛﻪ در ﺻﻔﺤﻪ ﻗﺮار داده اﻳﻢ ﺑﺮاﺑﺮ ﺑﺎ ﺣﺪاﻛﺜﺮ ﺗﻌﺪاد ﺧﻄﻬﺎﻳﻲ ﺷﻮد ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ در ﻳﻚ ﺻﻔﺤﻪ وارد ﻛﻨﻴﻢ ،ﺑـﻪ ﻋﺒـﺎرت دﻳﮕﺮ ﺻﻔﺤﻪ ﭘﺮ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ اﺑﺘﺪا اوﻟﻴﻦ ﺧﻂ را ﺧﻮاﻧﺪه و در ﻣﺘﻐﻴﺮ strLineﻗﺮار ﻣﻲ دﻫﻴﻢ و ﺳﭙﺲ ﺣﻠﻘﻪ را اﺟﺮا ﻣﻲ ﻛﻨﻴﻢ: ;)(strLine = objStreamToPrint.ReadLine =! while((intLineCount < sngLinesPerpage) && (strLine ))null { ﻗﺒﻞ از اﻳﻨﻜﻪ ﻣﺘﻨﻲ را در ﺻﻔﺤﻪ ﻗﺮار دﻫﻴﻢ ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ ﻛﻪ ﻣﻮﻗﻌﻴﺖ ﻋﻤﻮدي ﻣﺘﻦ در ﺻﻔﺤﻪ ﭼﻘﺪر اﺳﺖ .ﺑـﻪ ﻋﺒـﺎرت دﻳﮕـﺮ ﺑﺎﻳـﺪ ﻓﺎﺻﻠﻪ ﻣﺘﻦ را از ﺑﺎﻻي ﺻﻔﺤﻪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺑﺮاي ﺗﻌﻴﻴﻦ ﻓﺎﺻﻠﻪ ﻣﺘﻦ از ﺑﺎﻻي ﺻﻔﺤﻪ ﺑﺎﻳﺪ اﻧﺪازه ﻗـﺴﻤﺖ ﺳـﻔﻴﺪ ﺑـﺎﻻي ﺻـﻔﺤﻪ را ﺑـﺎ
٢٩١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ارﺗﻔﺎع ﺗﻌﺪاد ﺧﻄﻬﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﭼﺎپ ﺷﺪه اﻧﺪ ﺟﻤﻊ ﻛﻨﻴﻢ .ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ارﺗﻔﺎع ﺗﻌﺪاد ﺧﻄﻬﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﭼﺎپ ﺷﺪه اﻧﺪ ﻧﻴﺰ ﺑﺎﻳﺪ ﺣﺎﺻﻞ ﺿﺮب ﺗﻌﺪاد ﺧﻄﻬﺎﻳﻲ ﻛﻪ در ﺻﻔﺤﻪ ﭼﺎپ ﺷﺪه اﻧﺪ در ارﺗﻔﺎع ﻫﺮ ﺧﻂ را ﺑﺪﺳﺖ آورﻳﻢ: sngVerticalPosition = sngTopMargin + ;))(intLineCount * objPrintFont.GetHeight(e.Graphics ﺑﺮاي اﻳﻨﻜﻪ واﻗﻌﺎً ﻣﺘﻦ را ﺑﻪ ﭼﺎﭘﮕﺮ ﺑﻔﺮﺳﺘﻴﻢ ﺑﺎﻳـﺪ از ﺗـﺎﺑﻊ DrawStringدر ﻛـﻼس Graphicsاﺳـﺘﻔﺎده ﻛﻨـﻴﻢ .ﻛـﻼس Graphicsﺑﻪ ﺻﻮرت ﻳﻜﻲ از ﺧﺎﺻﻴﺘﻬﺎي ﻛـﻼس PrintPageEventArgsﺑـﻪ اﻳـﻦ ﻣﺘـﺪ ﻓﺮﺳـﺘﺎده ﻣـﻲ ﺷـﻮد. ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ ﻛﻪ ﺗﺎﺑﻊ DrawStringدرﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﻋﺒﺎرﺗﻨﺪ از :ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ ﭼﺎپ ﺷﻮد ،ﻓﻮﻧﺖ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ ﭼﺎپ ﺷﻮد ،رﻧـﮓ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ ﭼﺎپ ﺷﻮد )اﻳﻦ رﻧﮓ ﺑﺎﻳﺪ از ﺷﻤﺎرﻧﺪه ي Brushesاﻧﺘﺨﺎب ﺷﻮد( ،ﻓﺎﺻﻠﻪ ﻣﺘﻦ از ﺳﻤﺖ ﭼﭗ ﺻﻔﺤﻪ ،ﻓﺎﺻﻠﻪ ﻣـﺘﻦ از ﺑﺎﻻي ﺻﻔﺤﻪ ،و ﻗﺎﻟﺐ ﻣﺘﻦ ﺑﺮاي ﭼﺎپ.در اﻳﻦ ﻗـﺴﻤﺖ ﻗـﺎﻟﺒﻲ ﺑـﺮاي ﻣـﺘﻦ ﻣـﺸﺨﺺ ﻧﻤـﻲ ﻛﻨـﻴﻢ ﺑﻠﻜـﻪ ﻳـﻚ ﺷـﻴﺊ ﺟﺪﻳـﺪ از ﻛـﻼس StringFormatاﻳﺠﺎد ﻛﺮده و آن را ﺑﻪ ﺗﺎﺑﻊ ﻣﻲ ﻓﺮﺳﺘﻴﻢ. e.Graphics.DrawString(strLine, objPrintFont, Brushes.Black, sngLeftMargin, sngVerticalPosition, ;))(new StringFormat ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻳﻚ ﺧﻂ از ﻣﺘﻦ را ﭼﺎپ ﻛﺮده اﻳﻢ ،ﭘﺲ ﻳﻚ واﺣﺪ ﺑﻪ ﺗﻌﺪاد ﺧﻄﻬﺎ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ: ;intLineCount = intLineCount + 1 ﺣﺎل ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺻﻔﺤﻪ ﭘﺮ ﺷـﺪه اﺳـﺖ ﻳـﺎ ﻧـﻪ .اﮔـﺮ ﺻـﻔﺤﻪ ﭘـﺮ ﻧـﺸﺪه ﺑـﻮد ﺧـﻂ دﻳﮕـﺮي را از ﻓﺎﻳـﻞ ﺧﻮاﻧـﺪه و در ﻣﺘﻐﻴﻴـﺮ strLineﻗﺮار ﻣﻴﺪﻫﻴﻢ ﺗﺎ ﺣﻠﻘﻪ ﺑﺎ ﺧﻂ ﺟﺪﻳﺪ اداﻣﻪ ﭘﻴﺪا ﻛﻨﺪ: )if (intLineCount < sngLinesPerpage { ;)(strLine = objStreamToPrint.ReadLine } ﺑﻌﺪ از اﻳﻨﻜﻪ ﻳﻚ ﺻﻔﺤﻪ ﻛﺎﻣﻼً ﭘﺮ ﺷﺪ ،ﺑﺮﻧﺎﻣﻪ از ﺣﻠﻘﻪ ﺧﺎرج ﻣﻲ ﺷﻮد .ﺣﺎل ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ ﻛﻪ ﺻﻔﺤﻪ دﻳﮕﺮي ﻫﻢ ﺑﺎﻳﺪ ﭼﺎپ ﺷـﻮد و ﻳﺎ اﻳﻨﻜﻪ ﻣﺘﻦ داﺧﻞ ﻓﺎﻳﻞ ﺗﻤﺎم ﺷﺪه اﺳﺖ .اﮔﺮ ﻣﺘﻦ داﺧﻞ ﻓﺎﻳﻞ ﺗﻤـﺎم ﺷـﺪه ﺑـﻮد ﺑﺎﻳـﺪ ﺧﺎﺻـﻴﺖ HasMorePagesرا ﺑﺮاﺑـﺮ ﺑـﺎ falseﻗﺮار دﻫﻴﻢ ﻛﻪ ﺗﺎﺑﻊ Printﺑﺎر دﻳﮕﺮ ﺑﺎﻋﺚ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪن روﻳﺪاد PrintPageﻧﺸﻮد .اﻣﺎ اﮔﺮ ﻣـﺘﻦ ﺗﻤـﺎم ﻧـﺸﺪه ﺑﻮد ،ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﭼﺎپ اداﻣﻪ ي ﻣﺘﻦ ،ﺧﺎﺻﻴﺖ HasMorePagesرا ﺑﺮاﺑﺮ ﺑﺎ trueﻗﺮار دﻫﻴﻢ .ﺑﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ﺗـﺎﺑﻊ Printﺑﺎر دﻳﮕﺮ روﻳﺪاد PrintPageرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ ﺗﺎ ﻣﺘﺪ prtPageﺑﺘﻮاﻧﺪ ﺻﻔﺤﻪ ﺑﻌﺪ را ﭼﺎپ ﻛﻨﺪ. )if (strLine != null { ;e.HasMorePages = true } else
٢٩٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ ;e.HasMorePages = false } ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺗﻤﺎم ﻣﺘﻦ داﺧﻞ ﻓﺎﻳﻞ ﺑﻪ ﭼﺎﭘﮕﺮ ﻓﺮﺳﺘﺎده ﺷﺪ ،وﻇﻴﻔﻪ ﻣﺘﺪ Printﺗﻤﺎم ﺷﺪه اﺳﺖ و ﺑﺮﻧﺎﻣﻪ ﺑﻪ اداﻣـﻪ ﻛـﺪﻫﺎي ﻣﻮﺟـﻮد در ﻣﺘﺪ btnPrint_Clickﺑﺮﻣﻲ ﮔﺮدد .ﺗﻨﻬﺎ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ در اداﻣﻪ اﻧﺠﺎم دﻫﻴﻢ اﻳﻦ اﺳﺖ ﻛﻪ ﻓﻀﺎي اﺷـﻐﺎل ﺷـﺪه ﺑـﻪ وﺳـﻴﻠﻪ اﺷﻴﺎي ﻣﺮﺑﻮط ﺑﻪ ﭼﺎپ و ﻧﻴﺰ اﺷﻴﺎي ﻣﺮﺑﻮط ﺑﻪ ﺧﻮاﻧﺪن از ﻓﺎﻳﻞ را آزاد ﻛﻨﻴﻢ. ;)(objStreamToPrint.Close ;objStreamToPrint = null
ﻛﻨﺘﺮل :FolderBrowserDialog ﺑﻌﻀﻲ از ﻣﻮاﻗﻊ ﻣﻤﻜﻦ اﺳﺖ در ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻛﻪ ﺑﻪ ﺟﺎي اﻧﺘﺨﺎب ﻳﻚ ﻓﺎﻳﻞ ،ﻳﻚ ﻓﻮﻟﺪر را ﻣﺸﺨﺺ ﻛﻨـﺪ. ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻛﺎرﺑﺮ ﻓﻮﻟﺪري را ﺑﺮاي ذﺧﻴﺮه ﻓﺎﻳﻠﻬﺎي ﭘﺸﺘﻴﺒﺎن 1و ﻳﺎ ﻓﻮﻟﺪري را ﺑﺮاي ذﺧﻴـﺮه ﻓﺎﻳﻠﻬـﺎي ﻣـﻮﻗﺘﻲ ﺑﺮﻧﺎﻣـﻪ ﻣﺸﺨﺺ ﻛﻨﺪ.در اﻳﻦ ﻣﻮاﻗﻊ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل ،FolderBrowserDialogﻛـﺎدر اﺳـﺘﺎﻧﺪارد Browse For Folderرا در ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ در دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻛﺮده ﺑﺎﺷﻴﺪ ،اﻳﻦ ﻛﺎدر ﻓﻘﻂ ﻓﻮﻟﺪرﻫﺎي ﻣﻮﺟﻮد در ﻛﺎﻣﭙﻴﻮﺗﺮ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﺑﻪ واﺳﻄﻪ آن ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﻓﻮﻟﺪري را در ﺑﺮﻧﺎﻣﻪ ﻣﺸﺨﺺ ﻛﻨﺪ. ﻫﻤﺎﻧﻨﺪ ﺗﻤﺎم ﻛﺎدرﻫﺎي دﻳﮕﺮ ،ﻛﺎدر FolderBrowserﻧﻴﺰ ﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻛﻨﺘﺮل ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴـﺮد و ﻫـﻢ ﺑـﻪ ﺻﻮرت ﻳﻚ ﻛﻼس .ﺷﻜﻞ 16-7ﻳﻚ ﻛﺎدر FolderBrowserرا ﺑﺪون ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺘﻬﺎي آن )ﺑﺎ ﻣﻘﺎدﻳﺮ ﭘﻴﺶ ﻓﺮض ﺧﺎﺻﻴﺖ ﻫﺎ( ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ اﻳﻦ ﻓﺮم ﻳﻚ دﻛﻤﻪ ﻓﺮﻣﺎن Make New Folderوﺟـﻮد دارد ﻛـﻪ ﺑـﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﻓﻮﻟﺪر ﺟﺪﻳﺪي را اﻳﺠﺎد ﻛﻨﺪ.
Backup Files
1
٢٩٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 16-7
ﺧﺎﺻﻴﺘﻬﺎي ﻛﻨﺘﺮل :FolderBrowser ﻗﺒﻞ از اﻳﻨﻜﻪ ﻧﺤﻮه اﺳﺘﻔﺎده از اﻳﻦ ﻛﻨﺘﺮل را در ﻛﺪ ﻣﺸﺎﻫﺪه ﻛﻨﻴﻢ ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﺑﺮرﺳـﻲ ﺧﺎﺻـﻴﺘﻬﺎي ﻣﻬـﻢ آن ﺑﭙـﺮدازﻳﻢ .در ﺟـﺪول زﻳـﺮ ﻟﻴﺴﺘﻲ از ﻧﺎم و ﻧﺤﻮه اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي ﻣﻬﻢ اﻳﻦ ﻛﻨﺘﺮل آورده ﺷﺪه اﺳﺖ. ﻧﺎم ﺧﺎﺻﻴﺖ
ﺷﺮح
Description
ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻣﺘﻨﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﺗﻮﺿﻴﺢ در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
RootFolder
ﻣﺸﺨﺺ ﻛﻨﻨﺪه آدرس ﻓﻮﻟﺪري اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﭘـﻴﺶ ﻓـﺮض ﺑﺎﻳـﺪ در ﻛـﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد.
SelectedPath
ﻣﺸﺨﺺ ﻛﻨﻨﺪه آدرس ﻣﺴﻴﺮي اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ.
ShowNewFolderButton
ﻣـﺸﺨﺺ ﻣـﻲ ﻛﻨـﺪ آﻳـﺎ دﻛﻤـﻪ ي Make New Folderدر ﻛـﺎدر ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻳﺎ ﻧﻪ؟
ﻛﺎدر ﻣﺤﺎوره اي FolderBrowserاوﻟﻴﻦ ﻛﺎدري اﺳﺖ ﻛﻪ ﺗﻘﺮﻳﺒﺎً از ﺗﻤﺎم ﺧﺎﺻﻴﺘﻬﺎي آن اﺳﺘﻔﺎده ﺧﻮاﻫﻴﺪ ﻛﺮد. ﻫﻤﺎﻧﻨﺪ ﺗﻤﺎم ﻛﺎدرﻫﺎي دﻳﮕﺮ ،اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ داراي ﻣﺘﺪي ﺑﻪ ﻧﺎم ShowDialogاﺳﺖ ﻛﻪ ﺑﺎﻋﺚ ﻧﻤﺎﻳﺶ داده ﺷﺪن ﻛﺎدر در ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد .ﻧﺤﻮه اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ در اﻳﻦ ﻛﻨﺘﺮل ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي دﻳﮕﺮ اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻧﻴﺎزي ﺑﻪ ﺗﻮﺿﻴﺢ ﻣﺠﺪد آن ﻧﻴﺴﺖ.
٢٩٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده از ﻛﻨﺘﺮل :FolderBrowser ﻫﻤﺎﻧﻨﺪ ﺗﻤﺎم ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي دﻳﮕﺮ ،ﻗﺒﻞ از ﻧﻤﺎﻳﺶ ﻛـﺎدر Browse For Folderﺑﺎﻳـﺪ ﺑﻌـﻀﻲ از ﺧﺎﺻـﻴﺘﻬﺎي آن را ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺳﻪ ﺧﺎﺻﻴﺘﻲ ﻛﻪ ﻋﻤﻮﻣﺎً ﻗﺒﻞ از ﻧﻤﺎﻳﺶ اﻳﻦ ﻛﺎدر ﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮﻧﺪ در ﻗﻄﻌﻪ ﻛﺪ زﻳـﺮ ﻧـﺸﺎن داده ﺷـﺪه اﻧـﺪ .اوﻟـﻴﻦ ﺧﺎﺻـﻴﺖ Descriptionاﺳﺖ ﻛﻪ ﻳﻚ ﺗﻮﺿﻴﺢ و ﻳﺎ دﺳﺘﻮراﻟﻌﻤﻞ را ﺑﺮاي ﻛﺎرﺑﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﻣﺘﻨﻲ ﻛـﻪ در اﻳـﻦ ﺧﺎﺻـﻴﺖ ﻗﺮار داده ﺷﻮد ،ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ShowDialogدر ﺑﺎﻻي ﻛﺎدر ﻧﻮﺷﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ. ﺧﺎﺻﻴﺖ ﺑﻌﺪي ﺧﺎﺻﻴﺖ RootFolderاﺳﺖ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻫﻨﮕﺎم ﻧﻤﺎﻳﺶ ﻛﺎدر ،ﭼﻪ ﻓﻮﻟـﺪري ﺑـﻪ ﺻـﻮرت ﭘﻴﺶ ﻓﺮض ﻧﻤﺎﻳﺶ داده ﺷﻮد .اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﻘﺪاري را از ﺷﻤﺎرﻧﺪه Environment.SpecialFolderدرﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و اﻳﻦ ﺷﻤﺎرﻧﺪه ﻧﻴﺰ ﺧﻮد ﺣﺎوي آدرس ﻓﻮﻟﺪرﻫﺎي ﻣﺨﺼﻮص ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ وﻳﻨﺪوز ﻣﺎﻧﻨﺪ ﻓﻮﻟﺪر My Documentsاﺳﺖ. ﺧﺎﺻﻴﺖ دﻳﮕﺮي ﻛﻪ ﻗﺒﻞ از ﻧﻤﺎﻳﺶ ﻛﺎدر ﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد ،ﺧﺎﺻـﻴﺖ ShowNewFolderButtonاﺳـﺖ .اﮔـﺮ ﻣﻘـﺪار اﻳـﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ trueﺑﺎﺷﺪ ،دﻛﻤﻪ ي Make New Folderدر ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﺗﺎ ﺑﻪ ﻛﺎرﺑﺮ اﺟـﺎزه داده ﺷـﻮد ﻓﻮﻟﺪر ﺟﺪﻳﺪي را اﻳﺠﺎد ﻛﻨﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت اﻳﻦ دﻛﻤﻪ ﻧﻤﺎﻳﺶ داده ﻧﺨﻮاﻫﺪ ﺷﺪ. = folderBrowserDialog1.Description ;""Select a folder for your backups: = folderBrowserDialog1.RootFolder ;Environment.SpecialFolder.MyComputer ;folderBrowserDialog1.ShowNewFolderButton = false ﺑﻌﺪ از ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺘﻬﺎي ﻻزم ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ShowDialogﻛﺎدر Browse For Folderرا ﻧﻤﺎﻳﺶ دﻫﻴﺪ: ;)(folderBrowserDialog1.ShowDialog اﻳﻦ ﺗﺎﺑﻊ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﺎدرﻫﺎي ﻗﺒﻠﻲ ﻣﻘﺪاري را از ﻧﻮع DialogResultﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳـﺘﻔﺎده از ﻳـﻚ دﺳـﺘﻮر ifﺑﻪ ﺑﺮرﺳﻲ ﻧﺘﻴﺠﻪ آن ﺑﭙﺮدازﻳﺪ .ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ آدرس ﻓﻮﻟﺪري ﻛـﻪ ﻛـﺎرﺑﺮ اﻧﺘﺨـﺎب ﻛـﺮده اﺳـﺖ ﻣـﻲ ﺗﻮاﻧﻴـﺪ از ﻣﻘـﺪار ﺧﺎﺻـﻴﺖ SelectedPathاﺳﺘﻔﺎده ﻛﺮده و آن را در ﻣﺘﻐﻴﺮي ذﺧﻴﺮه ﻛﻨﻴﺪ .اﻳﻦ ﺧﺎﺻﻴﺖ آدرس ﻛﺎﻣﻞ ﻓﻮﻟﺪر اﻧﺘﺨﺎب ﺷﺪه ﺗﻮﺳﻂ ﻛـﺎرﺑﺮ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻛﺎرﺑﺮ ﻓﻮﻟﺪر tempرا درون دراﻳﻮ Cاﻧﺘﺨﺎب ﻛﻨﺪ ،ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﻪ ﺻﻮرت C:\tempﺧﻮاﻫـﺪ ﺑﻮد. ;strFileName = folderBrowserDialog1.SelectedPath در اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺠﺪداً از ﭘﺮوژه Dialogsاﺳﺘﻔﺎده ﻛﺮده و ﻛﺎدر Browse For Folderرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫـﻴﻢ. اﮔﺮ ﻛﺎرﺑﺮ ﻓﻮﻟﺪري را در اﻳﻦ ﻛﺎدر اﻧﺘﺨﺎب ﻛﺮد ،آدرس آن را در TextBoxدرون ﻓﺮم ﻧﻤﺎﻳﺶ ﺧﻮاﻫﻴﻢ داد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل FolderBrowser (1ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم در ﭘﺮوژه Dialogsﺑﺮوﻳﺪ.
٢٩٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(2ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻛﻨﺘﺮل Buttonدﻳﮕﺮي را ﺑﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﺑﺮ ﻃﺒـﻖ ﻟﻴـﺴﺖ زﻳـﺮ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Nameرا ﺑﺮاﺑﺮ ﺑﺎ btnBrowseﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Browseﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Locationرا ﺑﺮاﺑﺮ ﺑﺎ 367;158ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Anchorرا ﺑﺮاﺑﺮ ﺑﺎ Top,Rightﻗﺮار دﻫﻴﺪ.
(3ﺣﺎل ﺑﺎﻳﺪ ﻳﻚ ﻛﻨﺘﺮل FolderBrowserDialogرا ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛـﺎر در ﺟﻌﺒـﻪ اﺑـﺰار ﺑـﻪ ﻗﺴﻤﺖ Dialogsﺑﺮوﻳﺪ و ﺑﺮ روي ﻛﻨﺘﺮل FolderBrowserDialogدو ﺑـﺎر ﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮﻟﻬﺎي ﻗﺒﻠﻲ ﺑﻪ ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم اﺿﺎﻓﻪ ﺧﻮاﻫﺪ ﺷﺪ. (4ﺑﺮ روي دﻛﻤﻪ ي btnBrowseدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Clickآن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳـﺮ را در آن ﻣﺘﺪ وارد ﻛﻨﻴﺪ: )private void btnBrowse_Click(object sender, EventArgs e { // Set the FolderBrowserDialog control properties = folderBrowserDialog1.Description ;""Select a folder for your backups: = folderBrowserDialog1.RootFolder ;Environment.SpecialFolder.MyComputer ;folderBrowserDialog1.ShowNewFolderButton = false // Show the Browse For Folder dialog == )(if (folderBrowserDialog1.ShowDialog )DialogResult.OK { // Display the selected folder ;txtFile.Text = folderBrowserDialog1.SelectedPath } } (5ﺗﻤﺎم ﻛﺪ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﻤﻴﻦ ﺑﻮد .ﺑﺮاي اﻣﺘﺤﺎن ﻋﻤﻠﻜﺮد ﺑﺮﻧﺎﻣـﻪ ،در ﻧـﻮار اﺑـﺰار روي دﻛﻤـﻪ Startﻛﻠﻴـﻚ ﻛﻨﻴﺪ. (6ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻓـﺮم ﺑﺮﻧﺎﻣـﻪ ﻧﻤـﺎﻳﺶ داده ﺷـﺪ ،روي دﻛﻤـﻪ ي Browseﻛﻠﻴـﻚ ﻛﻨﻴـﺪ .ﻛـﺎدر Browse For Folderﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 17-7ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
٢٩٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 17-7 (7ﻓﻮﻟﺪري را در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺧﻮد ﻣﺸﺨﺺ ﻛﺮده و روي دﻛﻤﻪ ﻓﺮﻣﺎن OKﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد ﻛـﻪ آدرس ﻛﺎﻣـﻞ ﻓﻮﻟﺪر ﻣﺸﺨﺺ ﺷﺪه ،ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 18-7در ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 18-7
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻗﺒﻞ از اﻳﻨﻜﻪ ﻛﺎدر Browse For Folderرا ﻧﻤﺎﻳﺶ دﻫﻴﺪ ،ﺑﺎﻳﺪ ﺑﻌﻀﻲ از ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﺗـﺎ ﻇـﺎﻫﺮ آن ﺑـﺎ ﺑﺮﻧﺎﻣﻪ ﻫﻤﺎﻫﻨﮓ ﺷﻮد .اوﻟﻴﻦ ﺧﺎﺻﻴﺖ ،ﺧﺎﺻﻴﺖ Descriptionاﺳﺖ ﻛﻪ ﺑﺮاي راﻫﻨﻤﺎﻳﻲ ﻛﺎرﺑﺮ در ﻣﻮرد اﻳﻦ ﻛﺎدر ﺑـﻪ ﻛـﺎر ﻣـﻲ ٢٩٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
رود .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ ﻣﻘـﺪار اﻳـﻦ ﻣﺘﻐﻴﻴـﺮ در اﺑﺘـﺪاي اﻳـﻦ ﻛـﺎدر ﻧﻤـﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد .ﺧﺎﺻـﻴﺖ ﺑﻌـﺪي ،ﺧﺎﺻـﻴﺖ RootFolderاﺳﺖ ﻛﻪ ﻓﻮﻟﺪر ﭘﻴﺶ ﻓﺮض را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ My Computerرا ﺑﻪ ﻋﻨﻮان ﻓﻮﻟﺪر ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﮔﺮﻓﺘﻪ اﻳﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻫﻨﮕﺎم ﻧﻤﺎﻳﺶ ﻛﺎدر دراﻳﻮﻫـﺎي ﻣﻮﺟـﻮد در My Computerﺑـﻪ ﻃـﻮر ﭘﻴﺶ ﻓﺮض ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ .در اﻧﺘﻬﺎ ﻧﻴﺰ ﺧﺎﺻـﻴﺖ ShowNewFolderButtonرا ﺑﺮاﺑـﺮ ﺑـﺎ falseﻗـﺮار ﻣـﻲ دﻫﻴﻢ ﺗﺎ اﻳﻦ دﻛﻤﻪ در ﻛﺎدر ﻧﻤﺎﻳﺶ داده ﻧﺸﻮد. // Set the FolderBrowserDialog control properties = folderBrowserDialog1.Description ;""Select a folder for your backups: = folderBrowserDialog1.RootFolder ;Environment.SpecialFolder.MyComputer ;folderBrowserDialog1.ShowNewFolderButton = false ﺳﭙﺲ ﻛﺎدر اي را ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ShowDialogﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﻢ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از دﺳـﺘﻮر ifﺑﺮرﺳـﻲ ﻣـﻲ ﻛﻨـﻴﻢ ﻛـﻪ ﻛﺎرﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﺮده اﺳﺖ و ﻳﺎ روي دﻛﻤﻪ :Cancel // Show the Browse For Folder dialog == )(if (folderBrowserDialog1.ShowDialog )DialogResult.OK { اﮔﺮ ﻛﺎرﺑﺮ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﺮده ﺑﻮد ،آدرس ﻓﻮﻟﺪر اﻧﺘﺨﺎب ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ را ﻛﻪ در ﺧﺎﺻـﻴﺖ SelectedPathﻗـﺮار ﮔﺮﻓﺘﻪ اﺳﺖ در ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ. // Display the selected folder ;txtFile.Text = folderBrowserDialog1.SelectedPath
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ ﺑﻌﻀﻲ از ﻛﺎدرﻫﺎ را ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﮋوال 2005 C#ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ را ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ .اﻳـﻦ ﻛﺎدرﻫـﺎ ﻋﺒـﺎرت اﻧـﺪ ،FontDialog ،SaveFileDialog ،OpenFileDialog از،MessageBox: PrintDialog ،ColorDialogو .FolderBrowserDialogﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣـﺸﺎﻫﺪه ﻛﺮدﻳـﺪ ،اﻳـﻦ ﻛﺎدرﻫﺎ راﺑﻄﻬﺎي ﻛﺎرﺑﺮي اﺳﺘﺎﻧﺪارد را ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﻨﺪ و ﺑﻪ واﺳﻄﻪ آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ اي ﺑﺎ ﻇﺎﻫﺮ ﺣﺮﻓﻪ اي ﺗـﺮ و ﻣـﺸﺎﺑﻪ دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻃﺮاﺣﻲ ﻛﻨﻴﺪ. اﮔﺮﭼﻪ ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻛﺎدرﻫﺎ از ﻛﻨﺘﺮﻟﻬﺎي ﻣﺘﻨﺎﻇﺮ آﻧﻬﺎ در ﺟﻌﺒﻪ اﺑﺰار اﺳﺘﻔﺎده ﻛﺮدﻳﺪ ،اﻣﺎ ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺗﻤﺎم اﻳﻦ ﻛﺎدرﻫـﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮﻧﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻛﻼس ﻣﺘﻨﺎﻇﺮ ﺑﺎ اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﻧﻴﺰ ﻫﻤﻴﻦ ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘـﺪﻫﺎ را اراﺋﻪ ﻣﻲ دﻫﻨﺪ و ﺗﻔﺎوﺗﻲ ﻧﺪارد ﻛﻪ در ﺑﺮﻧﺎﻣﻪ از آﻧﻬﺎ ﺑﻪ ﻋﻨﻮان ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻳﺎ ﺑﻪ ﻋﻨﻮان ﻛﻨﺘﺮل .ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻛﺎدرﻫﺎ ﺑﻪ ﺻﻮرت ﻛﻨﺘﺮل ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺘﻐﻴﺮي را از ﻧﻮع ﻛﻼس ﻣﺮﺗﺒﻂ ﺑﺎ ﻛﺎدر ﻣﻮرد ﻧﻈﺮﺗﺎن ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ و در ﻫﺮ ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺧﻮاﺳﺘﻴﺪ از آن
٢٩٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﺎدر اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر newﻛﺎدر را اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﻌﺪ از اﺳﺘﻔﺎده ﻫﻢ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺘﻐﻴﻴﺮ را از ﺑﻴﻦ ﺑﺒﺮﻳﺪ ﺗـﺎ ﺣﺎﻓﻈـﻪ ﮔﺮﻓﺘـﻪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ آن آزاد ﺷﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺣﺎﻓﻈﻪ ﻛﻤﺘﺮي در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﺧﻮاﻫﻴﺪ ﻛﺮد و ﺑﺮﻧﺎﻣﻪ ﻛﺎراﻳﻲ ﺑﻴﺸﺘﺮي ﺧﻮاﻫﺪ داﺷﺖ. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﺑﺎ اﺳﺘﻔﺎده از ﻛﻼس MessageBoxﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم را ﺑﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. در ﻳﻚ ﻛﺎدر ﭘﻴﻐﺎم از آﻳﻜﻮن و دﻛﻤﻪ ﻫﺎي ﻣﻮرد ﻧﻈﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ. از ﻛﻨﺘﺮل OpenFileDialogاﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻣﺤﺘﻮﻳﺎت ﻳﻚ ﻓﺎﻳﻞ را ﺑﺨﻮاﻧﻴﺪ. از ﻛﻨﺘﺮل SaveFileDialogاﺳﺘﻔﺎده ﻛﺮده و اﻃﻼﻋﺎﺗﻲ را در ﻳﻚ ﻓﺎﻳﻞ ﺑﻨﻮﻳﺴﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل FontDialogرﻧﮓ و ﻓﻮﻧﺖ ﻳﻚ ﻣﺘﻦ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل ColorDialogرﻧﮓ ﭘﻴﺶ زﻣﻴﻨﻪ ﻳﻚ ﻛﻨﺘﺮل ،ﻣﺎﻧﻨﺪ ﻓﺮم را ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل PrintDialogﻣﺘﻨﻲ را ﭼﺎپ ﻛﻨﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل FolderBrowserDialogﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﺪ ﻓﻮﻟﺪري را در ﺑﺮﻧﺎﻣﻪ اﻧﺘﺨﺎب ﻛﻨﺪ.
ﺗﻤﺮﻳﻦ:
ﺗﻤﺮﻳﻦ :1 ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ﺳﺎده اي اﻳﺠﺎد ﻛﺮده و در ﻓﺮم آن ﻳﻚ TextBoxو دو Buttonﻗﺮار دﻫﻴﺪ .ﻛﻨﺘﺮل ﻫﺎي Buttonرا ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ﻛﻪ ﻓﺎﻳﻠﻲ را ﺑﺎز ﻛﺮده ،ﻧﻤﺎﻳﺶ دﻫﻨﺪ و آن را ذﺧﻴﺮه ﻛﻨﻨـﺪ .ﺑـﺮاي ﺑـﺎز ﻛـﺮدن و ذﺧﻴـﺮه ﻛـﺮدن ﻓﺎﻳـﻞ از ﻛﻼﺳـﻬﺎي OpenFileDialogو SaveFileDialogاﺳﺘﻔﺎده ﻛﻨﻴﺪ )ﻧﻪ از ﻛﻨﺘﺮﻟﻬﺎي آﻧﻬﺎ(. راﻫﻨﻤﺎﻳﻲ :ﺑﺮاي ﺗﻌﺮﻳﻒ ﻛﻼﺳﻬﺎي ﻣﺘﻨﺎﻇﺮ ﺑﺎ ﻛﻨﺘﺮﻟﻬﺎي OpenFileDialogو SaveFileDialogﻣﻲ ﺗﻮاﻧﻴﺪ از دﺳﺘﻮرات زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: ;)(OpenFileDialog openFileDialog1 = new OpenFileDialog ;)(SaveFileDialog saveFileDialog1 = new SaveFileDialog
ﺗﻤﺮﻳﻦ :2 ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﺳﺎده ي وﻳﻨـﺪوزي اﻳﺠـﺎد ﻛﻨﻴـﺪ ﻛـﻪ ﺷـﺎﻣﻞ ﻳـﻚ ﻛﻨﺘـﺮل Labelو ﻳـﻚ ﻛﻨﺘـﺮل Buttonﺑﺎﺷـﺪ .در ﻛﻨﺘـﺮل Buttonﻛﺪي را وارد ﻛﻨﻴﺪ ﻛﻪ ﻳﻚ ﻛﺎدر Browser For Folderرا ﻧﻤﺎﻳﺶ دﻫﺪ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﻛﺎدر دﻛﻤﻪ ي Make New Folderرا ﻧﻴﺰ ﻓﻌﺎل ﻛﻨﻴﺪ .ﻓﻮﻟﺪر My Documentsرا در اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﻋﻨﻮان ﻓﻮﻟﺪر ﭘﻴﺶ ﻓﺮض ﻗﺮار
٢٩٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Browserاز ﻛـــﻼس For داده و ﺳـــﭙﺲ ﻛـــﺎدر را ﻧﻤـــﺎﻳﺶ دﻫﻴـــﺪ .ﺑـــﺮاي اﺳـــﺘﻔﺎده از ﻛـــﺎدر Folder FolderBrowserDialogاﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻧﺘﻬﺎ ﻧﻴﺰ آدرس اﻧﺘﺨﺎب ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ي ﻛـﺎرﺑﺮ را در ﻛﻨﺘـﺮل Label ﻗﺮار دﻫﻴﺪ.
٣٠٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﻫﺸﺘﻢ :ﻣﻨﻮ ﻫﺎ ﻣﻨﻮ ﻫﺎ ﺟﺰ ﺗﻔﻜﻴﻚ ﻧﺎﭘﺬﻳﺮ ﻫﺮ ﺑﺮﻧﺎﻣﻪ ي ﺧﻮب ﻣﺤﺴﻮب ﻣﻲ ﺷﻮﻧﺪ و راﻫﻲ راﺣﺖ و ﭘﺮ ﻛﺎرﺑﺮد ﺑﺮاي دﺳﺘﺮﺳﻲ ﻛـﺎرﺑﺮ ﺑـﻪ ﺗﻤـﺎم ﻗـﺴﻤﺘﻬﺎي ﺑﺮﻧﺎﻣﻪ را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﺑﺮﻧﺎﻣﻪ ي وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺎ اﺳﺘﻔﺎده از ﻣﻨﻮ ﻫﺎ ،ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﻳـﻦ اﻣﻜـﺎن را ﻣـﻲ دﻫـﺪ ﻛـﻪ ﺑـﻪ راﺣﺘﻲ ﺑﻪ اﺑﺰارﻫﺎي اﻳﻦ ﻣﺤﻴﻂ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ و ﺑﺘﻮاﻧﺪ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ در ﻣﺤﻴﻂ ﻛﺪ ﻧﻮﻳﺴﻲ ﺑﺎ اﺳﺘﻔﺎده از ﻣﻨـﻮ ﻫـﺎي ﻓﺮﻋﻲ 1ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ اﻋﻤﺎﻟﻲ ﻣﺎﻧﻨﺪ ﻛﺎت ﻛﺮدن ،ﻛﭙﻲ ﻛﺮدن ،و ﻳﺎ ﺟﺴﺘﺠﻮ در ﺑﻴﻦ ﻛﺪ را اﻧﺠﺎم دﻫﻴﺪ. در اﻳﻦ ﻓﺼﻞ ﻧﺤﻮه اﻳﺠﺎد ﻣﻨﻮ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﮋوال C#را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد .در ﻃﻲ ﻓﺼﻞ ﻧﺤﻮه ي اﻳﺠـﺎد و ﻣـﺪﻳﺮﻳﺖ ﻣﻨـﻮ ﻫـﺎ و زﻳﺮﻣﻨﻮ ﻫﺎ و ﻫﻤﭽﻨﻴﻦ ﻧﺤﻮه اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .وﻳﮋوال 2005 C#دو ﻧﻮع ﻛﻨﺘﺮل ﺑﺮاي ﻛﺎر ﺑﺎ ﻣﻨﻮ ﻫﺎ در ﺟﻌﺒﻪ اﺑﺰار ﺧﻮد دارد ﻛﻪ در اﻳﻦ ﻓﺼﻞ ﻫﺮ دوي آﻧﻬﺎ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. در اﻳﻦ ﻓﺼﻞ:
ﺑﺎ ﻧﺤﻮه ي اﻳﺠﺎد ﻣﻨﻮ ﻫﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﺑﺎ ﻧﺤﻮه ي اﻳﺠﺎد زﻳﺮ ﻣﻨﻮ ﻫﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
درك وﻳﮋﮔﻴﻬﺎي ﻳﻚ ﻣﻨﻮ: ﻛﻨﺘﺮﻟﻲ ﻛﻪ در وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮاي اﻳﺠﺎد ﻣﻨﻮ در ﺑﺮﻧﺎﻣﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد MenuStrip ،ﻧﺎم دارد .اﻳـﻦ ﻛﻨﺘـﺮل داراي ﭼﻨﺪﻳﻦ وﻳﮋﮔﻲ ﻛﻠﻴﺪي اﺳﺖ .اوﻟﻴﻦ و ﻣﻬﻤﺘﺮﻳﻦ وﻳﮋﮔﻲ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳـﺮﻋﺖ و ﺑـﻪ راﺣﺘـﻲ ﻣﻨـﻮ ﻫـﺎ و زﻳﺮﻣﻨﻮ ﻫﺎي ﻣﻮرد ﻧﻴﺎز در ﺑﺮﻧﺎﻣﻪ را اﻳﺠﺎد ﻛﻨﻴﺪ. ﻣﻨﻮ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ ﻛﻨﺘﺮل اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ﻋﻼوه ﺑﺮ ﻣﺘﻨﻲ ﻛﻪ ﺑﺮاي ﻫﺮ ﻣﻨﻮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ،ﻣـﻲ ﺗﻮاﻧﻨـﺪ ﺷـﺎﻣﻞ ﺗـﺼﻮﻳﺮ ،ﻛﻠﻴـﺪ دﺳﺘﺮﺳﻲ ،ﺷﻮرت ﻛﺎت و ﻳﺎ ﺣﺘﻲ ﺑﻪ ﺻﻮرت ﮔﺰﻳﻨﻪ ي ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﺑﺎﺷﻨﺪ.
ﺗﺼﺎوﻳﺮ: ﺣﺘﻤﺎً ﺗﺎﻛﻨﻮن ﺗﺼﺎوﻳﺮ ﻛﻨﺎر ﻣﻨﻮ ﻫﺎ را در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي ﻣﺎﻧﻨﺪ Wordو ﻳﺎ ﺣﺘﻲ ﺧﻮد وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﺸﺎﻫﺪه ﻛﺮده اﻳﺪ .ﺗﺎ ﻗﺒﻞ از وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺑﺮاي ﻧﻤﺎﻳﺶ ﺗﺼﻮﻳﺮ در ﻛﻨﺎر ﻣﻨﻮ ﻫﺎي ﺧﻮد ﻳﺎ ﺑﺎﻳﺪ ﺣﺠﻢ زﻳﺎدي از ﻛﺪ را در ﺑﺮﻧﺎﻣﻪ وارد ﻛﺮده و ﻳـﺎ از ﻛﻨﺘﺮﻟﻬﺎي ﺷﺨﺺ-ﺛﺎﻟﺚ 2اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻧﺪ .اﻣﺎ در وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺑﺮاي ﻫﺮ ﮔﺰﻳﻨﻪ ي ﻣﻨﻮ ،ﻳﻚ ﺧﺎﺻـﻴﺖ Imageﻧﻴـﺰ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ وﺳﻴﻠﻪ آن ﺗﺼﻮﻳﺮي را ﻣﻌﻴﻦ ﻛﻨﻴﺪ ﺗﺎ در ﻛﻨﺎر ﻣﻨﻮ ﻧﻤﺎﻳﺶ داده ﺷﻮد.
1ﻣﻨﻮي ﻓﺮﻋﻲ ﻳﺎ Pop-Up Menuﻣﻨﻮﻳﻲ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ راﺳﺖ در ﻳﻚ ﻣﺤﺪوده ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. Third-Party Controls
2
٣٠١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻠﻴﺪﻫﺎي دﺳﺘﺮﺳﻲ: ﻳﻚ ﻛﻠﻴﺪ دﺳﺘﺮﺳﻲ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﺑﺎ ﻓﺸﺎر ﻛﻠﻴﺪ Altو آن ﻛﻠﻴﺪ در ﺻﻔﺤﻪ ﻛﻠﻴﺪ ،ﺑﻪ ﻣﻨﻮ دﺳﺘﺮﺳـﻲ ﭘﻴـﺪا ﻛﻨـﺪ .ﻛﻠﻴـﺪﻫﺎي دﺳﺘﺮﺳﻲ ﺑﺮاي ﻫﺮ ﻣﻨﻮ ﺑﻪ ﺻﻮرت ﻳﻚ ﺣﺮف ﻫﺴﺘﻨﺪ ﻛﻪ در ﻧﺎم ﻣﻨﻮ ﺑﺎ ﻳﻚ زﻳﺮ ﺧﻂ ﻣﺸﺨﺺ ﻣﻲ ﺷﻮﻧﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﻠﻴﺪ Altﻫﻤـﺮاه ﺑﺎ ﻛﻠﻴﺪ دﺳﺘﺮﺳﻲ ﻣﻨﻮ در ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻓﺸﺎر داده ﺷﺪ ،ﻣﻨﻮي ﻣﺮﺑﻮﻃﻪ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ وﺳﻴﻠﻪ ﻛﻠﻴﺪﻫﺎي ﻣﻜﺎن ﻧﻤﺎ ﺑﻴﻦ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮد.
ﺷﻮرت ﻛﺎت ﻫﺎ: ﺑﻪ وﺳﻴﻠﻪ ﺷﻮرت ﻛﺎت ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺪون اﻳﻨﻜﻪ ﻣﻨﻮي ﻣﻮرد ﻧﻈﺮ را ﻧﻤﺎﻳﺶ دﻫﻴﺪ ،ﮔﺰﻳﻨﻪ اي را از آن اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺷﻮرت ﻛـﺎت ﻫـﺎ ﺑـﻪ ﺻﻮرت ﺗﺮﻛﻴﺐ ﻳﻚ ﻛﻠﻴﺪ ﻛﻨﺘﺮﻟﻲ ﻫﻤﺮاه ﺑﺎ ﻳﻚ ﻛﻠﻴﺪ اﺻﻠﻲ اﺳﺖ ،ﻣﺎﻧﻨﺪ ﺷﻮرت ﻛﺎت Ctrl + Xﺑﺮاي ﻛﺎت ﻛﺮدن ﻳﻚ ﻣﺘﻦ.
ﻋﻼﻣﺖ ﺗﻴﻚ: ﻋﻼﻣﺖ ﺗﻴﻚ ،ﻋﻼﻣﺘﻲ اﺳﺖ ﻛﻪ در ﻛﻨﺎر ﺑﻌﻀﻲ از ﻣﻨﻮ ﻫﺎ ﺑﻪ ﺟﺎي ﻋﻜﺲ ﻗﺮار ﻣﻲ ﮔﻴﺮد و ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﻳﻦ ﮔﺰﻳﻨـﻪ ﻫـﻢ اﻛﻨـﻮن اﻧﺘﺨﺎب ﺷﺪه و ﻳﺎ در ﺣﺎل اﺳﺘﻔﺎده اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻣﻨﻮي Viewرا از وﻳﮋوال اﺳـﺘﻮدﻳﻮ اﻧﺘﺨـﺎب ﻛـﺮده و ﺳـﭙﺲ ﺑـﻪ زﻳـﺮ ﻣﻨـﻮي ToolBarsﺑﺮوﻳﺪ ،ﻧﺎم ﺗﻤﺎم ﻧﻮار اﺑﺰارﻫﺎي ﻣﻮﺟﻮد در وﻳﮋوال اﺳﺘﻮدﻳﻮ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﻛﻨﺎر ﺑﻌﻀﻲ از آﻧﻬﺎ ﻳـﻚ ﻋﻼﻣـﺖ ﺗﻴﻚ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ .وﺟﻮد اﻳﻦ ﻋﻼﻣﺖ در ﻛﻨﺎر ﻳﻚ ﮔﺰﻳﻨﻪ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻧﻮار اﺑﺰار ﻣﺮﺑﻮط ﺑﻪ آن ﮔﺰﻳﻨﻪ ﻫﻢ اﻛﻨﻮن در وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ. ﺷﻜﻞ 1-8وﻳﮋﮔﻲ ﻫﺎﻳﻲ ﻛﻪ ﻳﻚ ﻣﻨﻮ ﻣﻲ ﺗﻮاﻧﺪ داﺷﺘﻪ ﺑﺎﺷﺪ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﻣﻨﻮي ﻧﻤﻮﻧﻪ ﻋـﻼوه ﺑﺮ ﺗﻤﺎم وﻳﮋﮔﻴﻬﺎﻳﻲ ﻛﻪ ذﻛﺮ ﻛﺮدﻳﻢ ﻳﻚ ﻣﻨﻮي ﺟﺪا ﻛﻨﻨﺪه ﻧﻴﺰ دارد .ﻳﻚ ﻣﻨﻮي ﺟﺪا ﻛﻨﻨﺪه ﺑﻪ ﺻﻮرت ﻳﻚ ﺧﻂ اﻓﻘﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﺑﺮاي دﺳﺘﻪ ﺑﻨﺪي ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ در ﻣﻨﻮ ﺑﻪ ﻛﺎر ﻣﻲ رود.
ﺷﻜﻞ 1-8
٣٠٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 1-8ﻣﻨﻮي ﺑﺮﻧﺎﻣﻪ را در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .اﻳﻦ ﻣﻨﻮ در زﻣﺎن ﻃﺮاﺣﻲ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 2-8ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻜﻞ 2-8 در ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﻛﻨﺘﺮل MenuStripاوﻟﻴﻦ ﻧﻜﺘﻪ اي ﻛﻪ ﺟﻠﺐ ﺗﻮﺟﻪ ﻣﻲ ﻛﻨﺪ ،اﻳﻦ اﺳﺖ ﻛﻪ ﻋﻼوه ﺑﺮ ﻣﻨﻮ ﻫﺎي اﻳﺠﺎد ﺷﺪه در اﻳﻦ ﻛﻨﺘﺮل ،ﻣﻨﻮﻳﻲ ﻫﻢ وﺟﻮد دارد ﻛﻪ ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﮔﺰﻳﻨﻪ ي ﺟﺪﻳﺪ ﺑﻪ ﻣﻨﻮ و ﻳﺎ زﻳﺮ ﻣﻨﻮ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﻫﺮ زﻣﺎن ﻛﻪ ﺑﺎ اﺳـﺘﻔﺎده از اﻳﻦ ﮔﺰﻳﻨﻪ در ﻛﻨﺘﺮل MenuStripﻳﻚ ﻣﻨﻮي ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﻨﻴﺪ ،ﮔﺰﻳﻨﻪ دﻳﮕﺮي ﻣﺸﺎﺑﻪ ﻗﺒﻠﻲ در اﻳﻦ ﻗﺴﻤﺖ اﻳﺠﺎد ﺧﻮاﻫﺪ ﺷﺪ.
ﭘﻨﺠﺮه :Properties ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﻨﻮ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﺮدﻳﺪ و در ﺣﺎل ﺗﻐﻴﻴﺮ وﻳﮋﮔﻲ ﻫﺎي آن ﺑﻮدﻳﺪ ،ﭘﻨﺠﺮه Proipertiesﺧﺎﺻـﻴﺘﻬﺎي آن ﻣﻨﻮ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﻣﺎﻧﻨﺪ ﻫﺮ ﻛﻨﺘﺮل دﻳﮕﺮي ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .ﺷﻜﻞ 3-8ﭘﻨﺠﺮه Propertiesرا ﺑﺮاي ﻳﻚ ﻛﻨﺘﺮل ﻣﻨﻮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. در ﻃﺮاﺣﻲ ﻣﻨﻮ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﻤﻮاره ﺑﺎﻳﺪ در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﻨﻮي ﺑﺮﻧﺎﻣﻪ ﺧﻮد را ﻫﻤﺎﻧﻨﺪ ﻣﻨﻮي دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫـﺎي وﻳﻨـﺪوزي اﻳﺠـﺎد ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻣﻨﻮ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻣﺎﻧﻨﺪ وﻳﮋوال اﺳﺘﻮدﻳﻮ Word ،و ﻳﺎ Outlookﺗﻮﺟـﻪ ﻛﻨﻴـﺪ .در ﺗﻤـﺎم اﻳـﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻨﻮﻳﻲ ﺑﻪ ﻧﺎم Fileوﺟﻮد دارد و ﮔﺰﻳﻨﻪ اي ﺑﻪ ﻧﺎم Exitدر اﻳﻦ ﻣﻨﻮ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮان از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﺪ. ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ در ﺑﺮﻧﺎﻣﻪ ﺧﻮد از ﻣﻨﻮ اﺳﺘﻔﺎده ﻛﺮدﻳﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﻣﻨﻮﻳﻲ ﺑﻪ ﻧﺎم ﻓﺎﻳﻞ اﻳﺠـﺎد ﻛـﺮده و ﺣـﺪاﻗﻞ ﮔﺰﻳﻨـﻪ Exitرا در آن ﻗـﺮار دﻫﻴﺪ .اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﻋﻤﻠﻴﺎﺗﻲ ﻣﺎﻧﻨﺪ ﻛﺎت ﻛﺮدن و ﻳﺎ ﻛﭙﻲ ﻛـﺮدن را اﻧﺠـﺎم دﻫـﺪ ،ﺑﻬﺘـﺮ اﺳـﺖ ﻣﻨـﻮﻳﻲ ﺑـﻪ ﻧـﺎم Editاﻳﺠﺎد ﻛﺮده و اﻳﻦ ﮔﺰﻳﻨﻪ ﻫﺎ را در آن ﻗﺮار دﻫﻴﺪ. ﻧﻜﺘﻪ :در ﻛﺘﺎﺑﺨﺎﻧﻪ MSDNﻛﻪ ﻫﻤﺮاه ﺑﺎ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﻧﺼﺐ ﻣـﻲ ﺷـﻮد ،ﺑﺨـﺸﻲ ﺑـﻪ ﻧـﺎم User Interface Design and Developmentوﺟﻮد دارد ﻛﻪ ﻣﺴﺎﺋﻞ ﺑﺴﻴﺎري را راﺟﻊ ﺑﻪ ﻃﺮاﺣﻲ راﺑﻂ ﻛﺎرﺑﺮي اﺳﺘﺎﻧﺪارد ﺑﺮاي ﺑﺮﻧﺎﻣـﻪ ﻫﺎي وﻳﻨﺪوزي ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي اﻃﻼع در ﻣﻮرد ﭼﮕﻮﻧﮕﻲ ﻃﺮاﺣﻲ اﺳﺘﺎﻧﺪارد راﺑﻄﻬﺎي ﻛﺎرﺑﺮي ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ آن ﺑﺨﺶ ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ. دﻟﻴﻞ اﻳﻨﻜﻪ ﻣﻨﻮ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﻫﻤﺎﻧﻨﺪ ﻣﻨﻮ ﻫﺎي دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي ﺑﺎﺷﺪ در اﻳﻦ اﺳﺖ ﻛﻪ ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﺎرﺑﺮان ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﺑﺮﻧﺎﻣﻪ اﺣﺴﺎس راﺣﺘﻲ ﺑﻴﺸﺘﺮي ﻣﻲ ﻛﻨﻨﺪ و ﻣﻲ ﺗﻮاﻧﻨﺪ از آﺷﻨﺎﻳﻲ ﻗﺒﻠﻲ ﺧﻮد ﺑﺎ ﻣﻨﻮ ﻫﺎي دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ،در ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻨﺪ و ﻧﻴﺎزي ﻧﺪارﻧﺪ ﻛﻪ ﻋﻤﻠﻜﺮد ﺗﻤﺎﻣﻲ ﻣﻨﻮ ﻫﺎ را از اﺑﺘﺪا ﻳﺎد ﺑﮕﻴﺮﻧﺪ .اﻟﺒﺘﻪ ﻫﻤﻮاره در ﻣﻨﻮي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﮔﺰﻳﻨﻪ ﻫﺎﻳﻲ وﺟﻮد دارﻧـﺪ ﻛـﻪ در ﺑﺮﻧﺎﻣـﻪ
٣٠٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﺎي دﻳﮕﺮ ﻧﻴﺴﺘﻨﺪ .در ﻣﻮرد اﻳﻦ ﮔﺰﻳﻨﻪ ﻫﺎ ﻣﻴﺘﻮاﻧﻴﺪ آﻧﻬﺎ را در ﭼﻨﺪ ﻣﻨﻮي ﺧﺎص در ﺑﻴﻦ ﻣﻨﻮ ﻫﺎ ﻗﺮار دﻫﻴﺪ .اﻣـﺎ ﻫﻤـﻮاره ﻗـﺮار دادن ﮔﺰﻳﻨـﻪ ﻫﺎي ﻋﻤﻮﻣﻲ در ﻗﺴﻤﺘﻬﺎي ﺛﺎﺑﺖ ﻳﻚ ﻣﻨﻮ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮ زودﺗﺮ ﺑﺎ ﻧﺤﻮه ﻛﺎرﻛﺮد ﺑﺮﻧﺎﻣﻪ آﺷﻨﺎ ﺷﻮد.
ﺷﻜﻞ 3-8
اﻳﺠﺎد ﻣﻨﻮ ﻫﺎ: ﺣﺎل ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﺒﻴﻨﻴﻢ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻨﻮ اﻳﺠﺎد ﻛﺮد .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺮﻧﺎﻣﻪ اي اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛـﺮد ﻛـﻪ ﺷﺎﻣﻞ ﻳﻚ ﻧﻮار ﻣﻨﻮ ،دو ﻧﻮار اﺑﺰار و دو TextBoxﺑﺎﺷﺪ .ﻧﻮار ﻣﻨـﻮ ﺷـﺎﻣﻞ ﻣﻨـﻮ ﻫـﺎي Tools ،View ،Edit ،Fileو Helpو ﭼﻨﺪﻳﻦ ﮔﺰﻳﻨﻪ و زﻳﺮ ﻣﻨﻮ در ﻫﺮ ﻳﻚ از آﻧﻬﺎ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻤـﺎم وﻳﮋﮔـﻲ ﻫـﺎي ﻣﻨـﻮ ﻫـﺎ را در ﺑﺮﻧﺎﻣـﻪ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﭼﻨﺪ ﺑﺨﺶ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ ،ﻧﻮﺷﺘﻦ آن را ﻧﻴﺰ ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ ﺗﻘﺴﻴﻢ ﻣﻲ ﻛﻨﻴﻢ و در ﻗﺴﻤﺖ اول ﺑﻪ ﻃﺮاﺣﻲ ﻣﻨﻮ ﻫﺎ ﻣﻲ ﭘﺮدازﻳﻢ.
ﻃﺮاﺣﻲ ﻣﻨﻮ ﻫﺎ:
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻣﻨﻮ ﻫﺎ
٣٠٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را اﺟﺮا ﻛﺮده و ﮔﺰﻳﻨﻪ … File New Projectرا از ﻧﻮار ﻣﻨﻮ اﻧﺘﺨﺎب ﻛﻨﻴـﺪ. در ﻛـﺎدر New Projectﮔﺰﻳﻨـﻪ Windows Applicationرا از ﻗـﺴﻤﺖ Templates اﻧﺘﺨﺎب ﻛﺮده و در ﻛﺎدر Nameﮔﺰﻳﻨﻪ Menusرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﺮوژه ﺟﺪﻳﺪ اﻳﺠﺎد ﺷﻮد. (2در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ،روي ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﺮده و ﺧﺎﺻﻴﺘﻬﺎي آن را ﻣﻄﺎﺑﻖ ﻟﻴﺴﺖ زﻳﺮ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ:
ﺧﺎﺻﻴﺖ Sizeرا ﺑﺮاﺑﺮ ﺑﺎ 300;168ﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ StartPositionرا ﺑﺮاﺑﺮ ﺑﺎ CenterScreenﻗﺮار دﻫﻴﺪ. ﺧﺎﺻﻴﺖ Textرا ﺑﺮاﺑﺮ ﺑﺎ Menu Demoﻗﺮار دﻫﻴﺪ.
(3ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻳﻚ ﻛﻨﺘﺮل MenuStripرا در ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ در ﺑـﺎﻻي ﻓﺮم ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ .ﻋﻼوه ﺑﺮ ﻛﻨﺘﺮﻟﻲ ﻛﻪ در ﺑﺎﻻي ﻓﺮم ﻗﺮار داده ﻣﻲ ﺷﻮد ،ﻛﻨﺘﺮﻟﻲ ﻫﻢ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮﻟﻬﺎي ﻛﺎدر ﻣﺤﺎوره اي ﻛﻪ در ﻓﺼﻞ ﻫﻔﺘﻢ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﺑﻪ ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد. (4در ﻗﺴﻤﺖ ﭘـﺎﻳﻴﻦ ﻃﺮاﺣـﻲ روي ﻛﻨﺘـﺮل menuStrip1ﻛﻠﻴـﻚ راﺳـﺖ ﻛﻨﻴـﺪ و از ﻣﻨـﻮي ﻓﺮﻋـﻲ ﺑـﺎز ﺷـﺪه ﮔﺰﻳﻨـﻪ Insert Standard Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻳﻚ ﻣﻨﻮي اﺳﺘﺎﻧﺪارد در ﻧﻮار ﻣﻨﻮي ﺑﺎﻻي ﻓﺮم ﻗﺮار ﺑﮕﻴﺮد. (5ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 4-8ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻳﻚ ﻗﺴﻤﺖ ﺳﻔﻴﺪ رﻧﮓ در ﺳﻤﺖ راﺳﺖ ﻣﻨﻮي Helpوﺟـﻮد دارد ﻛـﻪ ﺑـﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻨﻮ ﻫﺎي ﺟﺪﻳﺪ را اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﺮاي اﻳﺠﺎد ﻣﻨﻮي ﺟﺪﻳﺪ ﻋﻼوه ﺑﺮ اﺳﺘﻔﺎده از اﻳﻦ ﻗـﺴﻤﺖ ،ﻣـﻲ ﺗﻮاﻧﻴـﺪ از ﭘﻨﺠﺮه Items Collection Editorﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﺷﻜﻞ 4-8 ﻧﻮار ﻣﻨﻮي ﺑـﺎﻻي ﺻـﻔﺤﻪ را اﻧﺘﺨـﺎب ﻛـﺮده و ﺳـﭙﺲ در ﭘﻨﺠـﺮه Propertiesروي دﻛﻤـﻪ … در ﻣﻘﺎﺑـﻞ ﮔﺰﻳﻨـﻪ Itemsﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﺎدر Items Collection Editorﻧﻤﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد .در اﻳﻦ ﻛﺎدر روي دﻛﻤﻪ ﻓﺮﻣﺎن Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻳﻚ ﻣﻨﻮي ﺟﺪﻳﺪ ﺑﻪ ﻧﻮار ﻣﻨﻮ اﺿﺎﻓﻪ ﺷﻮد. ﺑﺮاي اﻳﻨﻜﻪ ﻧﺎم ﻣﻨﻮي ﺟﺪﻳﺪ ﺑﺎ ﻧﺎم ﻣﻨﻮ ﻫﺎﻳﻲ ﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﺑﻪ ﻧﻮار ﻣﻨﻮ اﺿـﺎﻓﻪ ﻛـﺮدﻳﻢ ﻫﻤﺎﻫﻨـﮓ ﺑﺎﺷـﺪ ،ﻧـﺎم آن را ﺑـﻪ viewToolStripMenuItemﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺣﺎل ﺧﺎﺻﻴﺖ Textﻣﻨﻮي ﺟﺪﻳﺪ را ﺑﻪ &Viewﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻛﺎراﻛﺘﺮ & ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻛﻠﻴﺪ دﺳﺘﺮﺳـﻲ ﺑـﻪ ﻳـﻚ ﻣﻨﻮ ﺑﻪ ﻛﺎر ﻣﻲ رود .اﻳﻦ ﻛﺎراﻛﺘﺮ ﻗﺒﻞ از ﻫﺮ ﺣﺮﻓﻲ ﻛﻪ ﻗﺮار ﺑﮕﻴﺮد ،ﻣﻲ ﺗﻮان ﺑﺎ ﺗﺮﻛﻴﺐ آن ﺣﺮف ﺑـﺎ ﻛﻠﻴـﺪ Altﺑـﻪ آن ﻣﻨـﻮ دﺳﺘﺮﺳﻲ داﺷﺖ .در ﻣﻨﻮﻳﻲ ﻛﻪ اﻳﺠﺎد ﻛﺮدﻳﻢ ﻛﺎراﻛﺘﺮ & ﻗﺒﻞ از ﺣﺮف Vﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ،ﺑﻨـﺎﺑﺮاﻳﻦ در ﻃـﻮل اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ ﻛﺎرﺑﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ ﻣﻨﻮ ﻣﻲ ﺗﻮاﻧﺪ از ﺗﺮﻛﻴﺐ ﻛﻠﻴﺪﻫﺎي Alt + Vاﺳﺘﻔﺎده ﻛﻨﺪ.
٣٠٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(6
(7
(8
(9
ﺣﺎل ﺑﺎﻳﺪ ﻣﻨﻮي ﺟﺪﻳﺪ را ﺑﻴﻦ ﻣﻨﻮ ﻫﺎي Editو Toolsﻗﺮار دﻫﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻨﻮي Viewرا در ﻟﻴﺴﺖ ﻣﻨﻮ ﻫﺎ اﻧﺘﺨﺎب ﻛﺮده و روي ﻓﻠﺶ ﺑﻪ ﺳﻤﺖ ﺑﺎﻻ در ﺳﻤﺖ راﺳﺖ ﻟﻴﺴﺖ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﻨﻮي Viewدر ﻣﻜﺎن درﺳـﺖ ﺧـﻮد ﻗـﺮار ﺑﮕﻴﺮد. ﺣﺎل از ﺑﻴﻦ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻨﻮي Viewﺧﺎﺻﻴﺖ DropDownItemsرا اﻧﺘﺨﺎب ﻛﺮده و روي دﻛﻤﻪ ي … در ﻣﻘﺎﺑﻞ آن ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﭘﻨﺠﺮه دﻳﮕﺮي ﻣﺸﺎﺑﻪ ﭘﻨﺠﺮه Items Collection Editorﺑﺎز ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ وﺳـﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ ،ﻣﻨﻮ ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺗﺤﺖ ﻣﻨﻮي Viewﻗﺮار ﮔﻴﺮﻧﺪ را اﻳﺠﺎد ﻛﻨﻴﺪ. در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ ﻳﻚ ﻣﻨﻮ ﺗﺤﺖ ﻣﻨﻮي Viewﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷـﻮد و آن ﻫـﻢ ﻣﻨـﻮي ToolBarsﺧﻮاﻫـﺪ ﺑـﻮد. ﺑﻨـﺎﺑﺮاﻳﻦ در ﭘﻨﺠـﺮه Items Collection Editorدوم ،روي دﻛﻤـﻪ Addﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻣﻨـﻮي دﻳﮕﺮي اﺿﺎﻓﻪ ﺷﻮد. ﻣﺠﺪدا ﺑﺮاي ﺳﺎزﮔﺎري ﻧﺎم ﻣﻨﻮي ﺟﺪﻳﺪ ﺑﺎ دﻳﮕﺮ ﻣﻨﻮ ﻫﺎ ،ﻧـﺎم آن را ﺑـﻪ toolbarToolStripMenuItem ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺧﺎﺻﻴﺖ Textاﻳﻦ ﻣﻨﻮ را ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ &Toolbarsﻗﺮار دﻫﻴﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ دو زﻳﺮ ﻣﻨﻮ ﺑﻪ ﻣﻨﻮي Toolbarsاﺿﺎﻓﻪ ﻛﻨﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﺧﺎﺻﻴﺖ DropDownItemsرا در ﺑﻴﻦ ﺧﺎﺻﻴﺘﻬﺎي ﻣﻨﻮي Toolbarsاﻧﺘﺨﺎب ﻛﺮده و روي دﻛﻤﻪ … ﻣﻘﺎﺑﻞ آن ﻛﻠﻴﻚ ﻛﻨﻴﺪ. ﭘﻨﺠﺮه Items Collection Editorدﻳﮕﺮي ﺑﺎز ﺧﻮاﻫﺪ ﺷﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ زﻳﺮ ﻣﻨﻮ ﻫـﺎي ﻣﺮﺑﻮط ﺑﻪ ﻣﻨﻮي Toolbarsرا اﻳﺠﺎد ﻛﻨﻴﺪ .در اﻳﻦ ﭘﻨﺠﺮه روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻳﻚ ﻣﻨﻮي ﺟﺪﻳـﺪ اﻳﺠـﺎد ﺷﻮد .ﻧﺎم اﻳﻦ ﻣﻨﻮ را ﺑﺮاﺑﺮ ﺑﺎ mainToolStripMenuItemو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑـﺮ ﺑـﺎ &Main ﻗﺮار دﻫﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﻣﻲ ﺷﻮد ،ﻧﻮار اﺑﺰار Mainﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﻨﺎر اﻳﻦ ﻣﻨﻮ ﺑﺎﻳﺪ ﻋﻼﻣﺘﻲ ﻗﺮار ﺑﮕﻴﺮد ﺗﺎ ﻣﺸﺨﺺ ﻛﻨﺪ ﻛﻪ اﻳﻦ ﻧﻮار اﺑﺰار در ﺣﺎل ﺣﺎﺿﺮ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ .ﺧﺎﺻـﻴﺖ Checkedاﻳـﻦ ﻣﻨﻮ را ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ ﺗﺎ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻳﻚ ﻋﻼﻣﺖ ﺗﻴﻚ در ﻛﻨﺎر آن ﻗـﺮار ﺑﮕﻴـﺮد .ﻫﻤﭽﻨـﻴﻦ ﺧﺎﺻـﻴﺖ CheckOnClickاﻳﻦ ﻣﻨﻮ را ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ ﺗﺎ ﺑﺎ ﻛﻠﻴﻚ ﻛﺎرﺑﺮ روي اﻳﻦ ﻣﻨﻮ ،ﻋﻼﻣﺖ ﺗﻴﻚ ﻛﻨﺎر آن ﺑﺮداﺷﺘﻪ ﺷﻮد و ﻳﺎ ﻗﺮار داده ﺷﻮد. زﻳﺮ ﻣﻨﻮي دﻳﮕﺮي ﻛﻪ ﺑﺎﻳﺪ در اﻳﻦ ﻗﺴﻤﺖ اﺿﺎﻓﻪ ﻛﻨﻴﻢ ،زﻳﺮ ﻣﻨﻮي Formattingاﺳـﺖ .روي دﻛﻤـﻪ Addﻛﻠﻴـﻚ ﻛﻨﻴـــﺪ ﺗـــﺎ زﻳـــﺮ ﻣﻨـــﻮي ﺟﺪﻳـــﺪي ﺑـــﻪ اﻳـــﻦ ﻗـــﺴﻤﺖ اﺿـــﺎﻓﻪ ﺷـــﻮد .ﺳـــﭙﺲ ﺧﺎﺻـــﻴﺖ Nameآن را ﺑـــﻪ formattingToolStripMenuItemو ﺧﺎﺻــﻴﺖ Textآن را ﺑﺮاﺑــﺮ ﺑــﺎ &Formatting ﻗﺮار دﻫﻴﺪ. ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ اﻳﻦ زﻳﺮ ﻣﻨﻮ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻧﻤﺎﻳﺶ داده ﻧﻤﻲ ﺷﻮد ،ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛـﻪ ﺧﺎﺻـﻴﺖ Checkedآن را ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ .اﻣﺎ ﺑﺎﻳﺪ ﺧﺎﺻﻴﺖ CheckedOnClickرا ﺑﺮاﺑﺮ ﺑﺎ Trueﻗﺮار دﻫﻴﺪ ﺗﺎ در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ روي اﻳﻦ ﮔﺰﻳﻨﻪ ﻛﻠﻴﻚ ﻛﺮد ،ﻋﻼﻣﺖ ﺗﻴﻚ در ﻛﻨﺎر آن ﻧﻤﺎﻳﺶ داده ﺷﺪه و ﻳﺎ از ﻛﻨﺎر آن ﺑﺮداﺷﺘﻪ ﺷﻮد. روي دﻛﻤﻪ OKدر ﺗﻤﺎم ﻛﺎدرﻫﺎي Items Collection Editorﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺗﻤﺎم آﻧﻬﺎ ﺑﺴﺘﻪ ﺷﻮﻧﺪ. ﺣﺎل اﮔﺮ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و در ﻣﻨﻮي Viewروي ﮔﺰﻳﻨﻪ Toolbarsﻛﻠﻴﻚ ﻛﻨﻴﺪ ،زﻳﺮ ﻣﻨﻮﻳﻲ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 5-8 ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005ﺗﻤﺎم ﺳﻌﻲ ﺧﻮد را ﻛﺮده اﺳﺖ ﺗﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ را از اﻧﺠﺎم ﻛﺎرﻫﺎي ﺗﻜﺮاري و ﺧﺴﺘﻪ ﻛﻨﻨﺪه رﻫﺎ ﻛﻨﺪ .ﻳﻜـﻲ از اﻳـﻦ ﻣﻮارد اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي اﺳﺘﺎﻧﺪاردي اﺳﺖ ﻛﻪ در ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻳﺎﻓـﺖ ﻣـﻲ ﺷـﻮد .ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﻣـﺸﺎﻫﺪه ﻛﺮدﻳـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﮔﺰﻳﻨـﻪ
٣٠٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Insert Standard Itemsﻣﻨﻮ ﻫﺎﻳﻲ ﻛﻪ در ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ﺑﺎ ﺟﺰﺋﻴﺎت ﻛﺎﻣﻞ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻤﺮﻛﺰ ﺑﻴﺸﺘﺮي روي ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺨﺼﻮص ﺑﺮﻧﺎﻣﻪ ﺧﻮد داﺷﺘﻪ ﺑﺎﺷﻴﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺟﺰ ﻣﻨﻮ ﻫﺎي اﺳﺘﺎﻧﺪارد ،ﻓﻘﻂ ﻛﺎﻓﻲ اﺳﺖ ﻣﻨﻮي Viewرا ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﻢ ﻛﻪ اﻳﻦ ﻣﻨﻮ ﺧﻮد ﻧﻴﺰ ﺷﺎﻣﻞ ﻣﻨﻮي Toolbarsو زﻳﺮﻣﻨﻮ ﻫـﺎي Mainو Formattingاﺳﺖ.
ﺷﻜﻞ 5-8
اﺿﺎﻓﻪ ﻛﺮدن ﻧﻮار اﺑﺰارﻫﺎ و ﻛﻨﺘﺮل ﻫﺎ: ﺣﺎل ﻛﻪ ﻣﻨﻮ ﻫﺎي ﻣﻮرد ﻧﻴﺎز در ﺑﺮﻧﺎﻣﻪ را اﻳﺠﺎد ﻛﺮدﻳﻢ ،ﺑﻪ ﺳﺮاغ ﻧﻮار اﺑﺰارﻫﺎ و دﻛﻤﻪ ﻫﺎي آن ﻣﻲ روﻳﻢ .ﻣﻨﻮ ﻫـﺎﻳﻲ ﻛـﻪ در ﺑﺨـﺶ ﻗﺒﻠـﻲ اﻳﺠﺎد ﻛﺮدﻳﻢ ،ﻧﻤﺎﻳﺶ داده ﺷﺪن و ﻳﺎ ﻧﺸﺪن اﻳﻦ ﻧﻮار اﺑﺰارﻫﺎ را ﻛﻨﺘﺮل ﺧﻮاﻫﻨﺪ ﻛﺮد .ﻫﻤﭽﻨﻴﻦ دو TextBoxﻧﻴـﺰ ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﺧﻮاﻫﻴﻢ ﻛﺮد ﺗﺎ ﺑﻪ وﺳﻴﻠﻪ دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻧﻮار اﺑﺰار و ﻳﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ ﻫﺎ ﺑﺘﻮاﻧﻴﻢ ﻣﺘﻦ داﺧﻞ ﻳﻜﻲ از آن را ﻛﺎت و ﻳﺎ ﻛﭙﻲ ﻛـﺮده و در دﻳﮕﺮي ﻗﺮار دﻫﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﻧﻮار اﺑﺰارﻫﺎ و ﻛﻨﺘﺮل ﻫﺎ (1در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ دو ﻧﻮار اﺑﺰار ﻧﻴﺎز دارﻳﺪ .اﺑﺘﺪا ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ﻳﻚ ﻛﻨﺘﺮل ToolStripﺑﺮ روي ﻓﺮم ﻗﺮار دﻫﻴﺪ. ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ در ﻗﺴﻤﺖ ﺑﺎﻻي ﻓﺮم ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺧﺎﺻﻴﺖ Nameاﻳﻦ ﻧﻮار اﺑـﺰار را ﺑﻪ tspFormattingﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ اﻳﻦ ﻧﻮار اﺑﺰار ﺑﻪ ﻃـﻮر ﭘـﻴﺶ ﻓـﺮض در ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﺧﺎﺻﻴﺖ Visibleآن را ﺑﺮاﺑﺮ falseﻗﺮار دﻫﻴﺪ. (2در اﻳﻦ ﻧﻮار اﺑﺰار ﺑﻪ ﺳﻪ دﻛﻤﻪ ﻧﻴﺎز دارﻳﻢ .ﺑﻨﺎﺑﺮاﻳﻦ در ﺑﻴﻦ ﺧﺼﻮﺻﻴﺎت آن ،ﮔﺰﻳﻨﻪ Itemsرا اﻧﺘﺨﺎب ﻛﺮده و روي دﻛﻤﻪ ي … ﻣﻘﺎﺑﻞ آن ﻛﻠﻴﻚ ﻛﻨﻴﺪ. در ﭘﻨﺠــﺮه Items Collection Editorروي دﻛﻤــﻪ ي Addﻛﻠﻴــﻚ ﻛﻨﻴــﺪ ﺗــﺎ ﻳــﻚ ﻛﻨﺘــﺮل Buttonﺑﻪ اﻳﻦ ﻧﻮار اﺑﺰار اﺿﺎﻓﻪ ﺷﻮد .ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺖ ﻧﺎم و دﻳﮕﺮ ﺧﺎﺻﻴﺘﻬﺎي اﻳﻦ ﻛﻨﺘﺮل را ﺗﻐﻴﻴﺮ ﻧﺪﻫﻴﺪ ،زﻳـﺮا ﻧﻤـﻲ ﺧﻮاﻫﻴﺪ از آن در ﻛﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺗﻨﻬﺎ ﺧﺎﺻﻴﺖ DisplayStyleآن را ﺑﺮاﺑـﺮ ﺑـﺎ Imageﻗـﺮار داده و ﺳـﭙﺲ روي دﻛﻤﻪ … در ﻣﻘﺎﺑﻞ ﺧﺎﺻﻴﺖ Imageﻛﻠﻴﻚ ﻛﻨﻴﺪ. در ﭘﻨﺠﺮه Select Resourceروي دﻛﻤﻪ Importsﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﺑﻪ آدرس زﻳﺮ ﺑﺮوﻳﺪ: \C:\Program Files\Microsoft Visual Studio 8\Common7 ٣٠٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3
(4
(5 (6
(7 (8
\VS2005ImageLibrary\Bitmaps\Commands\highColor در اﻳﻦ ﻓﻮﻟﺪر ،ﻓﺎﻳـﻞ AlignTableCellMiddleLeftJustHS.bmpرا اﻧﺘﺨـﺎب ﻛـﺮده و روي دﻛﻤﻪ Openﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺳﭙﺲ در ﭘﻨﺠﺮه Select Resourceروي OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﺴﺘﻪ ﺷﻮد. در ﭘﻨﺠـﺮه Items Collection Editorﺑـﺎر دﻳﮕـﺮ روي دﻛﻤـﻪ Addﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻛﻨﺘـﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻧﻮار اﺑﺰار اﺿﺎﻓﻪ ﺷﻮد .ﺧﺎﺻـﻴﺖ DisplayStyleآن را ﺑﺮاﺑـﺮ ﺑـﺎ Imageﻗـﺮار داده و ﺳــﭙﺲ ﻓﺎﻳــﻞ AlignTableCellMiddleCenterHS.bmpاز آدرس ﻗﺒﻠــﻲ را ﺑــﺮاي ﺧﺎﺻــﻴﺖ Imageآن ﻣﺸﺨﺺ ﻛﻨﻴﺪ. ﻛﻨﺘﺮل Buttonدﻳﮕﺮي ﺑﻪ ﻧﻮار اﺑﺰار اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻﻴﺖ DisplayStyleآن را ﺑﺮاﺑـﺮ ﺑـﺎ Imageﻗـﺮار دﻫﻴﺪ .ﺑﺮاي اﻳﻦ دﻛﻤـﻪ ،ﻓﺎﻳـﻞ AlignTableCellMiddleRightHS.bmpرا ﺑـﻪ ﻋﻨـﻮان ﺗـﺼﻮﻳﺮ ﻣﺸﺨﺺ ﻛﻨﻴﺪ. در ﭘﻨﺠﺮه Items Collection Editorروي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﺴﺘﻪ ﺷﻮد. ﺣﺎل ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻧﻮار اﺑﺰار دوم را ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﺮده و ﺧﺎﺻـﻴﺖ Nameآن را ﺑﺮاﺑـﺮ ﺑـﺎ tspMainﻗـﺮار دﻫﻴﺪ .اﻳﻦ ﻧﻮار اﺑﺰار ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻧﻮار اﺑﺰار ﻗﺒﻠﻲ در ﺑﺎﻻي ﻓﺮم ﻗﺮار ﻣﻲ ﮔﻴﺮد .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ اﻳﻦ ﻧـﻮار اﺑـﺰار ﺷـﺎﻣﻞ دﻛﻤﻪ ﻫﺎي اﺳﺘﺎﻧﺪار ﺑﺎﺷﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ روي ﻛﻨﺘﺮل tspMainدر ﭘﺎﻳﻴﻦ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﻛﻠﻴﻚ راﺳﺖ ﻛﺮده و از ﻣﻨـﻮي ﻓﺮﻋﻲ ﻛﻪ ﺑﺎز ﻣﻲ ﺷﻮد ﮔﺰﻳﻨﻪ Insert Standard Itemsرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. ﻳﻚ ﻛﻨﺘﺮل Panelاز ﺟﻌﺒﻪ اﺑﺰار روي ﻓﺮم ﻗﺮار داده و ﺧﺎﺻﻴﺖ Dockآن را ﺑﺮاﺑﺮ ﺑﺎ Fillﻗﺮار دﻫﻴﺪ ﺗﺎ ﺗﻤﺎم ﻓـﺮم را درﺑﺮ ﮔﻴﺮد. دو ﻛﻨﺘﺮل TextBoxروي ﻓﺮم ﻗﺮار دﻫﻴﺪ و ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﺧﺎﺻﻴﺘﻬﺎي آن را ﺗﻐﻴـﺮي ﻧﺪﻫﻴـﺪ .ﻣﻜـﺎن و اﻧـﺪازه اﻳـﻦ ﻛﻨﺘﺮل ﻫﺎ ﻣﻬﻢ ﻧﻴﺴﺘﻨﺪ ،اﻣﺎ ﺑﺎﻳﺪ ﺑﻪ اﻧﺪازه ﻛﺎﻓﻲ ﺑﺰرگ ﺑﺎﺷﻨﺪ ﺗﺎ ﺑﺘﻮاﻧﻴﺪ ﻣﺘﻨﻲ را در آن ﺑﻨﻮﻳﺴﻴﺪ .ﻓﺮم ﻛﺎﻣـﻞ ﺷـﺪه ﺑﺮﻧﺎﻣـﻪ ﺑﺎﻳـﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 6-8ﺑﺎﺷﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻓﺮم ﻧﻮار اﺑﺰار دوم ﻣﺸﺎﻫﺪه ﻧﻤﻲ ﺷﻮد ،زﻳﺮا ﺧﺎﺻﻴﺖ Visibleآن ﺑﺮاﺑـﺮ ﺑﺎ falseﻗﺮار داده ﺷﺪه اﺳﺖ.
ﺷﻜﻞ 6-8
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺎ ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل ToolStripدر ﻓﺼﻞ ﺷﺸﻢ آﺷﻨﺎ ﺷﺪﻳﺪ ،ﺑﺮاي ﻣﻄﺎﻟﻌﻪ ي ﻣﺠﺪد آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ ي Text Editorرا ﻛﻪ در آن ﻓﺼﻞ ﺗﻤﺮﻳﻦ ﻛﺮدﻳﻢ ﻣﺸﺎﻫﺪه ﻛﻨﻴـﺪ .ﻛﻨﺘـﺮل ToolStripﻧﻴـﺰ ﻫﻤﺎﻧﻨـﺪ ﻛﻨﺘـﺮل MenuStrip داراي ﮔﺰﻳﻨﻪ Insert Standard Itemsاﺳﺖ ﻛﻪ ﺑﺎ ﻗﺮار دادن دﻛﻤﻪ ﻫﺎي ﻋﻤﻮﻣﻲ در ﻧـﻮار اﺑـﺰار ،ﺣﺠـﻢ زﻳـﺎدي از ﻛﺎرﻫﺎي ﺗﻜﺮاري را در ﺑﺮﻧﺎﻣﻪ ﻛﻢ ﻣﻲ ﻛﻨﺪ .ﺑﺪون ﺷﻚ اﺳﺘﻔﺎده از اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﻬﺘﺮﻳﻦ راه ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن دﻛﻤﻪ ﻫﺎي اﺳﺘﺎﻧﺪارد ﺑﻪ ﻳـﻚ
٣٠٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻮار اﺑـﺰار اﺳـﺖ .اﻟﺒﺘـﻪ ﺑﻌـﺪ از اﻳﻨﻜـﻪ اﻳـﻦ دﻛﻤـﻪ ﻫـﺎ در ﻧـﻮار اﺑـﺰار ﻗـﺮار داده ﺷـﺪ ،ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﭘﻨﺠـﺮه Collection Editorﻣﻜﺎن آﻧﻬﺎ را ﺗﻐﻴﻴﺮ داده و ﻳﺎ دﻛﻤﻪ ﻫﺎي ﺟﺪﻳﺪي ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻧﻮار اﺑﺰار Formattingدﻳﺪه ﻧﻤﻲ ﺷﻮد زﻳﺮا ﺧﺎﺻﻴﺖ Visibleآن ﺑﺮاﺑﺮ ﺑـﺎ Falseﻗﺮار داده ﺷﺪه اﺳﺖ .ﺑﺮاي ﻣﺸﺎﻫﺪه اﻳﻦ ﻧﻮار اﺑﺰار ﺑﺎﻳﺪ روي ﻛﻨﺘﺮل ﻣﺮﺑﻮط ﺑﻪ آن در ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﻃﺮاﺣﻲ ﻓﺮم ﻛﻠﻴﻚ ﻛﻨﻴﺪ. Items
ﻧﻮﺷﺘﻦ ﻛﺪ ﺑﺮاي ﻣﻨﻮ ﻫﺎ: ﺣﺎل ﻛﻪ ﺗﻤﺎم ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮرد ﻧﻴﺎز را در ﻓﺮم ﻗﺮار دادﻳﻢ ،ﺑﺎﻳﺪ ﻛﺪ ﻧﻮﻳﺴﻲ آﻧﻬﺎ را ﺷﺮوع ﻛﻨﻴﻢ .اﺑﺘﺪا ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻋﻤﻠﻜـﺮد ﻣﻨـﻮ ﻫـﺎ را ﻣـﻲ ﻧﻮﻳﺴﻴﻢ .ﺑﻌﺪ از اﺗﻤﺎم آن ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺑﻌﻀﻲ از دﻛﻤﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻧﻮار اﺑﺰار Mainرا ﻛﺎﻣﻞ ﻣﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﻨﻮي File (1ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم رﻓﺘﻪ و ﺑﺎ اﺳﺘﻔﺎده از ﻧﻮار ﻣﻨﻮ ،ﮔﺰﻳﻨﻪ Newرا از ﻣﻨـﻮي Fileاﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .ﺳـﭙﺲ ﺑـﻪ ﭘﻨﺠـﺮه Propertiesﺑﺮوﻳﺪ و روي آﻳﻜﻮن Eventsﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ روﻳﺪادﻫﺎي اﻳﻦ ﮔﺰﻳﻨﻪ از ﻣﻨﻮ ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ .از ﻟﻴﺴﺖ روﻳﺪادﻫﺎ ،روﻳﺪاد ﻛﻠﻴﻚ را اﻧﺘﺨﺎب ﻛﺮده و روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑـﻪ آن اﻳﺠـﺎد ﺷـﻮد .ﺳـﭙﺲ ﻛـﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: private void newToolStripMenuItem_Click(object sender, )EventArgs e { // Clear the text boxes ;textBox1.Text = string.Empty ;textBox2.Text = string.Empty // Set focus to the first text box ;)(textBox1.Focus } (2ﻋﻤﻠﻜﺮد دﻛﻤﻪ Newدر ﻧﻮار اﺑﺰار Mainﻧﻴﺰ ﻣﺸﺎﺑﻪ ﻋﻤﻠﻜﺮد اﻳﻦ ﮔﺰﻳﻨﻪ از ﻧﻮار ﻣﻨﻮ اﺳﺖ .ﺑﺮاي ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﺮﺑﻮط ﺑـﻪ اﻳـﻦ دﻛﻤﻪ ،ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم رﻓﺘﻪ و دﻛﻤﻪ Newرا از ﻧﻮار اﺑﺰار اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ از ﻟﻴﺴﺖ روﻳـﺪادﻫﺎي اﻳـﻦ ﻛﻨﺘـﺮل در ﭘﻨﺠﺮه Propertiesروﻳﺪاد ﻛﻠﻴﻚ را اﻧﺘﺨﺎب ﻛﺮده و روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ آن اﻳﺠـﺎد ﺷـﻮد. ﺑﻪ ﻋﻠﺖ ﻣﺸﺎﺑﻪ ﺑﻮدن ﻋﻤﻠﻜﺮد اﻳﻦ ﻣﺘﺪ ﺑﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ﮔﺰﻳﻨﻪ Newدر ﻣﻨﻮي ،Fileدر اﻳﻦ ﻗﺴﻤﺖ ﻛﺎﻓﻲ اﺳﺖ ﻛﺪ زﻳﺮ را ﺑﻪ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: private void newToolStripButton_Click(object sender, )EventArgs e { // Call the newToolStripMenuItem_Click method ;)newToolStripButton_Click(sender, e
٣٠٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} (3ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻳﻚ ،ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ﮔﺰﻳﻨﻪ exitToolStripmenuItemدر ﻣﻨـﻮي File را اﻳﺠﺎد ﻛﺮده ،ﺳﭙﺲ ﻛﺪ زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: private void exitToolStripMenuItem_Click(object sender, )EventArgs e { // Colse the form and exit ;)(Application.Exit }
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ﮔﺰﻳﻨﻪ Newﻛﺎﻣﻼً واﺿﺢ اﺳﺖ .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺣﺎﻟﺖ اوﻟﻴﻪ ﺑﺮﮔﺮداﻧﻴﻢ .ﺑﺮاي اﻳـﻦ ﻛـﺎر ﻧﻴـﺰ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻣﺘﻦ داﺧﻞ TextBoxﻫﺎ را ﭘﺎك ﻛﺮده و ﻓﻮﻛﻮس را ﺑﻪ TextBoxاول اﻧﺘﻘﺎل دﻫﻴﻢ ﺗﺎ اﮔﺮ ﻛﺎرﺑﺮ ﻣﺘﻨـﻲ را وارد ﻛﺮد ،در اﻳﻦ ﻗﺴﻤﺖ ﻧﻮﺷﺘﻪ ﺷﻮد .ﺑﺮاي ﭘﺎك ﻛﺮدن ﻣﺘﻦ داﺧﻞ TextBoxﻫﺎ ﻧﻴﺰ ﻛـﺎﻓﻲ اﺳـﺖ ﺧﺎﺻـﻴﺖ Textآﻧﻬـﺎ را ﺑﺮاﺑـﺮ ﺑـﺎ ﺧﺎﺻﻴﺖ Emptyاز ﻛﻼس Stringﻗﺮار دﻫﻴﻢ. // Clear the text boxes ;textBox1.Text = string.Empty ;textBox2.Text = string.Empty // Set focus to the first text box ;)(textBox1.Focus دﻛﻤﻪ ي Newدر ﻧﻮار اﺑﺰار ﻧﻴﺰ ﺑﺎﻳﺪ ﻫﻤﻴﻦ ﻋﻤﻞ را اﻧﺠﺎم دﻫﺪ ،اﻣﺎ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ اﻳﻦ ﻛﺪ را ﺑﺮاي اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﺗﻜﺮار ﻛﻨﻴﻢ .ﻳﻜﻲ از ﻛﺎرﻫﺎﻳﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘـﺪي ﻣﺠـﺰا ﺑـﺮاي اﻳـﻦ ﻣـﻮرد ﺑﻨﻮﻳـﺴﻴﺪ و اﻳـﻦ ﻣﺘـﺪ را در ﻣﺘـﺪﻫﺎي newToolStripButton_Clickو newToolStripMenuItem_Clickﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ .اﻣﺎ روش ﺑﻬﺘﺮي ﻫﻢ وﺟﻮد دارد و اﻳﻦ اﺳﺖ ﻛﻪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻗﺴﻤﺖ را در ﻳﻜﻲ از اﻳﻦ زﻳﺮﺑﺮﻧﺎﻣﻪ ﻫﺎ ﭘﻴﺎده ﺳﺎزي ﻛﺮد و در ﻣﺘﺪ دﻳﮕﺮ آن زﻳﺮﺑﺮﻧﺎﻣﻪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد .در اﻳﻨﺠﺎ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛـﺎر را در ﻣﺘـﺪ newToolStripMenuItem_Clickﻗـﺮار دادﻳﻢ و در زﻳﺮﺑﺮﻧﺎﻣﻪ ي newToolStripButton_Clickآن را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮدﻳﻢ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜـﻪ ﭘﺎراﻣﺘﺮﻫـﺎي ﻫـﺮ دوي اﻳﻦ ﻣﺘﺪﻫﺎ ﻳﻜﺴﺎن اﺳﺖ ،ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ اول ،ﻣﻲ ﺗﻮاﻧﻴﻢ از ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺘﺪ دوم اﺳﺘﻔﺎده ﻛﻨﻴﻢ. // Call the newToolStripMenuItem_Click method ;)newToolStripButton_Click(sender, e ﺣﺎل ﭼﻪ از دﻛﻤﻪ Newدر ﻧﻮار اﺑﺰار اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﭼﻪ ﮔﺰﻳﻨﻪ Newاز ﻣﻨﻮي ﻓﺎﻳﻞ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﻧﺘﻴﺠﻪ ﻣﺸﺎﺑﻪ اي درﻳﺎﻓﺖ ﺧﻮاﻫﻴـﺪ ﻛﺮد.
٣١٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﮔﺰﻳﻨﻪ ي Exitاز ﻣﻨﻮي Fileﺑﺎﻳﺪ ﻛﺪي را ﻗﺮار دﻫﻴﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ را ﺗﻤﺎم ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛـﺎر ﻣـﻲ ﺗﻮاﻧﻴـﺪ از ﻣﺘـﺪ Exitدر ﻛﻼس Applicationاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻳﻦ ﻣﺘﺪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ را ﻣﻲ ﺑﻨﺪد ،ﺗﻤﺎم ﻣﻨﺎﺑﻊ اﺷﻐﺎل ﺷﺪه ﺑﻪ وﺳـﻴﻠﻪ آن را آزاد ﻛـﺮده و ﺑـﻪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﺎﺗﻤﻪ ﻣﻲ دﻫﺪ. // Colse the form and exit ;)(Application.Exit ﺣﺎل ﻛﻪ ﺑﺨﺶ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻣﻨﻮي Fileو دﻛﻤﻪ ﻫﺎي ﻣﺘﻨﺎﻇﺮ آن در ﻧﻮار اﺑﺰار ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ ،ﺑﻪ ﻣﻨﻮي Editﻣﻲ روﻳﻢ ﺗـﺎ ﻛـﺪ ﻣﺮﺑﻮط ﺑﻪ ﮔﺰﻳﻨﻪ ﻫﺎي آن را ﺑﻨﻮﻳﺴﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﻨﻮ Edit (1اوﻟﻴﻦ ﮔﺰﻳﻨﻪ در ﻣﻨﻮي ،Editﮔﺰﻳﻨﻪ Undoاﺳﺖ .ﺑﺮاي ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و روي ﮔﺰﻳﻨﻪ Undoدر ﻣﻨﻮي Editدو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳـﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: private void undoToolStripMenuItem_Click(object sender, )EventArgs e { // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Undo the last operation ;)(objTextBox.Undo } (2ﺣﺎل ﺑﺎﻳﺪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﮔﺰﻳﻨﻪ Cutاز اﻳﻦ ﻣﻨﻮ را ﺑﻨﻮﻳﺴﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﮔﺰﻳﻨﻪ Cutرا از ﻣﻨـﻮي Editاﻧﺘﺨﺎب ﻛﺮده و روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﻣﻲ ﺷﻮد .ﻛﺪ زﻳـﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: private void cutToolStripMenuItem_Click(object sender, )EventArgs e { // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Copy the text to the clipboard and clear the field ;)(objTextBox.Cut }
٣١١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ اﺳﺘﻔﺎده از ﻧﻮار اﺑﺰار در ﻗـﺴﻤﺖ. در ﻧﻮار اﺑﺰار ﻧﻴﺰ ﻣﺸﺎﺑﻪ ﻋﻤﻠﻜﺮد اﻳﻦ ﮔﺰﻳﻨﻪ در ﻧﻮار ﻣﻨﻮ اﺳﺖCut ( ﻋﻤﻠﻜﺮد دﻛﻤﻪ3 . را اﻧﺘﺨﺎب ﻛﺮده و روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠـﺎد ﺷـﻮدCut دﻛﻤﻪ ي،ﻃﺮاﺣﻲ ﻓﺮم . را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪcutToolStripMenuItem_Click زﻳﺮ ﺑﺮﻧﺎﻣﻪ،ﺳﭙﺲ در اﻳﻦ ﻣﺘﺪ private void cutToolStripButton_Click(object sender, EventArgs e) { // Call the cutToolStripMenuItem_Click procedure cutToolStripMenuItem_Click(sender, e); } ﺑـﺎ دو ﺑـﺎر. اﺳـﺖCut ﻛﺪ اﻳﻦ ﮔﺰﻳﻨﻪ ﻧﻴﺰ ﺑﻪ ﻧﺴﺒﺖ ﻣـﺸﺎﺑﻪ ﮔﺰﻳﻨـﻪ. اﺳﺖCopy ﮔﺰﻳﻨﻪ،Edit ( ﮔﺰﻳﻨﻪ ﺑﻌﺪي در ﻣﻨﻮي4 : ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن را اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ،ﻛﻠﻴﻚ روي اﻳﻦ ﮔﺰﻳﻨﻪ در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم private void copyToolStripMenuItem_Click(object sender, EventArgs e) { // Declare a TextBox object and // set it to the ActiveControl TextBox objTextBox = (TextBox)this.ActiveControl; // Copy the text to the clipboard objTextBox.Copy(); } ﺑﺮاي اﻳﻦ ﻛﺎر. در ﻧﻮار اﺑﺰار را اﻳﺠﺎد ﻛﺮده و در آن ﻣﺘﺪ ﻗﺒﻠﻲ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪCopy ( ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ي5 :ﻛﺎﻓﻲ اﺳﺖ ﻛﺪ زﻳﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ private void copyToolStripButton_Click(object sender, EventArgs e) { // Call the copyToolStripMenuItem_Click procedure copyToolStripMenuItem_Click(sender, e); } . روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ، را اﻧﺘﺨﺎب ﻛﺮدهPaste ﮔﺰﻳﻨﻪ يEdit ( ﺣﺎل ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و از ﻣﻨﻮي6 : ﻛﺪ زﻳﺮ را وارد ﻛﻨﻴﺪ،در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن ﻛﻪ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮد private void pasteToolStripMenuItem_Click(object sender, EventArgs e) { // Declare a TextBox object and // set it to the ActiveControl TextBox objTextBox = (TextBox)this.ActiveControl;
٣١٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Copy the data from the clipboard to the textbox ;)(objTextBox.Paste } (7ﺑﺮاي ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ي Pasteدر ﻧﻮار اﺑﺰار ﻧﻴﺰ ﻣﻲ ﺗﻮان از ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﺮد .ﺑﻨـﺎﺑﺮاﻳﻦ ﺑﺎ دو ﺑﺎر ﻛﻠﻴﻚ روي دﻛﻤﻪ Pasteدر ﻧﻮار اﺑﺰار ،ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن را اﻳﺠﺎد ﻛﺮده و ﻛـﺪ زﻳـﺮ را در آن وارد ﻛﻨﻴﺪ: private void pasteToolStripButton_Click(object sender, )EventArgs e { // Call the pasteToolStripButton_Click procedure ;)pasteToolStripButton_Click(sender, e } (8آﺧﺮﻳﻦ ﮔﺰﻳﻨﻪ در ﻣﻨﻮي Editﮔﺰﻳﻨﻪ ي Select Allاﺳﺖ .ﺑﺮاي ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﺮﺑﻮط ﺑـﻪ اﻳـﻦ ﮔﺰﻳﻨـﻪ ﺑـﺎ دو ﺑـﺎر ﻛﻠﻴﻚ روي آن ،ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن را اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: private void selectAllToolStripMenuItem_Click(object sender, EventArgs )e { // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Select all text ;)(objTextBox.SelectAll }
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﻨﻮي Editرا ﺑﺎ ﮔﺰﻳﻨﻪ Undoﺷﺮوع ﻛﺮدﻳﻢ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ در ﻓﺮم ﺧﻮد دو TextBoxدارﻳﻢ ،ﻳﺎ ﺑﺎﻳﺪ ﺑـﻪ ﻧﺤـﻮي ﺑﻔﻬﻤﻴﻢ ﻛﻪ ﻛﺪام TextBoxدر ﻓﺮم اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ،ﻳﺎ از ﻳﻚ روش ﻛﻠﻲ اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﻛﻪ ﺑﺮاي ﻫﺮ دو TextBoxﻛﺎرﺑﺮد داﺷﺘﻪ ﺑﺎﺷﺪ .در اﻳﻦ ﻣﺘﺪ از روﺷﻲ ﻛﻠﻲ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﻫﺮ دو TextBoxﺑﻪ ﻛﺎر رود. ﺑــﺮاي اﻳﻨﻜــﻪ ﺑــﻪ ﻛﻨﺘﺮﻟــﻲ ﻛــﻪ ﻫــﻢ اﻛﻨــﻮن در ﻓــﺮم اﻧﺘﺨــﺎب ﺷــﺪه اﺳــﺖ دﺳﺘﺮﺳــﻲ داﺷــﺘﻪ ﺑﺎﺷــﻴﻢ ،ﻣــﻲ ﺗــﻮاﻧﻴﻢ از ﺧﺎﺻــﻴﺖ ActiveControlدر ﻓﺮم اﺳﺘﻔﺎده ﻛﻨﻴﻢ )ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﻧﻴﺰ ذﻛﺮ ﺷﺪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑـﻪ ﺧﺎﺻـﻴﺘﻬﺎي ﻓـﺮم از ﻛﻠﻤﻪ ﻛﻠﻴﺪي thisاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ( .اﻳﻦ ﺧﺎﺻﻴﺖ ،ﺷﻴﺊ اي را از ﻧﻮع Controlﺑﺮﻣﻲ ﮔﺮداﻧﺪ و ﺑﺎﻳﺪ ﻗﺒﻞ از اﺳﺘﻔﺎده از آن در ﺑﺮﻧﺎﻣﻪ آن را ﺑﻪ ﻧﻮع ﻛﻨﺘﺮﻟﻲ ﻛﻪ ﻣﻮرد ﻧﻈﺮﻣﺎن اﺳﺖ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ در اﻳﻦ ﻓﺮم ﻓﻘﻂ دو ﻛﻨﺘﺮل وﺟﻮد دارﻧﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨـﺪ ﺑــﻪ ﻋﻨــﻮان ﻛﻨﺘــﺮل ﻓﻌــﺎل ﺑﺎﺷــﻨﺪ و ﻫــﺮ دوي آﻧﻬــﺎ ﻧﻴــﺰ از ﻧــﻮع TextBoxﻫــﺴﺘﻨﺪ ،ﭘــﺲ ﻛﻨﺘﺮﻟــﻲ ﻛــﻪ ﺑــﻪ وﺳــﻴﻠﻪ ﺧﺎﺻــﻴﺖ ActiveControlﻣﺸﺨﺺ ﻣﻲ ﺷﻮد ﺣﺘﻤﺎً ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻳﻚ ﺷﻴﺊ از ﻛـﻼس TextBoxﺗﺒـﺪﻳﻞ ﺷـﻮد .ﺑﻨـﺎﺑﺮاﻳﻦ ﺷـﻴﺊ
٣١٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺟﺪﻳﺪي از ﻧﻮع TextBoxﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ و ﻛﻨﺘﺮﻟﻲ را ﻛﻪ ﺧﺎﺻﻴﺖ ActiveControlﺑﺮﻣﻲ ﮔﺮداﻧﺪ ،ﺑﻌﺪ از ﺗﺒﺪﻳﻞ ﻧﻮع، در آن ﻗﺮار ﻣﻲ دﻫﻴﻢ: // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl ﺣﺎل ﻛﻪ ﺑﻪ TextBoxﻛﻪ در ﻓﺮم اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ دﺳﺘﺮﺳﻲ دارﻳﻢ ،ﺑﺮاي ﻟﻐﻮ آﺧﺮﻳﻦ ﻋﻤﻞ آن ﻛﺎﻓﻲ اﺳﺖ ﻣﺘﺪ Undoرا در آن ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﺘﺪ ﻛﻪ ﻋﻀﻮي از ﻛﻼس TextBoxاﺳﺖ ،ﻣﻲ ﺗﻮاﻧﺪ آﺧﺮﻳﻦ ﺗﻐﻴﻴﺮي را ﻛﻪ ﻛﺎرﺑﺮ در آن TextBoxاﻳﺠﺎد ﻛﺮده اﺳﺖ را ﻟﻐﻮ ﻛﻨﺪ. // Undo the last operation ;)(objTextBox.Undo ﻧﻜﺘﻪ :در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ActiveControlﺑﺴﻴﺎر راﺣﺖ ﺑﻮد ،زﻳﺮا ﻓﻘـﻂ دو ﻛﻨﺘـﺮل TextBoxدر ﻓـﺮم ﻗﺮار داﺷﺖ .ﭘﺲ ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﺑﺪون ﻧﮕﺮاﻧﻲ از ﺑﻪ وﺟﻮد آﻣﺪن ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ ،ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ از اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑـﻪ ﺷـﻴﺊ اي از ﻛـﻼس TextBoxﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .اﻣﺎ در ﺷﺮاﻳﻄﻲ ﻛﻪ ﻛﻨﺘﺮل ﻫـﺎي ﮔﻮﻧـﺎﮔﻮﻧﻲ در ﺑﺮﻧﺎﻣـﻪ وﺟـﻮد دارﻧـﺪ ،ﻣﻤﻜـﻦ اﺳـﺖ ﻛـﺎرﺑﺮ ﻳـﻚ ﻛﻨﺘـﺮل Buttonرا اﻧﺘﺨــﺎب ﻛــﺮده و ﺳــﭙﺲ روي ﮔﺰﻳﻨــﻪ ي Undoﻛﻠﻴــﻚ ﻛﻨــﺪ .در اﻳــﻦ ﺻــﻮرت ﻣﻘــﺪار ﺑﺮﮔــﺸﺘﻲ ﺗﻮﺳــﻂ ﺧﺎﺻــﻴﺖ ActiveControlاز ﻧﻮع TextBoxﻧﺨﻮاﻫﺪ ﺑﻮد و ﺗﺒﺪﻳﻞ آن ﺑﻪ TextBoxﻧﻴﺰ ﺑﺎﻋﺚ اﻳﺠﺎد ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ ﺧﻮاﻫﺪ ﺷﺪ .در اﻳﻦ ﺷﺮاﻳﻂ ﺑﺮاي ﺑﺪﺳﺖ آوردن ﻛﻨﺘﺮل ﻓﻌﺎل در ﻳﻚ ﻓﺮم ﺑﺎﻳﺪ از روﺷﻬﺎي دﻳﮕﺮي اﺳﺘﻔﺎده ﻛﻨﻴﻢ ﻛﻪ در ﻓـﺼﻠﻬﺎي ﺑﻌـﺪي ﺑـﺎ آﻧﻬـﺎ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﺪ. ﮔﺰﻳﻨﻪ ﺑﻌﺪي در ﻣﻨﻮي ،Editﮔﺰﻳﻨﻪ Cutاﺳﺖ .در اﻳﻦ ﮔﺰﻳﻨﻪ ﻧﻴﺰ ،ﺑﺮاي ﻛﺎت ﻛـﺮدن ﻣـﺘﻦ ،اﺑﺘـﺪا ﺑﺎﻳـﺪ ﺑـﻪ ﻛﻨﺘـﺮل ﻓﻌـﺎل در ﻓـﺮم دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ از روش ﻗﺒﻠﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل اﺳﺘﻔﺎده ﻣﻲ ﻛﻨـﻴﻢ .ﺑﻌـﺪ از ﻣـﺸﺨﺺ ﻛـﺮدن ﻛﻨﺘـﺮل ﻓﻌﺎل در ﻓﺮم و ﺗﺒﺪﻳﻞ آن ﺑﻪ ﺷﻴﺊ از ﻛﻼس ،TextBoxﻛﺎﻓﻲ اﺳﺖ ﻣﺘﺪ Cutﻣﺮﺑﻮط ﺑﻪ آن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .اﻳـﻦ ﻣﺘـﺪ ﻳﻜـﻲ از ﻋﻀﻮ ﻫﺎي ﻛﻼس TextBoxاﺳﺖ ﻛﻪ ﻣﺘﻦ داﺧﻞ ﻛﺎدر را از آن ﭘﺎك ﻛﺮده و در داﺧﻞ ﻛﻠﻴﭗ ﺑﺮد ﻗﺮار ﻣﻲ دﻫﺪ: // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Copy the text to the clipboard and clear the field ;)(objTextBox.Cut ﻋﻤﻠﻜﺮد دﻛﻤﻪ ي Cutدر ﻧﻮار اﺑﺰار ﻧﻴﺰ ﻣﺸﺎﺑﻪ اﻳﻦ ﮔﺰﻳﻨﻪ در ﻧﻮار ﻣﻨﻮ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺎﻓﻲ اﺳﺖ در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ از اﻳـﻦ ﻛﻨﺘﺮل ،ﻣﺘﺪي را ﻛﻪ ﺑﺮاي ﮔﺰﻳﻨﻪ Cutدر ﻧﻮار ﻣﻨﻮ ﻧﻮﺷﺘﻴﻢ ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ: private void cutToolStripButton_Click(object sender, )EventArgs e { // Call the cutToolStripMenuItem_Click procedure ;)cutToolStripMenuItem_Click(sender, e
٣١٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﮔﺰﻳﻨﻪ Copyﻧﻴﺰ ﻣﺸﺎﺑﻪ ﮔﺰﻳﻨﻪ Cutاﺳﺖ .ﻛﺎﻓﻲ اﺳﺖ ﻛﻨﺘﺮل ﻓﻌﺎل در ﻓﺮم را ﻣﺸﺨﺺ ﻛﺮده و ﺑﻌـﺪ از ﺗﺒـﺪﻳﻞ آن ﺑـﻪ ﺷﻴﺊ اي از ﻧﻮع ،TextBoxﻣﺘﺪ Copyآن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .ﻣﺘﺪ Copyﻛﻪ ﻋﻀﻮ ﻛﻼس TextBoxاﺳﺖ ،ﻳﻚ ﻛﭙﻲ از ﻣﺘﻦ داﺧﻞ ﻛﺎدر را در ﻛﻠﻴﭗ ﺑﺮد ﻗﺮار ﻣﻲ دﻫﺪ. // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Copy the text to the clipboard ;)(objTextBox.Copy ﺑﺮاي روﻳﺪاد ﻛﻠﻴﻚ دﻛﻤﻪ ي Copyدر ﻧﻮار اﺑﺰار ﻫﻢ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﻣﺘﺪ ﻗﺒﻠﻲ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ: private void copyToolStripButton_Click(object sender, )EventArgs e { // Call the copyToolStripMenuItem_Click procedure ;)copyToolStripMenuItem_Click(sender, e } ﺑﺮاي ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ ﮔﺰﻳﻨﻪ Pasteاز ﻣﻨﻮي Editو ﻫﻤﭽﻨﻴﻦ دﻛﻤﻪ ي Pasteدر ﻧﻮار اﺑﺰار ﻫﻢ ﻣـﻲ ﺗـﻮاﻧﻴﻢ از روﺷﻲ ﻣﺸﺎﺑﻪ ﻣﻮارد ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﻨﻴﻢ. ﺑﺮاي ﮔﺰﻳﻨﻪ Select Allدر اﻳﻦ ﻣﻨﻮ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻣﺘـﺪ SelectAllﻛـﻪ ﻋـﻀﻮي از ﻛـﻼس TextBoxاﺳـﺖ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .اﻳﻦ ﻣﺘﺪ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﺗﻤﺎم ﻣﺘﻦ ﻣﻮﺟﻮد در TextBoxاﻧﺘﺨﺎب ﺷﻮد: // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl // Select all text ;)(objTextBox.SelectAll
ﻛﺪ ﻧﻮﻳﺴﻲ ﻣﻨﻮي Viewو ﻧﻮار اﺑﺰارﻫﺎ: ﺑﻌﺪ از اﺗﻤﺎم ﻣﻨﻮ ﻫﺎي Fileو Editو دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار ﻣﺮﺗﺒﻂ ﺑﺎ آﻧﻬﺎ ،ﻧﻮﺑﺖ ﺑﻪ ﻣﻨﻮي Viewﻣﻲ رﺳﺪ ﺗﺎ ﻛﺪ ﻣﺮﺑﻮط ﺑـﻪ آن را در ﺑﺮﻧﺎﻣﻪ وارد ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻮﺷﺘﻦ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻣﻨﻮي View
٣١٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(1در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﻪ ﻣﻨﻮي Viewﺑﺮوﻳﺪ و ﮔﺰﻳﻨﻪ Mainرا از زﻳﺮ ﻣﻨﻮي Toolbarsاﻧﺘﺨﺎب ﻛﻨﻴـﺪ .ﺳـﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه ،Propertiesروي روﻳﺪاد ﻛﻠﻴﻚ در ﻟﻴﺴﺖ روﻳﺪادﻫﺎي اﻳﻦ ﮔﺰﻳﻨﻪ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﻣﺘـﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد .ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ اﻳﻦ ﻣﺘﺪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: private void mainToolStripMenuItem_Click(object sender, )EventArgs e { // Toggle the visibility of the Main toolbar // based on this menu item's Checked property )if (mainToolStripMenuItem.Checked { ;tspMain.Visible = true } else { ;tspMain.Visible = false } } (2ﺑﺮاي ﮔﺰﻳﻨﻪ Formattingاز اﻳﻦ زﻳﺮﻣﻨﻮ ﻧﻴﺰ ﺑﺎﻳﺪ از ﻛﺪي ﻣﺸﺎﺑﻪ ﻗﺴﻤﺖ ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎ دو ﺑـﺎر ﻛﻠﻴﻚ روي اﻳﻦ ﮔﺰﻳﻨﻪ در ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ،ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن را اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ: (private void formattingToolStripMenuItem_Click )object sender, EventArgs e { // Toggle the visibility of the Main toolbar // based on this menu item's Checked property = spFormatting.Visible ;formattingToolStripMenuItem.Checked }
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﮔﺰﻳﻨﻪ Mainاز زﻳﺮ ﻣﻨﻮي Toolbarsاﻧﺘﺨﺎب ﺷﻮد ،ﺑﺮ اﺳﺎس اﻳﻨﻜﻪ ﺧﺎﺻﻴﺖ Checkedاﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاﺑـﺮ ﺑـﺎ Trueو ﻳﺎ Falseاﺳﺖ ،ﻳﻚ ﻋﻼﻣﺖ ﺗﻴﻚ در ﻛﻨﺎر آن ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﻳﺎ اﻳﻦ ﻋﻼﻣـﺖ از ﻛﻨـﺎر آن ﺑﺮداﺷـﺘﻪ ﻣـﻲ ﺷـﻮد. ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﻢ در روﻳﺪاد ﻛﻠﻴﻚ اﻳﻦ ﮔﺰﻳﻨﻪ ﻛﺪي را وارد ﻛﻨﻴﻢ ﻛﻪ اﮔﺮ اﻳﻦ ﮔﺰﻳﻨﻪ ﻋﻼﻣﺖ ﺧﻮرده ﺑـﻮد )ﺧﺎﺻـﻴﺖ Checkedآن ﺑﺮاﺑﺮ ﺑﺎ trueﺑﻮد( ﻧﻮار اﺑﺰار Mainﻧﻤﺎﻳﺶ داده ﺷﻮد )ﺧﺎﺻﻴﺖ Visibleآن ﺑﺮاﺑﺮ ﺑﺎ Trueﺷﻮد( .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت اﻳﻦ ﻧﻮار اﺑﺰار ﻧﻤﺎﻳﺶ داده ﻧﺨﻮاﻫﺪ ﺷﺪ. // Toggle the visibility of the Main toolbar // based on this menu item's Checked property )if (mainToolStripMenuItem.Checked
٣١٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ ;tspMain.Visible = true } else { ;tspMain.Visible = false } ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ در ﺷﺮط دﺳﺘﻮر ifﻧﻴﺎزي ﻧﻴﺴﺖ از ﻋﺒﺎرت mainToolStripMenuItem.Check == true اﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻋﺒﺎرت داﺧﻞ ﭘﺮاﻧﺘﺰ ﻣﻘﺎﺑﻞ ifﺑﺮاﺑﺮ ﺑﺎ trueﺑﺎﺷﺪ ،دﺳـﺘﻮرات داﺧـﻞ ﺑـﻼك if اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ از ﺧﻮد ﺧﺎﺻﻴﺖ در ﻣﻘﺎﺑﻞ دﺳﺘﻮر ifاﺳﺘﻔﺎده ﻛﻨـﻴﻢ .اﮔـﺮ ﻣﻘـﺪار ﺧﺎﺻـﻴﺖ ﺑﺮاﺑـﺮ ﺑـﺎ trueﺑﻮد ،دﺳﺘﻮرات داﺧﻞ ﺑﻼك ifاﺟﺮا ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻦ ﺻﻮرت دﺳﺘﻮرات داﺧﻞ ﺑﻼك elseاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ. ﺑـﺮاي ﮔﺰﻳﻨــﻪ Formattingﻧﻴـﺰ ﻣــﻲ ﺗــﻮاﻧﻴﻢ از ﻫﻤـﺎن روش اﺳــﺘﻔﺎده ﻛﻨـﻴﻢ ﺗــﺎ ﻣﻘــﺪار ﺧﺎﺻـﻴﺖ Visibleﻧــﻮار اﺑــﺰار Formattingﺑﺮ اﺳﺎس اﻧﺘﺨﺎب ﺷﺪن و ﻳﺎ ﻧﺸﺪن اﻳﻦ ﮔﺰﻳﻨﻪ ﻣﺸﺨﺺ ﺷﻮد .اﻣﺎ روش ﺑﻬﺘﺮي ﻧﻴﺰ ﺑﺮاي ﻧﻮﺷﺘﻦ اﻳـﻦ ﻛـﺪ وﺟـﻮد دارد و اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻘﺪار ﺧﺎﺻﻴﺖ Checkedاﻳﻦ ﮔﺰﻳﻨﻪ از ﻧﻮار ﻣﻨﻮ را ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ در ﺧﺎﺻﻴﺖ Visibleﻧﻮار اﺑﺰار ﻗـﺮار دﻫﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻧﻴﺎزي ﺑﻪ ﺑﺮرﺳﻲ ﺷﺮط ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر ifﻧﻴﺴﺖ و ﻫﻤﺎن ﻛﺪ ﻗﺒﻠﻲ را ﻣﻲ ﺗﻮاﻧﻴﻢ در ﻳـﻚ ﺧـﻂ ﭘﻴـﺎده ﺳـﺎزي ﻛﻨﻴﻢ .اﻳﻦ روش ﻧﺴﺒﺖ ﺑﻪ روش ﻗﺒﻠﻲ ﻋﻼوه ﺑﺮ ﻛﻮﺗﺎه ﺗﺮ ﺑﻮدن ،از ﺳﺮﻋﺖ اﺟﺮاي ﺑﺎﻻﺗﺮي ﻧﻴﺰ ﺑﺮﺧﻮردار اﺳﺖ .اﻟﺒﺘﻪ ﻣﻤﻜﻦ اﺳـﺖ ﺗﻔـﺎوت ﺳﺮﻋﺖ اﻳﻦ روش در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﻮﭼﻜﻲ ﻣﺎﻧﻨﺪ اﻳﻦ ﻣﺜﺎل ﭼﻨﺪان ﻣﻮرد ﺗﻮﺟﻪ واﻗﻊ ﻧﺸﻮد ،اﻣﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺣﺠﻢ ﺑﺮﻧﺎﻣﻪ زﻳﺎد ﺷﻮد اﺳـﺘﻔﺎده از اﻳﻦ ﺗﻜﻨﻴﻚ ﻫﺎ در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﭼﺸﻤﮕﻴﺮ ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد. // Toggle the visibility of the Main toolbar // based on this menu item's Checked property = spFormatting.Visible ;formattingToolStripMenuItem.Checked
اﻣﺘﺤﺎن ﺑﺮﻧﺎﻣﻪ: ﻫﺮ ﭼﻪ ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﻣﻲ ﻧﻮﻳﺴﻴﺪ ﭘﻴﭽﻴﺪه ﺗﺮ ﻣﻲ ﺷﻮد ،ﺗﺴﺖ ﻛﺮدن ﻣﺪاوم ﺑﺮاي اﻃﻤﻴﻨﺎن از ﻧﺤﻮه ﻋﻤﻠﻜﺮد آن ﻧﻴـﺰ ﻣﻬﻤﺘـﺮ ﻣـﻲ ﺷـﻮد .در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻫﺮ ﭼﻪ ﺑﻴﺸﺘﺮ ﺧﻄﺎﻫﺎي آن را ﭘﻴﺪا ﻛﺮده و ﺗﺼﺤﻴﺢ ﻛﻨﻴﺪ ،ﺑﻬﺘﺮ ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ .در ﻧﺘﻴﺠﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣـﻪ اي ﭘﺎﻳﺪار ﺗﺮ و ﺑﺎ ﻗﺎﺑﻠﻴﺖ اﻃﻤﻴﻨﺎن ﺑﻴﺸﺘﺮي اﻳﺠﺎد ﻛﻨﻴﺪ. ﺑﺮاي ﺗﺴﺖ ﻛﺮدن ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﻧﻪ ﺗﻨﻬﺎ ﺑﺎﻳﺪ ﻋﻤﻠﻜﺮد ﻋﺎدي آن را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ ،ﺑﻠﻜﻪ ﺑﺎﻳﺪ ﻣﻘﺪارﻫﺎي ﻣﺨﺘﻠﻔﻲ ﻛﻪ ﻛـﺎرﺑﺮ ﻣﻤﻜـﻦ اﺳـﺖ در ﺑﺮﻧﺎﻣﻪ وارد ﻛﻨﺪ را ﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ورودي ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻔﺮﺳﺘﻴﺪ و رﻓﺘﺎر ﺑﺮﻧﺎﻣﻪ را در آن ﺷﺮاﻳﻂ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴـﺪ در ﺣـﺎل ﻃﺮاﺣﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻫﺴﺘﻴﺪ ﻛﻪ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ را ﺑﻪ وﺳﻴﻠﻪ ﻳـﻚ ﻓـﺮم درﻳﺎﻓـﺖ ﻣـﻲ ﻛﻨـﺪ و در ﻳـﻚ ﺟـﺪول در ﺑﺎﻧـﻚ اﻃﻼﻋﺎﺗﻲ ﻗﺮار ﻣﻲ دﻫﺪ .ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺧﻮب و ﭘﺎﻳﺪار ،ﻗﺒﻞ از اﻳﻨﻜﻪ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ را ﺑﺮاي ذﺧﻴـﺮه ﺷـﺪن ﺑـﻪ ﺑﺎﻧـﻚ اﻃﻼﻋـﺎﺗﻲ ﺑﻔﺮﺳـﺘﺪ، ﺻﺤﺖ ﻧﻮع داده اي ﺗﻤﺎم آﻧﻬﺎ را ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻗﺒﻞ از اﻳﻨﻜﻪ ﺳﻦ ﻛﺎرﺑﺮ را در ﺟﺪول ذﺧﻴﺮه ﻛﻨﺪ ،ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺣﺘﻤـﺎً ﻣﻘﺪار وارد ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ ﺑﺮاي اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺻﻮرت ﻋﺪدي ﺑﺎﺷﺪ و ﻛﺎرﺑﺮ ﻣﺘﻨﻲ را در اﻳﻦ ﻗﺴﻤﺖ وارد ﻧﻜﺮده ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ از اﻳﺠﺎد ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ و ﺗﻮﻗﻒ اﺟﺮا آن ﻧﻴﺰ ﻣﻲ ﺗﻮان ﺗﺎ ﺣﺪ اﻣﻜﺎن ﺟﻠﻮﮔﻴﺮي ﻛﺮد. ٣١٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻣﺘﺤﺎن ﺑﺮﻧﺎﻣﻪ (1ﺣﺎل ﻛﻪ راﺑﻂ ﻛﺎرﺑﺮي ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﺮدﻳﻢ و ﻛﺪ ﺑﻴﺸﺘﺮ ﻗﺴﻤﺘﻬﺎي آن را ﻧﻴﺰ وارد ﻛﺮدﻳﻢ ،ﺑﺎﻳﺪ ﻋﻤﻠﻜﺮد آن را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ. ﺑﺮاي اﻳﻦ ﻛﺎر روي دﻛﻤﻪ Startدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮم اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﻣﺸﺎﺑﻪ ﺷﻜﻞ 7-8ﻓﻘﻂ ﻳﻜﻲ از ﻧﻮار اﺑﺰارﻫﺎ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﺪ ﺑﻮد.
ﺷﻜﻞ 7-8 (2
(3
(4
(5
از ﻧﻮار ﻣﻨﻮ ،ﻣﻨﻮي Viewرا اﻧﺘﺨﺎب ﻛﺮده و ﺳﭙﺲ ﺑﻪ زﻳﺮ ﻣﻨﻮي Toolbarsﺑﺮوﻳﺪ .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴـﺪ ﻛـﻪ در اﻳـﻦ زﻳﺮﻣﻨﻮ دو ﮔﺰﻳﻨﻪ Mainو Formattingوﺟﻮد دارﻧﺪ ﻛﻪ در ﻛﻨﺎر ﮔﺰﻳﻨﻪ اول ﻳـﻚ ﻋﻼﻣـﺖ ﺗﻴـﻚ ﻗـﺮار دارد .اﻳـﻦ ﻋﻼﻣﺖ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻫﻢ اﻛﻨﻮن اﻳﻦ ﻧﻮار اﺑﺰار در ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ ﻣﺸﺎﻫﺪه اﺳﺖ .روي ﮔﺰﻳﻨﻪ Formatting در اﻳﻦ ﻗﺴﻤﺖ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻧﻮار اﺑﺰار Formattingﻫﻢ ﻧﻤﺎﻳﺶ داده ﺷﻮد. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﺑﺎ ﻧﻤﺎﻳﺶ اﻳﻦ ﻧﻮار اﺑﺰار ،ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎ در ﻓﺮم ﺑﻪ اﻧﺪازه ﻻزم ﺑﻪ ﺳـﻤﺖ ﭘـﺎﻳﻴﻦ ﺣﺮﻛـﺖ ﻛﺮدﻧـﺪ. دﻟﻴﻞ اﻳﻦ اﻣﺮ در اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﻛﻨﺘﺮل Panelدر ﻓـﺮم ﻗـﺮار داده و ﺑﻌـﺪ از ﺗﻨﻈـﻴﻢ ﺧﺎﺻـﻴﺖ Dockآن ﺑـﺎ ﻣﻘـﺪار ،Fillدو TextBoxرا در آن ﻗﺮار دادﻳﺪ .ﺑﺎ اﻧﺠﺎم اﻳﻦ ﻛﺎر ،ﻣﻮﻗﻌﻴﺖ ﻛﻨﺘﺮل ﻫﺎ ﻣﻲ ﺗﻮاﻧـﺪ در ﺻـﻮرت ﻟـﺰوم در ﻓـﺮم ﺗﻐﻴﻴﺮ ﻛﻨﺪ .اﮔﺮ ﻛﻨﺘﺮل Panelرا از ﻓﺮم ﺣﺬف ﻛﻨﻴﺪ و ﻛﻨﺘﺮﻟﻬﺎي TextBoxرا در ﺧـﻮد ﻓـﺮم ﻗـﺮار دﻫﻴـﺪ ،ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺑﺎ ﻧﻤﺎﻳﺶ ﻧﻮار اﺑﺰار ،Formattingﻛﻨﺘﺮل TextBoxاول روي ﻧﻮار اﺑﺰار Mainﻗﺮار ﺧﻮاﻫـﺪ ﮔﺮﻓﺖ ﻧﻮار اﺑﺰار Mainﻗﺎﺑﻞ ﻣﺸﺎﻫﺪه ﻧﺨﻮاﻫﺪ ﺑﻮد. ﺣﺎل اﮔﺮ ﻣﺠﺪداً ﺑﻪ زﻳﺮ ﻣﻨﻮي Toolbarsدر ﻣﻨﻮي Viewﺑﺮوﻳﺪ ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ در ﻛﻨـﺎر ﻫـﺮ دو ﮔﺰﻳﻨـﻪ ﻫﺎي Mainو Formattingﻳﻚ ﻋﻼﻣﺖ ﺗﻴﻚ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ در ﺣﺎل ﺣﺎﺿـﺮ ﻫـﺮ دوي اﻳﻦ ﻧﻮار اﺑﺰارﻫﺎ در ﺣﺎل ﻧﻤﺎﻳﺶ اﺳﺖ. ﺣﺎل ﻋﻤﻠﻜﺮد ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮي Editرا ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ .ﻣﺘﻨﻲ را در ﻛﻨﺘـﺮل TextBoxاول وارد ﻛـﺮده و ﺳـﭙﺲ ﮔﺰﻳﻨﻪ Select Allرا از ﻣﻨﻮي Editاﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛـﻪ ﺗﻤـﺎم ﻣـﺘﻦ ﻧﻮﺷـﺘﻪ ﺷـﺪه در آن اﻧﺘﺨﺎب ﺧﻮاﻫﻨﺪ ﺷﺪ. ﺣﺎل ﻣﻲ ﺧﻮاﻫﻴﻢ ﻣﺘﻦ اﻧﺘﺨﺎب ﺷﺪه در TextBoxاول را در ﻛﻠﻴﭗ ﺑﺮد ﻛﭙﻲ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎ ﻣـﺎوس روي دﻛﻤـﻪ ي Copyدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻳﺎ ﮔﺰﻳﻨﻪ Copyرا از ﻣﻨﻮي Editاﻧﺘﺨﺎب ﻛﻨﻴﺪ. ﻣﻜﺎن ﻧﻤﺎ را در TextBoxدوم ﻗﺮار دﻫﻴﺪ و ﺳﭙﺲ روي دﻛﻤﻪ ي Pasteدر ﻧﻮار اﺑﺰار ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻳﺎ از ﻧﻮار ﻣﻨـﻮ ﮔﺰﻳﻨﻪ Edit Pasteرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻦ ﻧﻮﺷﺘﻪ ﺷﺪه در TextBoxاول ،ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ 8-8در TextBoxدوم ﻧﻴﺰ ﻗﺮار ﺧﻮاﻫﺪ ﮔﺮﻓﺖ.
٣١٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 8-8 (6
(7
(8
(9
ﻛﻨﺘﺮل TextBoxاول را اﻧﺘﺨﺎب ﻛـﺮده و ﮔﺰﻳﻨـﻪ Edit Undoرا از ﻧـﻮار ﻣﻨـﻮ اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ ،ﻣـﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ در اﻳﻦ ﻛﻨﺘﺮل اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﺪ ﻟﻐﻮ ﻣﻲ ﺷﻮد .ﻣﻤﻜﻦ اﺳﺖ اﻧﺘﻈﺎر داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛـﻪ ﺑـﺎ اﻧﺘﺨـﺎب اﻳﻦ ﮔﺰﻳﻨﻪ ،آﺧﺮﻳﻦ ﺗﻐﻴﻴﺮ ،ﻳﻌﻨﻲ ﻣﺘﻨﻲ ﻛﻪ در TextBoxدوم وارد ﻛﺮده اﻳﺪ ﭘﺎك ﺷﻮد .اﻣﺎ وﻳﻨﺪوز ﺗﻐﻴﻴﺮات ﻳﻚ ﻛﻨﺘـﺮل را ﺑﺮاي ﻟﻐﻮ آﻧﻬﺎ ﺑﻪ ﻃﻮر ﺟﺪاﮔﺎﻧﻪ ذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﻫﻨﮕﺎﻣﻲ ﻛﻪ TextBoxاول را اﻧﺘﺨﺎب ﻛﺮده اﻳﺪ روي ﮔﺰﻳﻨـﻪ Undoﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﺗﻐﻴﻴﺮات ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل ﻟﻐﻮ ﻣﻲ ﺷﻮﻧﺪ. آﺧﺮﻳﻦ ﮔﺰﻳﻨﻪ اي ﻛﻪ در ﻣﻨﻮي Editﺑﺎﻳﺪ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﺑﮕﻴﺮد ،ﮔﺰﻳﻨﻪ Cutاﺳﺖ .ﻣﺘﻨـﻲ را در TextBoxاول وارد ﻛﺮده و ﺑﺎ اﻧﺘﺨﺎب ﮔﺰﻳﻨﻪ Edit Select Allاز ﻧﻮار ﻣﻨﻮ ،ﺗﻤﺎم آن را اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺎ ﻛﻠﻴـﻚ روي دﻛﻤﻪ Cutدر ﻧﻮار اﺑﺰار و ﻳﺎ اﻧﺘﺨﺎب ﮔﺰﻳﻨﻪ Edit Cutاز ﻧﻮار ﻣﻨﻮ ،ﻣﺘﻦ ﻧﻮﺷﺘﻪ ﺷﺪه در اﻳﻦ ﻛﻨﺘـﺮل را از آن ﺣﺬف ﻛﺮده و در ﻛﻠﻴﭗ ﺑﺮد ﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﻣﻜﺎن ﻧﻤﺎ را در اﻧﺘﻬﺎي ﻣﺘﻦ ﻣﻮﺟﻮد در TextBoxدوم ﺑﺮده و ﺑﺎ ﻓـﺸﺎر دادن ﺷﻮرت ﻛﺎت ﮔﺰﻳﻨﻪ ،(Ctrl+V) Pasteﻣﺘﻦ داﺧﻞ ﻛﻠﻴﭗ ﺑﺮد را در اﻳﻦ TextBoxﻗﺮار دﻫﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻣﻘﺪار ﺑﺴﻴﺎر ﻛﻤﻲ ﻛﺪ،ﮔﺰﻳﻨـﻪ ﻫـﺎي Copy ،Cutو Pasteرا در اﻳـﻦ ﺑﺮﻧﺎﻣـﻪ ﻫﻤﺎﻧﻨﺪ دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳﻨﺪوزي اﻳﺠﺎد ﻛﺮدﻳﻢ. ﺑﻪ ﻣﻨﻮي Fileﺑﺮوﻳﺪ و ﮔﺰﻳﻨﻪ Newرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻦ داﺧﻞ ﻫﺮ دو TextBoxﭘﺎك ﺧﻮاﻫﺪ ﺷﺪ، ﭘﺲ اﻳﻦ ﮔﺰﻳﻨﻪ ﻧﻴﺰ ﺑﻪ درﺳﺘﻲ ﻛﺎر ﻣﻲ ﻛﻨﺪ .ﺗﻨﻬﺎ ﮔﺰﻳﻨﻪ ﺑﺎﻗﻲ ﻣﺎﻧﺪه ﺑﺮاي ﺑﺮرﺳﻲ ﻛـﺮدن ،ﮔﺰﻳﻨـﻪ Exitاز ﻣﻨـﻮي File اﺳﺖ. ﻗﺒﻞ از ﺧﺮوج از ﺑﺮﻧﺎﻣﻪ ،روي ﻳﻜﻲ از TextBoxﻫﺎ ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻳﻚ ﻣﻨﻮي ﻓﺮﻋﻲ ﻫﻤﺎﻧﻨـﺪ ﺷـﻜﻞ 9-8ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﻣﻨﻮ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد و ﺑﺮاي اﺿـﺎﻓﻪ ﻛـﺮدن آن ﺑـﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎز ﺑﻪ ﻧﻮﺷﺘﻦ ﻛﺪ و ﻳﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل ﺧﺎﺻﻲ ﻧﻴﺴﺖ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﻳﻦ وﻳﮋﮔﻲ ﺗﻮﺳﻂ وﻳﻨﺪوز ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ ﺑﻌﺪ ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد در وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005روﺷﻬﺎﻳﻲ ﺑﺮاي ﺣﺬف اﻳﻦ ﻣﻨﻮ و ﻧﻤـﺎﻳﺶ ﻣﻨﻮي ﻣﻮردﻧﻈﺮ ﺧﻮدﺗﺎن در اﻳﻦ ﻗﺴﻤﺖ وﺟﻮد دارد.
٣١٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 9-8 (10ﺑﺮاي ﺑﺮرﺳﻲ ﻋﻤﻠﻜﺮد آﺧﺮﻳﻦ ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ ،از ﻧﻮار ﻣﻨﻮ ﮔﺰﻳﻨﻪ File Exitرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﺗﺎ از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﻮﻳﺪ.
ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ: ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ 1ﻣﻨﻮ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ راﺳﺖ ﻛﺎرﺑﺮ روي ﻳﻚ ﻛﻨﺘﺮل و ﻳﺎ روي ﻳﻚ ﻓﺮم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ .ﺑﻪ وﺳﻴﻠﻪ اﻳـﻦ ﻣﻨﻮ ﻫﺎ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺳﺮﻋﺖ ﺑﻪ ﻛﺎرﻫﺎي ﻋﻤﻮﻣﻲ ﻛﻪ در ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺷﺪت ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ دﺳﺘﺮﺳﻲ داﺷـﺘﻪ ﺑﺎﺷـﺪ. ﺑﺮاي ﻣﺜﺎل ﻣﻨﻮي ﻓﺮﻋﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻠﻲ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﻧﻤﺎﻳﺶ داده ﺷﺪ اﻳﻦ اﻣﻜﺎن را ﺑﻪ ﻛﺎرﺑﺮ ﻣﻲ دﻫـﺪ ﻛـﻪ ﺑـﻪ راﺣﺘـﻲ و ﺑـﻪ ﺳﺮﻋﺖ ،ﺑﻪ ﮔﺰﻳﻨﻪ ﻫﺎي ﭘﺮ ﻛﺎرﺑﺮد ﻣﻨﻮي Editﺑﺮاي وﻳﺮاﻳﺶ ﻣﺘﻦ درون ﻳﻚ ،TextBoxدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮ ﺣﺴﺐ ﻛﻨﺘﺮﻟﻲ ﻛﻪ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﻛﺮده اﺳﺖ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜـﺎل ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ در دﻳﮕـﺮ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي وﻳﻨﺪوزي ﻣﺸﺎﻫﺪه ﻛﺮده اﻳﺪ ،اﮔﺮ در ﻓﺮم ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﻛﻨﺘﺮل TextBoxرا اﻧﺘﺨﺎب ﻛﺮده و روي آن ﻛﻠﻴﻚ راﺳـﺖ ﻛﻨﻴـﺪ ﻣﻨـﻮي ﻓﺮﻋﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﺎ ﻣﻨﻮي ﻓﺮﻋﻲ ﻣﺮﺑﻮط ﺑﻪ ﺧﻮد ﻓﺮم ﺗﻔﺎوت دارد. وﻳﻨﺪوز ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻳﻚ ﻣﻨﻮي ﻓﺮﻋﻲ ﺑﺮاي ﻛﻨﺘﺮﻟﻬﺎي TextBoxﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﺗﺎ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﺑﻪ وﺳﻴﻠﻪ آن ﻛﺎرﻫﺎي ﻋﻤﻮﻣﻲ ﻣﺎﻧﻨﺪ Copy ،Cutو ﻳﺎ Pasteرا اﻧﺠﺎم دﻫﺪ .اﻟﺒﺘﻪ در ﺻﻮرت ﻟﺰوم ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﻣﻨﻮ را ﺑﺎ ﻫﺮ ﻣﻨﻮي دﻳﮕﺮي ﺟﺎﻳﮕﺰﻳﻦ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ در ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻣﺘﻦ داﺧﻞ TextBoxﻫﺎ را ﻛﭙﻲ ﻛﻨﺪ ،اﻣﺎ ﻧﻤﻲ ﺧﻮاﻫﻴﺪ اﺟﺎزه دﻫﻴـﺪ ﻛـﻪ اﻳﻦ ﻣﺘﻦ ﻛﺎت ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻨﻮي ﺟﺪﻳﺪي اﻳﺠﺎد ﻛﻨﻴﺪ و از آن ﺑـﻪ ﻋﻨـﻮان ﻣﻨـﻮي ﻓﺮﻋـﻲ در ﻛﻨﺘـﺮل ﻫـﺎي TextBox اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺳﭙﺲ در اﻳﻦ ﻣﻨﻮ ﮔﺰﻳﻨﻪ Cutرا ﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﺪ. ﺑﺮاي اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻛﻨﺘﺮل ContextMenuStripاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ .ﻋﻤﻠﻜـﺮد اﻳـﻦ ﻛﻨﺘﺮل و ﻧﺤﻮه اﻳﺠﺎد ﻣﻨﻮ در آن ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮل MenuStripاﺳﺖ .ﺗﻔﺎوت اﻳﻦ ﻛﻨﺘﺮل ﺑـﺎ ﻛﻨﺘـﺮل MenuStripدر آن اﺳﺖ ﻛﻪ در ﻛﻨﺘﺮل ContextMenuStripﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﻣﻨﻮ در ﺑﺎﻻﺗﺮﻳﻦ ﺳﻄﺢ داﺷﺘﻪ ﺑﺎﺷﻴﺪ و دﻳﮕﺮ ﻣﻨﻮ ﻫﺎ ﺑﺎﻳﺪ ﺑـﻪ
1ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ ﻳﺎ .Pop-Up Menusﻧﺎم دﻳﮕﺮ اﻳﻦ ﻣﻨﻮ ﻫﺎ ،ﻣﻨﻮ ﻫﺎي زﻣﻴﻨﻪ ﻳﺎ Context Menusاﺳﺖ.
٣٢٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻋﻨﻮان زﻳﺮ ﻣﺠﻤﻮﻋﻪ آن واﻗﻊ ﺷﻮﻧﺪ ،در ﺻﻮرﺗﻲ ﻛﻪ در ﻛﻨﺘﺮل MenuStripﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺗﻌﺪاد دﻟﺨـﻮاه ﻣﻨـﻮ در ﺑـﺎﻻﺗﺮﻳﻦ ﺳـﻄﺢ داﺷﺘﻪ ﺑﺎﺷﻴﺪ. ﺑﻴﺸﺘﺮ ﻛﻨﺘﺮﻟﻬﺎﻳﻲ ﻛﻪ در ﺟﻌﺒﻪ اﺑﺰار وﺟﻮد دارﻧﺪ داراي ﺧﺎﺻﻴﺘﻲ ﺑﻪ ﻧﺎم ContextMenuStripﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺷﻴﺊ اي را از اﻳﻦ ﻧﻮع ﻗﺒﻮل ﻛﻨﻨﺪ .ﺑﺎ ﺗﻨﻈﻴﻢ اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاي ﻫﺮ ﻳﻚ از ﻛﻨﺘﺮل ﻫﺎ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ روي آن ﻛﻨﺘﺮل ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﺪ ﻣﻨـﻮي ﻓﺮﻋﻲ ﻛﻪ ﺑﻪ آن ﻧﺴﺒﺖ داده ﺷﺪه اﺳﺖ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. ﺑﻌﻀﻲ از ﻛﻨﺘﺮل ﻫﺎ ﻫﻤﺎﻧﻨﺪ ComboBoxو ﻳﺎ ListBoxداراي ﻳﻚ ﻣﻨﻮي ﻓﺮﻋﻲ ﭘﻴﺶ ﻓﺮض ﻧﻴﺴﺘﻨﺪ .دﻟﻴﻞ اﻳﻦ ﻣﻮرد ﻫﻢ ﺑـﻪ اﻳﻦ ﻋﻠﺖ اﺳﺖ ﻛﻪ اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﻴﺶ از ﻳﻚ آﻳﺘﻢ را در ﺧﻮد ﻧﮕﻪ داري ﻣﻲ ﻛﻨﻨﺪ و ﻣﺎﻧﻨﺪ ﻛﻨﺘﺮل TextBoxﻓﻘﻂ ﻳﻚ آﻳـﺘﻢ درون آﻧﻬﺎ وﺟﻮد ﻧﺪارد .اﻟﺒﺘﻪ اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﻧﻴﺰ داراي ﺧﺎﺻﻴﺖ ContextMenuStripﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳـﻴﻠﻪ آن ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻳـﻚ ﻣﻨﻮي ﻓﺮﻋﻲ را در ﺑﺮﻧﺎﻣﻪ ﺑﺮاي آﻧﻬﺎ اﻳﺠﺎد ﻛﻨﻴﺪ.
اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ: ﺣﺎل ﻛﻪ ﺑﺎ ﻣﻔﻬﻮم ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ آﺷﻨﺎ ﺷﺪﻳﺪ ،ﺑﻪ ﺑﺮرﺳﻲ آﻧﻬﺎ در ﻛﺪ و ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از آن در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وﻳـﮋوال 2005 C#ﻣـﻲ ﭘﺮدازﻳﻢ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺮﻧﺎﻣـﻪ ي ﻗـﺴﻤﺖ ﻗﺒﻠـﻲ را ﺑـﺎ اﺿـﺎﻓﻪ ﻛـﺮدن ﻳـﻚ ﻣﻨـﻮي ﻓﺮﻋـﻲ ﻣﺨـﺼﻮص ﺑـﺮاي ﻛﻨﺘﺮﻟﻬـﺎي TextBoxﻛﺎﻣﻞ ﻣﻲ ﻛﻨﻴﻢ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﻣﻨﻮي ﻓﺮﻋﻲ اﻳﺠـﺎد ﻛـﺮده و ﺑـﺮاي ﻫـﺮ دو ﻛﻨﺘـﺮل TextBoxاز آن اﺳـﺘﻔﺎده ﺧﻮاﻫﻴﻢ ﻛﺮد .اﻟﺒﺘﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ دو ﻣﻨﻮي ﻓﺮﻋﻲ اﻳﺠﺎد ﻛﺮده و در ﻫﺮ ﻳﻚ ﻣﻨﻮ ﻫﺎي ﺟﺪاﮔﺎﻧﻪ ﻗﺮار دﻫﻴﻢ ﻛﻪ ﻛﺎرﻫﺎي ﻣﺘﻔﺎوﺗﻲ را اﻧﺠﺎم دﻫﻨﺪ، ﺳﭙﺲ ﻫﺮ ﻳﻚ از آﻧﻬﺎ را ﺑﻪ ﻳﻜﻲ از TextBoxﻫﺎ ﻧﺴﺒﺖ دﻫﻴﻢ ،وﻟﻲ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎزي ﺑﻪ اﻳﻦ ﻛﺎر ﻧﻴﺴﺖ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ (1 (2 (3
(4 (5
ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻳﻚ ﻛﻨﺘﺮل ContextMenuStripدر ﻓﺮم ﻗـﺮار دﻫﻴـﺪ. اﻳﻦ ﻛﻨﺘﺮل ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮل MenuStripﺑﻪ ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﺑﺨﺶ ﻃﺮاﺣﻲ ﻓﺮم اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد. در ﭘﻨﺠﺮه Propertiesﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل ،روي دﻛﻤﻪ … ﻣﻘﺎﺑﻞ ﺧﺎﺻﻴﺖ Itemsآن ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﻨﺠـﺮه Items Collection Editorﻧﻤﺎﻳﺶ داده ﺷﻮد. در ﭘﻨﺠﺮه Items Collection Editorروي دﻛﻤﻪ ي Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗـﺎ ﻳـﻚ ﻣﻨـﻮ ﺑـﻪ ﻟﻴـﺴﺖ اﺿﺎﻓﻪ ﺷﻮد .ﺧﺎﺻﻴﺖ Nameاﻳﻦ ﻣﻨﻮ را ﺑﺮاﺑﺮ ﺑﺎ contextUndoToolStripMenuItemو ﺧﺎﺻﻴﺖ Textآن را ﻧﻴﺰ ﺑﺮاﺑﺮ ﺑﺎ Undoﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ … در ﻣﻘﺎﺑﻞ ﺧﺎﺻﻴﺖ Imageﻛﻠﻴﻚ ﻛﻨﻴﺪ و از ﭘﻨﺠـﺮه Select Resourceآﻳﻜﻮﻧﻲ را ﺑﺮاي اﻳﻦ ﻣﻨﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ. ﺣﺎل ﺑﺎﻳﺪ ﻳﻚ ﺧﻂ ﺟﺪا ﻛﻨﻨﺪه ﺑﻴﻦ ﮔﺰﻳﻨﻪ Undoو دﻳﮕﺮ ﮔﺰﻳﻨﻪ ﻫﺎ ﻗﺮار دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر از ﻟﻴﺴﺖ ﻛﻨـﺎر دﻛﻤـﻪ ،Add ﮔﺰﻳﻨﻪ Separatorرا اﻧﺘﺨﺎب ﻛﺮده و ﺑﺮ روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻳﻚ ﺟﺪا ﻛﻨﻨﺪه در اﻳﻦ ﻗﺴﻤﺖ واﻗﻊ ﺷﻮد. ﻣﺠﺪداً از ﻟﻴﺴﺖ ﺳﻤﺖ راﺳﺖ دﻛﻤﻪ Addﮔﺰﻳﻨﻪ MenuItemرا اﻧﺘﺨﺎب ﻛـﺮده و ﺳـﭙﺲ روي دﻛﻤـﻪ Addﻛﻠﻴـﻚ ﻛﻨﻴـــﺪ ﺗـــﺎ ﮔﺰﻳﻨـــﻪ دﻳﮕـــﺮي ﺑـــﻪ اﻳـــﻦ ﻣﻨـــﻮ اﺿـــﺎﻓﻪ ﺷـــﻮد .ﺧﺎﺻـــﻴﺖ Nameاﻳـــﻦ ﮔﺰﻳﻨـــﻪ را ﺑﺮاﺑـــﺮ ﺑـــﺎ contextCutToolStripMenuItemو ﺧﺎﺻﻴﺖ Textآن را Cutﻗﺮار دﻫﻴﺪ .ﺳﭙﺲ ﺑﺎ ﺗﻨﻈـﻴﻢ ﺧﺎﺻﻴﺖ Imageآن ﺑﻪ وﺳﻴﻠﻪ ﭘﻨﺠﺮه Select Resourceآﻳﻜﻮﻧﻲ را ﺑﺮاي اﻳﻦ ﻣﻨﻮ اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
٣٢١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(6
(7
(8
(9
(10
(11
(12
(13
در ﭘﻨﺠﺮه Items Collection Editorﮔﺰﻳﻨﻪ دﻳﮕﺮي را ﺑﻪ ﻣﻨﻮ اﺿﺎﻓﻪ ﻛﺮده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑﺮاﺑﺮ ﺑﺎ contextCopyToolStripMenuItemو ﺧﺎﺻـﻴﺖ Textآن را ﺑﺮاﺑـﺮ ﺑـﺎ Copyﻗـﺮار دﻫﻴﺪ .ﺳﭙﺲ آﻳﻜﻮﻧﻲ را ﺑﺮاي ﺧﺎﺻﻴﺖ Imageآن در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﺗﺎ در ﻣﻨﻮ ﻧﻤﺎﻳﺶ داده ﺷﻮد. ﻣﺠﺪداً روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﮔﺰﻳﻨﻪ دﻳﮕﺮي ﺑـﻪ ﻣﻨـﻮ اﺿـﺎﻓﻪ ﺷـﻮد .ﺧﺎﺻـﻴﺖ Nameاﻳـﻦ ﮔﺰﻳﻨـﻪ را ﺑﺮاﺑـﺮ ﺑـﺎ contextPasteToolStripMenuItemو ﺧﺎﺻﻴﺖ Textآن را ﺑﺮاﺑﺮ ﺑﺎ Pasteﻗﺮار دﻫﻴـﺪ. ﻫﻤﭽﻨﻴﻦ آﻳﻜﻮﻧﻲ را ﺑﺮاي آن در ﻗﺴﻤﺖ Imageﻣﺸﺨﺺ ﻛﻨﻴﺪ. ﺣﺎل ﺑﺎﻳﺪ ﺟﺪا ﻛﻨﻨﺪه دﻳﮕﺮي ﺑﻴﻦ ﮔﺰﻳﻨﻪ ﻫﺎي اﻳﻦ ﻗﺴﻤﺖ و ﻗﺴﻤﺖ ﺑﻌﺪي ﻣﻨﻮ ﻗﺮار دﻫـﻴﻢ .ﺑﻨـﺎﺑﺮاﻳﻦ از ﻟﻴـﺴﺖ ﺳـﻤﺖ راﺳـﺖ دﻛﻤﻪ Addﮔﺰﻳﻨﻪ Separatorرا اﻧﺘﺨﺎب ﻛﺮده و روي دﻛﻤﻪ ﻓﺮﻣﺎن Addﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﻪ ﻟﻴﺴﺖ ﻣﻨﻮ ﻫﺎ اﺿﺎﻓﻪ ﺷﻮد .ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ از اﻳﻦ ﻣﻨﻮ در ﻛﺪ اﺳﺘﻔﺎده ﻧﻤﻲ ﻛﻨﻴﻢ ،ﻧﻴـﺎزي ﻧﻴـﺴﺖ ﻛـﻪ ﺧﺎﺻـﻴﺘﻬﺎي آن را ﺗﻐﻴﻴـﺮ دﻫﻴـﺪ و ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺧﺎﺻﻴﺘﻬﺎي ﭘﻴﺶ ﻓﺮض آن را ﻗﺒﻮل ﻛﻨﻴﺪ. ﻣﺠﺪداً از ﻟﻴﺴﺖ ﺳﻤﺖ راﺳﺖ دﻛﻤﻪ ،Addﮔﺰﻳﻨﻪ MenuItemرا اﻧﺘﺨﺎب ﻛﺮده و روي دﻛﻤﻪ Addﻛﻠﻴـﻚ ﻛﻨﻴـﺪ ﺗـﺎ ﮔﺰﻳﻨـــﻪ دﻳﮕـــﺮي ﺑـــﻪ ﻟﻴـــﺴﺖ Membersاﺿـــﺎﻓﻪ ﺷـــﻮد .ﺧﺎﺻـــﻴﺖ Nameﮔﺰﻳﻨـــﻪ ﺟﺪﻳـــﺪ را ﺑﺮاﺑـــﺮ ﺑـــﺎ contextSelectAllToolStripMenuItemو ﺧﺎﺻـﻴﺖ Textآن را ﺑـﻪ Select Allﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﮔﺰﻳﻨﻪ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ آﻳﻜﻮﻧﻲ را ﺗﻌﻴﻴﻦ ﻛﻨﻴـﺪ ،ﺑﻨـﺎﺑﺮاﻳﻦ ﻣـﻲ ﺗﻮاﻧﻴـﺪ در ﭘﻨﺠـﺮه Items Collection Editorروي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﺑﺴﺘﻪ ﺷﻮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﻪ ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺮدﻳﺪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﻨﻮي ﻓﺮﻋﻲ ﻛﻪ اﻳﺠﺎد ﻛﺮده ﺑﻮدﻳﺪ در ﺑﺎﻻي ﻓﺮم ﻧﻤـﺎﻳﺶ داده ﻣـﻲ ﺷﻮد ،ﺑﺮاي ﺣﺬف آن در ﻗﺴﻤﺘﻲ از ﻓﺮم ﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﺠﺪد آن ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻛﻨﺘـﺮل ﻣﺮﺑـﻮط ﺑـﻪ آن را از ﭘـﺎﻳﻴﻦ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم اﻧﺘﺨﺎب ﻛﻨﻴﺪ. ﻛﻨﺘـــــﺮل TextBoxاول را در ﻓـــــﺮم اﻧﺘﺨـــــﺎب ﻛـــــﺮده و در ﻗـــــﺴﻤﺖ ،Propertiesﺧﺎﺻـــــﻴﺖ ContextMenuStripآن را ﺑﺮاﺑﺮ ﺑﺎ ) contextMenuStrip1ﻳﺎ ﻫﺮ ﻧﺎم دﻳﮕﺮي ﻛﻪ ﺑـﻪ ﻛﻨﺘـﺮل ﻣﺮﺑﻮط ﺑﻪ ﻣﻨﻮي ﻓﺮﻋﻲ ﻧﺴﺒﺖ داده اﻳﺪ( ﻗﺮار دﻫﻴﺪ .اﻳﻦ ﻋﻤﻞ را ﺑﺮاي ﻛﻨﺘﺮل TextBoxدوم ﻧﻴﺰ ﺗﻜﺮار ﻛﻨﻴﺪ. در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻇﺎﻫﺮ ﻣﻨﻮي ﻓﺮﻋﻲ را ﻛﻪ اﻳﺠﺎد ﻛﺮده اﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﺪ .اﻟﺒﺘﻪ ﺗﺎﻛﻨﻮن ﻫﻴﭻ ﻛﺪي ﺑﻪ اﻳﻦ ﻛﻨﺘﺮل اﺿﺎﻓﻪ ﻧﻜﺮده اﻳﺪ ،ﭘﺲ ﻫﻴﭻ ﻳﻚ از ﻛﻨﺘﺮﻟﻬﺎي آن ﻛﺎر ﻧﻤﻲ ﻛﻨﻨﺪ .ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ و ﺑﻌﺪ از ﻧﻤﺎﻳﺶ داده ﺷـﺪن ﻓـﺮم ،روي ﻛﻨﺘـﺮل TextBoxاول ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ .اﻳﻦ ﺑﺎر ﺑﻪ ﺟﺎي ﻣﻨﻮي ﻓﺮﻋﻲ ﭘﻴﺶ ﻓﺮض وﻳﻨﺪوز ،ﻣﻨﻮي ﻓﺮﻋـﻲ ﻛـﻪ ﺳـﺎﺧﺘﻪ ﺑﻮدﻳـﺪ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ 10-8ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .اﻳﻦ ﻛﺎر را ﺑﺮاي TextBoxدوم ﻧﻴﺰ ﺗﻜﺮار ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣـﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴﺪ ،ﻣﻨﻮي ﻓﺮﻋﻲ ﻳﻜﺴﺎﻧﻲ ﺑﺮاي ﻫﺮ دوي آﻧﻬﺎ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد. از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﻮﻳﺪ و ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮي ﻓﺮﻋﻲ را وارد ﻛﻨﻴﻢ .از ﭘﺎﻳﻴﻦ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ،ﻛﻨﺘﺮل contextMenuStripرا اﻧﺘﺨﺎب ﮔﺮده ﺗﺎ ﻣﻨﻮي ﻓﺮﻋﻲ ﺑﺮﻧﺎﻣـﻪ در ﺑﺎﻻي ﻓﺮم ﻧﻤﺎﻳﺶ داده ﺷﻮد .در اﻳﻦ ﻣﻨﻮ ،روي ﮔﺰﻳﻨﻪ Undoﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷﻮد، ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: (private void contextUndoToolStripMenuItem_Click )object sender, EventArgs e { // Call the undoToolStripMenuItem_Click procedure ;)undoToolStripMenuItem_Click(sender, e }
٣٢٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
10-8 ﺷﻜﻞ دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴـﻚ آنCut ( ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮﮔﺮدﻳﺪ و در ﻣﻨﻮي ﻓﺮﻋﻲ روي ﮔﺰﻳﻨﻪ14 : ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ.اﻳﺠﺎد ﺷﻮد private void contextCutToolStripMenuItem_Click( object sender, EventArgs e) { // Call the cutToolStripMenuItem_Click procedure cutToolStripMenuItem_Click(sender, e); } ﺳـﭙﺲ. در ﻣﻨﻮي ﻓﺮﻋﻲ ﻧﻴﺰ ﺗﻜﺮار ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن اﻳﺠﺎد ﺷـﻮدCopy ( ﻫﻤﻴﻦ ﻣﺮاﺣﻞ را ﺑﺮاي ﮔﺰﻳﻨﻪ15 :ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ private void contextCopyToolStripMenuItem_Click( object sender, EventArgs e) { // Call the copyToolStripMenuItem_Click procedure copyToolStripMenuItem_Click(sender, e); } ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ﻛﻠﻴﻚ آن را اﻳﺠﺎد ﻛﺮده و ﻛﺪ زﻳﺮ را در، در ﻣﻨﻮي ﻓﺮﻋﻲ ﺑﺮﻧﺎﻣﻪPaste ( ﺑﺎ دو ﺑﺎر ﻛﻠﻴﻚ روي ﮔﺰﻳﻨﻪ16 :آن وارد ﻛﻨﻴﺪ private void contextPasteToolStripMenuItem_Click( object sender, EventArgs e) { // Call the pasteToolStripMenuItem_Click procedure pasteToolStripMenuItem_Click(sender, e); }
٣٢٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(17آﺧﺮﻳﻦ ﮔﺰﻳﻨﻪ اي ﻛﻪ ﺑﺎﻳﺪ ﻛﺪ آن را ﺑﻨﻮﻳﺴﻴﺪ ،ﮔﺰﻳﻨﻪ Select Allاﺳﺖ .ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳـﺪ و روي اﻳـﻦ ﮔﺰﻳﻨﻪ در ﻣﻨﻮي ﻓﺮﻋﻲ ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﺑﺎﻻي ﻓﺮم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑـﻪ روﻳـﺪاد ﻛﻠﻴـﻚ آن اﻳﺠـﺎد ﺷـﻮد. ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: (private void contextSelectAllToolStripMenuItem_Click )object sender, EventArgs e { // Call the selectAllToolStripMenuItem_Click procedure ;)selectAllToolStripMenuItem_Click(sender, e } (18ﺗﻤﺎم ﻛﺪي ﻛﻪ ﺑﺎﻳﺪ ﺑﺮاي ﻣﻨﻮي ﻓﺮﻋﻲ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﻧﻮﺷﺘﻴﺪ ،ﻫﻤﻴﻦ ﺑﻮد .ﺳﺎده ﺑﻮد ،ﻧﻪ؟ ﺣﺎﻻ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﺑﺮﻧﺎﻣـﻪ را اﺟـﺮا ﻛﻨﻴـﺪ و ﻋﻤﻠﻜﺮد ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﻣﻨﻮي ﻓﺮﻋﻲ ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .اﻳﻦ ﮔﺰﻳﻨﻪ ﻫﺎ ﻧﻴﺰ ﻋﻤﻠﻜﺮدي ﻣﺸﺎﺑﻪ دﻛﻤﻪ ﻫﺎي ﻣﻮﺟـﻮد در ﻧﻮار اﺑﺰار و ﻳﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻧﻮار ﻣﻨﻮ دارﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻔﺎوﺗﻲ ﻧﺪارد ﻛﻪ ﺑﺮاي ﻳﻚ ﻛﺎر ﺧﺎص از ﻧﻮار اﺑﺰار ،ﻧﻮار ﻣﻨﻮ و ﻳﺎ ﻣﻨﻮي ﻓﺮﻋﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در اﻳﻦ ﺗﻤﺮﻳﻦ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﻛﻨﺘﺮل ContextMenuStripﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﻨﺘﺮل MenuStripﻛﺎر ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺗﻤﺎم وﻳﮋﮔﻲ ﻫﺎﻳﻲ ﻛﻪ در ﻛﻨﺘﺮل MenuStripوﺟﻮد دارﻧـﺪ در ﻛﻨﺘـﺮل ContextMenuStrip ﻧﻴﺰ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺎدﮔﻲ ﺑﻪ ﻃﺮاﺣﻲ ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ ﺑﭙﺮدازﻳﺪ .ﺑﻪ ﻧﺎم ﮔﺬاري ﻣﻨﻮ ﻫﺎي ﻓﺮﻋـﻲ ﻧﻴﺰ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .در اﺑﺘﺪاي ﻧﺎم ﺗﻤﺎم آﻧﻬﺎ از contextاﺳﺘﻔﺎده ﺷﺪه اﺳﺖ ﺗﺎ ﺑﻴﻦ ﮔﺰﻳﻨﻪ ﻫﺎي اﻳﻦ ﻣﻨﻮ و ﮔﺰﻳﻨـﻪ ﻫـﺎي ﻣﻨـﻮي اﺻـﻠﻲ ﺑﺮﻧﺎﻣﻪ ﺗﻔﺎوت اﻳﺠﺎد ﺷﻮد و ﺗﺸﺨﻴﺺ آﻧﻬﺎ از ﻫﻢ ﺳﺎده ﺗﺮ ﺑﺎﺷﺪ. ﻛﺪﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﮔﺰﻳﻨﻪ ﻫﺎي اﻳﻦ ﻣﻨﻮ ﻧﻮﺷﺘﻴﺪ ﻧﻴﺰ ﻧﻜﺘﻪ ﺗﺎزه اي ﻧﺪاﺷﺖ .ﻣﺘﺪ ﻣﺮﺑﻮط ﺑـﻪ ﻛﺎرﻫـﺎﻳﻲ ﻣﺎﻧﻨـﺪ ،Paste ،Copy ،Cut Select Allو ﻏﻴﺮه را در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ﻧﻮﺷﺘﻪ ﺑﻮدﻳﺪ و در اﻳﻦ ﻗﺴﻤﺖ ﻓﻘﻂ آﻧﻬﺎ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮدﻳﺪ.
ﻓﻌﺎل و ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ و دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار: ﻫﻤﻮاره ﺷﺮاﻳﻄﻲ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﺟﻮد ﻣﻲ آﻳﺪ ﻛﻪ ﻛﺎرﺑﺮ ﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻌﻀﻲ از ﻛﺎرﻫﺎي ﺧﺎص را اﻧﺠﺎم دﻫـﺪ .ﺑـﺮاي ﻣﺜـﺎل ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻣﺘﻨﻲ درون ﻛﻠﻴﭗ ﺑﺮد ﻗﺮار ﻧﮕﺮﻓﺘﻪ اﺳﺖ ﻛﺎرﺑﺮ ﻧﻤﻲ ﺗﻮاﻧﺪ آن را در TextBoxﻗﺮار دﻫﺪ و ﻳﺎ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻣﺘﻨـﻲ در ﺑﺮﻧﺎﻣـﻪ اﻧﺘﺨـﺎب ﻧﺸﺪه اﺳﺖ ﻛﺎرﺑﺮ ﻧﻤﻲ ﺗﻮاﻧﺪ آن را درون ﻛﻠﻴﭗ ﺑﺮد ﻗﺮار دﻫﺪ .در ﭼﻨﻴﻦ ﺷﺮاﻳﻄﻲ ﺑﻬﺘﺮ اﺳﺖ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ اﻣﻮر در ﻧﻮار ﻣﻨـﻮ و ﻳﺎ ﻧﻮار اﺑﺰار ﻏﻴﺮ ﻓﻌﺎل ﺑﺎﺷﻨﺪ .ﻧﺤﻮه ﻓﻌﺎل ﻛﺮدن و ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار و ﻳﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻧﻮار ﻣﻨﻮ را در ﺑﺨـﺶ اﻣﺘﺤـﺎن ﻛﻨﻴﺪ ﺑﻌﺪي ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻓﻌﺎل و ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ و دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار
٣٢٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار و ﻳﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨـﻮي،( اﺑﺘﺪا زﻳﺮﺑﺮﻧﺎﻣﻪ اي ﻣﻲ ﻧﻮﻳﺴﻴﻢ ﻛﻪ ﺑﺎ ﺑﺮرﺳﻲ ﺷﺮاﻳﻂ ﺑﺮﻧﺎﻣﻪ ﮔﺰﻳﻨﻪ ﻫﺎي ﻧﻮار ﻣﻨﻮ1 ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا اﺳﺖ آن را ﻣﺘﻮﻗﻒ ﻛﺮده و ﻛﺪ زﻳﺮ را ﺑﻪ ﻛﻼس ﺣﺎوي ﻓﺮم.ﻓﺮﻋﻲ را ﻓﻌﺎل و ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﻛﻨﺪ :ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ private void ToggleMenus() { // Declare a TextBox object and // set it to the ActiveControl TextBox objTextBox = (TextBox)this.ActiveControl; // Toggle the Undo menu items undoToolStripMenuItem.Enabled = objTextBox.CanUndo; contextUndoToolStripMenuItem.Enabled = objTextBox.CanUndo; // Toggle the Cut toolbar button and menu items if (objTextBox.SelectionLength == 0) { cutToolStripMenuItem.Enabled = false; contextCutToolStripMenuItem.Enabled = false; cutToolStripButton.Enabled = false; } else { cutToolStripMenuItem.Enabled = true; contextCutToolStripMenuItem.Enabled = true; cutToolStripButton.Enabled = true; } // Toggle the Copy toolbar button and menu items copyToolStripMenuItem.Enabled = Convert.ToBoolean(objTextBox.SelectionLength); contextCopyToolStripMenuItem.Enabled = Convert.ToBoolean(objTextBox.SelectionLength); copyToolStripButton.Enabled = Convert.ToBoolean(objTextBox.SelectionLength); // Toggle the Paste toolbar button and menu items pasteToolStripMenuItem.Enabled = Clipboard.ContainsText(); contextPasteToolStripMenuItem.Enabled = Clipboard.ContainsText(); pasteToolStripButton.Enabled = Clipboard.ContainsText(); // Toggle the Select All menu items
٣٢٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
= selectAllToolStripMenuItem.Enabled ;)(objTextBox.SelectionLength < objTextBox.Text.Length = contextSelectAllToolStripMenuItem.Enabled ;)(objTextBox.SelectionLength < objTextBox.Text.Length } (2در ﻓﺮم اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ دو TextBoxروي ﻓﺮم در ﻓﻌﺎل ﺑﻮدن و ﻳﺎ ﻧﺒﻮدن دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑﺰار و ﻳﺎ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ ﻫﺎ ﺗﺎﺛﻴﺮ دارﻧﺪ .ﭘﺲ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻣﺎوس ﺧﻮد را روي ﻳﻜﻲ از اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑـﺮد ،ﺗـﺎﺑﻊ ToggleMenus را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ ﺗﺎ ﻣﺸﺨﺺ ﺷﻮد ﻛﺪام ﻛﻨﺘﺮل ﻫﺎ ﺑﺎﻳﺪ ﻓﻌﺎل ﺑﺎﺷﻨﺪ و ﻛﺪاﻣﻴﻚ ﻧﺒﺎﻳﺪ ﻓﻌﺎل ﺑﺎﺷﻨﺪ .ﺑﺮاي اﻳـﻦ ﻛـﺎر ﺑـﻪ ﻗـﺴﻤﺖ ﻃﺮاﺣﻲ ﻓﺮم ﺑﺮوﻳﺪ و ﻛﻨﺘـﺮل TextBoxاول را اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .ﺳـﭙﺲ در ﭘﻨﺠـﺮه Propertiesروي آﻳﻜـﻮن Eventsﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻟﻴﺴﺖ روﻳﺪادﻫﺎي اﻳﻦ ﻛﻨﺘﺮل ﻧﻤﺎﻳﺶ داده ﺷﻮﻧﺪ .از اﻳـﻦ ﻟﻴـﺴﺖ ﮔﺰﻳﻨـﻪ MouseMoveرا اﻧﺘﺨﺎب ﻛﺮده و روي آن دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ روﻳﺪاد اﻳﺠﺎد ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: private void textBox1_MouseMove(object sender, )MouseEventArgs e { // Toggle the menu items and toolbar buttons ;)(ToggleMenus } (3ﻣﺮاﺣﻞ ﻗﺒﻠﻲ را ﺑﺮاي ﻛﻨﺘﺮل TextBoxدوم ﻧﻴﺰ اﺟﺮا ﻛﻨﻴﺪ و ﻛﺪ زﻳﺮ را در ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد MouseMoveآن وارد ﻛﻨﻴﺪ: private void textBox2_MouseMove(object sender, )MouseEventArgs e { // Toggle the menu items and toolbar buttons ;)(ToggleMenus } (4ﺣﺎل ﻣﺠﺪداً ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و ﻣﺘﻨﻲ را درون TextBoxاول وارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي آن ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ ﺗﺎ ﻣﻨـﻮي ﻓﺮﻋﻲ آن ﻧﻤﺎﻳﺶ داده ﺷﻮد .ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻓﻘﻂ ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﺎﺳﺐ ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﻫﺴﺘﻨﺪ و دﻳﮕﺮ ﮔﺰﻳﻨﻪ ﻫﺎ ﻏﻴﺮ ﻓﻌـﺎل ﺷﺪه اﻧﺪ )ﺷﻜﻞ .(11-8
٣٢٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 11-8
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اوﻟﻴﻦ ﻛﺎري ﻛﻪ در زﻳﺮﺑﺮﻧﺎﻣﻪ ToggleMenusاﻧﺠﺎم دﻫﻴﻢ ،اﻳﻦ اﺳﺖ ﻛﻪ ﻛﻨﺘﺮل ﻓﻌﺎل را در ﻓﺮم ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻣـﻮرد ﻣﻲ ﺗﻮاﻧﻴﻢ روﺷﻲ را ﻛﻪ در ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﺮدﻳﻢ ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﻢ. // Declare a TextBox object and // set it to the ActiveControl ;TextBox objTextBox = (TextBox)this.ActiveControl اوﻟﻴﻦ ﮔﺰﻳﻨﻪ ي ﻣﻨﻮي ،Editﮔﺰﻳﻨﻪ Undoاﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ اﻳﻦ ﮔﺰﻳﻨﻪ ﺷﺮوع ﻣﻲ ﻛﻨﻴﻢ .ﻛﻼس TextBoxداراي ﺧﺎﺻـﻴﺘﻲ ﺑﻪ ﻧﺎم CanUndoاﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻣﻲ ﺗﻮان آﺧﺮﻳﻦ ﻋﻤﻞ اﻧﺠﺎم ﺷﺪه در آن TextBoxرا ﻟﻐﻮ ﻛﺮد ﻳﺎ ﻧﻪ؟ ﻣﻘـﺪار ﺑﺮﮔﺸﺘﻲ اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ Trueو ﻳﺎ Falseﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ آن را ﺑﻪ ﻃـﻮر ﻣـﺴﺘﻘﻴﻢ در ﺧﺎﺻـﻴﺖ Enabled ﮔﺰﻳﻨﻪ Undoﻗﺮار دﻫﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ آﺧﺮﻳﻦ ﻋﻤﻞ اﻧﺠﺎم ﺷﺪه در TextBoxﻗﺎﺑﻞ ﺑﺮﮔﺸﺖ ﺑﺎﺷﺪ ،ﺧﺎﺻﻴﺖ Enabled آن ﺑﺮاﺑﺮ ﺑﺎ Trueﺧﻮاﻫﺪ ﺷﺪ و در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺮاﺑﺮ ﺑﺎ Falseﺧﻮاﻫﺪ ﺑﻮد. // Toggle the Undo menu items ;undoToolStripMenuItem.Enabled = objTextBox.CanUndo = contextUndoToolStripMenuItem.Enabled ;objTextBox.CanUndo ﮔﺰﻳﻨﻪ ﺑﻌﺪي در ﻣﻨﻮي ،Editﮔﺰﻳﻨﻪ Cutاﺳﺖ .ﺑـﺮاي ﺗﻌﻴـﻴﻦ ﻓﻌـﺎل ﻳـﺎ ﻏﻴـﺮ ﻓﻌـﺎل ﺑـﻮدن اﻳـﻦ ﮔﺰﻳﻨـﻪ ﻣـﻲ ﺗـﻮاﻧﻴﻢ از ﺧﺎﺻـﻴﺖ SelectionLengthﻛﻼس TextBoxاﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻣﻘﺪاري از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﻛﻪ ﻣـﺸﺨﺺ ﻛﻨﻨـﺪه ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎي اﻧﺘﺨﺎب ﺷﺪه در TextBoxاﺳﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .اﮔـﺮ ﻣﻘـﺪار اﻳـﻦ ﺧﺎﺻـﻴﺖ ﺑﺮاﺑـﺮ ﺑـﺎ 0ﺑـﻮد ﻳﻌﻨـﻲ ﻣﺘﻨـﻲ در TextBoxاﻧﺘﺨﺎب ﻧﺸﺪه اﺳﺖ ،ﭘﺲ ﻧﻤﻲ ﺗﻮان آن را Cutﻛﺮد .در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎﻳﺪ ﮔﺰﻳﻨﻪ Cutرا در ﻧﻮار ﻣﻨﻮ ،ﻧﻮار اﺑﺰار و ﻣﻨﻮي ﻓﺮﻋﻲ ﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﻢ:
٣٢٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Toggle the Cut toolbar button and menu items )if (objTextBox.SelectionLength == 0 { ;cutToolStripMenuItem.Enabled = false ;contextCutToolStripMenuItem.Enabled = false ;cutToolStripButton.Enabled = false } else { ;cutToolStripMenuItem.Enabled = true ;contextCutToolStripMenuItem.Enabled = true ;cutToolStripButton.Enabled = true } ﺑﻌﺪ از اﻳﻦ ﮔﺰﻳﻨﻪ ،ﮔﺰﻳﻨﻪ Copyرا از ﻣﻨﻮي Editﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﮔﺰﻳﻨﻪ ﻧﻴﺰ ﻣﺎﻧﻨﺪ ،Cutﻫﻨﮕﺎﻣﻲ ﻗﺎﺑﻞ اﻧﺘﺨﺎب اﺳـﺖ ﻛـﻪ ﻣﺘﻨﻲ در TextBoxاﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﺗﻌﻴﻴﻦ ﻓﻌﺎل ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن آن ﻣﻲ ﺗﻮاﻧﻴﻢ ﻫﻤﺎﻧﻨﺪ ﮔﺰﻳﻨﻪ Cutار ﺑﺮرﺳﻲ ﺧﺎﺻﻴﺖ SelectionLengthاﺳﺘﻔﺎده ﻛﻨﻴﻢ .روش دﻳﮕﺮي ﻛﻪ ﻣﻲ ﺗﻮان در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻛﺎر ﺑﺮد ،ﺗﺒﺪﻳﻞ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ SelectionLengthﺑﻪ ﻧﻮع Booleanاﺳﺖ .ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻧﻮع داده اي ﺑﻪ ﻧﻮع داده اي دﻳﮕﺮ ﻣﻲ ﺗﻮاﻧﻴﻢ از ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ﻛﻼس Convertاﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﻳﻜﻲ از اﻳﻦ ﺗﻮاﺑﻊ ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ ﻣﻘﺪار intﺑـﻪ Booleanﺑـﻪ ﻛـﺎر ﻣﻲ رود .اﮔﺮ ﻋﺪد ﺻﺤﻴﺤﻲ ﻛﻪ ﺑﻪ اﻳﻦ ﺗﺎﺑﻊ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﺗﺎ ﺗﺒﺪﻳﻞ ﺷﻮد ،ﺑﺮاﺑﺮ ﺑـﺎ ﺻـﻔﺮ ﺑﺎﺷـﺪ ﻣﻘـﺪار ﺑﺮﮔـﺸﺘﻲ اﻳـﻦ ﺗـﺎﺑﻊ ﺑﺮاﺑـﺮ ﺑـﺎ Falseﺧﻮاﻫﺪ ﺑﻮد در ﻏﻴﺮ اﻳﻦ ﺻﻮرت اﻳـﻦ ﺗـﺎﺑﻊ ﻣﻘـﺪار Trueرا ﺑﺮﻣـﻲ ﮔﺮداﻧـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ در اﻳﻨﺠـﺎ ﻧﻴـﺰ اﮔـﺮ ﻣﻘـﺪار ﺧﺎﺻـﻴﺖ SelectionLengthﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺑﺎﺷﺪ ،ﺗﺎﺑﻊ ﻣﻘﺪار Falseرا ﺑﺮﮔﺮداﻧﺪه و ﺑﺎﻋﺚ ﻏﻴﺮﻓﻌﺎل ﺷـﺪن ﮔﺰﻳﻨـﻪ Copyﻣـﻲ ﺷﻮد .در ﺻﻮرﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻣﺘﻨﻲ را در TextBoxاﻧﺘﺨﺎب ﻛﺮده ﺑﺎﺷﺪ ،ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ ﻋﺪدي ﺑﻪ ﺟﺰ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑـﻮد .در ﻧﺘﻴﺠﻪ ﺗﺎﺑﻊ ﻣﻘﺪار Trueرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﮔﺰﻳﻨﻪ Copyﻓﻌﺎل ﺷﻮد. ﻧﻜﺘﻪ :ﺗﺎﺑﻊ ToBooleanاز ﻛﻼس ،Convertﻓﻘﻂ ﺑﺎزاي ﻋﺪد ﺻﺤﻴﺢ ﺻﻔﺮ ﻣﻘﺪار Falseﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﻫﺮ ﭘـﺎراﻣﺘﺮي ﺑﻪ ﺟﺰ ﺻﻔﺮ ،ﭼﻪ ﻣﻘﺪار ﻣﺜﺒﺖ ﺑﺎﺷﺪ و ﭼﻪ ﻣﻨﻔﻲ ،ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺪار Trueرا ﺑﺮﮔﺮداﻧﺪ. ﻧﻜﺘﻪ :از ﻟﺤﺎظ ﺳﺮﻋﺖ ،اﻳﻦ روش ﺑﺎ روﺷﻲ ﻛﻪ در ﻣﻮرد ﮔﺰﻳﻨﻪ Cutاﺳﺘﻔﺎده ﻛﺮدﻳﻢ ﺗﻔﺎوت زﻳﺎدي ﻧـﺪارد و ﺗﻨﻬـﺎ ﻣﺰﻳـﺖ روش دوم در ﻛﻮﺗﺎه ﺗﺮ ﺑﻮدن آن اﺳﺖ .اﻟﺒﺘﻪ در روش دوم ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﺮاي اﻓﺰاﻳﺶ ﺳﺮﻋﺖ اﺟـﺮاي ﻛـﺪ ،اﺑﺘـﺪا ﻣﺘﻐﻴـﺮي را از ﻧـﻮع Boolean ﺗﻌﺮﻳﻒ ﻛﺮده و ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ از ﺗﺎﺑﻊ Convert.ToBooleanرا در آن ﻗﺮار دﻫﻴﻢ .ﺳﭙﺲ ﻣﻘـﺪار اﻳـﻦ ﻣﺘﻐﻴﻴـﺮ را ﺑـﻪ ﺳـﻪ ﺧﺎﺻﻴﺖ ﻣﻮرد ﻧﻈﺮ ﻧﺴﺒﺖ دﻫﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻓﻘﻂ ﻳﻚ ﺑﺎر ﺗﺎﺑﻊ Convert.ToBooleanرا ﻓﺮاﺧﻮاﻧﻲ ﺧـﻮاﻫﻴﻢ ﻛـﺮد و از ﻓﺮاﺧﻮاﻧﻲ ﺑﻲ ﻣﻮرد اﻳﻦ ﺗﺎﺑﻊ ﻧﻴﺰ ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﺷﻮد. // Toggle the Copy toolbar button and menu items = copyToolStripMenuItem.Enabled ;)Convert.ToBoolean(objTextBox.SelectionLength = contextCopyToolStripMenuItem.Enabled ;)Convert.ToBoolean(objTextBox.SelectionLength
٣٢٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
= copyToolStripButton.Enabled ;)Convert.ToBoolean(objTextBox.SelectionLength ﮔﺰﻳﻨﻪ ﺑﻌﺪي در ﻣﻨﻮي ،Editﮔﺰﻳﻨﻪ Pasteاﺳﺖ .روش ﺗﻌﻴﻴﻦ ﻓﻌﺎل و ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺎ ﮔﺰﻳﻨﻪ ﻫﺎي دﻳﮕﺮ ﻣﻘﺪاري ﻣﺘﻔﺎوت اﺳﺖ .در اﻳﻦ ﻣﻮرد ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ﻛﻪ آﻳﺎ ﻣﺘﻨﻲ در داﺧﻞ ﻛﻠﻴﭗ ﺑﻮرد ﻗﺮار دارد ﻳﺎ ﻧﻪ؟ ﺑﺮاي ﺗﺸﺨﻴﺺ اﻳﻦ ﻣﻮرد ﻧﻴﺰ ﻣﻲ ﺗـﻮاﻧﻴﻢ از ﻣﺘﺪ ContainsTextدر ﻛﻼس Clipboardاﺳـﺘﻔﺎده ﻛﻨـﻴﻢ .ﻛـﻼس Clipboardﺟﺰﺋـﻲ از ﻓـﻀﺎي ﻧـﺎم System.Windows.Formsاﺳﺖ ﻛﻪ ﺑﻪ ﻃﻮر اﺗﻮﻣﺎﺗﻴﻚ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑـﺪون ﻣـﺸﺨﺺ ﻛﺮدن ﻓﻀﺎي ﻧﺎم آن ،از اﻳﻦ ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻴﻢ .ﺗﺎﺑﻊ ContainsTextﻣﻘﺪاري را از ﻧﻮع Booleanﺑﺮﻣﻲ ﮔﺮداﻧـﺪ ﻛـﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آﻳﺎ ﻣﺘﻨﻲ در ﻛﻠﻴﭗ ﺑﻮرد ﻗﺮار دارد ﻳﺎ ﻧﻪ؟در ﺻﻮرت وﺟﻮد ﻣﺘﻦ در ﻛﻠﻴﭗ ﺑﻮرد اﻳﻦ ﺗﺎﺑﻊ ﻣﻘﺪار Trueرا ﺑﺮﻣﻲ ﮔﺮداﻧـﺪ، ﻛﻪ ﺑﺎ ﻧﺴﺒﺖ دادن آن ﺑﻪ ﺧﺎﺻﻴﺖ Enabledاز ﮔﺰﻳﻨﻪ Pasteﺑﺎﻋﺚ ﻓﻌﺎل ﺷﺪن اﻳﻦ ﮔﺰﻳﻨﻪ ﻣﻲ ﺷﻮﻳﻢ .در ﺻـﻮرﺗﻲ ﻛـﻪ ﻣﺘﻨـﻲ وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ ﻫﻢ اﻳﻦ ﺗﺎﺑﻊ ﺑﺎ ﺑﺮﮔﺮداﻧﺪن ﻣﻘﺪار Falseﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﮔﺰﻳﻨﻪ Pasteﻏﻴﺮ ﻓﻌﺎل ﺷﻮد. // Toggle the Paste toolbar button and menu items = pasteToolStripMenuItem.Enabled ;)(Clipboard.ContainsText = contextPasteToolStripMenuItem.Enabled ;)(Clipboard.ContainsText = pasteToolStripButton.Enabled ;)(Clipboard.ContainsText ﮔﺰﻳﻨﻪ آﺧﺮي ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﻴﺮد ،ﮔﺰﻳﻨﻪ Select Allاﺳﺖ .اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺎﻳﺪ ﻫﻨﮕﺎﻣﻲ ﻓﻌﺎل ﺑﺎﺷﺪ ﻛﻪ ﺗﻤﺎم ﻣﺘﻦ داﺧﻞ ﻳﻚ TextBoxاﻧﺘﺨﺎب ﻧﺸﺪه ﺑﺎﺷﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺎﻳﺪ اﻳﻦ ﮔﺰﻳﻨﻪ ﻏﻴﺮ ﻓﻌﺎل ﺑﺎﺷﺪ .ﺑﺮاي ﺑﺮرﺳﻲ اﻳﻨﻜـﻪ ﺗﻤـﺎم ﻣﺘﻦ داﺧﻞ ﻳﻚ TextBoxاﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ ﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ SelectionLengthرا ﺑـﺎ ﻃـﻮل ﻣـﺘﻦ ﻣﻘﺎﻳﺴﻪ ﻣﻲ ﻛﻨﻴﻢ .اﮔﺮ ﻃﻮل ﻣﺘﻦ ﺑﺰرﮔﺘﺮ از ﻣﻘﺪار اﻧﺘﺨﺎب ﺷﺪه از ﻣﺘﻦ ﺑﻮد ،ﻳﻌﻨﻲ ﺑﺨﺸﻲ از ﻣﺘﻦ اﻧﺘﺨﺎب ﺷﺪه اﺳـﺖ .در اﻳـﻦ ﺣﺎﻟـﺖ ﻣـﻲ ﺗﻮاﻧﻴﻢ ﮔﺰﻳﻨﻪ Select Allرا ﻓﻌﺎل ﻛﻨﻴﻢ. // Toggle the Select All menu items = selectAllToolStripMenuItem.Enabled ;)(objTextBox.SelectionLength < objTextBox.Text.Length = contextSelectAllToolStripMenuItem.Enabled ;)(objTextBox.SelectionLength < objTextBox.Text.Length ﺑﺮاي ﻓﻌﺎل و ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﻛﺮدن ﮔﺰﻳﻨﻪ ﻫﺎي ﻧﻮار ﻣﻨﻮ و ﻳﺎ ﻧﻮار اﺑﺰار ،ﺑﺎﻳﺪ اﻳﻦ زﻳﺮﺑﺮﻧﺎﻣﻪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .ﺑﻬﺘﺮﻳﻦ ﻣﻜﺎن ﺑـﺮاي ﻓﺮاﺧـﻮاﻧﻲ اﻳﻦ ﺗﺎﺑﻊ ،درون روﻳﺪاد MouseMoveﻛﻨﺘﺮل TextBoxاﺳﺖ .اﻳﻦ روﻳﺪاد ﻫﻨﮕﺎﻣﻲ رخ ﻣﻲ دﻫﺪ ﻛـﻪ ﻣـﺎوس از روي ﻛﻨﺘـﺮل ﻋﺒﻮر ﻛﻨﺪ ،ﻛﻪ در اﻳﻦ ﺣﺎﻟﺖ ﻣﻲ ﺗﻮان ﺣﺪس زد ﻣﻤﻜﻦ اﺳﺖ ﻛﺎرﺑﺮ ﺑﺨﻮاﻫﺪ روي TextBoxﻛﻠﻴﻚ )و ﻳـﺎ ﻛﻠﻴـﻚ راﺳـﺖ( ﻛـﺮده و ﮔﺰﻳﻨﻪ اي را اﻧﺘﺨﺎب ﻛﻨﺪ. private void textBox1_MouseMove(object sender, )MouseEventArgs e { // Toggle the menu items and toolbar buttons
٣٢٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)(ToggleMenus }
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ در ﻃﻲ ﭼﻨﺪﻳﻦ ﺗﻤﺮﻳﻦ ﻛﺎرﺑﺮدي و ﺑﺎ اﺳﺘﻔﺎده از ﭼﻨﺪ ﻣﺜﺎل ﺑﺎ ﻧﺤﻮه اﺳﺘﻔﺎده از ﻣﻨﻮ ﻫﺎ ،زﻳﺮﻣﻨﻮ ﻫﺎ و ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در آن آﺷﻨﺎ ﺷﺪﻳﻢ .ﻫﻤﭽﻨﻴﻦ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان از ﭼﻨﺪ ﻧﻮار اﺑﺰار در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﺮد ،ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ اﻳﻦ ﻣـﻮرد ﻣـﺪﻧﻈﺮ اﻳـﻦ ﻓﺼﻞ ﻧﺒﻮده اﺳﺖ .ﻋﻼوه ﺑﺮ اﻳﻦ آﻣﻮﺧﺘﻴﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﺮاي ﻣﻨﻮ ﻫﺎ ﻛﻠﻴﺪﻫﺎي دﺳﺘﺮﺳﻲ ،ﺷﻮرت ﻛﺎت و ﻳﺎ آﻳﻜﻮن ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ. در ﻃﻲ اﻳﺠﺎد ﻧﻮار اﺑﺰار ،Editﺑﺎ ﻧﺤﻮه ﻛﺎرﺑﺮد ﺗﻜﻨﻴﻜﻬﺎي اﺑﺘﺪاﻳﻲ وﻳﺮاﻳﺶ ﻣﺘﻦ ﺑـﻪ وﺳـﻴﻠﻪ ﺗﻮاﺑـﻊ دروﻧـﻲ ﻛـﻼس TextBoxو ﻛﻼس Clipboardآﺷﻨﺎ ﺷﺪﻳﺪ و ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﺑﻪ ﺳﺎدﮔﻲ ﻣﻲ ﺗﻮان اﻳﻦ وﻳﮋﮔﻲ ﻫﺎ را ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﺮد – وﻳﮋﮔﻴﻬـﺎﻳﻲ ﻛﻪ ﻛﺎرﺑﺮ از ﻫﺮ ﺑﺮﻧﺎﻣﻪ وﻳﻨﺪوزي اﻧﺘﻈﺎر دارد. ﻫﻤﭽﻨﻴﻦ ﺑﺎ ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ ﻛﻪ وﻳﻨﺪوز ﺑﻪ ﻃﻮر ﭘﻴﺶ ﻓﺮض ﺑﺮاي ﻛﻨﺘﺮل ﻫﺎ ﻗﺮار ﻣـﻲ دﻫـﺪ و ﻧﻴـﺰ ﭼﮕـﻮﻧﮕﻲ اﻳﺠـﺎد ﻣﻨـﻮ ﻫـﺎي ﻓﺮﻋـﻲ ﻣﺨﺼﻮص ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺧﻮدﺗﺎن آﺷﻨﺎ ﺷﺪﻳﺪ. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل MenuStripﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﻣﻨﻮ و زﻳﺮﻣﻨﻮ اﺿﺎﻓﻪ ﻛﻨﻴﺪ. در ﻛﻨﺎر ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻣﻨﻮي ﺑﺮﻧﺎﻣﻪ ﻋﻼﻣﺖ ﺗﻴﻚ ﻗﺮار دﻫﻴﺪ. ﺑﻪ ﻣﻨﻮ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﺷﻮرت ﻛﺎت و ﻛﻠﻴﺪ دﺳﺘﺮﺳﻲ اﺧﺘﺼﺎص دﻫﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﻛﻨﺘﺮل ContextMenuStripﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﻮد ﻣﻨﻮ ﻫﺎي ﻓﺮﻋﻲ اﻳﺠﺎد ﻛﻨﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮﺟﻮد در ﻛﻼس ،TextBoxﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻨﻮ ﻫﺎ را در ﺻﻮرت ﻟﺰوم ﻓﻌﺎل و ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﻛﻨﻴﺪ.
ﺗﻤﺮﻳﻦ: ﺑﺮاي اﻳﻨﻜﻪ ﻇﺎﻫﺮ ﺑﺮﻧﺎﻣـﻪ اي ﻛـﻪ در اﻳـﻦ ﻓـﺼﻞ اﻳﺠـﺎد ﻛﺮدﻳـﺪ ﺑﻴـﺸﺘﺮ ﻣـﺸﺎﺑﻪ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي وﻳﻨـﺪوزي ﺑﺎﺷـﺪ ،ﺑـﺎ اﺳـﺘﻔﺎده از ﻛﻨﺘـﺮل StatusStripﻳﻚ ﻧﻮار اﺑﺰار ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ و ﻛﺪي را ﺑﺮاي آن ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﻫﻨﮕﺎم اﻧﺠﺎم دادن اﻋﻤـﺎﻟﻲ ﻣﺎﻧﻨـﺪ ،Cut Paste ،Copyو … ﻣﺘﻦ ﻣﻨﺎﺳﺒﻲ ﺑﺮاي ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ داده ﺷﻮد.
٣٣٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ ﻧﻬﻢ :ﺳﺎﺧﺘﻦ اﺷﻴﺎ از زﻣﺎﻧﻲ ﻛﻪ ﺑﺎ ﻛﺎﻣﭙﻴﻮﺗﺮ آﺷﻨﺎ ﺷﺪﻳﺪ ﺗﺎﻛﻨﻮن ﻣﻤﻜﻦ اﺳﺖ واژه ﺷﻴﺊ ﮔﺮاﻳﻲ را زﻳﺎد ﺷﻨﻴﺪه ﺑﺎﺷﻴﺪ .ﻣﻤﻜﻦ اﺳـﺖ ﺷـﻨﻴﺪه ﺑﺎﺷـﻴﺪ ﻛـﻪ اﻳـﻦ ﻣﺒﺤﺚ ،ﻳﻜﻲ از ﻣﺒﺎﺣﺚ ﺳﺨﺖ و ﻏﻴﺮ ﻗﺎﺑﻞ درك ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ .در ﺳﺎﻟﻬﺎي اول ﻛﻪ اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ وﺟﻮد آﻣﺪه ﺑـﻮد اﻳـﻦ ﮔﻔﺘﻪ ﺻﺤﺖ داﺷﺖ ،اﻣﺎ زﺑﺎﻧﻬﺎ و اﺑﺰارﻫﺎي ﻣﺪرن اﻣﺮوزي ﺑﺎﻋﺚ ﺷﺪه اﻧﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﺑـﻪ ﻣﺒﺤﺜـﻲ ﺑـﺴﻴﺎر ﺳـﺎده ﺗﺒـﺪﻳﻞ ﺷـﻮد. ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﻣﻨﺎﻓﻊ زﻳﺎدي را ﺑﺮاي ﺗﻮﺳﻌﻪ ﮔﺮان ﻧﺮم اﻓﺰاري 1دارد ،ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺎﻧﻨﺪ C# ،C++و وﻳﮋوال ﺑﻴﺴﻴﻚ و … ﺳﻌﻲ ﻛﺮده اﻧﺪ ﺑﻪ ﻧﺤﻮي رﺷﺪ ﻛﻨﻨﺪ ﻛﻪ ﺑﻪ ﺳﺎده ﮔﻲ ﺑﺘﻮان ﺑﻪ وﺳﻴﻠﻪ آﻧﻬﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺷﻴﺊ ﮔـﺮا را ﻃﺮاﺣـﻲ و ﭘﻴـﺎده ﺳﺎزي ﻛﺮد. در ﺑﻴﺸﺘﺮ ﻓﺼﻠﻬﺎي اﻳﻦ ﻛﺘﺎب از اﺷﻴﺎ و ﻛﻼﺳﻬﺎ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ ،اﻣﺎ در اﻳﻦ ﻓﺼﻞ ﺑﺮ ﻣﺒﺤﺚ ﺷﻴﺊ ﮔﺮاﻳﻲ ﺗﻤﺮﻛﺰ ﺧﻮاﻫﻴﻢ ﻛﺮد و آن را ﺑﻪ ﺗﻔﺼﻴﻞ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﺧﻮاﻫﻴﻢ داد .ﻫﻤﭽﻨﻴﻦ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﺑﺮ ﭘﺎﻳﻪ ﺗﺠﺮﺑﻴﺎت و آﻣﻮﺧﺘﻪ ﻫﺎﻳﻲ ﻛﻪ در ﻓﺼﻠﻬﺎي ﻗﺒﻞ از ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳـﺴﻲ ﺑﺪﺳﺖ آورده اﻳﺪ و ﻣﻮاردي ﻛﻪ در اﻳﻦ ﻓﺼﻞ ﻣﻲ آﻣﻮزﻳﺪ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺟﺎﻟﺒﻲ را ﺑﺎ وﻳﮋوال C#اﻳﺠﺎد ﻛﻨﻴﻢ. در اﻳﻦ ﻓﺼﻞ:
ﺑﺎ ﻧﺤﻮه ي ﺳﺎﺧﺘﻦ ﻳﻚ ﻛﻼس ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﺎ ﭼﻨﺪﻳﻦ ﻣﺘﺪ و ﺧﺎﺻﻴﺖ ﮔﻮﻧﺎﮔﻮن آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. ﺑﺎ ﻣﻔﻬﻮم ارث ﺑﺮدن ﻳﻚ ﻛﻼس از ﻛﻼﺳﻲ ﻛﻪ ﻗﺒﻼً اﻳﺠﺎد ﻛﺮده اﻳﺪ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﭼﮕﻮﻧﮕﻲ ﺗﻐﻴﻴﺮ دادن ﻣﺘﺪﻫﺎي ﻛﻼس ﭘﺎﻳﻪ در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﻓﻀﺎي ﻧﺎم را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﻣﻔﻬﻮم اﺷﻴﺎ: ﻳﻚ ﺷﻴﺊ در دﻧﻴﺎي واﻗﻌﻲ ،اﻏﻠﺐ ﻫﺮ ﭼﻴﺰي اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﻴﺪ ﺗﺼﻮر ﻛﻨﻴﺪ .ﻣﻌﻤﻮﻻً در ﺗﻤﺎم ﻃﻮل روز در ﺣﺎل ﻛﺎر ﻛﺮدن ﺑﺎ اﺷﻴﺎي ﻓﻴﺰﻳﻜـﻲ ﻣﺎﻧﻨﺪ ﺗﻠﻮﻳﺰﻳﻮﻧﻬﺎ ،اﺗﻮﻣﺒﻴﻠﻬﺎ ،ﻣﺸﺘﺮﻛﻴﻦ ،2ﮔﺰارﺷﺎت ،ﻻﻣﭗ ﻫﺎ و ﻳﺎ ﻫﺮ ﭼﻴﺰ دﻳﮕﺮي ﻫﺴﺘﻴﺪ .در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﻧﻴﺰ ،ﻳﻚ ﺷﻴﺊ ﻣـﺸﺨﺺ ﻛﻨﻨـﺪه ﻫﺮ ﭼﻴﺰي اﺳﺖ ﻛﻪ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺑﻴﻨﻴﺪ و ﻳﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺎن از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮم ﺑﺮﻧﺎﻣﻪ ،دﻛﻤﻪ ﻫﺎي ﻧﻮار اﺑـﺰار، ﮔﺰﻳﻨﻪ ﻫﺎي ﻣﻮﺟﻮد در ﻣﻨﻮ ﻫﺎ و ...ﻫﻤﻪ ﻧﻤﻮﻧﻪ ﻫﺎﻳﻲ از اﺷﻴﺎ در ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫﺴﺘﻨﺪ .اﺷﻴﺎي دﻳﮕﺮي ﻧﻴﺰ در ﻛﺎﻣﭙﻴﻮﺗﺮ وﺟـﻮد دارﻧـﺪ ﻛـﻪ ﻧﻤـﻮد ﻇﺎﻫﺮي ﻧﺪارﻧﺪ ،اﻣﺎ در ﺑﺨﺸﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ ﻣﺎﻧﻨﺪ ﺷﻴﺊ ﺑﺮاي ﻛﻨﺘﺮل ﻛﺎرﺑﺮان ﻳﻚ ﺑﺮﻧﺎﻣﻪ .ﻛﺎرﺑﺮ ﺑﺮﻧﺎﻣﻪ ﭼﻨﻴﻦ ﺷـﻴﺊ را در ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲ ﺑﻴﻨﺪ اﻣﺎ در ﻃﻮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اﻳﻦ ﺷﻴﺊ وﺟﻮد دارد و وﻇﺎﻳﻒ ﺧﻮد را اﻧﺠﺎم ﻣﻲ دﻫﺪ. ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ در ﻗﺴﻤﺘﻲ از ﺑﺮﻧﺎﻣﻪ ﺑﺮاي ﻳﻜﻲ از ﻛﺎرﺑﺮان ،ﺻﻮرت ﺣﺴﺎب ﺻﺎدر ﻛﻨﻴﺪ .در اﻳﻦ ﺻـﻮرت ﺑﺎﻳـﺪ در ﺑﺮﻧﺎﻣـﻪ ي ﺧـﻮد ﻳﻚ ﺷﻴﺊ ﺑﺮاي ﻧﺸﺎن دادن ﺻﻮرت ﺣﺴﺎب و ﻳﻚ ﺷﻴﺊ ﻧﻴﺰ ﺑﺮاي ﻧﺸﺎن دادن ﻛﺎرﺑﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ .ﻓـﺮض ﻛﻨﻴـﺪ Customerﺷـﻴﺊ ﻣﺮﺑﻮط ﺑﻪ ﻛﺎرﺑﺮ و Billﺷﻴﺊ ﻣﺮﺑﻮط ﺑﻪ ﺻﻮرت ﺣﺴﺎب ﺑﺎﺷﺪ .ﺷﻴﺊ Customerداراي ﺧﺼﻮﺻﻴﺖ ﻫﺎ اﻳـﻲ ﻣﺎﻧﻨـﺪ ﻧـﺎم ،آدرس، ﺗﻠﻔﻦ و … اﺳﺖ ﻛﻪ ﻫﺮ ﻛﺎرﺑﺮ داراﺳﺖ .ﺑﻪ ﻋﻼوه ،اﻳﻦ ﺷﻴﺊ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﺪ ﻳﻚ ﺻﻮرت ﺣﺴﺎب ﺑﺮاي ﺧﻮد اﻳﺠﺎد ﻛﻨﺪ و ﻣﻲ داﻧﻴﺪ ﻛـﻪ در اﻳـﻦ ﺑﺮﻧﺎﻣﻪ ،ﺻﻮرت ﺣﺴﺎب ﻫﺎ را ﺑﺎ ﺷﻴﺊ اي از ﻧﻮع Billﻧﺸﺎن ﻣﻲ دﻫﻴﻢ .ﭘﺲ در واﻗﻊ ﻣـﻲ ﺗـﻮان ﮔﻔـﺖ ﺷـﻴﺊ Customerﺑﺎﻳـﺪ ﺑﺘﻮاﻧﺪ ﻳﻚ ﺷﻴﺊ از ﻧﻮع Billاﻳﺠﺎد ﻛﻨﺪ ﻛﻪ ﺻﻮرت ﺣﺴﺎب ﻛﺎرﺑﺮ را ﻧﺸﺎن دﻫﺪ.
1ﻣﻨﻈﻮر از ﺗﻮﺳﻌﻪ ﮔﺮان ﻧﺮم اﻓﺰاري ،اﻓﺮادي اﺳﺖ ﻛﻪ در زﻣﻴﻨﻪ ي ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ي ﻧﺮم اﻓﺰار ﻓﻌﺎﻟﻴﺖ دارﻧﺪ ﻣﺎﻧﻨﺪ ﻃﺮاﺣﺎن ﻧﺮم اﻓﺰار ،ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن و .... 2ﺷﺎﻳﺪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺗﻌﺮﻳﻒ ﺷﻴﺊ ،ﻳﻚ ﻣﺸﺘﺮك را ﻧﺘﻮان ﻳﻚ ﺷﻴﺊ ﻣﺤﺴﻮب ﻛﺮد .اﻣﺎ در اﻳﻨﺠﺎ ﻓﺮض ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻫﺮ ﭼﻴـﺰي ﻛـﻪ در دﻧﻴـﺎي واﻗﻌـﻲ وﺟـﻮد دارد ﻳـﻚ ﺷﻴﺊ اﺳﺖ.
٣٣١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻴﺊ Billﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﺟﺰﺋﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﺻﻮرت ﺣﺴﺎب را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ و ﻧﻴﺰ اﻣﻮر ﻣﺮﺑﻮط ﺑﻪ آن را اﻧﺠﺎم دﻫﺪ .ﺑﺮاي ﻣﺜﺎل اﻳﻦ ﺷﻴﺊ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﺪ ﺻﻮرت ﺣﺴﺎب اﻳﺠﺎد ﺷﺪه را ﭼﺎپ ﻛﻨﺪ. اﻣﺎ ﻧﻜﺘﻪ ﻣﻬﻢ و ﻗﺎﺑﻞ ﺗﻮﺟﻪ در اﻳﻨﺠﺎ اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ اﺷﻴﺎ ﺑﺎﻳﺪ ﻫﻮﺷﻤﻨﺪي ﻻزم ﺑﺮاي اﻧﺠﺎم ﺗﻤﺎم ﻛﺎرﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﺧﻮدﺷـﺎن را داﺷـﺘﻪ ﺑﺎﺷﻨﺪ .در ﻣﺜﺎل ﻗﺒﻠﻲ ،اﮔﺮ ﺷﻴﺊ اي از ﻧﻮع Customerداﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﺨﺼﻮص ﺑﻪ ﻳﻜﻲ از ﻛﺎرﺑﺮان ﺑﺮﻧﺎﻣﻪ اﺳﺖ ،ﻣﻲ ﺗﻮاﻧﻴـﺪ ﺑـﻪ ﺳﺎدﮔﻲ ﺑﻪ آن ﺷﻴﺊ ﺑﮕﻮﻳﻴﺪ ﻛﻪ "ﻳﻚ ﺻﻮرت ﺣﺴﺎب ﺑﺮاي ﺧﻮدت اﻳﺠﺎد ﻛﻦ" .ﺳﭙﺲ اﻳﻦ ﺷﻴﺊ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﺪ ﺗﻤﺎم ﻛﺎرﻫﺎي ﻃﻮﻻﻧﻲ و ﺣﺘﻲ ﺳﺨﺖ ﻣﺮﺑﻮط ﺑﻪ اﻳﺠﺎد ﻛﺮدن ﻳﻚ ﺻﻮرت ﺣﺴﺎب را اﻧﺠﺎم داده و در اﻧﺘﻬﺎ ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪ از ﻧﻮع Billرا ﺑﻪ ﻋﻨﻮان ﺻﻮرت ﺣـﺴﺎب ﺧﻮد ﺑﻪ ﺷﻤﺎ ﺑﺮﮔﺮداﻧﺪ .ﻫﻤﭽﻨﻴﻦ اﮔﺮ ﺷﻴﺊ از ﻧﻮع Billﺑﻪ ﻋﻨﻮان ﺻﻮرت ﺣﺴﺎب ﻳﻜﻲ از ﻛﺎرﺑﺮان ﺧﻮد در اﺧﺘﻴﺎر داﺷﺘﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑـﻪ آن ﺑﮕﻮﻳﻴﺪ ﻛﻪ "ﺟﺰﺋﻴﺎت ﺻﻮرت ﺣﺴﺎب را ﭼﺎپ ﻛﻦ" و ﺷﻴﺊ Billﻧﻴﺰ ﺑﺎﻳﺪ ﻗﺎﺑﻠﻴﺖ اﻧﺠﺎم اﻳﻦ ﻛﺎر را داﺷﺘﻪ ﺑﺎﺷﺪ. اﮔﺮ ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﻫﻨﮕﺎم ﻣﻌﺮﻓﻲ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ و ﭼﮕﻮﻧﮕﻲ ﺗﺒﺪﻳﻞ آﻧﻬﺎ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ﮔﻔﺘﻴﻢ ﻛﻪ ﺑﺮاي ﺣﻞ ﻳﻚ ﻣـﺴﺌﻠﻪ ﺑﺎﻳﺪ ﺑﺘﻮان آن را ﺑﻪ ﻗﺴﻤﺘﻬﺎي ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻛﺮد .ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﻧﻴﺰ ﺑﻪ اﻳﻦ دﻟﻴﻞ در ﻣﻬﻨﺪﺳﻲ ﻧﺮم اﻓﺰار ﻛـﺎرﺑﺮد ﺑـﺴﻴﺎري دارد ﻛﻪ ﻣﻲ ﺗﻮان ﺑﻪ وﺳﻴﻠﻪ آن ﻳﻚ ﻣﺴﺌﻠﻪ ﭘﻴﭽﻴﺪه را ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ ﺑﻪ ﭼﻨﺪﻳﻦ ﻗﺴﻤﺖ ﻛﻮﭼﻜﺘﺮ ﺗﻘﺴﻴﻢ ﻛﺮد و ﺳﭙﺲ ﺑﺎ ﻗﺮار دادن آﻧﻬـﺎ ﻛﻨـﺎر ﻫﻢ ،ﺑﻪ راه ﺣﻞ ﻣﺴﺌﻠﻪ اﺻﻠﻲ رﺳﻴﺪ .ﻣﻤﻜﻦ اﺳﺖ ﺑﮕﻮﻳﻴﺪ ﻛﻪ اﻳﻦ ﻛﺎر ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ ﻫﺎ ﻧﻴﺰ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ ،ﭘﺲ ﭼﻪ ﻧﻴﺎزي اﺳﺖ ﻛـﻪ از ﺷﻴﺊ ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟ در ﺗﻮﺿﻴﺤﺎت ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ رواﺑﻄﻲ ﻛـﻪ ﺑـﺮاي Customerو Billﺷـﺮح داده ﺷـﺪ ﺑـﺴﻴﺎر ﻣﺸﺎﺑﻪ دﻧﻴﺎي واﻗﻌﻲ اﺳﺖ .در ﺣﻘﻴﻘﺖ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﺳﻌﻲ ﻣﻲ ﺷﻮد ﺗﻤﺎم ﻣﻮارد ﺷﺒﻴﻪ ﺑﻪ آﻧﭽﻪ در واﻗﻌﻴـﺖ وﺟـﻮد دارد اﻳﺠـﺎد ﺷﻮد و ﺗﻤﺎم رواﺑﻂ ﺑﻴﻦ اﺷﻴﺎ ﻧﻴﺰ ﺑﺮ اﻳﻦ اﺳﺎس ﺻﻮرت ﮔﻴﺮد. ﻣﻮرد دﻳﮕﺮي ﻛﻪ ﺑﺎﻋﺚ ﻗﺪرت ﻓﺮاوان ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﻣﻲ ﺷﻮد در اﻳﻦ اﺳﺖ ﻛﻪ ،ﺷﻤﺎ ﺑﻪ ﻋﻨﻮان ﻳﻜﻲ از اﻓﺮادي ﻛﻪ از ﻳـﻚ ﺷـﻴﺊ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﻧﻴﺎزي ﺑﻪ داﻧﺴﺘﻦ اﻳﻨﻜﻪ ﭼﮕﻮﻧﻪ آن ﺷﻴﺊ درﺧﻮاﺳﺘﻬﺎي ﺷﻤﺎ را اﻧﺠﺎم ﻣﻲ دﻫﺪ ﻧﺪارﻳﺪ .اﻳـﻦ ﻣـﻮرد در دﻧﻴـﺎي واﻗﻌـﻲ ﻧﻴـﺰ ﺻﺎدق اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل اﺳﺘﻔﺎده از ﻳﻚ ﻣﻮﺑﺎﻳﻞ ﻫﺴﺘﻴﺪ ،ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ اﻳﻦ دﺳﺘﮕﺎه ﺑﻪ ﺻﻮرت دروﻧﻲ ﭼﮕﻮﻧﻪ ﻛـﺎر ﻣـﻲ ﻛﻨﺪ؟ ﺣﺘﻲ اﮔﺮ ﻧﺤﻮه ﻋﻤﻠﻜﺮد آن را ﺑﺪاﻧﻴﺪ و ﻳﺎ ﺣﺘﻲ آن را ﺧﻮدﺗﺎن اﺧﺘﺮاع ﻛﺮده ﺑﺎﺷﻴﺪ ﻧﻴﺰ ،ﺳﺎده ﺗﺮ اﺳﺖ ﻛـﻪ ﺑـﺮاي ﻛـﺎر ﺑـﺎ آن از راﺑـﻂ ﻛﺎرﺑﺮي ﺳﺎده اي ﻛﻪ در اﺧﺘﻴﺎر ﺷﻤﺎ ﻗﺮار ﻣﻲ ﮔﻴﺮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت از ﺧﻄﺎﻫﺎي اﺣﺘﻤﺎﻟﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﻫﻨﮕـﺎم ﻛـﺎر ﺑـﺎ آن اﻳﺠﺎد ﺷﻮد ﻧﻴﺰ ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﻴﺪ .اﻳﻦ ﻣﻮرد در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﻫﻢ ﺻﺎدق اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﺎ ﻳﻚ ﺷﻴﺊ ﻛﺎر ﻛﻨﻴﺪ ،ﺣﺘـﻲ اﮔـﺮ آن ﺷﻴﺊ را ﺧﻮدﺗﺎن اﻳﺠﺎد ﻛﺮده ﺑﺎﺷﻴﺪ ،ﺑﻬﺘﺮ اﺳﺖ از راﺑﻂ ﺳﺎده و راﺣﺘﻲ ﻛﻪ آن ﺷﻴﺊ ﻓـﺮاﻫﻢ ﻣـﻲ ﻛﻨـﺪ اﺳـﺘﻔﺎده ﻛﻨﻴـﺪ و اﺟـﺎزه دﻫﻴـﺪ ﻛـﻪ ﭘﻴﭽﻴﺪﮔﻲ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ وﻇﻴﻔﻪ ي آن ﺷﻴﺊ در ﭘﺸﺖ راﺑﻂ ﺳﺎده ي آن ﭘﻨﻬﺎن ﺑﻤﺎﻧﺪ. ﺑﺮاي ﺗﻮﺿﻴﺢ ﺑﻴﺸﺘﺮ در ﻣﻮرد اﺷﻴﺎ ،ﺑﻬﺘﺮ اﺳﺖ ﻳﻚ ﺷﻴﺊ ﻣﺎﻧﻨﺪ ﺗﻠﻮﻳﺰﻳﻮن را در دﻧﻴﺎي واﻗﻌﻲ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .ﻳﻚ ﺳﺮي از ﻛﺎرﻫﺎ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻲ داﻧﻴﺪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﺎ ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن آﻧﻬﺎ را اﻧﺠﺎم داد .ﻣﺎﻧﻨﺪ:
ﺗﻤﺎﺷﺎي ﺗﺼﻮﻳﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ. ﺗﻐﻴﻴﺮ دادن ﻛﺎﻧﺎل ﺗﻠﻮﻳﺰﻳﻮن. ﺗﻐﻴﻴﺮ ﺻﺪاي ﺗﻠﻮﻳﺰﻳﻮن. ﺧﺎﻣﻮش و ﻳﺎ روﺷﻦ ﻛﺮدن آن.
ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل اﺳﺘﻔﺎده از ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن ﻫﺴﺘﻴﺪ ،ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ اﺟﺰاي ﺗﺸﻜﻴﻞ دﻫﻨﺪه ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن ﭼﮕﻮﻧﻪ درﺧﻮاﺳـﺘﻬﺎي ﺷﻤﺎ را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ .اﺣﺘﻤﺎﻻً اﮔﺮ از ﺷﻤﺎ ﺑﺨﻮاﻫﻨﺪ ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻔﻲ را در ﻛﻨﺎر ﻫﻢ ﻗﺮار دﻫﻴﺪ و ﻳﻚ ﺗﻠﻮﻳﺰﻳـﻮن ﻣـﺪرن اﻳﺠـﺎد ﻛﻨﻴـﺪ، ﻗﺎدر ﺑﻪ اﻧﺠﺎم ﭼﻨﻴﻦ ﻛﺎري ﻧﺨﻮاﻫﻴﺪ ﺑﻮد .اﻟﺒﺘﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻌﺪ از ﻣﺪﺗﻬﺎ ﻣﻄﺎﻟﻌﻪ و آزﻣﺎﻳﺶ ﺑﺘﻮاﻧﻴﺪ ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن ﺳﺎده اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ ﺑﺎز ﻫﻢ ﺑﻪ ﭘﻴﺸﺮﻓﺘﮕﻲ ﺗﻠﻮﻳﺰﻳﻮن ﻫﺎﻳﻲ ﻛﻪ اﻛﺜﺮ ﻣﺮدم از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻧﺨﻮاﻫﺪ ﺑﻮد .ﺑﺎ وﺟﻮد اﻳﻦ ،ﻫﻢ ﺷﻤﺎ و ﻫﻢ اﻏﻠﺐ ﻣﺮدم ﻣﻲ داﻧﻨﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﺎﻳﺪ از ﻳﻚ دﺳﺘﮕﺎه ﺗﻠﻮﻳﺰﻳﻮن اﺳﺘﻔﺎده ﻛﻨﻨﺪ ،ﭼﮕﻮﻧﻪ ﻛﺎﻧﺎل آن را ﺗﻐﻴﻴﺮ دﻫﻨﺪ ،ﭼﮕﻮﻧﻪ ﺻﺪاي آن را ﺗﻨﻈـﻴﻢ ﻛﻨﻨـﺪ ،ﭼﮕﻮﻧـﻪ آن را ﺧﺎﻣﻮش و ﻳﺎ روﺷﻦ ﻛﻨﻨﺪ و ﻏﻴﺮه.
٣٣٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺷﻴﺎ در ﻣﻬﻨﺪﺳﻲ ﻧﺮم اﻓﺰار ﻧﻴﺰ اﺳﺎﺳﺎً ﺑﻪ ﻫﻤﻴﻦ روش ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﺷﻴﺊ در اﺧﺘﻴﺎر داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺎدﮔﻲ از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺑﺨﻮاﻫﻴﺪ ﻛﻪ وﻇﺎﻳﻒ ﻻزم را اﻧﺠﺎم دﻫﺪ .ﺑﺮاي اﻳﻦ ﻣﻮارد ﻻزم ﻧﻴﺴﺖ ﺑﺪاﻧﻴﺪ ﻛﻪ ﺷﻴﺊ ﺑﻪ ﺻﻮرت دروﻧﻲ ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ و ﻳﺎ ﻻزم ﻧﻴﺴﺖ ﺣﺘﻲ ﻛﻮﭼﻜﺘﺮﻳﻦ اﻃﻼﻋﺎﺗﻲ در ﻣﻮرد ﻧﺤﻮه ﻋﻤﻠﻜﺮد آن داﺷﺘﻪ ﺑﺎﺷﻴﺪ. اﺷﻴﺎي ﻧﺮم اﻓﺰاري ﻋﻤﻮﻣﺎً داراي ﻣﺸﺨﺼﺎت زﻳﺮ ﻫﺴﺘﻨﺪ:
ﻫﻮﻳﺖ :ﻳﻚ ﺷﻴﺊ ﻫﻤﻮاره ﻧﻮع ﺧﻮد را ﻣﻲ داﻧﺪ .ﺑﺮاي ﻣﺜﺎل ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن ﻫﻤﻮاره ﻣﻴﺪاﻧﺪ ﻛـﻪ ﻳـﻚ ﺷـﻴﺊ از ﻧـﻮع ﺗﻠﻮﻳﺰﻳـﻮن اﺳﺖ. ﺣﺎﻟﺖ :ﻫﺮ ﺷﻴﺊ در ﻫﺮ زﻣﺎﻧﻲ وﺿﻌﻴﺖ و ﺣﺎﻟﺖ ﺧﻮد را ﻣﻴﺪاﻧﺪ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ در ﺣﺎل ﻣـﺸﺎﻫﺪه ﻛﺎﻧـﺎل 4از ﻳـﻚ ﺗﻠﻮﻳﺰﻳـﻮن ﺑﺎﺷﻴﺪ و ﺑﺨﻮاﻫﻴﺪ ﻛﻪ ﺗﻠﻮﻳﺰﻳﻮن ﺷﻤﺎره ﻛﺎﻧﺎﻟﻲ را ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ ،ﻋﺪد 4را ﻧﻤﺎﻳﺶ ﺧﻮاﻫﺪ داد. رﻓﺘﺎر :ﺑﻪ ﻋﻜﺲ اﻟﻌﻤﻞ ﻳﻚ ﺷﻴﺊ در ﻣﻘﺎﺑﻞ درﺧﻮاﺳﺘﻬﺎي ﻛﺎرﺑﺮ ،رﻓﺘـﺎر آن ﺷـﻴﺊ ﻣـﻲ ﮔﻮﻳﻨـﺪ .ﺑـﺮاي ﻣﺜـﺎل ﻓـﺮض ﻛﻨﻴـﺪ از ﺗﻠﻮﻳﺰﻳﻮن ﺑﺨﻮاﻫﻴﺪ ﺗﺎ ﺻﺪاي آن زﻳﺎد ﺷﻮد .اﻳﻦ اﻓﺰاﻳﺶ ﺻﺪاي ﺗﻠﻮﻳﺰﻳﻮن ﺟﺰﺋﻲ از رﻓﺘﺎر آن ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد.
ﻛﭙﺴﻮﻟﻲ ﺑﻮدن: ﻣﻔﻬﻮم اﺻﻠﻲ ﻛﻪ در ﭘﺸﺖ ﺷﻴﺊ-ﮔﺮاﻳﻲ ﻗﺮار دارد ﻛﭙﺴﻮﻟﻲ ﺑﻮدن 1اﺳﺖ .اﻳﻦ ﻣﻔﻬﻮم ﺑﺎ وﺟﻮد ﺳﺎده ﺑﻮدن ،از اﻫﻤﻴـﺖ زﻳـﺎدي ﺑﺮﺧـﻮردار اﺳﺖ .اﻳﺪه ﻛﻠﻲ ﻛﻪ ﻛﭙﺴﻮﻟﻲ ﺑﻮدن اراﺋﻪ ﻣﻲ دﻫﺪ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ رﻓﺘﺎر ﻳﻚ ﺷﻴﺊ ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ ﺑﺎﻳﺪ دور از دﻳﺪ ﻛـﺎرﺑﺮ ﺑﺎﺷـﺪ .ﺑـﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻻزم ﻧﺒﺎﺷﺪ ،ﻛﺎرﺑﺮ ﻧﺒﺎﻳﺪ ﻣﺘﻮﺟﻪ ﺷﻮد ﻛﻪ ﻳﻚ ﺷﻴﺊ ﭼﮕﻮﻧﻪ درﺧﻮاﺳﺘﻬﺎي او را اﻧﺠﺎم ﻣﻲ دﻫﺪ. ﻛﻨﺘﺮل OpenFileDialogﻛﻪ در ﻓﺼﻠﻬﺎي ﻗﺒﻞ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ را ﺑﻪ ﺧﺎﻃﺮ ﺑﻴﺎورﻳﺪ .ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻣـﻲ ﺧﻮاﺳـﺘﻴﻢ ﻳﻜﻲ از آﻧﻬﺎ را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﻢ ،ﺑﻌﺪ از اﻳﻨﻜﻪ وﺿﻌﻴﺖ آن را ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ ﺗﻨﻈﻴﻢ ﻣﻲ ﻛﺮدﻳﻢ ،از آن ﻣﻲ ﺧﻮاﺳـﺘﻴﻢ ﻛـﻪ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد )ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ .(ShowDialogوﻟﻲ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ آن ﺷﻴﺊ ﻫﻴﭻ اﻃﻼﻋـﺎﺗﻲ را در ﻣـﻮرد ﻧﺤﻮه ﻧﻤﺎﻳﺶ داده ﺷﺪﻧﺶ در ﺻﻔﺤﻪ ﺑﺮوز ﻧﻤﻲ داد و ﻣﺎ ﻧﻴﺰ ﻧﻴﺎزي ﺑﻪ داﻧﺴﺘﻦ اﻳﻦ ﻛﻪ ﭼﮕﻮﻧﻪ اﻳﻦ ﺷﻴﺊ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣـﻲ ﺷـﻮد ﻧﺪاﺷﺘﻴﻢ .اﻳﻦ ﻣﻮرد ﻛﻪ ﺷﻴﺊ ،OpenFileDialogﻧﺤﻮه اﻧﺠﺎم دادن وﻇﺎﻳﻔﺶ را از ﻛﺎرﺑﺮ ﭘﻨﻬﺎن ﻣﻲ ﻛﺮد ،ﺟﺰﺋـﻲ از ﻛﭙـﺴﻮﻟﻲ ﺑﻮدن آن ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد.
ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎ: ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﻳﻚ ﺷﻴﺊ از ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .در ﺗﻌﺮﻳﻒ آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ:
ﻣﺘﺪ ﻫﺎ :روﺷﻬﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮان ﺑﻪ ﻳﻚ ﺷﻴﺊ ﮔﻔﺖ ﭼﮕﻮﻧﻪ وﻇﻴﻔﻪ ﺧﺎﺻﻲ را اﻧﺠﺎم دﻫﺪ.
ﺧﺎﺻﻴﺖ ﻫﺎ :اﻋﻀﺎﻳﻲ از ﻳﻚ ﺷﻴﺊ ﻫﺴﺘﻨﺪ ﻛﻪ وﻳﮋﮔﻴﻬﺎي آن را ﺷﺮح ﻣﻲ دﻫﻨﺪ.
در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻞ ،ﻣﺘﺪ ﻫﺎ ﺑﻪ ﻋﻨﻮان ﻗﻄﻌﻪ ﻛﺪ ﻫﺎﻳﻲ ﻣﻌﺮﻓﻲ ﺷﺪه ﺑﻮدﻧﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺴﺘﻨﺪ وﻇﻴﻔـﻪ ﻣﺸﺨـﺼﻲ را اﻧﺠـﺎم دﻫﻨـﺪ .اﻟﺒﺘـﻪ اﻳـﻦ ﺗﻌﺮﻳﻒ درﺳﺖ اﺳﺖ ،اﻣﺎ ﺗﻌﺮﻳﻒ ﺑﺴﻴﺎر ﺳﺎده اي از ﻳﻚ ﻣﺘﺪ اﺳﺖ .ﺗﻌﺮﻳﻒ ﻛﺎﻣﻞ ﻣﺘﺪ ﻛﻪ ﻓﻘﻂ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷـﻴﺊ ﮔـﺮا ﺻـﺎدق اﺳـﺖ، ﻋﺒﺎرت اﺳﺖ از ﻛﺪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ ﻣﻲ ﮔﻮﻳﻨﺪ ﭼﮕﻮﻧﻪ وﻇﻴﻔﻪ ﻣﺸﺨﺼﻲ را اﻧﺠﺎم دﻫﺪ. Encapsulation
1
٣٣٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي روﺷﻦ ﻛﺮدن ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن ﺑﺎﻳﺪ ﻣﺘﺪي را ﭘﻴﺪا ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم دﻫﺪ ،زﻳﺮا ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﻳﻦ ﻣﺘـﺪﻫﺎ ﻫـﺴﺘﻨﺪ ﻛﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ ﻣﻲ ﮔﻮﻳﻨﺪ ﭼﮕﻮﻧﻪ ﻳﻚ وﻇﻴﻔﻪ ﻣﺸﺨﺺ را اﻧﺠﺎم دﻫﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﺎر را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﺪ ،ﻓﺮض ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﺷﻴﺊ ﺑﻪ واﺳﻄﻪ اﻳﻦ ﻣﺘﺪ ﻣﻲ داﻧﺪ ﻛﻪ ﭼﮕﻮﻧﻪ درﺧﻮاﺳﺖ ﺷﻤﺎ را اﻧﺠﺎم دﻫﺪ. ﺧﺎﺻﻴﺖ ﻫﺎ ﻧﻴﺰ ﺑﺮاي ﺗﻨﻈﻴﻢ ﺣﺎﻟﺘﻬﺎ و وﻳﮋﮔﻴﻬﺎي ﻳﻚ ﺷﻴﺊ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ .در اﻳﻦ ﻣﻮرد ﻧﻴﺰ وﻇﻴﻔﻪ ﺷﻴﺊ اﺳﺖ ﻛﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺣﺎﻟﺘﻲ ﻛـﻪ ﺑﺮاي آن ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ﻋﻤﻞ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻛﺎﻧﺎل ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن را از 4ﺑﻪ 3ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻛﺎﻓﻲ اﺳﺖ ﻣﻘـﺪار ﺧﺎﺻﻴﺖ ﻣﺮﺑﻮط ﺑﻪ ﻛﺎﻧﺎل را ﺑﺮاﺑﺮ ﺑﺎ 3ﻗﺮار دﻫﻴﺪ و ﺗﻠﻮﻳﺰﻳﻮن ﺑﺎﻳﺪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ ،ﺗﺼﻮﻳﺮ را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺑﻪ ﺧﺎﻃﺮ دارﻳﺪ ﻫﻨﮕﺎم ﻛﺎر ﺑﺎ ﺷﻴﺊ OpenFileDialogدر ﺑﺨﺶ ﻛﺎدرﻫﺎي ﻣﺤﺎوره اي ،ﻛﺎﻓﻲ ﺑﻮد ﻛـﻪ ﺧﺎﺻـﻴﺖ ﻣﺮﺑﻮط ﺑﻪ ﻣﺘﻦ ﻧﻮار ﻋﻨﻮان آن را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺪار دﻟﺨﻮاه ﻗﺮار دﻫﻴﺪ .ﺑﻌﺪ از آن ،وﻇﻴﻔﻪ ﺷﻴﺊ OpenFileDialogﻣﺤـﺴﻮب ﻣـﻲ ﺷﺪ ﺗﺎ ﻣﺘﻦ ﻣﺸﺨﺺ ﺷﺪه را در ﻧﻮار ﻋﻨﻮان ﻧﻤﺎﻳﺶ دﻫﺪ.
روﻳﺪادﻫﺎ: روﻳﺪادﻫﺎ ﺑﻪ ﻋﻨﻮان ﻋﻀﻮي از اﺷﻴﺎ ﻫﺴﺘﻨﺪ ﻛﻪ ﭘﻴﻐﺎﻣﻲ را آﻣﺎده ﻛﺮده و ﺑﻪ دﻳﮕﺮ ﺑﺨﺸﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﻓﺮﺳﺘﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻳـﻚ ﻣـﻮرد ﻗﺎﺑـﻞ ﺗﻮﺟﻪ ﺑﺮاي ﻳﻚ ﺷﻴﺊ رخ داد ،آن ﺷﻴﺊ روﻳﺪادي را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﭘﻴﻐﺎم ،ﺑﺨﺸﻬﺎي دﻳﮕـﺮ ﺑﺮﻧﺎﻣـﻪ را از اﻳﻦ روﻳﺪاد ﻣﻄﻠﻊ ﻛﺮده و ﻫﻤﭽﻨﻴﻦ اﻃﻼﻋﺎت ﻻزم را ﻧﻴﺰ در ﻣﻮرد اﻳﻦ روﻳﺪاد در اﺧﺘﻴﺎر اﻳﻦ ﺑﺨﺸﻬﺎ ﻗﺮار ﻣﻲ دﻫـﺪ .اﻳـﻦ ﭘﻴﻐـﺎم ﻓﻘـﻂ ﺑـﻪ ﻗﺴﻤﺘﻬﺎﻳﻲ از ﺑﺮﻧﺎﻣﻪ ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﭘﻴﺶ از اﺗﻔﺎق اﻓﺘﺎدن روﻳﺪاد ،از ﺑﺮﻧﺎﻣﻪ درﺧﻮاﺳﺖ ﻛﺮده ﺑﺎﺷﻨﺪ ﺗﺎ اﻳﻦ ﻣـﻮرد را ﺑـﻪ آﻧﻬـﺎ اﻃـﻼع دﻫﺪ. ﺑﻪ ﻋﻨﻮان ﻣﺜﺎل روﻳﺪاد Clickرا ﻛﻪ در ﺑﺨﺸﻬﺎي ﻗﺒﻠﻲ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .اﻳﻦ روﻳﺪاد زﻣﺎﻧﻲ رخ ﻣﻲ دﻫﺪ ﻛـﻪ ﻛﺎرﺑﺮ ﻣﺎوس را روي ﻛﻨﺘﺮل ﺑﺮده و در آﻧﺠﺎ ﻛﻠﻴﻚ ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺷﻴﺊ Buttonﺗﻤﺎم اﺷـﻴﺎي ﻻزم را از رخ دادن اﻳـﻦ روﻳـﺪاد ﻣﻄﻠﻊ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي اﻳﻨﻜﻪ ﺷﻴﺊ اي از اﻳﻦ روﻳﺪاد ﻣﻄﻠﻊ ﺷﻮد ،ﺑﺎﻳﺪ ﻗﺒﻞ از آن ﺑﻪ ﺷـﻴﺊ Buttonﺑﮕﻮﻳـﺪ در ﺻـﻮرت رخ دادن اﻳـﻦ روﻳﺪاد ﺑﻪ آن ﻧﻴﺰ اﻃﻼع داده ﺷﻮد. روش اﻳﻦ ﻛﺎر را در ﻓﺼﻠﻬﺎي ﻗﺒﻞ ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ .ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ روﻳﺪاد اﺑﺘﺪا ﺗﺎﺑﻌﻲ را ﺑﺎ ﻗﺎﻟﺒﻲ ﺧﺎص اﻳﺠﺎد ﻣﻲ ﻛﺮدﻳﻢ و ﺳﭙﺲ ﺑﻪ ﺷﻴﺊ Buttonاﻃﻼع ﻣﻲ دادﻳﻢ ﻛﻪ در ﺻﻮرت وﻗﻮع اﻳﻦ روﻳﺪاد ،ﺗﺎﺑﻊ ﻣﺸﺨﺺ ﺷﺪه را اﺟﺮا ﻛﻨـﺪ )اﻟﺒﺘـﻪ ﺑﻴـﺸﺘﺮ اﻳـﻦ ﻛﺎرﻫـﺎ ﺑـﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﺗﻮﺳﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻧﺠﺎم ﻣﻲ ﺷﺪ( .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ روي ﻛﻨﺘﺮل Buttonﻛﻠﻴـﻚ ﻣـﻲ ﻛـﺮد ،اﻳـﻦ ﻛﻨﺘـﺮل ﺗﻮاﺑﻌﻲ ﻛﻪ ﻣﺸﺨﺺ ﺷﺪه ﺑﻮدﻧﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﺮد و ﻫﻤﭽﻨﻴﻦ اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز آﻧﻬﺎ را ﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ آﻧﻬﺎ ارﺳﺎل ﻣﻲ ﻛﺮد.
ﻗﺎﺑﻞ روﻳﺖ ﺑﻮدن: ﻳﻜﻲ از وﻳﮋﮔﻴﻬﺎي ﺷﻴﺊ اي ﻛﻪ ﺧﻮب ﻃﺮاﺣﻲ ﺷﺪه اﺳﺖ ،اﻳﻦ اﺳﺖ ﻛﻪ اﺳﺘﻔﺎده از آن راﺣﺖ ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل اﮔـﺮ ﺑﺨﻮاﻫﻴـﺪ ﻳـﻚ ﺷـﻴﺊ ﺗﻠﻮﻳﺰﻳﻮن ﻃﺮاﺣﻲ ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ ﭼﻪ ﻓﺮﻛﺎﻧﺴﻲ ﺑﺮاي اﻳﻦ ﺷﻴﺊ ﻣﻮرد ﻧﻴﺎز اﺳﺖ .اﻣﺎ آﻳﺎ ﻓﺮدي ﻛﻪ از ﺗﻠﻮﻳﺰﻳﻮن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ ﻧﻴﺰ ﺑﺎﻳﺪ اﻳﻦ ﻣﻮرد را ﺑﺪاﻧﺪ؟ و ﻳﺎ ﺣﺘﻲ ﻣﻬﻤﺘﺮ اﻳﻨﻜﻪ آﻳﺎ ﻣﻲ ﺗﻮان ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه داد اﻳﻦ ﻣﻘﺪار ﻓﺮﻛﺎﻧﺲ را ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺗﻐﻴﻴﺮ دﻫﺪ. ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻳﻚ ﺷﻴﺊ ﻫﻤﻮاره ﺑﺨﺸﻬﺎﻳﻲ از آن ﺑﻪ ﺻﻮرت ﺷﺨﺼﻲ و ﺑﺨﺸﻬﺎي دﻳﮕﺮي ﺑﻪ ﺻﻮرت ﻋﻤﻮﻣﻲ ﻫﺴﺘﻨﺪ .ﺑﺨﺸﻬﺎي ﻋﻤـﻮﻣﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺗﻮﺳﻂ ﻫﻤﻪ ﻛﺎرﺑﺮان ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ ،اﻣﺎ ﺑﺨﺸﻬﺎي ﺷﺨﺼﻲ ﻓﻘﻂ ﺗﻮﺳﻂ ﺧﻮد ﺷﻴﺊ ﻗﺎﺑﻞ دﺳﺘﺮﺳـﻲ ﻫـﺴﺘﻨﺪ .ﻣﻨﻄـﻖ و روﺷﻲ ﻛﻪ ﺷﻴﺊ ﺑﺎ آن ﻛﺎر ﻣﻲ ﻛﻨﺪ ﻣﻌﻤﻮﻻ در ﺑﺨﺸﻬﺎي ﺷﺨﺼﻲ ﺷﻴﺊ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ و ﻣﻲ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺮاي ﻋﻤﻠﻜﺮد ﺷﻴﺊ ﻣﻬﻢ ﻫﺴﺘﻨﺪ وﻟﻲ ﻧﺒﺎﻳﺪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮان ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد.
٣٣٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﻣﺜﺎل ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن ﻣﻤﻜﻦ اﺳﺖ داراي ﻣﺘﺪ ﻫﺎﻳﻲ ﺑﺮاي وﺻﻞ ﻛﺮدن ﺑﺮق ﺑﻪ اﺟﺰا ،ﺟﺮﻳﺎن دادن ﺑﺮق در ﻣﺪارﻫﺎ و … ﺑﺎﺷﺪ .اﻣـﺎ اﻳـﻦ ﻣﺘﺪﻫﺎ ﻧﺒﺎﻳﺪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮﻧﺪ ،ﺑﻠﻜﻪ ﻛﺎرﺑﺮ ﺑﺎﻳﺪ ﻣﺘﺪ SwitchOnرا ﺑﺮاي روﺷﻦ ﺷﺪن دﺳﺘﮕﺎه ﻓﺮاﺧـﻮاﻧﻲ ﻛﻨﺪ ،ﺳﭙﺲ اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ ﺑﻪ ﺗﺮﺗﻴﺐ ﻣﺘﺪﻫﺎي ﮔﻔﺘﻪ ﺷﺪه را اﺳﺘﻔﺎده ﻛﺮده و ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ دﺳﺘﮕﺎه را روﺷﻦ ﻛﻨﺪ .ﺑﻪ ﻋﻨﻮان ﻣﺜﺎﻟﻲ دﻳﮕـﺮ ،در ﺷﻴﺊ ﺗﻠﻮﻳﺰﻳﻮن ﻳﻚ ﺧﺎﺻﻴﺖ ﻋﻤﻮﻣﻲ ﺑﻪ ﻧﺎم ﻛﺎﻧﺎل وﺟﻮد دارد ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺧﺎﺻﻴﺖ ﺧﺼﻮﺻﻲ ﺑﻪ ﻧﺎم ﻓﺮﻛﺎﻧﺲ ﻛﺎر ﻣـﻲ ﻛﻨـﺪ .ﺗـﺎ زﻣﺎﻧﻲ ﻛﻪ ﺗﻠﻮﻳﺰﻳﻮن ﻧﺪاﻧﺪ ﺑﺮاي ﻫﺮ ﻛﺎﻧﺎل ﺑﺎﻳﺪ از ﭼﻪ ﻓﺮﻛﺎﻧﺴﻲ اﺳﺘﻔﺎده ﻛﻨﺪ ،ﻧﻤﻲ ﺗﻮاﻧﺪ آﻧﻬﺎ را ﻧﻤﺎﻳﺶ دﻫﺪ .اﻣﺎ ﻛﺎرﺑﺮ ﺗﻠﻮﻳﺰﻳـﻮن ﻧﺒﺎﻳـﺪ ﺑـﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ ﺑﺘﻮاﻧﺪ ﻓﺮﻛﺎﻧﺲ را ﺗﻐﻴﻴﺮ دﻫﺪ .ﺑﻠﻜﻪ ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ ﺗﻐﻴﻴﺮ ﺧﺎﺻﻴﺖ ﻛﺎﻧﺎل ،ﻣﻮﺟﺐ ﺗﻐﻴﻴﺮ ﻓﺮﻛﺎﻧﺲ ﺷﻮد. ﺣﺎل ﻛﻪ ﺑﺎ ﻣﻔﺎﻫﻴﻢ اﺑﺘﺪاﻳﻲ ﺷﻴﺊ ﮔﺮاﻳﻲ آﺷﻨﺎ ﺷﺪﻳﺪ ،ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﺑﺮرﺳﻲ اﺳﺘﻔﺎده از اﻳﻦ ﻣﻮارد در ﺑﺮﻧﺎﻣﻪ ﺑﭙﺮدازﻳﻢ .در اﻏﻠﺐ ﻛﺪ ﻫﺎﻳﻲ ﻛـﻪ در ﻓﺼﻠﻬﺎي ﻗﺒﻞ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ ،ﺧﻄﻲ ﻣﺎﻧﻨﺪ ﻛﺪ زﻳﺮ دﻳﺪه ﻣﻲ ﺷﺪه اﺳﺖ: ;)lstData.Items.Add(strData اﻳﻦ ﻛﺪ ﻧﻤﻮﻧﻪ اي ﻋﺎدي از ﺷﻴﺊ ﮔﺮاﻳﻲ اﺳﺖ .در اﻳﻦ ﻛﺪ lstDataدر ﺣﻘﻴﻘﺖ ﻳﻚ ﺷﻴﺊ و Itemsﻧﻴﺰ ﺧﺎﺻﻴﺘﻲ از اﻳﻦ ﺷـﻴﺊ اﺳﺖ .ﺧﺎﺻﻴﺖ Itemsﺧﻮد ﻧﻴﺰ ﻳﻚ ﺷﻴﺊ اﺳﺖ ﻛﻪ داراي ﻣﺘﺪي ﺑﻪ ﻧﺎم Addاﺳﺖ .ﻋﻼﻣﺖ ﻧﻘﻄﻪ ) (.ﺑﻪ وﻳﮋوال C#ﻣـﻲ ﮔﻮﻳـﺪ ﻛﻪ ﻛﻠﻤﻪ ﺳﻤﺖ راﺳﺖ ،ﻧﺎم ﻋﻀﻮي از ﺷﻴﺊ ﺳﻤﺖ ﭼﭗ اﺳـﺖ .ﺑﻨـﺎﺑﺮاﻳﻦ در اﻳـﻦ ﻛـﺪ Items ،ﻋـﻀﻮي از lstDataو Add ﻋﻀﻮي از Itemsﺑﻪ ﺷﻤﺎر ﻣﻲ رود. lstDataﻳــﻚ ﻧﻤﻮﻧــﻪ از ﻛــﻼس System.Windows.Forms.ListBoxاﺳــﺖ .اﻳــﻦ ﻛــﻼس ﻳﻜــﻲ از ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﭼﺎرﭼﻮب .NETاﺳﺖ ﻛﻪ در ﻓﺼﻞ دوم ﺑﺎ آن آﺷﻨﺎ ﺷﺪﻳﺪ .ﻛﻼس ListBoxﺑﺮاي ﻧﻤﺎﻳﺶ ﻟﻴﺴﺘﻲ از ﻋﻨﺎﺻﺮ در ﻓﺮم ﺑﻪ ﻛﺎر ﻣﻲ رود و ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﻋﻨﺎﺻﺮي را از آن اﻧﺘﺨﺎب ﻛﻨﺪ .اﮔﺮ دﻗﺖ ﻛﻨﻴﺪ ﻧﻤﻮﻧﻪ ﻫﺎي زﻳﺎدي از ﻛﭙﺴﻮﻟﻲ ﺑـﻮدن را در اﻳﻦ ﻛﻼس ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد .ﺷﻤﺎ ﺑﻪ ﻋﻨﻮان ﻳﻜﻲ از ﻛﺎرﺑﺮان اﻳﻦ ﻛﻼس ،ﻧﻴﺎزي ﻧﺪارﻳﺪ ﻛﻪ ﺑﺪاﻧﻴﺪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻟﻴﺴﺘﻲ از ﻋﻨﺎﺻﺮ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ و ﻳﺎ درﻳﺎﻓﺖ ورودي ﻛﺎرﺑﺮ از ﭼﻪ ﺗﻜﻨﻮﻟﻮژﻳﻬﺎﻳﻲ ﺑﺎﻳﺪ اﺳﺘﻔﺎده ﻛـﺮد .ﺣﺘـﻲ ﻣﻤﻜـﻦ اﺳـﺖ ﺗـﺎﻛﻨﻮن ﻧـﺎم ﻣـﻮاردي ﻣﺎﻧﻨـﺪ ،stdin ،GDI+دراﻳﻮرﻫﺎي ﻛﻴﺒﻮرد ،دراﻳﻮرﻫﺎي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ و ﻳﺎ ﺑﺴﻴﺎري از ﺗﻜﻨﻮﻟﻮژﻳﻬﺎي ﭘﻴﭽﻴﺪه دﻳﮕﺮي ﻛﻪ در اﻳـﻦ ﻛـﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ را ﻧﻴﺰ ﻧﺸﻨﻴﺪه ﺑﺎﺷﻴﺪ .اﻣﺎ ﺑﻪ راﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ از اﻳﻦ ﻛﻼس اﺳـﺘﻔﺎده ﻛـﺮده و ﻋﻨﺎﺻـﺮ ﻣـﻮرد ﻧﻈﺮﺗـﺎن را ﺑـﻪ ﺻﻮرت ﻟﻴﺴﺖ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ. اﻟﺒﺘﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در اﺑﺘﺪاي ﻓﺼﻞ ﻧﻴﺰ ﮔﻔﺘﻢ ListBox ،ﻳﻜﻲ از اﺷﻴﺎﻳﻲ اﺳﺖ ﻛﻪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﺷـﺪه اﺳـﺖ .ﻋﻤﻮﻣـﺎً ﻳـﻚ ﺑﺮﻧﺎﻣﻪ از ﺗﻌﺪاد زﻳﺎدي ﺷﻴﺊ ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﻮد ﻛﻪ ﻓﻘﻂ ﺑﻌﻀﻲ از آﻧﻬﺎ ﻫﻤﺎﻧﻨﺪ ﺷﻴﺊ ListBoxﻗﺎﺑﻞ ﻣﺸﺎﻫﺪه ﻫـﺴﺘﻨﺪ .اﺷـﻴﺎي ﺑـﺴﻴﺎر دﻳﮕﺮي ﻧﻴﺰ ﻫﺴﺘﻨﺪ ﻛﻪ در اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻘﺶ دارﻧﺪ ،اﻣﺎ از ﻧﻈﺮ ﻛﺎرﺑﺮ ﭘﻨﻬﺎن ﻫﺴﺘﻨﺪ و در ﺣﺎﻓﻈﻪ وﻇﻴﻔﻪ ﺧﻮد را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ.
ﻳﻚ ﻛﻼس ﭼﻴﺴﺖ؟ ﻛﻼس ﺗﻌﺮﻳﻔﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﻳﻚ ﻧﻮع ﺧﺎص از ﺷﻴﺊ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﻛﻼﺳﻬﺎ را ﻋﻤﻮﻣﺎً در دﻧﻴﺎي واﻗﻌـﻲ ﻧﻤـﻲ ﺗـﻮان ﻧـﺸﺎن داد .ﺑـﺮاي ﻧﻤﻮﻧﻪ ،ﻣﺜﺎل ﺗﻠﻮﻳﺰﻳﻮن در ﺑﺨﺶ ﻗﺒﻞ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .در دﻧﻴﺎي واﻗﻌﻲ ﻫﻴﭽﮕﺎه ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﺷﻴﺊ اي را ﻣـﺸﺨﺺ ﻛﻨﻴـﺪ و ﺑﮕﻮﻳﻴـﺪ ﻛـﻪ "اﻳﻦ ﺗﻠﻮﻳﺰﻳﻮن اﺳﺖ" .ﺑﻠﻜﻪ ﻫﻤﻮاره ﻣﻲ ﺗﻮاﻧﻴﺪ ﺷﻴﺊ اي را ﻣﺸﺨﺺ ﻛﻨﻴﺪ و ﺑﮕﻮﻳﻴﺪ "اﻳﻦ ﻳﻚ ﻧﻤﻮﻧﻪ از ﺗﻠﻮﻳﺰﻳﻮن اﺳﺖ" .زﻳـﺮا ﻫﻤـﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ،ﺗﻠﻮﻳﺰﻳﻮن ﻳﻚ ﺗﻌﺮﻳﻒ اﺳﺖ و ﻧﻤﻲ ﺗﻮان در دﻧﻴﺎي واﻗﻌﻲ آن را ﻧﻤﺎﻳﺶ داد .ﺑﻠﻜﻪ ﺑﺎﻳﺪ اﺑﺘﺪا آن را ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﺮد. در دﻧﻴﺎي ﻧﺮم اﻓﺰار ﻧﻴﺰ ﻛﻼﺳﻬﺎ ﺑﻪ ﻫﻤﻴﻦ ﺻﻮرت ﻫﺴﺘﻨﺪ .ﻳﻚ ﻛﻼس از ﻛﺪﻫﺎي ﻻزم ﺑﺮاي ذﺧﻴﺮه و ﻧﮕﻬﺪاري ﻣﻘﺎدﻳﺮ ﺧﺎﺻﻴﺖ ﻫﺎ ،اﻧﺠـﺎم دادن ﻣﺘﺪﻫﺎ ،ﺗﻌﻴﻴﻦ زﻣﺎن رخ دادن روﻳﺪادﻫﺎ و … ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻚ ﺷﻴﺊ ﻧﺮم اﻓﺰاري اﻳﺠﺎد ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ﻛﻪ درون آن ﺷﻴﺊ دﻗﻴﻘﺎً ﺑﺎﻳﺪ ﭼﮕﻮﻧﻪ ﻛﺎر ﻛﻨﺪ .ﺳﭙﺲ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻛﺎرﻛﺮد را ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ زﺑـﺎن ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ ﻣﺎﻧﻨـﺪ C#در ﻗﺎﻟـﺐ ﻳـﻚ ﻛﻼس ﻣﻲ ﻧﻮﻳﺴﻴﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ دﻳﮕﺮي ﺑﺨﻮاﻫﺪ از ﺷﻴﺊ ﻛﻪ اﻳﺠﺎد ﻛﺮده اﻳﺪ اﺳﺘﻔﺎده ﻛﻨﺪ ،ﻓﻘﻂ ﺑﻪ اﻳﻦ ﺷـﻴﺊ ﻣـﻲ
٣٣٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﮔﻮﻳﺪ ﻛﻪ "ﺻﺪا را زﻳﺎد ﻛﻦ" .در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻳﺪ ﺑﻪ ﻋﻨﻮان ﻛﺴﻲ ﻛﻪ اﻳﻦ ﺷﻴﺊ را اﻳﺠﺎد ﻛﺮده اﺳﺖ ﺑﺪاﻧﻴﺪ ﭼﮕﻮﻧﻪ ﺑﻪ آﻣﭙﻠـﻲ ﻓـﺎﻳﺮ دﺳـﺘﻮر دﻫﻴﺪ ﻛﻪ ﺧﺮوﺟﻲ ﺻﺪا را زﻳﺎد ﻛﻨﺪ. ﻧﻜﺘﻪ :در ﻣﺜﺎل ﺑﺎﻻ ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﺧﻮد آﻣﭙﻠﻲ ﻓﺎﻳﺮ ﻧﻴﺰ ﻳﻚ ﺷﻴﺊ اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻻزم ﻧﻴﺴﺖ دﻗﻴﻘﺎً ﺑﺪاﻧﻴﺪ ﻛـﻪ آﻣﭙﻠـﻲ ﻓـﺎﻳﺮ ﺑـﻪ ﺻـﻮرت دروﻧﻲ ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ .در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ،ﻳﻚ ﺷﻴﺊ ﻣﻌﻤﻮﻻ از ﭼﻨﺪﻳﻦ ﺷﻴﺊ دﻳﮕﺮ ﺑﻪ اﺿﺎﻓﻪ ﻣﻘﺪاري ﻛﺪ ﺑﺮاي اﻳﺠﺎد ارﺗﺒـﺎط ﺑﻴﻦ آﻧﻬﺎ ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﻮد ،ﻫﻤﺎﻧﻄﻮر ﻛﻪ در دﻧﻴﺎي واﻗﻌﻲ ﻧﻴﺰ ﻳﻚ ﺗﻠﻮﻳﺰﻳﻮن از ﭼﻨﺪﻳﻦ ﻗﺴﻤﺖ ﻋﺎدي ﺑﻪ اﺿﺎﻓﻪ ﻣﻘﺪاري ﻣﺪار ﺑـﺮاي اﻳﺠـﺎد ارﺗﺒﺎط ﺑﻴﻦ آن ﻗﺴﻤﺘﻬﺎ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ. ﻫﺮ ﺷﻴﺊ ي ﻛﻪ از ﻳﻚ ﻛﻼس اﻳﺠﺎد ﺷﻮد ،ﺑﻪ ﻋﻨﻮان ﻧﻤﻮﻧﻪ اي از آن ﻛﻼس در ﻧﻈـﺮ ﮔﺮﻓﺘـﻪ ﻣـﻲ ﺷـﻮد .ﺑﻨـﺎﺑﺮاﻳﻦ اﮔـﺮ 50ﻋـﺪد ﺷـﻴﺊ ﺗﻠﻮﻳﺰﻳﻮن داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،در ﺣﻘﻴﻘﺖ 50ﻧﻤﻮﻧﻪ از ﻛﻼس ﺗﻠﻮﻳﺰﻳﻮن دارﻳﺪ .ﻋﻤﻞ اﻳﺠﺎد ﻳﻚ ﻧﻤﻮﻧﻪ ﺟﺪﻳﺪ از ﻳﻚ ﻛﻼس را ﻧﻤﻮﻧﻪ ﺳـﺎزي ﻣﻲ ﮔﻮﻳﻨﺪ .از اﻳﻦ ﺑﻪ ﺑﻌﺪ ﺧﻮاﻫﻴﻢ ﮔﻔﺖ ﻛﻪ "ﻳﻚ ﻛﻼس اﻳﺠﺎد ﻛﻨﻴﺪ" اﻣﺎ در ﻣﻮرد اﺷﻴﺎ ﻣﻲ ﮔﻮﻳﻴﻢ "ﻳﻚ ﺷـﻴﺊ را ﻧﻤﻮﻧـﻪ ﺳـﺎزي ﻛﻨﻴـﺪ" )اﻟﺒﺘﻪ اﻳﻦ ﺗﻔﺎوت در ﮔﻔﺘﺎر ﻓﻘﻂ ﺑﺮاي رﻓﻊ اﺑﻬﺎم اﺳﺖ( .اﻳﺠﺎد ﻳﻚ ﻛﻼس در زﻣﺎن ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ،زﻣﺎﻧﻲ ﻛﻪ در ﺣﺎل ﻧﻮﺷﺘﻦ ﻛـﺪ ﺑﺮﻧﺎﻣـﻪ ﻫﺴﺘﻴﺪ ﺻﻮرت ﻣﻲ ﮔﻴﺮد .اﻣﺎ ﻧﻤﻮﻧﻪ ﺳﺎزي اﺷﻴﺎ از ﻛﻼس در زﻣﺎن اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺨﻮاﻫﺪ از آن ﺷﻴﺊ اﺳﺘﻔﺎده ﻛﻨﺪ ﺻﻮرت ﻣﻲ ﮔﻴﺮد. ﻳﻚ ﻣﺜﺎل ﺧﻮب ﺑﺮاي اﻳﻦ ﻣﻮرد ،ﻣﺜﺎل ﻗﺎﻟﺒﻬﺎي ﻓﻠﺰي اﺳﺖ .ﻓﺮض ﻛﻨﻴﺪ ﻳﻚ ﻗﺎﻟﺐ ﻓﻠﺰي داﻳﺮه اي و ﻣﻘﺪاري ﺧﻤﻴﺮ در اﺧﺘﻴﺎر دارﻳﺪ .ﻗﺎﻟﺐ ﻫﻤﻮاره ﺷﻜﻞ ﺛﺎﺑﺘﻲ دارد و ﺑﻪ ﺗﻨﻬﺎﻳﻲ ﺑﺮاي ﺷﻤﺎ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﻴﺴﺖ .ﺑﻠﻜﻪ ﺑﺎﻳﺪ ﻣﻘﺪاري ﺧﻤﻴﺮ در آن ﻗﺮار دﻫﻴﺪ ﺗﺎ ﺧﻤﻴﺮ ﻫﺎ ﺑﻪ ﺷﻜﻞ ﻗﺎﻟﺐ درآﻳﻨﺪ .ﺳﭙﺲ از ﺧﻤﻴﺮ ﻫﺎي ﺷﻜﻞ ﮔﺮﻓﺘﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﺠﺎد داﻳﺮه ﻫﺎ از ﻧﻈﺮ ﻗﺎﻟﺐ ﻫﻴﭻ ﻣﺤﺪودﻳﺘﻲ وﺟﻮد ﻧﺪارد ،ﺑﻠﻜﻪ ﺑـﻪ ﻫـﺮ اﻧـﺪازه ﻛﻪ ﺧﻤﻴﺮ در اﺧﺘﻴﺎر داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻗﺎﻟﺐ ،داﻳﺮه اﻳﺠﺎد ﻛﻨﻴﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻗﺎﻟﺐ ﻫﻴﭻ ﻣﻮﻗـﻊ از ﺑـﻴﻦ ﻧﻤـﻲ رود وﻟـﻲ داﻳﺮه ﻫﺎﻳﻲ ﻛﻪ ﺑﺎ آن اﻳﺠﺎد ﻛﺮده اﻳﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ آﻧﻬﺎ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﻴﺪ و ﻳﺎ ﺑﺨﻮاﻫﻴﺪ ﺑﻪ وﺳﻴﻠﻪ آﻧﻬـﺎ ﺷـﻜﻞ دﻳﮕـﺮي اﻳﺠـﺎد ﻛﻨﻴﺪ از ﺑﻴﻦ ﻣﻲ روﻧﺪ .ﻛﻼﺳﻬﺎ و اﺷﻴﺎ ﻧﻴﺰ ﭼﻨﻴﻦ راﺑﻄﻪ اي دارﻧﺪ .ﻛﻼﺳﻬﺎ ﺑﻪ ﺻﻮرت ﻳﻚ ﻗﺎﻟﺐ ﻫﺴﺘﻨﺪ و ﺣﺎﻓﻈـﻪ ﻳـﻚ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻧﻴـﺰ ﺑـﻪ ﺻﻮرت ﺧﻤﻴﺮ ﻫﺎ .ﺑﺮاي اﻳﺠﺎد ﺷﻴﺊ از ﻛﻼس ،ﺧﻮد ﻛﻼس ﻣﺤﺪودﻳﺘﻲ در ﻣﻮرد ﺗﻌﺪاد اﺷﻴﺎي اﻳﺠﺎد ﺷﺪه ﻧﺪارد ،ﺗﻨﻬﺎ ﻣﺤـﺪودﻳﺖ از ﻃـﺮف ﻣﻘﺪار ﺣﺎﻓﻈﻪ ﻣﻮﺟﻮد در ﻛﺎﻣﭙﻴﻮﺗﺮ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﻛﻼس از اﺑﺘﺪا وﺟﻮد دارد ،اﻣﺎ ﻳﻚ ﺷﻴﺊ ﻓﻘـﻂ ﻫﻨﮕـﺎﻣﻲ وﺟـﻮد دارد ﻛـﻪ ﺑﺨﻮاﻫـﺪ اﺳﺘﻔﺎده ﺷﻮد .ﺑﻌﺪ از اﺗﻤﺎم ﻛﺎر آن ،ﺷﻴﺊ از ﺣﺎﻓﻈﻪ ﭘﺎك ﻣﻲ ﺷﻮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪ از ﻳﻚ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺘﻬﺎي ﻧﻤﻮﻧﻪ اﻳﺠﺎد ﺷﺪه را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ ،ﻣﺘـﺪﻫﺎي آن را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ و … .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻛﻪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﻼﺳﻲ ﺑﺮاي ﺗﻠﻮﻳﺰﻳﻮن اﻳﺠﺎد ﻛﺮده اﻳﺪ .در زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣـﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﻫﺮ ﺗﻌﺪاد ﻛﻪ ﺑﺨﻮاﻫﻴﺪ از اﻳﻦ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﻨﻴﺪ .ﺳﭙﺲ ﺑﺮاي ﻣﺜﺎل ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ SwitchOnاز ﻳﻜـﻲ از ﻧﻤﻮﻧـﻪ ﻫﺎ ،آن ﻧﻤﻮﻧﻪ از ﺗﻠﻮﻳﺰﻳﻮن را روﺷﻦ ﻛﻨﻴﺪ و ﻳﺎ ﺑﺎ ﺗﻨﻈﻴﻢ ﺧﺎﺻﻴﺖ Channelﻳﻜﻲ از ﻧﻤﻮﻧﻪ ﻫﺎ ،ﻛﺎﻧﺎل آن ﻧﻤﻮﻧﻪ از ﺗﻠﻮﻳﺰﻳـﻮن را ﺗﻐﻴﻴـﺮ دﻫﻴﺪ.
1
اﻳﺠﺎد ﻛﻼﺳﻬﺎ: در ﻓﺼﻠﻬﺎي ﻗﺒﻠﻲ ﺑﻪ ﻛﺮّات ﻛﻼس ﻫﺎﻳﻲ اﻳﺠﺎد ﻛﺮده و از آن در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﻤﻮﻧﻪ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .ﺑﻪ ﻃﻮر ﻛﻠﻲ ﻫﻨﮕﺎﻣﻲ ﻛﻪ اﻟﮕﻮرﻳﺘﻢ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﺮدﻳﺪ ،اﺷﻴﺎي زﻳﺎدي در دﻧﻴﺎي واﻗﻌﻲ در آن دﻳﺪه ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ ﺗﻤﺎم اﻳﻦ اﺷﻴﺎي واﻗﻌﻲ را ،ﺑﻪ اﺷﻴﺎي در ﺑﺮﻧﺎﻣﻪ ﺧﻮدﺗﺎن ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ .ﺑﻪ ﻣﺜﺎل زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
Instantiation
1
٣٣٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻟﻴﺴﺘﻲ ﻣﺸﺘﻤﻞ ﺑﺮ 10ﻛﺎرﺑﺮ را از ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﻧﺘﺨﺎب ﻛﻦ. از اوﻟﻴﻦ ﻛﺎرﺑﺮ اﻧﺘﺨﺎب ﺷﺪه ﺷﺮوع ﻛﻦ و ﺑﺮاي ﻫﺮ ﻳﻚ ﺻﻮرت ﺣﺴﺎب او را آﻣﺎده ﻛﻦ. زﻣﺎﻧﻲ ﻛﻪ ﻫﺮ ﻳﻚ از ﺻﻮرت ﺣﺴﺎب ﻫﺎ آﻣﺎده ﺷﺪﻧﺪ ،ﺑﺎ اﺳﺘﻔﺎده از ﭼﺎﭘﮕﺮ آن را ﭼﺎپ ﻛﻦ.
ﺑﺮاي اﻳﻨﻜﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ ﺷﻴﺊ ﮔﺮا ﺑﺎﺷﺪ ،ﺑﺎﻳﺪ ﻫﺮ ﺷﻴﺊ ﻛﻪ در دﻧﻴﺎي واﻗﻌﻲ آن ﺑﺮﻧﺎﻣـﻪ وﺟـﻮد دارد ،ﺑـﻪ ﺷـﻴﺊ در آن ﺑﺮﻧﺎﻣـﻪ ﺗﺒﺪﻳﻞ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل:
:Customerﻳﻚ ﺷﻴﺊ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻛﺎرﺑﺮ.
:Billﻳﻚ ﺷﻴﺊ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﺻﻮرت ﺣﺴﺎب اﻳﺠﺎد ﺷﺪه.
:Printerﻳﻚ ﺷﻴﺊ ﻛﻪ ﻳﻚ ﭼﺎﭘﮕﺮ ﺳﺨﺖ اﻓﺰاري را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ و ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﭼﺎپ ﺻﻮرت ﺣـﺴﺎب ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد.
ﻫﻨﮕﺎﻣﻲ ﻛﻪ از وﻳﮋوال 2005 C#ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴـﺪ ،ﻣﺠﻤﻮﻋـﻪ وﺳـﻴﻌﻲ از ﻛﻼﺳـﻬﺎ را ﺗﺤـﺖ ﻋﻨـﻮان ﻛﺘﺎﺑﺨﺎﻧـﻪ ﻛﻼس ﭼﺎرﭼﻮب 1.NETدر اﺧﺘﻴﺎر دارﻳﺪ .اﻳﻦ ﻛﻼﺳﻬﺎ ﻫﺮ ﭼﻴﺰي ﺑﺮاي ﻣﺤﺎﺳﺒﺎت در ﻣﺤﻴﻄﻲ ﻛـﻪ ﻣـﻲ ﺧﻮاﻫﻴـﺪ ﺑـﺮاي آن ﺑﺮﻧﺎﻣـﻪ ﺑﻨﻮﻳﺴﻴﺪ را ﭘﻮﺷﺶ ﻣﻲ دﻫﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺮاي .NETﺑﻪ ﺳﺎدﮔﻲ اﺳﺘﻔﺎده از ﭼﻨﺪ ﻛﻼس و اﻳﺠﺎد ارﺗﺒﺎط درﺳﺖ ﺑﻴﻦ آﻧﻬـﺎ و ﻳﺎ ﺗﺮﻛﻴﺐ ﭼﻨﺪ ﻛﻼس و اﻳﺠﺎد ﻳﻚ ﻛﻼس ﺟﺪﻳﺪ اﺳﺖ .ﻣﻌﻤﻮﻻً ﻫﻨﮕﺎم ﺳﺎﺧﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﺑﻌﻀﻲ از ﻛﻼﺳﻬﺎي ﻣﻮرد ﻧﻴﺎزﺗﺎن در ﭼﺎرﭼﻮب .NETوﺟﻮد دارﻧﺪ و ﺑﻌﻀﻲ از آﻧﻬﺎ را ﻧﻴﺰ ﺑﺎﻳﺪ ﺧﻮدﺗﺎن اﻳﺠﺎد ﻛﻨﻴﺪ. ﺑﺮاي ﻣﺜﺎل در ﭼﺎرﭼﻮب .NETﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﭼﺎپ و ﻳﺎ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ وﺟﻮد دارد ،ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ در اﻟﮕﻮرﻳﺘﻢ ﺧﻮد ﺑﻪ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ و ﻳﺎ ﭼﺎپ اﻃﻼﻋﺎت ﻧﻴﺎز داﺷﺘﻴﺪ ،ﻻزم ﻧﻴﺴﺖ ﻛﻪ ﻛﻼس آﻧﻬـﺎ را ﻣﺠـﺪداً ﺑﻨﻮﻳـﺴﻴﺪ .اﮔـﺮ ﺑﺨﻮاﻫﻴﺪ ﻣﻄﻠﺒﻲ را ﭼﺎپ ﻛﻨﻴﺪ ﻛﺎﻓﻲ اﺳﺖ ﺷﻴﺊ از ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﭼﺎپ را ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﻨﻴﺪ ،ﺑﻪ آن ﺷﻴﺊ ﺑﮕﻮﻳﻴﺪ ﻛﻪ ﭼﻪ ﻣﻄﻠﺒﻲ را ﻣﻲ ﺧﻮاﻫﻴﺪ ﭼﺎپ ﻛﻨﻴﺪ و ﺳﭙﺲ آن ﺷﻴﺊ ﻋﻤﻞ ﭼﺎپ را ﺑﺮاي ﺷﻤﺎ اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ ﺷﻴﺊ ﻣﺬﻛﻮر ﭼﮕﻮﻧﻪ ﺳﻨﺪ ﺷﻤﺎ را ﺑـﻪ دﺳﺘﻮرات PostScriptﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ و از ﻃﺮﻳﻖ ﭘﻮرت ﻣﺨﺼﻮص ﭼﺎﭘﮕﺮ آن را ﺑﻪ دﺳﺘﮕﺎه ﻣﻲ ﻓﺮﺳﺘﺪ ،ﻓﻘﻂ ﻛﺎﻓﻲ اﺳﺖ ﻧﺤﻮه ﻛﺎرﺑﺮد ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي آن را ﺑﺪاﻧﻴﺪ ،ﺑﻘﻴﻪ ﻣﻮارد را ﺧﻮد ﺷﻴﺊ اﻧﺠﺎم ﻣﻲ دﻫﺪ.
ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده ﻣﺠﺪد: ﻳﻜﻲ از زﻳﺒﺎﺗﺮﻳﻦ ﺟﻨﺒﻪ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده ﻣﺠﺪد 2از ﻳﻚ ﻛﺪ اﺳﺖ .ﺑﺮاي درك ﺑﻬﺘﺮ اﻳـﻦ ﻗﺎﺑﻠﻴـﺖ ﺑﻬﺘـﺮ اﺳـﺖ ﻣﺜﺎﻟﻲ را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .ﻓﺮض ﻛﻨﻴﺪ در ﻳﻚ ﺷﺮﻛﺖ ﺧﺪﻣﺎت ﺗﻠﻔﻨﻲ ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ و ﺑﻪ دو ﺑﺮﻧﺎﻣﻪ ي ﻣﺘﻔﺎوت ﻧﻴﺎز دارﻳـﺪ .ﺑﺮﻧﺎﻣـﻪ اول ﺑـﺮاي ﻛﻨﺘﺮل اﻣﻮر ﻣﺸﺘﺮﻛﻴﻦ ﺗﻠﻔﻦ ﺛﺎﺑﺖ و ﺑﺮﻧﺎﻣﻪ دوم ﺑﺮاي ﻛﻨﺘﺮل اﻣﻮر ﻣﺸﺘﺮﻛﻴﻦ ﺗﻠﻔﻦ ﻫﻤﺮاه اﺳﺖ .در ﻫﺮ ﻛﺪام از اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻧﻴﺎز اﺳﺖ ﻛﻪ از ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم Customerاﺳﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ اﻳﻦ دو ﺑﺮﻧﺎﻣﻪ را ﺑﻨﻮﻳﺴﻴﺪ ،اﺣﺘﻤﺎﻻ ﻫﺮ دو را ﺑﺎ ﻫﻢ ﺷﺮوع ﻧﺨﻮاﻫﻴﺪ ﻛﺮد .از ﺑﺮﻧﺎﻣﻪ اول ﺷﺮوع ﻣﻲ ﻛﻨﻴﺪ ،ﻫﻨﮕﺎﻣﻲ ﻛـﻪ ﺗﻤﺎم ﺷﺪ ﺑﺮﻧﺎﻣﻪ دوم را ﺷﺮوع ﻣﻲ ﻛﻨﻴﺪ .ﺣﺎل ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﺮاي ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﻳﻚ ﻛﻼس Customerﺟﺪاﮔﺎﻧﻪ ﺑﻨﻮﻳـﺴﻴﺪ و ﻳـﺎ ﻳﻚ ﻛﻼس ﻛﻠﻲ ﺑﺮاي Customerدر ﺑﺮﻧﺎﻣﻪ اول ﺑﻨﻮﻳﺴﻴﺪ و در ﺑﺮﻧﺎﻣﻪ ي دوم از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ؟ ﺧﻮب ﻣﺸﺨﺺ اﺳﺖ ﻛﻪ روش دوم ﺑﻬﺘﺮ اﺳﺖ.
.NET Framework Class Library Reusability
1 2
٣٣٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده ﻣﺠﺪد از ﻳﻚ ﻛﻼس در ﺣﺎﻟﺖ ﻛﻠﻲ ﻣﻮرد ﺧﻮﺑﻲ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود اﻣﺎ ﭼﻨﺪ ﻧﻜﺘﻪ ﻫﻢ ﺑﺎﻳﺪ ﺑﺮاي اﻳﻦ ﻣﻮرد در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷـﻮد .ﺑـﻪ ﺻﻮرت اﻳﺪه آل اﮔﺮ ﻳﻚ ﻛﻼس Customerرا ﺑﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻛﻨﻴﺪ و ﺳﭙﺲ در ﺑﺮﻧﺎﻣـﻪ دﻳﮕـﺮي ﺑـﻪ اﺳـﺘﻔﺎده از ﻛﻼﺳـﻲ ﻣﺸﺎﺑﻪ ﻛﻼس Customerﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﺑﺎﻳﺪ ﺑﺘﻮاﻧﻴﺪ از ﻛﻼس Customerﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻣﻤﻜﻦ اﺳـﺖ در ﺑﻌـﻀﻲ ﺷﺮاﻳﻂ ﺑﻪ دﻻﻳﻠﻲ ﻧﺘﻮاﻧﻴﺪ از ﻛﻼس Customerدر ﺑﺮﻧﺎﻣﻪ ﺟﺪﻳﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﻟﺒﺘﻪ ﻧﻤﻲ ﺗﻮان دﻻﻳﻞ ﻣـﺸﺨﺺ و ﻗـﺎﻃﻌﻲ را ﺑﻴـﺎن ﻛﺮد و ﮔﻔﺖ ﻛﻪ ﭼﻪ زﻣﺎﻧﻲ ﺷﺮاﻳﻄﻲ ﭘﻴﺶ ﻣﻲ آﻳﻨﺪ ﻛﻪ ﻧﻤﻲ ﺗﻮان از ﻳﻚ ﻛﻼس در ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ اﺳﺘﻔﺎده ﻛـﺮد .وﻟـﻲ ﻣﻤﻜـﻦ اﺳـﺖ ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﺪ از ﻛﻼس Customerدر ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﺠﺒﻮر ﺷﻮﻳﺪ آن را ﺑﻪ ﻧﺤﻮي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﺑﺴﻴﺎر ﭘﻴﭽﻴـﺪه ﺷﻮد .در اﻳﻦ ﺷﺮاﻳﻂ اﻳﺠﺎد ﭼﻨﺪ ﻛﻼس ﺳﺎده و اﺳﺘﻔﺎده از آﻧﻬﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺨﺼﻮص ﺑﻪ ﺧﻮد ،راﺣﺖ ﺗﺮ از اﻳﺠﺎد ﻳﻚ ﻛﻼس ﭘﻴﭽﻴﺪه و اﺳﺘﻔﺎده از آن در ﭼﻨﺪ ﺑﺮﻧﺎﻣﻪ اﺳﺖ .ﻓﻬﻤﻴﺪن اﻳﻨﻜﻪ ﻳﻚ ﻛﻼس را ﭼﮕﻮﻧﻪ ﺑﺎﻳﺪ ﻧﻮﺷﺖ ﺗﺎ ﻫﻢ ﺳـﺎدﮔﻲ در آن رﻋﺎﻳـﺖ ﺷـﻮد و ﻫـﻢ ﻗﺎﺑﻠﻴـﺖ اﺳﺘﻔﺎده ﻣﺠﺪد ،ﺑﻪ ﺗﺠﺮﺑﻪ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﺑﺴﺘﮕﻲ دارد .ﻫﺮﭼﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺑﻴﺸﺘﺮي ﺑﻨﻮﻳﺴﻴﺪ ،ﺑﻬﺘﺮ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻛـﻼس ﻫـﺎﻳﻲ ﻃﺮاﺣﻲ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ دو ﻓﺎﻛﺘﻮر در آﻧﻬﺎ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ رﻋﺎﻳﺖ ﺷﻮﻧﺪ.
ﻃﺮاﺣﻲ ﻳﻚ ﺷﻴﺊ: ﺑﺮ ﺧﻼف ﻣﻄﺎﻟﺒﻲ ﻛﻪ از اﺑﺘﺪاي ﻓﺼﻞ ﺗﺎﻛﻨﻮن ﺑﺮرﺳﻲ ﻛﺮده اﻳﻢ ،ﺑﻪ ﻋﻨﻮان اوﻟﻴﻦ ﭘﺮوژه اﻳﻦ ﻓﺼﻞ ﻧﻤﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ اﻟﮕﻮرﻳﺘﻢ ﺗﻌﺮﻳﻒ ﻛﺮده و ﺳﭙﺲ اﺷﻴﺎي ﻣﻮرد ﻧﻴﺎز آن را اﻳﺠﺎد ﻛﻨﻴﻢ .ﺑﻠﻜﻪ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﺑﺎ اراﺋﻪ ﻳﻚ ﻣﺜﺎل ،ﻛﺎرﺑﺮد ﻣﻄﺎﻟﺒﻲ ﻛﻪ در ﻗـﺴﻤﺘﻬﺎي ﻗﺒـﻞ ﺑـﻪ ﺻـﻮرت ﺗﺌﻮري ﺑﺎ آﻧﻬﺎ آﺷﻨﺎ ﺷﺪﻳﺪ را در ﻋﻤﻞ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .ﻣﺜﺎﻟﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد ،ﻃﺮاﺣﻲ ﻳـﻚ ﻛـﻼس ﺑـﺮاي اﺗﻮﻣﺒﻴـﻞ اﺳﺖ. در ﻣﻮرد ﭼﻨﻴﻦ ﻛﻼﺳﻲ ،اﺻﻮل ﻣﺸﺨﺼﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در اﺑﺘﺪا ﺑﺎﻳﺪ آﻧﻬﺎ را ﺑﺪاﻧﻴﺪ:
ﻇﺎﻫﺮ آن ﭼﮕﻮﻧﻪ اﺳﺖ :ﻇﺎﻫﺮ ﻳﻚ اﺗﻮﻣﺒﻴﻞ ﺷﺎﻣﻞ ﻣﻮاردي ﻣﺎﻧﻨﺪ ﻣﺪل ،رﻧﮓ ،ﺗﻌﺪاد درﻫﺎ و ﻣﻮاردي ﻣﺸﺎﺑﻪ اﺳﺖ .اﻳﻦ ﮔﻮﻧﻪ وﻳﮋﮔﻴﻬﺎي ﻳﻚ اﺗﻮﻣﺒﻴﻞ ﻫﻨﮕﺎم اﻳﺠﺎد ﺷﺪن آن ﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮد و ﻣﻌﻤﻮﻻً ﺗﺎ اﻧﺘﻬﺎي ﻋﻤﺮ ﺷﻴﺊ ﻧﻴﺰ ﺛﺎﺑﺖ اﺳﺖ. ﺗﻮاﻧﺎﻳﻲ ﻫﺎي آن ﭼﻴﺴﺖ :ﻗﺪرت و اﻧﺪازه ﻣﻮﺗﻮر ،ﺗﺮﻛﻴﺐ و ﺗﻌﺪاد ﺳﻴﻠﻨﺪرﻫﺎ و ﻏﻴﺮه. وﺿﻌﻴﺖ ﻛﻨﻮﻧﻲ آن ﭼﻴﺴﺖ :اﺗﻮﻣﺒﻴﻞ ﺛﺎﺑﺖ اﺳﺖ ،ﺑﻪ ﺟﻠﻮ ﺣﺮﻛﺖ ﻣﻲ ﻛﻨﺪ و ﻳﺎ ﺑﻪ ﻋﻘﺐ ﺣﺮﻛﺖ ﻣﻲ ﻛﻨـﺪ ،ﺳـﺮﻋﺖ و ﺟﻬﺖ آن ﭼﻘﺪر اﺳﺖ؟ 1 ﻣﻮﻗﻌﻴﺖ ﻣﻜﺎﻧﻲ آن ﭼﻴﺴﺖ :ﺷﻴﺊ اﺗﻮﻣﺒﻴﻞ ﻣﻌﻤﻮﻻ داراي ﺷﻴﺊ دﻳﮕﺮي از ﻧﻮع GPSاﺳﺖ ﻛـﻪ ﻣﻮﻗﻌﻴـﺖ ﻣﻜـﺎﻧﻲ آن را ﻧﺴﺒﺖ ﺑﻪ دﻳﮕﺮ اﺷﻴﺎ )ﻣﺜﻼً اﺗﻮﻣﺒﻴﻞ ﻫﺎي دﻳﮕﺮ( ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﻋﻼوه ﺑﺮ اﻳﻦ ﻣﻲ ﺧﻮاﻫﻴﺪ اﺷﻴﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ ،ﻗﺎﺑﻞ ﻛﻨﺘﺮل ﻧﻴﺰ ﺑﺎﺷﻨﺪ .ﺑﺮاي ﻣﺜﺎل:
ﺑﺘﻮاﻧﻴﺪ ﺳﺮﻋﺖ آن را ﻛﺎﻫﺶ دﻫﻴﺪ. ﺑﺘﻮاﻧﻴﺪ ﺳﺮﻋﺖ آن را اﻓﺰاﻳﺶ دﻫﻴﺪ. ﺑﺘﻮاﻧﻴﺪ ﺟﻬﺖ ﺣﺮﻛﺖ آن را ﺑﻪ ﺳﻤﺖ ﭼﭗ ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﺘﻮاﻧﻴﺪ ﺟﻬﺖ ﺣﺮﻛﺖ آن را ﺑﻪ ﺳﻤﺖ راﺳﺖ ﺗﻐﻴﻴﺮ دﻫﻴﺪ. ﺑﺘﻮاﻧﻴﺪ آن را ﻣﺘﻮﻗﻒ ﻛﻨﻴﺪ.
Global Positioning System
1
٣٣٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در اﺑﺘﺪاي ﻓﺼﻞ ﮔﻔﺘﻢ ،اﺑﺘﺪا ﺑﺎﻳﺪ ﺳﻪ ﻣﻮرد را در راﺑﻄﻪ ﺑﺎ اﻳﻦ ﻛﻼس ﻣﺸﺨﺺ ﻛﻨﻴﺪ :ﻫﻮﻳﺖ ،ﺣﺎﻟﺖ و رﻓﺘﺎر .ﻓﺮض ﻣﻲ ﻛﻨـﻴﻢ ﻛﻪ ﺟﻨﺒﻪ ﻫﻮﻳﺖ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه اﺳﺖ و اﺷﻴﺎي اﻳﻦ ﻛﻼس ﻣﻲ داﻧﻨﺪ ﻛﻪ از ﻧﻮع اﺗﻮﻣﺒﻴﻞ ﻫﺴﺘﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ ﺑﺮرﺳـﻲ دو ﺟﻨﺒـﻪ دﻳﮕـﺮ، ﻳﻌﻨﻲ ﺣﺎﻟﺖ و رﻓﺘﺎر ﻣﻲ ﭘﺮدازﻳﻢ.
ﺣﺎﻟﺖ: ﺣﺎﻟﺖ ،وﺿﻌﻴﺖ ﻛﻨﻮﻧﻲ ﻳﻚ ﺷﻴﺊ از ﻛﻼس را ﺗﻮﺻﻴﻒ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ،ﻣﻮﻗﻌﻴﺖ و ﺳﺮﻋﺖ اﺗﻮﻣﺒﻴﻞ ﺑﺨﺸﻲ از ﺣﺎﻟﺖ آن ﺑﻪ ﺷﻤﺎر ﻣـﻲ روﻧﺪ .ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻳﻚ ﻛﻼس ،اﺑﺘﺪا ﺑﺎﻳﺪ ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﺑﺮاي داﻧﺴﺘﻦ ﺣﺎﻟﺖ ﻳﻚ ﺷﻴﺊ ﭼﻪ ﻣﻮاردي را ﺑﺎﻳﺪ در ﻧﻈﺮ ﺑﮕﻴﺮﻳـﺪ .ﻫﻨﮕـﺎم ﻃﺮاﺣﻲ ﻛﻼس اﺗﻮﻣﺒﻴﻞ ﺳﺮﻋﺖ آن در ﺗﻌﻴﻴﻦ ﺣﺎﻟﺖ آن اﻫﻤﻴﺖ زﻳﺎدي دارد ،اﻣﺎ ﺑﺮاي ﻃﺮاﺣﻲ ﻛﻼس ،Customerﺳﺮﻋﺖ ﻣﻔﻬﻮﻣﻲ ﻧﺪارد ﺑﻠﻜﻪ آدرس ﻛﺎرﺑﺮ ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﻋﻮاﻣﻞ در ﺣﺎﻟﺖ ﻛﻨﻮﻧﻲ آن ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد. ﺣﺎﻟﺖ ﻳﻚ ﺷﻴﺊ ،ﻣﻌﻤﻮﻻ ﺑﻪ ﺻﻮرت ﻣﻘﺎدﻳﺮي درون آن ﻧﮕﻬﺪاري ﻣﻲ ﺷﻮﻧﺪ .ﺑﻌﻀﻲ از اﻳﻦ ﻣﻘﺎدﻳﺮ ﺑﻪ ﺻﻮرت ﻋﻤـﻮﻣﻲ ) (Publicدر اﺧﺘﻴﺎر ﻛﺎرﺑﺮان ﻗﺮار داده ﻣﻲ ﺷﻮﻧﺪ و ﻛﺎرﺑﺮان ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ وﺳﻴﻠﻪ ﺧﺼﻮﺻﻴﺎت ﻛﻼس آﻧﻬﺎ را ﺗﻐﻴﻴﺮ دﻫﻨﺪ ،ﺑﻌـﻀﻲ دﻳﮕـﺮ ﻧﻴـﺰ ﺑـﻪ ﺻـﻮرت ﺧﺼﻮﺻﻲ ) (Privateﻫﺴﺘﻨﺪ و ﻓﻘﻂ ﺑﻪ وﺳﻴﻠﻪ اﺷﻴﺎي آن ﻛﻼس ﻣﻲ ﺗﻮاﻧﻨﺪ اﺳـﺘﻔﺎده ﺷـﻮﻧﺪ .ﻫﻤﭽﻨـﻴﻦ ﺑﻌـﻀﻲ از ﺣﺎﻟﺘﻬـﺎي ﻳـﻚ ﻛﻼس ﻧﻴﺰ ،ﻓﻘﻂ ﻗﺎﺑﻞ ﺧﻮاﻧﺪن ﻫﺴﺘﻨﺪ و ﻛﺎرﺑﺮ ﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ آﻧﻬﺎ را ﺗﻐﻴﻴﺮ دﻫﺪ .ﺑـﺮاي ﻣﺜـﺎل اﺗﻮﻣﺒﻴـﻞ ﺧﺎﺻـﻴﺘﻲ ﺑـﻪ ﻧـﺎم ﺳﺮﻋﺖ ﺳﻨﺞ دارد ﻛﻪ ﺳﺮﻋﺖ ﺷﻴﺊ را در ﻫﺮ ﻟﺤﻈﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .ﻛﺎرﺑﺮ اﺗﻮﻣﺒﻴﻞ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﺪ اﻳﻦ ﺳﺮﻋﺖ را ﺑﺨﻮاﻧﺪ ،اﻣﺎ ﻧﻤﻲ ﺗﻮاﻧـﺪ آن را ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ ﺗﻐﻴﻴﺮ دﻫﺪ – ﺑﺮاي ﺗﻐﻴﻴﺮ آن ﺑﺎﻳﺪ ﺑﻪ وﺳﻴﻠﻪ ﻣﺘﺪﻫﺎﻳﻲ ﻣﺎﻧﻨﺪ Accelerateو ﻳﺎ Breakﺑﺎﻋﺚ اﻓﺰاﻳﺶ و ﻳﺎ ﻛﺎﻫﺶ ﺳﺮﻋﺖ ﺷﻮد.
رﻓﺘﺎر: ﺑﻪ ﻋﻜﺲ اﻟﻌﻤﻞ ﻳﻚ ﺷﻴﺊ از ﻛﻼس در ﻣﻘﺎﺑﻞ درﺧﻮاﺳﺘﻬﺎي ﻛﺎرﺑﺮ ،رﻓﺘﺎر آن ﺷﻴﺊ ﻣﻲ ﮔﻮﻳﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻣﺘﺪي را از ﻳﻚ ﺷﻴﺊ ﻓﺮاﺧـﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﺪ ،در ﺣﻘﻴﻘﺖ از ﺷﻴﺊ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ وﻇﻴﻔﻪ اي را ﺑﺮاي ﺷﻤﺎ اﻧﺠﺎم دﻫﺪ و آن ﺷﻴﺊ ﻧﻴﺰ در ﻣﻘﺎﺑﻞ اﻳﻦ درﺧﻮاﺳﺖ ﻋﻜﺲ اﻟﻌﻤﻠﻲ را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﻨﺎﺑﺮاﻳﻦ رﻓﺘﺎر ﻳﻚ ﺷﻴﺊ ﻣﻌﻤﻮﻻً ﺑﻪ ﻣﺘﺪﻫﺎ ﻣﺮﺑﻮط اﺳﺖ .اﻟﺒﺘﻪ رﻓﺘﺎر ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺧﺎﺻﻴﺘﻬﺎي ﻳﻚ ﺷﻴﺊ ﻧﻴﺰ ﻣﺮﺑﻮط ﺑﺎﺷﺪ .در ﻣﺜﺎل ﺗﻠﻮﻳﺰﻳﻮن ﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،اﮔﺮ ﺧﺎﺻﻴﺖ ﻛﺎﻧﺎل آن را ﺑﺮاﺑﺮ ﺑﺎ ﻋﺪد ﺧﺎﺻﻲ ﻗﺮار دﻫﻴﺪ ،ﺑﺎﻋـﺚ ﻣـﻲ ﺷـﻮﻳﺪ ﻛـﻪ آن ﺷﻴﺊ ﺑﺎ ﺗﻐﻴﻴﺮ ﺗﺼﻮﻳﺮ ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ،رﻓﺘﺎر ﺧﻮد را ﻧﻤﺎﻳﺶ دﻫﺪ. رﻓﺘﺎر ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﻣﻌﻤﻮﻻ ﺑﻪ ﺻﻮرت ﭼﻨﺪﻳﻦ ﺧﻂ ﻛﺪ اﺳﺖ ﻛﻪ وﻇﻴﻔﻪ ﺧﺎﺻﻲ را اﻧﺠﺎم ﻣﻲ دﻫﺪ .اﻳﻦ ﻛﺪﻫﺎ ﻣﻌﻤﻮﻻ ﻳﻚ و ﻳـﺎ ﻫـﺮ دوي ﻣﻮارد زﻳﺮ را درﺑﺮ ﻣﻲ ﮔﻴﺮﻧﺪ:
ﺗﻐﻴﻴﺮ ﺣﺎﻟﺖ ﺧﻮد ﺷﻴﺊ :ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﺘﺪ Accelerateرا ﺑﺮاي ﺷﻴﺊ از ﻛﻼس اﺗﻮﻣﺒﻴـﻞ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ ﻛﻨﻴـﺪ، ﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻳﺪ ﻛﻪ آن ﺷﻴﺊ ﺳﺮﻳﻌﺘﺮ ﺣﺮﻛﺖ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺣﺎﻟﺖ آن را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﺪ. اﺛﺮ ﮔﺬاﺷﺘﻦ روي دﻧﻴﺎي ﺧﺎرج از ﺷﻴﺊ :اﻳﻦ ﻣﻮرد ﻣﻲ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﺗﻐﻴﻴﺮ دادن اﺷﻴﺎي دﻳﮕﺮ در ﺑﺮﻧﺎﻣﻪ ،ﻧﻤﺎﻳﺶ ﻣﻄﻠﺒﻲ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ،ذﺧﻴﺮه اﻃﻼﻋﺎت روي دﻳﺴﻚ ،ﻳﺎ ﭼﺎپ ﻳﻚ ﺳﻨﺪ از ﺑﺮﻧﺎﻣﻪ ﺑﺎﺷﺪ.
در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﺮده و ﻛﻼس Carرا در آن ﺑﻪ وﺟﻮد ﻣﻲ آورﻳﻢ.
٣٣٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﭘﺮوژه ﺟﺪﻳﺪ و ﻛﻼس Car (1وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را اﺟﺮا ﻛﺮده و از ﻧﻮار ﻣﻨﻮ ﮔﺰﻳﻨﻪ … File New Projectرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ. (2ﻫﻨﮕﺎﻣﻲ ﻛـﻪ ﻛـﺎدر New Projectﻧﻤـﺎﻳﺶ داده ﺷـﺪ ،از ﻗـﺴﻤﺖ Templatesﮔﺰﻳﻨـﻪ Console Applicationرا اﻧﺘﺨﺎب ﻛﺮده ،ﻧﺎم Objectsرا در ﻛﺎدر Nameوارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد. (3ﺣﺎل ﺑﺎﻳﺪ ﻳﻚ ﻛﻼس ﺟﺪﻳﺪ ﺑﻪ اﻳﻦ ﭘﺮوژه اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .در ﭘﻨﺠـﺮه Solution Explorerروي ﻧـﺎم ﭘـﺮوژه ﻛﻠﻴـﻚ راﺳـﺖ ﻛـﺮده و ﮔﺰﻳﻨـﻪ Add Classرا اﻧﺘﺨـﺎب ﻛﻨﻴـﺪ .در ﻛـﺎدر – Add New Item Objectsﻧﺎم Car.csرا ﺑﻪ ﻋﻨﻮان ﻧﺎم ﻛﻼس ﻣﺸﺨﺺ ﻛﺮده و روي دﻛﻤﻪ Addﻛﻠﻴﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳـﻦ ﺗﺮﺗﻴـﺐ ﻛﻼس ﺟﺪﻳﺪ اﻳﺠﺎد ﺷﺪه و ﺑﻪ Solution Explorerﻧﻴﺰ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد.
ﻧﮕﻬﺪاري ﺣﺎﻟﺖ: ﺗﺎﻛﻨﻮن ﻣﺘﻮﺟﻪ ﺷﺪﻳﻢ ﺣﺎﻟﺖ ﻳﻚ ﺷﻴﺊ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آن ﺷﻴﺊ در راﺑﻄﻪ ﺑﺎ ﺧﻮد ﭼﻪ ﭼﻴﺰﻫﺎﻳﻲ را ﻣﻲ داﻧﺪ .اﻣﺎ ﺳﻮاﻟﻲ ﻛـﻪ در اﻳﻨﺠـﺎ ﭘﻴﺶ ﻣﻲ آﻳﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﭼﮕﻮﻧﻪ ﺣﺎﻟﺖ ﻳﻚ ﺷﻴﺊ را در آن ﻧﮕﻬﺪاري ﻛﻨﻴﻢ؟ ﺧﻮب ،ﻋﻤﻮﻣﺎً ﺑﺮاي اﻳﻦ ﻛـﺎر ،ﻣﺘﻐﻴﺮﻫـﺎﻳﻲ را درون ﻛـﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻨﺪ و ﺳﭙﺲ ﺣﺎﻟﺖ ﺷﻴﺊ را در آﻧﻬﺎ ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﻨﺪ .در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﺑﻪ اﻳﻦ ﻣﺘﻐﻴﺮ ﻫﺎ ﻓﻴﻠﺪ 1ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد. ﻣﻌﻤﻮﻻ ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ ﻛﻪ در ﻳﻚ ﻛﻼس اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ،ﻳﺎ ﺣﺎﻟﺖ ﺷﻴﺊ را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ و ﻳﺎ از آن ﺑﺮاي اﻧﺠﺎم وﻇﻴﻔﻪ ﺧـﻮد اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺧﺎﺻﻴﺘﻲ اﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ رﻧﮓ ﻳﻚ ﺷﻴﺊ از ﻛﻼس Carرا ﻣﺸﺨﺺ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕـﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ اﻳﻦ ﺧﺎﺻﻴﺖ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﻓﻴﻠﺪ اﻳﻦ ﺣﺎﻟﺖ ﺗﻐﻴﻴﺮ ﻛﺮده و ﻣﻘﺪار ﺟﺪﻳﺪ رﻧﮓ را در ﺧﻮد ذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ را ﺑﺪﺳﺖ آورﻳﺪ ،ﻓﻴﻠﺪ اﻳﻦ ﺣﺎﻟﺖ ﺧﻮاﻧﺪه ﺧﻮاﻫﺪ ﺷﺪ و ﻣﻘﺪار آن ﺑﻪ ﻋﻨﻮان رﻧﮓ ﺷﻴﺊ ﺑﻪ ﺷﻤﺎ ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد. از ﻳﻚ ﺟﻬﺖ ،ﻣﻲ ﺗﻮان ﮔﻔﺖ ﻛﻪ ﺧﺎﺻﻴﺖ ﻫﺎ ﻧﻴﺰ ﻣﺎﻧﻨﺪ ﻣﺘﺪﻫﺎ ﺑﺎﻋﺚ ﺑﺮوز رﻓﺘﺎر از ﺷﻴﺊ ﻣﻲ ﺷﻮﻧﺪ .ﻫﺮ ﺧﺎﺻﻴﺖ ،ﻣﻌﻤﻮﻻً از دو ﻣﺘﺪ ﺗـﺸﻜﻴﻞ ﺷﺪه اﺳﺖ :ﻣﺘﺪ getو ﻣﺘﺪ ) setﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﺑﻼﻛﻬﺎي } … { getو }…{ setﻣﺸﺨﺺ ﻣﻲ ﺷﻮﻧﺪ( .ﻳـﻚ ﻣﺘـﺪ ﺳـﺎده getﺑﺮاي ﺧﺎﺻﻴﺖ Colorدر ﻛﻼس ،Carﻓﻘﻂ ﺷﺎﻣﻞ ﻛﺪي اﺳﺖ ﻛﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ذﺧﻴﺮه ﺷﺪه در ﻓﻴﻠـﺪ ﻣﺮﺑـﻮط ﺑـﻪ اﻳـﻦ ﺣﺎﻟﺖ ،رﻧﮓ ﺷﻴﺊ را ﺑﻪ ﻛﺎرﺑﺮ اﻋﻼم ﻣﻲ ﻛﻨﺪ ،ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﻣﺘﺪ ﺳﺎده setﺑﺮاي ﺧﺎﺻﻴﺖ Colorﻓﻘـﻂ ﺷـﺎﻣﻞ ﻛـﺪي اﺳـﺖ ﻛـﻪ ﻣﻘﺪار اﻳﻦ ﻓﻴﻠﺪ را ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ ﻛﺎرﺑﺮ ﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﺪ. اﻣﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي واﻗﻌﻲ اﻳﻦ ﻣﺘﺪﻫﺎ در ﺧﺎﺻﻴﺖ Colorﺑﻪ اﻳﻦ ﺳﺎدﮔﻲ ﻧﻴﺴﺘﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ از ﻛﻼس Car در ﻳﻚ ﺑﺎزي اﺗﻮﻣﺒﻴﻞ راﻧﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﺧﺎﺻﻴﺖ Colorﻳﻚ ﺷﻴﺊ از ﻛﻼس Carرا ﺗﻐﻴﻴﺮ داد، ﻣﺘﺪ setاز اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺎﻳﺪ ﻋﻼوه ﺑﺮ ذﺧﻴﺮه رﻧﮓ در ﻓﻴﻠﺪ ﻣﺮﺑﻮﻃﻪ ،رﻧﮓ اﺗﻮﻣﺒﻴﻠﻲ ﻛﻪ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪه اﺳﺖ را ﻧﻴﺰ ﺗﻐﻴﻴـﺮ دﻫﺪ. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﺑﺮاي اﻳﺠﺎد ﺧﺎﺻﻴﺖ Colorدر ﻛﻼس ،Carﻳﻚ ﻓﻴﻠﺪ ﺑﻪ ﻧﺎم Colorو از ﻧﻮع ) publicﺗـﺎ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ ﻧﻴﺰ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﺪ( ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ .دﻗﺖ ﻛﻨﻴﺪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻦ ﻛﻪ در اﻳﻦ ﻣﺜﺎل از ﻓﻴﻠﺪ ﺑﻪ ﺟﺎي ﺧﺎﺻـﻴﺖ اﺳـﺘﻔﺎده ﻛﺮده اﻳﻢ ،اﻣﺎ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي واﻗﻌﻲ ﻫﻴﭽﮕﺎه ﻧﺒﺎﻳﺪ ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ از ﻳﻚ ﺧﺎﺻﻴﺖ ﺑﺎ ﻣﺘﺪﻫﺎي getو setاﻳﺠﺎد ﻛﻨﻴﺪ ،از ﻓﻴﻠﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
Field
1
٣٤٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻧﻤﻮﻧﻪ ﺳﺎزي ﻳﻚ ﺷﻴﺊ و اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ Color (1ﻛﺪ زﻳﺮ را ﺑﻪ ﻛﻼس Carاﺿﺎﻓﻪ ﻛﻨﻴﺪ: ;public string Color (2ﻛﺪ ﻻزم ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻓﻴﻠﺪ ﺑﻪ ﻛﻼس ،ﻫﻤﻴﻦ ﺑﻮد! ﺣﺎل ﺑﺎﻳﺪ ﺑﻪ ﻧﺤﻮي از ﻛﻼﺳﻲ ﻛﻪ اﻳﺠﺎد ﻛﺮده اﻳﻢ اﺳﺘﻔﺎده ﻛﻨـﻴﻢ ﺗﺎ ﻋﻤﻠﻜﺮد آن را ﺑﺒﻴﻨﻴﻢ .ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه ،Solution Explorerﻓﺎﻳﻞ Program.csرا ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )static void Main(string[] args { // Create a new Car ;)(Car objCar = new Car // Set the Color property to Red ;"objCar.Color = "Red // Show what the value of the property is ;)" Console.WriteLine("My car is this color: ;)Console.WriteLine(objCar.Color // Wait for input from the user ;)(Console.ReadLine } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﭘﻨﺠﺮه ﺟﺪﻳﺪي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 1-9ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 1-9 (4ﺑﺮاي اﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﺪ Enterرا از ﺻﻔﺤﻪ ﻛﻠﻴﺪ ﻓﺸﺎر دﻫﻴﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺗﻌﺮﻳﻒ ﻳﻚ ﻓﻴﻠﺪ ﺑﺴﻴﺎر راﺣﺖ اﺳﺖ .ﻛﺪ:
٣٤١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;public string Color ﺑﻪ ﻛﻼس ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻳﻚ ﻓﻴﻠﺪ ﺑﻪ ﻧﺎم Colorاﻳﺠﺎد ﻛﻨﻴﺪ و در آن رﺷﺘﻪ اي از ﻛﺎراﻛﺘﺮ ﻫـﺎ را ﻧﮕﻬـﺪاري ﻛﻨﻴـﺪ .ﻛﻠﻤـﻪ ﻛﻠﻴﺪي publicدر اﺑﺘﺪاي اﻳﻦ ﻓﻴﻠﺪ ﺑﻪ ﻛﻼس ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ اﻳﻦ ﻓﻴﻠﺪ ﺑﻪ وﺳﻴﻠﻪ ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳـﺴﺎﻧﻲ ﻛـﻪ ﺑﺨﻮاﻫﻨـﺪ از اﻳﻦ ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻨﺪ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﺪ. ﻧﻜﺘﻪ :ﻣﺘﻐﻴﺮﻫﺎﻳﻲ ﻛﻪ در ﺑﺪﻧﻪ ﻳﻚ ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮﻧﺪ )ﻳﻌﻨﻲ درون ﺧﻮد ﻛﻼس ﺗﻌﺮﻳﻒ ﺷـﺪه اﻧـﺪ ،ﻧـﻪ در ﻣﺘـﺪﻫﺎي ﻣﻮﺟـﻮد در آن ﻛﻼس( ،از دﻳﺪ ﺧﻮد ﻛﻼس ،ﻋﻀﻮ داده اي و از دﻳﺪ ﻛﺴﺎﻧﻲ ﻛﻪ از ﻛﻼس اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻓﻴﻠﺪ ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮﻧﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻛﺪ ﻧﻮﺷﺘﻪ ﺷﺪه در ﻓﺎﻳﻞ Program.csﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﺳﺘﻔﺎده از ﻳﻚ ﻛﻼس ﺑﺴﻴﺎر راﺣﺖ اﺳﺖ .اﻳﻦ ﭘﺮوﺳﻪ از دو ﻣﺮﺣﻠﻪ ﺗﺸﻜﻴﻞ ﻣﻲ ﺷﻮد .اﺑﺘﺪا ﺑﺎﻳﺪ ﻣﺘﻐﻴﺮي را ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ﻛﻪ ﺑﺘﻮاﻧﺪ ﺷﻴﺊ از آن ﻛﻼس را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ؛ ﺳﭙﺲ آن ﺷﻴﺊ را ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﻛﻨﻴﺪ .ﻛﺪ زﻳﺮ ﻣﺘﻐﻴﺮي را ﺑﻪ ﻧﺎم objCarﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﺪ و ﺑﻪ آن ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﻓﻘﻂ ﺑﺎﻳﺪ اﺷﻴﺎﻳﻲ از ﻛﻼس Car را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ. ;Car objCar ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ،objCarاﻳﻦ ﻣﺘﻐﻴﻴﺮ ﺷﺎﻣﻞ ﻫﻴﭻ ﺷﻴﺊ از ﻛﻼس Carﻧﻴﺴﺖ ،زﻳﺮا ﻓﻘﻂ ﻧﻮع ﺷﻴﺊ ﻛﻪ ﺑﺎﻳﺪ در اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻧﮕﻬـﺪاري ﺷﻮد را ﻣﺸﺨﺺ ﻛﺮده اﻳﺪ .اﻳﻦ ﺧﻂ ﻛﺪ ﻣﺎﻧﻨﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﻪ ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﮕﻮﻳﻴﺪ ﻗﻠّﺎﺑﻲ ﺑﻪ ﺷﻤﺎ ﺑﺪﻫﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﻴﺪ ﻳﻚ ﺷـﻴﺊ از ﻛﻼس Carرا آوﻳﺰان ﻛﻨﻴﺪ ،و ﺳﭙﺲ ﻧﺎم آن ﻗﻠّﺎب را objCarﻗﺮار دﻫﻴﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﻮز ﻫﻴﭻ ﭼﻴﺰ ﺑﻪ اﻳﻦ ﻗﻠّﺎب آوﻳﺰان ﻧﻜﺮده اﻳﺪ. ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس Carرا ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﻨﻴﺪ .اﻳﻦ ﻋﻤﻞ ﺑﻪ وﺳﻴﻠﻪ ﻛﻠﻤﻪ ﻛﻠﻴﺪي newاﻧﺠﺎم ﻣﻲ ﺷﻮد: ;)(objCar = new Car اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻠﻬﺎي ﻗﺒﻠﻲ ﻧﻴﺰ دﻳﺪﻳﺪ ،ﻣﻲ ﺗﻮان اﻳﻦ دو ﻣﺮﺣﻠﻪ را در ﻳﻚ ﺧﻂ اﻧﺠﺎم داد: ;)(Car objCar = new Car ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺧﻂ ﺑﻪ وﻳﮋوال C#ﻣﻲ ﮔﻮﻳﻴﺪ ﻛﻪ " objCarرا ﺑﻪ ﺷﻴﺊ ﻛﻪ ﺟﺪﻳﺪاً از ﻛﻼس Carﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪه اﺳﺖ ارﺟﺎع ﺑﺪه" .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ "ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪ از ﻛﻼس Carﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﺮده و آن را از ﻗﻠّﺎﺑﻲ ﺑﻪ ﻧﺎم objCarآوﻳﺰان ﻛﻦ". ﻧﻜﺘﻪ :ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ،ﻳﻚ ﺷﻴﺊ ﻣﻲ ﺗﻮاﻧﺪ در ﻳﻚ ﻟﺤﻈﻪ از ﭼﻨـﺪﻳﻦ ﻗﻠّـﺎب آوﻳـﺰان ﺷـﻮد ،و ﺑﻨـﺎﺑﺮاﻳﻦ داراي ﭼﻨﺪﻳﻦ ﻧﺎم ﺑﺎﺷﺪ .اﻳﻦ ﻣﻮرد ﻣﻤﻜﻦ اﺳﺖ ﻛﻤﻲ ﮔﻴﺞ ﻛﻨﻨﺪه ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ ،اﻣﺎ در ﺑﺴﻴﺎري از ﻣﻮارد ﺑﺎﻋﺚ راﺣﺘﻲ ﻛﺎرﻫﺎ ﻣﻲ ﺷﻮد .ﺗﺼﻮر ﻛﻨﻴـﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺴﺘﻴﺪ ﻛﻠﻴﺪﻫﺎي ﺧﻮد را در ﻳﻚ زﻣﺎن از ﭼﻨﺪ ﺟﺎ آوﻳﺰان ﻛﻨﻴﺪ – ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﭘﻴﺪا ﻛﺮدن آﻧﻬﺎ ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ ﺑﻮد!
٣٤٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻌﺪ از اﻳﻨﻜﻪ ﻳﻚ ﻧﻤﻮﻧﻪ از ﺷﻴﺊ اﻳﺠﺎد ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺖ ﻫﺎي آن را ﺗﻨﻈﻴﻢ و ﻳﺎ ﻣﺘـﺪﻫﺎي آن را ﻓﺮاﺧـﻮاﻧﻲ ﻛﻨﻴـﺪ .ﺑـﺮاي ﺗﻨﻈـﻴﻢ ﺧﺎﺻﻴﺖ 1Colorﺷﻴﺊ ﺟﺪﻳﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻛﺪ زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: // Set the Color property to Red ;"objCar.Color = "Red ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻣﻘﺪار ﻳﻚ ﺧﺎﺻﻴﺖ را ﺗﻨﻈﻴﻢ ﻛﺮدﻳﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻫﺮ ﭼﻨﺪ ﺑﺎر ﻛﻪ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﺑﻪ آن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﺪ و ﻳﺎ ﻣﺠﺪداً ﻣﻘـﺪار آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .در اﻳﻨﺠﺎ ،ﻧﺤﻮه دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار ﻳﻚ ﺧﺎﺻـﻴﺖ را ﺑـﺎ ارﺳـﺎل ﺧﺎﺻـﻴﺖ Colorﺑـﻪ ﻣﺘـﺪ WriteLineاز ﻛﻼس Consoleﻧﻤﺎﻳﺶ داده اﻳﻢ: // Show what the value of the property is ;)" Console.WriteLine("My car is this color: ;)Console.WriteLine(objCar.Color ﺧﻂ Console.ReadLineﺑﻪ اﻳﻦ ﺧﺎﻃﺮ اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻌﺪ از اﺗﻤﺎم ﻛﺎر ﺻﺒﺮ ﻛﻨﺪ ﺗﺎ ﻛﺎرﺑﺮ ﻛﻠﻴﺪ Enterرا ﻓﺸﺎر دﻫﺪ، ﺳﭙﺲ ﺑﺴﺘﻪ ﺷﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﭘﻨﺠﺮه ﻛﻨﺴﻮل ﻗﺒﻞ از ﺑﺴﺘﻪ ﺷﺪن ﺻﺒﺮ ﻣﻲ ﻛﻨﺪ ﺗﺎ ﻛﻠﻴﺪ Enterرا ﻓﺸﺎر دﻫﻴﺪ. // Wait for input from the user ;)(Console.ReadLine ﻧﻜﺘﻪ :ﺑﺮﻧﺎﻣﻪ ﻫﺎي Consoleدر ،.NETﻳﻚ روش ﺧﻮب ﺑﺮاي ﺗﺴﺖ ﻋﻤﻠﻜﺮد ﻛﻼس ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻧﻤﻮد ﻇﺎﻫﺮي ﻧﺪارﻧـﺪ و ﻓﻘﻂ در ﺣﺎﻓﻈﻪ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ ،زﻳﺮا ﺑﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ ﺑﻪ اﻳﺠﺎد ﻳﻚ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﻧﻤﺎﻳﺶ ﭼﻨﺪ ﺧﻂ ﻣﺘﻦ در ﻣﻮاﻗﻊ ﻣﻮرد ﻧﻴﺎز از وﺿﻌﻴﺖ ﺷﻴﺊ ﻣﻄﻠﻊ ﺷﻮﻳﺪ.
ﺧﺎﺻﻴﺖ ﻫﺎي ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ: در ﻗﺴﻤﺖ ﻗﺒﻞ ﺑﺎ ﻧﺤﻮه اﻳﺠﺎد ﻳﻚ ﻋﻀﻮ داده اي )ﻳﺎ ﻫﻤﺎن ﻓﻴﻠﺪ( ﺑﺮاي ﻛﻼس آﺷﻨﺎ ﺷﺪﻳﺪ و ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣـﻲ ﺗـﻮان از آن اﺳﺘﻔﺎده ﻛﺮد .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ﻫﻴﭽﮕﺎه ﻧﺒﺎﻳﺪ اﺟﺎزه دﻫﻴﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ ﻣﻘﺪار ﻣﻮﺟﻮد در ﻳﻚ ﻓﻴﻠـﺪ را ﺗﻐﻴﻴـﺮ دﻫـﺪ ،ﺑﻠﻜـﻪ ﻫﻤﻮاره ﺑﺎﻳﺪ ﻳﻚ ﺧﺎﺻﻴﺖ اﻳﺠﺎد ﻛﻨﻴﺪ ﺗﺎ ﻛﺎرﺑﺮ ﺑﻪ وﺳﻴﻠﻪ آن ﺧﺎﺻﻴﺖ ﻣﻘﺪار ﻓﻴﻠﺪ را ﺗﻐﻴﻴﺮ دﻫﺪ و ﻳﺎ ﺑﻪ آن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﺧﺎﺻﻴﺖ ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ دو ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮﻧﺪ ،اﻣﺎ ﻧﺤﻮه اﺳﺘﻔﺎده از آﻧﻬﺎ ﺑﺮاي ﻛﺎرﺑﺮ ،دﻗﻴﻘﺎً ﻣﺸﺎﺑﻪ ﻓﻴﻠﺪ ﻫﺎ اﺳـﺖ .در ﺣﻘﻴﻘـﺖ ﻣـﻲ ﺗـﻮاﻧﻴﻢ ﺑﮕﻮﻳﻴﻢ ﺧﺎﺻﻴﺖ ﻫﺎ ،ﻣﺘﺪﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﻣﺸﺎﺑﻪ ﻳﻚ ﻓﻴﻠﺪ ﺑﺎ آﻧﻬﺎ ﻛﺎر ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ،اﻧﺘﺨﺎب اﻳﻦ ﻛﻪ ﺑﺮاي ﻳﻚ ﻣﻮرد ﺧﺎص از ﻣﺘﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﻳﺎ از ﺧﺎﺻﻴﺖ ،ﺑﻪ اﻳﻦ ﺑﺴﺘﮕﻲ دارد ﻛﻪ ﻛﺎرﺑﺮ ﺑﺎ ﻛﺪاﻣﻴﻚ ﻣﻲ ﺗﻮاﻧﺪ راﺣﺖ ﺗﺮ ﻛﺎر ﻛﻨﺪ. ﻳﻜﻲ از ﻣﺸﻜﻼﺗﻲ ﻛﻪ در ﺻﻮرت دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﻛﺎرﺑﺮ ﺑﻪ ﻓﻴﻠﺪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻪ وﺟﻮد آﻳﺪ ،اﻳﻦ اﺳﺖ ﻛﻪ در اﻳﻦ ﺻﻮرت ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﻫﻢ ﻣﻘﺪار ﻣﻮﺟﻮد در ﻓﻴﻠﺪ را ﺑﺨﻮاﻧﺪ و ﻫﻢ آن را ﺗﻐﻴﻴﺮ دﻫﺪ .در ﺷﺮاﻳﻄﻲ ﻣﻤﻜﻦ اﺳﺖ ﻧﺨﻮاﻫﻴﺪ اﺟﺎزه دﻫﻴﺪ ﻛﻪ ﻛﺎرﺑﺮ ﻓﻴﻠـﺪ را ﺗﻐﻴﻴـﺮ دﻫـﺪ، ﺑﻠﻜﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻓﻴﻠﺪ ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﺎﺷﺪ و ﻛﺎرﺑﺮ ﻓﻘﻂ ﺑﺘﻮاﻧﺪ اﻃﻼﻋﺎت آن را ﺑﺨﻮاﻧﺪ. 1در ﻛﻼس Color ،Carﻳﻚ ﻓﻴﻠﺪ اﺳﺖ ﻧﻪ ﻳﻚ ﺧﺎﺻﻴﺖ .اﻟﺒﺘﻪ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻧﻴﺰ ﻣﺎﻧﻨﺪ اﺳﺘﻔﺎده از ﻓﻴﻠﺪ اﺳﺖ و ﻓﻘﻂ ﻧﺤﻮه ﺗﻌﺮﻳﻒ آن در ﻛـﻼس ﺗﻔـﺎوت دارد .در اﻳﻦ ﻛﻼس ﺑﺮاي ﺳﺎده ﮔﻲ Color ،را ﺑﻪ ﺻﻮرت ﻓﻴﻠﺪ ﺗﻌﺮﻳﻒ ﻛﺮده اﻳﻢ ،وﻟﻲ ﺑﺮاي اﻳﻨﻜﻪ ﻣﻲ ﺧـﻮاﻫﻴﻢ ﺧﺎﺻـﻴﺖ ﻫـﺎ را ﺑﺮرﺳـﻲ ﻛﻨـﻴﻢ ،از آن ﺑـﻪ ﻋﻨـﻮان ﺧﺎﺻﻴﺖ ﻳﺎد ﻣﻲ ﻛﻨﻴﻢ.
٣٤٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﺮﻋﺖ اﺗﻮﻣﺒﻴﻞ ﻳﻚ ﻧﻤﻮﻧﻪ ﺧﻮب ﺑﺮاي اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﺷﻮد ﭼﮕﻮﻧﻪ ﻣﺪﻟﻲ از ﻳﻚ ﺷﻴﺊ واﻗﻌﻲ در ﻛﺎﻣﭙﻴﻮﺗﺮ ،ﺑﺎﻳﺪ دﻗﻴﻘﺎً ﻣﺸﺎﺑﻪ ﻫﻤﺎن ﺷﻴﺊ ﻋﻤﻞ ﻛﻨﺪ .در ﻳﻚ اﺗﻮﻣﺒﻴﻞ واﻗﻌﻲ اﮔﺮ در ﺣﺎل ﺣﺮﻛﺖ ﺑﺎ ﺳﺮﻋﺖ 60ﻛﻴﻠﻮﻣﺘﺮ در ﺳﺎﻋﺖ ﻫﺴﺘﻴﺪ ،ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺎدﮔﻲ ﺳﺮﻋﺖ را ﺑـﻪ ﻫﺮ ﻋﺪدي ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از ﺳﺮﻋﺖ ﺳﻨﺞ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻋﺪد ﺳﺮﻋﺖ را ﺑﺨﻮاﻧﻴﺪ ،اﻣﺎ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ اﻧﮕﺸﺖ ﻋﻘﺮﺑﻪ ي ﺳﺮﻋﺖ ﺳﻨﺞ را ﺟﺎ ﺑﻪ ﺟﺎ ﻛﻨﻴﺪ ﺗﺎ ﺳﺮﻋﺖ اﺗﻮﻣﺒﻴﻞ ﺗﻐﻴﻴﺮ ﻛﻨﺪ .ﺑﺮاي ﺗﻐﻴﻴﺮ ﺳﺮﻋﺖ ﺑﺎﻳﺪ از ﭘﺪال ﮔﺎز و ﻳﺎ ﭘﺪال ﺗﺮﻣﺰ ﺑﺮاي اﻓﺰاﻳﺶ و ﻳﺎ ﻛﺎﻫﺶ ﺳﺮﻋﺖ اﺗﻮﻣﺒﻴﻞ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺪل ﻛﺮدن ﻋﻤﻠﻜﺮد اﻳﻦ ﭘﺪاﻟﻬﺎ در ﻛﻼس ،Carﺑﺎﻳﺪ ﻣﺘﺪﻫﺎﻳﻲ اﻳﺠﺎد ﻛﻨﻴـﺪ ﻛـﻪ ﺳـﺮﻋﺖ را ﺗﻐﻴﻴـﺮ دﻫﻨﺪ ) ،(Decelerate ،Accelerateﻫﻤﭽﻨﻴﻦ ﻳﻚ ﺧﺎﺻﻴﺖ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﻧﻴﺰ ﺑـﻪ ﻧـﺎم Speedاﻳﺠـﺎد ﻛﻨﻴـﺪ ﺗـﺎ ﺳﺮﻋﺖ ﻛﻨﻮﻧﻲ اﺗﻮﻣﺒﻴﻞ را ﻧﻤﺎﻳﺶ دﻫﺪ. ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از اﻳﻦ ﻣﺸﻜﻞ و ﻫﻤﭽﻨﻴﻦ ﻣﺸﻜﻼت ﻣﺸﺎﺑﻪ ،از ﻳﻚ ﺧﺎﺻﻴﺖ ﺑﺮاي درﻳﺎﻓﺖ ﻣﻘـﺪار اﻳـﻦ ﻓﻴﻠـﺪ اﺳـﺘﻔﺎده ﻛﻨﻴﻢ ﺗﺎ ﺑﺘﻮاﻧﻴﻢ ﻗﺒﻞ از ﻗﺮار دادن ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ در ﻓﻴﻠﺪ ،از درﺳﺖ ﺑﻮدن آن ﻣﻄﻤﺌﻦ ﺷﻮﻳﻢ. اﻟﺒﺘﻪ ﺑﺮاي ﻧﮕﻬﺪاري ﻣﻘﺪار ﺳﺮﻋﺖ ﻣﺴﻠﻤﺎً ﺑﻪ ﻳﻚ ﻋﻀﻮ داده اي در ﻛﻼس ﻧﻴﺎز دارﻳﺪ ،اﻣﺎ اﻳـﻦ ﻋـﻀﻮ داده اي ﺑﺎﻳـﺪ ﻓﻘـﻂ ﺑﺘﻮاﻧـﺪ ﺗﻮﺳـﻂ اﻋﻀﺎي ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد و ﻳﺎ ﺗﻐﻴﻴﺮ داده ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﺮاي ﺗﻌﺮﻳﻒ آن از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي privateاﺳـﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ: ;private int _speed ﻣﺘﻐﻴﻴﺮ _speedدر اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺻﻮرت privateﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﺪ ﺗﻮﺳﻂ ﻣﺘﺪﻫﺎﻳﻲ ﻛﻪ در داﺧـﻞ ﻛﻼس وﺟﻮد دارﻧﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد .ﻛﺎرﺑﺮان ﻛﻼس ،Carﺣﺘﻲ از وﺟﻮد ﭼﻨﻴﻦ ﻋﻀﻮي ﻧﻴﺰ ﻣﻄﻠﻊ ﻧﺨﻮاﻫﻨﺪ ﺑـﻮد .ﻫﻤﭽﻨـﻴﻦ در ﻛﻼس ﺧﺎﺻﻴﺘﻲ ﺑﻪ ﻧﺎم Speedﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻛﺎرﺑﺮ ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﺪ از ﻣﻘﺪار اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻛﻪ ﻧـﺸﺎن دﻫﻨـﺪه ﺳـﺮﻋﺖ ﺷـﻴﺊ اﺳﺖ ﻣﻄﻠﻊ ﺷﻮد .در اﻳﻦ ﻛﻼس ﻧﺎم ﻓﻴﻠﺪ ﻣﺮﺑﻮط ﺑﻪ ﺳﺮﻋﺖ و ﻫﻤﭽﻨﻴﻦ ﺧﺎﺻﻴﺖ آن ﻳﻜﻲ اﺳﺖ ،ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از اﻳﻦ ﺗﺸﺎﺑﻪ ﻣﻌﻤـﻮﻻً در اﺑﺘﺪاي ﻧﺎم ﻓﻴﻠﺪ ،ﻳﻚ زﻳﺮ ﺧﻂ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻧﺎم ﻓﻴﻠﺪ _speed ،و ﻧﺎم ﺧﺎﺻﻴﺖ Speed ،ﺧﻮاﻫﺪ ﺷﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ Speed (1ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮي ﻛﻪ ﻓﻘﻂ ﺑﻪ وﺳﻴﻠﻪ اﻋﻀﺎي ﻛـﻼس ﻗﺎﺑـﻞ دﺳﺘﺮﺳـﻲ ﺑﺎﺷـﺪ ،ﺑـﻪ ﺟـﺎي ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي publicاز privateاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﻛﺪ زﻳﺮ را ﺑﻪ ﻛﻼس Carاﺿﺎﻓﻪ ﻛﻨﻴﺪ: ;private int _speed (2ﺑﺮاي اﻳﻨﻜﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ از اﻧﺪازه ﺳﺮﻋﺖ ﻣﻄﻠﻊ ﺷﻮد ،ﺑﺎﻳﺪ ﻳﻚ ﺧﺎﺻﻴﺖ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺑﻪ ﻛﻼس اﺿﺎﻓﻪ ﻛﻨﻴﻢ .ﻛـﺪ زﻳـﺮ را ﺑـﻪ ﻛﻼس Carاﺿﺎﻓﻪ ﻛﻨﻴﺪ: // Speed - Read-Only property to return the speed public int Speed { get { ;return _speed } }
٣٤٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳـﻦ ﻣﺘـﺪ ﻣﻘـﺪاري را ﺑـﺮ ﺣـﺴﺐ. ﺑﺮاي ﺗﻨﻈﻴﻢ ﺳﺮﻋﺖ اﺗﻮﻣﺒﻴﻞ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢAccelerate ( ﺣﺎل ﻣﺘﺪي را ﺑﻪ ﻧﺎم3 ﻛـﺪ زﻳـﺮ را ﺑﻌـﺪ از ﺧﺎﺻـﻴﺖ.ﻛﻴﻠﻮﻣﺘﺮ ﺑﺮ ﺳﺎﻋﺖ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﺳﺮﻋﺖ ﺷﻴﺊ را ﺑﺮاﺑﺮ آن ﻗﺮار ﻣـﻲ دﻫـﺪ : وارد ﻛﻨﻴﺪSpeed // Accelerate - Add kmph to the speed public void Accelerate(int accelerateBy) { // Adjust the speed _speed += accelerateBy; } ﻓﺎﻳﻞ را ﺑﺎز ﻛﻨﻴﺪ و ﻛﺪ. اﻳﺠﺎد ﻛﻨﻴﺪProgram.cs ﻓﺎﻳﻞMain ﺑﺎﻳﺪ ﺗﻐﻴﻴﺮاﺗﻲ را در زﻳﺮ ﺑﺮﻧﺎﻣﻪ،( ﺑﺮاي ﺗﺴﺖ ﻛﻼس4 :آن را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ static void Main(string[] args) { // Create a new Car Car objCar = new Car(); // Report the speed Console.WriteLine("The car's speed is: "); Console.WriteLine(objCar.Speed); // Accelerate objCar.Accelerate(5); // Report the new speed Console.WriteLine("The car's speed is now: "); Console.WriteLine(objCar.Speed); // Wait for input from the user Console.ReadLine(); } : ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ2-9 ﭘﻨﺠﺮه اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ. در ﻧﻮار اﺑﺰار ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪStart ( ﺑﺎ ﻛﻠﻴﻚ روي دﻛﻤﻪ5
٣٤٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 2-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اوﻟﻴﻦ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ در ﻛﻼس Carﻳﻚ ﻋﻀﻮ داده اي از ﻧﻮع privateﺑﻪ ﻧـﺎم _speedاﻳﺠـﺎد ﻛﻨﻴﺪ: ;private int _speed ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻴﺊ از اﻳﻦ ﻛﻼس ﺳﺎﺧﺘﻪ ﺷﻮد ،ﻣﻘﺪار _speedدر آن ﺷﻴﺊ ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد زﻳﺮا ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻧﻮع داده اي intﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ اﺳﺖ. ﺳﭙﺲ ﺧﺎﺻﻴﺘﻲ ﺑﺮاي ﺑﺮﮔﺮداﻧﺪن ﻣﻘﺪار ﺳﺮﻋﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ: // Speed - Read-Only property to return the speed public int Speed { get { ;return _speed } } ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻳﻚ ﺧﺎﺻﻴﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﺑﻪ ﺻﻮرت ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ،ﻓﻘﻂ ﻧﻮﺷﺘﻨﻲ ،و ﻳﺎ ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ ﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺨﻮاﻫﺪ ﺑﻪ ﻣﻘﺪار ﻳﻚ ﺧﺎﺻﻴﺖ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ ،ﻛﺪﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در ﺑﻼك ،getو اﮔـﺮ ﺑﺨﻮاﻫـﺪ ﻣﻘﺪار ﺧﺎﺻﻴﺖ را ﺗﻐﻴﻴﺮ دﻫﺪ ﻛﺪﻫﺎي ﺑﻼك setاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .ﭘﺲ اﮔﺮ ﻫﻨﮕﺎم اﻳﺠﺎد ﻳﻚ ﺧﺎﺻﻴﺖ ،ﺑـﻼك getرا در آن ﻧﻨﻮﻳـﺴﻴﺪ آن ﺧﺎﺻﻴﺖ ﻗﺎﺑﻞ ﺧﻮاﻧﺪن ﻧﺨﻮاﻫﺪ ﺑﻮد و ﺑﻪ ﻳﻚ ﺧﺎﺻﻴﺖ ﻓﻘﻂ-ﻧﻮﺷﺘﻨﻲ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد .ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴـﺐ اﮔـﺮ ﺑـﻼك setرا از ﻳـﻚ ﺧﺎﺻﻴﺖ ﺣﺬف ﻛﻨﻴﺪ ،ﺧﺎﺻﻴﺖ ﻗﺎﺑﻞ ﻧﻮﺷﺘﻦ ﻧﺨﻮاﻫﺪ ﺑﻮد و ﺑﻪ ﺧﺎﺻﻴﺖ ﻓﻘﻂ-ﺧﻮاﻧﺪﻧﻲ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮد .در ﺻـﻮرﺗﻲ ﻛـﻪ در ﺧﺎﺻـﻴﺖ ﻫـﻢ ﺑﻼك getو ﻫﻢ ﺑﻼك setوﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺧﺎﺻﻴﺖ ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ ﺧﻮاﻫﺪ ﺑﻮد. ﺑﻌﺪ از اﻳﺠﺎد ﺧﺎﺻﻴﺖ ،Speedﻣﺘﺪي ﺑﻪ ﻧﺎم Accelerateاﻳﺠﺎد ﻛﺮده اﻳﻢ .اﻳﻦ ﻣﺘﺪ ﻣﻘﺪاري را ﺑﺮﻧﻤﻲ ﮔﺮداﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﻧـﻮع ﺑﺮﮔﺸﺘﻲ آن را voidﻗﺮار ﻣﻲ دﻫﻴﻢ. // Accelerate - Add kmph to the speed
٣٤٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
)public void Accelerate(int accelerateBy { // Adjust the speed ;_speed += accelerateBy } اﻳﻦ ﻣﺘﺪ ﻳﻚ ﭘﺎراﻣﺘﺮ ﺑﻪ ﻧﺎم accelerateByدرﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻣﻘﺪار اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﺑﻪ ﻛﺎر ﻣﻲ رود. ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﺗﻨﻬﺎ ﻛﺎري ﻛﻪ اﻳﻦ ﺗﺎﺑﻊ اﻧﺠﺎم ﻣﻲ دﻫﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻘﺪار درﻳﺎﻓﺘﻲ را ﺑﻪ ﻓﻴﻠﺪ _speedاﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .در دﻧﻴﺎي واﻗﻌﻲ ﻓﺸﺎر روي ﭘﺪال ﮔﺎز ،ﻫﻤﺮاه ﺑﺎ ﻓﺎﻛﺘﻮرﻫﺎي دﻳﮕﺮي ﻣﺎﻧﻨﺪ ﺳﺮﻋﺖ ﺑﺎد و ﻳﺎ اﺻﻄﻜﺎك ﺑﺎ ﺳﻄﺢ زﻣﻴﻦ ،ﺳﺮﻋﺖ ﺟﺪﻳﺪ اﺗﻮﻣﺒﻴﻞ ﺗﻌﻴﻴﻦ ﻣﻲ ﺷﻮد. ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺳﺮﻋﺖ ﻧﺘﻴﺠﻪ اﺛﺮ ﭼﻨﺪ ﻓﺎﻛﺘﻮر ﺑﺮ ﻳﻜﺪﻳﮕﺮ اﺳﺖ ،ﻧﻪ ﻓﻘﻂ ﺗﻐﻴﻴﺮ دادن ﻳﻚ ﻋﺪد .ﺑﺮاي ﺷﺒﻴﻪ ﺳﺎزي واﻗﻌﻲ اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳـﺪ ﻛﺪﻫﺎي ﭘﻴﭽﻴﺪه ﺗﺮي ﻧﻮﺷﺖ .اﻣﺎ در اﻳﻨﺠﺎ ﺑﺮاي اﻳﻨﻜﻪ ﻣﺜﺎل ﻫﻤﭽﻨﺎن ﺳﺎده ﺑﺎﻗﻲ ﺑﻤﺎﻧﺪ ،ﻣﻘﺪار ﻣﻌﻴﻦ ﺷﺪه ﺑـﻪ وﺳـﻴﻠﻪ ﻛـﺎرﺑﺮ را ﺑـﺎ ﺳـﺮﻋﺖ ﻛﻨﻮﻧﻲ ﺟﻤﻊ ﻣﻲ ﻛﻨﻴﻢ. ﺳﺮﻋﺖ ﺑﺨﺸﻴﺪن ﺑﻪ اﺗﻮﻣﺒﻴﻞ ﻧﻤﻮﻧﻪ دﻳﮕﺮي از ﻛﭙﺴﻮﻟﻲ ﺑﻮدن اﺳﺖ .ﺑﺮاي ﺷﺘﺎب دادن ﺑﻪ ﻳـﻚ اﺗﻮﻣﺒﻴـﻞ در دﻧﻴـﺎي واﻗﻌـﻲ ،ﺳﻴـﺴﺘﻤﻬﺎي زﻳﺎدي ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻓﻌﺎﻟﻴﺖ ﻣﻲ ﻛﻨﻨﺪ ﺗﺎ اﺗﻮﻣﺒﻴﻞ ﺑﻪ ﺳﺮﻋﺖ ﻣﻮرد ﻧﻈﺮ ﻛﺎرﺑﺮ ﺑﺮﺳﺪ .اﻣﺎ راﻧﻨﺪه ﺑﻪ ﻋﻨﻮان ﻛﺴﻲ ﻛـﻪ در ﺣـﺎل اﺳـﺘﻔﺎده از اﻳـﻦ ﺷﻴﺊ اﺳﺖ ،ﻫﻴﭻ اﻃﻼﻋﻲ از اﻳﻦ ﺳﻴﺴﺘﻢ ﻫﺎ ﻧﺪارد .در اﻳﻦ ﻣﺜـﺎل ﻫـﻢ ﺑـﻪ ﻫﻤـﻴﻦ ﺻـﻮرت اﺳـﺖ .ﻓـﺮدي ﻛـﻪ در ﺣـﺎل اﺳـﺘﻔﺎده از ﻣﺘـﺪ Accelerateاﺳﺖ ،در ﻣﻮرد اﻳﻨﻜﻪ اﻳﻦ ﻣﺘﺪ ﭼﮕﻮﻧﻪ ﺳﺮﻋﺖ را اﻓﺰاﻳﺶ ﻣﻲ دﻫﺪ ﻫﻴﭻ اﻃﻼﻋﻲ ﻧﺪارد و ﻓﻘﻂ ﻣﻲ داﻧـﺪ ﻛـﻪ ﺑـﺮاي اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﺑﺎﻳﺪ از آن اﺳﺘﻔﺎده ﻛﻨﺪ. اﺳﺘﻔﺎده از ﻗﺴﻤﺘﻬﺎي ﺟﺪﻳﺪ ﺑﺴﻴﺎر ﺳﺎده اﺳﺖ .اﺑﺘﺪا ﺷﻴﺊ از اﻳﻦ ﻛﻼس را ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻞ ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﻛﻨﻴﺪ: // Create a new Car ;)(Car objCar = new Car ﺳﭙﺲ ﺳﺮﻋﺖ اوﻟﻴﻪ را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ: // Report the speed ;)" Console.WriteLine("The car's speed is: ;)Console.WriteLine(objCar.Speed ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ ،Accelerateﺳﺮﻋﺖ ﺷﻴﺊ را اﻓﺰاﻳﺶ ﻣﻲ دﻫﻴﺪ: // Accelerate ;)objCar.Accelerate(5 در اﻧﺘﻬﺎ ﻧﻴﺰ ﺳﺮﻋﺖ ﺟﺪﻳﺪ را اﻋﻼم ﻣﻲ ﻛﻨﻴﺪ: // Report the new speed ;)" Console.WriteLine("The car's speed is now: ;)Console.WriteLine(objCar.Speed
٣٤٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺧﺎﺻﻴﺘﻬﺎي ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ: ﺗﺎﻛﻨﻮن ﻣﺘﻮﺟﻪ ﺷﺪﻳﻢ ﻛﻪ ﻳﻜﻲ از دﻻﻳﻞ ﺑﺮﺗﺮي اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ ﺑﻪ ﺟﺎي ﻓﻴﻠﺪ ﻫﺎ ،در اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻـﻴﺖ ﻫـﺎ ﻣـﻲ ﺗﻮان از ﺗﻐﻴﻴﺮ دادن ﻣﺴﺘﻘﻴﻢ ﻓﻴﻠﺪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﺟﻠﻮﮔﻴﺮي ﻛﺮد ،ﻫﻤﺎﻧﻨﺪ ﺧﺎﺻﻴﺖ Speedﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ ﺑﻪ ﺻﻮرت ﻓﻘـﻂ-ﺧﻮاﻧـﺪﻧﻲ ﺗﻌﺮﻳﻒ ﺷﺪ .اﻣﺎ در اﻳﻨﺠﺎ ﻣﻜﻦ اﺳﺖ ﺳﻮال ﻛﻨﻴﺪ ﺑﺮاي ﻣﻮاردي ﻛﻪ ﻛﺎرﺑﺮ ﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﻣﻘﺪار ﻳﻚ ﻓﻴﻠﺪ را ﺑﺨﻮاﻧﺪ و ﻫﻢ آن را ﺗﻐﻴﻴـﺮ دﻫـﺪ، ﭼﺮا ﺑﺎﻳﺪ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻓﻴﻠﺪ ،از ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟ ﺧﻮب ،اﮔﺮ ﺑﻪ ﺟﺎي اﺳﺘﻔﺎده از ﻓﻴﻠﺪ از ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﺪﻫﺎﻳﻲ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ ﺗﺎ ﻫﻨﮕﺎم ﺧﻮاﻧﺪه ﺷﺪن و ﻳﺎ ﻧﻮﺷﺘﻪ ﺷﺪن ﻓﻴﻠﺪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ اﺟﺮا ﺷﻮﻧﺪ ،و اﻳﻦ ﻣﻮرد از اﻫﻤﻴﺖ زﻳﺎدي ﺑﺮﺧﻮردار اﺳﺖ. ﺑﺮاي ﻣﺜﺎل ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻗﺒﻞ از اﻳﻨﻜﻪ ﻣﻘﺪاري ﺑﻪ ﻳﻚ ﻓﻴﻠﺪ اﺧﺘﺼﺎص داده ﺷﻮد ،از درﺳﺖ ﺑﻮدن آن ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ. ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻓﻴﻠﺪي ﺑﻪ ﻧﺎم ،NumberOfDoorsﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﺗﻌﺪاد درﻫﺎي ﻳﻚ اﺗﻮﻣﺒﻴـﻞ در ﻛﻼس Carﻗﺮار دﻫﻴﺪ .ﻧﻮع داده اي اﻳﻦ ﻓﻴﻠﺪ از ﻛﻼس ﺑﺎﻳﺪ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﺎﺷﺪ ﺗﺎ ﺑﺘﻮاﻧﺪ ﺗﻌﺪاد درﻫﺎي ﻳﻚ اﺗﻮﻣﺒﻴـﻞ را در ﺧـﻮد ﻧﮕﻪ دارد .اﻣﺎ ﻣﺴﻠﻤﺎً ﻧﻤﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ ﻛﺎرﺑﺮ ﺑﺘﻮاﻧﺪ ﻋﺪد 0و ﻳﺎ ﻋﺪد 65500را در اﻳﻦ ﻓﻴﻠﺪ وارد ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻋﺪد وارد ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ در ﺑﺎزه 2ﺗﺎ 6ﺑﺎﺷﺪ. ﻧﻜﺘﻪ :ﻣﻤﻜﻦ اﺳﺖ ﺑﮕﻮﻳﻴﺪ ﻛﻪ اﻳﻦ ﻛﻼس ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ دﻳﮕﺮي ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ،ﺑﻨﺎﺑﺮاﻳﻦ وﻇﻴﻔﻪ اوﺳﺖ ﻛﻪ ﻫﻨﮕـﺎﻣﻲ ﻛﻪ ﺑﺨﻮاﻫﺪ ﻣﻘﺪاري را در اﻳﻦ ﻓﻴﻠﺪ ﻗﺮار دﻫﺪ از درﺳﺖ ﺑﻮدن آن ﻣﻄﻤﺌﻦ ﺷﻮد .در ﻃﺮاﺣﻲ ﻳﻚ ﻛﻼس ،وﻇﻴﻔﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﺳﺖ ﻛـﻪ ﺗـﺎ ﺣﺪ ﻣﻤﻜﻦ ﻛﺎر را ﺑﺮاي اﻓﺮادي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻨﺪ از ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻨﺪ ﺳﺎده ﻛﻨﺪ .رﺳﻴﺪﮔﻲ ﻛﺮدن ﺑﻪ ﺻﺤﺖ داده ﻫـﺎي ورودي ،ﻳﻜـﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﺟﻨﺒﻪ ﻫﺎي ﻃﺮاﺣﻲ ﻳﻚ ﻛﻼس ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد. ﻫﻤﭽﻨﻴﻦ ﻫﻤﻮاره ﺧﺎﺻﻴﺖ ﻫﺎ ﻣﻘﺪارﻫﺎي ذﺧﻴﺮه ﺷﺪه در ﻳﻚ ﻓﻴﻠﺪ را ﺑﺮﻧﻤﻲ ﮔﺮداﻧﻨﺪ ،ﺑﻠﻜﻪ ﻣﻤﻜﻦ اﺳﺖ ﻣﻘﺪاري را از ﺟﺎي دﻳﮕﺮي ﺑﺪﺳـﺖ آورﻧﺪ و ﻳﺎ آن را ﺑﺮ اﺳﺎس ﻳﻚ ﺳﺮي اﻃﻼﻋﺎت ﻣﺤﺎﺳﺒﻪ ﻛﺮده و ﺑﺮﮔﺮداﻧﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﺑﺨﻮاﻫﻴﺪ ﺗﻌـﺪاد ﻛـﻞ ﺳﻔﺎرﺷـﺎت ﻳـﻚ ﻣﺸﺘﺮي را ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺧﺎﺻﻴﺖ در ﻛﻼس Customerﻗﺮار دﻫﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﻫﻨﮕـﺎم ﻃﺮاﺣـﻲ ﻳـﻚ ﻛـﻼس ﺑـﺮاي ،Customerﻓﻴﻠﺪي ﺑﺮاي ﻧﮕﻬﺪاري اﻳﻦ ﻋﺪد ﻣﺸﺨﺺ ﻧﻤﻲ ﺷﻮد ،ﺑﻠﻜﻪ ﻳﻚ ﺷﻴﺊ ﺑﺎﻳﺪ در ﺻﻮرت ﻟﺰوم ،آن را ﻣﺤﺎﺳﺒﻪ ﻛﻨﺪ .در اﻳﻦ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻴﺪ در ﻗﺴﻤﺖ getﻳﻚ ﺧﺎﺻﻴﺖ ،ﻛﺪي را ﺑﻨﻮﻳﺴﻴﺪ ﻛﻪ ﺑﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻟﻴـﺴﺖ ﺳﻔﺎرﺷـﺎت ﻳـﻚ ﻣـﺸﺘﺮي در ﻳـﻚ ﺑﺎﻧـﻚ اﻃﻼﻋﺎﺗﻲ ،ﺗﻌﺪاد ﻛﻞ آﻧﻬﺎ را ﻣﺤﺎﺳﺒﻪ ﻛﺮده و ﺑﺮﮔﺮداﻧﺪ .اﻳﻦ ﻣﻮارد در ﺑﺨﺸﻬﺎي ﺑﻌﺪي ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ ﺑـﻪ ﻣﺴﺌﻠﻪ ﺗﻌﺪاد درﻫﺎي اﺗﻮﻣﺒﻴﻞ ﺑﺮﮔﺮدﻳﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن ﺧﺎﺻﻴﺖ NumberOfDoors (1اوﻟﻴﻦ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻓﻴﻠﺪي ﺑﺮاي ﻧﮕﻬﺪاري ﺗﻌﺪاد درﻫـﺎي ﻳـﻚ ﺷـﻴﺊ از ﻛـﻼس Carرا ،در آن اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ ﻛﻪ ﻣﻘﺪار اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ 4اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺪ ﻣـﺸﺨﺺ ﺷـﺪه در زﻳﺮ را ﺑﻪ ﻛﻼس اﺿﺎﻓﻪ ﻛﻨﻴﺪ: ;public string Color ;private int _speed ;private int _numberOfDoors = 4
٣٤٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(2ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺘﻲ ﺑﺮاي ﺗﻨﻈﻴﻢ و ﻳﺎ دﺳﺘﺮﺳﻲ ﺑﻪ ﺗﻌﺪاد در ﻫﺎي اﺗﻮﻣﺒﻴﻞ اﻳﺠﺎد ﻛﻨﻴﺪ و ﻫﻤﻮاره ﺑﺮرﺳـﻲ ﻛﻨﻴـﺪ ﻛـﻪ ﻋـﺪد ﻣﻮﺟﻮد ﺑﺮاي اﻳﻦ ﻓﻴﻠﺪ ﺑﻴﻦ 2ﺗﺎ 6ﺑﺎﺷﺪ .ﻛﺪ زﻳﺮ را ﺑﻌﺪ از ﻣﺘﺪ Accelerateدر ﻛﻼس Carوارد ﻛﻨﻴﺪ: // NumberOfDoors - get/set the number of doors public int NumberOfDoors { // Called when the property is read get { ;return _numberOfDoors } // Called when the property is set set { // Is the new value between two and six )if (value >= 2 && value <= 6 { ;_numberOfDoors = value } } } ﻧﻜﺘﻪ :در اﻳﻦ ﻓﺼﻞ از اﻳﺠﺎد ﺧﻄﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻋﺪدي ﺧﺎرج از ﻣﺤﺪوده ﻣﻮرد ﻧﻈﺮ وارد ﺷﺪ ﺻﺮﻓﻨﻈﺮ ﻣﻲ ﻛﻨﻴﻢ .اﻣﺎ اﺻـﻮﻻ ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ ﻳﻚ ﻋﺪد ﻧﺎ ﻣﻌﺘﺒﺮ در ﻛﻼس وارد ﺷﺪ ،ﺑﺎﻳﺪ ﻳﻚ ﺧﻄﺎ اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻓﺮدي ﻛﻪ در ﺣﺎل اﺳـﺘﻔﺎده از ﻛـﻼس اﺳـﺖ ﻣﺘﻮﺟـﻪ رخ دادن ﺧﻄﺎ ﺷﺪه و در ﻣﻮرد ﭼﮕﻮﻧﮕﻲ ﺑﺮﺧﻮرد ﺑﺎ اﻳﻦ ﺧﻄﺎ ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﻣﻲ ﻛﻨﺪ .در ﻣﻮرد ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد اﻳﻦ ﻧـﻮع ﺧﻄﺎﻫـﺎ در ﻓـﺼﻞ 11 ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد. (3ﺑﺮاي ﺑﺮرﺳﻲ ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ در ﻛﻼس اﻳﺠﺎد ﻛﺮده اﻳﺪ ،ﺑﺎﻳﺪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ Mainدر Program.csرا ﺑـﻪ ﺻـﻮرت زﻳـﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: )static void Main(string[] args { // Create a new Car ;)(Car objCar = new Car // Report the number of doors ;)" Console.WriteLine("The number of doors is: ;)Console.WriteLine(objCar.NumberOfDoors // Try Changing the number of doors to 1000 ;objCar.NumberOfDoors = 1000 // Report the number of doors ;)" Console.WriteLine("The number of doors is:
٣٤٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)Console.WriteLine(objCar.NumberOfDoors // Now try changing the number of doors to 2 ;objCar.NumberOfDoors = 2 // Report the number of doors ;)" Console.WriteLine("The number of doors is: ;)Console.WriteLine(objCar.NumberOfDoors // Wait for input from the user ;)(Console.ReadLine } ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﺻﻔﺤﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 3-9ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 3-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ اﺑﺘﺪا ﻳﻚ ﻓﻴﻠﺪ ﺑﺮاي ﻧﮕﻬﺪاري ﺗﻌﺪاد در ﻫﺎ ﺑﻪ ﺻﻮرت privateﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ .ﻫﻤﭽﻨﻴﻦ ﻣﻘﺪار ﭘﻴﺶ ﻓﺮض اﻳﻦ ﻓﻴﻠﺪ را ﻧﻴﺰ 4در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ. ;private int _numberOfDoors = 4 دﻟﻴﻞ اﻳﻨﻜﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﻪ اﻳﻦ ﻓﻴﻠﺪ ﻋﺪد داده اﻳﻢ ﻧﻴﺰ ﻣﺸﺨﺺ اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ ﻣـﻲ ﺧـﻮاﻫﻴﻢ ﺗﻌـﺪاد درﻫـﺎي ﻳـﻚ اﺗﻮﻣﺒﻴـﻞ ﻫﻤﻮاره ﺑﻴﻦ 2ﺗﺎ 6ﺑﺎﺷﺪ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ داﻧﻴﻢ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض داراي ﻣﻘﺪار 0اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ اﻳﻦ ﻓﻴﻠﺪ ﻣﻘﺪار ﻧﺪﻫﻴﻢ ،ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻴﺊ اﻳﺠﺎد ﻣﻲ ﺷﻮد ،ﺗﻌﺪاد در ﻫﺎ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﺧﻮاﻫﺪ ﺑﻮد. ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ﻓﻴﻠﺪ ﻧﻮﺑﺖ ﺑﻪ ﺧﻮد ﺧﺎﺻﻴﺖ ﻣﻲ رﺳﺪ .ﺑﺨﺶ getﻛﻪ ﻫﻤﺎﻧﻨﺪ ﻗﺴﻤﺖ ﻗﺒﻞ اﺳﺖ و ﻧﻜﺘﻪ ﺟﺪﻳﺪي ﻧﺪارد – ﻓﻘﻂ ﻛﺎﻓﻲ اﺳﺖ ﻣﻘﺪار ﻓﻴﻠﺪ _numberOfDoorsرا ﺑﺮﮔﺮداﻧﺪ .اﻣﺎ در ﺑﻼك setاﺑﺘﺪا ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ﻋﺪدي ﻛﻪ ﻛـﺎرﺑﺮ ﺑـﻪ اﻳـﻦ ﺧﺎﺻـﻴﺖ ﻓﺮﺳﺘﺎده اﺳﺖ ﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ ،ﺳﭙﺲ آن را در _numberOfDoorsﻗﺮار دﻫﻴﻢ )ﻣﻘﺪاري ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﺎرﺑﺮ ﺑﻪ ﺧﺎﺻﻴﺖ ﻓﺮﺳـﺘﺎده ﻣﻲ ﺷﻮد ﺑﺎ ﻛﻠﻤﻪ ﻛﻠﻴﺪي valueﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ(: // NumberOfDoors - get/set the number of doors
٣٥٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
public int NumberOfDoors { // Called when the property is read get { ;return _numberOfDoors } // Called when the property is set set { // Is the new value between two and six )if (value >= 2 && value <= 6 { ;_numberOfDoors = value } } } ﺑﻘﻴــﻪ ﻛــﺪي ﻫــﻢ ﻛــﻪ ﺑــﻪ ﻓﺎﻳــﻞ Program.csاﺿــﺎﻓﻪ ﻛــﺮده اﻳــﺪ ،ﻣــﻮرد ﭘﻴﭽﻴــﺪه اي ﻧﻴــﺴﺖ .اﺑﺘــﺪا ﻣﻘــﺪار اوﻟﻴــﻪ ﻓﻴﻠــﺪ _numberOfDoorsرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ ،ﺳﭙﺲ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﺪ اﻳﻦ ﻣﻘﺪار را ﺑﻪ 1000ﺗﻐﻴﻴﺮ دﻫﻴﺪ .در اﻳﻦ ﻫﻨﮕﺎم ﻛـﺪي ﻛـﻪ ﺑﺮاي ﺗﻌﻴﻴﻦ ﺻﺤﺖ داده ﻫﺎ در ﺧﺎﺻﻴﺖ NumberOfDoorsوارد ﺷﺪه اﺳﺖ ،اﺟﺎزه ﻧﻤﻲ دﻫﺪ ﻛﻪ ﻣﻘﺪار ﺧﺎﺻﻴﺖ ﺑﻪ 1000ﺗﻐﻴﻴﺮ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻘﺪار ﻓﻴﻠﺪ _numberOfDoorsﻫﻤﭽﻨﺎن ﺑﺮاﺑﺮ ﺑﺎ 4ﺑﺎﻗﻲ ﻣﻲ ﻣﺎﻧﺪ .در اﻧﺘﻬﺎ ﻧﻴﺰ ﻣﻘﺪار ﺧﺎﺻﻴﺖ را ﺑﺮاﺑـﺮ ﺑـﺎ ﻳـﻚ ﻣﻘﺪار ﻣﻨﻄﻘﻲ ﻣﺎﻧﻨﺪ 2ﻗﺮار ﻣﻲ دﻫﻴﻢ و ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺗﻌﺪاد درﻫﺎ ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ. ﻧﻜﺘﻪ :اﮔﺮﭼﻪ ﻣﻤﻜﻦ اﺳﺖ روش ﻛﺎرﻛﺮد ﺧﺎﺻﻴﺘﻬﺎي ﺧﻮاﻧﺪﻧﻲ-ﻧﻮﺷﺘﻨﻲ و ﻫﻤﭽﻨﻴﻦ ﻓﻴﻠﺪ ﻫﺎي publicﻣﺎﻧﻨﺪ ﻫﻢ ﺑﻪ ﻧﻈﺮ رﺳﺪ ،اﻣﺎ ﺑﺎ ﻫﻢ ﺗﻔﺎوت زﻳﺎدي دارﻧﺪ .زﻣﺎﻧﻲ ﻛﻪ وﻳﮋوال 2005 C#ﺑﺨﻮاﻫﺪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ را ﻛﺎﻣﭙﺎﻳﻞ ﻛﻨﺪ ،ﺑﺎ ﻗﺴﻤﺘﻬﺎﻳﻲ ﻛﻪ ﻛﺎرﺑﺮ از ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛﺮده اﺳﺖ ،ﻫﻤﺎﻧﻨﺪ ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ رﻓﺘﺎر ﻣﻲ ﻛﻨﺪ .ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ ﺑﻪ ﺟﺎي ﻓﻴﻠـﺪ ﻫـﺎي publicﺑﺎﻋـﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﻧﻌﻄﺎف ﭘﺬﻳﺮ ﺗﺮ ﺷﺪه و ﻗﺎﺑﻠﻴﺖ ﮔﺴﺘﺮش ﺑﻴﺸﺘﺮي داﺷﺘﻪ ﺑﺎﺷﺪ.
ﻣﺘﺪ :IsMoving ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل ﻃﺮاﺣﻲ ﻳﻚ ﻛﻼس ﻫﺴﺘﻴﺪ ،ﺑﺎﻳﺪ ﻫﻤﻮاره اﻳﻦ ﺳﻮال را در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ "ﭼﮕﻮﻧﻪ ﻣـﻲ ﺗـﻮاﻧﻢ اﺳـﺘﻔﺎده از اﻳـﻦ ﻛﻼس را ﺳﺎده ﺗﺮ ﻛﻨﻢ؟" .ﺑﺮاي ﻣﺜﺎل اﮔﺮ ﻛﺎرﺑﺮ ﺑﺨﻮاﻫﺪ ﺗﺸﺨﻴﺺ دﻫﺪ آﻳﺎ اﻳﻦ اﺗﻮﻣﺒﻴﻞ در ﺣﺎل ﺣﺮﻛﺖ اﺳﺖ ﻳﺎ ﻧﻪ ،ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﺪ اﻳﻦ ﻛﺎر را اﻧﺠﺎم دﻫﺪ؟ ﻳﻚ راه ﺑﺮاي اﻧﺠﺎم اﻳﻦ ﻛﺎر ،ﺑﺮرﺳﻲ ﺧﺎﺻﻴﺖ Speedاﺳﺖ .اﮔﺮ ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ ﺗﻮﺳﻂ اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﺮاﺑﺮ ﺑﺎ ﺻـﻔﺮ ﺑﺎﺷـﺪ ،ﻣـﻲ ﺗـﻮان ﻓﻬﻤﻴﺪ ﻛﻪ اﺗﻮﻣﺒﻴﻞ ﺗﻮﻗﻒ ﻛﺮده اﺳﺖ .اﮔﺮ ﺑﺮرﺳﻲ اﻳﻦ ﻣﻮرد را ﺑﻪ ﻛﺎرﺑﺮ واﮔﺬار ﻛﻨﻴﻢ ،ﻛﺎرﺑﺮ ﻧﻴﺰ ﺑﺮ اﺳﺎس ﺑﺮداﺷـﺖ ﺧـﻮد از ﻧﺤـﻮه ﻛـﺎرﻛﺮد ﻛﻼس ﺑﺮاي ﻧﺘﻴﺠﻪ ﮔﻴﺮي اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ و ﻣﻤﻜﻦ اﺳﺖ او از اﻳﻦ روش ﺑﺮاي ﺑﺮرﺳﻲ ﺗﻮﻗﻒ اﺗﻮﻣﺒﻴﻞ اﺳﺘﻔﺎده ﻧﻜﻨﺪ .اﻟﺒﺘﻪ در اﻳـﻦ ﻣـﻮرد واﺿﺢ اﺳﺖ ﻛﻪ ﻫﻤﻮاره ﺳﺮﻋﺖ ﺻﻔﺮ ﺑﺮاﺑﺮ ﺑﺎ ﺗﻮﻗﻒ اﺗﻮﻣﺒﻴﻞ اﺳﺖ ،اﻣﺎ در ﻣﻮاردي ﻣﺸﺎﺑﻪ ﺣﺘﻲ اﮔﺮ %99اﻓﺮادي ﻛﻪ از ﻛﻼس اﺳﺘﻔﺎده ﻣـﻲ ﻛﻨﻨﺪ در ﻳﻚ ﻣﻮرد اﺷﺘﺮاك ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،ﺑﺎﻳﺪ ﺑﺮاي وﺿﻮح ﺑﻴﺸﺘﺮ ﻛﺎر ﺑﺎ ﻛﻼس ﻣﺘﺪي ﻃﺮاﺣﻲ ﻛﺮد ﻛﻪ ﺑﻪ آن ﻣﻮرد ﭘﺎﺳﺦ دﻫﺪ. ﺑﻨﺎﺑﺮاﻳﻦ در ﻣﺜﺎل ﺑﺎﻻ ،ﺑﻬﺘﺮ اﺳﺖ ﻣﺘﺪي ﻃﺮاﺣﻲ ﻛﻨﻴﻢ ﻛﻪ ﻣﺸﺨﺺ ﻛﻨﺪ آﻳﺎ اﺗﻮﻣﺒﻴﻞ ﺗﻮﻗﻒ ﻛﺮده و ﻳﺎ در ﺣﺎل ﺣﺮﻛﺖ اﺳﺖ.
٣٥١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
IsMoving اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ:اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﻣﻘـﺪاري را از ﻧـﻮع، ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﺪ اﻳﻦ اﺳﺖ ﻛـﻪ ﭘـﺲ از ﺑﺮرﺳـﻲ ﺳـﺮﻋﺖ اﺗﻮﻣﺒﻴـﻞIsMoving ( ﺗﻤﺎم ﻛﺎري ﻛﻪ ﻣﺘﺪ1 ﺑﻌـﺪ،Car ﻛﺪ زﻳﺮ را در ﻛـﻼس. ﺑﺮﮔﺮداﻧﺪ ﺗﺎ ﻣﺸﺨﺺ ﺷﻮد اﺗﻮﻣﺒﻴﻞ ﺗﻮﻗﻒ ﻛﺮده و ﻳﺎ در ﺣﺎل ﺣﺮﻛﺖ اﺳﺖBoolean : وارد ﻛﻨﻴﺪNumberOfDoors از ﺧﺎﺻﻴﺖ // IsMoving - is the car moving? public Boolean IsMoving() { // Is the car's speed zero? if (Speed == 0) return false; return true; } : اﻳﺠﺎد ﻛﻨﻴﺪProgram.cs ﻓﺎﻳﻞMain ﺗﻐﻴﻴﺮات ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در زﻳﺮ ﺑﺮﻧﺎﻣﻪ،( ﺑﺮاي ﺗﺴﺖ اﻳﻦ ﻣﺘﺪ2 static void Main(string[] args) { // Create a new Car Car objCar = new Car(); // Accelerate the car to 25kmph objCar.Accelerate(25); // Report whether or not the car is moving if (objCar.IsMoving() == true) { Console.WriteLine("The car is moving!"); } else { Console.WriteLine("The car is stopped!"); } // Wait for input from the user Console.ReadLine(); } . ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد4-9 ﭘﻨﺠﺮه ﺟﺪﻳﺪي را ﻣﺸﺎﺑﻪ ﺷﻜﻞ.( ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ3
٣٥٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 4-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﻳﻦ ﻗﺴﻤﺖ ﻓﻘﻂ ﻣﺘﺪ ﺳﺎده اي را ﺑﻪ ﻛﻼس اﺿﺎﻓﻪ ﻛﺮده اﻳﻢ ﻛﻪ ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﺧﺎﺻﻴﺖ ،Speedدر ﺻﻮرت ﻏﻴﺮ ﺻﻔﺮ ﺑﻮدن آن ﻣﻘﺪار trueو در ﺻﻮرت ﺻﻔﺮ ﺑﻮدن آن ﻣﻘﺪار falseرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ. ?// IsMoving - is the car moving )(public Boolean IsMoving { ?// Is the car's speed zero )if (Speed == 0 ;return false ;return true } ﻣﻤﻜﻦ اﺳﺖ در اﺑﺘﺪا از ﺣﺎﻟﺖ ﻧﻮﺷﺘﻪ ﺷﺪن اﻳﻦ ﺗﺎﺑﻊ ﺗﻌﺠﺐ ﻛﻨﻴﺪ و اﻳﻦ ﺳﻮال ﭘﻴﺶ ﺑﻴﺎﻳـﺪ ﻛـﻪ ﭼـﺮا دﺳـﺘﻮر returnدوم در ﺑﺨـﺶ elseﻗﺮار داده ﻧﺸﺪه اﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ دﺳﺘﻮر returnﺑﺮاي ﺑﺮﮔﺮداﻧﺪن ﻣﻘﺪاري ﺗﻮﺳﻂ ﺗﺎﺑﻊ ،ﺑﻪ ﻛـﺪي ﻛـﻪ ﺗـﺎﺑﻊ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده اﺳﺖ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ،در اﺟﺮاي ﺗﺎﺑﻊ ﺑﻪ اوﻟﻴﻦ returnرﺳﻴﺪ ،ﺑﻘﻴﻪ دﺳﺘﻮرات ﺗـﺎﺑﻊ را اﺟـﺮا ﻧﻤـﻲ ﻛﻨﺪ و ﺑﻪ ﻣﺘﺪي ﻛﻪ ﺗﺎﺑﻊ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده اﺳﺖ ﺑﺮﻣﻲ ﮔﺮدد .ﭘﺲ در اﻳﻨﺠـﺎ اﮔـﺮ ﻣﻘـﺪار Speedﺑﺮاﺑـﺮ ﺑـﺎ ﺻـﻔﺮ ﺑـﻮد ،ﺑﺮﻧﺎﻣـﻪ ﻣﻘـﺪار falseرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و دﺳﺘﻮر return trueرا ﻧﻴﺰ اﺟﺮا ﻧﻤﻲ ﻛﻨﺪ .اﻣﺎ اﮔﺮ ﻣﻘﺪار Speedﻣﺨﺎﻟﻒ ﺻﻔﺮ ﺑﻮد ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻂ ﺑﻌﺪ از ifﻣﻲ آﻳﺪ ﻛﻪ در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎﻳﺪ ﻣﻘﺪار trueرا ﺑﺮﮔﺮداﻧﺪ .اﻟﺒﺘﻪ اﻳﻦ ﻧﻮع ﻧﻮﺷﺘﻦ ﻛﺪ ﻓﻘﻂ ﺑﺎﻋﺚ ﻛﻮﺗﺎﻫﻲ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷـﻮد و در ﺳﺮﻋﺖ اﺟﺮاي آن ﻫﻴﭻ ﺗﺎﺛﻴﺮي ﻧﺪارد. اﮔﺮﭼﻪ ﻣﺘﺪي ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺗﻌﺮﻳﻒ ﻛﺮده اﻳﻢ ﺳﺎده اﺳﺖ ،اﻣﺎ از ﮔﻴﺞ ﺷﺪن ﻛﺎرﺑﺮ در ﻣﻮرد اﻳﻨﻜﻪ ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺘﻮﻗـﻒ ﺑـﻮدن اﺗﻮﻣﺒﻴـﻞ ﭼﻪ ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ را ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﺪ ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﺪ. اﻣﺎ ﻗﺒﻞ از اﻳﻨﻜﻪ ﺷﺮوع ﻛﻨﻴﺪ و ﺑﺮاي ﻫﺮ ﻣﺴﺌﻠﻪ اي در ﻛﻼس ﻳﻚ ﻣﺘﺪ اﻳﺠﺎد ﻛﻨﻴﺪ ،ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻫﺮ ﭼﻪ ﺗﻌﺪاد ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﻳﻚ ﻛﻼس ﺑﻴﺸﺘﺮ ﺑﺎﺷﻨﺪ ،ﻛﺎر ﺑﺎ آن ﻣﺸﻜﻞ ﺗﺮ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻦ ﻧﻜﺘﻪ و ﻣﻮرد ﻗﺒﻠﻲ در اﻳﺠﺎد ﻣﺘﺪ و ﺧﺎﺻﻴﺖ ﺑﺮاي ﻳﻚ ﻛﻼس ﺗﻌﺎدل را رﻋﺎﻳﺖ ﻛﻨﻴﺪ. ﻣﻤﻜﻦ اﺳﺖ ﺗﺼﻮر ﻛﻨﻴﺪ ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﻣﺘﺪي ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺗﻌﺮﻳﻒ ﻛﺮدﻳﻢ ﺑﺎﻋﺚ اﻳﺠﺎد ﻫﻴﭻ رﻓﺘﺎري در ﺑﺮﻧﺎﻣﻪ ﻧﻤﻲ ﺷﻮد ،ﺑﻬﺘﺮ ﺑﻮد از ﻳﻚ ﺧﺎﺻﻴﺖ در اﻳﻦ ﻣﻮرد اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ .ﺑﻠﻪ ،ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﺑﺮاي اﻳﻦ ﻣﻮرد از ﻳﻚ ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛﻨﻴﻢ .اﻣﺎ ،اﺳﺘﻔﺎده از ﻣﺘﺪ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﺎرﺑﺮ ﺑﻔﻬﻤﺪ ﻛﻪ اﻳﻦ ﻧﺘﻴﺠﻪ ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ از ﻳﻚ ﻓﻴﻠﺪ ﺧﻮاﻧﺪه ﻧﻤﻲ ﺷﻮد ،ﺑﻠﻜﻪ ﺗﻮﺳﻂ ﺷﻴﺊ ﻣﺤﺎﺳﺒﻪ ﻣﻲ ﺷﻮد.
٣٥٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺘﺪﻫﺎي ﺳﺎزﻧﺪه: ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﺟﻨﺒﻪ ﻫﺎي ﻃﺮاﺣﻲ ﻛﻼﺳﻬﺎ ،ﻣﻔﻬﻮم ﻣﺘﺪ ﺳﺎزﻧﺪه 1در ﻛﻼس اﺳـﺖ .اﻳﻦ ﻣﺘﺪﻫﺎ ﺷﺎﻣﻞ ﻛـﺪﻫﺎﻳﻲ ﻫـﺴﺘﻨﺪ ﻛـﻪ ﻫﻨﮕﺎم ﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪن ﻳﻚ ﺷﻴﺊ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ ﻣﻮرد ﻫﻨﮕﺎﻣﻲ ﻣﻔﻴﺪ اﺳﺖ ﻛﻪ ﺑﺨﻮاﻫﻴﺪ ﻗﺒـﻞ از اﻳﻨﻜـﻪ ﻛـﺎرﺑﺮ از ﻳـﻚ ﺷﻴﺊ اﺳﺘﻔﺎده ﻛﻨﺪ ،آن را ﺑﻪ ﺻﻮرت ﺧﺎﺻﻲ ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﺑﻌﻀﻲ از ﺧﺎﺻﻴﺖ ﻫﺎي آن ﻣﻘـﺪار اوﻟﻴـﻪ ﻧـﺴﺒﺖ دﻫﻴـﺪ، ﻫﻤﺎﻧﻨﺪ ﺧﺎﺻﻴﺖ NumberOfDoorsدر ﻛﻼس .Car ﻣﺘﺪﻫﺎي ﺳﺎزﻧﺪه در ﻛﻼس ﻣﺘﺪﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻧﺎم آﻧﻬﺎ ﺑﺎ ﻧﺎم ﻛﻼس ﻳﻜﻲ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻧﺒﺎﻳﺪ ﺑﺮاي اﻳﻦ ﻣﺘﺪﻫﺎ ﻫﻴﭻ ﻣﻘـﺪار ﺑﺎزﮔـﺸﺘﻲ ﻣﺸﺨﺺ ﻛﺮد )ﺣﺘﻲ .(voidﻳﻚ ﺗﺎﺑﻊ ﺳﺎزﻧﺪه ﺑﺮاي ﻛﻼس ،Carﻣﺘﺪي ﻣﺎﻧﻨﺪ زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد: )(public Car { // Do some initialization here }
اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه: در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ،ﻧﺤﻮه اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ي ﺳﺎده را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه (1ﺑﺮاي اﻳﻨﻜﻪ ﻧﺤﻮه ﻛﺎرﻛﺮد ﻣﺘﺪ ﺳﺎزﻧﺪه را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ،ﺑﺎﻳﺪ ﻣﻘﺪار اوﻟﻴﻪ 4را از ﻣﻘﺎﺑﻞ ﺗﻌﺮﻳـﻒ _numebrOfDoors ﺣﺬف ﻛﻨﻴﻢ .در ﻛﻼس Carﺗﻐﻴﻴﺮات ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را وارد ﻛﻨﻴﺪ: ;public string Color ;private int _speed ;private int _numberOfDoors (2ﺣﺎل ﻣﺘﺪ زﻳﺮ را اﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ ﺗﺎﺑﻊ ﺳﺎزﻧﺪه آن اﻳﺠﺎد ﺷﻮد .ﻫﺮ ﻛﺪي ﻛﻪ در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ ،ﻫﻨﮕﺎم ﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﻴﺊ اﺟـﺮا ﻣﻲ ﺷﻮد. // Constructor )(public Car { // Set the default values ;"Color = "White ;_speed = 0 ;_numberOfDoors = 4 Constructor
1
٣٥٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} . زﻳﺮا ﻣﻘﺪار اﻳﻦ ﻣﺘﻐﻴﺮ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﺑﺮاﺑﺮ ﺑﺎ ﺻﻔﺮ ﻣـﻲ ﺷـﻮد،_ ﺑﺎ ﻋﺪد ﺻﻔﺮ ﻛﺎري ﺑﻴﻬﻮده اﺳﺖspeed ﺗﻨﻈﻴﻢ ﻣﻘﺪار:ﻧﻜﺘﻪ . ﻣﻘﺪار اﻳﻦ ﻣﺘﻐﻴﻴﺮ را ﻧﻴﺰ در اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﻨﻈﻴﻢ ﻛﺮده اﻳﻢ،اﻣﺎ ﺑﺮاي ﺗﻜﻤﻴﻞ ﺷﺪن ﻣﺜﺎل ﺑﻪ ﺻﻮرت زﻳﺮ اﺿﺎﻓﻪProgram.cs ﺑﻬﺘﺮ اﺳﺖ زﻳﺮ ﺑﺮﻧﺎﻣﻪ ﺟﺪاﻳﻲ را در ﻓﺎﻳﻞ،Car ( ﺑﺮاي ﺗﺴﺖ ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس3 .ﻛﻨﻴﺪ ﺗﺎ اﻃﻼﻋﺎت ﻳﻚ ﺷﻴﺊ از ﻛﻼس را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﺪ // DisplayCarDetails – // procedure that displays the car's details static void DisplayCarDetails(Car theCar) { // Display the details of the car Console.WriteLine("Color: " + theCar.Color); Console.WriteLine("Number of doors: " + theCar.NumberOfDoors); Console.WriteLine("Current speed: " + theCar.Speed); } . را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﺪDisplayCarDetails را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﻣﺘﺪMain ( ﺣﺎل زﻳﺮ ﺑﺮﻧﺎﻣﻪ4 static void Main(string[] args) { // Create a new Car Car objCar = new Car(); // Display the details of the car DisplayCarDetails(objCar); // Wait for input from the user Console.ReadLine(); } . ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد5-9 ﭘﻨﺠﺮه اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ5
5-9 ﺷﻜﻞ
٣٥٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻴﺊ ﺟﺪﻳﺪي از ﻛﻼس Carﺑﺨﻮاﻫﺪ اﻳﺠﺎد ﺷﻮد ،ﻛﺪي ﻛﻪ درون ﺗﺎﺑﻊ ﺳﺎزﻧﺪه ﻧﻮﺷﺘﻪ اﻳﺪ اﺟﺮا ﻣﻲ ﺷﻮد .ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻴﺪ ﺧﺎﺻﻴﺖ ﻫﺎي ﻛﻼس را ﺑﺮاﺑﺮ ﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﻮرد ﻧﻈﺮﺗﺎن ﻗﺮار دﻫﻴﺪ. // Constructor )(public Car { // Set the default values ;"Color = "White ;_speed = 0 ;_numberOfDoors = 4 } ﻧﺘﻴﺠﻪ اﻳﻦ ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ را ﻫﻨﮕﺎم اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ،زﻣﺎﻧﻲ ﻛﻪ اﻃﻼﻋﺎت ﻛﻼس در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴـﺪ ﻛـﺮد. دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ اﮔﺮ ﺑﺮاي ﻣﺘﺪ ﺳﺎزﻧﺪه ﻧﻮع داده ﺑﺮﮔﺸﺘﻲ ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ و ﻳﺎ ﺣﺘﻲ از ﻛﻠﻤﻪ voidاﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻪ ﺧﻮاﻫﻴﺪ ﺷـﺪ. ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻣﺘﺪ ﺳﺎزﻧﺪه ﻳﻚ ﻛﻼس ﻫﻤﻮاره داراي ﺳﺎﺧﺘﺎر ﻣﺸﺨﺼﻲ اﺳﺖ. ﺑﺮاي ﺗﺴﺖ ﺷﻴﺊ ،از ﻳﻚ ﻣﺘﺪ ﺟﺪا ﺑﻪ ﻧﺎم DisplayCarDetailsدر ﻓﺎﻳﻞ Program.csاﺳﺘﻔﺎده ﻣﻲ ﻛﻨـﻴﻢ .ﺑـﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﻣﺸﺨﺼﺎت ﭼﻨﺪﻳﻦ ﺷﻴﺊ از ﻧﻮع Carرا ﻧﻤﺎﻳﺶ دﻫﻴﻢ و ﻳﺎ ﻣﺸﺨﺼﺎت ﻳـﻚ ﺷـﻴﺊ را ﭼﻨـﺪﻳﻦ ﻣﺮﺗﺒـﻪ ﻧﻤـﺎﻳﺶ دﻫﻴﻢ ،ﺑﻪ ﻛﺪ ﻛﻤﺘﺮي ﻧﻴﺎز ﺧﻮاﻫﻴﻢ داﺷﺖ. ﻧﻜﺘﻪ :دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﺪ DisplayCarDetailsﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﺪ در ﻣﺘﺪ Mainﻓﺮاﺧﻮاﻧﻲ ﺷـﻮد ﺣﺘﻤـﺎً ﺑﺎﻳـﺪ از ﻧـﻮع staticﺗﻌﺮﻳﻒ ﺷﻮد .در ﻣﻮرد ﻣﺘﺪﻫﺎي staticو ﻧﺤﻮه اﺳﺘﻔﺎده از آﻧﻬﺎ در ﻓﺼﻞ 10ﺻﺤﺒﺖ ﺧﻮاﻫﻴﻢ ﻛﺮد.
وراﺛﺖ: وراﺛﺖ 1ﻳﻜﻲ از ﻣﺒﺎﺣﺚ ﭘﻴﺸﺮﻓﺘﻪ و ﻫﻤﭽﻨﻴﻦ ﻛﺎرﺑﺮدي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷـﻴﺊ ﮔـﺮا ﻣﺤـﺴﻮب ﻣـﻲ ﺷـﻮد .در ﭼـﺎرﭼﻮب .NETاز وراﺛـﺖ اﺳﺘﻔﺎده زﻳﺎدي ﺷﺪه اﺳﺖ و ﺣﺘﻲ ﺧﻮد ﺷﻤﺎ ﺗﺎﻛﻨﻮن ﻛﻼس ﻫﺎﻳﻲ اﻳﺠﺎد ﻛﺮده اﻳﺪ ﻛﻪ از ﻛﻼﺳﻬﺎي دﻳﮕﺮ ارث ﺑﺮده اﻧﺪ – ﻫﺮ ﻓﺮم وﻳﻨﺪوزي ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد اﻳﺠﺎد ﻣﻲ ﻛﺮدﻳﺪ ،در ﺣﻘﻴﻘﺖ ﻳﻚ ﻛﻼس ﺟﺪﻳﺪ ﺑﻮد ﻛﻪ از ﺑﺴﻴﺎري از اﻃﻼﻋﺎت ﺧﻮد را از ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﻳـﻚ ﻓﺮم ﺧﺎﻟﻲ ﺑﻪ ارث ﻣﻲ ﺑﺮد. وراﺛﺖ ﺑﺮاي اﻳﺠﺎد اﺷﻴﺎي ﺑﻪ ﻛﺎر ﺑﺮده ﻣﻲ ﺷﻮد ﻛﻪ "ﺗﻤﺎم اﻋﻀﺎي ﻳﻚ ﺷﻴﺊ دﻳﮕﺮ را داﺷﺘﻪ ﺑﺎﺷﺪ و ﻋﻼوه ﺑﺮ آﻧﻬﺎ ،ﺷـﺎﻣﻞ ﭼﻨـﺪﻳﻦ ﻋـﻀﻮ ﺟﺪﻳﺪ ﺑﺮاي ﺧﻮدش ﺑﺎﺷﺪ" .ﻫﺪف اﺻﻠﻲ وراﺛﺖ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺘﻮاﻧﻴﺪ ﻛﺎراﻳﻲ ﻫﺎي ﻳﻚ ﻛﻼس را ،ﺑﺪون اﻳﻨﻜﻪ ﺑﺪاﻧﻴﺪ آن ﻛﻼس ﺑﻪ ﺻﻮرت دروﻧﻲ ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ ،اﻓﺰاﻳﺶ دﻫﻴﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺎ اﺳﺘﻔﺎده از وراﺛﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ اﺷﻴﺎﻳﻲ را ﺑﺮ ﭘﺎﻳﻪ اﺷﻴﺎي دﻳﮕﺮ ﻛﻪ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن دﻳﮕﺮي ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ اﻳﺠﺎد ﻛﻨﻴﺪ ،ﺑﺪون اﻳﻨﻜﻪ ﺑﺪاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن اﺻﻠﻲ ﭼﮕﻮﻧﻪ آن ﺷﻴﺊ ﭘﺎﻳﻪ را اﻳﺠﺎد ﻛﺮده اﻧﺪ.
Inheritance
1
٣٥٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻪ وﺳﻴﻠﻪ وراﺛﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻳﻜﻲ از ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد اﺳﺘﻔﺎده ﻛﺮده ،ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﺟﺪﻳﺪي ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ و ﻳـﺎ ﺑﻌـﻀﻲ از ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي آن را ﺑﺎ ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﻣﻮرد ﻧﻈﺮ ﺧﻮدﺗﺎن ﻋﻮض ﻛﻨﻴﺪ و ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻼس ﺟﺪﻳﺪي اﻳﺠـﺎد ﻛﻨﻴـﺪ ﻛـﻪ دﻗﻴﻘﺎً ﻧﻴﺎزﻫﺎي ﺗﺎن را ﺑﺮﻃﺮف ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ،ﺑﺎ اﺳﺘﻔﺎده از ﻛﻼس Carﻛﻪ ﻳﻚ ﻛﻼس ﻛﻠﻲ اﺳﺖ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﻼﺳﻬﺎي ﺧﺎﺻﻲ ﺗﺮي ﻣﺎﻧﻨﺪ ﻛﻼﺳﻲ ﺑﺮاي اﺗﻮﻣﺒﻴﻞ ﻫﺎي ﻣﺴﺎﺑﻘﻪ اي ،ﻛﻼﺳﻲ ﺑﺮاي وﺳﺎﻳﻞ ﻧﻘﻠﻴﻪ ﺳﻨﮕﻴﻦ ،ﻛﻼﺳﻲ ﺑﺮاي اﺗﻮﻣﺒﻴﻞ ﻫﺎي ﺳﻮاري و … اﻳﺠﺎد ﻛﻨﻴﺪ. ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ اﺗﻮﻣﺒﻴﻞ ﻫﺎي ﻣﺴﺎﺑﻘﻪ اي را در ﻛﺎﻣﭙﻴﻮﺗﺮ ﺑﻪ وﺳﻴﻠﻪ ﻛﻼﺳـﻲ ﺑـﻪ ﻧـﺎم SportsCarﻣـﺪل ﻛﻨﻴـﺪ .ﻛـﻼس SportsCarﻣﺸﺎﺑﻪ ﻛﻼس Carﺧﻮاﻫﺪ ﺑﻮد اﻣﺎ در ﺑﻌﻀﻲ از ﻗﺴﻤﺘﻬﺎ ﺗﻔﺎوﺗﻬﺎي ﺟﺰﺋﻲ دارد .ﺑﺮاي ﻣﺜﺎل ﺗﻌﺪاد درﻫـﺎ در اﺗﻮﻣﺒﻴـﻞ ﻫﺎي ﻣﺴﺎﺑﻘﻪ اي ﻣﻤﻜﻦ اﺳﺖ ﺑﻴﻦ 2ﺗﺎ 6ﻧﺒﺎﺷﺪ و ﻳﺎ در اﻳﻦ ﻛﻼس ،ﻋﻼوه ﺑﺮ ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﻣﻮﺟﻮد در ﻛﻼس Carﺑﻪ ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ ﻧﻴﺎز دارﻳﺪ ﻛﻪ اﻃﻼﻋﺎﺗﻲ را در ﻣﻮرد ﻛﺎراﻳﻲ و ﻋﻤﻠﻜـﺮد اﺗﻮﻣﺒﻴـﻞ ﺑـﻪ ﻛـﺎرﺑﺮ ﺑﺪﻫـﺪ ،ﻣﺎﻧﻨـﺪ ﻣﺘـﺪﻫﺎي Weightو ﻳـﺎ PowerToWeightRatioﻛﻪ در ﺷﻜﻞ 6-9ﻧﻴﺰ ﻧﺸﺎن داده ﺷﺪه اﻧﺪ. ﻧﻜﺘﻪ :ﺑﻪ ﻛﻼﺳﻲ ﻛﻪ از ﻛﻼس دﻳﮕﺮي ﺑﻪ ارث ﮔﺮﻓﺘﻪ ﺷﻮد )ﻫﻤﺎﻧﻨﺪ ﻛﻼس SportsCarدر ﻣﺜﺎل ﺑﺎﻻ( ،ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه
1
و ﺑﻪ ﻛﻼﺳﻲ ﻛﻪ ﻛﻼﺳﻬﺎي دﻳﮕﺮ از آن ﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ )ﻣﺎﻧﻨﺪ ﻛﻼس Carدر ﻣﺜﺎل ﺑﺎﻻ( ﻛﻼس ﭘﺎﻳﻪ 2ﻣﻲ ﮔﻮﻳﻨﺪ. ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ در ﻣﻮرد وراﺛﺖ ﺑﺎﻳﺪ ﺑﺪاﻧﻴﺪ ،ﻧﺤﻮه دﺳﺘﺮﺳﻲ ﻛـﻼس ﻣـﺸﺘﻖ ﺷـﺪه ﺑـﻪ ﻋـﻀﻮ ﻫـﺎي publicو private ﻛﻼس ﭘﺎﻳﻪ اﺳﺖ .ﻫﺮ ﻋﻀﻮ publicاز ﻛﻼس ﭘﺎﻳﻪ ﺑﻪ وﺳﻴﻠﻪ ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ ،اﻣﺎ ﻛﻼس ﻫﺎي ﻣﺸﺘﻖ ﺷﺪه ﺑﻪ ﻋﻀﻮ ﻫﺎي privateﻛﻼس ﭘﺎﻳﻪ دﺳﺘﺮﺳﻲ ﻧﺪارﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﻛﻼس SportsCarﺑﺨﻮاﻫﺪ ﺳﺮﻋﺖ ﻳﻚ ﺷﻴﺊ را ﺗﻐﻴﻴﺮ دﻫﺪ ﺑﺎﻳﺪ از ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﻮﺟﻮد در ﻛﻼس Carاﺳﺘﻔﺎده ﻛﻨﺪ و ﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﻓﻴﻠﺪ _speedدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. ﺷﻜﻞ 6-9
اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﺟﺪﻳﺪ: ﺑﺮاي درك ﺑﻬﺘﺮ وراﺛﺖ ،در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ﻛﻼس ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم SportsCarاﻳﺠﺎد ﻣﻲ ﻛﻨـﻴﻢ ﻛـﻪ از ﻛـﻼس Car ﻣﺸﺘﻖ ﺷﻮد و ﺑﻪ وﺳﻴﻠﻪ آن ﺑﺘﻮاﻧﻴﺪ ﻧﺴﺒﺖ وزن اﺗﻮﻣﺒﻴﻞ ﺑﻪ ﻧﻴﺮوي ﻣﻮﺗﻮر آن را ﺑﺪاﻧﻴﺪ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺑﻪ ارث ﺑﺮدن از ﻛﻼس Car (1ﺑﺮاي اﻳﻦ ﻣﺜﺎل ﺑﺎﻳﺪ ﻳﻚ ﻓﻴﻠﺪ publicﺑﻪ ﻛﻼس Carاﺿﺎﻓﻪ ﻛﻨﻴﺪ ﺗﺎ ﻗﺪرت اﺗﻮﻣﺒﻴﻞ را ﺑﺮ ﺣﺴﺐ اﺳﺐ ﺑﺨـﺎر در ﺧـﻮد ذﺧﻴﺮه ﻛﻨﺪ .اﻟﺒﺘﻪ اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﻪ ﺻﻮرت دﻗﻴﻖ و درﺳﺖ ﻛﺎر ﻛﻨﻴﺪ ،ﺑﺎﻳﺪ ﻳﻚ ﺧﺎﺻﻴﺖ اﻳﺠﺎد ﻛﻨﻴﺪ و ﺑﻪ وﺳﻴﻠﻪ آن از درﺳـﺖ ﺑﻮدن ﻣﻘﺪار وارد ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ .اﻣﺎ در اﻳﻨﺠﺎ ﺳﺎدﮔﻲ و ﺳﺮﻋﺖ ﺑﺮاي ﻣـﺎ اﻫﻤﻴـﺖ ﺑﻴـﺸﺘﺮي دارد ،ﺑﻨـﺎﺑﺮاﻳﻦ از ﻓﻴﻠﺪ ﺑﻪ ﺟﺎي ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ .ﻓﺎﻳﻞ ﺣﺎوي ﻛﻼس Carرا ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ: ;public string Color Derived Class Base Class
1 2
٣٥٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;public int HorsePower ;private int _speed ;private int _numberOfDoors (2ﭘﻨﺠﺮه Solution Explorerﺑﺮوﻳﺪ و روي ﻧﺎم ﭘﺮوژه ﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ .از ﻣﻨﻮي ﺑﺎز ﺷﺪه ﮔﺰﻳﻨـﻪ Add Classرا اﻧﺘﺨــﺎب ﻛــﺮده و ﺑــﺎ اﺳــﺘﻔﺎده از ﭘﻨﺠــﺮه اي ﻛــﻪ ﻧﻤــﺎﻳﺶ داده ﻣــﻲ ﺷــﻮد ﻛــﻼس ﺟﺪﻳــﺪي ﺑــﻪ ﻧــﺎم SportsCar.csاﻳﺠﺎد ﻛﻨﻴﺪ. (3ﺣﺎل ﺑﺎﻳﺪ ﺑﻪ ﻛﻼس SportsCarﺑﮕﻮﻳﻴﻢ ﻛﻪ از ﻛﻼس Carﻣﺸﺘﻖ ﺷﻮد .ﺑـﺮاي اﻳـﻦ ﻛـﺎر در ﻣﻘﺎﺑـﻞ ﻧـﺎم ﻛـﻼس SportsCarﻳﻚ ﻋﻼﻣﺖ :ﻗﺮار داده و ﺳﭙﺲ ﻧﺎم ﻛﻼس ﭘﺎﻳﻪ را ذﻛﺮ ﻣﻲ ﻛﻨﻴﺪ )ﻛﻪ در اﻳﻨﺠﺎ ﺑﺮاﺑﺮ ﺑﺎ Carاﺳـﺖ(. ﺗﻌﺮﻳﻒ ﻛﻼس SportsCarرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: class SportsCar : Car { (4ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻛﻼس SportsCarداراي ﺗﻤﺎم ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﻛﻼس Carﺷﺎﻣﻞ ﻣـﻲ ﺷـﻮد .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎﻳﺪ ﻳﻚ ﻓﻴﻠﺪ publicﻛﻪ ﻣﺨﺼﻮص ﻛﻼس SportsCarاﺳﺖ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨـﻴﻢ .ﺑـﺮاي اﻳـﻦ ﻛﺎر ﻛﺪ زﻳﺮ را ﺑﻪ اﻳﻦ ﻛﻼس اﺿﺎﻓﻪ ﻛﻨﻴﺪ: ;public int Weight (5ﺑﺮاي ﺗﺴﺖ ﻛﻼس ﺟﺪﻳﺪ ﺑﺎﻳﺪ ﻳﻚ زﻳﺮ ﺑﺮﻧﺎﻣﻪ ﺟﺪﻳﺪ ﺑﻪ ﻓﺎﻳﻞ Program.csاﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺪ زﻳﺮ را ﺑـﻪ اﻳـﻦ ﻓﺎﻳﻞ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: – // DisplaySportsCarDetails // procedure that displays a sports car’s details static void DisplaySportsCarDetails(SportsCar )theCar { // Display the details of the sports car ;)(Console.WriteLine Console.WriteLine("Sports Car Horsepower: " + ;)theCar.HorsePower Console.WriteLine("Sports Car Weight: " + ;)theCar.Weight } (6ﺣﺎل زﻳﺮ ﺑﺮﻧﺎﻣﻪ Mainدر ﻓﺎﻳﻞ Program.csرا ﺗﻐﻴﻴﺮ دﻫﻴﻢ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﺑـﻪ ﻓﻴﻠﺪ Weightدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ ،ﺑﺎﻳﺪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس SportsCarاﻳﺠﺎد ﻛﻨﻴﻢ ﻧﻪ ﻳﻚ ﺷﻴﺊ از ﻛـﻼس .Carﺗﻐﻴﻴﺮات زﻳﺮ را در ﻣﺘﺪ Mainاﻳﺠﺎد ﻛﻨﻴﺪ: )static void Main(string[] args {
٣٥٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Create a new sport car object ;)(SportsCar objCar = new SportsCar // Modify the number of doors ;objCar.NumberOfDoors = 2 )// Set the horsepower and weight (KG ;objCar.HorsePower = 240 ;objCar.Weight = 1085 // Display the details of the car ;)DisplayCarDetails(objCar ;)DisplaySportsCarDetails(objCar // Wait for input from the user ;)(Console.ReadLine } (7ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﭘﻨﺠﺮه اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 7-9ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻜﻞ 7-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮاي اﻳﻨﻜﻪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ ﻳﻚ ﻛﻼس از ﻛﻼس دﻳﮕﺮي ﻣﺸﺘﻖ ﺷﺪه اﺳﺖ ،ﺑﺎﻳﺪ ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻛﻼس ،ﻧﺎم ﻛﻼس ﭘﺎﻳﻪ را در ﻣﻘﺎﺑﻞ ﻧـﺎم ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﻌﺪ از ﻋﻼﻣﺖ :ﻗﺮار دﻫﻴﻢ. class SportsCar : Car ﺑﻪ اﻳﻦ ﺻﻮرت ﻛﻼس SportsCarﺷﺎﻣﻞ ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻛﻼس Carﺧﻮاﻫﺪ ﺑـﻮد ،اﻣـﺎ ﺑـﺎ وﺟـﻮد اﻳـﻦ ﻛـﻼس SportsCarﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻪ اﻋﻀﺎي privateﻛﻼس Carدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻓﻴﻠـﺪ ﺟﺪﻳـﺪ ﺗﻌﺮﻳـﻒ ﻣﻲ ﻛﻨﻴﺪ:
٣٥٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;public int Weight اﻳﻦ ﻓﻴﻠﺪ ﻓﻘﻂ در اﺷﻴﺎي ﻛﻪ از ﻛﻼس SportsCarﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﻮﻧﺪ وﺟﻮد ﺧﻮاﻫﻨﺪ داﺷﺖ و اﺷﻴﺎي ﻛﻪ از ﻛﻼس Carﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﻮﻧﺪ ﺷﺎﻣﻞ ﭼﻨﻴﻦ ﻓﻴﻠﺪي ﻧﺨﻮاﻫﻨـﺪ ﺑـﻮد .ﺑـﻪ اﻳـﻦ ﻣـﻮرد ﻫﻤـﻮاره ﺗﻮﺟـﻪ ﻛﻨﻴـﺪ – اﮔـﺮ ﺷـﻴﺊ ﻛـﻪ اﻳﺠـﺎد ﻣـﻲ ﻛﻨﻴـﺪ از ﻛـﻼس SportsCarﻧﺒﺎﺷﺪ و ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﻓﻴﻠﺪ Weightدر آن ﺷﻴﺊ دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﺪ ،ﻫﻨﮕـﺎم ﻛﺎﻣﭙﺎﻳـﻞ ﺑﺮﻧﺎﻣـﻪ ﺑـﺎ ﺧﻄـﺎ ﻣﻮاﺟـﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ .ﻓﻴﻠﺪ Weightﺗﺤﺖ ﻫﻴﭻ ﺷﺮاﻳﻄﻲ ﻧﻤﻲ ﺗﻮاﻧﺪ در اﺷﻴﺎﻳﻲ ﻛﻪ از ﻛﻼس Carﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪه اﻧﺪ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ) ﺑﺮاي روﺷﻦ ﺷﺪن ﺑﻬﺘﺮ اﻳﻦ ﻣﻄﻠﺐ ،ﺷﻜﻞ 6-9را ﺑﺒﻴﻨﻴﺪ(. زﻳﺮ ﺑﺮﻧﺎﻣﻪ DisplaySportsCarDetailsﺧﺎﺻﻴﺖ Horsepowerاز ﻛﻼس Carو ﻫﻤﭽﻨـﻴﻦ ﺧﺎﺻـﻴﺖ Weightاز ﻛﻼس SportsCarرا ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﺑـﻪ ﻋﻠـﺖ اﻳﻨﻜـﻪ ﻛـﻼس SportsCarاز ﻛـﻼس Carﻣﺸﺘﻖ ﺷﺪه اﺳﺖ ﺷﺎﻣﻞ ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻛﻼس اﺳﺖ. – // DisplaySportsCarDetails // procedure that displays a sports car’s details static void DisplaySportsCarDetails(SportsCar )theCar { // Display the details of the sports car ;)(Console.WriteLine Console.WriteLine("Sports Car Horsepower: " + ;)theCar.HorsePower Console.WriteLine("Sports Car Weight: " + ;)theCar.Weight } ﺣﺎل در زﻳﺮ ﺑﺮﻧﺎﻣﻪ Mainاﺑﺘﺪا ﺑﺎﻳﺪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس SportsCarاﻳﺠﺎد ﻛﻨـﻴﻢ ﺗـﺎ ﺑﺘـﻮاﻧﻴﻢ ﺑـﻪ ﻣﻘـﺪار ﻓﻴﻠـﺪ Weight دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ: // Create a new sport car object ;)(SportsCar objCar = new SportsCar ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻫﻨﮕﺎم اﺳﺘﻔﺎده از ﺗﺎﺑﻊ DisplayCarDetailsﺑﻪ ﺟﺎي اﻳﻨﻜﻪ ﻳﻚ ﺷﻴﺊ از ﻧـﻮع Carرا ﺑﻪ آن ﺑﻔﺮﺳﺘﻴﻢ ﻣﻲ ﺗﻮاﻧﻴﻢ از ﻳﻚ ﺷﻴﺊ SportsCarاﺳﺘﻔﺎده ﻛﻨـﻴﻢ ،زﻳـﺮا ﻛـﻼس SportsCarزﻳـﺮ ﻣﺠﻤﻮﻋـﻪ ﻛـﻼس Carاﺳﺖ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫﺮ ﺷﻴﺊ از ﻧﻮع SportsCarدر ﺣﻘﻴﻘﺖ ﻳﻚ ﺷﻴﺊ از ﻧﻮع Carاﺳﺖ )ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ در دﻧﻴـﺎي واﻗﻌﻲ ﻧﻴﺰ ﻫﺮ اﺗﻮﻣﺒﻴﻞ ﻣﺴﺎﺑﻘﻪ اي ،در واﻗـﻊ ﻳـﻚ اﺗﻮﻣﺒﻴـﻞ اﺳـﺖ( .ﺑﻌـﺪ از ﻓﺮاﺧـﻮاﻧﻲ ﻣﺘـﺪ ،DisplayCarDetailsﻣﺘـﺪ DisplaySportsCarDetailsرا اﺣﻈﺎر ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﺧﺎﺻﻴﺘﻬﺎي ﻣﺮﺑﻮط ﺑﻪ ﺷﻴﺊ SportsCarﻧﻴـﺰ ﻧﻤـﺎﻳﺶ داده ﺷﻮد. // Display the details of the car ;)DisplayCarDetails(objCar ;)DisplaySportsCarDetails(objCar
٣٦٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
:GetPowerToWeightRatio اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻧﺴﺒﺖ وزن اﺗﻮﻣﺒﻴﻞ ﺑﻪ ﻧﻴﺮوي ﻣﻮﺗﻮر آن ﺑﻪ ﻛﺎر ﻣﻲ رود و ﻣﻲGetPowerToWeightRatio ﻣﺘﺪ PowerToWaightRatio ﺧﻮاﻧﺪﻧﻲ اﻳﺠﺎد ﺷﻮد )ﻛﻪ در اﻳﻦ ﺻـﻮرت ﻧـﺎم آن ﺑﺎﻳـﺪ ﺑـﻪ-ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻳﻚ ﺧﺎﺻﻴﺖ ﻓﻘﻂ . اﻣﺎ ﺑﺮاي ﺗﻜﻤﻴﻞ ﻣﺜﺎل اﻳﻦ ﻗﺴﻤﺖ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ آن را ﺑﻪ ﺻﻮرت ﻳﻚ ﻣﺘﺪ ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ،(ﺗﻐﻴﻴﺮ ﻛﻨﺪ
GetPowerToWeightRatio اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪ:اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﺮاي اﻳـﻦ ﻛـﺎر ﻛـﺪ زﻳـﺮ را ﺑـﻪ.( ﺑﺮاي ﻣﺤﺎﺳﺒﻪ ﻣﻘﺪار ﻣﻮرد ﻧﻈﺮ در اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ ﻧﻴﺮوي ﻣﻮﺗﻮر را ﺑﺮ وزن اﺗﻮﻣﺒﻴﻞ ﺗﻘﺴﻴﻢ ﻛﻨﻴﺪ1 : اﺿﺎﻓﻪ ﻛﻨﻴﺪSportsCar ﻛﻼس // GetPowerToWeightRatio - work out the power to // weight public double GetPowerToWeightRatio() { // Calculate the power-to-weight ratio return (double)HorsePower / Weight; } Program.cs در ﻓﺎﻳـﻞDisplaySportsCarDetails ﻛﺪ زﻳﺮ را ﺑﻪ ﻣﺘﺪ،( ﺑﺮاي ﻣﺸﺎﻫﺪه ﻧﺘﻴﺠﻪ2 :اﺿﺎﻓﻪ ﻛﻨﻴﺪ // DisplaySportsCarDetails – //procedure that displays a sports car’s details static void DisplaySportsCarDetails(SportsCar theCar) { // Display the details of the sports car Console.WriteLine(); Console.WriteLine("Sports Car Horsepower: " + theCar.HorsePower); Console.WriteLine("Sports Car Weight: " + theCar.Weight); Console.WriteLine("Power-to-Weight Ratio: " + theCar.GetPowerToWeightRatio()); } . ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ8-9 ﭘﻨﺠﺮه اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ3
٣٦١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 8-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻣﺠﺪداً ﺗﻤﺎم ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﺘﺪ ﺟﺪﻳﺪي را ﺑﻪ ﻧـﺎم GetPowerToWeightRatioﺑـﻪ ﻛـﻼس SportsCarاﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 9-9ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﻣﺘﺪ ﺑﺮاي ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ از ﻛﻼس SportsCarﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪه ﺑﺎﺷﻨﺪ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺧﻮاﻫﺪ ﺑﻮد. ﺷﻜﻞ 9-9 ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﻣﺘﺪ ﻗﺒﻞ از ﺗﻘﺴﻴﻢ ﻧﻴﺮوي ﻣﻮﺗﻮر اﺗﻮﻣﺒﻴﻞ ﺑﺮ وزن آن ،ﻓﻴﻠﺪ ﺣﺎوي ﻧﻴﺮوي ﻣﻮﺗـﻮر را ﺑـﻪ ﻧـﻮع داده اي double ﺗﺒﺪﻳﻞ ﻛﺮده اﻳﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﮔﻔﺘﻢ ،ﺗﻘﺴﻴﻢ ﻳﻚ ﻣﺘﻐﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﺮ ﻣﺘﻐﻴـﺮ دﻳﮕـﺮي از ﻧـﻮع ﻋـﺪد ﺻـﺤﻴﺢ، ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﺣﺎﺻﻞ ﻧﻴﺰ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ ﺑﺎﺷﺪ .اﻣﺎ در اﻳﻦ ﻣﺘﺪ ﻣﺎ ﺑﻪ ﻗﺴﻤﺖ اﻋﺸﺎر ﺣﺎﺻﻞ ﺗﻘﺴﻴﻢ ﻧﻴﺎز دارﻳﻢ. ﺑﺎ ﺗﺒﺪﻳﻞ ﻳﻜﻲ از ﻃﺮﻓﻴﻦ ﺗﻘﺴﻴﻢ ﺑﻪ ﻧﻮع داده اي ،doubleﺑﺎﻋﺚ ﻣﻲ ﺷﻮﻳﻢ ﻛﻪ ﻧﻮع داده اي دو ﻣﻮردي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻨﺪ ﺑـﺮ ﻳﻜـﺪﻳﮕﺮ ﺗﻘﺴﻴﻢ ﺷﻮﻧﺪ ﻣﺘﻔﺎوت ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺨﻮاﻫﺪ اﻳﻦ دو ﻣﻘﺪار را ﺑﺮ ﻫﻢ ﺗﻘﺴﻴﻢ ﻛﻨﺪ ﻧﻮع داده اي ﻛﻮﭼﻜﺘﺮ را ) (intﺑﻪ ﻧﻮع داده اي ﺑﺰرﮔﺘﺮ ) (doubleﺗﺒﺪﻳﻞ ﻣـﻲ ﻛﻨـﺪ و ﺳـﭙﺲ ﺗﻘـﺴﻴﻢ را اﻧﺠـﺎم ﻣـﻲ دﻫـﺪ ،ﻫﻤﭽﻨـﻴﻦ ﺣﺎﺻـﻞ ﺗﻘـﺴﻴﻢ را ﻧﻴـﺰ از ﻧـﻮع doubleﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﻌﺪ از ﺗﻘﺴﻴﻢ ﺑﻪ ﻣﻘﺪار اﻋﺸﺎري ﻧﻴﺰ دﺳﺘﺮﺳﻲ ﺧﻮاﻫﻴﻢ داﺷﺖ. // Calculate the power-to-weight ratio ;return (double)HorsePower / Weight
ﺗﻐﻴﻴﺮ دادن ﭘﻴﺶ ﻓﺮض ﻫﺎ: ﻋﻼوه ﺑﺮ اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﺟﺪﻳﺪ ﺑﻪ ﻳﻚ ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ،در ﺷﺮاﻳﻄﻲ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻳﻜـﻲ از ﻣﺘـﺪﻫﺎ و ﻳـﺎ ﺧﺎﺻﻴﺖ ﻫﺎي ﻛﻼس ﭘﺎﻳﻪ ،در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﻪ ﮔﻮﻧﻪ اي دﻳﮕﺮ ﻋﻤﻞ ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳـﺪ آن ﻣﺘـﺪ و ﻳـﺎ ﺧﺎﺻـﻴﺖ را از اول در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﻨﻮﻳﺴﻴﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ ﻣﺘﺪﻫﺎي ﺳﺎزﻧﺪه ﮔﻔﺘﻴﻢ ،اﻳﻦ ﻣﺘﺪﻫﺎ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﺑﺨﻮاﻫﺪ ﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﻮد ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮﻧﺪ و اﺟﺎزه ﻣﻲ دﻫﻨﺪ ﻛﻪ ﺣﺎﻟﺖ اوﻟﻴﻪ اﻋﻀﺎي ﻳﻚ ﺷﻴﺊ را ﺗﻌﻴﻴﻦ ﻛﻨﻴﺪ .در ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس ،Carﻣﻘﺪار _numberOfDoorsرا ﺑﺮاﺑﺮ ﺑﺎ 4در ﻧﻈﺮ ﮔﺮﻓﺘﻴﻢ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﻪ ﻃﻮر ﻣﻌﻤﻮل ﺗﻌﺪاد درﻫﺎ ﺑﺮاي ﻳﻚ اﺗﻮﻣﺒﻴﻞ ﻣﺴﺎﺑﻘﻪ اي 2در اﺳﺖ .در ﻣﺜﺎل ﻗﺒﻠـﻲ ﺑـﺎ ﺗﻨﻈـﻴﻢ
٣٦٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﻦ ﺧﺎﺻﻴﺖ ﺑﻌﺪ از اﻳﺠﺎد ﺷﻴﺊ ،ﺗﻌﺪاد درﻫﺎ را ﺑﺮاﺑﺮ ﺑﺎ 2ﻗﺮار دادﻳﻢ .اﻣﺎ ﺳﻮال اﻳﻦ اﺳﺖ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ اﻳﻦ ﻣﻘﺪار را ﻫﻨﮕـﺎم ﻧﻤﻮﻧـﻪ ﺳﺎزي ﺷﺪن ﺷﻴﺊ از ﻛﻼس SportsCarﺗﻨﻈﻴﻢ ﻛﻨﻴﻢ؟ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻳﻜﻲ از ﻣﺘﺪﻫﺎي ﻛﻼس ﭘﺎﻳﻪ را ﺑﺎ ﻳﻚ ﻣﺘﺪ ﺟﺪﻳﺪ در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﻛﻪ ﺗﻮﺳﻂ ﺧﻮدﺗﺎن ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﺗﻌﻮﻳﺾ ﻛﻨﻴﺪ، ﺑﻪ اﻳﻦ ﭘﺮوﺳﻪ overrideﻛﺮدن ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ آن ﻣﺘﺪ را در ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ، ﻣﺘﺪ ﺟﺪﻳﺪ اﺟﺮا ﻣﻲ ﺷﻮد اﻣﺎ اﮔﺮ اﻳﻦ ﻣﺘﺪ را در ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﭘﺎﻳﻪ ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ ،ﻣﺘﺪ ﻗﺪﻳﻤﻲ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺧﻮاﻫـﺪ ﮔﺮﻓـﺖ .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ ﭼﮕﻮﻧـﻪ ﻣـﻲ ﺗـﻮان ﻣﺘـﺪ ﺳـﺎزﻧﺪه ﻛـﻼس Carرا در ﻛـﻼس ،SportsCar overrideﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ override :ﻛﺮدن ﻣﺘﺪ ﺳﺎزﻧﺪه (1ﺑﺮاي overrideﻛﺮدن ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس Carدر ﻛﻼس ،SportsCarﺗﻨﻬﺎ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠـﺎم دﻫﻴـﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﺟﺪﻳﺪ ﺑﺮاي ﻛﻼس SportsCarاﻳﺠﺎد ﻛﻨﻴﺪ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻛـﺪ زﻳـﺮ را ﺑـﻪ ﻛـﻼس SportsCarاﺿﺎﻓﻪ ﻛﻨﻴﺪ: // Constructor )(public SportsCar { // Change the default values ;"Color = "Green ;NumberOfDoors = 2 } (2ﺧﻂ زﻳﺮ را از زﻳﺮ ﺑﺮﻧﺎﻣﻪ Mainدر ﻓﺎﻳﻞ Program.csﺣﺬف ﻛﻨﻴﺪ. // Modify the number of doors ;objCar.NumberOfDoors = 2 (3ﺣﺎل ﺑﺮاي ﺗﺴﺖ ﻛﺮدن ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس ،SportsCarﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﺑﻌﺪ از اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﭘﻨﺠـﺮه اي ﻣـﺸﺎﺑﻪ ﺷﻜﻞ 10-9را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 10-9
٣٦٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻣﺘﺪ ﺳﺎزﻧﺪه اي ﻛﻪ ﺑﺮاي ﻛﻼس SportsCarاﻳﺠﺎد ﻛﺮده اﻳﺪ ،ﺑﻌﺪ از ﻣﺘﺪ ﺳﺎزﻧﺪه ﻣﻮﺟﻮد در ﻛﻼس Carاﺟﺮا ﻣﻲ ﺷـﻮد .ﺗﻮﺟـﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﺑﺮاي ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه اﻳﺠﺎد ﻛﻨﻴﺪ ،ﺑﺎز ﻫﻢ ﻣﺘﺪ ﺳﺎزﻧﺪه ﻣﻮﺟﻮد در ﻛﻼس ﭘﺎﻳـﻪ اﺣـﻀﺎر ﻣـﻲ ﺷﻮد .اﻣﺎ ،.NETﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس ﭘﺎﻳﻪ را ﻗﺒﻞ از ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .در ﺣﻘﻴﻘﺖ ﺗﺮﺗﻴﺐ اﺟﺮاي ﻣﺘﺪﻫﺎ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ اﺑﺘﺪا ﻣﺘﺪ زﻳﺮ اﺟﺮا ﻣﻲ ﺷﻮد: // Constructor )(public Car { // Set the default values ;"Color = "White ;_speed = 0 ;_numberOfDoors = 4 } ﺳﭙﺲ ﻣﺘﺪ زﻳﺮ اﺟﺮا ﻣﻲ ﺷﻮد: // Constructor )(public SportsCar { // Change the default values ;"Color = "Green ;NumberOfDoors = 2 } ﻫﻤﭽﻨــﻴﻦ ﺗﻮﺟــﻪ ﻛﻨﻴــﺪ ﻛــﻪ ﺑــﺮاي ﺗﻐﻴﻴــﺮ دادن ﺗﻌــﺪاد درﻫــﺎ در ﻛــﻼس ﻣــﺸﺘﻖ ﺷــﺪه ﻧﻤــﻲ ﺗــﻮاﻧﻴﻢ ﺑــﻪ ﺻــﻮرت ﻣــﺴﺘﻘﻴﻢ ﺑــﻪ ﻓﻴﻠــﺪ _numberOfDoorsدﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ ،زﻳﺮا اﻳﻦ ﻓﻴﻠـﺪ در ﻛـﻼس ﭘﺎﻳـﻪ از ﻧـﻮع privateﺗﻌﺮﻳـﻒ ﺷـﺪه اﺳـﺖ و ﻣﺘﺪﻫﺎي ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﻪ آن دﺳﺘﺮﺳﻲ ﻧﺪارﻧﺪ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻـﻴﺖ NumberOfDoorsﺗﻌـﺪاد درﻫـﺎ را ﺑﺮاﺑﺮ ﺑﺎ 2ﻗﺮار ﻣﻲ دﻫﻴﻢ.
ﭼﻨﺪ ﺷﻜﻠﻲ ﺑﻮدن :ﻛﻠﻤﻪ اي ﺗﺮﺳﻨﺎك ،ﻣﻔﻬﻮﻣﻲ ﺳﺎده ﻳﻜﻲ دﻳﮕﺮ از اﺻﻮل ﻣﻬﻢ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ،ﻣﻔﻬﻮم ﭼﻨﺪ ﺷﻜﻠﻲ 1ﺑﻮدن اﺳﺖ .اﺣﺘﻤﺎﻻً اﻳﻦ ﻣﻔﻬﻮم ﻳﻜﻲ از ﺳـﺨﺖ ﺗـﺮﻳﻦ ﻣﻔـﺎﻫﻴﻢ ﺷﻴﺊ ﮔﺮاﻳﻲ ﺑﻪ ﻧﻈﺮ ﻣﻲ آﻳﺪ ،اﻣﺎ درك آن ﺑﺴﻴﺎر راﺣﺖ اﺳﺖ .در ﺣﻘﻴﻘﺖ ﺗﺎﻛﻨﻮن در ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﻗﺒﻠـﻲ ﺧـﻮد ﻧﻴـﺰ از ﭼﻨـﺪ ﺷـﻜﻠﻲ ﺑـﻮدن اﺳﺘﻔﺎده ﻛﺮده اﻳﺪ. ﺑﺎر دﻳﮕﺮ ﺑﻪ ﻛﺪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي DisplayCarDetailsﺗﻮﺟﻪ ﻛﻨﻴﺪ: )static void DisplayCarDetails(Car theCar Polymorphism
1
٣٦٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ // Display the details of the car ;)Console.WriteLine("Color: " + theCar.Color Console.WriteLine("Number of doors: " + ;)theCar.NumberOfDoors Console.WriteLine("Current speed: " + ;)theCar.Speed } ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺧﻂ اول ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،اﻳﻦ ﻣﺘﺪ ﭘﺎراﻣﺘﺮي از ﻧﻮع Carﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .اﻣﺎ ﻫﻨﮕﺎم ﻓﺮاﺧـﻮاﻧﻲ آن ﭘﺎراﻣﺘﺮي از ﻧﻮع SportsCarﺑﻪ آن ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮد. // Create a new sport car object ;)(SportsCar objCar = new SportsCar // Display the details of the car ;)DisplayCarDetails(objCar ﺳﻮاﻟﻲ ﻛﻪ ﭘﻴﺶ ﻣﻲ آﻳﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﺑﻪ ﻣﺘﺪي ﻛﻪ ﭘﺎراﻣﺘﺮي از ﻧﻮع Carدارد ،ﺷـﻴﺊ از ﻧـﻮع SportsCarرا ﻓﺮﺳﺘﺎد؟ ﺧﻮب ،ﭼﻨﺪ ﺷﻜﻠﻲ ﺑﻮدن ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﺘﻮاﻧﺪ در ﻣﻮاﻗﻌﻲ ﻛﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ از ﻛـﻼس ﭘﺎﻳـﻪ ﻧﻴـﺎز اﺳﺖ ،ﻫﻤﺎﻧﻨﺪ ﺷﻴﺊ اي از ﻛﻼس ﭘﺎﻳﻪ ﻋﻤﻞ ﻛﻨﺪ .در اﻳﻦ ﻣﺜﺎل ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﺷﻴﺊ اي از SportsCarﻫﻤﺎﻧﻨـﺪ ﻳـﻚ ﺷـﻴﺊ از ﻛﻼس Carرﻓﺘﺎر ﻛﻨﻴﺪ ،زﻳﺮا ﻛﻼس SportsCarاز ﻛﻼس Carﻣﺸﺘﻖ ﺷﺪه اﺳﺖ .ﭼﻨﺪ ﺷﻜﻠﻲ ﺑﻮدن ﺑﻪ اﻳﻦ دﻟﻴﻞ اﺳﺖ ﻛﻪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ وراﺛﺖ ﮔﻔﺘﻴﻢ ،ﻫﺮ ﺷﻴﺊ از ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﺎﻳﺪ داراي ﺗﻤﺎم ﻗﺎﺑﻠﻴﺘﻬﺎي ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﭘﺎﻳـﻪ ﺑﺎﺷـﺪ؛ اﮔﺮﭼـﻪ ﻣﻲ ﺗﻮاﻧﺪ ﻣﺘﺪﻫﺎ و ﻳﺎ ﺧﺎﺻﻴﺘﻬﺎي ﺑﻴﺸﺘﺮي ﻧﻴﺰ داﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﺨﻮاﻫﻴﻢ ﻣﺘﺪي را از ﻛﻼس Carﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ ،ﻛـﻼس SportsCarﻧﻴﺰ ﺣﺘﻤﺎً داراي اﻳﻦ ﻣﺘﺪ ﺧﻮاﻫﺪ ﺑﻮد. اﻟﺒﺘﻪ واﺿﺢ اﺳﺖ ﻛﻪ ﻋﻜﺲ اﻳﻦ ﻣﻮرد درﺳﺖ ﻧﻴﺴﺖ .ﻣﺘﺪ DisplaySportsCarDetailsﻛﻪ ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ: static void DisplaySportsCarDetails(SportsCar )theCar ﻧﻤﻲ ﺗﻮاﻧﺪ ﻳﻚ ﺷﻴﺊ از ﻧﻮع Carرا ﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ درﻳﺎﻓﺖ ﻛﻨﺪ .ﻛﻼس Carﺗﻀﻤﻴﻦ ﻧﻤﻲ ﻛﻨﺪ ﻛﻪ ﻫﺮ ﻣﺘﺪ و ﻳﺎ ﺧﺎﺻـﻴﺘﻲ ﻛـﻪ در ﻛﻼس SportsCarوﺟﻮد دارد را داﺷﺘﻪ ﺑﺎﺷﺪ ،زﻳﺮا ﻣﺘﺪﻫﺎ و ﻳﺎ ﺧﺎﺻﻴﺖ ﻫﺎﻳﻲ در ﻛﻼس SportsCarوﺟﻮد دارﻧﺪ ﻛـﻪ در ﻛﻼس Carﺗﻌﺮﻳﻒ ﻧﺸﺪه اﺳﺖ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ SportsCarﻧﻮع ﺧﺎﺻﻲ از Carاﺳﺖ.
Overrideﻛﺮدن ﻣﺘﺪﻫﺎي ﺑﻴﺸﺘﺮ: اﮔﺮﭼﻪ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ ﻣﺘﺪ ﺳﺎزﻧﺪه ﻛﻼس Carرا در ﻛﻼس override ،SportsCarﻛﺮدﻳﻢ ،اﻣﺎ ﺑﻬﺘـﺮ اﺳـﺖ ﻛـﻪ ﺑـﺎ ﻧﺤﻮه overrideﻛﺮدن ﻳﻚ ﺗﺎﺑﻊ ﻣﻌﻤﻮﻟﻲ ﻧﻴﺰ آﺷﻨﺎ ﺷﻮﻳﻢ.
٣٦٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﻳﻚ ﻣﺘﺪ را overrideﻛﻨﻴﻢ ،ﺑﺎﻳﺪ آن ﻣﺘﺪ در ﻛـﻼس ﭘﺎﻳـﻪ وﺟـﻮد داﺷـﺘﻪ ﺑﺎﺷـﺪ .ﻣﺘـﺪ Accelerateدر ﻛﻼس Carو ﻛﻼس SportsCarﻧﺒﺎﻳﺪ ﺗﻔﺎوﺗﻲ داﺷﺘﻪ ﺑﺎﺷﺪ ،زﻳﺮا ﻋﻤﻠﻜﺮد آن در ﻫﺮ دو ﻧﻮع ﻣﺸﺎﺑﻪ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ ﻣﺘﺪ IsMovingﻫﻢ ﻓﻘﻂ ﺑﺮاي راﺣﺘﻲ ﻛﺎرﺑﺮ اﺿﺎﻓﻪ ﺷﺪه اﺳﺖ و ﺑﻪ ﻋﻨﻮان رﻓﺘﺎر ﺷﻴﺊ ﺑﻪ ﺷﻤﺎر ﻧﻤﻲ رود ﻛـﻪ آن را overrideﻛﻨﻴﻢ .ﺑﻨﺎﺑﺮاﻳﻦ ﻧﻴﺎز دارﻳﻢ ﻛﻪ ﻣﺘﺪ ﺟﺪﻳـﺪي ﺑـﻪ ﻧـﺎم CalculateAccelerationRateاﺿـﺎﻓﻪ ﻛﻨﻴﻢ .ﻓﺮض ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ در ﻳﻚ اﺗﻮﻣﺒﻴﻞ ﻋﺎدي اﻳﻦ ﻣﻘﺪار ﻳﻚ ﻋﺪد ﺛﺎﺑﺖ اﺳﺖ ،اﻣﺎ در اﺗﻮﻣﺒﻴﻞ ﻫﺎي ﻣﺴﺎﺑﻘﻪ اي ﺑﺎﻳﺪ ﻣﺤﺎﺳﺒﻪ ﺷـﻮد .در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻣﺘﺪ ﺟﺪﻳﺪي ﺑﺮاي overrideﻛﺮدن اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺿﺎﻓﻪ ﻛﺮدن و overrideﻛﺮدن ﻳﻚ ﻣﺘﺪ دﻳﮕﺮ (1ﻣﺘﺪ زﻳﺮ را ﺑﻪ ﻛﻼس Carاﺿﺎﻓﻪ ﻛﻨﻴﺪ: – // CalculateAccelerationRate // assume a constant for a normal car )(public double CalculateAccelerationRate { // If we assume a normal car goes from 0-60 in // 14 seconds, that's an average of 4.2 kmph/s ;return 4.2 } (2ﺣﺎل ﺑﺮاي ﺗﺴﺖ اﻳﻦ ﻣﺘﺪ ،زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي DisplayCarDetailsرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ: – // DisplayCarDetails // procedure that displays the car's details )static void DisplayCarDetails(Car theCar { // Display the details of the car ;)Console.WriteLine("Color: " + theCar.Color Console.WriteLine("Number of doors: " + ;)theCar.NumberOfDoors Console.WriteLine("Current speed: " + ;)theCar.Speed Console.WriteLine("Acceleration Rate: " + ;))(theCar.CalculateAccelerationRate } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ ،ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺧﺮوﺟﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 11-9ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
٣٦٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 11-9 (4ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﻳﻜﻲ از ﻣﺘﺪﻫﺎي ﻛﻼس ﭘﺎﻳﻪ را در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه overrideﻛﻨﻴﻢ ،آن ﻣﺘﺪ در ﻛـﻼس ﭘﺎﻳـﻪ ﺑﺎﻳﺪ ﺑﺎ ﻛﻠﻤﻪ ﻛﻠﻴﺪي virtualﺗﻌﺮﻳﻒ ﺷﺪه ﺑﺎﺷﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در ﻣﺘﺪ ﺟﺪﻳﺪ ﻛـﻼس ،Carﻛﻠﻤـﻪ virtualرا ﺑـﻪ ﺻﻮرت زﻳﺮ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: )(public virtual double CalculateAccelerationRate (5ﺣـــﺎل ﻣـــﻲ ﺗﻮاﻧﻴـــﺪ ﻣﺘـــﺪ CalculateAccelerationRateرا در ﻛـــﻼس ،SportsCar overrideﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﻣﺘﺪي در ﻛﻼس SportsCarاﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ ﻧﺎم ،ﺗﻌﺪاد ﭘﺎراﻣﺘﺮ ﻫﺎ و ﻧﻴـﺰ ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ آن دﻗﻴﻘﺎً ﻣﺸﺎﺑﻪ اﻳﻦ ﻣﺘﺪ در ﻛﻼس Carﺑﺎﺷﺪ و ﻫﻤﭽﻨﻴﻦ در ﺗﻌﺮﻳﻒ ﻣﺘﺪ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي override اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻣﺘﺪ زﻳﺮ را ﺑﻪ ﻛﻼس SportsCarاﺿﺎﻓﻪ ﻛﻨﻴﺪ: // CalculateAccelerationRate// take the power/weight into consideration )(public override double CalculateAccelerationRate { // You'll assume the same 4.2 value, but you'll // multiply it by the power/weight ratio ;)(return 4.2 * GetPowerToWeightRatio } ﻧﻜﺘﻪ :ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ ،ﺑﺮاي overrideﻛﺮدن ﻣﺘﺪ ﺳﺎزﻧﺪه ﻳﻚ ﻛﻼس ،ﻧﻴﺎزي ﺑﻪ اﺳـﺘﻔﺎده از ﻛﻠﻤـﻪ ﻛﻠﻴﺪي overrideﻧﻴﺴﺖ .وﻳﮋوال C#اﻳﻦ ﻛﺎر را ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻧﺠﺎم ﻣﻲ دﻫﺪ. (6ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷـﻜﻞ 12-9ﻣـﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ ،اﻳـﻦ ﻣﺮﺗﺒـﻪ از ﻣﺘـﺪ ﺗﻌﺮﻳـﻒ ﺷـﺪه در ﻛـﻼس SportsCarاﺳﺘﻔﺎده ﺷﺪه اﺳﺖ.
٣٦٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 12-9
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﻪ وﺳﻴﻠﻪ overrideﻛﺮدن ﻳﻚ ﻣﺘﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﭘﻴﺎده ﺳﺎزي 1ﻣﺘﺪﻫﺎي ﻣﻮﺟﻮد در ﻛﻼس ﭘﺎﻳﻪ را در ﻛـﻼس ﻣـﺸﺘﻖ ﺷـﺪه ﺗﻐﻴﻴـﺮ دﻫﻴﺪ .اﻟﺒﺘﻪ اﻳﻦ ﻛﺎر ﺑﺮاي ﺗﻤﺎم ﻣﺘﺪﻫﺎي ﻛﻼس ﭘﺎﻳﻪ ﻣﻤﻜﻦ ﻧﻴﺴﺖ ،ﺑﻠﻜﻪ ﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﺑﺎﻳﺪ ﺑﺎ ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي virtualﻣـﺸﺨﺺ ﺷﻮد ﺗﺎ ﺑﺘﻮاﻧﻴﺪ آن را در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه overrideﻛﻨﻴﺪ. ﻣﺠﺪداً ﺑﻪ ﻣﻔﻬﻮم ﻛﭙﺴﻮﻟﻲ ﺑﻮدن ﺑﺮﻣﻲ ﮔﺮدﻳﻢ .ﺑﻌﺪ از overrideﻛﺮدن ﻣﺘﺪ ،ﻓﺮدي ﻛﻪ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ اﺻﻼً ﺗﻔـﺎوﺗﻲ را در اﺟﺮاي ﻣﺘﺪ ﻣﺘﻮﺟﻪ ﻧﻤﻲ ﺷﻮد – او ﻓﻘﻂ ﺑﻪ ﻫﻤﺎن ﺻﻮرﺗﻲ ﻛﻪ از اﻳﻦ ﻣﺘﺪ ﻗﺒﻞ از overrideﺷﺪن اﺳﺘﻔﺎده ﻣﻲ ﻛﺮد ﻫﻢ اﻛﻨﻮن ﻫـﻢ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ .اﻣﺎ اﻳﻦ ﻣﺮﺗﺒﻪ ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ در واﻗﻊ در ﺣﺎل ﻛﺎر ﺑﺎ ﻳﻚ ﺷﻴﺊ از ﻛﻼس SportsCarاﺳﺖ ﻧﺘﻴﺠـﻪ ﻣﺘﻔـﺎوﺗﻲ را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ. overrideﻛﺮدن ﻳﻚ ﻣﺘﺪ از ﺑﺴﻴﺎري از ﺟﻬﺎت ﺑﺎ overrideﻛﺮدن ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﺗﻔﺎوت دارد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳـﻚ ﻣﺘـﺪ ﺳﺎزﻧﺪه را overrideﻣﻲ ﻛﻨﻴﺪ ،ﻗﺒﻞ از اﻳﻨﻜﻪ ﻣﺘﺪ ﺳﺎزﻧﺪه ي ﺟﺪﻳﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد ﻣﺘﺪ ﺳﺎزﻧﺪه ﻗﺒﻠﻲ ﻓﺮاﺧﻮاﻧﻲ ﺧﻮاﻫﺪ ﺷﺪ .اﻣـﺎ اﮔـﺮ ﻳـــﻚ ﻣﺘـــﺪ ﻋـــﺎدي را overrideﻛﻨﻴـــﺪ ،ﻣﺘـــﺪ ﻗﺒﻠـــﻲ ﻓﻘـــﻂ در ﺻـــﻮرﺗﻲ ﻓﺮاﺧـــﻮاﻧﻲ ﺧﻮاﻫـــﺪ ﺷـــﺪ ﻛـــﻪ از دﺳـــﺘﻮر base.MethodNameاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻛﻠﻤﻪ ﻛﻠﻴﺪي baseدر ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻋﻀﺎي ﻛـﻼس ﭘﺎﻳـﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود. ﻓﺮض ﻛﻨﻴﺪ ﻣﺘﺪ CalculateAccelerationRateدر ﻛﻼس Carﻳﻚ ﻣﻘﺪار ﺛﺎﺑﺖ را ﺑﺮﻧﻤﻲ ﮔﺮداﻧﺪ ،ﺑﻠﻜﻪ ﺑﻌـﺪ از اﻧﺠﺎم دادن ﻳﻚ ﺳﺮي ﻣﺤﺎﺳﺒﺎت ،ﻣﻘﺪاري را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ اﻳﻦ ﻣﺘﺪ در ﻛﻼس ،SportsCarﻋﻼوه ﺑﺮ اﻧﺠﺎم دادن آن ﻣﺤﺎﺳﺒﺎت ،ﻣﻘﺪار ﻧﻬﺎﻳﻲ را در ﻣﻘﺪار ﺗﺎﺑﻊ GetPowerToWeightRatioﻧﻴﺰ ﺿﺮب ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴـﺪ از دﺳﺘﻮر زﻳﺮ در ﻣﺘﺪ overrideﺷﺪه در ﻛﻼس SportsCarاﺳﺘﻔﺎده ﻛﻨﻴﺪ: * )(return (base.CalculateAccelerationRate ;))(GetPowerToWeightRatio ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﺑﺘﺪا ﺗﺎﺑﻊ CalculateAccelerationRateاز ﻛـﻼس ﭘﺎﻳـﻪ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ ﺷـﻮد .ﺳـﭙﺲ ﻣﻘـﺪار ﺑﺮﮔﺸﺘﻲ اﻳﻦ ﺗﺎﺑﻊ در ﻣﻘﺪار ﺑﺮ ﮔﺸﺘﻲ ﺗﺎﺑﻊ GetPowerToWeightRatioﺿﺮب ﺷﺪه و ﻧﺘﻴﺠﻪ ﺑﻪ ﻋﻨـﻮان ﻣﻘـﺪار ﺟﺪﻳـﺪ ﺗﺎﺑﻊ CalculateAccelerationRateﺑﺮﻣﻲ ﮔﺮدد.
– Implementation 1ﺑﻪ ﻳﻚ ﺳﺮي دﺳﺘﻮراﺗﻲ ﻛﻪ درون ﻳﻚ ﻣﺘﺪ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ و ﻧﺤﻮه ﻋﻤﻠﻜﺮد آن را ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻨﺪ ،ﭘﻴﺎده ﺳﺎزي آن ﻣﺘـﺪ ﻣـﻲ ﮔﻮﻳﻨﺪ.
٣٦٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻪ ارث ﺑﺮدن از ﻛﻼس :Object آﺧﺮﻳﻦ ﻣﻄﻠﺒﻲ ﻛﻪ در ﻣﻮرد وراﺛﺖ ﺑﺎﻳﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ اﻳﻦ اﺳﺖ ﻛﻪ در .NETﺣﺘﻲ اﮔﺮ ﻛﻼﺳﻲ را ﺑﻪ ﺻﻮرت ﻋﺎدي و ﺑﺪن ﺗﻌﻴﻴﻦ ﻛﺮدن ﻛﻼس ﭘﺎﻳﻪ ﺑﺮاي آن ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ ،آن ﻛﻼس از ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم Objectﻣﺸﺘﻖ ﻣﻲ ﺷﻮد .ﻛﻼس Objectﺷﺎﻣﻞ ﭼﻬـﺎر ﻣﺘـﺪ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻀﻤﻴﻦ ﻛﻨﻴﺪ در ﺗﻤﺎم ﻛﻼﺳﻬﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ .NETوﺟﻮد دارﻧﺪ .اﻟﺒﺘﻪ ﺷﺮح وﻇﻴﻔﻪ اﻳـﻦ ﻣﺘـﺪﻫﺎ ﺧـﺎرج از ﻣﺒﺎﺣﺚ اﻳﻦ ﻛﺘﺎب اﺳﺖ ،ﺑﺎ وﺟﻮد اﻳﻦ دو ﺗﺎﺑﻊ ﭘﺮ اﺳﺘﻔﺎده از آﻧﻬﺎ را در اﻳﻦ ﻗﺴﻤﺖ ﻣﻌﺮﻓﻲ ﻣﻲ ﻛﻨﻴﻢ:
:ToStringاﻳﻦ ﻣﺘﺪ رﺷﺘﻪ اي ﻛﻪ ﺣﺎوي ﻣﺘﻨﻲ ﺑﺮاي ﻣﻌﺮﻓﻲ ﻛﺮدن ﺷﻴﺊ اﺳﺖ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ .ﺑﻪ ﺧﺎﻃﺮ دارﻳﺪ ﻛـﻪ در اﺑﺘﺪاي ﻓﺼﻞ ﮔﻔﺘﻢ ﻫﺮ ﺷﻴﺊ ﺑﺎﻳﺪ ﺑﺪاﻧﺪ ﻛﻪ از ﭼﻪ ﻧﻮﻋﻲ اﺳﺖ .در ﺣﻘﻴﻘﺖ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﻣﺘﺪ ،ﻳﻚ ﺷﻴﺊ ﻧﻮع ﺧﻮد را ﺑﻪ ﺷـﻤﺎ اﻋﻼم ﻣﻲ ﻛﻨﺪ .اﻟﺒﺘﻪ اﻳﻦ در ﺻﻮرﺗﻲ اﺳﺖ ﻛﻪ اﻳﻦ ﻣﺘﺪ overrideﻧﺸﺪه ﺑﺎﺷﺪ .ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻛﻼس ،ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳـﻦ ﻣﺘﺪ را overrideﻛﻨﻴﺪ ﺗﺎ ﻳﻚ رﺷﺘﻪ ي ﺑﺎ ﻣﻌﻨـﻲ ﺑـﺮاي ﻣـﺸﺨﺺ ﻛـﺮدن ﺷـﻴﺊ ﺑﺮﮔﺮداﻧـﺪ ،ﺑـﺮاي ﻣﺜـﺎل در ﻛـﻼس Customerاﻳﻦ ﻣﺘﺪ را ﺑﻪ ﺻﻮرﺗﻲ overrideﻛﻨﻴﺪ ﻛﻪ ﻧﺎم ﻣﺸﺘﺮك را ﺑﺮﮔﺮداﻧﺪ .اﮔﺮ در ﻳﻚ ﻛﻼس اﻳﻦ ﺗﺎﺑﻊ را overrideﻧﻜﻨﻴﺪ ،ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻧﺎم ﻛﻼس ﺗﻮﺳﻂ اﻳﻦ ﺗﺎﺑﻊ ﺑﺮﮔﺸﺖ داده ﻣﻲ ﺷﻮد. :GetTypeاﻳﻦ ﻣﺘﺪ ﺷﻴﺊ را از ﻛﻼس Typeﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﻧﻮع داده اي ﻛﻼس اﺳﺖ.
ﺑﻪ ﺧﺎﻃﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻻزم ﻧﻴﺴﺖ ﻳﻚ ﻛﻼس را ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ :از ﻛﻼس Objectﻣـﺸﺘﻖ ﻛﻨﻴـﺪ ،زﻳـﺮا اﻳـﻦ ﻛـﺎر ﺑـﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻧﺠﺎم ﻣﻲ ﺷﻮد.
اﺷﻴﺎ و ﺳﺎﺧﺘﺎرﻫﺎ: ﺑﺎ ﻧﺤﻮه ﻛﺎر ﺑﺎ ﺳﺎﺧﺘﺎرﻫﺎ در ﻓﺼﻞ ﭘﻨﺠﻢ آﺷﻨﺎ ﺷﺪﻳﺪ .ﺳﺎﺧﺘﺎرﻫﺎ ﻧﻴﺰ ﻫﻤﺎﻧﻨﺪ ﻛﻼﺳﻬﺎ راﻫﻲ را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﺑﺘﻮاﻧﻴـﺪ ﭼﻨـﺪﻳﻦ ﻗﻄﻌـﻪ از اﻃﻼﻋﺎت ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ را در ﻳﻚ ﮔﺮوه ﻗﺮار دﻫﻴﺪ .ﻳﻚ ﺳﺎﺧﺘﺎر ﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﻛﻼس ،ﻋﻼوه ﺑﺮ ﻓﻴﻠﺪ ﺷﺎﻣﻞ ﺧﺎﺻـﻴﺖ و ﻣﺘـﺪ ﻧﻴﺰ ﺑﺎﺷﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎ ﺑﻌﻀﻲ از ﺗﻔﺎوﺗﻬﺎي ﻛﻼﺳﻬﺎ و ﺳﺎﺧﺘﺎرﻫﺎ آﺷﻨﺎ ﻣﻲ ﺷﻮﻳﻢ. 2 در اﺻﻄﻼح ﻛﺎﻣﭙﻴﻮﺗﺮي ،ﺳﺎﺧﺘﺎرﻫﺎ ﺑﻪ ﻋﻨﻮان ﻧﻮع ﻫﺎي ﻣﻘﺪاري 1و ﻛﻼﺳﻬﺎ ﺑﻪ ﻋﻨﻮان ﻧﻮع ﻫﺎي ارﺟﺎﻋﻲ ﺷﻨﺎﺧﺘﻪ ﻣـﻲ ﺷـﻮﻧﺪ .ﻫـﺮ ﻣﺘﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد ،ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣﻲ ﻛﻨﺪ و ﻣﺘﻐﻴﻴﺮ ﻫﺎﻳﻲ ﻛﻪ در ﻃﻮل ﻛﺎر ﺧﻮد ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز دارد را در اﻳـﻦ ﻗﺴﻤﺖ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ و ﻣﻌﻤﻮﻻً ﺑﻌﺪ از اﺟﺮاي ﺗﺎﺑﻊ ،اﻳﻦ ﻗﺴﻤﺖ از ﺣﺎﻓﻈﻪ ﻧﻴﺰ آزاد ﻣﻲ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ ﭘﺎراﻣﺘﺮﻫﺎﻳﻲ ﻛﻪ ﺑﻪ آن ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮﻧﺪ ﻧﻴﺰ در ﺣﻘﻴﻘﺖ در اﻳﻦ ﻗﺴﻤﺖ از ﺣﺎﻓﻈﻪ ﻛﭙﻲ ﻣﻲ ﺷﻮﻧﺪ ﺗﺎ ﻣﺘﺪ ﺑﺘﻮاﻧﺪ از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﺪ. ﺳﺎﺧﺘﺎرﻫﺎ ﻣﻌﻤﻮﻻً اﻧﺪازه ﻫﺎي ﻛﻮﭼﻜﻲ دارﻧﺪ ،ﺑﺮاي ﻣﺜﺎل ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﻣﺘﻐﻴﺮ از ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ و ﻳﺎ ﭼﻨﺪ رﺷﺘﻪ ﻫﺴﺘﻨﺪ ﻛﻪ ﻣﻘﺪار ﻛﻤﻲ از ﻓﻀﺎي ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣﻲ ﻛﻨﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ راﺣﺘﻲ آﻧﻬﺎ را ﺑﻪ ﻓﻀﺎي ﻣﺨﺼﻮص ﻳﻚ ﺗﺎﺑﻊ اﻧﺘﻘﺎل دﻫﺪ ﺗﺎ ﺗﺎﺑﻊ ﺑﺘﻮاﻧﺪ از آن اﺳﺘﻔﺎده ﻛﻨﺪ .اﻣﺎ ﻛﻼﺳﻬﺎ ﺑﺴﻴﺎر ﺑﺰرﮔﺘﺮ از ﺳﺎﺧﺘﺎرﻫﺎ ﻫﺴﺘﻨﺪ .ﻳﻚ ﻛﻼس ﻣﻌﻤﻮﻻً ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﻋﻀﻮ از ﻛﻼﺳﻬﺎي دﻳﮕـﺮ اﺳـﺖ .ﺑـﺮاي ﻣﺜﺎل ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم Controlدر ﭼﺎرﭼﻮب .NETوﺟﻮد دارد ﻛﻪ ﺗﻤﺎم ﻛﻨﺘﺮﻟﻬﺎي ﻣﻮرد اﺳﺘﻔﺎده از آن ﻣـﺸﺘﻖ ﻣـﻲ ﺷـﻮﻧﺪ .اﻳـﻦ ﻛﻼس ﺷﺎﻣﻞ 205ﻓﻴﻠﺪ )ﻛﻪ ﺑﺴﻴﺎري از آﻧﻬﺎ ﺷﺎﻣﻞ ﺷﻴﺊ اي از ﻳﻚ ﻛﻼس دﻳﮕﺮ ﻫـﺴﺘﻨﺪ( 7 ،ﻣﺘـﺪ ﺳـﺎزﻧﺪه 163 ،ﺧﺎﺻـﻴﺖ و 524ﻣﺘـﺪ اﺳﺖ .ﻣﺴﻠﻢ اﺳﺖ ﻛﻪ ﻓﻀﺎﻳﻲ ﻛﻪ ﭼﻨﻴﻦ ﻛﻼﺳﻲ از ﺣﺎﻓﻈﻪ اﺷﻐﺎل ﻣﻲ ﻛﻨﺪ ﺑﺴﻴﺎر ﺑﻴﺸﺘﺮ از ﻳﻚ ﺳـﺎﺧﺘﺎر اﺳـﺖ و ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻧﻤـﻲ ﺗﻮاﻧـﺪ در ﺻﻮرت ﻟﺰوم آن را ﺑﻪ راﺣﺘﻲ ﺑﻪ ﻓﻀﺎي ﻣﺨﺼﻮص ﺑﻪ ﻳﻚ ﺗﺎﺑﻊ اﻧﺘﻘﺎل دﻫﺪ .ﺑﺮاي ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ از آدرس ﻛﻼﺳﻬﺎ در ﺣﺎﻓﻈـﻪ اﺳـﺘﻔﺎده
Value Type Reference Type
1 2
٣٦٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﻲ ﻛﻨﻨﺪ .ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻛﻪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﺷﻴﺊ ﺑﺮاي ﻣﺮﺗﺒﻪ اول در ﻗﺴﻤﺘﻲ از ﺣﺎﻓﻈﻪ اﻳﺠﺎد ﻣﻲ ﺷﻮد ،اﮔﺮ ﺑﺨﻮاﻫﻴﻢ آن را ﺑﻪ ﻳﻚ ﺗـﺎﺑﻊ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ اﻧﺘﻘﺎل دﻫﻴﻢ ﻛﻞ ﺷﻴﺊ را ﻣﺠﺪداً در ﻓﻀﺎي ﻣﺨﺼﻮص ﺗﺎﺑﻊ ﻛﭙﻲ ﻧﻤﻲ ﻛﻨﻴﻢ ،ﺑﻠﻜﻪ آدرس ﻛﻨﻮﻧﻲ ﺷـﻴﺊ را در ﺣﺎﻓﻈـﻪ ﺑـﻪ ﺗﺎﺑﻊ ﻣﻲ ﻓﺮﺳﺘﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺗﺎﺑﻊ در ﺻﻮرت ﻧﻴﺎز ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ اﺳﺘﻔﺎده از آدرس ﺷﻴﺊ ،ﺑﻪ آن دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ در ﺻﻮرت ﻧﻴﺎز ﺑﻪ اﻧﺘﻘﺎل ﺳﺎﺧﺘﺎرﻫﺎ ﻣﻘﺪار آﻧﻬﺎ ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد ،ﺑﻪ آﻧﻬﺎ ﻧﻮع ﻫﺎي ﻣﻘﺪاري و ﺑﺮاي اﻳﻨﻜﻪ در ﺻـﻮرت ﻧﻴﺎز ﺑﻪ اﻧﺘﻘﺎل ﻛﻼﺳﻬﺎ ﻓﻘﻂ آدرس ﻗﺮارﮔﻴﺮي آﻧﻬﺎ در ﺣﺎﻓﻈﻪ ﻣﻨﺘﻘﻞ ﻣﻲ ﺷﻮد ،ﺑﻪ ﻛﻼﺳﻬﺎ ﻧﻮع ﻫﺎي ارﺟﺎﻋﻲ ﻣﻲ ﮔﻮﻳﻨﺪ. در ﻗﺴﻤﺘﻬﺎي ﻗﺒﻠﻲ ﮔﻔﺘﻢ ﻛﻪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﻣﻲ ﺗﻮاﻧﺪ داراي ﭼﻨﺪﻳﻦ ﻧﺎم ﺑﺎﺷﺪ )ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ از ﭼﻨﺪﻳﻦ ﻗﻼب آوﻳﺰان ﺷﻮد( .دﻟﻴـﻞ اﻳﻦ ﻣﻮرد اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﻣﺘﻐﻴﺮ ﻛﻪ ﺑﺮاي ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ در واﻗﻊ ﻣﺤﺘﻮي ﺧﻮد ﺷﻴﺊ ﻧﻴﺴﺖ ،ﺑﻠﻜﻪ ﻣﺤﺘﻮي آدرس ﻗﺮارﮔﻴﺮي آن ﺷﻴﺊ در ﺣﺎﻓﻈﻪ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﻢ ﭼﻨﺪﻳﻦ ﻣﺘﻐﻴﺮ ﺑﺎ ﻧﺎﻣﻬﺎي ﻣﺘﻔﺎوت ﺗﻌﺮﻳـﻒ ﻛﻨـﻴﻢ و آدرس ﺷـﻴﺊ را در آﻧﻬـﺎ ﻗـﺮار دﻫﻴﻢ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺷﻴﺊ از ﻫﺮ ﻛﺪام از اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻫﻤﭽﻨﻴﻦ اﮔﺮ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻜﻲ از اﻳﻦ ﻣﺘﻐﻴﻴﺮ ﻫﺎ ﺷﻴﺊ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﺷﻴﺊ ﻣﻮردﻧﻈﺮ ﺑﺮاي ﺗﻤﺎم ﻣﺘﻐﻴﻴﺮ ﻫﺎي دﻳﮕﺮ ﻧﻴﺰ ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ. ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎم ﺗﺼﻤﻴﻢ ﮔﻴﺮي ﺑﻴﻦ ﺳﺎﺧﺘﺎر و ﻛﻼس ﻫﻤﻮاره در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ اﮔﺮ اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴـﺪ در ﻳـﻚ ﮔـﺮوه ﻗـﺮار دﻫﻴﺪ ﻛﻮﭼﻚ ﺑﻮدﻧﺪ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ از ﺳﺎﺧﺘﺎرﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎ ﺑﻬﺘﺮ از اﺳـﺘﻔﺎده از ﺳـﺎﺧﺘﺎرﻫﺎ اﺳـﺖ. اﻟﺒﺘﻪ ﻛﻼﺳﻲ ﻛﻪ در ﺑﺎﻻ ﻣﺜﺎل زدﻳﻢ ﻧﻴﺰ ﻛﻼس ﺑﺴﻴﺎر ﺑﺰرﮔﻲ اﺳﺖ و ﺣﺘﻤﺎً ﻧﺒﺎﻳﺪ ﺣﺠﻢ اﻃﻼﻋﺎت ﺑﻪ اﻳﻦ اﻧﺪازه ﺑﺎﺷﺪ ﺗﺎ از ﻛـﻼس اﺳـﺘﻔﺎده ﻛﻨﻴﺪ. ﻫﻤﭽﻨﻴﻦ ﻳﻜﻲ دﻳﮕﺮ از ﺗﻔﺎوﺗﻬﺎي ﺳﺎﺧﺘﺎرﻫﺎ ﺑﺎ ﻛﻼﺳﻬﺎ در اﻳﻦ اﺳﺖ ﻛﻪ ﺳﺎﺧﺘﺎرﻫﺎ داراي ﻣﺒﺤﺚ وراﺛﺖ ﻧﻴﺴﺘﻨﺪ.
ﻛﻼﺳﻬﺎي ﭼﺎرﭼﻮب :.NET اﮔﺮﭼﻪ ﭼﺎرﭼﻮب .NETرا در ﻓﺼﻞ دوم ﺑﻪ ﻃﻮر ﻛﻠﻲ ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ ،در اﻳﻦ ﻗﺴﻤﺖ ﺳﻌﻲ ﻣﻲ ﻛﻨـﻴﻢ ﺑـﻪ ﻗـﺴﻤﺘﻬﺎﻳﻲ از ﺳـﺎﺧﺘﺎر اﻳـﻦ ﭼﺎرﭼﻮب ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ در ﻃﺮاﺣﻲ ﻛﻼﺳﻬﺎ ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻛﻨﺪ ﻧﮕﺎﻫﻲ ﺑﻴﻨﺪازﻳﻢ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﻗﺴﻤﺖ ﻓـﻀﺎي ﻧﺎﻣﻬـﺎ و ﻧﺤـﻮه اﻳﺠـﺎد و اﺳﺘﻔﺎده از آﻧﻬﺎ در ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
ﻓﻀﺎي ﻧﺎم: ﻳﻜﻲ از ﻗﺴﻤﺘﻬﺎي ﻣﻬﻢ ﭼﺎرﭼﻮب ،.NETﻛﻠﻜﺴﻴﻮن ﻋﻈﻴﻢ ﻛﻼﺳﻬﺎي آن اﺳﺖ .در ﭼﺎرﭼﻮب .NETﺣﺪود 3500ﻛﻼس در راﺑﻄﻪ ﺑﺎ ﻣﻮارد ﻣﺨﺘﻠﻒ وﺟﻮد دارد ،اﻣﺎ ﺳﻮال اﻳﻦ اﺳﺖ ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛـﻼس ﻣـﻮرد ﻧﻈﺮﺗـﺎن را در ﺑـﻴﻦ اﻳـﻦ ﻛﻼﺳﻬﺎ ﭘﻴﺪا ﻛﻨﻴﺪ؟ 1 ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﭼﺎرﭼﻮب .NETﺑﻪ ﭼﻨﺪﻳﻦ ﮔﺮوه ﻣﺨﺘﻠﻒ ﺑﻪ ﻧﺎم ﻓﻀﺎي ﻧﺎم ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮد ﻛﻪ ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﺣﺎوي ﭼﻨﺪﻳﻦ ﻛﻼس ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ اﺳﺖ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﮔﺮ ﺑﻪ دﻧﺒﺎل ﻛﻼﺳﻲ ﺑﺮاي ﻳﻚ ﻛﺎر ﺧﺎص ﺑﺎﺷﻴﺪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻓﻘﻂ ﻛﻼﺳﻬﺎي داﺧﻞ ﻓﻀﺎي ﻧـﺎم ﻣﺮﺑﻮط ﺑﻪ آن ﻛﺎر را ﺟﺴﺘﺠﻮ ﻛﻨﻴﺪ. ﺧﻮد اﻳﻦ ﻓﻀﺎي ﻧﺎﻣﻬﺎ ﻧﻴﺰ ﺑﻪ ﺻﻮرت ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺒﻲ ﻫﺴﺘﻨﺪ ،ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻛﻪ ﻳﻚ ﻓﻀﺎي ﻧﺎم ﺧﻮد ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﻓﻀﺎي ﻧﺎم دﻳﮕﺮ ﺑﺎﺷﺪ ،ﻛﻪ آﻧﻬﺎ ﻧﻴﺰ ﺑﻪ ﻧﻮﺑﻪ ﺧﻮد ﻛﻼﺳﻬﺎي داﺧﻞ آن ﻓﻀﺎي ﻧﺎم را دﺳﺘﻪ ﺑﻨﺪي ﻣﻲ ﻛﻨﻨﺪ. ﺑﻴﺸﺘﺮ ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در ﭼﺎرﭼﻮب .NETدر ﻓﻀﺎي ﻧﺎم Systemو ﻳﺎ ﻓﻀﺎي ﻧﺎﻣﻬﺎي ﻣﻮﺟﻮد در آن دﺳﺘﻪ ﺑﻨﺪي ﺷﺪه اﻧﺪ .ﺑﺮاي ﻣﺜﺎل:
NameSpace
1
٣٧٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
System.Dataﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ذﺧﻴﺮه ﺷﺪه در ﻳﻚ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﺳﺖ. System.Xmlﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﺧﻮاﻧﺪن و ﻧﻮﺷﺘﻦ ﺳﻨﺪﻫﺎي XMLاﺳﺖ. System.Windows.Formsﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﺗﺮﺳﻴﻢ ﻳﻚ ﻓﺮم و ﻛﻨﺘﺮﻟﻬﺎي آن روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ اﺳﺖ. System.Netﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي اﻳﺠﺎد ارﺗﺒﺎﻃﺎت ﺷﺒﻜﻪ اي در ﺑﺮﻧﺎﻣﻪ اﺳﺖ.
ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻛﻼس در ﻳﻚ ﻓﻀﺎي ﻧﺎم ﻗﺮار ﻣﻲ ﮔﻴﺮد ،ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ آن ﻋﻼوه ﺑﺮ ذﻛﺮ ﻧﺎم ﻛﻼس ،ﺑﺎﻳـﺪ ﻓـﻀﺎي ﻧـﺎم آن را ﻧﻴـﺰ ﻣﺸﺨﺺ ﻛﻨﻴﻢ .اﻟﺒﺘﻪ ﺗﺎﻛﻨﻮن در ﺑﺮﻧﺎﻣﻪ ﻫﺎ از ﻧﺎم ﻛﻮﺗﺎه ﺷﺪه آﻧﻬﺎ ،ﻳﻌﻨﻲ ﻓﻘﻂ ﻧﺎم ﺧﻮد ﻛﻼس اﺳﺘﻔﺎده ﻛﺮده و ﻓﻀﺎي ﻧـﺎم آن را ﻣـﺸﺨﺺ ﻧﻤﻲ ﻛﺮدﻳﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ وﻗﺘﻲ ﮔﻔﺘﻴﻢ ﻛﻪ ﺗﻤﺎم ﻛﻼﺳﻬﺎ از ﻛﻼس Objectﻣﺸﺘﻖ ﻣـﻲ ﺷـﻮﻧﺪ ،در ﺣﻘﻴﻘـﺖ ﻧـﺎم ﻛﻼس را ﺧﻼﺻـﻪ ﻛـﺮدﻳﻢ .زﻳـﺮا ﻛـﻼس Objectدر ﻓـﻀﺎي ﻧـﺎم Systemﻗـﺮار دارد و ﻫﻤـﻪ ﻛﻼﺳـﻬﺎ در واﻗـﻊ از ﻛـﻼس System.Objectﻣــﺸﺘﻖ ﻣــﻲ ﺷــﻮﻧﺪ .ﻫﻤﭽﻨــﻴﻦ ﻛــﻼس Consoleدر واﻗــﻊ ﻧــﺎم ﺧﻼﺻــﻪ ﺷــﺪه ﻛــﻼس System.Consoleاﺳﺖ و ﻛﺪ زﻳﺮ: ;)(Console.ReadLine ﺑﺎ ﻛﺪ زﻳﺮ ﻣﻌﺎدل اﺳﺖ: ;)(System.Console.ReadLine ﻫﺮ ﻛﻼس ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻳﻚ ﻓﻀﺎي ﻧﺎم ﺗﻌﻠﻖ داﺷﺘﻪ ﺑﺎﺷﺪ و ﻫﻤﭽﻨﻴﻦ ﻧﻤﻲ ﺗﻮاﻧﺪ ﻋﻀﻮ ﻫﻴﭻ ﻓﻀﺎي ﻧﺎﻣﻲ ﻧﺒﺎﺷﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻫـﺮ ﻛﻼس ﺑﺎﻳﺪ دﻗﻴﻘﺎً در ﻳﻚ ﻓﻀﺎي ﻧﺎم ﻗﺮار داﺷﺘﻪ ﺑﺎﺷﺪ .اﻣﺎ ﺳﻮال اﻳﻦ اﺳﺖ ﻛﻪ ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﻣﻲ ﻧﻮﺷﺘﻴﻢ ﻋﻀﻮ ﭼﻪ ﻓﻀﺎي ﻧﺎﻣﻲ ﺑﻮدﻧﺪ؟ ﺧﻮب ،اﮔﺮ ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﻧﮕﺎه دﻗﻴﻘﺘﺮي ﺑﻴﺎﻧﺪازﻳﺪ ،ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ در ﺑﺎﻻﺗﺮﻳﻦ ﻗﺴﻤﺖ ﻛﺪ ،ﺑﻼﻛﻲ وﺟﻮد دارد ﻛﻪ ﺑﺎ ﻛﻠﻤﻪ ﻛﻠﻴﺪي namespaceﺷﺮوع ﻣﻲ ﺷﻮد و در ﻣﻘﺎﺑﻞ آن ﻧﺎم ﭘﺮوژه وارد ﺷﺪه اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﻛﻼس ﻫـﺎﻳﻲ ﻛـﻪ در اﻳـﻦ ﻓـﺼﻞ در ﭘﺮوژه Objectsاﻳﺠﺎد ﻛﺮدﻳﻢ ،ﻫﻤﮕﻲ درون ﺑﻼﻛﻲ ﺑﻪ ﺻﻮرت زﻳﺮ ﻗﺮار ﮔﺮﻓﺘﻪ ﺑﻮدﻧﺪ: namespace Objects { … } ﺑﻨــﺎﺑﺮاﻳﻦ ﻧــﺎم اﺻــﻠﻲ ﻛــﻼس Carﺑــﻪ ﺻــﻮرت Objects.Carو ﻧــﺎم اﺻــﻠﻲ ﻛــﻼس SportsCarﺑــﻪ ﺻــﻮرت Objects.SportsCarﺑﻮده اﺳﺖ. ﻫﺪف اﺻﻠﻲ اﻳﺠﺎد ﻓﻀﺎﻫﺎي ﻧﺎم در .NETﺳﺎده ﺗﺮ ﻛﺮدن اﺳﺘﻔﺎده از ﻛﻼﺳﻬﺎ ﺑﺮاي ﻛﺎرﺑﺮان آﻧﻬﺎ اﺳﺖ .ﻓﺮض ﻛﻨﻴﺪ ﻛﻼﺳـﻬﺎي ﺧـﻮد را ﺑﻌﺪ از ﺗﻜﻤﻴﻞ ﺷﺪن در اﺧﺘﻴﺎر ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ دﻳﮕﺮي ﻗﺮار دﻫﻴﺪ ﺗﺎ از آﻧﻬﺎ در ﺑﺮﻧﺎﻣﻪ ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﺪ .اﮔﺮ او ﻧﻴﺰ در ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد ﻛﻼﺳـﻲ ﺑﻪ ﻧﺎم Carاﻳﺠﺎد ﻛﺮده ﺑﻮد ،ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻴﻦ اﻳﻦ دو ﻛﻼس ﺗﻔﺎوت ﻗﺎﺋﻞ ﺷﻮد؟ ﺧﻮب ،ﻧﺎم واﻗﻌﻲ ﻛﻼس ﺷﻤﺎ در ﺣﻘﻴﻘﺖ ﺑﺮاﺑﺮ ﺑـﺎ Objects.Carاﺳـﺖ و ﻧـﺎم ﻛـﻼس او ﻧﻴـﺰ ﻣـﻲ ﺗﻮاﻧـﺪ ﻫـﺮ ﭼﻴـﺰي ﻣﺎﻧﻨـﺪ MyOwnNameSpace.Carﺑﺎﺷﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ اﺣﺘﻤﺎل اﺷﺘﺒﺎه ﺷﺪن اﻳﻦ دو ﻛﻼس ﺑﺎ ﻳﻜﺪﻳﮕﺮ از ﺑﻴﻦ ﻣﻲ رود.
٣٧١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :اﻟﺒﺘﻪ دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻧﺎم Objectsﻛﻪ ﺑﺮاي ﻓﻀﺎي ﻧﺎم اﻳﻦ ﭘﺮوژه اﻧﺘﺨﺎب ﻛﺮدﻳﻢ ،اﺻﻼً ﻧـﺎم ﻣﻨﺎﺳـﺒﻲ ﺑـﺮاي ﻳـﻚ دﺳـﺘﻪ از ﻛﻼﺳﻬﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻫﻢ ﻧﻴﺴﺖ ،زﻳﺮا ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻧﻤﻲ ﺗﻮان ﻫﻴﭻ اﻃﻼﻋﺎﺗﻲ راﺟﻊ ﺑﻪ ﻛﻼﺳﻬﺎي داﺧﻞ اﻳﻦ ﻓﻀﺎي ﻧـﺎم ﺑﺪﺳـﺖ آورد .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ اﻳﻦ ﻧﺎم را اﻧﺘﺨﺎب ﻛﺮدﻳﻢ ﻛﻪ ﻣﺸﺨﺺ ﻛﻨﻨﺪه ﺑﺮﻧﺎﻣﻪ ﻫﺎي اﻳﻦ ﻓﺼﻞ ﺑﺎﺷﺪ. ﺑﺮاي آﺷﻨﺎﻳﻲ ﺑﻴﺸﺘﺮ ﺑﺎ ﻓﻀﺎي ﻧﺎﻣﻬﺎي ﻣﻮﺟﻮد در .NETﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺿﻤﻴﻤﻪ ي 2ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ.
راﻫﻨﻤﺎي :using ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﻫﻔﺘﻢ ﮔﻔﺘﻢ ،ﺑﺮاي اﺳﺘﻔﺎده از ﻳﻚ ﻛﻼس ﺑﺪون ذﻛﺮ ﻓﻀﺎي ﻧﺎم آن ،ﺑﺎﻳﺪ ﻓﻀﺎي ﻧـﺎم آن ﻛـﻼس را ﺑـﺎ اﺳـﺘﻔﺎده از راﻫﻨﻤﺎي 1usingﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﻢ .اﻫﻤﻴﺖ اﺳﺘﻔﺎده از اﻳﻦ راﻫﻨﻤﺎ ﻣﻤﻜﻦ اﺳﺖ ﻫﻨﮕﺎﻣﻲ ﻛﻪ در ﺣﺎل ﻛﺎر ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛﻮﭼـﻚ ﻫــﺴﺘﻴﺪ ،ﻧﻤﺎﻳــﺎن ﻧــﺸﻮد ،اﻣــﺎ ﻓــﺮض ﻛﻨﻴــﺪ ﺑﺨﻮاﻫﻴــﺪ ﺑــﻪ ﻛﻼﺳــﻲ ﻣﺎﻧﻨــﺪ ServiceDescriptionدر ﻓــﻀﺎي ﻧــﺎم System.Web.Services.Descriptionدﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻴﺪ .واﺿﺢ اﺳﺖ ﻛﻪ ذﻛﺮ اﺳﻢ ﻛـﻼس و ﻓـﻀﺎي ﻧﺎم آن در ﻫﺮ ﺑﺎر اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼس ﻛﺎر ﺑﺴﻴﺎر ﺳﺨﺘﻲ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن ﻓﻀﺎي ﻧﺎم آن ،ﻫﺮ ﻣﺮﺗﺒﻪ ﻓﻘﻂ ﻧﺎم ﻛﻼس را ذﻛﺮ ﻛﻨﻴﺪ. ﺗﻤﺎم ﻓﻀﺎي ﻧﺎﻣﻬﺎﻳﻲ ﻛﻪ ﻣـﻲ ﺧﻮاﻫﻴـﺪ ﺑـﻪ ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ ،ﺑﺎﻳـﺪ در اﺑﺘـﺪاي ﻛـﺪ و ﻗﺒـﻞ از ﻫـﺮ دﺳـﺘﻮري )ﻗﺒـﻞ از دﺳـﺘﻮر namespaceﻛﻪ ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻓﻀﺎي ﻧﺎم ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﺎر ﻣﻲ رود( ،ﺑﺎ اﺳﺘﻔﺎده از usingﻣﺸﺨﺺ ﺷﻮﻧﺪ. ﺗﻨﻬﺎ ﻣﺸﻜﻠﻲ ﻛﻪ ﻫﻨﮕﺎم اﺳﺘﻔﺎده از اﻳﻦ راﻫﻨﻤﺎ ﻣﻤﻜﻦ اﺳﺖ رخ دﻫـﺪ اﻳـﻦ اﺳـﺖ ﻛـﻪ در دو ﻓـﻀﺎي ﻧـﺎﻣﻲ ﻛـﻪ ﺑـﺎ اﺳـﺘﻔﺎده از راﻫﻨﻤـﺎي usingﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﺪ دو ﻛﻼس ﻫﻢ ﻧﺎم وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل ﻓـﺮض ﻛﻨﻴـﺪ دو ﻓـﻀﺎي ﻧـﺎم Objectsو MyOwnNameSpaceﻛﻪ ﻫﺮ دو داراي ﻛﻼس Carﻫﺴﺘﻨﺪ را ﺑﺎ اﺳﺘﻔﺎده از راﻫﻨﻤﺎي usingﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ .در اﻳﻦ ﺻﻮرت ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼس در ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ ﻧﺎم ﻛﺎﻣﻞ آن را ﻣﺸﺨﺺ ﻛﻨﻴﺪ )ﺑﺮاي ﻣﺜﺎل .(Objects.Car ﻳﻜﻲ از اﺑﺰارﻫﺎي ﺧﻮب وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﺮاي ﻣﺸﺎﻫﺪه ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺿﺎﻓﻪ ﺷـﺪه اﻧـﺪObject Browser ، اﺳﺖ .ﺑﺮاي ﻧﻤﺎﻳﺶ اﻳﻦ اﺑﺰار ﻣﻲ ﺗﻮاﻧﻴﺪ از ﮔﺰﻳﻨﻪ View Object Browserدر ﻧﻮار ﻣﻨﻮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ )ﺷـﻜﻞ -9 (13
– using directive 1ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ اﻳﻦ ﻛﺎرﺑﺮد اﻳﻦ ﻛﻠﻤﻪ در اﻳﻦ ﺣﺎﻟﺖ ﺑﺎ ﻛﺎرﺑﺮد آن در ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻋﻨﻮان دﺳﺘﻮر usingﻣﺘﻔﺎوت اﺳﺖ .ﻛـﺎرﺑﺮد دﺳﺘﻮر usingدر ﻓﺼﻠﻬﺎي ﺑﻌﺪي ﺗﻮﺿﻴﺢ داده ﺧﻮاﻫﺪ ﺷﺪ.
٣٧٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 13-9 ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در اﻳﻦ ﭘﻨﺠﺮه ﻋﻼوه ﺑﺮ ﻛﻼﺳﻬﺎ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺘﺪﻫﺎ ،ﻓﻴﻠﺪ ﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي ﻣﻮﺟﻮد در ﻳـﻚ ﻛـﻼس را ﻧﻴـﺰ ﻣـﺸﺎﻫﺪه ﻛﻨﻴـﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻼس Carدر ﻓﻀﺎي ﻧﺎﻣﻲ ﻛﻪ ﺑﺮاﺑﺮ ﺑﺎ ﻧﺎم ﭘﺮوژه اﺳﺖ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳـﺖ )ﻓـﻀﺎي ﻧﺎﻣﻬـﺎ در ﺷﻜﻞ ﺑﺎ ﻋﻼﻣﺖ }{ ﻣﺸﺨﺺ ﺷﺪه اﻧﺪ( و ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﻛﻼس از ﻛﻼس Objectﻣﺸﺘﻖ ﺷﺪه اﺳﺖ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻛﻼس Carﻫﻴﭻ ﻛﻼس ﭘﺎﻳﻪ اي ﺑﺮاي آن ﻣﺸﺨﺺ ﻧﻜﺮدﻳﺪ ،اﻣﺎ اﻳﻦ ﻛﻼس ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ از ﻛﻼس Objectﻣﺸﺘﻖ ﺷﺪه اﺳﺖ.
وراﺛﺖ در ﭼﺎرﭼﻮب :.NET ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ وراﺛﺖ ﻳﻜﻲ از ﻣﺒﺎﺣﺚ ﭘﻴﺸﺮﻓﺘﻪ و ﻣﻬﻢ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا ﺑﻪ ﺷﻤﺎر ﻣﻲ رود .در اﻳﻦ ﻓﺼﻞ ﺑﻪ ﺻﻮرﺗﻲ اﺟﻤـﺎﻟﻲ ﺑﺎ اﻳﻦ ﻣﺒﺤﺚ آﺷﻨﺎ ﺷﺪﻳﻢ ،اﻣﺎ در ﭼﺎرﭼﻮب .NETﺑﻪ ﺷﺪت از وراﺛﺖ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻬﺘﺮ اﺳﺖ ﭼﻨﺪ ﻧﻜﺘﻪ اﺳﺎﺳﻲ دﻳﮕـﺮ را ﻧﻴﺰ در اﻳﻦ راﺑﻄﻪ ذﻛﺮ ﻛﻨﻴﻢ. ﻳﻜﻲ از ﻣﻮاردي ﻛﻪ ﺑﺎﻳﺪ در اﻳﻦ راﺑﻄﻪ ﺑﺪاﻧﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ در .NETﻫﻴﭻ ﻛﻼﺳﻲ ﻧﻤﻲ ﺗﻮاﻧـﺪ ﺑـﻪ ﺻـﻮرت ﻣـﺴﺘﻘﻴﻢ از ﺑـﻴﺶ از ﻳـﻚ ﻛﻼس ﻣﺸﺘﻖ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ ذﻛﺮ ﺷﺪ ﻛﻪ اﮔﺮ ﺑﺮاي ﻳﻚ ﻛﻼس ،ﻛﻼس ﭘﺎﻳﻪ ﻣﺸﺨﺺ ﻧﺸﻮد آن ﻛﻼس ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ از ﻛـﻼس Objectﻣﺸﺘﻖ ﻣﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻲ ﺗﻮاﻧﻴﻢ از اﻳﻦ دو ﮔﻔﺘﻪ ﻧﺘﻴﺠﻪ ﺑﮕﻴﺮﻳﻢ ﻛﻪ در .NETﻫﺮ ﻛﻼس ﺑﺎﻳﺪ از دﻗﻴﻘﺎً ﻳـﻚ ﻛـﻼس ﻣﺸﺘﻖ ﺷﻮد. اﻟﺒﺘﻪ اﻳﻨﻜﻪ ﻣﻲ ﮔﻮﻳﻴﻢ ﻫﺮ ﻛﻼس ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﺪ از ﻳﻚ ﻛﻼس ﻣﺸﺘﻖ ﺷﻮد ،ﻣﻨﻈﻮر ﻣﺸﺘﻖ ﺷﺪن ﻣﺴﺘﻘﻴﻢ اﺳـﺖ ﻧـﻪ ﻣـﺸﺘﻖ ﺷـﺪن ﻏﻴـﺮ ﻣﺴﺘﻘﻴﻢ .ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم Porscheاﻳﺠﺎد ﻛﻨﻴﺪ ﻛﻪ از ﻛﻼس SportsCarﻣـﺸﺘﻖ ﺷﻮد .اﻳﻦ ﻛﻼس ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ از ﻓﻘﻂ ﻳﻚ ﻛﻼس ﺑﻪ ﻧﺎم SportsCarو ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﻣﺴﺘﻘﻴﻢ از ﻛﻼس Carﻣـﺸﺘﻖ ﺷﺪه اﺳﺖ.
ﻧﺘﻴﺠﻪ: در اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻣﻔﺎﻫﻴﻢ اﺑﺘﺪاﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا آﺷﻨﺎ ﺷﺪﻳﻢ .ﻓﺼﻞ را ﺑﺎ آﻣﻮﺧﺘﻦ اﻳﻨﻜﻪ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﻳﻚ ﻛﻼس ﺑـﺎ ﻣﺘـﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﮔﻮﻧﺎﮔﻮن اﻳﺠﺎد ﻛﺮد ﺷﺮوع ﻛﺮدﻳﻢ و ﺳﭙﺲ ﻳﻚ ﻛﻼس ﺑﺮاي ﻣﺪل ﻛﺮدن ﻳـﻚ اﺗﻮﻣﺒﻴـﻞ اﻳﺠـﺎد ﻛـﺮدﻳﻢ .ﺳـﭙﺲ ﻣﺘـﺪﻫﺎ و ﺧﺎﺻﻴﺘﻬﺎي دﻳﮕﺮي ﺑﻪ اﻳﻦ ﻛﻼس اﺿﺎﻓﻪ ﻛﺮدﻳﻢ و آن را در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﺎر ﺑﺮدﻳﻢ. ﻗﺒﻞ از اﻳﻨﻜﻪ وارد ﺑﺤﺚ وراﺛﺖ ﺷﻮﻳﻢ ،ﺑﺎ ﺑﺤﺚ ﻣﺘﺪﻫﺎي ﺳﺎزﻧﺪه و ﻧﺤﻮه ﻛﺎرﺑﺮد آﻧﻬﺎ آﺷـﻨﺎ ﺷـﺪﻳﻢ .ﺳـﭙﺲ در ﻣﺒﺤـﺚ وراﺛـﺖ ﺗﻌـﺪادي از ﻣﺒﺎﺣﺚ ﻣﻬﻢ ﻃﺮاﺣﻲ ﺷﻴﺊ ﮔﺮا از ﻗﺒﻴﻞ ﭼﻨﺪ ﺷﻜﻠﻲ ﺑﻮدن و overrideﻛﺮدن را ﻧﻴﺰ ﺑﺮرﺳﻲ ﻛﺮدﻳﻢ. در ﭘﺎﻳﺎن اﻳﻦ ﻓﺼﻞ ﺑﺎﻳﺪ ﺑﺎ ﻣﻮارد زﻳﺮ آﺷﻨﺎ ﺷﺪه ﺑﺎﺷﻴﺪ:
اﻳﺠﺎد ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﺨﺘﻠﻒ در ﻳﻚ ﻛﻼس. اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﺑﺮاي ﻛﻼس ﺗﺎ ﺷﺮاﻳﻂ اوﻟﻴﻪ اﺷﻴﺎي ﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪه از آن ﻛﻼس را ﺗﻨﻈﻴﻢ ﻛﻨﺪ. اﻳﺠﺎد ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ از ﻛﻼس دﻳﮕﺮي ﻣﺸﺘﻖ ﺷﻮﻧﺪ. Overrideﻛﺮدن ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﻛﻼس ﭘﺎﻳﻪ در ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه. ﻣﻔﻬﻮم و ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از ﻓﻀﺎي ﻧﺎم.
٣٧٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
٣٧٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺼﻞ دﻫﻢ :ﻣﺒﺎﺣﺚ ﭘﻴﺸﺮﻓﺘﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻴﺊ ﮔﺮا در ﻓﺼﻞ ﻧﻬﻢ ﺑﺎ ﻣﻘﺪﻣﺎت ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد اﺷﻴﺎ و ﻧﺤﻮه ﻃﺮاﺣﻲ ﻳﻚ ﻛﻼس آﺷﻨﺎ ﺷﺪﻳﺪ .ﻗﺒﻞ از آن ﻓﺼﻞ ،از ﻛﻼﺳﻬﺎي زﻳﺎدي در ﭼﺎرﭼﻮب .NETﺑﺮاي اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﺪ .اﻣﺎ ﺑﺎ اﻃﻼﻋﺎﺗﻲ ﻛﻪ در ﻓﺼﻞ ﻗﺒﻞ ﺑﺪﺳﺖ آوردﻳﻢ ﻧﻤـﻲ ﺗـﻮان ﻛـﻼس ﻫـﺎﻳﻲ ﻛﺎرﺑﺮدي و ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻃﺮاﺣﻲ ﻛﺮد .در اﻳﻦ ﻓﺼﻞ ﺑﺎ ﻧﺤﻮه اﻳﺠﺎد ﻛﻼس ﻫﺎﻳﻲ ﻛﺎرآﻣﺪ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. در اﺑﺘﺪاي اﻳﻦ ﻓﺼﻞ ﺑﻌﺪ از ﻣﻌﺮﻓﻲ ﺗﻌﺪادي از ﻣﺒﺎﺣﺚ ﺑﺎﻗﻲ ﻣﺎﻧﺪه ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷـﻴﺊ ﮔـﺮا ﻣﺎﻧﻨـﺪ interfaceﻫـﺎ و ﻧﻴـﺰ ﺳـﺮﺑﺎر ﮔﺬاري ﻣﺘﺪ ﻫﺎ ،ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺑﻪ ﺻﻮرت ﻋﻤﻠﻲ ﻳﻚ ﻛﻼس ﻛﺎرﺑﺮدي اﻳﺠﺎد ﻛﻨﻴﻢ .ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ در اﻳﻦ ﻓﺼﻞ ﺑﺮرﺳـﻲ ﻣـﻲ ﻛﻨـﻴﻢ، ﻫﻤﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻗﺒﻠﻲ ﺑﻪ ﺻﻮرت ﻳﻚ ﻻﻳﻪ ﺧﻮاﻫﺪ ﺑﻮد .اﻳﺪه اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ در ﻓﺼﻞ ﺳﻴﺰدﻫﻢ ﺑﺮرﺳﻲ ﺧﻮاﻫﺪ ﺷﺪ .در ﻃـﻲ اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ي ﻣﺜﺎل در اﻳﻦ ﻓﺼﻞ ،ﺑﺎ ﻧﺤﻮه اﻳﺠﺎد ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪ ﻫﺎﻳﻲ ﻛﻪ در ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎي ﻳﻚ ﻛﻼس ﻣﺸﺘﺮك ﺑﺎﺷﻨﺪ ﻧﻴﺰ آﺷـﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. در اﻳﻦ ﻓﺼﻞ:
ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﭼﻨﺪ ﺗﺎﺑﻊ ﺑﺎ ﻧﺎﻣﻬﺎي ﻳﻜﺴﺎن و ﺗﻌﺮﻳﻔﻬﺎي ﻣﺘﻔﺎوت را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد. ﺑﺎ ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﻗﺎﻟﺐ ﺧﺎص ﺑﺮاي ﻛﻼس ﺑﺎ اﺳﺘﻔﺎده از interfaceﻫﺎ آﺷﻨﺎ ﺧﻮاﻫﻴﺪ ﺷﺪ. ﻧﺤﻮه ي اﻳﺠﺎد ﻛﻼس ﻫﺎي ﻛﺎرﺑﺮدي در ﺑﺮﻧﺎﻣﻪ ﻫﺎ را ﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد. ﻧﺤﻮه اﻳﺠﺎد ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﺸﺘﺮك در ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
ﺳﺮﺑﺎر ﮔﺬاري ﻣﺘﺪ ﻫﺎ: ﻳﻜﻲ از ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ در ﻓﺼﻞ ﻫﻔﺘﻢ ﺑﺎ آن آﺷﻨﺎ ﺷﺪﻳﻢ ،ﻛﻼس MessageBoxﺑﻮد ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ آن ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﻳـﻚ ﻛـﺎدر ﭘﻴﻐﺎم را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﻢ .اﻳﻦ ﻛﻼس ﺷﺎﻣﻞ ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي زﻳﺎدي ﺑﻮد ،اﻣﺎ در ﺑﺮﻧﺎﻣﻪ ﻫـﺎ ﻓﻘـﻂ از ﻳﻜـﻲ از ﻣﺘـﺪﻫﺎي آن اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ :ﻣﺘﺪ .Showﻧﻜﺘﻪ ﺟﺎﻟﺒﻲ ﻛﻪ در اﻳﻦ ﻣﺘﺪ وﺟﻮد داﺷﺖ اﻳﻦ ﺑﻮد ﻛﻪ ﺑﻪ ﻫﺮ ﺻﻮرﺗﻲ ﻛﻪ ﻧﻴﺎز داﺷﺘﻴﻢ ،ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ اﻳﻦ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﻢ .ﺑﺮاي ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﻓﻘﻂ ﻳﻚ ﻣﺘﻦ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﻪ آن ارﺳﺎل ﻛﻨﻴﻢ و ﺗﺎ آن ﻣﺘﻦ در ﻳـﻚ ﻛـﺎدر ﻧﻤـﺎﻳﺶ داده ﺷﻮد ،ﻳﺎ اﻳﻨﻜﻪ ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﻋﻼوه ﺑﺮ ﻣﺸﺨﺺ ﻛﺮدن ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ ﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﻋﻨﻮان ﭘﻨﺠﺮه را ﻧﻴﺰ ﻣﺸﺨﺺ ﻛﻨـﻴﻢ و ﻳـﺎ …. اﻣﺎ ﺳﻮال اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻌﻤﻮﻻً ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻣﺘﺪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﻮرد ﻧﻴﺎز آن ﭼﻴﺴﺖ و ﺑﻪ ﭼﻪ ﺗﺮﺗﻴﺐ ﺑﺎﻳـﺪ ﺑـﻪ ﻣﺘـﺪ ارﺳﺎل ﺷﻮد ،ﭘﺲ ﭼﮕﻮﻧﻪ در ﻣﺘﺪ Showاز ﻛﻼس ،MessageBoxﺗﻌﺪاد ﭘﺎراﻣﺘﺮ ﻫﺎ ﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ ﺑﻮد؟ ﺧﻮب ،در ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻣﺘﺪ ﻫﺎﻳﻲ اﻳﺠﺎد ﻛﻨﻴﻢ ﻛﻪ ﻧﺎم ﻳﻜﺴﺎﻧﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،اﻣﺎ ﭘﺎراﻣﺘﺮﻫﺎي ﻣﺨﺘﻠﻔﻲ را درﻳﺎﻓﺖ ﻛﻨﻨﺪ و ﻛـﺪ ﻫـﺎي ﻣﺘﻔﺎوﺗﻲ ﻫﻢ در آﻧﻬﺎ ﻗﺮار دﻫﻴﻢ .ﺑﻪ اﻳﻦ ﻧﻮع ﺗﻌﺮﻳﻒ ﻣﺘﺪ ،ﺳﺮﺑﺎر ﮔﺬاري ﻣﺘﺪ ﻫﺎ 1ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد .ﺑﺮاي ﻣﺜﺎل ﻣﺘﺪ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ. ﻓﺮض ﻣﻲ ﻛﻨﻴﻢ اﻳﻦ ﻣﺘﺪ ﻋﺪد ﺻﺤﻴﺤﻲ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و آن را در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ: )public void Dispaly(int DisplayValue { // Implementation omitted }
Method Overloading
1
٣٧٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺮض ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﺘﺪي داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﻣﺎﻧﻨﺪ اﻳﻦ ﻣﺘﺪ ﻋﻤﻞ ﻛﻨﺪ وﻟﻲ ﻳﻚ رﺷﺘﻪ ي ﻣﺘﻨﻲ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ درﻳﺎﻓﺖ ﻛﻨﺪ و آن را ﻧﻤﺎﻳﺶ دﻫﺪ .در اﻳﻦ ﺻﻮرت ﺑﺎﻳﺪ ﻣﺘﺪي ﺟﺪﻳﺪ ﺑﺎ ﻧﺎﻣﻲ ﻣﺘﻔﺎوت اﻳﺠﺎد ﻛﻨﻴﺪ .ﺣﺎل اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﻣﺘﺪي ﺑﺎ ﻫﻤﻴﻦ ﻋﻤﻠﻜﺮد داﺷﺘﻪ ﺑﺎﺷـﻴﺪ وﻟـﻲ ﻣﺪت زﻣﺎن ﻧﻤﺎﻳﺶ داده ﺷﺪن ﻋﺪد ﻳﺎ ﻣﺘﻦ را ﻧﻴﺰ از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻛﻨﺪ و آن را در زﻣﺎن ﻣﺸﺨﺺ ﺷﺪه ﻧﻤﺎﻳﺶ دﻫﺪ ،در اﻳﻦ ﺻﻮرت ﺑﺎﻳـﺪ ﻣﺘﺪ دﻳﮕﺮي ﺑﺎ ﻧﺎﻣﻲ ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ،اﮔﺮ ﺗﻌﺪاد ﺣﺎﻟﺘﻬﺎ زﻳﺎد ﺷﻮد اﻳﻦ روش زﻳﺎد ﺟﺎﻟـﺐ ﻧﺨﻮاﻫـﺪ ﺑـﻮد .ﻫﻤﭽﻨـﻴﻦ ﻣﻤﻜﻦ اﺳﺖ اﺳﺎﻣﻲ ﻣﺘﺪ ﻫﺎ ﻳﺎ ﻃﻮﻻﻧﻲ ﺷﻮد و ﻳﺎ ﺑﻲ ﻣﻌﻨﻲ. 1 راه ﺣﻞ اﻳﻦ ﻣﺸﻜﻞ اﺳﺘﻔﺎده از ﺳﺮﺑﺎر ﮔﺬاري در ﻣﺘﺪ ﻫﺎ اﺳﺖ .ﻣﺘﺪﻫﺎي ﺳﺮﺑﺎر ﮔﺬاري ﺷﺪه ﻣﺘﺪ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻧﺎم ﻳﻜـﺴﺎﻧﻲ دارﻧـﺪ اﻣـﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻧﻮع داده ﺑﺮﮔﺸﺘﻲ از آﻧﻬﺎ و ﻳﺎ ﺗﻌـﺪاد ﭘﺎراﻣﺘﺮﻫـﺎي ورودي آﻧﻬـﺎ ﻣﺨﺘﻠـﻒ ﺑﺎﺷـﺪ )ﺣﺘـﻲ ﺳـﻄﺢ دﺳﺘﺮﺳـﻲ ﺑـﻪ آﻧﻬـﺎ ﻧﻴـﺰ ﻣﺎﻧﻨـﺪ publicو ﻳﺎ privateﺑﻮدن آﻧﻬﺎ ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﺪ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪ( .اﻟﺒﺘﻪ دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﺪﻫﺎي ﺳـﺮﺑﺎر ﮔـﺬاري ﺷـﺪه ﻧﻤـﻲ ﺗﻮاﻧﻨﺪ ﻓﻘﻂ از ﻧﻈﺮ ﻧﻮع داده ﺑﺮﮔﺸﺘﻲ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ در ﻳﻚ ﻛﻼس ،دو ﻣﺘﺪ ﺑـﺎ ﻳـﻚ ﻧـﺎم و ﻳـﻚ ﻧـﻮع ﭘﺎراﻣﺘﺮ ورودي داﺷﺘﻪ ﺑﺎﺷﻴﺪ وﻟﻲ ﻧﻮع داده ﺑﺮﮔﺸﺘﻲ آﻧﻬﺎ ﺗﻔﺎوت داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺑﺮاي ﻣﺜﺎل ﻳﻜﻲ از آﻧﻬﺎ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺑﺮﮔﺮداﻧﺪ و دﻳﮕـﺮي ﻳﻚ رﺷﺘﻪ .ﺗﺎﺑﻊ ﻫﺎي ﺳﺮﺑﺎر ﮔﺬاري ﺷﺪه ﺑﺎﻳﺪ ﻧﺎم ﻣﺸﺎﺑﻪ داﺷﺘﻪ ﺑﺎﺷﻨﺪ و ﺗﻌﺪاد و ﻳﺎ ﻧﻮع ﭘﺎراﻣﺘﺮﻫﺎي آﻧﻬﺎ ﻧﻴﺰ ﺣﺘﻤﺎً ﻣﺘﻔﺎوت ﺑﺎﺷـﺪ .ﻧـﻮع داده ﺑﺮﮔﺸﺘﻲ و ﺳﻄﺢ دﺳﺘﺮﺳﻲ آﻧﻬﺎ ﻧﻴﺰ ﻫﻢ ﻣﻲ ﺗﻮاﻧﺪ ﻣﺘﻔﺎوت ﺑﺎﺷﺪ و ﻫﻢ ﻣﺸﺎﺑﻪ ﺑﺎﺷﺪ. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ﻧﺤﻮه اﺳﺘﻔﺎده از ﺳﺮﺑﺎر ﮔﺬاري در ﻣﺘﺪ ﻫﺎ را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺳﺮﺑﺎر ﮔﺬاري ﺗﻮاﺑﻊ (1ﺑﺎ اﺳﺘﻔﺎده از ﮔﺰﻳﻨﻪ … File New Projectدر ﻧﻮار ﻣﻨﻮ ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ اﻳﺠﺎد ﻛﻨﻴـﺪ .در ﻗـﺴﻤﺖ Templatesاز ﭘﻨﺠﺮه New Projectﮔﺰﻳﻨﻪ Console Applicationرا اﻧﺘﺨﺎب ﻛﺮده و ﻧﺎم ﭘﺮوژه را Overloading Demoوارد ﻛﻨﻴﺪ .ﺳﭙﺲ روي دﻛﻤﻪ OKﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ ﭘﺮوژه اﻳﺠﺎد ﺷﻮد. (2ﻓﺎﻳﻞ Program.csرا ﺑﺎز ﻛﺮده و ﻣﺘﺪ زﻳﺮ را در آن اﻳﺠﺎد ﻛﻨﻴﺪ: // A method for displaying an integer )static void Display(int I { Console.WriteLine("This is an integer: " + ;))(I.ToString } (3ﺣﺎل ﻣﻲ ﺧﻮاﻫﻴﻢ ﻣﺘﺪي ﺑﺎ ﻫﻤﻴﻦ ﻧﺎم داﺷﺘﻪ ﺑﺎﺷﻴﻢ ،وﻟﻲ ﻳﻚ رﺷﺘﻪ را ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺘـﺪ زﻳـﺮ را ﺑـﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ: // this method has the same name as the previous // method, but is distinguishable by signature )static void Display(string str { ;)Console.WriteLine("This is a string: " + str }
1ﺑﻪ وﺳﻴﻠﻪ زﺑﺎن C#ﻣﻲ ﺗﻮاﻧﻴﺪ ﻋﻤﻠﮕﺮ ﻫﺎﻳﻲ ﻣﺎﻧﻨﺪ +و ﻳﺎ – و … را ﻧﻴﺰ ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﺪ .در اﻳﻦ ﻣﻮرد در اداﻣﻪ ﻓﺼﻞ ﺗﻮﺿﻴﺢ داده ﺷﺪه اﺳﺖ.
٣٧٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(4ﺣﺎل ﻣﺘﺪ Mainرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﺗﺎ ﺗﻮاﺑﻊ اﻳﺠﺎد ﺷﺪه را ﺑﺮرﺳﻲ ﻛﻨﻴﻢ: )static void Main(string[] args { // Displaying an integer ;)Display(20 // Displaying a string ;)"Display("Overloading Demo ;)(Console.ReadLine } (5ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﭘﻨﺠﺮه اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 1-10ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 1-10
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ در اﺑﺘﺪاي ﺑﺮﻧﺎﻣﻪ ﻣﺘﺪي ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ در ﺧﺮوﺟﻲ اﻳﺠﺎد ﻛﺮدﻳﻢ .اﻳﻦ ﻣﺘﺪ ﻫﻤﺎﻧﻨﺪ ﻣﺘـﺪﻫﺎي ﻋـﺎدي اﺳـﺖ و ﻫـﻴﭻ ﻧﻜﺘـﻪ ﺧﺎﺻﻲ در اﻳﺠﺎد ﻛﺮدن آن ﻧﺒﺎﻳﺪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد .اﻟﺒﺘﻪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﻗﺒﻞ ﻫﻢ ﮔﻔﺘﻢ ،اﻳـﻦ ﻣﺘـﺪ ﻫـﺎ ﺑـﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻨﺪ ﺗﻮﺳﻂ ﻣﺘﺪ Mainﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﻨﺪ ﺑﺎﻳﺪ از ﻧﻮع staticﺗﻌﺮﻳﻒ ﺷﻮﻧﺪ. // A method for displaying an integer )static void Display(int I { Console.WriteLine("This is an integer: " + ;))(I.ToString } ﺑﻌﺪ از آن ﺑﺮاي اﻳﺠﺎد ﻣﺘﺪي ﻛﻪ ﺑﺘﻮاﻧﺪ ﻳﻚ رﺷﺘﻪ را ﻧﻤﺎﻳﺶ دﻫﺪ ،از ﻧﺎم ﻣﺘﺪ ﻗﺒﻠﻲ اﺳﺘﻔﺎده ﻛﺮدﻳﻢ .وﻟﻲ اﻳﻦ ﺑﺎر ﭘﺎراﻣﺘﺮﻫـﺎي ورودي آن را ﺑﻪ ﺻﻮرت ﻳﻚ رﺷﺘﻪ ﺗﻌﺮﻳﻒ ﻛﺮدﻳﻢ. // this method has the same name as the previous // method, but is distinguishable by signature )static void Display(string str ٣٧٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ ;)Console.WriteLine("This is a string: " + str } ﺑﻪ اﻳﻦ ﺻﻮرت ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ Displayاﮔﺮ ﻳﻚ ﻋﺪد ﺑﻪ آن ارﺳﺎل ﻛﻨﻴﻢ ،ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ ﻣﺘـﺪ اول را ﻓﺮاﺧـﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ و اﮔﺮ ﻫﻢ ﻳﻚ رﺷﺘﻪ ﺑﻪ آن ارﺳﺎل ﻛﻨﻴﻢ ﺑﺮﻧﺎﻣﻪ از ﻣﺘﺪ دوم اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﻮرد را در ﻫﻨﮕﺎم اﺳـﺘﻔﺎده از اﻳـﻦ ﻣﺘـﺪ ﻫـﺎ در ﻗﺴﻤﺖ Mainﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ .اﺑﺘﺪا ﻋﺪد ﻓﺮﺳﺘﺎده ﺷﺪه ﺑﻪ ﻣﺘﺪ ﺑﻪ ﻫﻤﺮاه ﻳﻚ ﭘﻴﻐﺎم در ﺻﻔﺤﻪ ﭼﺎپ ﻣﻲ ﺷﻮد ﺗﺎ ﻣـﺸﺨﺺ ﺷـﻮد ﻛـﻪ ﺑﺮﻧﺎﻣﻪ از ﻣﺘﺪ اول اﺳﺘﻔﺎده ﻛﺮده اﺳﺖ .در ﻣﺮﺗﺒﻪ دوم ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ﻫﻢ ،رﺷﺘﻪ ﻓﺮﺳﺘﺎده ﺷﺪه ﺑﻪ ﻫﻤﺮاه ﭘﻴﻐﺎﻣﻲ ﺑﺮاي ﻣـﺸﺨﺺ ﺷـﺪن ﻣﺘـﺪ دوم در ﺻﻔﺤﻪ ﭼﺎپ ﻣﻲ ﺷﻮد. )static void Main(string[] args { // Displaying an integer ;)Display(20 // Displaying a string ;)"Display("Overloading Demo ;)(Console.ReadLine }
اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي :Static ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ از ﺗﻮاﺑﻊ و ﻣﺘﺪ ﻫﺎﻳﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻛﻪ ﻣﺨﺘﺺ ﺑﻪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس ﻧﺒﺎﺷﻨﺪ ،ﺑﻠﻜﻪ ﺑـﻪ ﻛـﻞ ﻛـﻼس اﺧﺘﺼﺎص داﺷﺘﻪ ﺑﺎﺷﻨﺪ .ﺗﺼﻮر ﻛﻨﻴﺪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻼﺳﻲ ﻃﺮاﺣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻧﺎم ﻛﺎرﺑﺮي و ﻛﻠﻤﻪ ﻋﺒﻮر را ﺑﺮاي ﻛﺎرﺑﺮان ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ ذﺧﻴـﺮه ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻤﻜﻦ اﺳﺖ از ﻛﺪي ﻣﺸﺎﺑﻪ زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: public class User { // Public members ;public string UserName // Private members ;private string _password } ﺣﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﻛﻠﻤﻪ ﻋﺒﻮر ﻫﺮ ﻛﺎرﺑﺮ ﻧﺒﺎﻳﺪ از ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎي ﻣﺸﺨﺼﻲ )ﻓﺮﺿﺎً 6ﻛﺎراﻛﺘﺮ( ﻛﻤﺘﺮ ﺑﺎﺷﺪ .ﺑﺮاي اﻳﻦ ﻛـﺎر ﻳـﻚ ﻓﻴﻠـﺪ ﺟﺪﻳﺪ در ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ و ﺣﺪاﻗﻞ ﺗﻌﺪاد ﻛﺎراﻛﺘﺮ ﻫﺎي ﻣﺠﺎز ﺑﺮاي ﻛﻠﻤﻪ ﻋﺒﻮر را در آن ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﺪ: public class User { // Public members ٣٧٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;public string UserName // Private members ;private string _password ;private string MinPasswordLength = 6 // Password property public string Password { get { ;return _password } set { )if (value.Length >= this.MinPasswordLength ;_password = value } } } ﺧﻮب ،ﺗﺎﻛﻨﻮن ﻫﻤﻪ ﭼﻴﺰ ﻋﺎدي و واﺿﺢ ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ .اﻣﺎ ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ 5000ﻛﺎرﺑﺮ داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ 5000ﺷﻴﺊ از اﻳﻦ ﻛﻼس ﺑﺎﻳﺪ در ﺣﺎﻓﻈﻪ اﻳﺠﺎد ﺷﻮد و ﻫﺮ ﻛﺪام از اﻳﻦ ﺷﻴﺊ ﻫﺎ ﻧﻴﺰ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم MinPasswordLengthدارﻧﺪ ﻛـﻪ 4ﺑﺎﻳﺖ ﻓﻀﺎ را اﺷﻐﺎل ﻣﻲ ﻛﻨﻨﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ 20ﻛﻴﻠﻮ ﺑﺎﻳﺖ از ﺣﺎﻓﻈﻪ ﺑﺮاي ﻧﮕﻬﺪاري ﻳﻚ ﻋﺪد ﻛﻮﭼﻚ اﺳـﺘﻔﺎده ﺷﺪه اﺳﺖ .اﮔﺮﭼﻪ در ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي اﻣﺮوزي 20ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻓﻀﺎي زﻳﺎدي ﻣﺤﺴﻮب ﻧﻤﻲ ﺷﻮد ،اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﺳﻮم ﮔﻔﺘﻢ ﻧﺒﺎﻳـﺪ ﺑﻲ دﻟﻴﻞ ﺣﺎﻓﻈﻪ را ﻫﺪر داد .ﺑﺮاي اﻳﻦ ﻛﺎر روﺷﻬﺎي ﺑﻬﺘﺮي ﻧﻴﺰ وﺟﻮد دارد.
اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎي :Static در ﻣﺜﺎل ﻗﺒﻠﻲ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ ﻣﻘﺪار ﺣﺪاﻗﻞ ﻛﺎراﻛﺘﺮ ﻫﺎي ﻳﻚ ﻛﻠﻤﻪ ﻋﺒﻮر را در ﻳﻚ ﻓﻴﻠﺪ از ﻛﻼس ذﺧﻴﺮه ﻛﻨﻴﺪ ،ﺳﭙﺲ آن ﻓﻴﻠـﺪ را در ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ از آن ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ ،ﺑﻪ اﺷﺘﺮاك ﺑﮕﺬارﻳﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﺎزاي ﻫﺮ ﺗﻌﺪاد ﻛﺎرﺑﺮي ﻛـﻪ در ﺑﺮﻧﺎﻣـﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﻓﻘﻂ ﻳﻚ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﻧﺎم MinPasswordLengthاﻳﺠﺎد ﺷـﺪه و 4ﺑﺎﻳـﺖ ﻓـﻀﺎ اﺷـﻐﺎل ﻣـﻲ ﺷـﻮد .در ﺑﺨـﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ،ﻧﺤﻮه ي اﻧﺠﺎم اﻳﻦ ﻛﺎر را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﻢ ﻛﺮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎي Static (1وﻳﮋوال اﺳﺘﻮدﻳﻮ 2005را ﺑﺎز ﻛﻨﻴﺪ و ﭘﺮوژه وﻳﻨﺪوزي ﺟﺪﻳﺪي ﺑﺎ وﻳﮋوال C#ﺑﻪ ﻧﺎم Static Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﻧﻤﺎﻳﺶ داده ﺷﺪ ،ﻋﻨﻮان ﻓﺮم را ﺑﻪ Static Demoﺗﻐﻴﻴﺮ دﻫﻴـﺪ .ﺳـﭙﺲ ﺑـﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﻳﻚ ﻛﻨﺘﺮل ،ListBoxﻳﻚ ﻛﻨﺘﺮل Labelو ﻳﻚ ﻛﻨﺘﺮل NumericUpDownرا در ﻓﺮم ﻗﺮار دﻫﻴﺪ .ﺑﻌﺪ از ﺗﻐﻴﻴﺮ اﻧﺪازه اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ،ﻓﺮم ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 2-10ﺑﺎﺷﺪ.
٣٧٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
2-10 ﺷﻜﻞ . ﺗﻐﻴﻴﺮ دﻫﻴﺪlstUsers را ﺑﻪListBox ﻛﻨﺘﺮلName ( ﺧﺎﺻﻴﺖ3 ﺧﺎﺻــﻴﺖ،nupMinPasswordLength را ﺑــﻪNumericUpDown ﻛﻨﺘــﺮلName ( ﺧﺎﺻــﻴﺖ4 . ﺗﻐﻴﻴﺮ دﻫﻴﺪ6 آن را ﺑﻪValue و ﺧﺎﺻﻴﺖ10 آن را ﺑﻪMaximum ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ اﺿـﺎﻓﻪ ﻛﻨﻴـﺪ و ﻛـﺪUser ﻛﻼس ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم،Solution Explorer ( ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه5 :ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در آن ﻗﺮار دﻫﻴﺪ class User { // Public members public string Username; public static int MinPasswordLength = 6; // Private members private string _password; // Password property public string Password { get { return _password; } set { if (value.Length >= MinPasswordLength) _password = value; } } }
٣٨٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
: ﺑﺮوﻳﺪ و ﻛﺪ زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪForm1 ( ﺑﻪ ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ6 public partial class Form1 : Form { // Private member private ArrayList arrUserList = new ArrayList(); ﺑﺎﻳــــﺪ ﻓــــﻀﺎي ﻧــــﺎمArrayList ﻫﻤــــﺎﻧﻄﻮر ﻛــــﻪ ﺑــــﻪ ﺧــــﺎﻃﺮ دارﻳــــﺪ ﺑــــﺮاي اﺳــــﺘﻔﺎده از ﻛــــﻼس . ﺑﻪ ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد اﺿﺎﻓﻪ ﻛﻨﻴﺪusing را ﺑﺎ اﺳﺘﻔﺎده ازSystem.Collections : اﺿﺎﻓﻪ ﻛﻨﻴﺪForm1 ﻣﺘﺪ زﻳﺮ را ﺑﻪ ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ،( ﺣﺎل7 private void UpdateDisplay() { // Clear the list lstUsers.Items.Clear(); // Add the users to the list box foreach (User objUsers in arrUserList) { lstUsers.Items.Add(objUsers.Username + ", " + objUsers.Password + " (" + User.MinPasswordLength + ")"); } } ﺑﻪ اﻳﻦ ﺗﺮﺗﻴـﺐ ﻣﺘـﺪ ﻣﺮﺑـﻮط ﺑـﻪ روﻳـﺪاد. ﺑﺮﮔﺮدﻳﺪ و ﺑﺮ روي ﻓﺮم دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪForm1 ( ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ ﻣﺮﺑﻮط ﺑﻪ8 : ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ. اﻳﻦ ﻓﺮم ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮدLoad private void Form1_Load(object sender, EventArgs e) { // Load 100 users for (int i = 0; i < 100; i++) { // Create a new user User objUser = new User(); objUser.Username = "Robbin" + i; objUser.Password = "Password15"; // Add the user to the array list arrUserList.Add(objUser); }
٣٨١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Update the display ;)(UpdateDisplay } (9ﻣﺠﺪداً ﺑﻪ ﻗﺴﻤﺖ ﻃﺮاﺣﻲ Form1ﺑﺮﮔﺮدﻳـﺪ و روي ﻛﻨﺘـﺮل nupMinPasswordLengthدو ﺑـﺎر ﻛﻠﻴـﻚ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد ValueChangedاﻳﻦ ﻛﻨﺘﺮل ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ اﻳﺠﺎد ﻣﻲ ﺷﻮد .ﺳﭙﺲ ﻛﺪ زﻳﺮ را در اﻳﻦ ﻣﺘﺪ وارد ﻛﻨﻴﺪ: (private void nupMinPasswordLength_ValueChanged )object sender, EventArgs e { // Set the minimum password length = User.MinPasswordLength ;(int)nupMinPasswordLength.Value // Update the display ;)(UpdateDisplay } (10ﺣﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﺑﺎ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ ﺑﺎ ﻓﺮﻣﻲ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 3-10ﻣﻮاﺟﻪ ﺷﻮﻳﺪ.
ﺷﻜﻞ 3-10 (11ﻋﺪد ﻣﻮﺟﻮد در ﻛﻨﺘﺮل NumericUpDownرا ﻛﻢ و ﻳﺎ زﻳﺎد ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛـﻪ اﻋـﺪاد داﺧـﻞ ﭘﺮاﻧﺘـﺰ در ﻟﻴﺴﺖ ﻧﻴﺰ ﻛﻢ و ﻳﺎ زﻳﺎد ﻣﻲ ﺷﻮﻧﺪ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟
٣٨٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي اﻳﻨﻜﻪ ﻳﻚ ﻓﻴﻠﺪ ،ﺧﺎﺻﻴﺖ و ﻳﺎ ﻳﻚ ﻣﺘﺪ را در ﻛﻼس ﺑﻪ ﻋﻨﻮان ﻋﻀﻮ ﻣﺸﺘﺮك ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎ ﻣﺸﺨﺺ ﻛﻨﻴﻢ ،ﺑﺎﻳـﺪ از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي staticاﺳﺘﻔﺎده ﻛﻨﻴﻢ. ;public static int MinPasswordLength = 6 ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﺑﻪ وﻳﮋوال 2005 C#ﻣﻲ ﮔﻮﻳﻴﻢ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ اﻳﻦ ﻋﻀﻮ ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ ﺑﻪ اﺷﺘﺮاك ﮔﺬاﺷﺘﻪ ﺷﻮد. اﻋﻀﺎي staticدر ﻳﻚ ﻛﻼس ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ وﺳﻴﻠﻪ ي اﻋﻀﺎي ﻏﻴﺮ staticآن ﻛﻼس ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ .ﺑﺮاي ﻣﺜﺎل در ﺑﺮﻧﺎﻣــﻪ ي ﺑــﺎﻻ ،ﻋــﻀﻮ MinPasswordLengthﻛــﻪ ﻳــﻚ ﻋــﻀﻮ staticاﺳــﺖ ﺑــﻪ وﺳــﻴﻠﻪ ي ﺧﺎﺻــﻴﺖ Passwordﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺖ: // Password property public string Password { get { ;return _password } set { )if (value.Length >= MinPasswordLength ;_password = value } } ﻧﻜﺘﻪ ﻣﻬﻤﻲ ﻛﻪ در اﻳﻨﺠﺎ ﻫﻤﻮاره ﺑﺎﻳﺪ ﻣﺪﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺮ ﺧﻼف _passwordو Passwordﻛﻪ ﻓﻘﻂ ﺑـﻪ ﻳﻚ ﺷﻴﺊ از ﻛﻼس Userﺗﻌﻠﻖ دارﻧﺪ )ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺎزاي ﻫﺮ ﺷﻴﺊ از اﻳﻦ ﻛﻼس ،ﻳﻚ ﻓﻴﻠﺪ _passwordو ﻳﻚ ﺧﺎﺻﻴﺖ Passwordوﺟﻮد دارد( ،اﻣﺎ MinPasswordLengthﺑﻪ ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس اﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ ﺗﻌﻠـﻖ دارد، ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺗﻐﻴﻴﺮي در اﻳﻦ ﻓﻴﻠﺪ اﻳﺠﺎد ﺷﻮد ،اﻳﻦ ﺗﻐﻴﻴﺮ ﺑﺮ ﺗﻤﺎم اﺷﻴﺎي ﻣﻮﺟﻮد اﺛﺮ ﺧﻮاﻫﺪ ﮔﺬاﺷﺖ. در ﻓﺮم ﺑﺮﻧﺎﻣﻪ از ﻣﺘﺪ UpdateDisplayﺑﺮاي ﭘﺮ ﻛﺮدن ﻟﻴﺴﺖ اﺳﺘﻔﺎده ﻛﺮده اﻳﻢ .ﻛﺪ ﻫﺎي اﻳﻦ ﻣﺘﺪ ﻫﻢ ﻛﺎﻣﻼً واﺿﺢ ﻫـﺴﺘﻨﺪ. ﻓﻘﻂ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻋﻀﺎي Staticﻳﻚ ﻛﻼس ﻧﻤﻲ ﺗﻮاﻧﻴﺪ از اﺷﻴﺎي ﻧﻤﻮﻧﻪ ﺳـﺎزي ﺷـﺪه از آن ﻛـﻼس اﺳـــﺘﻔﺎده ﻛﻨﻴـــﺪ .ﺑـــﺮاي ﻣﺜـــﺎل در ﻣﺘـــﺪ ،UpdateDisplayﺷـــﻴﺊ objUserﺣـــﺎوي ﻓﻴﻠـــﺪي ﺑـــﻪ ﻧـــﺎم MinPasswordLengthﻧﺨﻮاﻫﺪ ﺑﻮد .ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ اﻋﻀﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﺑﺎﻳﺪ از ﻧﺎم ﺧﻮد ﻛـﻼس اﺳﺘﻔﺎده ﻛﺮد. )(private void UpdateDisplay { // Clear the list ;)(lstUsers.Items.Clear // Add the users to the list box )foreach (User objUsers in arrUserList
٣٨٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
{ lstUsers.Items.Add(objUsers.Username + ", " + objUsers.Password + " (" + ;)")" User.MinPasswordLength + } } در ﺷﻜﻞ 4-10ﻧﻴﺰ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻫﻨﮕـﺎم ﻧﻮﺷـﺘﻦ ﻛـﺪ ،زﻣـﺎﻧﻲ ﻛـﻪ ﻧـﺎم ﻛـﻼس را وارد ﻣـﻲ ﻛﻨﻴـﺪ وﻳـﮋوال اﺳـﺘﻮدﻳﻮ اﻋـﻀﺎي staticﻛﻼس را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﺷﻜﻞ 4-10 اﻳﻦ ﻣﻮارد ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻋﺪد ﻣﻮﺟﻮد در ﻛﻨﺘﺮل NumericUpDownرا ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﺪ ﺟﺎﻟﺐ ﺗﺮ ﻣـﻲ ﺷـﻮد .در اﻳـﻦ ﻫﻨﮕـﺎم ﺧﺎﺻﻴﺖ MinPasswordLengthﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ ،اﻣﺎ ﭼﻮن اﻳﻦ ﻓﻴﻠﺪ ﺑﻪ ﺷﻴﺊ ﺧﺎﺻﻲ ﺗﻌﻠﻖ ﻧﺪارد ﻧﻴﺎزي ﻧﻴﺴﺖ ﻛﻪ اﻳﻦ ﻓﻴﻠـﺪ را ﺑﺮاي ﺗﻚ ﺗﻚ اﺷﻴﺎ ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﻠﻜﻪ ﻛﺎﻓﻲ اﺳﺖ ﺑﺎ اﺳﺘﻔﺎده از ﻧﺎم ﻛﻼس ،ﻓﻘﻂ ﻳﻚ ﺑﺎر ﻣﻘﺪار اﻳﻦ ﻓﻴﻠﺪ را ﻋﻮض ﻛﻨﻴﺪ ﺗـﺎ ﻛـﻞ اﺷـﻴﺎي ﻧﻤﻮﻧﻪ ﺳﺎزي ﺷﺪه از ﻛﻼس ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ: (private void nupMinPasswordLength_ValueChanged )object sender, EventArgs e { // Set the minimum password length = User.MinPasswordLength ;(int)nupMinPasswordLength.Value // Update the display ;)(UpdateDisplay } اﻟﺒﺘﻪ ﻣﻘﺪار ﺧﺎﺻـﻴﺖ Valueاز ﻛﻨﺘـﺮل NumericUpDownاز ﻧـﻮع Decimalاﺳـﺖ و ﺑـﺮاي اﻳﻨﻜـﻪ آن را در ﻓﻴﻠـﺪ MinPasswordLengthﻗﺮار دﻫﻴﻢ ﺑﺎﻳﺪ آن را ﺑﻪ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﻫﺎي ﻗﺒﻠﻲ ﮔﻔﺘﻢ ﺑﺎﻳﺪ از ﻋﻤﻠﮕﺮ )( ﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﻢ: // Set the minimum password length = User.MinPasswordLength ;(int)nupMinPasswordLength.Value
٣٨٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎي :Static در ﺑﺨﺶ ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﻢ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮان ﻳﻚ ﻓﻴﻠﺪ publicرا ﺑﻪ ﺻﻮرت اﺷﺘﺮاﻛﻲ ﻣﻌﺮﻓـﻲ ﻛـﺮد .در اﻳـﻦ ﻗـﺴﻤﺖ ﻫـﻢ ﺑـﻪ ﭼﮕﻮﻧﮕﻲ اﻳﺠﺎد ﻳﻚ ﻣﺘﺪ ﻛﻪ ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎ ﻣﺸﺘﺮك ﺑﺎﺷﺪ ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ .در ﺑﺨﺶ اﻣﺘﺤـﺎن ﻛﻨﻴـﺪ ﺑﻌـﺪ ،ﻣﺘـﺪي از ﻧـﻮع static اﻳﺠﺎد ﺧﻮاﻫﻴﻢ ﻛﺮد ﻛﻪ ﺑﺘﻮاﻧﺪ ﻳﻚ ﻧﻤﻮﻧﻪ از ﻛﻼس Userرا اﻳﺠﺎد ﻛﻨﺪ .ﺗﻨﻬﺎ ﻣﺤﺪودﻳﺘﻲ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻫﺎ ﻧﺴﺒﺖ ﺑﻪ ﻣﺘﺪﻫﺎي ﻫﻤﺎﻧﻨﺪ ﺧﻮد دارﻧﺪ در اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻫﺎ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻣﺘﺪ ﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي staticﻛﻼس دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ. ﻧﻜﺘﻪ :ﻣﺜﺎل زﻳﺮ ﻓﻘﻂ ﻳﻚ ﻣﺜﺎل ﺗﺼﻨﻌﻲ ﺑﺮاي ﻣﻌﺮﻓﻲ ﻣﺘﺪﻫﺎي staticاﺳﺖ ،زﻳﺮا اﻳﻦ ﻛﺎر ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون اﺳﺘﻔﺎده از اﻳﻦ ﻧﻮع ﻣﺘـﺪ ﻫﺎ ﻧﻴﺰ ﺑﻪ ﺳﺎدﮔﻲ اﻧﺠﺎم ﺷﻮد.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎي static (1ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي ﻛﻼس Userﺑﺎز ﻛﻨﻴﺪ و ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ آن اﺿﺎﻓﻪ ﻛﻨﻴﺪ public static User CreateUser(string UserName, )string Password { // Declare a new User object ;)(User objUser = new User // Set the user properties ;objUser.Username = UserName ;objUser.Password = Password // Return the new user ;return objUser } (2ﻗﺴﻤﺖ وﻳﺮاﻳﺸﮕﺮ ﻛﺪ را ﺑﺮاي Form1ﺑﺎز ﻛﻨﻴﺪ و ﺑﻪ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ روﻳﺪاد Loadﻓﺮم ﺑﺮوﻳﺪ .ﻛﺪ ﻣﻮﺟﻮد در اﻳﻦ ﻣﺘـﺪ را ﺑﻪ ﺻﻮرﺗﻲ ﻛﻪ در زﻳﺮ ﻣﺸﺨﺺ ﺷﺪه اﺳﺖ ﺗﻐﻴﻴﺮ دﻫﻴﺪ .دﻗﺖ ﻛﻨﻴﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻧـﺎم ﻛـﻼس Userرا وارد ﻛﻨﻴـﺪ ،وﻳـﮋوال اﺳﺘﻮدﻳﻮ ﻣﺘﺪ CreateUserرا ﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ﻳﻜﻲ از ﮔﺰﻳﻨﻪ ﻫﺎي ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ. )private void Form1_Load(object sender, EventArgs e { // Load 100 users )for (int i = 0; i < 100; i++ { // Create a new user = User objUser ;)"User.CreateUser("Robbin" + i,"Password15
٣٨٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Add the user to the array list ;)arrUserList.Add(objUser } // Update the display ;)(UpdateDisplay } (3ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ .ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد ﻛﻪ در ﺧﺮوﺟﻲ ﺑﺮﻧﺎﻣﻪ ﻫﻴﭻ ﺗﻐﻴﻴﺮي اﻳﺠﺎد ﻧﺸﺪه اﺳﺖ.
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﻧﻜﺘﻪ ﻣﻬﻤﻲ ﻛﻪ در اﻳﻦ ﻣﺜﺎل وﺟﻮد دارد اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎ وارد ﻛﺮدن ﻧﺎم ﻛﻼس ،Userﻧﺎم ﻣﺘﺪ CreateUserﻧﻴﺰ ﺑـﻪ ﻋﻨـﻮان ﻳﻜﻲ از ﮔﺰﻳﻨﻪ ﻫﺎي ﻗﺎﺑﻞ اﻧﺘﺨﺎب ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .دﻟﻴﻞ اﻳﻦ ﻣﻮرد اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻣﺘـﺪ staticﺗﻌﺮﻳـﻒ ﺷﺪه اﺳﺖ و ﺑﻴﻦ ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ ﻣﺸﺘﺮك اﺳﺖ .ﭘﺲ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ آن ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻧﺎم ﺧـﻮد ﻛﻼس اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي ﺗﻌﺮﻳﻒ ﻳﻚ ﻣﺘﺪ ،staticﻣﻲ ﺗﻮاﻧﻴﺪ در ﻫﻨﮕﺎم ﺗﻌﺮﻳﻒ ﻛﻼس از ﻛﻠﻤـﻪ ﻛﻠﻴـﺪي staticاﺳـﺘﻔﺎده ﻛﻨﻴﺪ. public static User CreateUser(string UserName, )string Password ﻳﻜﻲ از ﻧﻜﺎﺗﻲ ﻛﻪ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻣﺘﺪﻫﺎي staticﺑﺎﻳﺪ در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ ﻣﺘﺪ ﻫﺎ ﻓﻘﻂ ﻣﻲ ﺗﻮاﻧﻨـﺪ ﺑـﻪ اﻋـﻀﺎي staticﻛﻼس دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻨﺪ .دﻟﻴﻞ اﻳﻦ اﻣﺮ ﻫﻢ ﺳﺎده اﺳﺖ ،زﻳﺮا اﻳﻦ ﻣﺘﺪ ﺑﻪ ﺷﻴﺊ ﺧﺎﺻﻲ واﺑﺴﺘﻪ ﻧﻴﺴﺖ .ﺑﻨـﺎﺑﺮاﻳﻦ اﮔـﺮ در اﻳﻦ ﻣﺘﺪ از اﻋﻀﺎي ﻣﻌﻤﻮﻟﻲ ﻛﻼس ،ﻛﻪ ﺑﺎزاي ﻫﺮ ﺷﻴﺊ ﻳﻚ ﻧﻤﻮﻧﻪ از آﻧﻬﺎ وﺟﻮد دارد اﺳﺘﻔﺎده ﺷﻮد ،ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ اﻳﻦ ﻣﺘﺪ ﻧﻤـﻲ ﺗـﻮان ﺗﺸﺨﻴﺺ داد ﻛﻪ اﻋﻀﺎي ﻣﺮﺑﻮط ﺑﻪ ﻛﺪام ﺷﻴﺊ از ﻛﻼس ﻣﺪ ﻧﻈﺮ اﺳﺖ.
ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ: در ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺗﺎﻛﻨﻮن ﻧﻮﺷﺘﻪ اﻳﻢ از ﻋﻤﻠﮕﺮ ﻫﺎي اﺳﺘﺎﻧﺪارد ﻣﺎﻧﻨﺪ +و ﻳﺎ – ﺑﺮاي ﻛﺎر ﺑﺮ روي ﻧﻮع ﻫﺎي داده اي ﺧﺎﺻﻲ ﻣﺎﻧﻨﺪ اﻋـﺪاد ﺻﺤﻴﺢ ،اﻋﺪاد اﻋﺸﺎري و ﻳﺎ رﺷﺘﻪ ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﺮدﻳﻢ .اﻳﻦ ﻋﻤﻠﮕﺮ ﻫﺎ ﺑﻪ ﺻﻮرت دروﻧﻲ ﺑﺮاي ﻛﺎر ﺑـﺎ اﻳـﻦ ﻧـﻮع ﻫـﺎي داده اي ﺑﺮﻧﺎﻣـﻪ رﻳﺰي ﺷﺪه اﻧﺪ .ﺑﻌﻀﻲ از زﻳﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺎﻧﻨﺪ C#ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﺟﺎزه ﻣﻲ دﻫﻨﺪ ﻛﻪ ﻋﻤﻠﻜﺮد اﻳﻦ ﻋﻤﻠﮕﺮ ﻫـﺎ را ﺑـﻪ ﮔﻮﻧـﻪ اي ﺗﻐﻴﻴﺮ دﻫﻨﺪ ﺗﺎ ﺑﺎ ﺳﺎﺧﺘﺎرﻫﺎ و ﻳﺎ ﻛﻼﺳﻬﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺗﻮﺳﻂ آﻧﻬﺎ ﻧﻴﺰ ﻛﺎر ﻛﻨﻨﺪ. ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﻢ ﺳﺎﺧﺘﺎري را اﻳﺠﺎد ﻛﻨﻴﻢ ﻛﻪ ﺑﺘﻮاﻧﺪ اﻋﺪاد ﻣﺨﺘﻠﻂ را در ﺧﻮد ﻧﮕﻬﺪاري ﻛﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣـﻲ داﻧﻴـﺪ ﻫـﺮ ﻋﺪد ﻣﺨﺘﻠﻂ از ﻳﻚ ﻗﺴﻤﺖ ﺣﻘﻴﻘﻲ و ﻳﻚ ﻗﺴﻤﺖ ﻣﻮﻫﻮﻣﻲ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ .ﻓﺮض ﻛﻨﻴﺪ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﻛﻼﺳﻲ را ﺑﺮاي ﻧﮕﻬـﺪاري از اﻋﺪاد ﻣﺨﺘﻠﻂ ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻛﺮده اﻳﺪ: public class ComplexNumber {
٣٨٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;public double real ;public double imaginary } ﺑﺮاي ﺟﻤﻊ دو ﺷﻴﺊ از اﻳﻦ ﻛﻼس ،ﺑﺎﻳﺪ ﻗﺴﻤﺘﻬﺎي ﺣﻘﻴﻘﻲ ﻫﺮ ﻛﺪام را ﺑﺎ ﻫﻢ و ﻗﺴﻤﺘﻬﺎي ﻣﻮﻫﻮﻣﻲ را ﻧﻴﺰ ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻛﻨﻴﻢ .اﻣﺎ ﻋﻤﻠﮕﺮ + ﺑﻪ ﺻﻮرت ﻋﺎدي ﻧﻤﻲ ﺗﻮاﻧﺪ اﺷﻴﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس ﻧﻤﻮﻧﻪ ﺳﺎزي ﻣﻲ ﺷﻮﻧﺪ را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛﻨﺪ .در C#اﻳﻦ ﻗﺎﺑﻠﻴﺖ وﺟـﻮد دارد ﺗـﺎ ﺑﺮاي ﻋﻤﻠﮕﺮ +ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﺎﻳﺪ دو ﺷﻴﺊ از اﻳﻦ ﻧﻮع را ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛﻨﺪ .ﺑﻌﺪ از اﻳﻦ ﻛﺎر ،اﻳﻦ ﻋﻤﻠﮕـﺮ ﻗـﺎدر ﺧﻮاﻫـﺪ ﺑـﻮد ﻫﻤﺎﻧﻄﻮر ﻛﻪ دو ﻋﺪد ﻋﺎدي را ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻣﻲ ﻛﻨﺪ ،دو ﺷﻴﺊ از ﻛﻼس ComplexNumberرا ﻧﻴﺰ ﺑﺎ ﻫﻢ ﺟﻤﻊ ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﻛـﺎر ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ 1ﻣﻲ ﮔﻮﻳﻨﺪ. ﻧﻜﺘﻪ :ﺑﺴﻴﺎري از زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺎﻧﻨﺪ Javaو ﻳﺎ Visual Basicاﺟﺎزه ﻧﻤﻲ دﻫﻨﺪ ﻛﻪ ﻋﻤﻠﮕﺮ ﻫﺎ را ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﺪ .در اﻳﻦ زﺑﺎﻧﻬﺎ ﻣﻌﻤﻮﻻً از ﻳﻚ ﻣﺘﺪ ﺑﺎ ﻧﺎﻣﻲ ﻣﺸﺎﺑﻪ ﻋﻤﻠﮕﺮ )ﻫﻤﺎﻧﻨﺪ ﻣﺘﺪ (Addﺑﺮاي اﻧﺠﺎم دادن آن ﻋﻤـﻞ در ﻛـﻼس اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨﻨﺪ. ﻗﺒﻞ از اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﺑﺎ ﻧﺤﻮه ي اﻧﺠﺎم اﻳﻦ ﻛﺎر در C#آﺷﻨﺎ ﺷﻮﻳﻢ ،ﺑﺎﻳﺪ ﻋﻤﻠﮕﺮ ﻫﺎ را ﺑﻬﺘﺮ ﺑﺸﻨﺎﺳﻴﻢ .ﭘﺲ اﺑﺘﺪا ﻧﻜـﺎت دﻳﮕـﺮي ﻛـﻪ ﻻزم اﺳﺖ در ﻣﻮرد ﻫﺮ ﻋﻤﻠﮕﺮ ﺑﺪاﻧﻴﺪ را ﺑﺮرﺳﻲ ﻛﺮده و ﺳﭙﺲ ﺑﻪ ﺳﺮاغ ﻧﺤﻮه ي ﺳﺮﺑﺎر ﮔﺬاري آﻧﻬﺎ ﻣﻲ روﻳﻢ.
درك ﻋﻤﻠﮕﺮ ﻫﺎ: ﻫﺮ ﻋﻤﻠﮕﺮ در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ داراي اوﻟﻮﻳﺖ ﺧﺎﺻﻲ اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اوﻟﻮﻳﺖ ﻋﻤﻠﮕﺮ * ﺑﻴﺸﺘﺮ از ﻋﻤﻠﮕﺮ +اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑـﺮاي ارزﻳـﺎﺑﻲ ﻣﻘﺪار ﻋﺒﺎرت ،A + B * Cاﺑﺘﺪا ﻣﻘﺪار Bدر ﻣﻘﺪار Cﺿﺮب ﺷﺪه و ﺣﺎﺻﻞ آن ﺑﺎ ﻣﻘﺪار Aﺟﻤﻊ ﻣﻲ ﺷﻮد. ﻫﻤﭽﻨﻴﻦ ﻫﺮ ﻋﻤﻠﮕﺮ داراي ﺷﺮﻛﺖ ﭘﺬﻳﺮي ﺧﺎﺻﻲ اﺳﺖ ﻛﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ آن ﻋﻤﻠﮕﺮ از ﺳﻤﺖ ﭼﭗ ﺑﻪ راﺳﺖ ارزﻳﺎﺑﻲ ﻣﻲ ﺷﻮد و ﻳﺎ از ﺳﻤﺖ راﺳﺖ ﺑﻪ ﭼﭗ .ﺑﺮاي ﻣﺜﺎل ﻋﻤﻠﮕﺮ = داراي ﺷﺮﻛﺖ ﭘﺬﻳﺮي ﭼﭗ اﺳﺖ .ﺑﻪ ﺑﻴﺎن دﻳﮕﺮ ﺑﺮاي ارزﻳﺎﺑﻲ ﻣﻘﺪار ﻋﺒﺎرت = A = B Cﻣﻘﺪار Cدر Bو ﺳﭙﺲ در Aﻗﺮار ﻣﻲ ﮔﻴﺮد. ﻋﻤﻠﮕﺮ ﻳﮕﺎﻧﻲ ﻋﻤﻠﮕﺮي اﺳﺖ ﻛﻪ ﻓﻘﻂ ﺑﺮ روي ﻳﻚ ﻋﻤﻠﻮﻧﺪ ،ﻛﺎر ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﻤﻠﮕﺮ ++ﻛﻪ ﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ واﺣـﺪ ﺑـﻪ ﻣﺘﻐﻴﺮ ﺑﻪ ﻛﺎر ﻣﻲ رود ،ﻓﻘﻂ ﺑﻪ ﻳﻚ ﻋﻤﻠﻮﻧﺪ ﻧﻴﺎز دارد. ﻋﻤﻠﮕﺮ دوﺗﺎﻳﻲ ﻧﻴﺰ ﻋﻤﻠﮕﺮي اﺳﺖ ﻛﻪ ﺑﺮ روي دو ﻋﻤﻠﻮﻧﺪ ﻛﺎر ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﻤﻠﮕﺮ +ﺑﺮاي ﻛﺎر ﺧﻮد ﺑﻪ دو ﻋﻤﻠﻮﻧﺪ ﻧﻴﺎز دارد. ﻫﻨﮕﺎم ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ ﺑﺎﻳﺪ ﻫﻤﻮاره ﻧﻜﺎت زﻳﺮ را در ﻧﻈﺮ داﺷﺘﻪ ﺑﺎﺷﻴﺪ:
ﻫﻨﮕﺎم ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ اوﻟﻮﻳﺖ و ﻳﺎ ﺗﺮﺗﻴﺐ ﺷﺮﻛﺖ ﭘﺬﻳﺮي آﻧﻬﺎ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .زﻳﺮا اﻳﻦ ﻣـﻮارد ﺑـﻪ ﻣﻔﻬـﻮم ﻋﻤﻠﮕﺮ ﺑﺴﺘﮕﻲ دارﻧﺪ و ﺑﺮ اﺳﺎس ﻧﻮع داده اي ﻛﻪ ﺑﺎ آﻧﻬﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ﻧﺒﺎﻳﺪ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﺒﺎرت A + B * Cﺻﺮف ﻧﻈﺮ از ﻧﻮع داده اي ﻣﺘﻐﻴﻴﺮ ﻫﺎي B ، Aو Cﻫﻤﻮاره ﺑﻪ ﺻﻮرت ) A + (B * Cارزﻳﺎﺑﻲ ﻣﻲ ﺷﻮد.
Operator Overloading
1
٣٨٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﻨﮕﺎم ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ ﻣﺠﺎز ﻧﻴﺴﺘﻴﺪ ﻛﻪ ﺗﻌﺪاد ﻋﻤﻠﻮﻧﺪ ﻫﺎي ﻣﻮرد ﻧﻴﺎز آن را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﺮاي ﻣﺜﺎل ﻋﻤﻠﮕﺮ * ﻫﻤﻮاره دو ﻋﻤﻠﻮﻧﺪ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ و ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﻋﻤﻠﻜﺮد آن را ﺑﺮاي ﻳﻚ ﻛﻼس ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻐﻴﻴﺮ دﻫﻴﺪ ﻛﻪ ﺑـﻪ ﺳـﻪ ﻋﻤﻠﻮﻧـﺪ ﻧﻴـﺎز داﺷﺘﻪ ﺑﺎﺷﺪ. ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﺠﺎز ﻧﻴﺴﺘﻴﺪ ﻛﻪ ﻋﻤﻠﮕﺮ ﻫﺎي ﺟﺪﻳﺪي را اﻳﺠﺎد ﻛﺮده و ﻣﻔﻬﻮﻣﻲ را ﺑﻪ آن اﺧﺘـﺼﺎص دﻫﻴـﺪ .ﺑـﺮاي ﻣﺜﺎل ﻧﻤﻲ ﺗﻮاﻧﻴﺪ ﻋﻤﻠﮕﺮي را ﺑﻪ ﺻﻮرت ** ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ.
ﭼﮕﻮﻧﮕﻲ ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ: در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ زﻳﺮ ،ﻛﻼﺳﻲ را ﺑﺮاي ﻧﮕﻬﺪاري اﻋﺪاد ﻣﺨﺘﻠﻂ اﻳﺠﺎد ﻛﺮده و ﻋﻤﻠﮕﺮ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﺟﻤـﻊ و ﺗﻔﺮﻳـﻖ را ﺑـﻪ ﻧﺤـﻮي ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻴﻢ ﻛﻪ ﺑﺘﻮاﻧﻨﺪ ﺑﺎ اﺷﻴﺎي ﺳﺎﺧﺘﻪ ﺷﺪه از اﻳﻦ ﻛﻼس ﻧﻴﺰ ﻛﺎر ﻛﻨﻨﺪ .ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ اي اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ دو ﻋـﺪد ﻣﺨـﺘﻠﻂ را از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻛﻨﺪ و ﺣﺎﺻﻞ ﺟﻤﻊ و ﺗﻔﺮﻳﻖ آﻧﻬﺎ را ﻧﻤﺎﻳﺶ دﻫﺪ. ﻧﻜﺘﻪ :ﻳﻚ ﻋﺪد ﻣﺨﺘﻠﻂ را ﺑﻪ ﺻﻮرت ) (R+Iiﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ ﻛﻪ Rﻗﺴﻤﺖ ﺣﻘﻴﻘﻲ آن و Iﻗﺴﻤﺖ ﻣﻮﻫﻮﻣﻲ آن اﺳـﺖ ،ﻣﺎﻧﻨـﺪ ) . (2+3.4iاﮔﺮ ﻗﺴﻤﺖ ﺣﻘﻴﻘﻲ ﻋﺪد ﻣﺨﺘﻠﻂ اول را ﺑﺎ R1و ﻗﺴﻤﺖ ﻣﻮﻫﻮﻣﻲ آن را ﺑﺎ I1ﻧﻤﺎﻳﺶ دﻫﻴﻢ ،ﻫﻤﭽﻨﻴﻦ ﺑﺮاي ﻧﻤـﺎﻳﺶ ﻗﺴﻤﺘﻬﺎي ﺣﻘﻴﻘﻲ و ﻣﻮﻫﻮﻣﻲ ﻋﺪد دوم ﻧﻴﺰ از R2و I2اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،ﻓﺮﻣﻮل ﺟﻤﻊ و ﺗﻔﺮﻳﻖ اﻳﻦ اﻋﺪاد ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد: : (R1+R2) + (I1+I2)iﺟﻤﻊ : (R1-R2) + (I1-I2)iﺗﻔﺮﻳﻖ
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﻫﺎ (1 (2 (3
(4 (5
ﺑﺎ اﺳﺘﻔﺎده از ﮔﺰﻳﻨﻪ ي … File New Projectدر وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﺑﺮﻧﺎﻣﻪ ي وﻳﻨـﺪوزي ﺟﺪﻳـﺪي ﺑﻪ ﻧﺎم Operator Overloading Demoاﻳﺠﺎد ﻛﻨﻴﺪ. Operator ﺑﻌــﺪ از اﻳﻨﻜــﻪ ﻓــﺮم ﺑﺮﻧﺎﻣــﻪ ﻧﻤــﺎﻳﺶ داده ﺷــﺪ ،ﺧﺎﺻــﻴﺖ Textﻣﺮﺑــﻮط ﺑــﻪ آن را ﺑﺮاﺑــﺮ ﺑــﺎ Overloading Demoﻗﺮار دﻫﻴﺪ. ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ اﺑﺰار ،ﭼﻬﺎر ﻛﻨﺘﺮل TextBoxﺑﺮ روي ﻓﺮم ﻗﺮار داده و ﻧﺎم آﻧﻬـﺎ را ﺑـﻪ ﺗﺮﺗﻴـﺐ ﺑـﻪ ،txtReal1 txtReal2 ،txtImg1و txtImg2ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﺑﺎ اﺳﺘﻔﺎده از ﭼﻨﺪ ﻛﻨﺘﺮل Labelﻣـﺸﺨﺺ ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻛﻨﺘﺮل TextBoxﻣﺮﺑﻮط ﺑﻪ ﻧﮕﻬﺪاري ﭼﻪ ﻣﻘﺪاري اﺳﺖ. ﻳﻚ ﻛﻨﺘﺮل Buttonروي ﻓﺮم ﻗﺮار داده ،ﺧﺎﺻﻴﺖ Nameآن را ﺑـﻪ btnCalculateو ﺧﺎﺻـﻴﺖ Text آن را ﺑﻪ Calculateﺗﻐﻴﻴﺮ دﻫﻴﺪ. دو ﻛﻨﺘﺮل Labelﺑﻪ ﻧﺎﻣﻬﺎي lblSumو lblMinusدر ﻓﺮم ﻗﺮار دﻫﻴﺪ ﺗﺎ ﻧﺘﻴﺠﻪ ﻣﺤﺎﺳﺒﺎت را ﺑﻪ وﺳـﻴﻠﻪ آﻧﻬـﺎ ﺑﻪ ﻛﺎرﺑﺮ اﻃﻼع دﻫﻴﻢ .ﺧﺎﺻﻴﺖ Textاﻳﻦ دو ﻛﻨﺘﺮل را ﺑﻪ ﺗﺮﺗﻴـﺐ ﺑﺮاﺑـﺮ ﺑـﺎ Sum is:و Minus is:ﻗـﺮار دﻫﻴﺪ .ﺑﻌﺪ از ﺗﻨﻈﻴﻢ اﻧﺪازه ﻛﻨﺘﺮل ﻫﺎ ﻓﺮم ﺷﻤﺎ ﺑﺎﺷﺪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ 5-10ﺑﺎﺷﺪ.
٣٨٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
5-10 ﺷﻜﻞ ﺑـﻪ ﺑﺮﻧﺎﻣـﻪComplexNumber ﻛﻼس ﺟﺪﻳﺪي ﺑﻪ ﻧـﺎمSolution Explorer ( ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه6 . ﺳﭙﺲ ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را در ﺑﺪﻧﻪ ي آن ﻛﻼس وارد ﻛﻨﻴﺪ،اﺿﺎﻓﻪ ﻛﺮده class ComplexNumber { public double Real = 0; public double Imaginary = 0; // Override ToString() to display a complex number // in the traditional format public override string ToString() { return (Real + " + " + Imaginary + "i"); } } ComplexNumber ﻣﺘﺪ زﻳـﺮ را ﺑـﻪ ﻛـﻼس،( را ﺑﺮاي اﻳﻦ ﻛﻼس ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﻢ+) ( ﺑﺮاي اﻳﻨﻜﻪ ﻋﻤﻠﮕﺮ ﺟﻤﻊ7 :اﺿﺎﻓﻪ ﻛﻨﻴﺪ // Overloading '+' operator: public static ComplexNumber operator +(ComplexNumber a, ComplexNumber b) { // Create a new ComplexNumber object to store the sum ComplexNumber sum = new ComplexNumber(); // Calculate the sum sum.Real = a.Real + b.Real; sum.Imaginary = a.Imaginary + b.Imaginary; return sum; } : اﺿﺎﻓﻪ ﻛﻨﻴﺪComplexNumber ( ﻧﻴﺰ ﺑﺎﻳﺪ ﻣﺘﺪ زﻳﺮ را ﺑﻪ ﻛﻼس-) ( ﺑﺮاي ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﺗﻔﺮﻳﻖ8 // Overloading '-' operator:
٣٨٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
public static ComplexNumber operator -(ComplexNumber a, ComplexNumber b) { // Create a new ComplexNumber object to store the minus ComplexNumber minus = new ComplexNumber(); // Calculate the minus minus.Real = a.Real - b.Real; minus.Imaginary = a.Imaginary - b.Imaginary; return minus; } ﺑـﻪ ﭼﻬـﺎر ﺷـﻴﺊ از ﻧـﻮع،( ﺑﺮاي ﻣﺤﺎﺳـﺒﻪ ي ﺟﻤـﻊ و ﺗﻔﺮﻳـﻖ دو ﻋـﺪد ﻣﺨـﺘﻠﻂ اي ﻛـﻪ ﻛـﺎرﺑﺮ در ﺑﺮﻧﺎﻣـﻪ وارد ﻛـﺮده اﺳـﺖ9 دو ﺑﺎر ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗـﺎ ﻣﺘـﺪ ﻣﺮﺑـﻮط ﺑـﻪbtnCalculate ﺑﺮ روي ﻛﻨﺘﺮل. ﻧﻴﺎز دارﻳﻢComplexNumber : ﺳﭙﺲ ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ. آن اﻳﺠﺎد ﺷﻮدClick روﻳﺪاد private void btnCalculate_Click(object sender, EventArgs e) { ComplexNumber number1 = new ComplexNumber(); ComplexNumber number2 = new ComplexNumber(); number1.Real = double.Parse(txtReal1.Text); number1.Imaginary = double.Parse(txtImg1.Text); number2.Real = double.Parse(txtReal2.Text); number2.Imaginary = double.Parse(txtImg2.Text); ComplexNumber sum = new ComplexNumber(); ComplexNumber minus = new ComplexNumber(); sum = number1 + number2; minus = number1 - number2; lblSum.Text = "Sum is: " + sum.ToString(); lblMinus.Text = "Minus is: " + minus.ToString(); } Calculate ﺳـﭙﺲ ﺑـﺮ روي دﻛﻤـﻪ ي.( ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﺮده و دو ﻋﺪد ﻣﺨﺘﻠﻂ را در ﻛﺎدرﻫﺎي ﻣﺘﻨﻲ ﻓـﺮم وارد ﻛﻨﻴـﺪ10 : ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد6-10 ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ.ﻛﻠﻴﻚ ﻛﻨﻴﺪ
٣٩٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺷﻜﻞ 6-10
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮﻧﺎﻣﻪ را ﺑﺎ اﻳﺠﺎد ﻛﻼﺳﻲ ﺑﺮاي ﻧﮕﻬﺪاري اﻋﺪاد ﻣﺨﺘﻠﻂ آﻏﺎز ﻣﻲ ﻛﻨﻴﻢ .ﺑﺮاي ﻧﮕﻬﺪاري اﻳـﻦ اﻋـﺪاد ﺑـﻪ دو ﻓﻴﻠـﺪ ،ﻳﻜـﻲ ﺑـﺮاي ﻧﮕﻬـﺪاري ﻗﺴﻤﺖ ﺣﻘﻴﻘﻲ و دﻳﮕﺮي ﺑﺮاي ﻧﮕﻬﺪاري ﻗﺴﻤﺖ ﻣﻮﻫﻮﻣﻲ ﻋﺪد ﻧﻴﺎز دارﻳﻢ .ﺑﻌﺪ از اﻳﺠﺎد اﻳﻦ دو ﻓﻴﻠﺪ ،ﺑﺮاي اﻳﻜﻪ ﺑﺘـﻮاﻧﻴﻢ راﺣـﺖ ﺗـﺮ اﻳـﻦ اﻋﺪاد را ﻧﻤﺎﻳﺶ دﻫﻴﻢ ،ﻣﺘﺪ ToStringرا ﺑﻪ ﮔﻮﻧﻪ اي overrideﻣﻲ ﻛﻨﻴﻢ ﺗﺎ اﻳﻦ اﻋﺪاد را ﺑﻪ ﻓـﺮم ﻋـﺎدي ﻧﻤـﺎﻳﺶ دﻫـﺪ. ﺑﺮاي اﻳﻦ ﻛﺎر از روﺷﻲ ﻛﻪ در ﻓﺼﻞ ﻗﺒﻠﻲ ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ: // Override ToString() to display a complex number // in the traditional format )(public override string ToString { ;)"return (Real + " + " + Imaginary + "i } در ﻣﺮﺣﻠﻪ ي ﺑﻌﺪ ﺑﺎﻳﺪ ﻋﻤﻠﮕﺮ ﻫﺎي ﺟﻤﻊ و ﺗﻔﺮﻳﻖ را ﺑﺮاي اﻳﻦ ﻛﻼس ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﻢ .ﺑﺮاي ﺳﺮﺑﺎر ﮔﺬاري ﻳﻚ ﻋﻤﻠﮕﺮ ﺑﺎﻳﺪ ﻣﺘﺪي ﺑـﺎ ﻳﻚ ﻗﺎﻟﺐ ﺧﺎص ﺑﻪ ﺻﻮرت staticو publicﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ .ﻧﺎم اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ ﺑﺎ ﻛﻠﻤﻪ ي ﻛﻠﻴـﺪي operatorﺷـﺮوع ﺷﺪه و ﺳﭙﺲ ﻋﻤﻠﮕﺮ ﻣﻮرد ﻧﻈﺮ را وارد ﻛﺮد .ﺑﺮاي ﻣﺜﺎل ﻧﺎم ﻣﺘﺪي ﻛﻪ ﺑﺮاي ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﺟﻤـﻊ ﺑـﻪ ﻛـﺎر ﻣـﻲ رود ﺑﺎﻳـﺪ ﺑﺮاﺑـﺮ ﺑـﺎ operator +ﺑﺎﺷﺪ. ﭘﺎراﻣﺘﺮﻫﺎي اﻳﻦ ﻣﺘﺪ ،ﻋﻤﻠﻮﻧﺪ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي آن ﻋﻤﻠﮕﺮ ﻻزم اﺳﺖ .ﻣﺜﻼ ﻋﻤﻠﮕﺮ ﺟﻤﻊ ﺑﻪ دو ﻋﻤﻠﻮﻧﺪ ﻧﻴـﺎز دارد ﺗـﺎ ﺑﺘﻮاﻧـﺪ آن را ﺑـﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛﻨﺪ ،ﭘﺲ ﺑﺎﻳﺪ دو ﭘﺎراﻣﺘﺮ را ﺑﺮاي ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ ﺳﺮﺑﺎر ﮔﺬاري اﻳﻦ ﻋﻤﻠﮕﺮ ﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺧﺮوﺟﻲ اﻳﻦ ﻣﺘﺪ ﻫـﻢ ﺑﺎﻳـﺪ ﻫـﻢ ﻧﻮع ﺑﺎ ﻧﺘﻴﺠﻪ ي آن ﻋﻤﻠﮕﺮ ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل در ﻋﻤﻠﮕﺮ ﺟﻤﻊ ،ﺧﺮوﺟﻲ ﻣﺘﺪ ﻣﺮﺑﻮط ﺑﻪ ﺳﺮﺑﺎر ﮔﺬاري آن ﺑﺎﻳﺪ ﺑﺮاﺑﺮ ﺑﺎ ﻧﻮع ﻣﺘﻐﻴﺮي ﺑﺎﺷﺪ ﻛـﻪ ﺑﻪ ﻋﻨﻮان ﺣﺎﺻﻞ ﺟﻤﻊ ﻣﺸﺨﺺ ﻣﻲ ﺷﻮد. در ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ ﺑﺮاي اﻳﻨﻜﻪ ﻋﻤﻠﮕﺮ +را ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﻢ ،ﺑﺎﻳﺪ ﻣﺘﺪي ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﻢ: public static ComplexNumber operator +(ComplexNumber a, )ComplexNumber b ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﻳﻦ ﻣﺘﺪ ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت staticو publicﺗﻌﺮﻳﻒ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ در ﻧﺎم آن ﻧﻴﺰ ﺑﺎﻳﺪ از ﻛﻠﻤـﻪ ي ﻛﻠﻴـﺪي operatorو ﻋﻤﻠﮕﺮي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺳﺮﺑﺎر ﮔﺬاري ﺷﻮد اﺳﺘﻔﺎده ﻛﻨﻴﻢ )در اﻳﻨﺠﺎ .(operator +ﻋﻤﻠﻮﻧﺪ ﻫﺎﻳﻲ ﻛـﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻋﻤﻠﮕﺮ +ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮﻧﺪ ،ﻫﺮ دو از ﻧﻮع ﻋﺪد ﻣﺨﺘﻠﻂ ﻫﺴﺘﻨﺪ .ﺑﻪ ﺑﻴﺎن ﺑﻬﺘـﺮ ﻫـﺮ دوي ﻋﻤﻠﻮﻧـﺪ ﻫـﺎ ،ﺷـﻴﺊ اي از ﻧـﻮع ComplexNumberﻫﺴﺘﻨﺪ .ﭘﺲ ﭘﺎراﻣﺘﺮﻫﺎي ورودي ﻣﺘﺪ ﻧﻴﺰ از ﻧﻮع ComplexNumberﺧﻮاﻫﻨﺪ ﺑﻮد.
٣٩١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ اﮔﺮ ﻣﻲ ﺧﻮاﺳﺘﻴﻢ ﻋﻤﻠﮕﺮ +را ﺑﻪ ﮔﻮﻧﻪ اي ﺳﺮﺑﺎر ﮔﺬاري ﻛﻨﻴﻢ ﻛﻪ ﺑﺘﻮاﻧﻴﻢ ﻳﻚ ﺷﻴﺊ از ﻧـﻮع ComplexNumber را ﺑﺎ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ ﺟﻤﻊ ﻛﻨﻴﻢ ،ﺑﺎﻳﺪ در ﻣﺘﺪ را ﺑﻪ ﮔﻮﻧﻪ اي ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﺮدﻳﻢ ﻛﻪ ﻳـﻚ ﺷـﻴﺊ از ﻧـﻮع ComplexNumberو ﻳﻚ ﻋﺪد از ﻧﻮع intرا ﺑﻪ ﻋﻨﻮان ورودي درﻳﺎﻓﺖ ﻛﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ از دﺳﺘﻮري ﻣﺎﻧﻨﺪ زﻳﺮ ﺑﺮاي ﺟﻤﻊ ﻳﻚ ﻋﺪد ﻣﺨـﺘﻠﻂ ﺑﺎ ﻳﻚ ﻋﺪد ﺻﺤﻴﺢ اﺳﺘﻔﺎده ﻛﻨﻴﻢ: ;Sum = number1 + 20 ﺑﻌﺪ از اﻳﻨﻜﻪ دو ﺷﻴﺊ از ﻧﻮع ComplexNumberرا ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﺟﻤﻊ ﻛـﺮدﻳﻢ ،ﻧﺘﻴﺠـﻪ ﻧﻴـﺰ از ﻧـﻮع ComplexNumber ﺧﻮاﻫﺪ ﺑﻮد ،ﭘﺲ ﺑﺎﻳﺪ ﺧﺮوﺟﻲ )ﻣﻘﺪار ﺑﺮﮔﺸﺘﻲ ﻣﺘﺪ( را از ﻧﻮع ComplexNumberﻣﺸﺨﺺ ﻛﻨﻴﻢ .ﺳﭙﺲ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻧﺤﻮه ﺟﻤـﻊ ﻛﺮدن دو ﺷﻴﺊ از ﻧﻮع ﻣﺸﺨﺺ ﺷﺪه را در ﺑﺪﻧﻪ ي ﻣﺘﺪ ﻣﺸﺨﺺ ﻛﻨﻴﻢ .در اﻳﻦ ﺟﺎ ﺑﺮاي ﺟﻤﻊ دو ﻣﻘﺪار ﻓﺮﺳﺘﺎده ﺷـﺪه ،ﺷـﻴﺊ ﺟﺪﻳـﺪي از ﻧﻮع ComplexNumberﺗﻌﺮﻳﻒ ﻛﺮده ،ﻗﺴﻤﺘﻬﺎي ﺣﻘﻴﻘﻲ دو ﻋﺪد را ﺑﺎ ﻳﻜﺪﻳﮕﺮ و ﻗﺴﻤﺘﻬﺎي ﻣﻮﻫﻮﻣﻲ آن را ﻧﻴـﺰ ﺑـﺎ ﻫـﻢ ﺟﻤـﻊ ﻛﺮده ﺣﺎﺻﻞ را در ﺷﻴﺊ ComplexNumberﺟﺪﻳﺪ ﻗﺮار ﻣﻲ دﻫﻴﻢ .ﺳﭙﺲ اﻳﻦ ﺷﻴﺊ را ﺑﻪ ﻋﻨﻮان ﻧﺘﻴﺠﻪ ﺑﺮﻣﻲ ﮔﺮداﻧﻴﻢ. // Overloading '+' operator: public static ComplexNumber operator +(ComplexNumber a, )ComplexNumber b { // Create a new ComplexNumber object to store the sum ;)(ComplexNumber sum = new ComplexNumber // Calculate the sum ;sum.Real = a.Real + b.Real ;sum.Imaginary = a.Imaginary + b.Imaginary ;return sum } ﺑــﺮاي ﺳــﺮﺑﺎر ﮔــﺬاري ﻋﻤﻠﮕــﺮ – ﻧﻴــﺰ از ﻫﻤــﻴﻦ روش اﺳــﺘﻔﺎده ﻣــﻲ ﻛﻨــﻴﻢ .اﻳــﻦ ﻋﻤﻠﮕــﺮ ﻧﻴــﺰ ﻣﺎﻧﻨــﺪ +دو ﺷــﻴﺊ از ﻧــﻮع ComplexNumberرا درﻳﺎﻓﺖ ﻛﺮده و ﺣﺎﺻﻞ را ﻧﻴﺰ ﺑﻪ ﺻﻮرت ComplexNumberﺑﺮﻣﻲ ﮔﺮداﻧﺪ. // Overloading '-' operator: public static ComplexNumber operator -(ComplexNumber a, )ComplexNumber b { // Create a new ComplexNumber object to store the // minus ;)(ComplexNumber minus = new ComplexNumber // Calculate the minus ;minus.Real = a.Real - b.Real ;minus.Imaginary = a.Imaginary - b.Imaginary ;return minus
٣٩٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
} ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن اﻳﻦ دو ﻣﺘﺪ ﺑﻪ ﻛﻼس ،ComplexNumberاﻳﻦ ﻛﻼس دﻳﮕﺮ ﻛﺎﻣﻞ ﺷﺪه اﺳـﺖ و ﻣـﻲ ﺗـﻮاﻧﻴﻢ از آن در ﺑﺮﻧﺎﻣـﻪ اﺳﺘﻔﺎده ﻛﻨﻴﻢ .در ﺻﻔﺤﻪ ي اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﭼﻬﺎر ﻛﺎدر ﻣﺘﻨﻲ ﺑﺮاي درﻳﺎﻓﺖ ﻗﺴﻤﺘﻬﺎي ﻣﻮﻫﻮﻣﻲ و ﺣﻘﻴﻘﻲ دو ﻋﺪد ﻣﺨﺘﻠﻄﻲ ﻛﻪ ﺑﺎﻳﺪ ﺑـﺎ ﻫـﻢ ﺟﻤﻊ و ﺗﻔﺮﻳﻖ ﺷﻮﻧﺪ ﻗﺮار داده اﻳﻢ .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ اﻳﻦ اﻋﺪاد ﺑﻪ ﺻﻮرت ﻣﺘﻦ در اﻳﻦ ﻛﺎدر ﻫﺎ وارد ﻣﻲ ﺷﻮﻧﺪ ،ﭘﺲ اﺑﺘـﺪا آﻧﻬـﺎ را ﺑﻪ ﻋﺪد ﺗﺒﺪﻳﻞ ﻛﻨﻴﻢ .در ﻓﺼﻞ ﺳﻮم ﮔﻔﺘﻢ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ ﻳﻚ رﺷﺘﻪ ي ﺣﺎوي ﻋﺪد ﺑـﻪ ﻳـﻚ ﻋـﺪد ﺑﺎﻳـﺪ از ﻣﺘـﺪ Parseدر ﻛـﻼس ﻣﺮﺑﻮط ﺑﻪ ﻧﻮع داده اي آن ﻋﺪد اﺳﺘﻔﺎده ﻛﻨﻴﻢ .در اﻳﻦ ﻗﺴﻤﺖ ﻫﻢ ،ﺑﻪ اﻳﻦ ﻋﻠﺖ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه دﻫﻴﻢ ﺑﺘﻮاﻧﺪ اﻋﺪاد اﻋﺸﺎري ﻧﻴﺰ وارد ﻛﻨﺪ ،ﻧﻮع داده اي اﻋﺪاد ﻣﻮﺟﻮد در ﻛﺎدر ﻫﺎ را ﺑﺮاﺑﺮ ﺑﺎ doubleدر ﻧﻈﺮ ﮔﺮﻓﺘﻪ و از ﺗﺎﺑﻊ Parseﻣﺮﺑـﻮط ﺑـﻪ آن اﺳـﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﻣﺘﻦ وارد ﺷﺪه درون ﻛﺎدر ﺑﻪ ﻋﺪدي از ﻧﻮع Doubleﺗﺒﺪﻳﻞ ﺷﻮد. ;)number1.Real = double.Parse(txtReal1.Text ;)number1.Imaginary = double.Parse(txtImg1.Text ;)number2.Real = double.Parse(txtReal2.Text ;)number2.Imaginary = double.Parse(txtImg2.Text ﺣــﺎل ﻛــﻪ اﺷــﻴﺎي ﻣﺮﺑــﻮط ﺑــﻪ ﻧﮕﻬــﺪاري اﻋــﺪاد ﻣﺨــﺘﻠﻂ وارد ﺷــﺪه ﺑــﻪ وﺳــﻴﻠﻪ ﻛــﺎرﺑﺮ را اﻳﺠــﺎد ﻛــﺮدﻳﻢ ،دو ﺷــﻴﺊ ﺟﺪﻳــﺪ از ﻧــﻮع ComplexNumberاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﺣﺎﺻﻞ ﺟﻤﻊ و ﻫﻤﭽﻨﻴﻦ ﺣﺎﺻﻞ ﺗﻔﺮﻳﻖ اﻳﻦ اﻋﺪاد را در آﻧﻬﺎ ﻗﺮار دﻫﻴﻢ. ;)(ComplexNumber sum = new ComplexNumber ;)(ComplexNumber minus = new ComplexNumber ﺑﻌﺪ از ﺗﻌﺮﻳﻒ اﻳﻦ دو ﺷﻴﺊ ﺑﻪ ﻗﺴﻤﺖ ﺟﺎﻟﺐ ﺑﺮﻧﺎﻣﻪ ﻣﻲ رﺳﻴﻢ .ﺑﻪ ﻧﺤﻮه اﺳـﺘﻔﺎده از ﻋﻤﻠﮕـﺮ ﺟﻤـﻊ ﺑـﺮاي ﺟﻤـﻊ ﻛـﺮدن دو ﺷـﻴﺊ از ﻧـﻮع ComplexNumberﺗﻮﺟﻪ ﻛﻨﻴﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ اﻳﻦ دﺳﺘﻮر ﻣﻲ رﺳـﺪ ،ﻣﺘـﺪ operator +را ﻓﺮاﺧـﻮاﻧﻲ ﻛـﺮده، ﻣﺘﻐﻴﻴﺮ ﺳﻤﺖ ﭼﭗ ﻋﻼﻣﺖ +را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ اول و ﻣﺘﻐﻴﻴﺮ ﺳﻤﺖ راﺳﺖ را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ دوم ﺑﻪ ﻣﺘﺪ ﻣﻲ ﻓﺮﺳﺘﺪ .ﻣﻘـﺪار ﺑﺮﮔـﺸﺘﻲ ﻣﺘﺪ را ﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ﺣﺎﺻﻞ ﻋﺒﺎرت در ﻣﺘﻐﻴﻴﺮ sumﻗﺮار ﻣﻲ دﻫﺪ .ﺳﭙﺲ ﻫﻤﻴﻦ ﻋﻤﻞ را ﺑﺮاي ﻗﺴﻤﺖ ﺗﻔﺮﻳـﻖ ﻧﻴـﺰ اﻧﺠـﺎم ﻣـﻲ دﻫـﺪ و ﺣﺎﺻﻞ ﻋﺒﺎرت ﻣﺮﺑﻮط ﺑﻪ آن را در ﻣﺘﻐﻴﻴﺮ minusﻗﺮار ﻣﻲ دﻫﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﺘﻐﻴﻴﺮ sumﺣﺎوي ﻧﺘﻴﺠﻪ ي ﻣﺘﺪ operator ) +ﻳﺎ ﻫﻤﺎن ﺣﺎﺻﻞ ﺟﻤﻊ دو ﻋﺪد ﻣﺨﺘﻠﻂ( و ﻣﺘﻐﻴﻴﺮ minusﺣﺎوي ﻧﺘﻴﺠﻪ ﻣﺘﺪ – ) operatorﻳﺎ ﻫﻤـﺎن ﺣﺎﺻـﻞ ﺗﻔﺮﻳـﻖ دو ﻋﺪد ﻣﺨﺘﻠﻂ( ﺧﻮاﻫﺪ ﺑﻮد. ;sum = number1 + number2 ;minus = number1 - number2 ﺑﻌﺪ از ﻣﺤﺎﺳﺒﻪ ي اﻳﻦ دو ﻣﻘﺪار ،ﺑﺎﻳﺪ ﻧﺘﻴﺠﻪ را در ﺧﺮوﺟﻲ ﭼﺎپ ﻛﻨﻴﻢ .اﻣـﺎ ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻧﻴـﺎزي ﻧﻴـﺴﺖ ﻛـﻪ از ﻓﻴﻠـﺪ ﻫـﺎي ﻛـﻼس ComplexNumberاﺳﺘﻔﺎده ﻛﻨـﻴﻢ .ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﺧـﺎﻃﺮ دارﻳـﺪ در اﺑﺘـﺪاي ﺑﺮﻧﺎﻣـﻪ ،ﻣﺘـﺪ ToStringرا ﺑـﻪ ﮔﻮﻧـﻪ اي overrideﻛﺮدﻳﻢ ﻛﻪ ﻋﺪد ﻣﺨﺘﻠﻂ ﻣﺮﺑﻮط ﺑﻪ ﺷﻴﺊ را ﺑﻪ ﺻﻮرت ﻣﻄﻠﻮب ﻧﻤﺎﻳﺶ دﻫﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ ﻛﺎﻓﻲ اﺳـﺖ ﺑـﺮاي ﻫﺮ ﻳﻚ از اﺷﻴﺎي sumو minusاﻳﻦ ﻣﺘﺪ را ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده و ﺣﺎﺻﻞ را در ﻳﻚ ﻟﻴﺒﻞ ﻧﻤﺎﻳﺶ دﻫﻴﻢ. ;)(lblSum.Text = "Sum is: " + sum.ToString ;)(lblMinus.Text = "Minus is: " + minus.ToString
٣٩٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اﻳﻦ ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﺴﺘﻴﻢ ﻫﻤﻴﻦ ﻛﺎر را ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪﻫﺎي ﻋﺎدي ﻣﺎﻧﻨﺪ ﻳﻚ ﻣﺘﺪ Addﻧﻴﺰ اﻧﺠﺎم دﻫـﻴﻢ ،اﻣـﺎ اﺳـﺘﻔﺎده از اﻳـﻦ روش ﺳﺎدﮔﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ و ﻧﻴﺰ ﺧﻮاﻧﺎﻳﻲ ﻛﺪ را اﻓﺰاﻳﺶ ﻣﻲ دﻫﺪ .ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﺑﺨﻮاﻫﻴﺪ ﭼﻬﺎر ﺷـﻴﺊ C ،B ،Aو Dرا ﺑـﺎ ﻳﻜـﺪﻳﮕﺮ ﺟﻤﻊ ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت اﮔﺮ ﺑﺨﻮاﻫﻴﺪ از ﻣﺘﺪﻫﺎي ﻋﺎدي اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﻓﺮﺿﺎً ﭼﻬﺎر ﻣﺮﺗﺒـﻪ ﻣﺘـﺪ Addرا ﻓﺮاﺧـﻮاﻧﻲ ﻛﻨﻴـﺪ ،اﻣـﺎ ﺑـﺎ اﺳﺘﻔﺎده از ﺳﺮﺑﺎر ﮔﺬاري ﻋﻤﻠﮕﺮ ﺟﻤﻊ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ راﺣﺘﻲ از دﺳﺘﻮر A+B+C+Dاﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﻛﻼﺳﻬﺎي :Abstract ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ داﻧﻴﺪ ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد از آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ در ﺣﻘﻴﻘﺖ ﻳﻚ ﺷﻴﺊ از ﻛﻼﺳﻲ ﻣﺮﺑﻮط ﺑـﻪ آن ﻛﻨﺘﺮل ﻫﺴﺘﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻛﻨﺘﺮل Buttonروي ﻓﺮم ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲ دﻫﻴﺪ ،در ﺣﻘﻴﻘﺖ ﻳﻚ ﺷﻴﺊ از ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم Buttonاﻳﺠﺎد ﻛﺮده اﻳﺪ و در ﻃﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺰ ﺑﺎ آن ﺷﻴﺊ ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ. ﻓﺮض ﻛﻨﻴﺪ ﺑﺨﻮاﻫﻴﺪ ﻛﻼس ﻣﺮﺑﻮط ﺑﻪ ﭼﻨﻴﻦ ﻛﻨﺘﺮل ﻫﺎﻳﻲ را در ﺑﺮﻧﺎﻣﻪ ﺑﻨﻮﻳﺴﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر اﺑﺘﺪا ﺑﺎﻳﺪ ﻳﻚ ﻛﻼس ﭘﺎﻳﻪ ،ﺑﺮاي ﻣﺜﺎل ﺑـﻪ ﻧﺎم Windowاﻳﺠﺎد ﻛﺮده و ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎي ﻣﺸﺘﺮك ﺑﻴﻦ ﻛﻨﺘﺮل ﻫﺎ را در اﻳﻦ ﻛﻼس ﻗﺮار دﻫﻴـﺪ .ﺳـﭙﺲ ﺗﻤـﺎم ﻛﻨﺘـﺮل ﻫﺎﻳﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ اﻳﺠﺎد ﻛﻨﻴﺪ را ،ﻣﺎﻧﻨﺪ ﻛﻨﺘﺮل Buttonو ﻳﺎ ﻛﻨﺘﺮل ،TextBoxاز اﻳﻦ ﻛﻼس ﺑﻪ ارث ﺑﺒﺮﻳﺪ .در اﻳﻦ ﺣﺎﻟـﺖ ﻣﺴﻠﻤﺎً ﻧﻤﻲ ﺧﻮاﻫﻴﺪ ﺑﻌﺪﻫﺎ ﻛﺴﻲ ﺑﺘﻮاﻧﺪ ﺷﻴﺊ را از ﻛﻼس Windowﻧﻤﻮﻧﻪ ﺳﺎزي ﻛﻨﺪ و از آن ﺷﻴﺊ در ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﺪ ،ﭼﻮن اﻳـﻦ اﻣﺮ ﺑﻲ ﻣﻌﻨﻲ اﺳﺖ .ﻛﻼس Windowﻧﺸﺎن دﻫﻨﺪه ﻫﻴﭻ ﻛﻨﺘﺮل ﺧﺎﺻﻲ ﻧﻴﺴﺖ ،ﺑﻠﻜﻪ ﻓﻘﻂ ﺑﻪ ﻋﻨﻮان ﻳـﻚ ﻛـﻼس ﭘﺎﻳـﻪ ﺑـﺮاي ﺗﻤـﺎم ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﻛﺎر ﻣﻲ رود .ﺑﻨـﺎﺑﺮاﻳﻦ اﻳـﻦ ﻛـﻼس را ﺑـﻪ ﻋﻨـﻮان ﻳـﻚ ﻛـﻼس abstractﻣـﺸﺨﺺ ﻣـﻲ ﻛﻨﻴـﺪ .ﻛـﻼس ﻫـﺎي abstractﺑﻪ ﺑﻴﺎن ﺳﺎده ﺗﺮ ﻛﻼس ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻧﻤﻲ ﺗﻮان ﻫﻴﭻ ﺷﻴﺊ را از آﻧﻬﺎ ﻧﻤﻮﻧﻪ ﺳﺎزي ﻛـﺮد و ﺣﺘﻤـﺎً ﺑﺎﻳـﺪ ﺑـﻪ ﻋﻨـﻮان ﻛﻼس ﻫﺎي ﭘﺎﻳﻪ ﺑﺮاي دﻳﮕﺮ ﻛﻼﺳﻬﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ. ﺣــﺎل ﺗــﺼﻮر ﻛﻨﻴــﺪ ﻛــﻪ ﻣــﻲ ﺧﻮاﻫﻴــﺪ ﺗﻤــﺎم ﻛﻨﺘــﺮل ﻫــﺎﻳﻲ ﻛــﻪ از ﻛــﻼس Windowﻣــﺸﺘﻖ ﻣــﻲ ﺷــﻮﻧﺪ داراي ﻣﺘــﺪي ﺑــﻪ ﻧــﺎم DrawWindowﺑﺎﺷﻨﺪ ﻛﻪ آن ﻛﻨﺘﺮل را در ﺻﻔﺤﻪ رﺳﻢ ﻛﻨﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ ﻣﺘﺪي ﺑﻪ ﻧـﺎم DrawWindowدر ﻛـﻼس Windowاﻳﺠﺎد ﻛﻨﻴﺪ .اﻣﺎ ﻧﺤﻮه رﺳﻢ ﻫﺮ ﻛﻨﺘﺮل ﺑﻪ ﻧﻮع آن ﺑﺴﺘﮕﻲ دارد و ﻫﻴﭻ ﻧﻘﻄﻪ ي اﺷﺘﺮاﻛﻲ در اﻳﻦ ﻣﻮرد ﺑﻴﻦ ﻛﻨﺘﺮل ﻫﺎ وﺟـﻮد ﻧﺪارد ﻛﻪ ﺑﺨﻮاﻫﻴﺪ آن را در ﺑﺪﻧﻪ ي اﻳﻦ ﻣﺘﺪ ﻗﺮار دﻫﻴﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﻳﻦ ﻣﺘﺪ ﻧﻤﻲ ﺗﻮاﻧﺪ ﺷﺎﻣﻞ ﻫﻴﭻ ﻛﺪي ﺑﺎﺷﺪ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻫﺮ ﻛﻨﺘﺮﻟﻲ ﻛﻪ ﺑﺎ ﻣﺸﺘﻖ ﺷﺪن از ﻛﻼس Windowاﻳﺠﺎد ﻣﻲ ﺷﻮد ،ﺣﺘﻤﺎً اﻳﻦ ﻣﺘﺪ را در ﺧﻮد overrideﻛﻨﺪ ﺗﺎ ﺑﻪ اﻳﻦ وﺳـﻴﻠﻪ ﻧﺤﻮه ي رﺳﻢ آن ﻛﻨﺘﺮل در ﺻﻔﺤﻪ ﻣﺸﺨﺺ ﺷﻮد .ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻲ ﺗﻮاﻧﻴﺪ آن ﻣﺘﺪ را از ﻧﻮع abstractﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﺑـﻪ اﻳـﻦ ﺗﺮﺗﻴﺐ ﻫﺮ ﻛﻼﺳﻲ ﻛﻪ از ﻛﻼس Windowﺑﻪ ﻋﻨﻮان ﻛﻼس ﭘﺎﻳﻪ اﺳﺘﻔﺎده ﻛﻨﺪ ﻣﻮﻇﻒ اﺳﺖ ﻛﻪ ﺗﻤﺎم اﻋـﻀﺎي abstractآن ﻛﻼس را در ﺧﻮد overrideﻛﻨﺪ .اﻟﺒﺘﻪ دﻗﺖ داﺷﺘﻪ ﺑﺎﺷـﻴﺪ ﻛـﻪ ﻳـﻚ ﻋـﻀﻮ abstractﻓﻘـﻂ ﻣـﻲ ﺗﻮاﻧـﺪ در ﻛﻼﺳـﻬﺎي abstractاﻳﺠﺎد ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ در ﻳﻚ ﻛﻼس ﻋﺎدي ،ﻳﻚ ﻋﻀﻮ abstractاﻳﺠﺎد ﻛﻨﻴﺪ. در ﺑﺨﺶ اﻣﺘﺤﺎن ﻛﻨﻴﺪ ﺑﻌﺪ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﻣﺜﺎﻟﻲ ﻛﻪ در ﺑﺎﻻ ﻋﻨﻮان ﺷﺪ را ﺑﻪ ﮔﻮﻧﻪ اي ﺳﺎده ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﻢ.
اﻣﺘﺤﺎن ﻛﻨﻴﺪ :ﻛﻼﺳﻬﺎي Abstract (1ﺑﺎ اﺳﺘﻔﺎده از ﮔﺰﻳﻨﻪ ي … File New Projectدر ﻧﻮار ﻣﻨﻮي وﻳﮋوال اﺳﺘﻮدﻳﻮ ،ﻳﻚ ﭘـﺮوژه ﺗﺤـﺖ ﻛﻨﺴﻮل ﺟﺪﻳﺪ ﺑﺎ وﻳﮋوال C#ﺑﻪ ﻧﺎم Abstract Demoاﻳﺠﺎد ﻛﻨﻴﺪ. (2ﺑﺎ اﺳﺘﻔﺎده از ﭘﻨﺠﺮه ي Solution Explorerﻳﻚ ﻛﻼس ﺟﺪﻳﺪ ﺑﻪ ﻧﺎم Windowﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻛﻨﻴﺪ. (3ﺗﻌﺮﻳﻒ ﻛﻼس Windowرا ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪ:
٣٩٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
namespace Abstract_Demo { abstract public class Window { دﻗـﺖ ﻛﻨﻴـﺪ ﻣﺘـﺪي ﻛـﻪ در اﻳـﻦ ﻛـﻼس ﺑـﻪ ﺻـﻮرت. اﺿـﺎﻓﻪ ﻛﻨﻴـﺪWindow ( ﻛﺪ ﻣﺸﺨﺺ ﺷﺪه در زﻳﺮ را ﺑﻪ ﻛـﻼس4 . ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ﻧﺒﺎﻳﺪ ﺣﺎوي ﻛﺪ ﺑﺎﺷﺪabstract abstract public class Window { public int Left; public int Top; // Constructor method to set // the initial value of fields public Window() { this.Top = 0; this.Left = 0; } // simulates drawing the window // notice: no implementation abstract public void DrawWindow(); } ﺑـﻪListBox ﻛﻼس ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم،Window و ﺑﻌﺪ از ﻛﻼسAbstract_Demo ( در داﺧﻞ ﻓﻀﺎي ﻧﺎم5 ﻣﺸﺘﻖ ﻣﻲ ﺷﻮد و ﺑﻪ ﺻﻮرت ﻓﺮﺿﻲ ﻳـﻚ ﻟﻴـﺴﺖ ﺑـﺎﻛﺲ را درWindow اﻳﻦ ﻛﻼس از ﻛﻼس.ﺻﻮرت زﻳﺮ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ زﻳـﺮا، در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻧﮕـﺮان ﻧﺒﺎﺷـﻴﺪListBox در ﻣﻮرد ﺗﺪاﺧﻞ ﻧﺎم اﻳﻦ ﻛﻼس ﺑﺎ ﻛﻼس.ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ اﺳﺖ وﻟـﻲ ﻛـﻼسAbstract_Demo ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ در ﻓﻀﺎي ﻧﺎمListBox ﻛﻼس . اﺳﺖSystem.Windows.Forms وﻳﮋوال اﺳﺘﻮدﻳﻮ در ﻓﻀﺎي ﻧﺎمListBox // ListBox derives from Window public class ListBox : Window { private string listBoxContents; // new member variable // constructor adds a parameter public ListBox(int top,int left,string contents) { Top = top; Left = left; listBoxContents = contents; }
٣٩٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// an overridden version implementing the // abstract method public override void DrawWindow() { Console.WriteLine("Writing string to the" + " listbox: " + listBoxContents); } } ﺑـﺮاي. اﻳﺠﺎد ﻛﻨـﻴﻢWindow ﺑﺎ اﺳﺘﻔﺎده از ﻛﻼس،Button ( ﺣﺎل ﻣﻲ ﺧﻮاﻫﻴﻢ ﻛﻨﺘﺮل دﻳﮕﺮي ﻧﻴﺰ ﻣﺎﻧﻨﺪ ﻳﻚ ﻛﻨﺘﺮل6 ﺑﻪ ﺻﻮرت زﻳـﺮ اﻳﺠـﺎدAbstract_Demo در ﻓﻀﺎي ﻧﺎمListBox اﻳﻦ ﻛﺎر ﻛﻼس دﻳﮕﺮي را ﺑﻌﺪ از ﻛﻼس :ﻛﻨﻴﺪ // Button control that derives from Window class public class Button : Window { // The new class's constructor public Button(int top, int left) { Top = top; Left = left; } // implement the abstract method public override void DrawWindow() { Console.WriteLine("Drawing a button at " + Top + ", " + Left); } } وﻳﺮاﻳـﺸﮕﺮ ﻛـﺪ ﺑـﺮاي.( اﻳﺠﺎد ﻛﻼﺳﻬﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ و ﺣﺎﻻ ﺑﺎﻳﺪ ﻧﺤﻮه ﻋﻤﻠﻜﺮد آﻧﻬﺎ را ﺑﺮرﺳﻲ ﻛﻨـﻴﻢ7 . وارد ﻛﻨﻴﺪMain را ﺑﺎز ﻛﺮده و ﻛﺪ زﻳﺮ را در ﻣﺘﺪProgram.cs ﻓﺎﻳﻞ static void Main(string[] args) { // Create two list boxes and one ListBox lstBox1 = new ListBox(1, ListBox lstBox2 = new ListBox(3, Button newButton = new Button(5, // Draw all objects on the form lstBox1.DrawWindow(); lstBox2.DrawWindow(); newButton.DrawWindow();
٣٩٦
www.pupuol.com
button 2, "First List Box"); 4,"Second List Box"); 6);
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
;)(Console.ReadLine } (8ﺣﺎل ﺑﺮﻧﺎﻣﻪ را اﺟﺮا ﻛﻨﻴﺪ ،ﻧﺘﻴﺠﻪ اي ﻣﺸﺎﺑﻪ ﺷﻜﻞ 7-10را ﻣﺸﺎﻫﺪه ﺧﻮاﻫﻴﺪ ﻛﺮد.
ﺷﻜﻞ 7-10
ﭼﮕﻮﻧﻪ ﻛﺎر ﻣﻲ ﻛﻨﺪ؟ ﺑﺮﻧﺎﻣﻪ را ﺑﺎ ﺗﻌﺮﻳﻒ ﻳﻚ ﻛﻼس ﭘﺎﻳﻪ ﺑﻪ ﻧﺎم Windowﺷﺮوع ﻣﻲ ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﻳﻦ ﻛﻼس ﺑﺎﻳﺪ ﺑﻪ ﮔﻮﻧﻪ اي ﺑﺎﺷﺪ ﻛﻪ ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪ ﻫﺎﻳﻲ را ﻛﻪ ﺑﻴﻦ ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎ ﻣﺸﺘﺮك اﺳﺖ ﺷﺎﻣﻞ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ ﺑﺮاي اﻳﻨﻜﻪ ﻧﺘﻮان ﺷﻴﺊ را از اﻳـﻦ ﻛـﻼس اﻳﺠـﺎد ﻛﺮد ،آن را ﺑﻪ ﺻﻮرت abstractﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨـﻴﻢ .ﺑـﺮاي اﻳـﻦ ﻛـﺎر ﻛـﺎﻓﻲ اﺳـﺖ ﻫﻨﮕـﺎم ﺗﻌﺮﻳـﻒ ﻛـﻼس ،ﻛﻠﻤـﻪ ي ﻛﻠﻴـﺪي abstractرا ﺑﻪ اﺑﺘﺪاي آن اﺿﺎﻓﻪ ﻛﻨﻴﻢ. abstract public class Window ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎ در ﻳﻚ ﻓﺮم داراي ﻣﻮﻗﻌﻴﺖ ﻣﻜﺎﻧﻲ ﻣﻌﻴﻨﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ دو ﺧﺎﺻﻴﺖ ) Topﻓﺎﺻﻠﻪ ي ﻛﻨﺘـﺮل از ﺑـﺎﻻي ﻓـﺮم( و ) Leftﻓﺎﺻﻠﻪ ي ﻛﻨﺘﺮل از ﺳﻤﺖ ﭼﭗ ﻓﺮم( ﻣﺸﺨﺺ ﻣﻲ ﺷﻮﻧﺪ .ﭘﺲ ﻫﻤﻪ ي آﻧﻬﺎ ﺑﺎﻳﺪ ﺷﺎﻣﻞ دو ﻓﻴﻠﺪ ﺑﻪ ﻧﺎﻣﻬـﺎي Topو Left ﺑﺎﺷﻨﺪ .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ اﻳﻦ دو ﻓﻴﻠﺪ را در ﻛﻼس Windowﻗﺮار ﻣﻲ دﻫﻴﻢ. ;public int Left ;public int Top ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ از اﻳﻦ ﻛﻼس ﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ ،ﺣﺘﻤﺎً ﻣﺘﺪي ﺑﻪ ﻧﺎم DrawWindowداﺷﺘﻪ ﺑﺎﺷـﻨﺪ ﺗـﺎ آﻧﻬﺎ را در ﻓﺮم رﺳﻢ ﻛﻨﺪ .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﮔﻔﺘﻢ اﻳﻦ ﻣﺘﺪ ﺑﺮاي ﻫﺮ ﻛﻨﺘﺮل ﻣﺘﻔـﺎوت اﺳـﺖ و ﻧﻤـﻲ ﺗـﻮاﻧﻴﻢ ﭘﻴـﺎده ﺳـﺎزي آن را در ﻛـﻼس Windowﻗﺮار دﻫﻴﻢ ،ﺑﻨﺎﺑﺮاﻳﻦ آن را در ﻛﻼس ﭘﺎﻳﻪ ﺑﻪ ﺻﻮرت abstractﻣﻌﺮﻓﻲ ﻣﻲ ﻛﻨﻴﻢ ﺗـﺎ ﺗﻤـﺎم ﻛـﻼس ﻫـﺎﻳﻲ ﻛـﻪ از ﻛﻼس Windowﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ ﭼﻨﻴﻦ ﻣﺘﺪي را در ﺧﻮد اﻳﺠﺎد ﻛﻨﻨﺪ .ﺑﻪ اﻳﻦ ﺻﻮرت ﻣﻲ ﺗﻮاﻧﻴﻢ ﺗﻀﻤﻴﻦ ﻛﻨﻴﻢ ﻛﻪ ﺗﻤﺎم ﻛﻨﺘﺮل ﻫﺎﻳﻲ ﻛﻪ از ﻛﻼس Windowﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ داراي ﻣﺘﺪي ﺑﻪ ﻧﺎم DrawWindowﻫﺴﺘﻨﺪ ﻛﻪ آﻧﻬﺎ را در ﺻـﻔﺤﻪ رﺳـﻢ ﻣـﻲ ﻛﻨـﺪ. دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ اﮔﺮ ﻣﺘﺪي در ﻳﻚ ﻛﻼس ﺑﻪ ﻋﻨﻮان abstractﻣﻌﺮﻓﻲ ﺷﻮد ،آن ﻣﺘﺪ ﻧﺒﺎﻳﺪ ﺷﺎﻣﻞ ﻫﻴﭻ دﺳﺘﻮري ﺑﺎﺷـﺪ .ﺑـﻪ ﻋﺒـﺎرت دﻳﮕﺮ آن ﻣﺘﺪ ﻧﺒﺎﻳﺪ داراي ﭘﻴﺎده ﺳﺎزي ﺑﺎﺷﺪ.
٣٩٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
// Simulates drawing the window // Notice: NO implementation ;)(abstract public void DrawWindow در اﻧﺘﻬﺎ ﻧﻴﺰ ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﺑﺮاي اﻳﻦ ﻛﻼس اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﻣﻘﺪار اوﻟﻴﻪ ﻓﻴﻠﺪ ﻫﺎي Topو Leftرا ﻣﺸﺨﺺ ﻛﻨﺪ. // Constructor method to set // the initial value of fields )(public Window { ;this.Top = 0 ;this.Left = 0 } ﺣﺎل ﺑﺎﻳﺪ ﺑﺎ اﺳﺘﻔﺎده از ﻛﻼس ،Windowﻛﻨﺘﺮﻟﻬﺎي ﻣﻮرد ﻧﻈﺮﻣﺎن را اﻳﺠﺎد ﻛﻨﻴﻢ .اﺑﺘﺪا از ﻛﻨﺘﺮﻟﻲ ﻫﻤﺎﻧﻨﺪ ListBoxﺷـﺮوع ﻣـﻲ ﻛﻨﻴﻢ .ﺑﺮاي اﻳﻦ ﻛﺎر ﻛﻼﺳﻲ ﺑﻪ ﻧﺎم ListBoxاﻳﺠﺎد ﻛﺮده و ﻛﻼس Windowرا ﺑﻪ ﻋﻨﻮان ﻛﻼس ﭘﺎﻳـﻪ ي آن ﻣـﺸﺨﺺ ﻣـﻲ ﻛﻨﻴﻢ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺑﺨﺶ ﻓﻀﺎي ﻧﺎم ﮔﻔﺘﻢ ،ﻧﺎم ﻛﺎﻣﻞ اﻳﻦ ﻛﻼس ﺑﻪ ﺻـﻮرت Abstract_Demo.ListBoxاﺳـﺖ، ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ ﻛﻼس ListBoxﻣﺮﺑﻮط ﺑﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻛﻪ ﺑﻪ ﻧﺎم System.Windows.Forms.ListBox اﺳﺖ اﺷﺘﺒﺎه ﻧﺨﻮاﻫﺪ ﺷﺪ. در اﻳﻦ ﻛﻼس ﻓﻴﻠﺪ ﺟﺪﻳﺪي ﺑﻪ ﻧﺎم listBoxContentsاز ﻧﻮع رﺷﺘﻪ اي اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ ﺗﺎ ﻋﻼوه ﺑﺮ ﻣﻮﻗﻌﻴـﺖ ﻫـﺮ ﻟﻴـﺴﺖ ﺑﺎﻛﺲ ،ﻣﺤﺘﻮﻳﺎت آن را ﻧﻴﺰ ﺑﺘﻮاﻧﻴﻢ ﻧﮕﻬﺪاري ﻛﻨﻴﻢ و در ﻣﻮاﻗﻊ ﻣﻮرد ﻧﻴﺎز ﻧﻤﺎﻳﺶ دﻫﻴﻢ. // ListBox derives from Window public class ListBox : Window { private string listBoxContents; // new member variable ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﻣﺘﺪ ﺳﺎزﻧﺪه ﻧﻴﺰ در اﻳﻦ ﻛﻼس ﻗﺮار ﻣﻲ دﻫﻴﻢ ﺗﺎ ﻣﻘﺪار ﻓﻴﻠﺪ ﻫﺎ را ﺗﻨﻈﻴﻢ ﻛﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣـﺸﺎﻫﺪه ﻣـﻲ ﻛﻨﻴـﺪ اﻳـﻦ ﻣﺘـﺪ ﺳﺎزﻧﺪه ﻫﻤﺎﻧﻨﺪ ﻣﺘﺪﻫﺎي ﻣﻌﻤﻮﻟﻲ ﺳﻪ ﭘﺎراﻣﺘﺮ ﻣﻲ ﮔﻴﺮد :ﭘﺎراﻣﺘﺮ اول ﺑﺮاي ﺗﻌﻴﻴﻦ ﻓﺎﺻﻠﻪ ي ﻛﻨﺘـﺮل از ﺳـﻤﺖ ﭼـﭗ )ﻣﻘـﺪار ﻓﻴﻠـﺪ ،(Top ﭘﺎراﻣﺘﺮ دوم ﺑﺮاي ﺗﻌﻴﻴﻦ ﻓﺎﺻﻠﻪ ي ﻛﻨﺘﺮل از ﺑﺎﻻي ﻓﺮم )ﻣﻘﺪار ﻓﻴﻠﺪ (Leftو ﭘﺎراﻣﺘﺮ ﺳﻮم ﺑﺮاي ﺗﻌﻴﻴﻦ ﻣﺘﻨﻲ ﻛﻪ ﺑﺎﻳﺪ در ﻟﻴﺴﺖ ﺑـﺎﻛﺲ ﻗﺮار ﮔﻴﺮد )ﻣﻘﺪار ﺧﺎﺻﻴﺖ .(listBoxContentsﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮاﻧﻴﻢ در ﻫﻤﺎن اﺑﺘﺪاي اﻳﺠﺎد ﺷﻴﺊ از ﻛـﺎرﺑﺮ ﺑﺨـﻮاﻫﻴﻢ ﻛﻪ ﻣﻘﺪار اﻳﻦ ﻣﻮارد را ﺗﻌﻴﻴﻦ ﻛﻨﺪ. // constructor adds a parameter )public ListBox(int top,int left,string contents { ;Top = top ;Left = left ;listBoxContents = contents }
٣٩٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در اداﻣﻪ ي اﻳﻦ ﺿﻤﻴﻤﻪ ﺑﻪ ﻣﻌﺮﻓﻲ ﻣﻨﺎﺑﻊ آﻧﻼﻳﻦ و آﻓﻼﻳﻦ ﻣﻮﺟﻮد در اﻳﻦ زﻣﻴﻨﻪ ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ ﺗﺎ راﺣﺖ ﺗﺮ ﺑﺘﻮاﻧﻴﺪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳـﺪ ﻛـﻪ ﺑﻌﺪ از اﺗﻤﺎم اﻳﻦ ﻛﺘﺎب ﭼﮕﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ را اداﻣﻪ دﻫﻴﺪ.
ﻣﻨﺎﺑﻊ آﻧﻼﻳﻦ: اﺳﺎﺳﺎ ﭼﻨﺪﻳﻦ ﻫﺰار ﺳﺎﻳﺖ در اﻳﻨﺘﺮﻧﺖ وﺟﻮد دارﻧﺪ ﻛﻪ در اﻳﻦ زﻣﻴﻨﻪ ﻣﻄﺎﻟﺒﻲ را اراﻳﻪ ﻣﻲ دﻫﻨﺪ و ﻣﻲ ﺗﻮاﻧﻴﺪ از آﻧﻬﺎ ﺑﺮاي رﻓﻊ ﻣﺸﻜﻼت ﺧﻮد اﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﻫﺮ زﻣﺎن ﻛﻪ ﺑﻪ ﻣﺸﻜﻠﻲ در اﻳﻦ زﻣﻴﻨﻪ ﺑﺮﺧﻮرد ﻛﺮدﻳﺪ ،ﻣﻄﻤﺌﻦ ﺑﺎﺷﻴﺪ اﻓﺮاد ﺑﺴﻴﺎري در اﻳﻨﺘﺮﻧﺖ وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﻪ ﺷﻤﺎ ﺑﺮاي ﺣﻞ ﻣﺸﻜﻠﺘﺎن ﻛﻤﻚ ﺧﻮاﻫﻨﺪ ﻛﺮد .اﻳﻦ اﻓﺮاد ﻧﺎﺷﻨﺎﺧﺘﻪ ﻣﻤﻜﻦ اﺳﺖ اﻓﺮاد ﻣﺒﺘﺪي ﻣﺎﻧﻨﺪ ﺷﻤﺎ ﺑﺎﺷﻨﺪ ﻛﻪ ﺑـﺎ ﻣـﺸﻜﻠﻲ ﻫﻤﺎﻧﻨـﺪ ﻣـﺸﻜﻞ ﺷـﻤﺎ ﺑﺮﺧﻮرد ﻛﺮده ﺑﺎﺷﻨﺪ ،و ﻳﺎ اﻓﺮاد ﺣﺮﻓﻪ اي و ﻣﺘﺨﺼﺼﻲ ﺑﺎﺷﻨﺪ ﻛﻪ از ﺳﻄﺢ اﻃﻼﻋﺎت ﺑﺎﻻﻳﻲ ﺑﺮﺧـﻮردار ﺑﺎﺷـﻨﺪ .اﻳـﻦ ﻣـﺴﺌﻠﻪ ﭼﻴـﺰ ﻋﺠﻴﺒـﻲ ﻧﻴﺴﺖ .ﻛﺎﻓﻲ اﺳﺖ درك ﻛﻨﻴﺪ ﻛﻪ ﻫﺮ ﻓﺮدي در ﻫﺮ ﻣﺮﺣﻠﻪ اي ﻣﻲ ﺗﻮاﻧﺪ ﻳﻚ ﻣﺒﺘﺪي ﺑﺮاي ﻣﺮاﺣﻞ ﺑﺎﻻﺗﺮ ﺑـﻪ ﺷـﻤﺎر رود و ﻫﻤﭽﻨـﻴﻦ ﻫـﺮ ﻓﺮدي ﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﻣﺮاﺣﻞ ﻗﺒﻞ از ﺧﻮد ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻣﺘﺨﺼﺺ ﺟﻠﻮه ﻛﻨﺪ .ﺣﺘﻲ ﺧﻮد ﺷﻤﺎ ﻧﻴﺰ ﻣﻲ ﺗﻮاﻧﻴﺪ در اﻳﻦ ﻧﻮع ﺳﺎﻳﺘﻬﺎ ﺑﻪ ﻛﻤـﻚ اﻓﺮادي ﻛﻪ ﺗﺨﺼﺺ ﻛﻤﺘﺮي ﻧﺴﺒﺖ ﺑﻪ ﺷﻤﺎ دارﻧﺪ ﺑﭙﺮدازﻳﺪ و ﻣﺸﻜﻼت )ﻫﺮ ﭼﻨﺪ ﺳﺎده ي( آﻧﻬﺎ را ﺑﺮ ﻃﺮف ﻛﻨﻴﺪ .در ﻟﻴﺴﺖ زﻳﺮ ﺳﻌﻲ ﻣـﻲ ﻛﻨﻴﻢ ﻣﻬﻤﺘﺮﻳﻦ ﻣﻨﺎﺑﻊ و ﺳﺎﻳﺘﻬﺎي اﻳﻨﺘﺮﻧﺘﻲ ﻣﻮﺟﻮد را ﻣﻌﺮﻓﻲ ﻛﻨﻴﻢ .اﮔﺮ در اﻳﻦ ﺳﺎﻳﺘﻬﺎ ﻫﻢ ﻧﺘﻮاﻧﺴﺘﻴﺪ ﻣﺸﻜﻼت ﺧﻮد را ﺑﺮﻃﺮف ﻛﻨﻴﺪ ،ﻛﺎﻓﻲ اﺳﺖ ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻣﻮﺗﻮر ﺟﺴﺘﺠﻮ ﺑﻪ دﻧﺒﺎل ﭘﺎﺳﺦ ﺧﻮد ﺑﮕﺮدﻳﺪ .ﻗﻄﻌﺎ ﺑﻪ ﺳﺮﻋﺖ ﺟﻮاب ﺧﻮد را ﺧﻮاﻫﻴﺪ ﻳﺎﻓﺖ.
ﻣﻨﺎﺑﻊ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ: اﺣﺘﻤﺎﻻً ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﺳﺎﻳﺘﻬﺎﻳﻲ ﻛﻪ ﺑﻪ آن ﻣﺮاﺟﻌﻪ ﺧﻮاﻫﻴﺪ ﻛﺮد ،وب ﺳﺎﻳﺖ ﺷﺮﻛﺖ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺧﻮاﻫﺪ ﺑﻮد .اﻳﻦ ﺳﺎﻳﺖ ﺷﺎﻣﻞ ﻣﻨـﺎﺑﻊ و اﻃﻼﻋﺎت زﻳﺎدي در ﻣﻮرد .NETاﺳﺖ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﺳﺎﻳﺖ ﮔﺮوه ﻫﺎي ﺧﺒﺮي زﻳﺎدي در ﻣﻮرد ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎ اﺳﺘﻔﺎده از وﻳﮋوال 2005 C#وﺟﻮد دارد .ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻳﻦ ﮔﺮوه ﻫﺎي ﺧﺒﺮي ﻣﻲ ﺗﻮاﻧﻴﺪ از آدرس زﻳﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ: http://communities2.microsoft.com/communities/newsgroups/en -us/default.aspx ﻫﻤﭽﻨﻴﻦ در اﻳﻦ زﻣﻴﻨﻪ ﭼﻨﺪﻳﻦ ﺳﺎﻳﺖ دﻳﮕﺮ ﻛﻪ زﻳﺮ ﻣﺠﻤﻮﻋﻪ ي ﺳﺎﻳﺖ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻫﺴﺘﻨﺪ ﻧﻴﺰ وﺟﻮد دارﻧﺪ ﻛﻪ ﻣﻄﻤﺌﻨﺎ اﻃﻼﻋﺎت ﻣﻔﻴﺪي ﺑﺮاي ﺷﻤﺎ ﺧﻮاﻫﻨﺪ داﺷﺖ .ﻟﻴﺴﺖ زﻳﺮ ﺗﻌﺪادي از آﻧﻬﺎ را ﻣﻌﺮﻓﻲ ﻣﻲ ﻛﻨﺪ:
ﺳﺎﻳﺖ وﻳﮋوال اﺳﺘﻮدﻳﻮ :2005 http://lab.msdn.microsoft.com/vs2005/ ﻣﺴﺘﻨﺪات ﻣﺮﺑﻮط ﺑﻪ وﻳﮋوال اﺳﺘﻮدﻳﻮ :2005 http://lab.msdn.microsoft.com/library/ ﻛﺘﺎﺑﺨﺎﻧﻪ ي :MSDN http://msdn.microsoft.com/library/ ﺳﺎﻳﺖ :MSDN http://msdn.microsoft.com ﺳﺎﻳﺖ ﻣﻨﺎﺑﻊ ﻗﺎﺑﻞ داﻧﻠﻮد ﺑﺮاي :.NET http://msdn.microsoft.com/netframework/downloads/
٩٠٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﻨﺎﺑﻊ دﻳﮕﺮ: ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻞ ﻧﻴﺰ ﮔﻔﺘﻢ ،ﭼﻨﺪﻳﻦ ﻫﺰار ﺳﺎﻳﺖ در ﻣﻮرد وﻳﮋوال C# .NETو وﻳﮋوال 2005 C#در اﻳﻨﺘﺮﻧﺖ وﺟﻮد دارد. اﻳﻦ ﺳﺎﻳﺘﻬﺎ ﺷﺎﻣﻞ اﻃﻼﻋﺎﺗﻲ در ﻣﻮرد ﺳﻤﻴﻨﺎرﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ زﻣﻴﻨﻪ در ﺳﺮﺗﺎﺳﺮ دﻧﻴﺎ ،ﺧﺒﺮﻫﺎي ﺟﺪﻳﺪ در ﻣﻮرد .NETو وﻳﮋوال ،C# ﻣﻘﺎﻻت ﻣﺨﺘﻠﻒ در اﻳﻦ زﻣﻴﻨﻪ و ...ﻣﻲ ﺷﻮﻧﺪ .اﮔﺮ در اﻳﻦ ﻣﻮرد در اﻳﻨﺘﺮﻧﺖ ﺑﻪ ﺟﺴﺘﺠﻮ ﺑﭙﺮدازﻳﺪ ،ﺗﻌﺪاد زﻳﺎدي از ﺳﺎﻳﺘﻬﺎﻳﻲ را ﭘﻴﺪا ﺧﻮاﻫﻴـﺪ ﻛﺮد ﻛﻪ در اﻳﻦ ﺑﺎزه ﻓﻌﺎﻟﻴﺖ ﻣﻲ ﻛﻨﻨﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﺑﺎ ﺳﻪ ﺳﺎﻳﺖ اﻧﮕﻠﻴﺴﻲ ﻣﻬﻢ و ﻫﻤﭽﻨﻴﻦ ﻳﻚ ﺳﺎﻳﺖ ﻓﺎرﺳﻲ آﺷﻨﺎ ﺧﻮاﻫﻴﻢ ﺷﺪ. اوﻟﻴﻦ و ﻣﻬﻤﺘﺮﻳﻦ ﺳﺎﻳﺘﻲ ﻛﻪ در اﻳﻦ ﺑﺎره وﺟﻮد دارد ،ﺳﺎﻳﺖ www.gotdotnet.comاﺳﺖ ﻛﻪ ﻳﻜﻲ از زﻳﺮ ﻣﺠﻤﻮﻋﻪ ﻫـﺎي ﺳﺎﻳﺖ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود .اﻳﻦ ﺳﺎﻳﺖ داراي ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻔﻲ ﺑﺮاي ارﺳﺎل ﻣﻘﺎﻻت در ﻣﻮرد .NETو زﻣﻴﻨﻪ ﻫﺎي ﻣـﺮﺗﺒﻂ ﺑﻪ آن اﺳﺖ .ﻫﻤﭽﻨﻴﻦ اﻳﻦ ﺳﺎﻳﺖ داراي ﻗﺴﻤﺖ ﻓﻮروم و ﮔﻔﺘﮕﻮ در ﻣﻮرد ﻣﺴﺎﺋﻞ ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ در اﻳﻦ ﭘﻠﺖ ﻓﺮم اﺳـﺖ .اﮔـﺮ در زﻣﻴﻨﻪ ي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺸﻜﻠﻲ داﺷﺘﻴﺪ ،ﻫﻤﻮاره اﻓﺮادي در اﻳﻦ ﺳﺎﻳﺖ وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻛﻨﻨﺪ ﺗﺎ ﻣﺸﻜﻞ ﺧﻮد را ﺑﺮﻃﺮف ﻛﻨﻴﺪ. ﺣﺘﻲ ﻣﻤﻜﻦ اﺳﺖ ﻣﺸﻜﻞ ﺷﻤﺎ ﻗﺒﻞ از اﻳﻦ ﺑﺮاي ﻓﺮد دﻳﮕﺮي ﻧﻴﺰ ﺑﻪ وﺟﻮد آﻣﺪه ﺷﺪه و ﺑﻪ وﺳﻴﻠﻪ ي اﻓﺮادي رﻓﻊ ﺷﺪه ﺑﺎﺷﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﻣـﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﺟﺴﺘﺠﻮ در ﻣﻄﺎﻟﺐ اﻳﻦ ﺳﺎﻳﺖ ،اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز ﺧﻮد را ﺑﺪﺳﺖ آورﻳﺪ. ﺳﺎﻳﺖ دﻳﮕﺮي ﻛﻪ در زﻣﻴﻨﻪ ي C#وﺟﻮد دارد ،وب ﺳـﺎﻳﺖ www.csharp-corner.comاﺳـﺖ .اﻳـﻦ ﺳـﺎﻳﺖ داراي ﻣﻘﺎﻻت و ﻧﻤﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ارزﻧﺪه اي در ﻣﻮرد ﻣﺴﺎﺋﻞ و ﺟﻨﺒﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ زﺑﺎن C#اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺗﺎﺛﻴﺮ زﻳﺎدي در ﻳﺎدﮔﻴﺮي ﺷﻤﺎ داﺷﺘﻪ ﺑﺎﺷﺪ. وب ﺳﺎﻳﺖ ﻣﻬﻢ و ﻣﻔﻴﺪ دﻳﮕﺮي ﻛﻪ در اﻳﻦ زﻣﻴﻨﻪ وﺟﻮد دارد ،ﺳـﺎﻳﺖ www.codeproject.comاﺳـﺖ .در اﻳـﻦ ﺳـﺎﻳﺖ داراي ﺑﺎﻟﻎ ﺑﺮ ﻳﺎزده ﻫﺰار ﻣﻘﺎﻟﻪ ،ﻧﻤﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ،اﺧﺒﺎر و ...اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺷﻤﺎ در ﻳـﺎدﮔﻴﺮي ﻣﻄﺎﻟـﺐ ﺟﺪﻳـﺪ در ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ C# ﻛﻤﻚ ﻛﻨﺪ. وب ﺳﺎﻳﺖ ﻓﺎرﺳﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ) ، (www.barnamenevis.orgﻳﻜﻲ از ﺳﺎﻳﺘﻬﺎي ﺗﺨﺼﺼﻲ در زﻣﻴﻨﻪ ي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ .اﻳﻦ ﺳﺎﻳﺖ ﺑﺎ ﺗﺎﻻرﻫﺎي ﮔﻔﺘﮕﻮ ﺑﺮاي زﻣﻴﻨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ و داﺷـﺘﻦ ﺣـﺪود ﻧـﻮزده ﻫـﺰار ﻛـﺎرﺑﺮ ،ﻳﻜـﻲ از ﺑﺰرﮔﺘـﺮﻳﻦ ﺳﺎﻳﺘﻬﺎي ﺗﺨﺼﺼﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ زﺑﺎن ﻓﺎرﺳﻲ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود .اﮔﺮ در اﺳﺘﻔﺎده از ﺳﺎﻳﺘﻬﺎي ﻗﺒﻠﻲ ﺑﻪ ﻋﻠﺖ زﺑﺎن آﻧﻬﺎ ﺑﺎ ﻣﺸﻜﻞ ﻣﻮاﺟﻪ ﺷﺪﻳﺪ ،اﻳﻦ ﺳﺎﻳﺖ و اﻓﺮادي ﻛﻪ در آن وﺟﻮد دارﻧﺪ ﻳﻜﻲ از ﺑﻬﺘﺮﻳﻦ ﮔﺰﻳﻨﻪ ﻫﺎ ﺑﺮاي ﺣﻞ ﻣﺸﻜﻞ ﺷﻤﺎ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮﻧﺪ. اﻟﺒﺘﻪ ﺳﺎﻳﺘﻬﺎﻳﻲ ﻛﻪ در اﻳﻦ ﻗﺴﻤﺖ ﻣﻌﺮﻓﻲ ﺷﺪ ﻓﻘﻂ ﺑﺨﺸﻲ از ﺳﺎﻳﺘﻬﺎﻳﻲ ﺑﻮدﻧﺪ ﻛﻪ در اﻳﻦ زﻣﻴﻨﻪ وﺟﻮد دارﻧﺪ .ﺑﻌﻀﻲ از ﺷﻤﺎ ﻣﻤﻜـﻦ اﺳـﺖ ﺗﺮﺟﻴﺢ دﻫﻴﺪ ﻓﻘﻂ از اﻳﻦ ﭼﻨﺪ ﺳﺎﻳﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺑﺮﺧﻲ دﻳﮕﺮ ﻧﻴﺰ ﻣﻤﻜﻦ اﺳﺖ ﺑﺨﻮاﻫﻴﺪ در اﻳﻨﺘﺮﻧﺖ ﺑﻪ دﻧﺒﺎل ﺳﺎﻳﺘﻬﺎي دﻳﮕﺮي ﮔﺸﺘﻪ و آﻧﻬﺎ را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﺪ .اﻧﺘﺨﺎب اﻳﻦ ﻣﻮرد ﻛﻪ از ﭼﻪ ﺳﺎﻳﺘﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ﻓﻘﻂ ﺑﻪ ﺷﻤﺎ ﺑﺴﺘﮕﻲ دارد ،اﻣﺎ ﻣﻬﻢ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺪاﻧﻴﺪ اﻳﻨﺘﺮﻧﺖ ﻣﻲ ﺗﻮاﻧﺪ ﻧﻘﺶ ﺑﻪ ﺳﺰاﻳﻲ در ﺳﻄﺢ ﻳﺎدﮔﻴﺮي ﻣﻄﺎﻟﺐ و ﻫﻤﭽﻨﻴﻦ ﺗﻨﻮع آﻧﻬﺎ داﺷﺘﻪ ﺑﺎﺷﺪ.
٩٠١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺿﻤﻴﻤﻪ :2ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺠﺎري و ﭼﻨﺪ ﻻﻳﻪ در .NET در ﻣﻌﺮﻓﻲ .NETﻣﻲ ﺗﻮان ﮔﻔﺖ ﻛﻪ .NETﺷﺎﻣﻞ ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ از ﺗﻜﻨﻮﻟﻮژي ﻫﺎ و ﻧﻴﺰ ﻳﻚ ﻧﻤﻮﻧـﻪ ﺟﺪﻳـﺪ ﺑـﺮاي ﻃﺮاﺣـﻲ و ﺗﻮﺳﻌﻪ ﻧﺮم اﻓﺰار ﻣﻲ ﺷﻮد .NET .ﻓﻘﻂ ﻳﻚ ﻣﺤﻴﻂ ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ﺟﺪﻳﺪ ﻧﻴﺴﺖ ،ﺑﻠﻜﻪ ﻳﻚ دﻧﺒﺎﻟﻪ ي ﻛﺎﻣﻞ از ﺳﺮور ﻫﺎ و ﺳﺮوﻳﺲ ﻫﺎ اﺳﺖ ﻛﻪ ﺑﺮاي ﺣﻞ ﻣﺸﻜﻼت ﺗﺠﺎري اﻣﺮوزه ﺑﻪ ﺻﻮرت ﻣﻮازي ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ .در ﻃﻲ ﻓﺼﻮل اﻳﻦ ﻛﺘﺎب ،ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺤﺖ .NETو ﻧﻴﺰ ﺗﻌﺪادي از ﺗﻜﻨﻮﻟﻮژي ﻫﺎﻳﻲ ﻛﻪ در آن ﺑﻪ ﻛﺎر رﻓﺘﻪ اﺳﺖ آﺷﻨﺎ ﺷﺪﻳﻢ و آﻧﻬﺎ را ﺑﻪ ﻃﻮر ﻋﻤﻠﻲ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار دادﻳـﻢ .اﻣـﺎ در اﻳﻦ ﺿﻤﻴﻤﻪ ﺳﻌﻲ ﻣﻲ ﻛﻨﻢ ﺑﺎ ﻧﮕﺮﺷﻲ ﻣﺘﻔﺎوت .NETرا ﺑﺮرﺳﻲ ﻛﺮده و ﺑﻌﺪ از ﻣﻌﺮﻓﻲ آن ،دﻟﻴﻞ اﻳﺠﺎد و اﺑـﺪاع .NETرا ﺑﺮرﺳـﻲ ﻛﻨﻢ. ﺑﻪ راﺣﺘﻲ ﻣﻲ ﺗﻮان درﻳﺎﻓﺖ ﻛﻪ ﭘﻮﺷﺶ دادن ﺗﻤﺎم ﺗﻜﻨﻮﻟﻮژي ﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي اراﺋﻪ ﻳﻚ ﻣﺪل و راه ﺣﻞ در .NETﻣﻮرد ﻧﻴﺎز اﺳﺖ ﺣﺘـﻲ در ﻳﻚ ﻛﺘﺎب ﻧﻴﺰ ﻗﺎﺑﻞ ﮔﻨﺠﺎﻳﺶ ﻧﻴﺴﺖ .NET .ﻋﻼوه ﺑﺮ در ﺑﺮ داﺷﺘﻦ ﻧﺴﺨﻪ ﻫﺎي ﺟﺪﻳﺪ از ﺗﻜﻨﻮﻟﻮژي ﻫﺎي ﻗﺒﻠﻲ ،ﭼﻨﺪﻳﻦ ﺗﻜﻨﻮﻟـﻮژي ﺟﺪﻳﺪ را ﻧﻴﺰ ﺷـﺎﻣﻞ ﻣـﻲ ﺷـﻮد .اﻳـﻦ ﻣﺠﻤﻮﻋـﻪ ﺗﻜﻨﻮﻟـﻮژي ﻫـﺎ ﻋﺒﺎرﺗﻨـﺪ از .NET ،Windows XP ،SQL Server Enterprise Servicesو ﻫﻤﭽﻨﻴﻦ ﺗﻜﻨﻮﻟﻮژي ﻫﺎي اﺳﺘﺎﻧﺪارد ﻣﺜﻞ SOAPو .XML
ﭼﺮا .NET؟ ﻫﻤﺎﻧﻨﺪ ﻫﺮ ﺗﻜﻨﻮﻟﻮژي دﻳﮕﺮي .NET ،ﻧﻴﺰ ﺑﺎﻳﺪ ﻗﺒﻞ از اﻳﻨﻜﻪ ﺑﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﺑﺮرﺳﻲ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳـﻦ ﻗﺴﻤﺖ ﺳﻌﻲ ﻣﻲ ﻛﻨﻴﻢ ﺑﺎ ﻣﺰاﻳﺎي اﺳﺘﻔﺎده از .NETآﺷﻨﺎ ﺷﻮﻳﻢ .در اﺑﺘﺪا ﻧﮕﺎه ﻛﻮﺗﺎﻫﻲ ﺑﺮ ﻣﺸﻜﻼﺗﻲ ﺧﻮاﻫﻴﻢ داﺷـﺖ ﻛـﻪ ﻣـﻲ ﺗـﻮان ﺑـﺎ .NETﺑﻪ اراﺋﻪ راه ﺣﻞ ﺑﺮاي آﻧﻬﺎ ﭘﺮداﺧﺖ.
ﻣﺸﻜﻼت ﺗﺠﺎري رﻓﻊ ﺷﺪه ﺗﻮﺳﻂ .NET از ﺑﺴﻴﺎري ﺟﻬﺎت دﻧﻴﺎي ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺷﺨﺼﻲ ﺑﺎ ﺣﺮﻛﺖ از ﺣﺎﻟﺖ ﻣﺤﺎﺳﺒﻪ ﺑﻪ ﺻﻮرت ﻣﺠﺰا و ﻧﻴﺰ اﻳﺴﺘﮕﺎه ﻫﺎي ﻛـﺎري ﻏﻴـﺮ ﻣـﺮﺗﺒﻂ ﺑـﻪ ﺳﻮي ﺷﺒﻜﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي و ﻧﻴﺰ راﺑﻄﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه /ﺳﺮوﻳﺲ دﻫﻨﺪه دﭼﺎر ﺗﻐﻴﻴﺮاﺗﻲ ﺷﺪه اﺳﺖ .ﺷﺒﻜﻪ ﻫﺎي ﺳﺮوﻳﺲ دﻫﻨـﺪه ﻓﺎﻳﻞ و ﻳﺎ ﭼﺎﭘﮕﺮ راﻫﻲ را ﺑﺮاي ﺑﻪ اﺷﺘﺮاك ﮔـﺬاري اﻃﻼﻋـﺎت ﺑـﺎ ﻣـﺪﻳﺮﻳﺖ ﻣﺮﻛـﺰي ﻓـﺮاﻫﻢ ﻣـﻲ ﻛﻨـﺪ .ﺗﻮﻟـﺪ ﺳﻴـﺴﺘﻢ ﻫـﺎي ﺳـﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه ﺑﻪ ﻛﺎﻫﺶ ﺣﺠﻢ ﻛﺎر از روي ﺳﻴﺴﺘﻢ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه و اﻧﺘﻘﺎل آن ﺑﻪ ﺳـﺮور ﻫـﺎ ،و ﻧﻴـﺰ اﻓـﺰاﻳﺶ ﻛـﺎراﻳﻲ و ﻗﺎﺑﻠﻴﺖ اﻋﺘﻤﺎد در ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻛﻤﻚ ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ ﻛﺮد .در اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﺪﻳﺮان ﺳﻴﺴﺘﻢ ﻧﻤﻲ ﺗﻮاﻧﺴﺘﻨﺪ ﺑـﻪ ﻛـﺎﻣﭙﻴﻮﺗﺮ ﻫـﺎي ﺳـﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﺮاي ﻣﺪﻳﺮﻳﺖ و اداره ﻓﺎﻳﻠﻬﺎي ﻣﻮﺟﻮد اﻋﺘﻤﺎد ﻛﻨﻨﺪ ،زﻳﺮا ﻣﻤﻜﻦ ﺑﻮد اﻳﻦ ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫﺎ ﺑﻪ ﻫﺮ دﻟﻴﻠﻲ از ﻛﺎر ﺑﺎﻳﺴﺘﻨﺪ و ﺑﺎﻋـﺚ ﺧﺮاﺑـﻲ داده ﻫﺎي ﻣﻮﺟﻮد ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺎ اﺳﺘﻔﺎده از اﻳﻦ ﺳﺮوﻳﺲ ﻫﺎ اﻳﻦ اﻃﻤﻴﻨﺎن اﻳﺠﺎد ﻣﻲ ﺷﺪ ﻛﻪ ﺳـﺮوﻳﺲ ﮔﻴﺮﻧـﺪه ﻣﺤـﺪود ﺑـﻪ درﻳﺎﻓـﺖ و ﻣﺸﺎﻫﺪه ي ﻓﺎﻳﻠﻬﺎ و اﺳﺘﻔﺎده از آﻧﻬﺎ اﺳﺖ و ﺳﺮور ﻫﺎ ﻛﺎرﻫﺎي اﺻﻠﻲ را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ .اﻳﻦ ﻣﻮرد ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﻗﺎﺑﻠﻴﺖ اﻋﺘﻤﺎد ﺑﻪ ﺑﺮﻧﺎﻣـﻪ ﻫﺎ ﻣﻲ ﺷﺪ ،زﻳﺮا اﺣﺘﻤﺎل رخ دادن ﺧﺮاﺑﻲ در آﻧﻬﺎ ﺑﻪ ﺷﺪت ﻛﺎﻫﺶ ﭘﻴﺪا ﻣﻲ ﻛﺮد. اوﻟﻴﻦ ﺷﺒﻜﻪ ﻫﺎي ﻛﺎﻣﭙﻴﻮﺗﺮي ﺷﺎﻣﻞ ﺳﺮورﻫﺎي ﻓﺎﻳﻞ و ﭼﺎﭘﮕﺮ ﺑﻪ ﻫﻤﺮاه ﻳﻚ ﺳﻴﺴﺘﻢ ﻣﺘﻤﺮﻛﺰ ﺑـﺮاي اﺷـﺘﺮاك اﻃﻼﻋـﺎت و ﻧﻴـﺰ ﻣـﺪﻳﺮﻳﺖ ﺷﺒﻜﻪ ﺑﻮد ) ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ( .اﻣﺎ اﻳﻦ ﻣﺪل ﻓﻘﻂ ﺷﺎﻣﻞ اﺷﺘﺮاك ﻓﺎﻳﻞ و ﭼﺎﭘﮕﺮ از ﻃﺮﻳﻖ ﺷـﺒﻜﻪ ﺑـﻮد .ﺑﺮﻧﺎﻣـﻪ ي اﺻـﻠﻲ در ﺣﻘﻴﻘـﺖ ﺑـﻪ ﺻﻮرت ﻛﺎﻣﻞ در ﻗﺴﻤﺖ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻋﻤﻞ ﻛـﺮد و ﻓﻘـﻂ از ﻣﺰاﻳـﺎي ﻣﺸﺨـﺼﻲ از ﺳـﺮوﻳﺲ ﻫـﺎي ﻣﻮﺟـﻮد در ﻣـﺪل ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه اﺳﺘﻔﺎده ﻣﻲ ﻛﺮد.
٩٠٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺪل ﻗﺪﻳﻤﻲ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه – در اﻳﻦ ﻣﺪل ﻓﻘﻂ داده ﻫﺎ از ﺳﺮور درﻳﺎﻓﺖ ﻣﻲ ﺷﺪ ،اﻣﺎ ﺑﺮﻧﺎﻣﻪ ي اﺻﻠﻲ ﺑﻪ وﺳﻴﻠﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻛﻨﺘﺮل ﻣﻲ ﺷﺪ ﻣﺸﻜﻼت اﻳﻦ ﻧﻮع ﺳﻴﺴﺘﻢ ﻫﺎي ﻣﺘﻤﺮﻛﺰ ﺷﺎﻣﻞ ﻣﻮاردي از ﻗﺒﻴﻞ ﻓﻘﺪان ﻛﺎراﻳﻲ و ﻳﺎ ﺧﺮاﺑﻲ و از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻲ ﺷـﻮﻧﺪ .ﻓﻘـﺪان ﻛﺎراﻳﻲ ﺑﻪ اﻳﻦ دﻟﻴﻞ ﺑﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻤﺖ ﻛﺎرﺑﺮ ﺑﺎﻳﺴﺘﻲ ﺗﻤﺎﻣﻲ ﻣﺤﺎﺳﺒﺎت ﻣﻮرد ﻧﻴﺎز را اﻧﺠﺎم ﻣﻲ دادﻧـﺪ .ﺑـﻪ ﻋﻠـﺖ رﻳـﺴﻚ ﺛﺎﺑـﺖ و ﻫﻤﻴﺸﻪ ﻣﻮﺟﻮد ﻧﺎ ﭘﺎﻳﺪاري ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ,1ﭘﺘﺎﻧﺴﻴﻞ ﺧﺮاﺑﻲ اﻃﻼﻋﺎت ﻧﻴﺰ ﺑﺎﻻ ﺑﻮد .اﮔﺮ ﻣﻮﻗﻊ دﺳﺘﻜﺎري ﻓﺎﻳـﻞ ﺑـﺮ روي ﺳـﺮور ارﺗﺒـﺎط ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه از ﺷﺒﻜﻪ ﻗﻄﻊ ﻣﻲ ﺷﺪ ﺑﺮﻧﺎﻣﻪ ﻳﺎ اﻃﻼﻋﺎت ﻓﺎﻳﻞ ﺑﻪ راﺣﺘﻲ ﺗﺨﺮﻳﺐ ﻣﻲ ﺷﺪﻧﺪ. ﺑﻨﺎﺑﺮاﻳﻦ ﻣﺪل ﻗﺪﻳﻤﻲ را ﺗﺼﺤﻴﺢ ﻛﺮدﻧﺪ و ﻣﺪﻟﻲ ﻣﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ را اراﺋﻪ دادﻧﺪ .ﻣﺪل ﺗﺼﺤﻴﺢ ﺷﺪه ي ﺳﺮوﻳﺲ ﮔﻴﺮﻧـﺪه/ﺳـﺮوﻳﺲ دﻫﻨـﺪه ﻫﺮﮔﺰ ﺑﻪ ﻛﺎرﺑﺮ اﺟﺎزه ﻧﻤﻲ داد ﻛﻪ ﺑﻪ ﺻﻮرت واﻗﻌﻲ ﺑﻪ اﻃﻼﻋﺎت ﻳﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ .ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻫﻴﭻ ﺗﻤﺎﺳﻲ ﺑﺎ ﻓﺎﻳـﻞ ﻳﺎ ﺑﺮﻧﺎﻣﻪ ي ﻣﻮرد اﺳﺘﻔﺎده ﻧﺪاﺷﺖ و اﻳﻦ ﻣﻮﺟﺐ ﻛﺎﻫﺶ ﻗﺎﺑﻞ ﺗﻮﺟﻪ رﻳﺴﻚ از دﺳﺖ رﻓﺘﻦ اﻃﻼﻋﺎت ﻣﻲ ﺷﺪ.
اﻳﻦ ﺷﻜﻞ ﻣﺪل ﺗﺼﺤﻴﺢ ﺷﺪه ي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ اﻣﺮوزه ﻳﻚ ﺳﺮور ﺗﻤﺎﻣﻲ ﺳﺮوﻳﺴﻬﺎي اﻳﻨﺘﺮﻧﺘﻲ ﻣﺮﺑﻮط ﺑﻪ ﺑﺮﻧﺎﻣﻪ از اﺣﺮاز ﻫﻮﻳﺖ ﻛﺎرﺑﺮ ﺗﺎ دﺳﺘﺮﺳﻲ ﺑﻪ داده ﻫﺎ را اﻧﺠﺎم ﻣﻲ دﻫﺪ .اﻳـﻦ اﻣـﺮ ﻣﺸﻜﻼت ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ را در ﻣﻘﻴﺎس ﻫﺎي ﻛﻮﭼﻚ اﻳﺠﺎد ﻧﻤﻲ ﻛﻨﺪ ،اﻣﺎ وﻗﺘﻲ ﻓﺮاواﻧﻲ درﺧﻮاﺳﺖ داده ﻫﺎ از ﺗﻮاﻧﺎﻳﻲ ﺳﺮور ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺗﺠﺎوز ﻛﺮد و ﺳﺮور ﺑﺮﻧﺎﻣﻪ ﺗﻘﺎﺿﺎ ﻫﺎﻳﻲ ﺑﻴﺸﺘﺮ از آﻧﭽﻪ ﺗﻮاﻧﺎﻳﻲ ﭘﺎﺳﺦ ﮔﻮﻳﻲ ﺑﻪ آﻧﻬﺎ دارد را درﻳﺎﻓﺖ ﻛﺮد ،ﻣـﺸﻜﻼت ﻋﻤـﺪه اي اﻳﺠـﺎد ﻣـﻲ ﺷﻮد .ﭘﺲ اﻳﻦ ﻣﺪل ﻧﻴﺰ داراي ﺿﻌﻒ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ در ﻣﺪﻟﻬﺎي ﺑﻌﺪي رﻓﻊ ﺧﻮاﻫﻨﺪ ﺷﺪ. و اﻣﺎ در ﻣﻮرد ﻗﺎﺑﻠﻴﺖ اﻃﻤﻴﻨﺎن .2اﮔﺮ ﻫﺮ ﺑﺨﺸﻲ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ در ﺑﻴﺸﺘﺮ ﺣﺎﻟﺘﻬﺎ ﺑﺮ روي ﺳﺮور ﻗﺮار ﻣﻲ ﮔﻴﺮد دﭼﺎر ﻧﻘﺺ ﺷﻮد ،ﺑﺮﻧﺎﻣﻪ از ﻛـﺎر اﻓﺘﺎده و ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ در ﺣﺎل ﻛﺎر ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻣﺬﻛﻮر ﻫﺴﺘﻨﺪ آﺳﻴﺐ ﻣﻲ ﺑﻴﻨﺪ .ﭘﺲ اﻳﻦ ﻣﺪل از ﻧﻈﺮ ﭘﺎﻳﺪاري ﻧﻴﺰ داراي ﻣﺸﻜﻼﺗﻲ اﺳﺖ. ﻣﺠﻤﻮﻋﻪ ﺗﻜﻨﻮﻟﻮژي ﻫﺎﻳﻲ ﻛﻪ در .NETوﺟﻮد دارﻧﺪ ﺷﺎﻣﻞ ﺗﻤﺎم ﻋﻮاﻣﻞ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﭘﻴﺎده ﺳﺎزي راه ﺣﻠﻬﺎي ﺗﺠـﺎري ،از اﺑﺰارﻫـﺎي ﻃﺮاﺣﻲ ﮔﺮﻓﺘﻪ ﺗﺎ ﺳﺮوﻳﺴﻬﺎي ﺗﺤﺖ وب ﻣﻲ ﺷﻮد .اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﻛﻪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﭘﺎﻳﺪاري ،ﻗﺎﺑﻠﻴﺖ اﻋﺘﻤـﺎد ،اﻧﻌﻄـﺎف ﭘـﺬﻳﺮي و ﻗـﺪرت ﻣﺪﻳﺮﻳﺖ ﻣﻴﺸﻮد ،ﺗﻤﺎم ﻣﺸﻜﻼت ﻣﺬﻛﻮر در ﻣﺪل ﻗﺒﻠﻲ را رﻓﻊ ﻣﻲ ﻛﻨﺪ .ﺑﺮاي ﻧﻤﻮﻧﻪ .NETﺳﺮور ﻫﺎ را از اﻳﻦ ﻣﺤـﺪودﻳﺖ ﻛـﻪ ﻓﻘـﻂ ﺑـﺎ ﻛﺎرﺑﺮان در ارﺗﺒﺎط ﺑﺎﺷﻨﺪ رﻫﺎ ﻣﻲ ﻛﻨﺪ و ﺑﻪ آﻧﻬﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﻋﻼوه ﺑﺮ ارﺗﺒﺎط ﺑﺎ ﻛﺎرﺑﺮان ،ﺑﺎ دﻳﮕﺮ ﺳﺮور ﻫﺎ ﻧﻴﺰ در ﭘﺸﺖ ﭘﺮده ارﺗﺒـﺎط داﺷﺘﻪ ﺑﺎﺷﺪ .ﺗﻌﺎﻣﻞ ﺳﺮور ﻫﺎ از ﻃﺮﻳﻖ وب ﺳﺮوﻳﺲ ﻫﺎي اراﺋﻪ ﺷﺪه ،ﻧﻤﻮﻧﻪ ﺧﻮﺑﻲ از اﻳﻦ زﻣﻴﻨﻪ ﻣﻲ ﺑﺎﺷﻨﺪ.
1ﻣﻤﻜﻦ ﺑﻮد ﺑﻪ ﻫﺮ دﻟﻴﻠﻲ ﺳﺮوﻳﺲ ﮔﻴﻨﺪه اي ﻛﻪ ﻛﺎرﺑﺮ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ از ﺷﺒﻜﻪ ﻗﻄﻊ ﺷﺪه و ﻳﺎ ﻣﺘﻮﻗﻒ ﺷﻮد. Reliability
2
٩٠٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﺮوري ﻛﻪ در ﻛﻨﺎر ﻛﺎر ﺑﺎ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﺎ دﻳﮕﺮ وب ﺳﺮوﻳﺲ ﻫﺎ ﻧﻴﺰ ﺗﻌﺎﻣﻞ دارد و از آﻧﻬﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ
ﻛﺎراﻳﻲ و ﻣﻘﻴﺎس ﭘﺬﻳﺮي: اﮔﺮ ﻳﻚ ﺳﻴﺴﺘﻢ ﻗﺪرت ﻣﻘﻴﺎس ﭘﺬﻳﺮي 1ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ ،ﻫﻴﭻ راﻫﻲ ﺑﺮاي ﺗﻬﻴﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﺗﻌﺪاد زﻳﺎدي ﻛﺎرﺑﺮ ﺑﻪ ﻃﻮر ﻫﻤﺰﻣﺎن ﭘﺎﺳﺦ دﻫﺪ ﻧﺨﻮاﻫﺪ ﺑﻮد .در ﺣﻘﻴﻘﺖ ،در ﺳﻴﺴﺘﻢ ﻫﺎي ﺳﺎزﻣﺎن ﻣﻘﻴﺎس ﻫﺮ ﭼﻪ ﻛﺎراﻳﻲ ﺳﻴﺴﺘﻢ ﻣﻬﻢ ﺑﺎﺷﺪ ،ﭘﺎﻳﺪاري و ﻣﻘﻴﺎس ﭘﺬﻳﺮي آن از اﻫﻤﻴﺖ ﺑﻴﺸﺘﺮي ﺑﺮﺧﻮردار ﺧﻮاﻫﺪ ﺑﻮد. در ﺗﻌﺮﻳﻒ ﻛﺎراﻳﻲ 2ﺳﻴﺴﺘﻢ ﻣﻴﺘﻮان ﮔﻔﺖ ﻛﻪ اﻳﻦ ﻋﺒﺎرت ﺑﻪ ﺗﻌﺪاد ﺳﻴﻜﻞ ﻫﺎﻳﻲ ﻛﻪ ﻳﻚ ﭘﺮدازﻧﺪه ﻧﻴﺎز دارد ﺗﺎ اﺟﺮاي ﻳﻚ ﻣﺘﺪ را ﺑـﻪ ﭘﺎﻳـﺎن ﺑﺮﺳﺎﻧﺪ اﻃﻼق ﻣﻲ ﺷﻮد .اﻣﺎ ﻣﻨﻈﻮر از ﻣﻘﻴﺎس ﭘﺬﻳﺮي ﺗﻌﺪاد ﻛﺎرﺑﺮاﻧﻲ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﺻـﻮرت ﻫﻤﺰﻣـﺎن ﻳـﻚ وﻇﻴﻔـﻪ ﺧـﺎص را در ﺳﺮور اﺟﺮا ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﻳﻚ ﻣﺘﺪ از ﺑﺮﻧﺎﻣﻪ ،اﻃﻼﻋﺎت ﺧﻮاﺳﺘﻪ ﺷﺪه را ﺑﺎ ﺳﺮﻋﺘﻲ ﺷﮕﻔﺖ اﻧﮕﻴﺰ ﺑﺎز ﻣﻴﮕﺮداﻧﺪ .ارزش اﻳﻦ ﻣﺘﺪ ﺑﻪ ﻋﻠﺖ ﺑﻪ ﻛﺎرﮔﻴﺮي ﺻﺪ درﺻﺪ ﭘﺮدازﻧﺪه اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ در ﺣﺎﻟﻲ ﻛﻪ ﻛﺎراﻳﻲ ﭼﻨﻴﻦ ﺳﻴﺴﺘﻤﻲ ﺧـﻮب اﺳـﺖ اﻣـﺎ ﻣﻘﻴـﺎس ﭘـﺬﻳﺮي آن ﺿﻌﻴﻒ اﺳﺖ ،زﻳﺮا ﭘﺮدازﻧﺪه ﺗﻨﻬﺎ ﻳﻚ ﻳﺎ دو ﻛﺎرﺑﺮ ﻫﻤﺰﻣﺎن ﻛﻪ درﺧﻮاﺳﺖ اﺟﺮاي ﻣﺘﺪ ﻣﺬﻛﻮر را دارﻧﺪ را ﻣﻲ ﺗﻮاﻧﺪ ﭘـﺸﺘﻴﺒﺎﻧﻲ ﻛﻨـﺪ .ﻣﻘﻴـﺎس ﭘﺬﻳﺮي ﻳﻚ ﺳﻴﺴﺘﻢ ﻛﺎﻣﻼً ﺑﻪ ﻣﻌﻤﺎري دروﻧﻲ ﺑﺮﻧﺎﻣﻪ واﺑﺴﺘﻪ اﺳﺖ.
ﻣﺰاﻳﺎي : .NET ﺑــﺮاي ﺗﻮﺳــﻌﻪ دﻫﻨــﺪﮔﺎن ﭘﺎﺳــﺦ ﺑــﻪ ﺳــﻮال "ﭼــﺮا .NET؟" در دو ﮔــﺮوه ﻣﺰاﻳــﺎي ﻣﻮﺟــﻮد در 3IDEﻣﺮﺑــﻮط ﺑــﻪ .NETو ﻧﻴــﺰ ﻣﻔﻬﻮم .NETﻗﺮار ﻣﻲ ﮔﻴﺮد. ﻳﻚ ﺳﺮي از ﺗﻜﻨﻮﻟﻮژي ﻫﺎي ﻣﻮﺟﻮد در .NETﺷﺎﻣﻞ ﻣﺠﻤﻮﻋﻪ اي از ﺗﻜﻨﻮﻟﻮژﻳﻬﺎﻳﻲ اﺳﺖ ﻛﻪ در ﺑﺮﻗﺮاري ارﺗﺒﺎط ﺑﻴﻦ ﭘﻠﺖ ﻓﺮم ﻫـﺎي ﮔﻮﻧﺎﮔﻮن ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ﻣﺎﻧﻨﺪ ﭘﺮوﺗﻜﻠﻬﺎي اﺳﺘﺎﻧﺪاردي ﻣﺜﻞ ،HTTPو ﻧﻴﺰ ﺗﻜﻨﻮﻟﻮژﻳﻬﺎﻳﻲ ﻛﻪ ﺑﻪ ﭘﻠﺖ ﻓـﺮم ﺧﺎﺻـﻲ واﺑـﺴﺘﻪ 4 ﻧﻴﺴﺘﻨﺪ ﻣﺜﻞ .XMLاﻳﻦ ﺗﻜﻨﻮﻟﻮژﻳﻬﺎ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﺳﻴﺴﺘﻢ ﻫﺎي اﻳﺠﺎد ﺷﺪه ﺑﺎ .NETﺑﺘﻮاﻧﻨﺪ ﺑﺎ ﺳﻴﺴﺘﻢ ﻫﺎي ﻗﺒﻠﻲ ﻣﺎﻧﻨـﺪ COM و 5CORBAاز ﻃﺮﻳﻖ وب ﺗﻌﺎﻣﻞ داﺷﺘﻪ ﺑﺎﺷﻨﺪ .ﺑﻪ ﻋﻼوه ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﺗﻮﺟﻪ ﺑﻪ ﭘﻠﺖ ﻓﺮﻣﻬﺎي ﻣﻘﺼﺪ ﻧﻴﺰ ﻫﻢ اﻛﻨﻮن رﻓـﻊ ﺷـﺪه اﺳـﺖ، ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﻲ ﺗﻮاﻧﻨﺪ از آن ﻟﺤﺎظ ﻧﮕﺮاﻧﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﻨﺪ و روي ﻧﻴﺎزﻫﺎي ﺗﺠﺎري ﺑﺮﻧﺎﻣﻪ ﺗﻤﺮﻛﺰ ﻛﻨﻨﺪ.
1
Scalability Performance 3 Integrated Development Environment 4 Component Object Model 5 Common Object Request Broker Architecture 2
٩٠٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻟﺒﺘﻪ ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ .NETﻳﻚ ﻫﺪف در ﺣﺎل ﺗﻐﻴﻴﺮ اﺳﺖ .اﮔﺮ ﭼﻪ ﺑﺴﻴﺎري از ﻣﻮاردي ﻛـﻪ اﻣـﺮوزه ﻣـﺎ از اﻳـﻦ ﺗﻜﻨﻮﻟـﻮژي ﻣﻴﺪاﻧﻴﻢ ﺗﻐﻴﻴﺮ ﻧﺨﻮاﻫﺪ ﻛﺮد ،اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ روز ﺑﻪ روز ﺗﻜﻨﻮﻟﻮژﻳﻬﺎي ﺟﺪﻳﺪ ﺗﺮي در ﺣﺎل ﺗﻮﺳﻌﻪ ﻫﺴﺘﻨﺪ ،ﺑﻪ ﻳﻘﻴﻦ اﻳﻦ ﻣﻮارد ﺑﻪ .NET اﺿﺎﻓﻪ ﺷﺪه و ﻳﺎ ﻣﻮاردي از آن ﺣﺬف ﺧﻮاﻫﻨﺪ ﺷﺪ. ﻗﺒﻞ از ﭘﻴﺪاﻳﺶ اﻳﻨﺘﺮﻧﺖ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﺒﺘﻨﻲ ﺑﺮ ﭼﻨﺪ ﻓﺮم وﻳﻨﺪوزي و ﺑﺪون ارﺗﺒﺎط ﺑﺎ ﺟﻬﺎن ﺧﺎرج ﺑﻮد .اﻣﺎ ﺑـﺎ ﭘﻴـﺪاﻳﺶ اﻳﻨﺘﺮﻧـﺖ ﺷـﺎﻫﺪ ﮔﺴﺘﺮش روزاﻓﺰون ﻧﺮم اﻓﺰارﻫﺎي ﺗﺤﺖ وب و ﻧﻴﺰ ﺗﺤﺖ ﺷﺒﻜﻪ ﻫﺴﺘﻴﻢ ﻛﻪ ﻣﻮﺟﺐ ﺗﻐﻴﻴﺮات ﺑﺴﻴﺎري در دﻧﻴﺎي اﻣﺮوزه ﺷﺪه اﻧﺪ. در ﮔﺬﺷﺘﻪ ﺑﻴﺸﺘﺮ ﺳﺎﻳﺘﻬﺎي وب ﺷﺎﻣﻞ ﺻﻔﺤﺎت اﻳﺴﺘﺎ ﺑﻮدﻧﺪ ﻛﻪ ﺑﺎ اراﺋﻪ ي ﭼﻨﺪﻳﻦ ﺻﻔﺤﻪ اﻃﻼﻋﺎت ﻛﻪ ﺑﻪ ﻳﻜـﺪﻳﮕﺮ ﻟﻴﻨـﻚ ﺷـﺪه ﺑﻮدﻧـﺪ، ﻧﻴﺎزﻫﺎي ﻛﺎرﺑﺮان را ﺑﺮﻃﺮف ﻣﻲ ﻛﺮدﻧﺪ .اﻣﺎ ﺑﺎ ﮔﺴﺘﺮش روز اﻓﺰون اﻳﻨﺘﺮﻧﺖ ﻛﺎرﺑﺮان ﻧﻴﺎز ﺑﻪ ﺻﻔﺤﺎت ﭘﻮﻳﺎﻳﻲ ﻛﻪ اﻃﻼﻋﺎت ﺧﺎص ﺧﻮدﺷـﺎن را ﻧﻤﺎﻳﺶ دﻫﺪ را روز ﺑﻪ روز ﺑﻴﺸﺘﺮ اﺣﺴﺎس ﻣﻲ ﻛﺮدﻧﺪ.
ﭘﺬﻳﺮش اﺳﺘﺎﻧﺪاردﻫﺎي ﻫﻤﮕﺎﻧﻲ: ﻳﻜﻲ ار ﻣﻬﻤﺘﺮﻳﻦ ﺟﻨﺒﻪ ﻫﺎي .NETﭘﺬﻳﺮش اﺳﺘﺎﻧﺪاردﻫﺎي ﺻﻨﻌﺘﻲ ﻫﻤﮕﺎﻧﻲ ﺗﻮﺳﻂ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ اﺳﺖ ﻛﻪ XMLﻳﻜـﻲ از ﻣﻬﻤﺘـﺮﻳﻦ آﻧﻬﺎ اﺳﺖ .ﺗﺼﻮر ﺑﺮﺧﻲ از اﻓﺮاد از اﻳﻦ ﻣﻮرد اﻳﻦ اﺳﺖ ﻛﻪ XMLﭘﻴﺸﺮﻓﺘﻪ ﺗﺮﻳﻦ ﺗﻜﻨﻮﻟﻮژي ﻋﺼﺮ ﺣﺎﺿﺮ اﺳﺖ ،ﻛﻪ ﻗﻄﻌﺎ اﻳﻦ اﻣﺮ ﺑﺮداﺷـﺘﻲ ﻧﺎدرﺳﺖ اﺳﺖ .اﻣﺎ XMLﻳﻜﻲ از ﺑﻬﺘﺮﻳﻦ راﻫﻬﺎي ﻣﻮﺟﻮد ﺑﺮاي ﻳﻜﭙﺎرﭼﻪ ﺳﺎزي ﺳﻴﺴﺘﻤﻬﺎي ﻧﺎ ﻣﺘﺠﺎﻧﺲ ﻣﺤﺴﻮب ﻣﻴﺸﻮد. ﺑﺰودي ﺗﻤﺎﻣﻲ ﺳﺮورﻫﺎي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﻪ ﻳﻚ ﺳﺮور .NETﺗﺒﺪﻳﻞ ﺧﻮاﻫﻨﺪ ﺷﺪ ﻛﻪ XMLو ﭘﻠﺖ ﻓﺮم .NETرا ﻛﺎﻣﻼً ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ وﺳﻴﻠﻪ ﭘﻴﺎده ﺳﺎزي ﭘﺮوﺗﻜﻠﻬﺎي اﺳﺘﺎﻧﺪارد ﺗﻮﺳﻂ اﻳﻦ ﺳﺮور ﻫﺎ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي اراﺋﻪ ﺷﺪه ﻣﺒﺘﻨﻲ ﺑﺮ ﺳﺮورﻫﺎي ﻣﺎﻳﻜﺮوﺳـﺎﻓﺖ ﻗﺪرت ﺗﻌﺎﻣﻞ ﺑﺎ ﭘﻠﺖ ﻓﺮﻣﻬﺎي دﻳﮕﺮ را ﻧﻴﺰ ﺧﻮاﻫﻨﺪ داﺷﺖ .در ﺟﺪول زﻳﺮ ﻟﻴﺴﺘﻲ از ﺳﺮور ﻫﺎي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ و ﻫﻤﭽﻨﻴﻦ ﺗﻮﺿﻴﺢ ﻛﺎرﺑﺮد آﻧﻬﺎ ذﻛﺮ ﺷﺪه اﺳﺖ. ﺳﺮور Microsoft Application Center Server 2000
Microsoft BizTalk Server 2000
Microsoft Commerce Server 2000
Microsoft Exchange Server 2000
Microsoft Host Integration 2000 Internet Security And Acceleration 2000 Microsoft SQL Server 2000
ﺷﺮح اﻳﻦ ﺳﺮور ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﻣﺒﺘﻨـﻲ ﺑـﺮ وب را ﺗﻮزﻳـﻊ ﻛﺮده و ﻫﻤﭽﻨﻴﻦ ﺳﺮور ﻫﺎ را ﺑﻪ ﺻﻮرت ﮔﺮوﻫـﻲ ﻣﺪﻳﺮﻳﺖ ﻣﻲ ﻛﻨﺪ. ﭘﺮدازش ﻫﺎي ﺗﺠﺎري را ﭘﻴﺎده ﺳﺎزي ﻣـﻲ ﻛﻨـﺪ و اﻃﻼﻋﺎت را ﺑـﻪ وﺳـﻴﻠﻪ ﻳـﻚ راﺑـﻂ اﺳـﺘﺎﻧﺪارد و ﭘﺬﻳﺮﻓﺘﻪ ﺷﺪه اراﺋﻪ ﻣﻲ دﻫﺪ. ﺑـﺮاي اﻳﺠــﺎد ﺑﺮﻧﺎﻣــﻪ ﻫـﺎي ﺗﺠــﺎرت اﻟﻜﺘﺮوﻧﻴــﻚ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد. ﻗﺎﺑﻠﻴﺖ اﻧﺠﺎم ﻣﺒﺎدﻻت از ﻃﺮﻳﻖ اﻳﻨﺘﺮﻧﺖ را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ. ﺗﻌﺎﻣﻞ ﺑﺎ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺑﺰرگ را ﺑﺮﻗﺮار ﻣﻲ ﻛﻨﺪ. ﺑﻪ ﻋﻨﻮان ﻳﻚ دﻳﻮار آﺗﺶ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ. ﺳﺮوﻳﺴﻬﺎي ﺗﺠﺰﻳـﻪ و ﺗﺤﻠﻴـﻞ و ﻧﻴـﺰ ﻧﮕـﻪ داري ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ را اراﺋﻪ ﻣﻲ دﻫﺪ.
٩٠٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﺮوﻳﺲ ﻫﺎي وب: ﻳﻜﻲ از ﻋﻮاﻣﻠﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﻛﺎﻣﻼً ﺟﺪﻳﺪ ﺑﻪ ﻧﻈﺮ ﺑﺮﺳﺪ وب ﺳﺮوﻳﺲ ﻫﺎ ﻫﺴﺘﻨﺪ .وب ﺳـﺮوﻳﺲ ﻫـﺎ در ﺣﻘﻴﻘـﺖ اﺻـﻮﻟﻲ ﻫـﺴﺘﻨﺪ ﻛـﻪ زﻳﺮﺳﺎﺧﺖ ﺑﻴﺸﺘﺮ اﺳﺘﺮاﺗﮋي ﻫﺎي .NETرا ﺗﺸﻜﻴﻞ ﻣﻲ دﻫﻨﺪ و ﺑﻪ ﺟﺮات ﻣﻲ ﺗﻮان ﮔﻔﺖ ﻛﻪ ﻫﺪف اﺻﻠﻲ از اﻳﺠﺎد .NETﺑـﻪ ﺷـﻤﺎر ﻣﻲ روﻧﺪ .وب ﺳﺮوﻳﺲ ﻫﺎ ﺳﺮوﻳﺲ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺤﺖ اﻳﻨﺘﺮﻧﺖ اراﺋﻪ ﺷﺪه و ﺗﻮﺳﻂ دﻳﮕﺮ وب ﺳـﺮوﻳﺲ ﻫـﺎ ﻳـﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ .وب ﺳﺮوﻳﺲ ﻫﺎ ﺑﺮﭘﺎﻳﻪ اﺑﺰارﻫﺎي اﺳﺘﺎﻧﺪارد ﻣﺜـﻞ XMLو HTTPﺗﻮﻟﻴـﺪ ﻣـﻲ ﺷـﻮﻧﺪ و ﻣﺴﺘﻘﻞ از ﭘﻠﺖ ﻓﺮم و ﻣﺤﻴﻂ ﺗﻮﻟﻴﺪ آﻧﻬﺎ ﻣﻲ ﺑﺎﺷﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي اﺳﺘﻔﺎده از آﻧﻬﺎ ﻧﻴﺎزي ﺑﻪ .NETﻧﻴﺴﺖ. ﺑﺎ ﺗﺮﻛﻴﺐ HTTPو XMLو ﺗﻮﻟﻴﺪ .NET,SOAPﻳﻚ راه ﺣﻞ ﻗﺎﺑﻞ اﻋﺘﻤﺎد را ﺑﺮاي ﺗﻮﺳﻌﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب اراﺋﻪ ﻣﻲ دﻫﺪ. اﺳﺘﺎﻧﺪارد SOAPﻛﻪ در ﺣﻘﻴﻘﺖ اﻧﺘﻘﺎل داده ﻫﺎي XMLﺑﻪ وﺳﻴﻠﻪ HTTPاﺳﺖ ،ﭘﺎﻳﻪ و اﺳﺎس ﺳـﺮوﻳﺲ ﻫـﺎي وب ﻣﺤـﺴﻮب ﻣـﻲ ﺷﻮد .ﻧﻪ ﺗﻨﻬﺎ SOAPﻣﻲ ﺗﻮاﻧﺪ از اﻣﻜﺎﻧﺎت COMﺑﻬﺮﻣﻨﺪ ﺷﻮد ﺑﻠﻜﻪ ﻗﺪرت ﺗﻌﺎﻣﻞ و اﺳـﺘﻔﺎده از ﻣﺰاﻳـﺎي اﺳـﺘﺎﻧﺪاردﻫﺎي دﻳﮕـﺮي ﻣﺜـﻞ CORBAرا ﻧﻴﺰ دارد.
وﻳﮋﮔﻲ ﻫﺎي ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ : Visual Stadio.NET ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻇﺎﻫﺮ VS.NETﻧﺴﺒﺖ ﺑﻪ ﻗﺒﻞ ﺗﻐﻴﻴﺮات ﻗﺎﺑﻞ ﻣﻼﺣﻈﻪ اي ﻛﺮده اﺳﺖ ،ﭘﻴﺸﺮﻓﺖ اﺻﻠﻲ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻋﻠـﺖ ﺗﻜﻨﻮﻟـﻮژي ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ ي .NETﺑﺮ ﭘﺎﻳﻪ آﻧﻬﺎ اﺳﺘﻮار اﺳﺖ .در ﺣﻘﻴﻘﺖ اﻳﻦ ﺗﻜﻨﻮﻟﻮژي ﻫﺎ اﺳﺖ ﻛـﻪ ﺑﺎﻋـﺚ ﺗﻮﻟﻴـﺪ ﺳـﺮﻳﻊ ﺑﺮﻧﺎﻣـﻪ ﻫﻤﺮاه ﺑﺎ ﭘﺎﻳﺪاري و ﻗﺎﺑﻠﻴﺖ اﻋﺘﻤﺎد ﻣﺤﻴﻂ ﻫﺎي ﺗﻮﺳﻌﻪ ﻛﻼﺳﻴﻚ ﻣﺎﻧﻨﺪ C++ﻣﻲ ﺷﻮد.
:Common Language Runtime ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﭘﻴﺸﺮﻓﺖ ﻫﺎي وﻳﮋوال اﺳﺘﻮدﻳﻮ اﺿﺎﻓﻪ ﺷﺪن ﻳﻚ ﻣﺤﻴﻂ ﻣﺪﻳﺮﻳﺖ زﻣﺎن اﺟﺮاي ﻣﺴﺘﻘﻞ از زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﺳﺖ ﻛـﻪ Common Language Runtimeﻳﺎ CLRﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد CLR .ﻗﺪرت ﻃﺮاﺣﻲ ﺑﻪ ﻫـﺮ زﺑـﺎﻧﻲ را در ﻳـﻚ ﻣﺤـﻴﻂ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻣﻲ دﻫﺪ ﻛﻪ ﻛﻤﺘﺮ دﭼﺎر ﻧﺸﺴﺖ ﺣﺎﻓﻈﻪ ﻣﻲ ﺷﻮد و ﻳﺎ ﺑﺎ ﻓﺮاﻫﻢ آوردن metadataﺑﺮاي ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ ﺑﻪ آﻧﻬـﺎ اﺟـﺎزه ﺧﻄﺎ ﻳﺎﺑﻲ و ﻳﺎ اﻣﻮر دﻳﮕﺮ را ﻣﻲ دﻫﺪ. وﻳﮋﮔﻲ ﻫﺎي ﻛﻨﺘﺮل ﻧﺴﺨﻪ ي ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻳﺎ اﻣﻨﻴﺖ آﻧﻬﺎ در ،CLRﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺻﻮرت ﻳﻚ ﺳﺮوﻳﺲ ﺑﺴﻴﺎر ﺳـﺎده ﺗـﺮ ﻣـﻲ ﻛﻨـﺪ. ﻫﻤﭽﻨﻴﻦ CLRﺑﺎﻋﺚ ﺳﺎدﮔﻲ و ﻧﻴﺰ ﺗﺴﺮﻳﻊ ﺗﻮﻟﻴﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب ﻧﺴﺒﺖ ﺑﻪ ﻧﺴﺨﻪ ﻫﺎي ﻗﺒﻠﻲ ﻣﻲ ﺷﻮد .در ﺑﺎره ي اﻳﻦ ﻗﺴﻤﺖ از .NET Frameworkدر ﺿﻤﻴﻤﻪ ي ﺑﻌﺪ ﺻﺤﺒﺖ ﺷﺪه اﺳﺖ.
زﺑﺎن ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ :.NET ﺑﺎ ﻇﻬﻮر .NETﻣﺎﻳﻜﺮوﺳﺎﻓﺖ زﺑﺎن C#را ﻛﻪ ﺗﺮﻛﻴﺒﻲ از ﻗﺪرت C++و راﺣﺘﻲ وﻳﮋوال ﺑﻴﺴﻴﻚ ﺑﻮد ﻣﻌﺮﻓﻲ ﻛﺮد اﻣﺎ ﺣﻘﻴﻘﺖ در ﻣـﻮرد دو زﺑﺎن اﺻﻠﻲ .NETﺑﺪﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ C#و وﻳﮋوال ﺑﻴﺴﻴﻚ از ﻟﺤﺎظ اﻣﻜﺎﻧﺎت ﺑﺴﻴﺎر ﻣﺸﺎﺑﻪ اﻧﺪ.
٩٠٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺗﻤﺎﻣﻲ زﺑﺎن ﻫﺎي .NETﻳﻚ زﻳﺮ ﻣﺠﻤﻮﻋﻪ از اﻣﻜﺎﻧﺎت CLRرا اراﺋﻪ ﻣﻲ دﻫﻨﺪ ،اﻣﺎ ﺳﻄﺢ ﭘﺸﺘﻴﺒﺎﻧﻲ آﻧﻬﺎ از CLRﻣﺘﻔـﺎوت اﺳـﺖ.1 ﺑﺮاي ﻃﺮاﺣﻲ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ اﻧﺘﺨﺎب زﺑﺎن ﺗﻔﺎوت ﭼﻨﺪاﻧﻲ ﻧﺪارد .اﻣﺎ ﺑﺎ وﺟﻮد ﻗﺎﺑﻠﻴﺖ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎ ﺑﻴﺶ از 20زﺑﺎن در .NETﻣـﻲ ﺗﻮان ﺑﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ اﻳﻨﻜﻪ ﺑﻌﻀﻲ از آﻧﻬﺎ ﺑﺮاي ﻣﺤﺎﺳﺒﺎت ﻋﻠﻤﻲ ﺑﺴﻴﺎر ﻣﻨﺎﺳﺐ اﻧﺪ و ﺑﻌﻀﻲ دﻳﮕﺮ ﺑﺮاي ﭘـﺮدازش ورودي/ﺧﺮوﺟـﻲ اﻳـﺪه آل ﻫﺴﺘﻨﺪ زﺑﺎن ﻣﻨﺎﺳﺒﻲ را ﺑﺮاي ﻧﻮﺷﺘﻦ ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﻧﺘﺨﺎب ﻛﺮد. ﻧﻜﺘﻪ :ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ C#و VBﻛﺎﻣﻼ ﺷﻲ ﮔﺮا ﻫﺴﺘﻨﺪ اﻣﺎ ﻣﻤﻜﻦ اﺳﺖ در ﺷﺮاﻳﻄﻲ VC++ﻛﺎراﻳﻲ ﺑﻴﺸﺘﺮي را اراﺋﻪ دﻫﺪ.
:Intermediate Language اﻳﻦ زﺑﺎن ﻛﻪ در .NETﻳﻚ زﺑﺎن ﺳﻄﺢ ﻣﻴﺎﻧﻲ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد ،ﻣﺴﺘﻘﻞ از ﺳﺎﺧﺘﺎر دروﻧﻲ ﭘﺮدازﻧﺪه اﺳﺖ .ﺗﻤﺎم ﻛﺪ ﻫﺎي .NETدر اﺑﺘﺪا ﺑﻪ اﻳﻦ زﺑﺎن ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﺷﻮﻧﺪ و ﺑﻪ ﻋﻠﺖ ﻣﺴﺘﻘﻞ ﺑﻮدن اﻳﻦ زﺑﺎن از ﭘﺮدازﻧﺪه ،ﻛﺎﻣﭙﻮﻧﻨﺖ ﺗﻮﻟﻴﺪي ﻣﻲ ﺗﻮاﻧﺪ ﻣﺴﺘﻘﻞ از ﭘﻠﺖ ﻓﺮم ﻋﻤﻞ ﻛﻨﺪ .از آﻧﺠﺎ ﻛﻪ ILﻧﻴﺰ دﺳﺘﻮراﻟﻌﻤﻞ ﻫﺎي ﺧﻮد را دارد ،ﻛﺪ ﻫﺎي ILﻗﺒﻞ از اﺟﺮا در ﻫﺮ ﭘﻠﺖ ﻓﺮﻣﻲ ﺑﺎﻳﺪ ﺑـﺎ اﺳـﺘﻔﺎده از ﻛﺎﻣﭙـﺎﻳﻠﺮ ﻫـﺎي ﻣﺨﺼﻮص آن ﭘﻠﺖ ﻓﺮم ﺑﻪ ﺻﻮرت دﺳﺘﻮرﻫﺎي ﭘﺮدازﻧﺪه ي ﻣﺤﻠﻲ در آﻳﺪ ﻛﻪ اﻳﻦ اﻣﺮ ﺗﻮﺳﻂ JITﺻﻮرت ﻣﻲ ﮔﻴﺮد.
ﺗﻜﺎﻣﻞ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻻﻳﻪ اي: ﻳﻜﻲ از ﻣﺰاﻳﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺒﺘﻨﻲ ﺑﺮ ﻛﺎﻣﭙﻮﻧﻨﺖ ،ﺗﻮاﻧﺎﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺮاي ﺗﻘﺴﻴﻢ ﻋﻤﻠﻜﺮد ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭼﻨﺪ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻗﺎﺑـﻞ ﻣـﺪﻳﺮﻳﺖ و ﻋﻤﻮﻣﻲ اﺳﺖ .اﻳﻦ اﻣﺮ ﺑﺎﻋﺚ اﺳﺘﻔﺎده ﻣﺠﺪد از ﻛﺪ و اﻧﻌﻄﺎف ﭘﺬﻳﺮي ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد .ﻫﻤﭽﻨﻴﻦ ﻳﻜﻲ از ﻣﺰاﻳﺎي اﺻـﻠﻲ اﻳـﻦ ﻣـﺪل ﻗـﺪرت ﺗﻘﺴﻴﻢ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭼﻨﺪ ﻻﻳﻪ ﻣﻮازي اﺳﺖ ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ ﺑﺮﻧﺎﻣﻪ را ﺑﺮ اﺳﺎس ﺳﺮوﻳﺲ ﻫﺎي آن ﺑﻪ ﭼﻨﺪ ﺑﺨﺶ ﻣﻨﻄﻘﻲ ﺗﻘﺴﻴﻢ ﻣﻲ ﻛﻨﺪ.
ﺗﻌﺮﻳﻒ: ﻳﻚ ﻻﻳﻪ ﺑﺮﻧﺎﻣﻪ 2ﺑﻪ ﻳﻚ ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺑﻪ ﺻﻮرت ﻣﻮازي ﺑﺎ دﻳﮕﺮ ﻗﺴﻤﺖ ﻫﺎ در ﺣﺎل ﺗﻌﺎﻣﻞ اﺳﺖ ﮔﻔﺘﻪ ﻣﻲ ﺷﻮد .ﻫﺮ ﻻﻳﻪ ي در ﺣﺎل ﻛﺎر در ﺑﺮﻧﺎﻣﻪ ،وﻇﻴﻔﻪ ﺧﺎﺻﻲ را اﻧﺠﺎم ﻣﻲ دﻫﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﭘﻴﺎده ﺳﺎزي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭼﻨﺪ ﻻﻳﻪ ﻋﺒﺎرت اﺳﺖ از ﺗﻘـﺴﻴﻢ ﻓﻴﺰﻳﻜـﻲ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭼﻨﺪ ﻗﺴﻤﺖ و ﺗﻮزﻳﻊ ﻫﺮ ﻗﺴﻤﺖ ﺑﺮ روي ﻳﻚ ﺳﺮور. ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻻﻳﻪ اي در ﺣﻘﻴﻘﺖ ﺑﺮاي ﺣﻞ ﺑﺴﻴﺎري از ﻣﺸﻜﻼت ﺑﺮﻧﺎﻣﻪ ﻫﺎي اﻣﺮوزي اﻳﺠﺎد ﺷﺪه اﺳﺖ .از اﻳﻦ دﺳﺘﻪ ﻣﺸﻜﻼت ﻣﻲ ﺗﻮان از ﻣﺪﻳﺮﻳﺖ ﻣﺘﻤﺮﻛﺰ ،ﻣﺤﺎﺳﺒﺎت ﺗﻮزﻳﻊ ﺷﺪه ،ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻣﻘﻴﺎس ﭘﺬﻳﺮي آﻧﻬﺎ ﻧﺎم ﺑﺮد.
ﻣﺪﻳﺮﻳﺖ ﻣﺘﻤﺮﻛﺰ: در ﻳﻚ ﻣﺤﻴﻂ ﻛﻪ ﺑﻪ ﺻﻮرت ﻣﺘﻤﺮﻛﺰ ﻣﺪﻳﺮﻳﺖ ﻣﻲ ﺷﻮد ،ﺗﻐﻴﻴﺮات ﻣﻮردﻧﻈﺮ در ﻳﻚ ﻗﺴﻤﺖ ﻣﺮﻛﺰي ﺻﻮرت ﻣﻲ ﮔﻴﺮﻧﺪ و اﻳﻦ ﺗﻐﻴﻴـﺮات ﺑـﻪ ﺳﺮﺗﺎﺳﺮ ﺳﻴﺴﺘﻢ ﺗﻮزﻳﻊ ﻣﻲ ﺷﻮﻧﺪ .ﻳﻚ ﺳﻴﺴﺘﻢ ﺑﺎ ﻣﺪﻳﺮﻳﺖ ﻣﺮﻛﺰي از ﺗﻌﺪاد ﻧﻘﺎط ﻣﺤﺪودﻳﺖ ﻗﺎﺑﻞ ﻣﺪﻳﺮﻳﺖ اﺳﺖ. 1ﺑﺮاي اﻃﻼﻋﺎت ﺑﻴﺸﺘﺮ در اﻳﻦ ﻣﻮرد ﺑﻪ ﺑﺨﺶ "ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ" در ﺿﻤﻴﻤﻪ ي ﺑﻌﺪ ﻣﺮاﺟﻌﻪ ﻛﻨﻴﺪ. Application Tier
2
٩٠٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﻧﻤﻮﻧﻪ ،MS Application Center 2000ﻳﻚ اﺑﺰار ﺑﺮاي ﺗﻮزﻳﻊ و ﻣﺪﻳﺮﻳﺖ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ،ﺳﻴﺴﺘﻤﻲ اﺳﺖ ﻛـﻪ از ﻣﺪﻳﺮﻳﺖ ﻣﺘﻤﺮﻛﺰ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ Application Center .ﺑﻪ ﻋﻠﺖ ﻣﺪﻳﺮﻳﺖ ﮔﺮوﻫﻲ ﺳﺮور ﻫﺎ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﻣﻘﻴﺎس ﭘﺬﻳﺮي و ﻗﺎﺑﻠﻴﺖ اﻋﺘﻤﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻲ ﺷﻮد .ﻗﺎﺑﻠﻴﺖ ﻣﻬﻤﺘﺮ اﻳﻦ ﺳﻴﺴﺘﻢ در اﻳﻦ اﺳﺖ ﻛﻪ اﮔﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ در ﭼﻨﺪ ﺳﺮور اﺟـﺮا ﺷـﻮد و ﺗﻤـﺎم آن ﺳﺮور ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ ي اﻳﻦ ﺳﻴﺴﺘﻢ ﺑﻪ ﺻﻮرت ﮔﺮوﻫﻲ ﻣﺪﻳﺮﻳﺖ ﺷﻮد ،ﻣﻲ ﺗﻮان از اﻳﻦ ﺳﻴـﺴﺘﻢ ﺑـﺮاي ﻣـﺪﻳﺮﻳﺖ ﻣﺮﻛـﺰي ﺑﺮﻧﺎﻣـﻪ ﻧﻴـﺰ اﺳﺘﻔﺎده ﻛﺮد. ﺳﻴﺴﺘﻢ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻣﺘﻤﺮﻛﺰ ،ﻋﻤﻮﻣﺎً ﻣﺪﻳﺮﻳﺖ ﻳﻚ ﮔﺮوه از ﺳﺮور ﻫﺎ را ﺑﻪ ﺳﺎدﮔﻲ ﻛﻨﺘﺮل ﻳﻚ ﺳﺮور ﻣﺴﺘﻘﻞ اﻧﺠﺎم ﻣﻲ دﻫﻨـﺪ و زﻣـﺎﻧﻲ ﻛﻪ ﻳﻜﻲ از ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﻴﺮ ﻛﻨﺪ ﻳﺎ ﺑﻪ روز ﺷﻮد ،اﻳﻦ ﺗﻐﻴﻴﺮات ﺑﻴﻦ ﺗﻤﺎم ﺳﺮور ﻫﺎﻳﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻣﺬﻛﻮر را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣـﻲ ﻛﻨﻨـﺪ ﺗﻮزﻳﻊ ﻣﻲ ﺷﻮد.
ﻣﺤﺎﺳﺒﺎت ﺗﻮزﻳﻊ ﺷﺪه: در ﻳﻚ ﻣﺤﻴﻂ ﻣﺤﺎﺳﺒﺎت ﺗﻮزﻳﻊ ﺷﺪه ،ﭘﺮدازش ﻫﺎ ﺑﻴﻦ ﭼﻨﺪ ﺳﻴﺴﺘﻢ و ﺣﺘﻲ در ﺻﻮرت ﻧﻴﺎز ﺑﻴﻦ ﭼﻨﺪ ﻣﻨﻄﻘﻪ ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮد .ﻫﺪف اﺻـﻠﻲ اﻳﻦ اﻣﺮ اﻓﺰاﻳﺶ ﻣﻘﻴﺎس ﭘﺬﻳﺮي و ﻛﺎراﻳﻲ ﺷﺒﻜﻪ ،اﻓﺰاﻳﺶ ﻗﺪرت و ﺗﺤﻤﻞ ﻧﻘﺺ اﺳﺖ.
ﻛﺎراﻳﻲ: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ﻣﻨﻈﻮر از ﻛﺎراﻳﻲ ﺗﻌﺪاد ﺳﻴﻜﻞ ﻫﺎي ﻣﺼﺮﻓﻲ ﺑﺮاي اﻧﺠﺎم ﻳﻚ وﻇﻴﻔﻪ ﺧﺎص اﺳﺖ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻳﻚ وﻇﻴﻔﻪ ﻣﻤﻜﻦ اﺳﺖ ﺑﻪ ﺳﺮﻋﺖ اﻧﺠﺎم ﺷﻮد ﻛﻪ اﻳﻦ اﻣﺮ ﺣﺎﻛﻲ از ﻛﺎراﻳﻲ ﻗﺎﺑﻞ ﻗﺒﻮل ﺑﺮﻧﺎﻣﻪ اﺳﺖ ،اﻣﺎ اﻳﻦ ﻛﺎراﻳﻲ ﺑﺎﻋﺚ ﻣﻘﻴﺎس ﭘﺬﻳﺮي ﺧﻮب ﺑﺮﻧﺎﻣﻪ ﻧﻤـﻲ ﺷﻮد .ﻛﺎرﺑﺮان ﻫﻤﻴﺸﻪ ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ را در زﻣﺎن ﭘﺎﺳﺦ ﮔﻮﻳﻲ آن ﻣﻲ داﻧﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻮﺑﻲ ﻣﻘﻴﺎس ﭘﺬﻳﺮ ﻧﺒﺎﺷﺪ ﻛﺎرﺑﺮ ﺗﺼﻮر ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻛﺎراﻳﻲ ﺧﻮﺑﻲ ﻧﺪارد .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ درك ﺗﻔﺎوت ﺑﻴﻦ ﻛﺎراﻳﻲ و ﻣﻘﻴﺎس ﭘﺬﻳﺮي از اﻫﻤﻴـﺖ ﺑـﺴﺰاﻳﻲ ﺑﺮﺧﻮردار اﺳﺖ.
ﻣﻘﻴﺎس ﭘﺬﻳﺮي: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ﻣﻨﻈﻮر از ﻣﻘﻴﺎس ﭘﺬﻳﺮي ﺗﻌﺪاد ﻛﺎرﺑﺮاﻧﻲ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻳﻚ وﻇﻴﻔﻪ ﺧﺎص را ﺑـﻪ ﺻـﻮرت ﻫﻤﺰﻣـﺎن از ﺳﻴـﺴﺘﻢ درﺧﻮاﺳﺖ ﻛﻨﻨﺪ .ﻧﻜﺘﻪ اﺻﻠﻲ در ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﻘﻴﺎس ﭘﺬﻳﺮ ،ﻃﺮاﺣﻲ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ ﺑﻪ ﺻﻮرﺗﻲ اﺳﺖ ﻛﻪ ﺑﺎ ﻛﻤﺘﺮﻳﻦ ﻣﻘﺪار اﺳـﺘﻔﺎده از ﻣﻨﺎﺑﻊ ،ﻳﻚ وﻇﻴﻔﻪ ﺧﺎص را اﺟﺮا ﻛﻨﺪ .ﻧﺘﻴﺠﻪ ي ﻣﻄﻠﻮب ﺑﺮﻧﺎﻣﻪ اي ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﻪ ﺗﻌﺪاد ﻣﻮردﻧﻈﺮ از ﻛﺎرﺑﺮان ،ﺑﻪ ﺻﻮرت ﻫﻤﺰﻣـﺎن و در ﻳﻚ زﻣﺎن ﻗﺎﺑﻞ ﻗﺒﻮل ﭘﺎﺳﺦ دﻫﺪ.
ﻗﻮاﻋﺪ و دﺳﺘﻮرات ﺗﺠﺎري: ﻣﻨﻈﻮر از ﻗﻮاﻋﺪ ﺗﺠﺎري در ﺣﻘﻴﻘﺖ ﻣﺤﺪودﻳﺖ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺗﺠﺎرت ﻣﻮردﻧﻈﺮ ﺑﺮ روي ﻳﻚ ﺑﺮﻧﺎﻣﻪ اﻋﻤﺎل ﻣﻲ ﻛﻨـﺪ .ﻛـﺎرﺑﺮد اﻳـﻦ ﻗﻮاﻋـﺪ ﺗﺠﺎري ﺑﺮ روي ﺟﺎﻣﻌﻴﺖ و ﻳﻜﭙﺎرﭼﮕﻲ اﻃﻼﻋﺎت ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد و ﻋﺪم اﺟﺮاي ﻛﺎﻓﻲ اﻳﻦ ﻗﻮاﻋﺪ ﻣﻮﺟﺐ ﺗﺎﺛﻴﺮات ﻣﻨﻔﻲ ﺑﺮﻧﺎﻣـﻪ
٩٠٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﻲ ﺷﻮد .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻣﻤﻜﻦ اﺳﺖ ﻳﻚ راه دﻗﻴﻖ ﺑﺮاي ﭘﻴﺎده ﺳﺎزي اﻳﻦ ﻗﻮاﻋﺪ وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ ،اﻣﺎ ﻫﻤـﻮاره راﻫﻬـﺎي ﻗﺎﺑـﻞ ﻗﺒـﻮﻟﻲ ﺑﺮاي اﺟﺮاي اﻳﻦ ﻗﻮاﻋﺪ ﺑﻪ ﺣﺪ ﻛﺎﻓﻲ وﺟﻮد دارد.
راﺣﺘﻲ ﻛﺎرﺑﺮ: در دﻧﻴﺎﻳﻲ ﻛﻪ درك ﺑﺼﺮي ﻳﻚ واﻗﻌﻴﺖ اﺳﺖ ،ﺻﺮف زﻣﺎن و ﻫﺰﻳﻨﻪ ﺑﺮ روي ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﻣﻌﻤﺎري و ﻗﺪرت ﺧﻮﺑﻲ دارﻧﺪ اﻣﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ ﻣﺸﻜﻞ اﺳﺖ ﺑﻲ ﺛﻤﺮ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺣﺘﻲ اﮔﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻛﺎراﻳﻲ ﺑﺴﻴﺎر ﺑﺎﻻﻳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ و ﺑﺘﻮاﻧﺪ ﺑـﻪ ﻃـﻮر ﻫﻤﺰﻣـﺎن ﺑـﻪ 100000 ﻛﺎرﺑﺮ ﭘﺎﺳﺦ دﻫﺪ ،اﻣﺎ ﻛﺎرﺑﺮان از اﺳﺘﻔﺎده از آن ﺑﺮﻧﺎﻣﻪ ﻧﻔﺮت داﺷﺘﻪ ﺑﺎﺷﻨﺪ ،ﻧﻤﻲ ﺗﻮان آن را ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﻗﺎﺑـﻞ ﻗﺒـﻮل داﻧـﺴﺖ .ﺑـﺎ وﺟـﻮد اﻳﻨﻜﻪ اﻳﻦ ﻣﻄﺎﻟﺐ در اﻳﻦ ﻗﺴﻤﺖ ﺑﺮرﺳﻲ ﻧﻤﻲ ﺷﻮد ،اﻣﺎ ﻣﺤﻴﻂ ﻫﺎي ﻃﺮاﺣﻲ .NETاﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﺑﺎ ﻇﺎﻫﺮ ﺑـﺴﻴﺎر زﻳﺒـﺎ را ﺗـﺎ ﺣـﺪ ﻣﻤﻜﻦ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺳﺎده ﻛﺮده اﻧﺪ.
ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ: ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ دو ﻻﻳﻪ ﻋﻤﻮﻣﺎً ﺑﻪ ﻋﻨﻮان ﻣﺪل ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه /ﺳﺮوﻳﺲ دﻫﻨﺪه ﻳﺎد ﻣﻲ ﺷﻮد و اﻳﻦ دو واژه ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻣﻌﺎدل اﻧﺪ .در ﻣﺪل دو ﻻﻳﻪ ،ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺗﻘﺎﺿﺎي اﻃﻼﻋﺎت ﻳﺎ ﺧﺪﻣﺎت را ﻣﺎﻧﻨﺪ ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ،ﺑﻪ ﻳﻚ ﺳﺮور ﻳﺎ ﺳﺮوﻳﺲ ﻣﻲ دﻫﺪ. در ﻣﺤﻴﻂ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه /ﺳﺮوﻳﺲ دﻫﻨﺪه ﻣﻌﻤﻮﻻ ﭘﺮدازش ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﻴﻦ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه و ﺳﺮوﻳﺲ دﻫﻨـﺪه ﺗﻘـﺴﻴﻢ ﻣـﻲ ﺷـﻮد. ﺑﺮﻧﺎﻣﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه راﺑﻂ ﻛﺎرﺑﺮ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و اﻃﻼﻋﺎت ﻻزم را از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .ﺑﺮﻧﺎﻣﻪ ﺳﺮور ﻫﻢ ﻣﻌﻤﻮﻻً ﺑـﺮ اﺳـﺎس اﻃﻼﻋﺎت درﻳﺎﻓﺖ ﺷﺪه از ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺧﺪﻣﺎت ﻣﻨﺎﺳﺒﻲ را اراﺋﻪ ﻣﻲ دﻫﺪ. ﺷﻜﻞ زﻳﺮ ﻳﻚ ﻧﻤﻮﻧﻪ از اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﺎ اﻳﻦ ﻛﻪ ﻣﺪل ﻧﻤﺎﻳﺶ داده ﺷﺪه در ﺷﻜﻞ ﻛـﺎﻣﻼً درﺳـﺖ اﺳـﺖ اﻣـﺎ در ﺣﺎﻟـﺖ واﻗﻌﻲ ﺗﻌﺪاد ﻛﺎرﺑﺮاﻧﻲ ﻛﻪ از ﻳﻚ ﺳﺮور اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﺑﻴﺸﺘﺮ از ﭼﻴﺰي اﺳﺖ ﻛﻪ در ﺷﻜﻞ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ.
ﻣﺪل دو ﻻﻳﻪ )ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه(
ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ: دو ﺟﻨﺒﻪ ي ﻣﺨﺘﻠﻒ در ﻣﺪﻳﺮﻳﺖ ﻛﺪ ﺑﺮاي ﻣﺤﻴﻂ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه /ﺳﺮوﻳﺲ دﻫﻨﺪه وﺟﻮد دارد ﻛـﻪ ﻋﺒـﺎرت اﻧـﺪ از ﻣـﺪﻳﺮﻳﺖ ﻛـﺪ در ﻗﺴﻤﺖ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه و ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﻗﺴﻤﺖ ﺳﺮوﻳﺲ دﻫﻨﺪه. ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﻗﺴﻤﺖ ﺳﺮور ﻫﺎ ﻋﻤﻮﻣﺎً واﺿﺢ و روﺷﻦ اﺳﺖ .ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺳﺮور ﻣﻮرد ﻧﻈﺮ ﻋﻀﻮ ﻳﻚ ﮔﺮوه از ﺳـﺮور ﻫـﺎ ﻧﻴـﺴﺖ ،ﺗﻮزﻳـﻊ ﺗﻐﻴﻴﺮات اﻋﻤﺎل ﺷﺪه ﺑﺮ روي ﻛﺪ ﻓﻘﻂ در ﻳﻚ ﻗﺴﻤﺖ اﻧﺠﺎم ﻣﻲ ﺷﻮد .اﻣﺎ اﮔﺮ ﺳﺮور ﻋﻀﻮ ﻳﻚ ﮔﺮوه از ﺳﺮور ﻫﺎ ﺑﺎﺷﺪ ،ﺗﻐﻴﻴﺮات ﺑـﻪ وﺟـﻮد ٩٠٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
آﻣﺪه در ﻛﺪ ﺑﺎﻳﺪ ﺑﻪ ﺻﻮرت دﺳﺘﻲ ﻳﺎ اﺗﻮﻣﺎﺗﻴﻚ ﺑﻪ ﺗﻤﺎم ﺳﺮور ﻫﺎ اﻋﻤﺎل ﺷﻮد ﻛﻪ ﻣﻌﻤﻮﻻ اﻳـﻦ اﻣـﺮ ﺑـﻪ وﺳـﻴﻠﻪ ﻧـﺮم اﻓﺰارﻫـﺎي ﻣـﺪﻳﺮﻳﺘﻲ ﻛﻼﺳﺘﺮي ﺳﺮور ﻫﺎ ﻣﺎﻧﻨﺪ MS Application Center 2000اﻧﺠﺎم ﻣﻲ ﺷﻮد. از ﺳﻮي دﻳﮕﺮ ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﺑﺨﺶ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻋﻤﻮﻣﺎً ﻣﺸﻜﻞ ﺗﺮ از ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﺳﺮور ﻫﺎ اﺳﺖ .ﺗﻤـﺎم ﺗﻐﻴﻴﺮاﺗـﻲ ﻛـﻪ در ﺑﺮﻧﺎﻣـﻪ اﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ ﺑﺎﻳﺪ ﺑﻪ ﺗﻤﺎم ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه اﻋﻤﺎل ﺷﻮد .ﭼﻨﻴﻦ ﺗﻮزﻳﻊ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺻﻮرت ﻫﻤﺰﻣﺎن ﺻﻮرت ﮔﻴﺮﻧﺪ ﻣﻌﻤﻮﻻً ﺑﻪ ﺳﻄﺢ ﺑﺎﻻﻳﻲ از ﻫﻤﺎﻫﻨﮕﻲ و ﺑﺮ اﺳﺎس ﻛﺎﻣﭙﻴﻮﺗﺮ ﻫﺎﻳﻲ ﻛﻪ ﺗﻐﻴﻴﺮات را درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ ﺑـﻪ ﻳـﻚ ﺑـﺴﺘﻪ ي ﻗﺎﺑـﻞ ﺗﻮزﻳـﻊ ﻣـﻮرد اﻃﻤﻴﻨﺎن ﻧﻴﺎز دارﻧﺪ. ﺗﻮزﻳﻊ ﻛﺪ در ﺑﺨﺶ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﺎ ﻣﺸﻜﻼت دﻳﮕﺮي ﻧﻴﺰ از ﻗﺒﻴﻞ ﻫﻤﺎﻫﻨﮕﻲ ﺑﺎ ﺳﺮور روﺑﺮو اﺳﺖ .ﺑﺮاي ﻣﺜﺎل ﺗﻐﻴﻴﺮاﺗﻲ ﻛـﻪ در ﺑﺮﻧﺎﻣـﻪ ي ﺳﺮور اﻋﻤﺎل ﻣﻲ ﺷﻮد ﻧﻴﺎز ﺑﻪ ﺑﺮوز رﺳﺎﻧﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه دارد و ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﺳـﺮوﻳﺲ ﮔﻴﺮﻧـﺪه ﺑـﺮوز ﻧﺸﻮد ﺑﺮﻧﺎﻣﻪ ﺳﺮور ﺑﺪون اﺳﺘﻔﺎده ﻣﻲ ﻣﺎﻧﺪ.
ﻛﺎراﻳﻲ: اﺳﺘﻔﺎده از ﻣﺪل ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه ﺑﺮ روي ﻛﺎراﻳﻲ ﺷﺒﻜﻪ ﻧﻴﺰ ﺗﺎﺛﻴﺮ ﻣﻲ ﮔﺬارد .در اﻳﻦ ﻣـﺪل ﺗﻤـﺎم ﺗﻘﺎﺿـﺎﻫﺎي اﻃﻼﻋـﺎت و ﺧﺪﻣﺎت ﺑﺎﻳﺴﺘﻲ از ﻃﺮﻳﻖ ﺷﺒﻜﻪ ﺑﻴﻦ ﺳﺮوﻳﺲ دﻫﻨﺪه و ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺟﺎ ﺑﻪ ﺟﺎ ﺷﻮد و اﻳﻦ اﻣﺮ ﺑﺎﻋﺚ ﻣﺤﺪودﻳﺖ در ﺷﺒﻜﻪ ﻣﻲ ﺷﻮد .اﻳﻦ ﻣﺸﻜﻞ زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮان زﻳﺎدي در ﺣﺎل اﺳﺘﻔﺎده از ﺳﻴﺴﺘﻢ ﺑﺎﺷﻨﺪ ﺑﻴﺸﺘﺮ ﻣﺸﻬﻮد ﺧﻮاﻫﺪ ﺑﻮد. ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎراﻳﻲ ﺷﺒﻜﻪ ﻧﺰول ﻛﻨﺪ ،ﺗﻘﺎﺿﺎﻫﺎي درﻳﺎﻓﺘﻲ ﺑﺮاي ﺧﺪﻣﺎت ﺻﻒ ﻣﻲ ﺷﻮﻧﺪ و وﻗﺘﻲ ﺗﻘﺎﺿﺎﻫﺎي در ﺣﺎل اﻧﺘﻈﺎر اﻓـﺰاﻳﺶ ﻳﺎﺑـﺪ ﺳﻴﺴﺘﻢ از ﻛﺎر ﻣﻲ اﻓﺘﺪ .در اﻳﻦ ﺣﺎل ﺗﻨﻬﺎ راه ﺣﻞ ﻗﻄﻊ ﻛﺮدن ﺗﻤﺎم ﻛﺎرﺑﺮان از ﺷﺒﻜﻪ ،ﺑﺎزﮔﺮداﻧﺪن ﺗﻤﺎم ﺗﺮاﻛﻨﺶ ﻫﺎ ﺑـﻪ ﺣﺎﻟـﺖ ﻗﺒﻠـﻲ و در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ راه اﻧﺪازي ﻣﺠﺪد ﺳﺮور اﺳﺖ. ﺑﺮﺣﺴﺐ ﭘﺮوﺗﻜﻞ ﻣﻮرد اﺳﺘﻔﺎده در ﺷﺒﻜﻪ ،ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه در ﺳﻄﺢ ﺟﻬﺎﻧﻲ ﻏﻴـﺮ ﻣﻤﻜـﻦ اﺳـﺖ .زﻳـﺮا ﻣﻤﻜﻦ اﺳﺖ ﺑﺮﻧﺎﻣﻪ ي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﺪ در ﻫﻤﺎن ﺷﺒﻜﻪ اي ﻗﺮار ﮔﻴﺮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺳﺮور ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ.
دﺳﺘﺮﺳﻲ داده ﻫﺎ: ﻫﻨﮕﺎم ارزﻳﺎﺑﻲ ﻛﺎراﻳﻲ ،دﺳﺘﺮﺳﻲ ﺑﻪ داده ﻫﺎ ﻧﻴﺰ ﺑﺎﻳﺪ ﻣﺪﻧﻈﺮ ﻗﺮار ﮔﻴﺮﻧﺪ .ﻧﻪ ﺗﻨﻬﺎ ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻧﻤﻲ داﻧﻨﺪ ﻛﻪ ﭼﮕﻮﻧـﻪ ﺑﻪ ﺳﺮور ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ وﺻﻞ ﺷﻮﻧﺪ ،ﺑﻠﻜﻪ ﺑﻴﺸﺘﺮ آﻧﻬﺎ اﺣﺘﻴﺎج ﺑﻪ ﻳﻚ ارﺗﺒﺎط اﺧﺘﺼﺎﺻﻲ ﺑﺎ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ دارﻧﺪ .اﻳـﻦ ﻣـﻮرد ﻛـﻪ ﺑـﺎزاي ﺗﻤﺎم ﻛﺎرﺑﺮان در ﺣﺎل ارﺗﺒﺎط ﺑﺎ ﺳﺮور ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺑﺎﻳﺪ ﻳﻚ اﺗﺼﺎل ﻓﻌﺎل ﺑﺮﻗﺮار ﺑﺎﺷﺪ ،ﭼﻪ از ﻧﻈﺮ ﻫﺰﻳﻨﻪ ﭘﺮداﺧﺘﻲ ﺑﺮاي ارﺗﺒﺎط ﺑﺎ ﺳﺮور ﭼﻪ از ﻧﻈﺮ ﻣﺪﻳﺮﻳﺖ ﻣﺮﺑﻮط ﺑﻪ اﺗﺼﺎﻻت ﭘﺮﻫﺰﻳﻨﻪ اﺳﺖ .ﻫﻤﭽﻨﻴﻦ اﻳﻦ اﺗﺼﺎﻻت ﻗﺎﺑﻠﻴﺖ ﺑﻪ اﺷﺘﺮاك ﮔﺬاﺷﺘﻪ ﺷﺪن ﺑﻴﻦ ﺑﺮﻧﺎﻣﻪ ﻫـﺎ را ﻧﺪارﻧـﺪ ﻛﻪ اﻳﻦ اﻣﺮ ﺗﺎﺛﻴﺮ ﻣﻨﻔﻲ ﺑﺮ ﻣﻘﻴﺎس ﭘﺬﻳﺮي ﺑﺮﻧﺎﻣﻪ دارد.
٩١٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻫﺮ ﺳﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﻪ اﺗﺼﺎل اﺧﺘﺼﺎﺻﻲ ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻧﻴﺎز دارﻧﺪ.
ﻗﻮاﻋﺪ ﺗﺠﺎري: در ﻣﺪل دو ﻻﻳﻪ ﻳﺎ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه ﻓﻘﻂ دو ﻗﺴﻤﺖ ﺑﺮاي اﻳﺠﺎد و اﺟﺮاي ﻗﻮاﻋﺪ ﺗﺠـﺎري وﺟـﻮد دارد :ﻗـﺴﻤﺖ ﺳـﺮوﻳﺲ ﮔﻴﺮﻧﺪه و ﻗﺴﻤﺖ ﺳﺮور ﻛﻪ ﺧﺪﻣﺎت ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ را اراﺋﻪ ﻣﻲ دﻫﺪ .اﻟﺒﺘﻪ اﺟﺮاي اﻳﻦ ﻗﻮاﻋﺪ در ﺳﻤﺖ ﺳﺮور ﻣﻨﻄﻘﻲ ﺗﺮ اﺳﺖ زﻳﺮا اﻳﻦ اﻣﺮ اﻣﻜﺎن اﻳﻨﻜﻪ ﻳﻚ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺗﻐﻴﻴﺮات ﺟﺪﻳﺪ را درﻳﺎﻓﺖ ﻧﻜﻨﺪ را رﻓﻊ ﻣﻲ ﻛﻨﺪ.
ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ: ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺳﻪ ﻻﻳﻪ ﺑﺎ ﺗﻘﺴﻴﻢ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ ﺑﻪ ﺳﻪ ﻗﺴﻤﺖ :ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮان ،ﺳـﺮوﻳﺲ ﻫـﺎي ﺗﺠـﺎري و ﺳـﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ ﺑﺎﻋﺚ ﺑﻬﺒﻮد ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه/ﺳﺮوﻳﺲ دﻫﻨﺪه ﻣﻲ ﺷﻮد .اﻳﻦ ﺗﻘﺴﻴﻢ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﻣﻘﻴﺎس ﭘﺬﻳﺮي و ﻗﺎﺑﻠﻴـﺖ اﻋﺘﻤﺎد ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد.
ﻣﺪل ﻣﻨﻄﻘﻲ ﻣﻌﻤﺎري ﺳﻪ ﻻﻳﻪ
ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮان:
٩١١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮان ﻛﻪ ﻫﻤﭽﻨﻴﻦ ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه 1ﻧﻴﺰ ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد از ﻓﺎﻳـﻞ ﻫـﺎي اﺟﺮاﻳـﻲ وﻳﻨـﺪوز ﻳـﺎ ﺻـﻔﺤﺎت وب ﻣﺜـﻞ HTMLﻫﺎي دﻳﻨﺎﻣﻴﻚ و ﻳﺎ ﺻﻔﺤﺎت ASPﺗﺸﻜﻴﻞ ﺷﺪه اﻧﺪ .ﻻﻳﻪ ﺧﺪﻣﺎت ﻛﺎرﺑﺮان در ﺣﻘﻴﻘﺖ ﻻﻳﻪ اي اﺳﺖ ﻛﻪ اﻃﻼﻋﺎت ﺳﺮور را ﺑـﻪ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز ﺳﺮور را از ﻛﺎرﺑﺮ درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .در ﻣﺪل ﺳﻪ ﻻﻳﻪ ،ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه ﺑـﻪ داﻧـﺴﺘﻦ ﺳـﺎﺧﺘﺎر ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ و ﻳﺎ ﻫﺮ ﺳﺮوﻳﺲ دﻳﮕﺮي ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ اراﺋﻪ ﻣﻲ ﺷﻮد اﺣﺘﻴﺎج ﻧﺪارد.
ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري: ﻻﻳﻪ دوم ،ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري اﺳﺖ .در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ ،در ﺣﻘﻴﻘﺖ اﻳﻦ ﻻﻳﻪ ﻣﺴﺌﻮل ﭼﮕﻮﻧﮕﻲ دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت اﺳﺖ. اﻳﻦ ﻣﺴﺌﻮﻟﻴﺖ ﺷﺎﻣﻞ درﻳﺎﻓﺖ ﺗﻘﺎﺿﺎي اﻃﻼﻋﺎت ﻣﻮردﻧﻴﺎز از ﻃـﺮف ﻻﻳـﻪ ﺳـﺮوﻳﺲ ﻫـﺎي ﻛـﺎرﺑﺮ ،ﻓﺮﺳـﺘﺎدن آن ﺑـﻪ ﻻﻳـﻪ ي داده اي و ﺑﺎزﮔﺮداﻧﺪن ﻧﺘﺎﻳﺞ درﺧﻮاﺳﺖ ﻫﺎ ﺑﻪ ﻛﺎرﺑﺮ اﺳﺖ .اﻳﻦ ﻻﻳﻪ ﻣﻲ ﺗﻮاﻧﺪ ،و در ﺑﻴﺸﺘﺮ ﺷـﺮاﻳﻂ ﺑﺎﻳـﺪ ،ﻗﻮاﻋـﺪ ﺗﺠـﺎري اﻋﻤـﺎل ﺷـﺪه در ﺑﺮﻧﺎﻣـﻪ را ﻧﮕﻬﺪاري و اﺟﺮا ﻛﻨﺪ. ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري ﻗﺎدر ﺑﻪ اﻧﺠﺎم ﺗﻤﺎم ﻣﻮاردي اﺳﺖ ﻛﻪ ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه درﺧﻮاﺳﺖ ﻣﻲ ﻛﻨﺪ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻳﻜـﻲ از ﻣﻬﻤﺘـﺮﻳﻦ اﻫﺪاف اﻳﻦ ﻻﻳﻪ ،ﺟﺪاﺳﺎزي ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه از ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ اﺳﺖ اﻣﺎ اﻳﻦ ﻻﻳﻪ ﻛﺎرﻫﺎي ﺑـﺴﻴﺎر ﺑﻴـﺸﺘﺮي را اﻧﺠـﺎم ﻣـﻲ دﻫﺪ .ﺗﻤﺎم ﺗﻮاﺑﻊ ،اﻋﻢ از ﻣﺤﺎﺳﺒﺎﺗﻲ و ﻳﺎ وﻇﺎﻳﻒ وﻳﮋه ﺑﺮﻧﺎﻣﻪ ،ﺑﻮﺳﻴﻠﻪ اﻳﻦ ﻻﻳﻪ اراﺋﻪ ﻣﻲ ﺷﻮﻧﺪ .ﺗﻤﺎم ﻛﺎرﺑﺮان ﺑﻪ واﺳﻄﻪ ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه ﺑﻪ اﻣﻜﺎﻧﺎت اﻳﻦ ﻻﻳﻪ دﺳﺘﺮﺳﻲ دارﻧﺪ .اﻳﻦ ﻻﻳﻪ ﺑﻪ ﺻﻮرت ﻓﻴﺰﻳﻜﻲ در ﻳﻜﻲ از ﺳﺮورﻫﺎي ﻣﻮﺟﻮد در ﺷﺒﻜﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺗﻤﺎم ﻗﻮاﻋﺪ ﺗﺠﺎري ﺟﺪﻳﺪ و ﻳﺎ ﺗﻐﻴﻴﺮات اﻋﻤﺎل ﺷﺪه در آﻧﻬﺎ ﻓﻘﻂ ﺑﺎﻳﺪ در اﻳﻦ ﻻﻳﻪ ﺗﻮزﻳﻊ ﺷﻮﻧﺪ ،ﻛﻪ اﻳﻦ اﻣﺮ ﻣﻮﺟﺐ ﺣـﺬف ﻧﻴـﺎز ﺑـﻪ اﻧﺘـﺸﺎر اﻳـﻦ ﻗﻮاﻋـﺪ ﺑـﻴﻦ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻣﻲ ﺷﻮد.
ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﻻﻳﻪ ﺳﺮوﻳﺴﻬﺎي ﺗﺠﺎري ﺑﻪ وﺳﻴﻠﻪ ﺗﻤﺎم ﺳﺮوﻳﺴﻬﺎي ﻛﺎرﺑﺮ اﺳﺘﻔﺎده ﻣﻴﺸﻮﻧﺪ
ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ:
Presentation Layer
1
٩١٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ اﻣﻜﺎن دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت را ﺑﺮاي ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠـﺎري ﻓـﺮاﻫﻢ ﻣـﻲ ﻛﻨـﺪ ﻛـﻪ اﻳـﻦ ﻻﻳـﻪ ﻧﻴـﺰ اﻃﻼﻋﺎت را در اﺧﺘﻴﺎر ﻛﺎرﺑﺮان ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه در ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮ ﻗﺮار ﻣـﻲ دﻫـﺪ ADO.NET.و ﺳﻴـﺴﺘﻢ ﻣـﺪﻳﺮﻳﺖ ﺑﺎﻧـﻚ اﻃﻼﻋﺎﺗﻲ) (DBMSﻫﺮ دو در اﻳﻦ ﻻﻳﻪ ﻧﮕﻬﺪاري ﻣﻲ ﺷﻮﻧﺪ ADO.NET .راه ﺣـﻞ ﻣﺎﻳﻜﺮوﺳـﺎﻓﺖ ﺑـﺮاي دﺳﺘﺮﺳـﻲ اﻃﻼﻋـﺎت در ﺷﺒﻜﻪ و MS SQL Serverﻧﻴﺰ راه ﺣﻞ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﺳـﺖ .ﻫـﺮ دو اﻳـﻦ ﻣـﻮارد دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ ADO.NET .روﺷﻲ را ﺑﺮاي درﻳﺎﻓـﺖ اﻃﻼﻋـﺎت اراﺋـﻪ ﻣـﻲ دﻫـﺪ و SQL Server ﻣﻮﺗﻮر ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﺳﺖ ﻛﻪ ﺑﺮاي ﻧﮕﻬﺪاري ﺧﻮد اﻃﻼﻋﺎت ﺑﻪ ﻛﺎر ﻣﻲ رود.
ﻣﺪﻳﺮﻳﺖ ﻛﺪ: ﻣﺪﻳﺮﻳﺖ ﻛﺪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ ﺑﺴﻴﺎر راﺣﺖ ﺗﺮ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي دو ﻻﻳﻪ اﺳﺖ و دﭼﺎر ﻣﺸﻜﻼت ﻛﻤﺘﺮي ﻣﻲ ﺷﻮد .ﺑﻪ دﻟﻴﻞ ﺟﺪاﺳﺎزي ﻣﻨﻄﻘﻲ و ﻓﻴﺰﻳﻜﻲ ﺑﺮﻧﺎﻣﻪ دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ ﻳﻚ ﺗﻴﻢ ﺗﻮﺳﻌﻪ ﺑﺮاي ﻛﻞ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺴﺖ .ﻃﺮاﺣﺎن ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺪون دﺳﺘﺮﺳﻲ ﺑـﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺑﻪ ﻃﺮاﺣﻲ اﻳﻦ ﻻﻳﻪ ﺑﭙﺮدازﻧﺪ .ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري ﻣﻲ ﺗﻮاﻧﺪ از درﮔﻴﺮي ﺑﺎ ﻻﻳـﻪ اراﺋـﻪ دﻫﻨـﺪه آزاد ﺷﻮﻧﺪ و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺮ روي راﺑﻄﻪ اﻃﻼﻋﺎت و ﻳﺎ ﭘﻴﺎده ﺳﺎزي ﻗﻮاﻋﺪ ﺗﺠﺎري ﺗﻤﺮﻛﺰ ﻛﻨﻨﺪ .ﺑﻮاﺳﻄﻪ اﻳﻦ اﻣـﺮ ﻛﻪ اﻳﻦ ﻻﻳﻪ ﻫﺎ ﺑﻪ ﻃﻮر ﻣﻨﻄﻘﻲ ﻣﺠﺰا از ﻳﻜﺪﻳﮕﺮ ﻫﺴﺘﻨﺪ ،ﻫﺮ ﻛﺪام از آﻧﻬﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻃﻮر ﻣﺠﺰا ﻛﺎﻣﭙﺎﻳﻞ ﺷﺪه و ﻳﺎ ﻣﺠﺪداً ﭘﻴﻜـﺮ ﺑﻨـﺪي ﺷﻮﻧﺪ ﺑﺪون اﻳﻨﻜﻪ ﺑﺮ ﻻﻳﻪ ﻫﺎي دﻳﮕﺮ ﺗﺎﺛﻴﺮ ﺑﮕﺬارﻧﺪ.
ﻣﻘﻴﺎس ﭘﺬﻳﺮي: در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ ﻣﻘﻴﺎس ﭘﺬﻳﺮي ﺑﺴﻴﺎر ﺑﻬﺒﻮد ﻣﻲ ﻳﺎﺑﺪ ،زﻳﺮا اﺗﺼﺎﻻت ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺪون آﻧﻜﻪ ﻗﻄﻊ ﺷـﻮد از ﻛـﺎرﺑﺮي ﻛﻪ ﺑﻪ آن ﻧﻴﺎز ﻧﺪارد ﮔﺮﻓﺘﻪ ﺷﺪه و ﺑﺮاي دﻳﮕﺮ ﻛﺎرﺑﺮان ﻧﮕﻪ داﺷﺘﻪ ﺷﻮد .اﻳﻦ اﻣﺮ ﺗﻌﺪاد ﻛﺎرﺑﺮاﻧﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ از ﻃﺮﻳﻖ ﻻﻳﻪ ﻣﻴﺎﻧﻲ) ﻻﻳـﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري( ﺑﺎ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ در ﺗﻤﺎس ﺑﺎﺷﻨﺪ را اﻓﺰاﻳﺶ ﻣﻲ دﻫﺪ .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﻧﻮع ﻣﻌﻤﺎري ﭘﺮدازش از ﺳﻤﺖ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﻪ ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري اﻧﺘﻘﺎل ﻣﻲ ﻳﺎﺑﺪ .ﻛﺎراﻳﻲ ﺷﺒﻜﻪ ﺑﻪ ﻋﻠﺖ ارﺗﺒﺎط ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري ﺑﺎ ﻻﻳﻪ ﺑﺎﻧﻚ اﻃﻼﻋـﺎﺗﻲ ﺑﻪ ﺟﺎي ارﺗﺒﺎط ﻻﻳﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﺑﺎ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻧﻴﺰ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ .در ﻛﻞ ﻣﻘﻴﺎس ﭘﺬﻳﺮي در اﻳﻦ ﺳﻴـﺴﺘﻢ ﻫـﺎ ﺑـﻪ واﺳـﻄﻪ ي دﺳﺘﻪ ﺑﻨﺪي ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري و ﺳﺮورﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﻓﺰاﻳﺶ ﻣﻲ ﻳﺎﺑﺪ. ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﺗﺠﺎري ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ وﺳﻴﻠﻪ اﺑﺰارﻫـﺎي اراﺋـﻪ ﺷـﺪه ﺗﻮﺳـﻂ COM+و ﻳـﺎ Enterprise Servicesدر ﺣﺎﻓﻈﻪ ﺑﺎرﮔﺬاري ﺷﻮﻧﺪ و ﺗﺎ ﻣﻮﻗﻊ ﻧﻴﺎز در آﻧﺠﺎ ﺑﺎﻗﻲ ﺑﻤﺎﻧﻨﺪ .اﻳﻦ اﻣﺮ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﺗﻌﺪاد ﻛﺎرﺑﺮاﻧﻲ ﻣـﻲ ﺷـﻮد ﻛـﻪ ﻻﻳـﻪ ﺳـﺮوﻳﺲ ﻫـﺎي ﺗﺠﺎري ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ آﻧﻬﺎ ﭘﺎﺳﺦ دﻫﺪ زﻳﺮا زﻣﺎن ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺑﺎرﮔﺬاري ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﻻزم ﺣﺬف ﻣﻲ ﺷﻮد.
ﻗﻮاﻋﺪ ﺗﺠﺎري: در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ ﻗﻮاﻋﺪ ﺗﺠﺎري ﻧﺒﺎﻳﺪ در ﻻﻳﻪ اراﺋﻪ دﻫﻨﺪه)ﻻﻳﻪ ﻛﺎرﺑﺮ( اﻋﻤﺎل ﺷﻮﻧﺪ .زﻳﺮا در اﻳﻦ ﺻﻮرت ﻛﺎرﺑﺮ ،ﺑﻪ راﺣﺘﻲ ﻣﻲ ﺗﻮاﻧـﺪ از اﻳﻦ ﻗﻮاﻋﺪ ﻋﺒﻮر ﻛﻨﺪ .ﻋﻼوه ﺑﺮ اﻳﻦ ﺑﺎ ﻗﺮار دادن ﻳﻚ ﻗﺎﻋﺪه ﺗﺠﺎري در ﺳﻤﺖ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه اﻳﻦ ﻋﻤﻞ ﺑﺎﻳﺪ ﺑﺮاي ﺗﻤﺎﻣﻲ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي اﻳﻦ ﻻﻳﻪ ﺗﻜﺮار ﺷﻮد. اﻳﻦ ﻗﻮاﻋﺪ ﻣﻲ ﺗﻮاﻧﻨﺪ در ﻫﺮ ﻳﻚ از ﻻﻳﻪ ﻫﺎي ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري و ﻳﺎ ﺳﺮوﻳﺲ ﻫﺎي اﻃﻼﻋﺎﺗﻲ ﻗﺮار داده ﺷﻮﻧﺪ .زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﻗﻮاﻋـﺪ در ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ،ﺑﺎﻳﺴﺘﻲ اﻃﻤﻴﻨﺎن ﺣﺎﺻﻞ ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮان ﻓﻘﻂ از ﻃﺮﻳﻖ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي اﻳﻦ ﻻﻳﻪ ﺑﻪ ﻻﻳﻪ
٩١٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﻮم دﺳﺘﺮﺳﻲ دارﻧﺪ و ﻧﻤﻲ ﺗﻮاﻧﻨﺪ از اﻳﻦ ﻻﻳﻪ ﻋﺒﻮر ﻛﺮده و ﺑﻪ ﻻﻳﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﻨﺪ .زﻳﺮا در ﻏﻴـﺮ اﻳـﻦ ﺻـﻮرت اﻳـﻦ ﻗﻮاﻋﺪ ﺑﻪ درﺳﺘﻲ اﺟﺮا ﻧﻤﻲ ﺷﻮﻧﺪ ،اﻣﺎ زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﻗﻮاﻋﺪ در ﻻﻳﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ اﺟﺮا ﺷـﺪﻧﺪ دﻳﮕـﺮ ﻛـﺎرﺑﺮان ﺗﻮاﻧـﺎﻳﻲ ﻋﺒـﻮر از آﻧﻬـﺎ را ﻧﺨﻮاﻫﻨﺪ داﺷﺖ. زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ از ﻗﺒﻴﻞ VB.NET ، VC++و ﻳﺎ C#ﺑﺮاي ﭘﻴﺎده ﺳﺎزي اﻳﻦ ﻗﻮاﻋﺪ ﺑﻬﻴﻨﻪ ﺷﺪه اﻧﺪ .ﺑﺎ وﺟﻮد اﻳﻦ ،ﻣﻲ ﺗﻮان ﺑﺎ اﺳﺘﻔﺎده از اﻣﻜﺎﻧﺎﺗﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ از ﻗﺒﻴﻞ SQL Serverوﺟﻮد دارد اﻳﻦ ﻗﻮاﻋﺪ را در ﻻﻳﻪ ﺑﺎﻧـﻚ اﻃﻼﻋـﺎﺗﻲ ﭘﻴـﺎده ﺳﺎزي ﻛﺮد.
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭼﻨﺪ ﻻﻳﻪ: ﺗﻘﺴﻴﻢ ﺑﻨﺪي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭼﻨﺪ ﻻﻳﻪ ،ﺑﻪ ﺻﻮرت اﺳﺘﺮاﺗﮋﻳﻚ ،ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﻣﻘﻴﺎس ﭘﺬﻳﺮي ،ﻛﺎراﻳﻲ ،اﻧﻌﻄﺎف ﭘـﺬﻳﺮي و ﻗـﺪرت ﻣﺪﻳﺮﻳﺖ ﺷﻮد ،اﻳﻦ ﻣﻮرد ﻛﻪ ﺑﻪ ﻫﺮ ﻻﻳﻪ ﻳﻚ وﻇﻴﻔﻪ ﺧﺎص داده ﺷﻮد ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻃﺮاﺣﺎن آن ﻻﻳﻪ ،ﺑﺮ روي ﺗﻮﺳﻌﻪ و ﭘﻴﻜـﺮ ﺑﻨـﺪي وﻇﻴﻔﻪ ﻣﺸﺨﺺ ﺷﺪه ﻋﻤﻞ ﻛﻨﻨﺪ. ﻫﺮ ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﺷﺎﻣﻞ ﺑﻴﺶ از ﺳﻪ ﻻﻳﻪ ﺷﻮد ،ﺟﺰء ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭼﻨﺪ ﻻﻳﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮد .اﻣﺎ در اﻳﻦ ﺑﺨﺶ ﻣﻨﻈﻮر از ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﭼﻨـﺪ ﻻﻳﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭘﻨﺞ ﻻﻳﻪ اﺳﺖ .اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﺸﺎﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻪ ﻻﻳﻪ ﻫﺴﺘﻨﺪ وﻟﻲ در آﻧﻬﺎ ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري ﺑﻪ ﺳﻪ ﻻﻳـﻪ ﻳﺎ ﺳﻪ ﻛﻼس دﻳﮕﺮ ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﺒﺎرت اﻧﺪ از :ﻛﻼس ﺧﺎرﺟﻲ ،ﻛﻼس اﺻﻠﻲ ﺗﺠﺎري و ﻛﻼس دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت.
ﻛﻼﺳﻬﺎي ﻻﻳﻪ ﺗﺠﺎري ﺑﻪ ﭼﻨﺪ ﻛﻼس ﺟﺪﻳﺪ ﺗﻘﺴﻴﻢ ﻣﻴﺸﻮﻧﺪ
ﻛﻼس ﺧﺎرﺟﻲ: ﻛﻼس ﺧﺎرﺟﻲ 1در ﺣﻘﻴﻘﺖ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺑﺎﻓﺮ ﺑﻴﻦ ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﻛﺎرﺑﺮ و اﻣﻜﺎﻧﺎت اراﺋﻪ ﺷﺪه ﺗﻮﺳﻂ ﻻﻳـﻪ ﺳـﺮوﻳﺲ ﻫـﺎي ﺗﺠـﺎري ﺑﺮﻧﺎﻣﻪ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ .ﻳﻜﻲ از ﻣﺰاﻳﺎي اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼس ﻫﺎ اﻳﻦ اﺳﺖ ﻛﻪ ﻣﻲ ﺗﻮان ﭼﻨﺪﻳﻦ ﻛﻼس ﺑﺮاي اﻳﻦ ﻗﺴﻤﺖ ﺗﻌﺮﻳﻒ ﻛﺮد و ﺑـﺎ اﺳﺘﻔﺎده از آﻧﻬﺎ اﻃﻼﻋﺎت اﻳﺴﺘﺎ را ﺑﻪ اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﺑﻪ ﺳﻤﺖ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻓﺮﺳﺘﺎده ﻣﻲ ﺷﻮﻧﺪ اﺿﺎﻓﻪ ﻛﺮد و ﺑﺪﻳﻦ وﺳﻴﻠﻪ ﺑـﻪ ﻃﺮاﺣـﺎن و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري در ﺗﺴﺮﻳﻊ ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ﻛﻤﻚ ﻛﺮد.
Facades Layer
1
٩١٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻻﻳﻪ ﺧﺎرﺟﻲ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﺑﺎﻓﺮ ﺑﺮاي ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ ﻋﻤﻞ ﻣﻴﻜﻨﺪ ﻳﻜﻲ دﻳﮕﺮ از ﻣﺰاﻳﺎي اﺳﺘﻔﺎده از اﻳﻦ ﻛﻼﺳﻬﺎي ﺧﺎرﺟﻲ ،ﺗﻮاﻧﺎﻳﻲ از ﺑﻴﻦ ﺑﺮدن ﭘﻴﭽﻴﺪﮔﻲ ﻣﻮﺟﻮد در ﺗﻮاﺑﻊ ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري اﺳﺖ. ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي ﻣﻮﺟﻮد در ﻻﻳﻪ ﺳﺮوﻳﺲ ﻫﺎي ﺗﺠﺎري اﻏﻠﺐ ﺑﻪ ﮔﻮﻧﻪ اي ﻃﺮاﺣﻲ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﺑﺘﻮاﻧﻨﺪ ﺑﻪ ﻃﻮر ﻋﻤـﻮﻣﻲ ﺑـﻪ وﺳـﻴﻠﻪ ﭼﻨـﺪ ﺑﺮﻧﺎﻣﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ .ﻫﻤﭽﻨﻴﻦ ﻫﺮ ﻛﺎرﺑﺮ و ﻳﺎ ﺳﺮوﻳﺴﻲ از ﺳﻮي ﺻﻔﺤﺎت وب ،ﻧﻴﺎز ﺑﻪ ﻧﻤﻮﻧـﻪ ﺳـﺎزي و ﻳـﺎ ﺑﺎرﮔـﺬاري ﭼﻨـﺪﻳﻦ ﻛﺎﻣﭙﻮﻧﻨﺖ ﺑﺮاي اﺟﺮاي ﻳﻚ وﻇﻴﻔﻪ ﺧﺎص دارد .ﺑﻪ وﺳﻴﻠﻪ ﻛﻼس ﻫﺎي ﺧﺎرﺟﻲ ،ﻛﺎرﺑﺮ ﻻﻳﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻓﻘﻂ ﻧﻴﺎز دارد ﻳـﻚ ﻧﻤﻮﻧـﻪ از ﻛﻼس ﺧﺎرﺟﻲ را ﺷﺒﻴﻪ ﺳﺎزي ﻛﺮده و از ﭘﻴﭽﻴﺪﮔﻲ ﻛﺎر در ﻻﻳﻪ ﻣﻴﺎﻧﻲ ﺟﺪا ﻣﻲ ﻣﺎﻧﺪ.
ﻛﻼس اﺻﻠﻲ ﺗﺠﺎري: ﻛﻼس اﺻﻠﻲ ﺗﺠﺎري ﻳﺎ ﻻﻳﻪ ﻣﺮﺣﻠﻪ ﺗﺠﺎري ،1در ﺣﻘﻴﻘﺖ ﻓﺮاﻫﻢ ﻛﻨﻨﺪه وﻇﺎﻳﻒ اﺻﻠﻲ ﺗﺠﺎري ﺑﺮﻧﺎﻣﻪ اﺳﺖ ﻛﻪ ﻋﺒﺎرت اﻧﺪ از :اﺟﺮاي ﻗﻮاﻋﺪ ﺗﺠﺎري ،ﺗﻀﻤﻴﻦ ﻛﺮدن ﻛﺎراﻳﻲ ﻣﻨﻄﻖ ﺗﺠﺎري و ﻓﺮاﻫﻢ ﻛﺮدن دﺳﺘﺮﺳﻲ ﺑﻪ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي اﻃﻼﻋـﺎﺗﻲ .ﺑـﻪ ﻋﺒـﺎرت دﻳﮕـﺮ اﻳـﻦ ﻛـﻼس، ﻫﻮﺷﻤﻨﺪي واﻗﻌﻲ ﺑﺮﻧﺎﻣﻪ را اراﺋﻪ ﻣﻲ دﻫﺪ .ﻛﻼﺳﻬﺎي ﺧﺎرﺟﻲ ﻧﻴﺰ ﺑﺎ اﺳﺘﻔﺎده از ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي اﻳﻦ ﻻﻳﻪ وﻇﻴﻔﻪ ﻣﻮردﻧﻈﺮ ﺧﻮد را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ.
راﺑﻄﻪ ﺑﻴﻦ ﻛﻼس اﺻﻠﻲ ﺗﺠﺎري ﺑﺎ ﻛﻼﺳﻬﺎي ﺧﺎرﺟﻲ و ﻛﻼﺳﻬﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت
Business Level Layer
1
٩١٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻛﻼﺳﻬﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت: ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ﻳﺎ ﻻﻳﻪ دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت 1اﻣﻜﺎن اﺳﺘﻔﺎده از اﻃﻼﻋﺎت را ﺑﺮاي ﻻﻳﻪ اﺻﻠﻲ ﺗﺠﺎري ﻓﺮاﻫﻢ ﻣـﻲ ﻛﻨﺪ .در ﻣﺪل ﭘﻨﺞ ﻻﻳﻪ ﻓﻘﻂ اﻳﻦ ﻻﻳﻪ ﺑﻪ ﺳﺎﺧﺘﺎر ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ دﺳﺘﺮﺳﻲ دارد ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻐﻴﻴﺮات در ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻓﻘﻂ ﻧﻴﺎز ﺑـﻪ اﻳﺠـﺎد ﺗﻐﻴﻴﺮات در اﻳﻦ ﻻﻳﻪ دارد .ﻗﺴﻤﺖ ﻫﺎي دﻳﮕﺮ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺎزي ﺑﻪ اﻃﻼع از زﻳﺮ ﺳﺎﺧﺖ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻧﺪارﻧﺪ. ﺑﺪون ﺗﻮﺟﻪ ﺑﻪ ﻧﻮع ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﺷﺪه در ﻻﻳﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ADO.NET ،روش ﭘﻴﺸﻨﻬﺎدي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮاي اﻳﻦ ﻻﻳﻪ ﻣﺤﺴﻮب ﻣـﻲ ﺷـﻮد ADO.NET .ﺗﻮاﻧـﺎﻳﻲ ﺑﺮﻗـﺮاري ارﺗﺒـﺎط ﺑـﺎ اﻧـﻮاع ﻣﻨـﺎﺑﻊ اﻃﻼﻋـﺎﺗﻲ را از ﻗﺒﻴـﻞ Oracle ،SQL Server Excel ، Word ،Access ،Sybase،و ...را دارد .در ﻃﺮاﺣﻲ ﻻﻳﻪ اي ﻣﻌﻤﻮﻻ ﻣﻨﺒﻊ اﻃﻼﻋﺎﺗﻲ ،ﻳﻚ ﺳﻴـﺴﺘﻢ ﻣـﺪﻳﺮﻳﺖ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ) (DBMSاﺳﺖ ﻛﻪ دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .ﻫﻨﮕﺎم اﺳﺘﻔﺎده از ADO.NETﻃﺮاﺣﺎن ﻣـﻲ ﺗﻮاﻧﻨـﺪ از ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي اﻳﻦ ﻛﻼس ﺑﺮاي اﻳﺠﺎد ﭘﺮس و ﺟﻮ ﻫﺎي ﻣﺨﺘﻠﻒ اﺳﺘﻔﺎده ﻛﻨﻨﺪ .ﻋﻼوه ﺑﺮ اﻳﻦ اﺳﺘﻔﺎده از روش ﻫﺎي داﺧﻠﻲ ﺳﻴﺴﺘﻢ ﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻧﻴﺰ اﻣﻜﺎن ﭘﺬﻳﺮ اﺳﺖ .ﻣﺜﻼ در SQL Serverﻣﻲ ﺗﻮان از ﭘﺮوﺳﻴﺠﺮ ﻫﺎي آﻣﺎده 2اﺳﺘﻔﺎده ﻛﺮد ﻛـﻪ ﺣـﺪود 40در ﺻﺪ ﺳﺮﻳﻌﺘﺮ از روش ﻫﺎي دﻳﮕﺮ اﺳﺖ.
ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت ﺑﺮاي درﻳﺎﻓﺖ و ارﺳﺎل اﻃﻼﻋﺎت از ﻻﻳﻪ ﺳﺮوﻳﺴﻬﺎي اﻃﻼﻋﺎﺗﻲ ﺑﻪ ﻻﻳﻪ ﺳﺮوﻳﺴﻬﺎي ﺗﺠﺎري آﻣﺎده ﻫﺴﺘﻨﺪ
ﺳﺮوﻳﺲ ﻫﺎي وب: ﻳﻚ ﺳﺮوﻳﺲ وب ،ﻳﻚ ﺗﺎﺑﻊ ﻳﺎ ﻣﺠﻤﻮﻋﻪ اي از ﺗﻮاﺑﻊ اﺳﺖ ﻛﻪ از ﻃﺮﻳﻖ اﻳﻨﺘﺮﻧﺖ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ و از ﺗﺮﻛﻴﺐ XMLﺑﺮاي اراﺋـﻪ داده ﻫﺎ و HTTPﺑﺮاي اﻧﺘﻘﺎل داده ﻫﺎ ﺑﻬﺮه ﻣﻲ ﺑﺮد .وب ﺳﺮوﻳﺲ ﻫﺎ ﻧﻴﺰ ﻣﺎﻧﻨﺪ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎي COMو ﻳـﺎ .NETﺗﻮاﺑـﻊ ﺧـﻮد را ﺑـﺮاي ﻛﺎرﺑﺮان ﻋﺮﺿﻪ ﻣﻲ ﻛﻨﻨﺪ .اﺳﺘﻔﺎده ﻛﻨﻨﺪﮔﺎن اﻳﻦ ﺗﻮاﺑﻊ ﻋﻤﻮﻣﺎً ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻫﺴﺘﻨﺪ .در ﻧﺘﻴﺠﻪ وب ﺳﺮوﻳﺲ ﻫـﺎ در ﻃﺮاﺣـﻲ ﻻﻳﻪ اي ،ﺑﻪ راﺣﺘﻲ ﺑﻪ ﻋﻨﻮان ﻳﻚ ﻻﻳﻪ اﻟﺤﺎﻗﻲ ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﻧﺪ. 3 وب ﺳﺮوﻳﺲ ﻫﺎ اﻳﻦ اﻣﻜﺎن را ﺑﻪ ﻳﻚ ﺗﻮﺳﻌﻪ ﮔﺮ ﻣﻲ دﻫﻨﺪ ﻛﻪ ﺑﺪون ﻃﺮاﺣﻲ ﻛﺎﻣﻞ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﺗﻮاﺑـﻊ و وﻇـﺎﻳﻒ ﻳـﻚ ﺑﺮﻧﺎﻣـﻪ را ﺑـﺮاي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه اراﺋﻪ دﻫﺪ .ﻳﻚ ﻃﺮاح ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻣﻲ ﺗﻮاﻧﺪ در ﺳﺎﺧﺖ ﺑﺮﻧﺎﻣﻪ ﺧﻮد از اﻣﻜﺎﻧـﺎت ﻳـﻚ ﻳـﺎ ﭼﻨـﺪ ﺳـﺮوﻳﺲ ﻣﺒﺘﻨﻲ ﺑﺮ وب ﺑﻬﺮه ﻣﻨﺪ ﺷﻮد. Data Access Layer Stored Procedures
1 2
3زﻳﺮا اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻧﻴﺎزي ﺑﻪ ﻃﺮاﺣﻲ راﺑﻂ ﻛﺎرﺑﺮي ﻧﺪارﻧﺪ.
٩١٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﺪل ﻻﻳﻪ وب ﺳﺮوﻳﺲ ﻫﺎ: ﻫﻤﺎﻧﻨﺪ ﻻﻳﻪ ﺧﺎرﺟﻲ)ﻛﻼﺳﻬﺎي ﺧﺎرﺟﻲ ﻛﻪ ﭘﻴﺸﺘﺮ ﺗﻮﺿﻴﺢ داده ﺷﺪ( ،وب ﺳﺮوﻳﺲ ﻫـﺎ ﺑﺎﻋـﺚ ﺳـﺎدﮔﻲ اﺳـﺘﻔﺎده از ﺗﻮاﺑـﻊ و ﻧﻴـﺰ ﻛـﺎﻫﺶ ﭘﻴﭽﻴﺪﮔﻲ ﻫﺎي ﻻﻳﻪ ﻣﻴﺎﻧﻲ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي در ﺣﺎل اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺮاي اﺳﺘﻔﺎده از ﻳﻚ وب ﺳﺮوﻳﺲ در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ي ﭼﻨﺪ ﻻﻳﻪ ﻛﻪ داراي ﻻﻳﻪ ﻫﺎي دﺳﺘﺮﺳﻲ اﻃﻼﻋﺎت ،ﻻﻳﻪ اﺻﻠﻲ ﺗﺠﺎري و ﻻﻳﻪ ﺧﺎرﺟﻲ اﺳﺖ ،ﺗﻨﻬﺎ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺗﻮاﺑﻊ ﻣﺪﻧﻈﺮ از ﻻﻳـﻪ ﺧﺎرﺟﻲ ﮔﺮﻓﺘﻪ ﺷﺪه و ﺗﻮﺳﻂ وب ﺳﺮوﻳﺲ ﻋﺮﺿﻪ ﺷﻮﻧﺪ و ﻣﺎﺑﻘﻲ ﺗﻮاﺑﻊ ﺗﻮﺳﻂ ﻻﻳﻪ ﺧﺎرﺟﻲ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﻨﺪ .ﺷـﻜﻞ زﻳـﺮ ﻳـﻚ ﻣـﺪل ﻣﻨﻄﻘﻲ از ﻳﻚ وب ﺳﺮوﻳﺲ را اراﺋﻪ ﻣﻲ دﻫﺪ ﻛﻪ در آن ﺗﻮاﺑﻌﻲ ﻛﻪ ﺗﻮﺳﻂ ﻻﻳﻪ ﺧﺎرﺟﻲ ﻓﺮاﻫﻢ ﻧﺸﺪه اﻧﺪ ،ﺑﻪ وﺳﻴﻠﻪ اﻳﻦ وب ﺳﺮوﻳﺲ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻫﺴﺘﻨﺪ.
ﻳﻚ وب ﺳﺮوﻳﺲ ﻣﻴﺘﻮاﻧﺪ ﻋﻼوه ﺑﺮ ﺗﻮاﺑﻌﻲ ﻛﻪ در ﻻﻳﻪ ﺧﺎرﺟﻲ اراﻳﻪ ﻣﻴﺸﻮﻧﺪ ،ﺗﻮاﺑﻊ ﻣﻜﻤﻞ را ﻧﻴﺰ ﺑﻪ ﻻﻳﻪ ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه اراﻳﻪ ﻛﻨﺪ
ﭼﺮا وب ﺳﺮوﻳﺲ ﻫﺎ؟ ﻳﻜﻲ از اﺻﻠﻲ ﺗﺮﻳﻦ ﺳﻮاﻻﺗﻲ ﻛﻪ در اﻳﻦ ﺑﺨﺶ ﺑﺎ آن روﺑﺮو ﻫﺴﺘﻴﻢ اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻣﻲ ﺗﻮان از ﺗﻜﻨﻮﻟﻮژي ﻫـﺎي ﻗﺒﻠـﻲ و راه ﺣﻞ ﻫﺎي ﭘﻴﺸﻴﻦ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻫﻤﺎﻧﻨﺪ DCOMﺑﺮاي دﺳﺘﺮﺳﻲ از راه دور اﺳﺘﻔﺎده ﻛﺮد ﭼﻪ ﻧﻴﺎزي ﺑﻪ وب ﺳﺮوﻳﺲ ﻫﺎ اﺳﺖ؟
٩١٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
دﻟﻴﻞ اﺻﻠﻲ اﻳﻦ اﻣﺮ ﻣﺴﺘﻘﻞ ﺑﻮدن وب ﺳﺮوﻳﺲ ﻫﺎ از ﭘﻠﺖ ﻓﺮم اﺳﺖ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ DCOMﺑﺴﻴﺎري از ﻣﺸﻜﻼت ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻧﻴﺰ ﻣﻘﻴﺎس ﭘﺬﻳﺮي آﻧﻬﺎ را ﺣﻞ ﻣﻲ ﻛﻨﺪ ،اﻣﺎ واﺑﺴﺘﻪ ﺑﻪ ﭘﻠﺖ ﻓﺮم اﺳﺖ .ﺑﺎ اﺳﺘﻔﺎده از وب ﺳﺮوﻳﺲ ﻫﺎ و ﺗﻜﻨﻮﻟﻮژي ﻫـﺎي اﺳـﺘﺎﻧﺪارد ﺻـﻨﻌﺘﻲ از ﻗﺒﻴﻞ XML،HTTPو SOAPﻣﻲ ﺗﻮان ﻋﻼوه ﺑﺮ ﺑﻬﺮه ﻣﻨﺪ ﺷﺪن از ﺗﻤﺎم اﻣﻜﺎﻧﺎت ﺳﻴﺴﺘﻢ ﻫﺎي ﻗﺒﻠﻲ ،از ﻗﺎﺑﻠﻴﺖ ﺳﺎزﮔﺎري ﺑﻴﻦ ﭘﻠﺖ ﻓﺮم ﻫﺎي ﮔﻮﻧﺎﮔﻮن ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﺮد. ﺳﻴﺴﺘﻢ ﻫﺎي ﻗﺪﻳﻤﻲ ﻣﺎﻧﻨﺪ DCOM،RPCو MSMQو ...ﻫﻤﮕﻲ ﺳﻌﻲ ﺑﺮ اﻳﻦ دارﻧﺪ ﻛﻪ ﭘﻠﻲ را ﺑﺮاي ارﺗﺒﺎﻃﺎت اﻳﻨﺘﺮﻧﺘﻲ اﻳﺠﺎد ﻛﻨﻨـﺪ و ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ اﻳﻦ ﻣﻮارد در داﺧﻞ ﭘﻠﺖ ﻓﺮم ﻫﺎي ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻣﻮﻓﻖ ﺑﻮده اﻧﺪ اﻣﺎ در ارﺗﺒﺎط ﺑﺎ دﻳﮕﺮ ﭘﻠﺖ ﻓﺮم ﻫﺎ )ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷـﻜﻞ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ( ﺑﺎ ﻣﺸﻜﻼت زﻳﺎدي روﺑﺮو ﺑﻮدﻧﺪ .ﺑﺎ اﺳـﺘﻔﺎده از وب ﺳـﺮوﻳﺲ ﻫـﺎ ﺳـﻌﻲ ﺷـﺪه اﺳـﺖ ﻛـﻪ ﻋﻤـﺪه ﻣـﺸﻜﻼت اﻳـﻦ ﻧﺎﻫﻤﺎﻫﻨﮕﻲ رﻓﻊ ﺷﻮد.
ﻧﺎﺳﺎزﮔﺎري ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده از راه دور ﺑﺪون ﭘﺮوﺗﻜﻞ اﺳﺘﺎﻧﺪارد
٩١٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺿﻤﻴﻤﻪ ي :3ﻣﻌﻤﺎري ﭘﻠﺖ ﻓﺮم .NET Framework در اﻳﻦ ﺿﻤﻴﻤﻪ ﺳﻌﻲ ﺷﺪه اﺳﺖ ﻛﻪ ﻣﻌﻤﺎري دروﻧﻲ ﭘﻠﺖ ﻓﺮم .NETﺑﻪ ﺻﻮرﺗﻲ ﮔﺬرا ﻣﻮرد ﺑﺮرﺳﻲ و ﺗﺤﻠﻴﻞ ﻗﺮار ﮔﻴﺮد .ﻫـﺪف از اﻳـﻦ ﺑﺨﺶ ﻧﮕﺎﻫﻲ ﺳﻄﺤﻲ ﺑﻪ ﻣﻌﻤﺎري داﺧﻠﻲ .NET Frameworkو ﻧﻴﺰ ﻣﻌﺮﻓﻲ ﺗﻜﻨﻮﻟﻮژي ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ اﻳـﻦ ﭘﻠـﺖ ﻓـﺮم درﺑـﺮ دارد .ﻫﻤﭽﻨﻴﻦ در اﻳﻦ ﺑﺨﺶ ﭘﺮوﺳﻪ ﺗﺒﺪﻳﻞ ﻳﻚ ﺳﻮرس ﻛﺪ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ ﺗﻮزﻳﻊ و روش اﺟﺮاي آن در ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﻣﻲ ﮔﻴﺮد.
ﻛﺎﻣﭙﺎﻳﻞ ﺳﻮرس ﻛﺪ ﺑﻪ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه: در ﻃﺮاﺣﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ،اوﻟﻴﻦ ﻣﺮﺣﻠﻪ ﺗﻌﻴﻴﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ اي اﺳﺖ ﻛﻪ ﻗﺼﺪ اﻳﺠﺎد آن را دارﻳﻢ ،ﺑﺮاي ﻣﺜﺎل ﺑﺮﻧﺎﻣﻪ ي ﺗﺤـﺖ وب ،ﺑﺮﻧﺎﻣـﻪ ي ﺗﺤﺖ وﻳﻨﺪوز ،وب ﺳﺮوﻳﺲ و ﻳﺎ اﻧﻮاع ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮي ﻛﻪ در .NETﻣﻲ ﺗﻮان اﻳﺠﺎد ﻛﺮد .ﻓﺮض ﻣﻴﻜﻨﻴﻢ ﻛﻪ اﻳﻦ ﻗـﺴﻤﺖ ﻣﻬـﻢ از ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪه اﺳﺖ و ﻣﺪل ﻛﻠﻲ ﺑﺮﻧﺎﻣﻪ و وﻳﮋﮔﻲ ﻫﺎي آن ﺑﺎ ﺟﺰﺋﻴﺎت ﻛﺎﻣﻞ ﻣﺸﺨﺺ ﺷﺪه اﻧﺪ. در ﻣﺮﺣﻠﻪ ي ﺑﻌﺪ ﺑﺎﻳﺴﺘﻲ زﺑﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎ آن ﻧﻮﺷﺘﻪ ﺧﻮاﻫﺪ ﺷﺪ اﻧﺘﺨﺎب ﺷﻮد .اﻳﻦ ﻣﺮﺣﻠﻪ از اﻫﻤﻴﺖ ﺑﺎﻻﻳﻲ ﺑﺮﺧﻮردار اﺳﺖ ،زﻳﺮا زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ اﻣﻜﺎﻧﺎت ﻣﺘﻔﺎوﺗﻲ را اراﺋﻪ ﻣﻲ دﻫﻨﺪ .ﺑﺮاي ﻧﻤﻮﻧﻪ در ) Cﻳﺎ زﺑﺎﻧﻬﺎي واﺑﺴﺘﻪ ﺑﻪ آن ﻣﺎﻧﻨﺪ C++و (...ﻛﻪ ﻳﻚ زﺑـﺎن ﻧـﺴﺒﺘﺎ ﺳـﻄﺢ ﭘﺎﻳﻴﻦ اﺳﺖ ﻃﺮاح ﺑﺮﻧﺎﻣﻪ ﻗﺪرت ﻛﻨﺘﺮل ﻛﺎﻣﻞ ﺑﺮ روي ﺳﻴﺴﺘﻢ را دارد ،ﻣﻴﺘﻮاﻧﺪ ﺑﻪ روش دﻟﺨﻮاه ﺣﺎﻓﻈﻪ را ﻣﺪﻳﺮﻳﺖ ﻛﻨﺪ و ﻳﺎ ﺑﻪ راﺣﺘﻲ ﺗـﺮد ﻫﺎي 1ﺟﺪﻳﺪ در ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻛﻨﺪ .از ﺳﻮي دﻳﮕﺮ زﺑﺎﻧﻬﺎﻳﻲ ﻣﺜﻞ وﻳﮋوال ﺑﻴﺴﻴﻚ ،ﺑﻪ ﻃـﺮاح ﺑﺮﻧﺎﻣـﻪ ﻗـﺪرت اﻳﺠـﺎد ﺳـﺮﻳﻊ راﺑﻄﻬـﺎي ﻗـﻮي ﮔﺮاﻓﻴﻜﻲ ﻛﺎرﺑﺮ را ﻣﻴﺪﻫﺪ .ﺑﻪ ﻋﻼوه اﻳﻦ زﺑﺎﻧﻬﺎ ﺑﻪ راﺣﺘﻲ ﻣﻴﺘﻮاﻧﻨﺪ ﺑﺎ اﺷﻴﺎي COMو ﻳﺎ ﺑﺎﻧﻜﻬﺎي اﻃﻼﻋﺎﺗﻲ راﺑﻄﻪ ﺑﺮﻗﺮار ﻛﻨﻨﺪ. اﻟﺒﺘﻪ در .NETﺑﺎ ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ ﻧﺴﺒﺖ ﺑﻪ ﺳﻴﺴﺘﻢ ﻫﺎي ﻗﺒﻠﻲ ﺑﻪ وﺟﻮد آﻣﺪه اﺳﺖ ،ﺗﺎ ﺣﺪ ﻣﻤﻜﻦ زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﺑﻪ ﻳﻜﺪﻳﮕﺮ ﺷﺒﻴﻪ ﺷـﺪه اﻧﺪ و از ﻗﺎﺑﻠﻴﺘﻬﺎي ﻧﺴﺒﺘﺎً ﻳﻜﺴﺎﻧﻲ ﺑﺮﺧﻮردار ﻫﺴﺘﻨﺪ .دﻟﻴﻞ اﻳﻦ ﻣﻮرد ﻧﻴﺰ در اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در اﻳﻦ زﺑﺎﻧﻬﺎ ،ﻫﻨﮕﺎم اﺟﺮا از ﻳﻚ ﻣﺤﻴﻂ ﻣﺨﺼﻮص ﺑﻪ ﻧﺎم CLRاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ CLR .ﻳﺎ Common Language Runtimeﻫﻤﺎﻧﻄﻮر ﻛﻪ از اﺳﻢ آن ﻧﻴﺰ ﻣﺸﺨﺺ اﺳﺖ ﻳﻚ ﻣﺤﻴﻂ زﻣﺎن اﺟﺮا ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺗﺤـﺖ .NETﻧﻮﺷـﺘﻪ ﻣـﻲ ﺷـﻮﻧﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ وﻳﮋﮔﻴﻬـﺎ و ﻗﺎﺑﻠﻴﺘﻬﺎي ﻣﻮﺟﻮد در CLRﺑﺮاي ﺗﻤﺎم زﺑﺎﻧﻬﺎﻳﻲ ﻛﻪ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ .ﺑﺮاي ﻣﺜﺎل اﮔﺮ CLRﺗﻮاﻧﺎﻳﻲ اﻳﺠﺎد ﺗﺮد ﻫﺎ را داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺗﻤﺎم زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻛﻪ از آن اﺳﺘﻔﺎده ﻣـﻲ ﻛﻨﻨـﺪ ﻧﻴـﺰ ﻗﺎﺑﻠﻴـﺖ اﻳﺠـﺎد ﺗـﺮد ﻫـﺎ را دارﻧـﺪ .اﮔـﺮ اﻳـﻦ ﻣﺤـﻴﻂ از Exceptionﻫﺎ ﺑﺮاي ﭘﻴﮕﻴﺮي اﺳﺘﺜﻨﺎ ﻫﺎي ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﺪ ،ﺗﻤﺎم زﺑﺎﻧﻬﺎ ﻧﻴﺰ ﻫﻤﻴﻦ روش را دﻧﺒﺎل ﺧﻮاﻫﻨﺪ ﻛﺮد. در ﺣﻘﻴﻘﺖ در زﻣﺎن اﺟﺮا اﻳﻦ ﻣﻮرد ﻛﻪ در ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ از ﭼﻪ زﺑﺎﻧﻲ اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ ﺗﻔﺎوﺗﻲ ﻧﺪارد .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎم اﻧﺘﺨﺎب زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﻬﻤﺘﺮﻳﻦ ﻣﻮﺿﻮﻋﻲ ﻛﻪ ﺑﺎﻳﺪ ﻣﺪﻧﻈﺮ ﻗﺮار ﮔﻴﺮد اﻳﻦ اﺳﺖ ﻛﻪ ﺑﺎ اﺳﺘﻔﺎده از ﭼﻪ زﺑﺎﻧﻲ ﻣﻲ ﺗﻮان ﺑﺮﻧﺎﻣﻪ را ﺳـﺎده ﺗـﺮ و ﺳـﺮﻳﻌﺘﺮ ﭘﻴـﺎده ﺳﺎزي ﻛﺮد. ﺳﻮاﻟﻲ ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ در اﻳﻦ ﻗﺴﻤﺖ اﻳﺠﺎد ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ اﮔﺮ اﺳﺘﻔﺎده از زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﺗﻔﺎوﺗﻲ ﻧﺪارد ،ﭘﺲ دﻟﻴﻞ وﺟﻮد ﭼﻨﺪ زﺑﺎن ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﭼﻴﺴﺖ؟ در ﭘﺎﺳﺦ ﺑﻪ اﻳﻦ ﺳﻮال ﻣﻴﺘﻮان ﮔﻔﺖ ﻛﻪ زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﮔﺮاﻣﺮ و ﺳﻴﻨﺘﻜﺲ ﻫﺎي ﻣﺘﻔﺎوﺗﻲ دارﻧﺪ .اﻫﻤﻴﺖ اﻳﻦ ﻣﻮرد را ﻧﺒﺎﻳﺪ ﻧﺎﭼﻴﺰ در ﻧﻈﺮ ﮔﺮﻓﺖ .ﺑﺮاي ﻣﺜﺎل ﻃﺮاﺣﻲ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي اﺳﺘﻔﺎده در اﻣﻮر اﻗﺘﺼﺎدي ،ﺑﺎ اﺳﺘﻔﺎده از ﮔﺮاﻣﺮ ﻣﻮﺟﻮد در زﺑﺎﻧﻬﺎﻳﻲ ﻣﺜﻞ APLﻧﺴﺒﺖ ﺑﻪ Perlﻣﻮﺟﺐ ﭼﻨﺪﻳﻦ روز ﺻﺮﻓﻪ ﺟﻮﻳﻲ در زﻣﺎن ﭘﻴﺎده ﺳﺎزي ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد. ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﭼﻨﺪﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺮاي اﺳﺘﻔﺎده از CLRﺑﺮاي زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ اراﺋﻪ داده اﺳﺖ ﻛﻪ در ﻣﺠﻤﻮﻋﻪ اي ﺑﻪ ﻧـﺎم Visual Studioﻗﺮار دارﻧﺪ .اﻳﻦ زﺑﺎﻧﻬﺎ ﻋﺒﺎرﺗﻨﺪ از:
Thread
1
٩١٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
Visual C++ with Managed Extensions C# Visual Basic Jscript J# ILﻛﻪ ﻳﻚ اﺳﻤﺒﻠﺮ ﺳﻄﺢ ﻣﻴﺎﻧﻲ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود.
ﻋﻼوه ﺑﺮ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺷﺮﻛﺘﻬﺎي دﻳﮕﺮ ﻧﻴﺰ ﺑﺮاي زﺑﺎﻧﻬﺎي ﺧﻮد ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎﻳﻲ را ﻋﺮﺿﻪ ﻛﺮده اﻧﺪ ﻛﻪ CLRرا ﺑـﻪ ﻋﻨـﻮان ﻣﺤـﻴﻂ زﻣـﺎن اﺟﺮاي ﻧﻬﺎﻳﻲ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار داده اﻧﺪ .ﺗﺎﻛﻨﻮن ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎﻳﻲ ﺑـﺮاي زﺑﺎﻧﻬـﺎي زﻳـﺮ اراﻳـﻪ ﺷـﺪه اﻧـﺪ،Cobol ،APL ،Alice: ،Mondrian ،ML ،Mercury ،Haskell ،Fortran ،Eiffel ،Component Pascal Scheme ،RPG ،Python ،Perl ،Oberonو .Smalltalk ﺷﻜﻞ زﻳﺮ ﭘﺮوﺳﻪ ي ﻛﺎﻣﭙﺎﻳﻞ ﻓﺎﻳﻠﻬﺎي ﺳﻮرس ﻛﺪ را ﻧﻤﺎﻳﺶ ﻣﻴﺪﻫﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺨﺺ اﺳﺖ ،ﺑﺪون ﺗﻮﺟﻪ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮي ﻛﻪ 2 ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد ﺧﺮوﺟﻲ ﺗﻤﺎم آﻧﻬﺎ ﻳﻚ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷﺪه 1اﺳﺖ .ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در ﺣﻘﻴﻘﺖ ﻓﺎﻳﻠﻬـﺎي اﺟﺮاﻳـﻲ اﺳﺘﺎﻧﺪارد وﻳﻨﺪوز ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺮاي اﺟﺮا ﺷﺪن ﺑﻪ CLRﻧﻴﺎز دارﻧﺪ.
ﻛﺎﻣﭙﺎﻳﻞ ﺳﻮرس ﻛﺪﻫﺎ ﺑﻪ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻳﻚ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷﺪه از ﻗﺴﻤﺘﻬﺎي ﻣﺨﺘﻠﻔﻲ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ ﻛﻪ در ﺟﺪول زﻳﺮ ﺗﻮﺿﻴﺢ داده ﺷﺪه اﺳﺖ: ﺑﺨﺶ PE Header
ﺗﻮﺿﻴﺢ در اﻳــــﻦ ﻫــــﺪر ﻣــــﻮاردي از ﻗﺒﻴــــﻞ ﻧــــﻮع ﻓﺎﻳــــﻞ ) (GUI,CUI,DLLو ﻳﺎ ﺗﺎرﻳﺦ ﻫﺎي ﻣﺮﺑـﻮط ﺑـﻪ اﻳﺠـﺎد ﻓﺎﻳﻞ ،آﺧﺮﻳﻦ ﺗﻐﻴﻴﺮات و ...ﻗﺮار دارﻧﺪ .ﺑﺮاي ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛـﻪ ﻓﻘـﻂ ﺷﺎﻣﻞ ﻛﺪ ILﻫﺴﺘﻨﺪ اﻳﻦ ﻗﺴﻤﺖ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻧﻤﻲ ﺷﻮد اﻣـﺎ
– Managed Module 1ﻣﻨﻈﻮر ﻛﺪ ﻫﺎﻳﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در زﻣﺎن اﺟﺮا ﺷﺪن ﺑﻪ وﺳﻴﻠﻪ ي CLRﻣﺪﻳﺮﻳﺖ ﻣﻲ ﺷﻮﻧﺪ .در ﻣﻘﺎﺑﻞ ﻣﺎژول ﻫﺎي ﻣـﺪﻳﺮﻳﺖ ﺷـﺪه، ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه وﺟﻮد دارﻧﺪ ﻛﻪ ﺑﻪ ﺻﻮرت ﻋﺎدي و ﺑﺪون ﻧﻈﺎرت ﻳﻚ ﻣﺤﻴﻂ زﻣﺎن اﺟﺮا ﻣﺎﻧﻨﺪ ،CLRﺑﻪ وﺳﻴﻠﻪ ي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ اﺟـﺮا ﻣـﻲ ﺷـﻮﻧﺪ .ﻧﻤﻮﻧـﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ،ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﻋﺎدي ﺑﻪ وﺳﻴﻠﻪ ي .NETاﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ .ﻧﻤﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣـﺪﻳﺮﻳﺖ ﻧـﺸﺪه ﻧﻴـﺰ ،ﻓﺎﻳﻠﻬـﺎي اﺟﺮاﻳـﻲ ﻣﻌﻤﻮﻟﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺧﺎرج از ﻣﺤﻴﻂ .NETاﻳﺠﺎد ﺷﺪه اﻧﺪ. 2 )Portable Executable Files (PE Files
٩٢٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮاي ﻓﺎﻳﻠﻬﺎﻳﻲ ﻛﻪ ﺷﺎﻣﻞ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﻫﺴﺘﻨﺪ اﻳـﻦ ﻗـﺴﻤﺖ ﻣﺤﺘﻮي اﻃﻼﻋﺎﺗﻲ راﺟﻊ ﺑﻪ ﻛﺪ ﻧﻴﺰ ﻫﺴﺖ. CLR header اﻳﻦ ﻗﺴﻤﺖ ﺷﺎﻣﻞ اﻃﻼﻋﺎﺗﻲ اﺳﺖ ﻛﻪ ﻓﺎﻳﻞ ﻣﻮرد ﻧﻈﺮ را ﺑﻪ ﻳﻚ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺗﺒﺪﻳﻞ ﻣﻴﻜﻨـﺪ )اﻳـﻦ ﻗـﺴﻤﺖ از ﻓﺎﻳـﻞ ﺑـﻪ وﺳﻴﻠﻪ CLRو ﻳﺎ ﺑﺮﻧﺎﻣﻪ ﻫـﺎي واﺑـﺴﺘﻪ ﺗﻔـﺴﻴﺮ ﻣﻴـﺸﻮد( .اﻳـﻦ ﻗﺴﻤﺖ ﺷﺎﻣﻞ ﻧﺴﺨﻪ CLRﻣﻮرد اﺳﺘﻔﺎده ﺑﺮاي ﻓﺎﻳﻞ ،ﻣﻜـﺎن و اﻧﺪازه metadataدر ﻓﺎﻳﻞ ،ﻣﻨﺎﺑﻊ ،ﺗﻌﺪادي ﻓﻠﮓ ﺧﺎص و آدرس ورودي ﻣﺮﺑـــﻮط ﺑـــﻪ ﻓﺎﻳـــﻞ آﻏـــﺎزﻳﻦ ﺑﺮﻧﺎﻣـــﻪ در metadataاﺳﺖ. Metadata ﻫﺮ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺷﺎﻣﻞ ﺟﺪول ﻫﺎﻳﻲ اﺳﺖ ﻛـﻪ ﺑـﻪ ﻧـﺎم metadataﺷﻨﺎﺧﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .دو ﻧـﻮع ﺟـﺪول ﻛﻠـﻲ در اﻳﻦ ﻗﺴﻤﺖ وﺟﻮد دارﻧـﺪ .ﻧـﻮع اول ﺷـﺎﻣﻞ ﺟـﺪاوﻟﻲ اﺳـﺖ ﻛـﻪ اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﻛـﻼس ﻫـﺎ و ﺗﻮاﺑـﻊ ﻣﻮﺟـﻮد در ﺑﺮﻧﺎﻣـﻪ را ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ .ﻧﻮع دوم ﺷﺎﻣﻞ ﺟﺪاوﻟﻲ اﺳـﺖ ﻛـﻪ ﻣﺤﺘـﻮي ﻛﻼس ﻫﺎ و ﺗﻮاﺑﻊ ﺧﺎرﺟﻲ اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ اﻳـﻦ ﻓﺎﻳـﻞ ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ. ﻛـﺪ ﻫـﺎي Intermediate Languageﻛﺪي اﺳﺖ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻮﻗﻊ ﻛﺎﻣﭙﺎﻳﻞ ﺳﻮرس ﻛـﺪ ﺗﻮﻟﻴـﺪ ﻣـﻲ )(IL ﻛﻨﺪ .ﻣﻮﻗﻊ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ CLR ،اﻳﻦ ﻛﺪ را ﺑﻪ وﺳﻴﻠﻪ ي JIT ﺑﻪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ. ﺑﻴﺸﺘﺮ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي ﻗﺒﻠﻲ ،ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻣﻌﻤﺎري ﺧﺎص از ﭘﺮدازﻧﺪه را ﺗﻮﻟﻴﺪ ﻣﻴﻜﺮدﻧﺪ .ﺑـﺮاي ﻣﺜـﺎل ﻛـﺪ ﻫـﺎﻳﻲ ﻣﺮﺑـﻮط ﺑـﻪ ،x86 Alpha ،IA64و ﻳﺎ .PowerPCاﻣﺎ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي ﺳﺎزﮔﺎر ﺑﺎ CLRﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﺳﻮرس ﺑﺮﻧﺎﻣﻪ ﻛﺪ ﻫﺎي ILﺗﻮﻟﻴﺪ ﻣـﻲ ﻛﻨﻨﺪ .در ﺣﻘﻴﻘﺖ اﻳﻦ ﻛﺪ ﻫﺎي ILﻫﺴﺘﻨﺪ ﻛﻪ از آﻧﻬﺎ ﺑﻪ ﻋﻨﻮان ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻳﺎد ﻣﻲ ﺷﻮد ،زﻳـﺮا CLRﻣـﺴﺌﻮل ﻣـﺪﻳﺮﻳﺖ اﻳﻦ ﻛﺪﻫﺎ در زﻣﺎن اﺟﺮا اﺳﺖ. ﻋﻼوه ﺑﺮ ﺗﻮﻟﻴﺪ ﻛﺪ ،ILﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي ﺳﺎزﮔﺎر ﺑﺎ CLRوﻇﻴﻔﻪ دارﻧﺪ ﻛﻪ اﻃﻼﻋﺎت ﻛﺎﻣﻞ metadataرا ﻧﻴﺰ در ﻓﺎﻳﻞ ﻗﺮار دﻫﻨﺪ .ﺑﻪ ﺑﻴﺎن ﺳﺎده metadata ،ﺟﺪوﻟﻲ دروﻧﻲ در ﻓﺎﻳﻞ اﺳﺖ ﻛﻪ ﺗﻮﺿﻴﺤﺎﺗﻲ راﺟﻊ ﺑﻪ ﻛﻼس ﻫﺎ و ﺗﻮاﺑﻊ اﺳﺘﻔﺎده ﺷﺪه در ﺑﺮﻧﺎﻣـﻪ را ﺷـﺎﻣﻞ ﻣﻲ ﺷﻮد .ﺑﻪ ﻋﻼوه metadata ،ﺷﺎﻣﻞ ﺟﺪوﻟﻲ اﺳﺖ ﻛﻪ ﻣﺤﺘـﻮي ﻛـﻼس ﻫـﺎي ﺧـﺎرﺟﻲ اﺳـﺖ ﻛـﻪ ﺑﺮﻧﺎﻣـﻪ اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨـﺪ. Metadataدر ﺣﻘﻴﻘﺖ ﻧﺴﺨﻪ ﺟﺪﻳﺪ ﺗﻜﻨﻮﻟﻮژي ﻫﺎﻳﻲ ﻣﺜﻞ Type Libraryو ﻳﺎ ﻓﺎﻳﻠﻬﺎي 1IDLاﺳﺖ .اﻣﺎ ﻧﻜﺘﻪ ﻣﻬـﻢ اﻳﻦ اﺳﺖ ﻛﻪ metadataﻧﺴﺒﺖ ﺑﻪ اﻳﻦ ﺗﻜﻨﻮﻟﻮژي ﻫﺎ ﺑﺴﻴﺎر ﻛﺎﻣﻠﺘﺮ اﺳﺖ و ﺑﺮ ﺧﻼف ﻣـﻮارد ذﻛـﺮ ﺷـﺪهmetadata ،ﻫـﺎ در ﻓﺎﻳﻠﻲ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ ﻛﻪ ﻣﺤﺘﻮي ﻛﺪ ILاﺳﺖ .ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ اﻳﻦ اﻃﻼﻋﺎت را ﻫﻨﮕـﺎم اﺟـﺮاي ﻛـﺪ ﺗﻮﻟﻴـﺪ ﻣـﻲ ﻛﻨـﺪ ،اﻣﻜـﺎن ﻧﺎﻫﻤﺎﻫﻨﮕﻲ ﺑﻴﻦ اﻳﻦ اﻃﻼﻋﺎت و ﻛﺪ اﺻﻠﻲ ﻧﻴﺰ از ﺑﻴﻦ ﺧﻮاﻫﺪ رﻓﺖ. ﺑﻌﻀﻲ از ﻣﻮارد اﺳﺘﻔﺎده metadataﻋﺒﺎرت اﻧﺪ از: (1
Metadataﻧﻴﺎز ﺑﻪ ﻓﺎﻳﻞ ﻫﺎي ﻫﺪر و ﻳﺎ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎ را ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﺣﺬف ﻣﻲ ﻛﻨﺪ ،زﻳﺮا ﺗﻤﺎم اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز در ﻣﻮرد ﺗﻮاﺑﻊ و ﻛﻼﺳﻬﺎي اﺳﺘﻔﺎده ﺷﺪه در ﻓﺎﻳﻞ ﺣﺎوي ﻛﺪ ILدر ﺧﻮد ﻓﺎﻳﻞ ﻗﺮار دارﻧﺪ .ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫـﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ اﻃﻼﻋﺎت metadataرا ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ از داﺧﻞ ﻓﺎﻳﻠﻬﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه اﺳﺘﺨﺮاج ﻛﺮده و از آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﻨﻨﺪ. Interface Definition Language
1
٩٢١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(2
(3
(4 (5
ﻣﺤﻴﻂ ﻫﺎي ﻃﺮاﺣﻲ از ﻗﺒﻴﻞ وﻳﮋوال اﺳﺘﻮدﻳﻮ ،از اﻳﻦ اﻃﻼﻋﺎت ﺑﺮاي ﻛﻤﻚ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻫﻨﮕـﺎم ﻧﻮﺷـﺘﻦ ﻛـﺪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ .در ﺣﻘﻴﻘﺖ وﻳﮋﮔﻲ ﻫﻮﺷﻴﺎري در وﻳﮋوال اﺳﺘﻮدﻳﻮ ) (IntelliSenseﻛﻪ ﺑﺮاي ﻛﺎﻣﻞ ﻛﺮدن ﻛﺪﻫﺎ و ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﻻزم در ﻣﻮرد ﺗﻮاﺑﻊ ﻣﻮرد اﺳﺘﻔﺎده در ﻛﺪ ﺑﻪ ﻛﺎر ﻣـﻲ رود ،ﺑـﺎ اﺳـﺘﻔﺎده از ﺗﺤﻠﻴـﻞ اﻃﻼﻋﺎت ﻣﻮﺟﻮد در metadataاﻧﺠﺎم ﻣﻲ ﺷﻮد. وﻳﮋﮔﻲ ﺑﺮرﺳﻲ و ﺗﺎﻳﻴﺪ اﻣﻨﻴﺖ ﻛﺪ ،ﺑﺎ اﺳﺘﻔﺎده از اﻃﻼﻋﺎت ﻣﻮﺟـﻮد در metadataﺻـﻮرت ﻣـﻲ ﮔﻴـﺮد .ﺑـﻪ ﻛﻤﻚ اﻳﻦ وﻳﮋﮔﻲ CLRﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﻛﻪ ﻓﻘﻂ ﻛﺪ ﻫﺎﻳﻲ ﻛﻪ داراي دﺳﺘﻮرات ﺗﺒﺪﻳﻞ ﻣﺘﻐﻴﻴﺮ ﺑﻪ ﺻﻮرت اﻣـﻦ ) (Safeﻫﺴﺘﻨﺪ ﺻﻮرت ﮔﻴﺮﻧﺪ ).(Verification 1 Metadataﺑﻪ ﻳﻚ ﺷﻴﺊ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﺳﺮﻳﺎﻻﻳﺰ ﺷﺪه و در ﺣﺎﻓﻈﻪ ﻗﺮار ﮔﻴﺮد ،ﺑﻪ وﺳـﻴﻠﻪ ﺷـﺒﻜﻪ ﺑـﻪ ﻳﻚ وﺳﻴﻠﻪ دﻳﮕﺮ ﻣﻨﺘﻘﻞ ﺷﻮد و در آﻧﺠﺎ ﻣﺠﺪداً ﺑﻪ ﺣﺎﻟﺖ اوﻟﻴﻪ ﺗﺒﺪﻳﻞ ﺷﻮد. Metadataﺑﻪ 2GCاﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﻛﻪ ﻃﻮل ﻋﻤﺮ اﺷﻴﺎ را ﻛﻨﺘﺮل ﻛﻨـﺪ ،در ﺻـﻮرت ﻟـﺰوم آﻧﻬـﺎ را ﺣﺬف ﻛﺮده و ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ داده ﺷﺪه ﺑﻪ آﻧﻬﺎ را آزاد ﻛﻨﺪ .ﺑﺮاي ﺗﻤﺎم اﻧﻮاع اﺷﻴﺎ GC ،ﻣﻲ ﺗﻮاﻧﺪ ﻧـﻮع ﺷـﻴﺊ را ﺗﺸﺨﻴﺺ دﻫﺪ و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از metadataﺗﺮﺗﻴﺐ اﺷﺎره اﺷﻴﺎ ﺑﻪ ﻳﻜﺪﻳﮕﺮ را ﺗﺸﺨﻴﺺ دﻫﺪ.
ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي زﺑﺎن ﻫﺎي J# ،Jscript ،Visual Basic ،C#و ﻧﻴﺰ اﺳﻤﺒﻠﺮ ILﻫﻤﻮاره ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه اي ﺗﻮﻟﻴﺪ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﺑﺮاي اﺟﺮا ﺑﻪ CLRاﺣﺘﻴﺎج دارﻧﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي VB 6و ﻳـﺎ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي MFCدر ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ،ﺑﻪ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي Visual Basicو ﻳﺎ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي 3MFCﻧﻴﺎز اﺳﺖ ،اﺟﺮاي ﻓﺎﻳﻞ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻛﻪ ﺗﻮﺳﻂ اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ ﺗﻮﻟﻴﺪ ﻣﻲ ﺷﻮﻧﺪ ﻧﻴﺰ ﺑﻪ CLRاﺣﺘﻴﺎج دارﻧﺪ. ﻛﺎﻣﭙﺎﻳﻠﺮ C++ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﺮ ﺧﻼف دﻳﮕﺮ زﺑﺎن ﻫﺎ ،ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه )ﻛﺪ ﻫﺎي ﻋﺎدي EXEو ﻳﺎ DLLﻛﻪ ﻫﻢ اﻛﻨـﻮن وﺟﻮد دارﻧﺪ( ﺗﻮﻟﻴﺪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻓﺎﻳﻠﻬﺎ ﺑﺮاي اﺟﺮا ﺑﻪ CLRﻧﻴﺎز ﻧﺪارﻧﺪ .ﺑﺮاي ﺗﻮﻟﻴﺪ ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺗﻮﺳﻂ اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﺑﺎﻳﺪ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ از ﻳﻜﻲ از ﺳﻮﻳﻴﭻ ﻫﺎي ﺧﻂ ﻓﺮﻣﺎن اﺳﺘﻔﺎده ﻛﺮد .ﺑﻴﻦ ﺗﻤﺎم ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎﻳﻲ ﻛﻪ ذﻛﺮ ﺷﺪ ﻓﻘﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ C++ﻣﺎﻳﻜﺮوﺳـﺎﻓﺖ اﻳﻦ اﻣﻜﺎن را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ ﻛﻪ در ﻳﻚ ﻣﺎژول از ﻫﺮ دو ﻧﻮع ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷـﺪه و ﻣـﺪﻳﺮﻳﺖ ﻧـﺸﺪه اﺳـﺘﻔﺎده ﻛﻨـﺪ .اﻳـﻦ ﻣﻮﺿﻮع ﻫﻨﮕﺎم ﻃﺮاﺣﻲ ﻛﺪ اﻳﻦ اﻣﻜﺎن را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ دﻫﺪ ﻛﻪ ﻛﻼﺳﻬﺎي ﺟﺪﻳﺪ ﺧﻮد را ﺑﻪ ﺻـﻮرت ﻣـﺪﻳﺮﻳﺖ ﺷـﺪه اﻳﺠـﺎد ﻛﺮده ،وﻟﻲ ﻫﻤﭽﻨﺎن از ﻛﻼﺳﻬﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﻗﺒﻠﻲ ﻧﻴﺰ اﺳﺘﻔﺎده ﻛﻨﺪ.
ﺗﺮﻛﻴﺐ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در اﺳﻤﺒﻠﻲ ﻫﺎ: در واﻗﻌﻴﺖ CLRﺑﺎ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻛﺎر ﻧﻤﻲ ﻛﻨﺪ ،ﺑﻠﻜﻪ ﺑﺎ اﺳﻤﺒﻠﻲ ﻫﺎ ﻛﺎر ﻣﻲ ﻛﻨﺪ .اﺳﻤﺒﻠﻲ ،ﻣﻔﻬﻮﻣﻲ اﻧﺘﺰاﻋﻲ اﺳﺖ ﻛـﻪ درك آن ﻣﻤﻜﻦ اﺳﺖ اﺑﺘﺪا ﻣﺸﻜﻞ ﺑﻪ ﻧﻈﺮ رﺳﺪ .در ﺗﻌﺮﻳﻒ اول ،اﺳﻤﺒﻠﻲ ﻳﻚ ﺗﺮﻛﻴﺐ ﻣﻨﻄﻘﻲ از ﻳﻚ ﻳﺎ ﭼﻨﺪ ﻣـﺎژول ﻣـﺪﻳﺮﻳﺖ ﺷـﺪه اﺳﺖ .در ﺗﻌﺮﻳﻒ دوم ﻣﻴﺘﻮان ﮔﻔﺖ ﻛﻪ اﺳﻤﺒﻠﻲ ﻛﻮﭼﻜﺘﺮﻳﻦ واﺣﺪي اﺳﺖ ﻛﻪ ﻗﺎﺑﻠﻴﺖ اﺳﺘﻔﺎده ﻣﺠـﺪد ،4ﺗﻌﻴـﻴﻦ ﺳـﻄﻮح اﻣﻨﻴﺘـﻲ و ﻳـﺎ ﺗﻌﻴﻴﻦ ﻧﺴﺨﻪ 5را دارد .ﺑﺴﺘﻪ ﺑﻪ اﻧﺘﺨﺎب ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻣﻲ ﺗﻮان ﺑﻪ وﺳﻴﻠﻪ اﺑﺰارﻫﺎي ﻣﻮرد اﺳـﺘﻔﺎده ﺑـﺮاي ﻛﺎﻣﭙﺎﻳـﻞ ﺑﺮﻧﺎﻣـﻪ ،ﻓﺎﻳﻠﻬـﺎي اﺳﻤﺒﻠﻲ ﻳﺎ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺗﻮﻟﻴﺪ ﻛﺮد. ﺷﻜﻞ زﻳﺮ ﺑﻪ درك ﻣﻔﻬﻮم اﺳﻤﺒﻠﻲ ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در اﻳﻦ ﺷﻜﻞ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ،ﺑﻌﻀﻲ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷـﺪه و ﻣﻨﺎﺑﻊ ﺑﺮﻧﺎﻣﻪ ﺑﻪ وﺳﻴﻠﻪ ﻳﻚ اﺑﺰار ﺗﺤﺖ ﭘﺮدازش ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ .اﻳﻦ اﺑﺰار ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ﺗﻮﻟﻴﺪ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﮔﺮوه ﺑﻨﺪي ﻣﻨﻄﻘـﻲ 1
Serialization Garbage Collector 3 Microsoft Foundation Class 4 Reusability 5 Versioning 2
٩٢٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﭼﻨﺪ ﻓﺎﻳﻞ را ﺑﻴـﺎن ﻣـﻲ ﻛﻨـﺪ .ﻓﺎﻳـﻞ ﺗﻮﻟﻴـﺪ ﺷـﺪه ﺷـﺎﻣﻞ ﻳـﻚ ﺑـﻼك داده اي اﺳـﺖ ﻛـﻪ manifestﻧﺎﻣﻴـﺪه ﻣـﻲ ﺷـﻮد. Manifestﻛﻪ در واﻗﻊ ﺑﻪ ﺗﻌﺪادي از ﺟﺪول ﻫﺎي ﻣﻮﺟﻮد در metadataاﻃﻼق ﻣﻲ ﺷﻮد ،ﺷﺎﻣﻞ اﻃﻼﻋﺎﺗﻲ در راﺑﻄـﻪ ﺑﺎ ﻓﺎﻳﻞ ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ اﺳﻤﺒﻠﻲ را ﺗﺸﻜﻴﻞ ﻣﻲ دﻫﺪ .ﺑﻪ ﻋﻼوه اﻃﻼﻋﺎﺗﻲ راﺟﻊ ﺑﻪ ﺗﻮاﺑﻊ و ﻛﻼس ﻫﺎﻳﻲ از اﻳﻦ اﺳﻤﺒﻠﻲ ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ وﺳﻴﻠﻪ ي دﻳﮕﺮ اﺳﻤﺒﻠﻲ ﻫﺎ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮد )ﻣﺎﻧﻨﺪ ﻛﻼﺳﻬﺎي ،(publicو ﻧﻴﺰ ﻣﻨﺎﺑﻊ و ﻳﺎ ﻓﺎﻳﻠﻬﺎي اﻃﻼﻋﺎﺗﻲ ﻛـﻪ ﺑـﺎ اﻳﻦ اﺳﻤﺒﻠﻲ در ارﺗﺒﺎط ﻫﺴﺘﻨﺪ ﻧﻴﺰ در manifestﻗﺮار داده ﻣﻲ ﺷﻮد. ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ،ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه را ﺑﻪ ﻓﺎﻳﻠﻬﺎي اﺳﻤﺒﻠﻲ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﻨﺪ .ﺑﻪ ﻃﻮر ﻣﺜﺎل، ﻛﺎﻣﭙﺎﻳﻠﺮ C#ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ،ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن manifestﺑﻪ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷـﺪه و اﻧﺠـﺎم ﻛﺎرﻫـﺎﻳﻲ از اﻳـﻦ ﻗﺒﻴـﻞ ﻳـﻚ اﺳﻤﺒﻠﻲ ﺗﻮﻟﻴﺪ ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎم اﺳﺘﻔﺎده از اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ ،ﺑﺮاي ﺗﻮﻟﻴﺪ ﻳﻚ اﺳﻤﺒﻠﻲ ﻧﻴـﺎزي ﺑـﻪ اﺳـﺘﻔﺎده از ﺳـﻮﻳﻴﭻ ﺧﺎﺻـﻲ ﻧﻴﺴﺖ .اﻣﺎ در ﺷﺮاﻳﻄﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﺎ اﺳﺘﻔﺎده از ﭼﻨﺪ ﻣﺎژول ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻛﻪ ﻫﺮ ﻳﻚ در ﻓﺎﻳﻞ ﻣﺨﺼﻮص ﺑﻪ ﺧﻮد ﻗـﺮار دارﻧـﺪ، ﻳﻚ اﺳﻤﺒﻠﻲ اﻳﺠﺎد ﻛﻨﻴﻢ ﺑﺎﻳﺪ اﺑﺰارﻫﺎي دﻳﮕﺮي ﻣﺜﻞ ﻟﻴﻨﻜﺮ ﻫﺎ 1را ﺑﻪ ﻛﺎر ﺑﺒﺮﻳﻢ.
ﺗﺮﻛﻴﺐ ﻣﺎژول ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در اﺳﻤﺒﻠﻲ ﻫﺎ اﻳﻦ اﻣﺮ ﻛﻪ ﻳﻚ اﺳﻤﺒﻠﻲ از ﭼﻨﺪ ﻓﺎﻳﻞ ﺗﺸﻜﻴﻞ ﺷﺪه و ﻫﺮ ﻛﻼس در ﻳﻚ ﻓﺎﻳﻞ ﻗﺮار داده ﺷﻮد و ﻳﺎ اﻳﻨﻜﻪ ﺗﻤﺎم ﻛﻼﺳﻬﺎي ﻣﻮﺟـﻮد در اﺳﻤﺒﻠﻲ ،ﻫﻤﻪ در ﻳﻚ ﻓﺎﻳﻞ ﻗﺮار ﮔﻴﺮﻧﺪ ﻛﺎﻣﻼ ﺑﻪ ﻃﺮاح ﺑﺮﻧﺎﻣﻪ و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺴﺘﮕﻲ دارد .ﺑﻪ ﻃﻮر ﻣﺜﺎل ﺗﺼﻮر ﻛﻨﻴﺪ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺮﻧﺎﻣﻪ ي ﺧﻮد را از ﻃﺮﻳﻖ وب ﺗﻮزﻳﻊ ﻛﻨﻴﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻣﻲ ﺗﻮاﻧﻴﻢ ﻛﻼس ﻫﺎﻳﻲ از اﺳﻤﺒﻠﻲ ﻣﺮﺑﻮط ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ ﻛـﻪ ﻛﻤﺘـﺮ ﻣـﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد را در ﻳﻚ ﻓﺎﻳﻞ و ﻛﻼﺳﻬﺎي ﻣﻬﻢ و ﭘﺮ ﻛﺎرﺑﺮد را در ﻓﺎﻳـﻞ دﻳﮕـﺮ ﻗـﺮار دﻫـﻴﻢ .ﺑـﺪﻳﻦ وﺳـﻴﻠﻪ ﻓﺎﻳـﻞ ﺣـﺎوي ﻗﺴﻤﺘﻬﺎي ﻏﻴﺮ ﺿﺮوري ﻓﻘﻂ زﻣﺎﻧﻲ از اﻳﻨﺘﺮﻧﺖ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز اﺳﺖ .اﻳﻦ ﻋﻤﻞ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﺑﺎرﮔـﺬاري ﺑﺮﻧﺎﻣﻪ از وب ﻣﻲ ﺷﻮد و ﻧﻴﺰ ﻓﻀﺎي ﻛﻤﺘﺮي را در دﻳﺴﻚ اﺷﻐﺎل ﻣﻲ ﻛﻨﺪ. ﻳﻜﻲ دﻳﮕﺮ از وﻳﮋﮔﻲ ﻫﺎي ﻳﻚ اﺳﻤﺒﻠﻲ اﻳﻦ اﺳﺖ ﻛﻪ اﻃﻼﻋﺎت ﻛﺎﻓﻲ درﺑﺎره ﻣﻨﺎﺑﻊ و اﺳﻤﺒﻠﻲ ﻫﺎي دﻳﮕﺮي ﻛﻪ از آﻧﻬﺎ اﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨﺪ )ﺑﺮاي ﻣﺜﺎل ﺷﻤﺎره ﻧﺴﺨﻪ آﻧﻬﺎ( را ﻧﻴﺰ در ﺧﻮد ﻧﮕﻬﺪاري ﻣﻲ ﻛﻨﺪ .اﻳﻦ اﻣﺮ ﻣﻮﺟﺐ ﻣﻴﺸﻮد ﻛﻪ CLRﺑﺮاي اﺟـﺮاي اﺳـﻤﺒﻠﻲ ﺑـﻪ ﻣﻮارد اﺿﺎﻓﻲ ﻧﻴﺎز ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ اﺟﺮاي اﻳﻦ اﺳـﻤﺒﻠﻲ ﻫـﺎ ﺑـﻪ اﻳﺠـﺎد ﺗﻐﻴﻴـﺮات در رﺟﻴـﺴﺘﺮي و ﻳـﺎ Active Directoryﻧﺪارد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺗﻮزﻳﻊ اﻳﻦ اﺳﻤﺒﻠﻲ ﻫﺎ ﺑﺴﻴﺎر ﺳﺎده ﺗﺮ از ﺗﻮزﻳﻊ ﻛﺎﻣﭙﻮﻧﻨـﺖ ﻫـﺎي ﻣـﺪﻳﺮﻳﺖ ﻧـﺸﺪه اﺳـﺖ. ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده از روش XCOPYﺑﺮاي ﺗﻮزﻳﻊ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ي .NETﻧﻴﺰ ﺑـﻪ ﻫﻤـﻴﻦ دﻟﻴـﻞ اﺳـﺖ ﻛـﻪ اﺳﻤﺒﻠﻲ ﻫﺎي ﻣﻮرد اﺳﺘﻔﺎده در ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﺻﻮرت ﻛﺎﻣﻞ ﺧﻮد و ﻫﻤﭽﻨﻴﻦ ﻓﺎﻳﻠﻬﺎي ﻣﻮرد ﻧﻴﺎزﺷﺎن را ﺗﻮﺻﻴﻒ ﻛﻨﻨﺪ.
)Assembly Linker (al.exe
1
٩٢٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺎرﮔﺬاري :Common Language Runtime ﻫﺮ اﺳﻤﺒﻠﻲ ﻛﻪ اﻳﺠﺎد ﻣﻲ ﺷﻮد ﻣﻲ ﺗﻮاﻧﺪ ﻳﺎ ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ﺑﺎﺷﺪ و ﻳﺎ ﻳﻚ ﻓﺎﻳﻞ DLLﻛﻪ ﺷـﺎﻣﻞ ﭼﻨـﺪ ﻛـﻼس ﺑـﺮاي اﺳـﺘﻔﺎده ﺗﻮﺳﻂ ﻓﺎﻳﻠﻬﺎي اﺟﺮاﻳﻲ اﺳﺖ .در ﻫﺮ ﺻﻮرت CLRﻣﺴﺌﻮل اﺟﺮاي ﻛﺪ ﻫﺎي داﺧﻞ اﻳﻦ اﺳﻤﺒﻠﻲ اﺳﺖ .اﻳﻦ اﻣﺮ ﺑﺪﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺑﺮاي اﺟﺮاي اﻳﻦ ﻓﺎﻳﻠﻬﺎ ﺑﺎﻳﺪ اﺑﺘﺪا .NET Frameworkدر ﻛﺎﻣﭙﻴﻮﺗﺮ ﻣﻘﺼﺪ ﻧﺼﺐ ﺷﻮد .اﻟﺒﺘﻪ در ﻧﺴﺨﻪ ﻫﺎي ﺟﺪﻳﺪ وﻳﻨﺪوز ﺑﻪ ﺻﻮرت دروﻧﻲ .NET Frameworkوﺟﻮد دارد و ﻧﻴﺎزي ﺑﻪ ﻧﺼﺐ آن ﻧﻴﺴﺖ. ﻫﻨﮕﺎم اﻳﺠﺎد ﻳﻚ اﺳﻤﺒﻠﻲ اﺟﺮاﻳﻲ ) ،(EXEﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻘﺪاري اﻃﻼﻋﺎت ﺧﺎص را ﺑﻪ ﺑﺨﺶ .textدر ﻗﺴﻤﺖ ﻫـﺪر اﻳـﻦ ﻓﺎﻳـﻞ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ اﻃﻼﻋﺎت زﻣﺎن اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﻮﺟﺐ اﺟﺮاي CLRﻣﻲ ﺷﻮﻧﺪ .ﺳﭙﺲ CLRﺑﺎ ﺗﺸﺨﻴﺺ ﻧﻘﻄﻪ ورودي ﺑﺮﻧﺎﻣﻪ، ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ آﻏﺎز ﺑﻪ ﻛﺎر ﻛﻨﺪ. ﺑﻪ ﻃﻮر ﻣﺸﺎﺑﻪ اﮔﺮ ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ،ﺑﺎ اﺳﺘﻔﺎده از LoadLibraryﺳﻌﻲ در ﺑﺎرﮔـﺬاري و اﺳـﺘﻔﺎده از ﻳـﻚ اﺳﻤﺒﻠﻲ ﻣﺪﻳﺮﻳﺖ ﺷﺪه را داﺷﺘﻪ ﺑﺎﺷﺪ ،ﻗﺒﻞ از اﺟﺮاي ﻓﺎﻳﻞ ﺑﺮﻧﺎﻣﻪ CLR ،اﺟﺮا ﺷﺪه و ﻛﻨﺘﺮل ﻓﺎﻳﻞ ﻣﺪﻳﺮﻳﺖ ﺷـﺪه را در دﺳـﺖ ﻣـﻲ ﮔﻴﺮد.
ﺑﺎرﮔﺬاري و ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺑﻪ CLR ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ را اﻳﺠﺎد ﻣﻴﻜﻨﺪ ،ﻋﺒﺎرت زﻳﺮ را ﺑﻪ ﺑﺨﺶ .textدر ﻫﺪر ﻣﺮﺑﻮط ﺑﻪ ﻓﺎﻳﻞ اﺿﺎﻓﻪ ﻣﻴﻜﻨﺪ: JMP _CorExeMain اﻳﻦ دﺳﺘﻮر ،ﻳﻚ دﺳﺘﻮر ﺑﻪ زﺑﺎن اﺳﻤﺒﻠﻲ اﺳﺖ ﻛﻪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ اي ﺑﻪ ﻧﺎم _CorExeMainرا ﻓﺮاﺧﻮاﻧﻲ ﻣـﻲ ﻛﻨـﺪ .ﺑـﻪ دﻟﻴـﻞ اﻳﻨﻜﻪ زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي _CorExeMainدر ﻓﺎﻳﻞ 1MSCorEE.dllﻗﺮار دارد ،ﭘﺲ اﺳﻢ MSCorEE.dllﻧﻴﺰ ﺑﻪ ﻋﻨﻮان ﻳﻜﻲ از ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼﺳﻲ ﻛﻪ ﺗﻮﺳﻂ ﻓﺎﻳﻞ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ در ﺑﺨﺶ .idataاﺿﺎﻓﻪ ﻣـﻲ ﺷـﻮد. زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﻓﺎﻳﻞ اﺟﺮاﻳﻲ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد ،وﻳﻨﺪوز ﺑﺎ آن ﺑﻪ ﺻﻮرت ﻳﻚ ﻓﺎﻳﻞ ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه و ﻣﻌﻤﻮﻟﻲ ﺑﺮﺧـﻮرد ﻣــﻲ ﻛﻨــﺪ .ﺑﺮﻧﺎﻣــﻪ ي ﻣﺨــﺼﻮص ﺑﺎرﮔــﺬاري در وﻳﻨــﺪوز ،ﺑــﺎ ﺑﺮرﺳــﻲ ﻗــﺴﻤﺖ .idataﺷــﺮوع ﺑــﻪ ﺑﺎرﮔــﺬاري ﻓﺎﻳــﻞ MSCorEE.dllدر ﺣﺎﻓﻈﻪ ﻣﻲ ﻛﻨـﺪ و آن را در ﺣﺎﻓﻈـﻪ ﻗـﺮار ﻣـﻲ دﻫـﺪ .ﺳـﭙﺲ ﺑﺮﻧﺎﻣـﻪ ﺑـﺎ ﺑﺪﺳـﺖ آوردن آدرس ﺗـﺎﺑﻊ _CorExeMainاﻳﻦ ﻣﺘﺪ را اﺟﺮا ﻣﻲ ﻛﻨﺪ. Microsoft Component Object Runtime Execution Engine
1
٩٢٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﭘﺮوﺳﻪ اﺻﻠﻲ ﻛﻪ ﻣﺮﺑﻮط ﺑﻪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اﺳﺖ ﺑﻪ اﺟﺮاي ﺗﺎﺑﻊ _CorExeMainﻣﻲ ﭘﺮدازد .اﺟﺮاي اﻳﻦ ﺗـﺎﺑﻊ ﻣﻨﺠﺮ ﺑﻪ اﺟﺮا ﺷﺪن CLRو ﺑﺎرﮔﺬاري آن در ﺣﺎﻓﻈﻪ ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺎ اﺟﺮا ﺷﺪن ،CLRﻛﻨﺘﺮل ﺑﺮﻧﺎﻣﻪ در اﺧﺘﻴﺎر آن ﻗﺮار ﻣـﻲ ﮔﻴـﺮد. CLRﻧﻴﺰ اﺑﺘﺪا ﺑﺎ ﺑﺮرﺳﻲ ﺑﺨﺶ ﻫﺪر CLRﻣﺮﺑﻮط ﺑﻪ ﻓﺎﻳﻞ ،ﻧﻘﻄﻪ آﻏﺎزﻳﻦ ﺑﺮﻧﺎﻣﻪ را ﻣﺸﺨﺺ ﻣـﻲ ﻛﻨـﺪ .ﺳـﭙﺲ CLRﻛـﺪ IL ﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه را ﺑﻪ وﺳﻴﻠﻪ ي JITﺑﻪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻛﺮده و آن را اﺟـﺮا ﻣﻴﻜﻨـﺪ )اﻳـﻦ ﻋﻤـﻞ در ﭘﺮوﺳـﻪ اﺻﻠﻲ ﺑﺮﻧﺎﻣﻪ ﺻﻮرت ﻣﻲ ﮔﻴﺮد( .در اﻳﻦ ﻣﺮﺣﻠﻪ اﺟﺮاي ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه آﻏﺎز ﻣﻲ ﺷﻮد. ﻫﻤﻴﻦ ﺷﺮاﻳﻂ ﺑﺮاي اﻳﺠﺎد DLLﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻧﻴﺰ ﺻﺎدق اﺳﺖ .اﮔﺮ اﻳـﻦ DLLﺑـﻪ وﺳـﻴﻠﻪ ي ﻳـﻚ ﻓﺎﻳـﻞ اﺟﺮاﻳـﻲ ﻛـﻪ ﺑـﺎ .NETاﻳﺠﺎد ﺷﺪه اﺳﺖ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﺑﮕﻴﺮد ،ﭘﺲ ﺣﺘﻤﺎً ﺗﺎﻛﻨﻮن CLRاﺟﺮا ﺷﺪه اﺳﺖ و ﻣﻲ ﺗﻮاﻧﺪ ﻛﻨﺘﺮل اﻳﻦ DLLرا ﻧﻴﺰ در دﺳﺖ ﺑﮕﻴﺮد .اﻣﺎ ﺗﺼﻮر ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ اﻳﻦ DLLﻣـﻲ ﺧﻮاﻫـﺪ ﺑـﻪ وﺳـﻴﻠﻪ ي ﻳـﻚ ﻓﺎﻳـﻞ اﺟﺮاﻳـﻲ ﻋـﺎدي ،ﺑـﺎ اﺳـﺘﻔﺎده از ﺗـﺎﺑﻊ LoadLibraryاﺳﺘﻔﺎده ﺷﻮد .در اﻳﻦ ﺷﺮاﻳﻂ ﻗﺒﻞ از اﻳﻨﻜﻪ DLLاﺟﺮا ﺷﻮد ،ﺑﺎﻳﺪ CLRدر ﺣﺎﻓﻈﻪ ﻗﺮار ﮔﻴﺮد ﺗﺎ ﺑﺘﻮاﻧﺪ ﻛﺪ ﻫﺎي ﻣﻮﺟﻮد در DLLرا ﻛﻨﺘﺮل ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﺷﺮاﻳﻂ ﻧﻴﺰ اﺗﻔﺎﻗﺎﺗﻲ ﻫﻤﺎﻧﻨﺪ اﺟﺮا ﺷﺪن ﻳـﻚ ﻓﺎﻳـﻞ EXEﻛـﻪ ﺑـﺎ .NET اﻳﺠﺎد ﺷﺪه اﺳﺖ رخ ﻣﻲ دﻫﺪ .ﻳﻌﻨﻲ ﻫﻨﮕﺎم ﺳﺎﺧﺘﻦ DLLﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ،ﻛﺎﻣﭙﺎﻳﻠﺮ دﺳﺘﻮر زﻳﺮ را ﺑـﻪ ﺑﺨـﺶ .textﻫـﺪر ﻣﺮﺑﻮط ﺑﻪ اﺳﻤﺒﻠﻲ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ: JMP _CorDllMain زﻳﺮ ﺑﺮﻧﺎﻣﻪ ي _CorDllMainﻧﻴﺰ در ﻓﺎﻳﻞ MSCorEE.dllﻗﺮار داده ﺷﺪه اﺳﺖ و اﻳﻦ اﻣﺮ ﻣﻮﺟﺐ ﻣﻲ ﺷـﻮد ﻛـﻪ ﻧﺎم اﻳﻦ ﻓﺎﻳﻞ ﺑﻪ ﺑﺨﺶ .idataاﺿﺎﻓﻪ ﺷﻮد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ وﻳﻨﺪوز ﻓﺎﻳﻞ ﻣﺮﺑﻮط ﺑﻪ DLLرا ﺑﺎرﮔـﺬاري ﻣـﻲ ﻛﻨـﺪ ،اﺑﺘـﺪا ﻓﺎﻳـﻞ MSCorEE.dllرا در ﺣﺎﻓﻈﻪ ﻗﺮار ﻣﻲ دﻫﺪ )اﻟﺒﺘﻪ اﮔﺮ ﺗﺎﻛﻨﻮن ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ي دﻳﮕﺮي ﺑﺎرﮔـﺬاري ﻧـﺸﺪه ﺑﺎﺷـﺪ( و ﺳـﭙﺲ آدرس ﺗﺎﺑﻊ ﻣﺬﻛﻮر را در ﺣﺎﻓﻈﻪ ﺑﺪﺳﺖ ﻣﻲ آورد .ﭘﺮوﺳﻪ اي ﻛﻪ ﺗﺎﺑﻊ LoadLibraryرا در اﺑﺘﺪا ﻓﺮاﺧﻮاﻧﻲ ﻛﺮده ﺑﻮد ﺗﺎ ﻛـﺪ ﻫﺎي درون DLLرا اﺟﺮا ﻛﻨﺪ ،ﺗﺎﺑﻊ _CorDllMainرا از ﻓﺎﻳﻞ MSCorEE.dllاﺟﺮا ﻣﻲ ﻛﻨﺪ .اﺟﺮاي اﻳـﻦ ﺗـﺎﺑﻊ ﻧﻴﺰ ﻣﻮﺟﺐ راه اﻧﺪازي CLRﺷﺪه و ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻣﻴﺘﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﻋﺎدي اﺟﺮا ﺷﻮد.. ﻣﻮاردي ﻛﻪ ﺑﺮاي اﺟﺮاي ﻓﺎﻳﻠﻬﺎي ﻣﺤﺘﻮي ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ذﻛﺮ ﺷـﺪ ﻓﻘـﻂ در وﻳﻨـﺪوز ﻫـﺎي NT 4 ،ME ،98 SE ،98و 2000ﻻزم اﺳﺖ زﻳﺮا اﻳﻦ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻠﻬﺎ ﻗﺒﻞ از ﻋﺮﺿﻪ CLRﺑﻪ وﺟﻮد آﻣﺪه اﻧﺪ .وﻳﻨﺪوز XPو وﻳﻨﺪوز ﺳﺮور 2003ﺑﻪ ﺻﻮرت دروﻧﻲ اﺟﺮاي ﻓﺎﻳﻠﻬﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ و ﻧﻴﺎزي ﺑﻪ ﻣﻮارد ذﻛﺮ ﺷﺪه ﻧﻴﺴﺖ .ﻧﻜﺘﻪ دﻳﮕﺮ اﻳﻦ اﺳﺖ ﻛﻪ اﻳـﻦ ﺗﻮاﺑـﻊ ﻣﺨﺼﻮص دﺳﺘﮕﺎﻫﻬﺎي x86ﻫﺴﺘﻨﺪ و در ﻣﺪل ﻫﺎ و ﺳﺎﺧﺘﺎرﻫﺎي دﻳﮕﺮ ﭘﺮدازﻧﺪه درﺳﺖ ﻋﻤﻞ ﻧﻤﻲ ﻛﻨﻨﺪ.
اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه: ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ﻓﺎﻳﻠﻬﺎي اﺳﻤﺒﻠﻲ ﻣﺤﺘﻮي metadataو ﻛﺪ ﻫﺎي ILﻫﺴﺘﻨﺪ IL .ﻳﻚ زﺑﺎن ﺳﻄﺢ ﻣﻴﺎﻧﻲ اﺳـﺖ ﻛـﻪ ﺗﻮﺳﻂ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ اﻳﺠﺎد ﺷﺪه اﺳﺖ .اﻳﻦ زﺑﺎن ﻧﺴﺒﺖ ﺑﻪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺑﺴﻴﺎر ﺳﻄﺢ ﺑﺎﻻﺗﺮ اﺳﺖ .ﺗـﺸﺨﻴﺺ اﺷـﻴﺎي اﻳﺠـﺎد ﺷـﺪه از ﻛﻼﺳﻬﺎ و دﺳﺘﻮراﺗﻲ ﺑﺮاي اﻳﺠﺎد و ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ آﻧﻬﺎ ،ﺗﻮاﻧﺎﻳﻲ ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ داﺧﻞ اﺷﻴﺎ ،ﻗﺎﺑﻠﻴﺖ ﺧﻄﺎ ﻳﺎﺑﻲ در داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻧﮕﻬﺪاري ﻋﻨﺎﺻﺮ در ﻳﻚ آراﻳﻪ ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ از ﺗﻮاﻧﺎﻳﻲ ﻫﺎي اﻳﻦ زﺑﺎن ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد .در ﺣﻘﻴﻘﺖ اﻳﻦ زﺑـﺎن ﻳـﻚ ﻧـﺴﺨﻪ ﺷﻴﺊ ﮔﺮا از زﺑﺎن ﻣﺎﺷﻴﻦ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود. ﻣﻌﻤﻮﻻ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺑﺮاي ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ از زﻳﺎﻧﻬﺎي ﺳﻄﺢ ﺑﺎﻻ ﻣﺎﻧﻨﺪ C#و ﻳﺎ Visual Basicاﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨﻨـﺪ. ﺳﭙﺲ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻛﺪ اﻳﻦ زﺑﺎﻧﻬﺎ را ﺑﻪ ILﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ. ﺑﻌﻀﻲ از ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻋﻘﻴﺪه دارﻧﺪ ﻛﻪ زﺑﺎن ILﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ از اﻟﮕﻮرﻳﺘﻢ ﻫﺎﻳﻲ ﻛﻪ آﻧﻬﺎ اﺳﺘﻔﺎده ﻛﺮده اﻧـﺪ ﻣﺤﺎﻓﻈـﺖ ﻛﻨﺪ .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ،ﺑﻪ ﻧﻈﺮ آﻧﻬﺎ ﻣﻲ ﺗﻮان ﻳﻚ ﻓﺎﻳﻞ ﺣﺎوي ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺗﻮﻟﻴﺪ ﻛﺮده و ﺳﭙﺲ ﺑﺎ اﺳﺘﻔﺎده از ﺑﺮﻧﺎﻣـﻪ ﻫـﺎﻳﻲ ﻛـﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻛﺪ ILرا ﻧﻤﺎﻳﺶ دﻫﻨﺪ )ﻣﺎﻧﻨﺪ (1ildasmو ﻣﺸﺎﻫﺪه ﻛﺪ ILﻳﻚ ﺑﺮﻧﺎﻣﻪ ،ﺑﻪ اﻟﮕﻮرﻳﺘﻢ اﺻﻠﻲ آن دﺳﺖ ﭘﻴﺪا ﻛﻨﻨﺪ. IL Disassembler
1
٩٢٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻳﻦ اﻣﺮ ﻛﺎﻣﻼً درﺳﺖ اﺳﺖ و ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ از اﻣﻨﻴﺖ ﻛﺪ ﭘﺎﻳﻴﻦ ﺗﺮي ﻧﺴﺒﺖ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫـﺎي ﻣﺤﺘﻮي ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ دارﻧﺪ .اﻟﺒﺘﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب و ﻳﺎ وب ﺳﺮوﻳﺲ ﻫﺎ و ﺑﻪ ﻃﻮر ﻛﻠﻲ ﺑﺮﻧﺎﻣﻪ ﻫـﺎﻳﻲ ﻛـﻪ در ﻳـﻚ ﺳـﺮور ﻣﺮﻛﺰي اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ ﻛﻤﺘﺮ از اﻳﻦ ﻟﺤﺎظ در ﺧﻄﺮ ﻫﺴﺘﻨﺪ ،زﻳﺮا ﻓﻘﻂ ﺗﻌﺪاد ﻣﺤﺪودي از اﻓـﺮاد ﺑـﻪ ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﻣﻮﺟـﻮد در ﺳـﺮور دﺳﺘﺮﺳﻲ دارﻧﺪ و ﺑﻨﺎﺑﺮاﻳﻦ ﻛﺪﻫﺎ ﻛﺎﻣﻼً اﻳﻤﻦ ﺧﻮاﻫﻨﺪ ﻣﺎﻧﺪ. اﻣﺎ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺻﻮرت ﻋﻤﻮﻣﻲ ﺗﻮزﻳﻊ ﺷﻮﻧﺪ ،ﻣﻴﺘﻮان از ﻧﺮم اﻓﺰارﻫﺎي ﺷﺮﻛﺘﻬﺎي دﻳﮕـﺮ ﻛـﻪ ﻛـﺪ ﻫـﺎي ILرا ﮔﻨﮓ و ﻧﺎﻣﻔﻬﻮم ﻣﻴﻜﻨﻨﺪ اﺳﺘﻔﺎده ﻛﺮد .اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺗﻤﺎﻣﻲ ﻧﺎﻣﻬﺎي ﺑﻪ ﻛﺎر رﻓﺘﻪ در ﻛﺪ )ﻣﺎﻧﻨﺪ ﻧﺎم ﺗﻮاﺑﻊ ،ﻣﺘﻐﻴﻴﺮ ﻫﺎ و (...را ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﻨﺪ و آﻧﻬﺎ را ﺑﺎ ﻧﺎﻣﻬﺎي ﺑﺪون ﻣﻌﻨﻲ ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﻛﻨﻨﺪ .ﺑﻪ اﻳﻦ ﺗﺮﺗﻴﺐ ﻫﺪف و وﻇﻴﻔﻪ ﻫﺮ ﺗـﺎﺑﻊ از روي ﻧـﺎم آن ﻗﺎﺑـﻞ ﺗـﺸﺨﻴﺺ ﻧﺨﻮاﻫﺪ ﺑﻮد و ﻓﺮد ﻧﻤﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻣﺸﺎﻫﺪه ي ﻛﺪ ILﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺳﺎدﮔﻲ از اﻟﮕﻮرﻳﺘﻢ آن ﻣﻄﻠﻊ ﺷﻮد .ﺷﺎﻳﺎن ذﻛﺮ اﺳﺖ ﻛﻪ ﻗـﺪرت اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ در ﻧﺎﻣﻔﻬﻮم ﻛﺮدن ﻛﺪ ILﺗﻮﻟﻴﺪ ﺷﺪه ﻣﺤﺪود اﺳﺖ ،زﻳﺮا اﮔﺮ ﻛﺪ ﺑﻴﺶ از ﺣﺪ ﺗﻐﻴﻴﺮ ﻛﻨﺪ CLRﺗﻮاﻧﺎﻳﻲ ﭘﺮدازش آن را ﻧﺨﻮاﻫﺪ داﺷﺖ. اﮔﺮ اﻫﻤﻴﺖ ﻛﺪ ﺑﻪ ﺣﺪي ﺑﺎﻻ اﺳﺖ ﻛﻪ ﻧﺘﻮان ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻧﺎﻣﻔﻬﻮم ﻛﻨﻨﺪه اﻃﻤﻴﻨﺎن ﻛﺮد ،ﻣﻴﺘﻮان ﻛﺪ ﻫﺎي ﻣﻬـﻢ ﺑﺮﻧﺎﻣـﻪ را در ﻳـﻚ ﻛﻼس ﻣﺠﺰا ﻗﺮار داد و آن را ﺑﻪ ﺻﻮرت ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﻛﺎﻣﭙﺎﻳﻞ ﻛﺮد .ﺳﭙﺲ از وﻳﮋﮔﻲ CLRﺑﺮاي ارﺗﺒﺎط ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه و ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺎﺑﻘﻲ ﻛﺪ اﺳﺘﻔﺎده ﻛﺮد. ﺑﺎﻳﺪ در ﻧﻈﺮ داﺷﺖ ﻛﻪ ﻓﻘﻂ زﺑﺎن ILﺗﻤﺎم اﻣﻜﺎﻧﺎت ﻣﻮﺟﻮد در CLRرا اراﺋﻪ ﻣﻲ دﻫﺪ .ﺗﻤﺎم زﺑﺎﻧﻬـﺎي دﻳﮕـﺮ ﻗـﺴﻤﺘﻲ از اﻣﻜﺎﻧـﺎت اراﺋﻪ ﺷﺪه ﺗﻮﺳﻂ CLRرا ﺷﺎﻣﻞ ﻣﻲ ﺷﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎم اﻧﺘﺨﺎب زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﺎﻳﺴﺘﻲ اﻳﻦ ﻧﻜﺘﻪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد و اﮔﺮ ﻧﻴﺎز ﺑﻪ اﻣﻜﺎﻧﺎﺗﻲ از CLRﺑﻪ وﺟﻮد آﻣﺪ ﻛﻪ در زﺑﺎن ﻣﻮرد اﺳﺘﻔﺎده وﺟﻮد ﻧﺪاﺷﺖ ﻣﻲ ﺗﻮان آن ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺻﻮرت ﻛﺪ IL ﻧﻮﺷﺖ و ﻳﺎ از زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻛﻪ آن وﻳﮋﮔﻲ را اراﺋﻪ ﻣﻲ دﻫﻨﺪ اﺳﺘﻔﺎده ﻛﺮد. ﻧﻜﺘﻪ ﻣﻬﻢ دﻳﮕﺮ اﻳﻦ اﺳﺖ ﻛﻪ زﺑﺎن ILﺑﻪ ﻫﻴﭻ ﭘﺮدازﻧﺪه اي واﺑﺴﺘﻪ ﻧﻴﺴﺖ .اﻳﻦ اﻣﺮ ﺑﺪﻳﻦ ﻣﻌﻨﺎ اﺳﺖ ﻛﻪ ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در ﻫﺮ ﭘﻠﺖ ﻓﺮﻣﻲ ﻛﻪ CLRﺑﺮاي آن اراﺋﻪ ﺷﺪه ﺑﺎﺷﺪ اﺟﺮا ﻣﻲ ﺷﻮد .اﻟﺒﺘﻪ ﻧﺴﺨﻪ اوﻟﻴﻪ ي CLRﺑﺮاي وﻳﻨﺪوز ﻫـﺎي 32ﺑﻴﺘـﻲ ﻋﺮﺿـﻪ ﺷﺪه اﺳﺖ ،اﻣﺎ در ﻫﺮ ﺻﻮرت اﻳﻦ ﻣﻮﺿﻮع ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن را از ﺗﻮﺟﻪ ﺑﻪ ﭘﺮدازﻧﺪه اي ﻛﻪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﺮﻓﺘﻪ اﺳـﺖ آزاد ﻣﻲ ﻛﻨﺪ. ﺑﺮاي اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻛﻪ ﺑﻪ زﺑﺎن ILدر ﻓﺎﻳﻞ ذﺧﻴﺮه ﺷﺪه اﻧﺪ اﺑﺘﺪا ﺑﺎﻳﺪ آﻧﻬﺎ را ﺑﻪ ﻛﺪ ﻫﺎي زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻛﺮد. اﻳﻦ اﻣﺮ وﻇﻴﻔﻪ ي ﺑﺨﺸﻲ از CLRﺑﻪ ﻧﺎم 1JITاﺳﺖ .ﺷﻜﻞ زﻳﺮ ﻣﺮاﺣﻠﻲ ﻛﻪ ﻫﻨﮕﺎم اﺟﺮاي ﻳﻚ ﺗﺎﺑﻊ ﺑـﺮاي اوﻟـﻴﻦ ﺑـﺎر رخ ﻣـﻲ دﻫﺪ را ﻧﺸﺎن ﻣﻲ دﻫﺪ. درﺳﺖ ﻗﺒﻞ از اﻳﻨﻜﻪ ﺗﺎﺑﻊ Mainاﺟﺮا ﺷﻮد CLR ،ﻧﻮع ﺗﻤﺎم اﺷﻴﺎﻳﻲ ﻛﻪ ﺗﻮﺳﻂ اﻳﻦ ﺗﺎﺑﻊ اﺳﺘﻔﺎده ﺷﺪه اﻧﺪ را ﺗﺸﺨﻴﺺ ﻣـﻲ دﻫـﺪ. اﻳﻦ اﻣﺮ ﺑﺎﻋﺚ ﻣﻴﺸﻮد ﻛﻪ CLRﻳﻚ ﺟﺪول داده اي داﺧﻠﻲ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ دﺳﺘﺮﺳﻲ ﺑﻪ ﻧﻮع ﻫﺎي ارﺟﺎﻋﻲ ﺗﺸﻜﻴﻞ دﻫﺪ .ﺑﺮاي ﻣﺜﺎل در ﺷﻜﻞ ﺑﺎﻻ ﺗﺎﺑﻊ Mainاز ﻛﻼس ارﺟﺎﻋﻲ Consoleاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ ﻛﻪ اﻳـﻦ ﻣـﻮرد ﺗﻮﺳـﻂ CLRدر ﺟـﺪول داده اي ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﺳﺎﺧﺘﺎر ﻣﺬﻛﻮر ﺑﺎزاي ﻫﺮ ﺗﺎﺑﻊ ﻛﻪ در ﻛﻼس اﺳﺘﻔﺎده ﺷﺪه ،ﻳﻚ ردﻳﻒ اﻃﻼﻋﺎت را در ﺟـﺪول اﻳﺠـﺎد ﻣـﻲ ﻛﻨـﺪ .ﻫـﺮ ردﻳﻒ ﺷﺎﻣﻞ آدرس ﻣﻜﺎﻧﻲ از ﺣﺎﻓﻈﻪ اﺳﺖ ﻛﻪ ﭘﻴﺎده ﺳﺎزي ﺗﺎﺑﻊ در آن ﻗﺮار دارد .ﻫﻨﮕﺎم ﻣﻘﺪار دﻫـﻲ اوﻟﻴـﻪ ي اﻳـﻦ ﺳـﺎﺧﺘﺎر ،ﺗﻤـﺎم ردﻳﻔﻬﺎي آن ﺑﻪ ﻳﻜﻲ از ﺗﻮاﺑﻊ دروﻧﻲ CLRﺑﻪ ﻧﺎم JITCompilerاﺷﺎره ﻣﻲ ﻛﻨﻨﺪ. زﻣﺎﻧﻲ ﻛﻪ ﺗﺎﺑﻊ Mainﺑﺮاي اوﻟﻴﻦ ﻣﺮﺗﺒﻪ ﺗﺎﺑﻊ WriteLineرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ CLR ،ﺑـﻪ ﺟـﺪول داده اي ﻛـﻪ اﻳﺠـﺎد ﺷﺪه ﺑﻮد ﻧﮕﺎه ﻣﻲ ﻛﻨﺪ ﺗﺎ ﺗﺸﺨﻴﺺ دﻫﺪ ﺗﺎﺑﻌﻲ ﻛﻪ ﺑﺎﻳﺪ اﺣﻀﺎر ﻛﻨﺪ در ﻛﺪام ﻗﺴﻤﺖ از ﺣﺎﻓﻈـﻪ ﻗـﺮار دارد .اﻣـﺎ ﻫﻤـﺎﻧﻄﻮر ﻛـﻪ ﮔﻔـﺘﻢ ﻫﻨﮕﺎم اﻳﺠـﺎد ﺟـﺪول ،ﻣﻘـﺪار اوﻟﻴـﻪ ي ﻫـﺮ ﺗـﺎﺑﻊ ﺑـﻪ ﺟـﺎي اﻳﻨﻜـﻪ ﺑـﻪ آدرس ﺧـﻮد ﺗـﺎﺑﻊ اﺷـﺎره ﻛﻨـﺪ ﺑـﻪ آدرس ﺗـﺎﺑﻌﻲ ﺑـﻪ ﻧـﺎم JITCompilerاﺷﺎره ﻣﻲ ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺟﺎي ﺗﺎﺑﻊ ،WriteLineﺗﺎﺑﻊ JITCompiler ﺑﻪ وﺳﻴﻠﻪ ي CLRاﺣﻀﺎر ﻣﻲ ﺷﻮد .اﻳﻦ ﺗﺎﺑﻊ وﻇﻴﻔﻪ ﺗﺒﺪﻳﻞ ﻛﺪ ILﺑﻪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ را ﺑﺮ ﻋﻬﺪه دارد .ﺑﻪ دﻟﻴﻞ اﻳﻦ ﻛﻪ ﻛﺪ ﻫﺎي ILﻓﻘﻂ زﻣﺎﻧﻲ ﻛﻪ ﺑﻪ آﻧﻬﺎ ﻧﻴﺎز اﺳﺖ ﺑﻪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻣﻲ ﺷﻮﻧﺪ ،از اﻳﻦ ﻗﺴﻤﺖ از CLRﻋﻤﻮﻣﺎً ﺑﻪ ﻋﻨﻮان JITter و ﻳﺎ JIT Compilerﻳﺎد ﻣﻲ ﺷﻮد. Just-In-Time Compiler
1
٩٢٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﺑﺮاي اوﻟﻴﻦ ﺑﺎر ﻫﻨﮕﺎم اﺣﻀﺎر ﺗﺎﺑﻊ ،JITCompilerاﻳﻦ ﺗﺎﺑﻊ ﻣﻲ داﻧﺪ ﻛﻪ ﭼﻪ ﺗﺎﺑﻌﻲ در اﺻﻞ ﻓﺮاﺧـﻮاﻧﻲ ﺷـﺪه اﺳـﺖ و اﻳـﻦ ﺗـﺎﺑﻊ در ﭼـﻪ ﻛﻼﺳﻲ ﻗﺮار دارد .ﭘﺲ JITCompilerﻛﺪ ILﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه را ﺑﺪﺳﺖ آورده و آن را ﺑﻪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ .ﻛﺪ ﺗﻮﻟﻴﺪ ﺷﺪه در اﻳﻦ ﻣﺮﺣﻠﻪ در ﻳﻚ ﺑﻼك از ﺣﺎﻓﻈﻪ ﻛﻪ ﺑﻪ ﺻﻮرت دﻳﻨﺎﻣﻴﻚ ﺗﻌﻴﻴﻦ ﺷﺪه اﺳﺖ ﻗﺮار ﻣـﻲ ﮔﻴـﺮد .در ﻣﺮﺣﻠﻪ ﺑﻌﺪ JITCompiler ،ﺑﺎ ﺗﻐﻴﻴﺮ ردﻳﻒ ﻣﺮﺗﺒﻂ ﺑﺎ ﺗﺎﺑﻊ ﻣﺬﻛﻮر در ﺟﺪول داده اي داﺧﻠﻲ ﻛﻪ ﺗﻮﺳﻂ CLRاﻳﺠـﺎد ﺷـﺪه ﺑﻮد ،آدرس ﻣﻮﺟﻮد در ردﻳﻒ را ﺑﺎ آدرس ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﻮﻟﻴﺪ ﺷﺪه ﺟـﺎﻳﮕﺰﻳﻦ ﻣـﻲ ﻛﻨـﺪ .در ﻧﻬﺎﻳـﺖ JITCompilerﺑـﻪ آدرس ﻣﻮﺟﻮد در ﺣﺎﻓﻈﻪ ﻛﻪ ﻣﺤﺘﻮي ﻛﺪ ﺗﻮﻟﻴﺪ ﺷﺪه اﺳﺖ رﻓﺘﻪ و ﻛﺪ را اﺟﺮا ﻣﻲ ﻛﻨﺪ .در ﭘﺎﻳﺎن اﻳـﻦ ﺗـﺎﺑﻊ اﺟـﺮاي ﺑﺮﻧﺎﻣـﻪ ﺑـﻪ ﺗـﺎﺑﻊ Mainﺑﺎز ﮔﺸﺘﻪ و اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اداﻣﻪ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ. ﺑﺎ ﺑﺎزﮔﺸﺖ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻣﺘﺪ ،Mainﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺨﺺ اﺳﺖ ﺗـﺎﺑﻊ WriteLineﺑـﺮاي دوﻣـﻴﻦ ﻣﺮﺗﺒـﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .در اﻳﻦ ﻣﺮﺗﺒﻪ ،ﻛﺪ ILﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ اﺣﻀﺎر ﺷﺪه ﻗﺒﻼ ﺗﻮﺳﻂ JITCompilerﺑﻪ ﻛـﺪ زﺑـﺎن ﻣﺎﺷـﻴﻦ ﺗﺒﺪﻳﻞ ﺷﺪه و در ﺣﺎﻓﻈﻪ ﻗﺮار ﮔﺮﻓﺘﻪ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﺑﻼك ﺣﺎﻓﻈﻪ اي ﻣﻲ رود ﻛﻪ ﻛﺪ ﻣﺮﺑﻮط ﺑﻪ ﺗﺎﺑﻊ ﻗﺮار دارد و JITCompilerاﺟﺮا ﻧﻤﻲ ﺷﻮد.
٩٢٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﺑﺮاي ﻣﺮﺗﺒﻪ دوم اﻳﻦ ﻣﻮرد در ﻣﺮﺗﺒﻪ اول ﻓﺮاﺧﻮاﻧﻲ ﻳﻚ ﺗﺎﺑﻊ ﺑﺎﻋﺚ اﻳﺠﺎد ﻳﻚ ﻣﻜﺚ ﻛﻮﺗﺎه در ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺷﻮد اﻣﺎ در ﻣﺮﺗﺒﻪ ﻫﺎي ﺑﻌﺪي اﺣـﻀﺎر ﺗـﺎﺑﻊ، ﺗﺎﺑﻊ ﺑﺎ ﺳﺮﻋﺘﻲ ﺑﺮاﺑﺮ ﻛﺪ ﻫﺎي زﺑﺎن ﻣﺎﺷﻴﻦ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .در ﺣﻘﻴﻘﺖ اﻳﻦ ﻛﺎﻣﭙﺎﻳﻞ ﻓﻘﻂ ﻳﻚ ﺑﺎر در ﻃﻮل ﺑﺮﻧﺎﻣﻪ رخ ﻣﻲ دﻫﺪ. ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ﻛﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺎﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه در ﻳﻚ ﺑﻼك ﺣﺎﻓﻈﻪ دﻳﻨﺎﻣﻴﻚ ﻗﺮار ﻣﻴﮕﻴﺮد .ﺑﻨﺎﺑﺮاﻳﻦ ﻫﻨﮕﺎم ﺧﺎﺗﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻛﺪ ﻣﻮرد ﻧﻈـﺮ از ﺣﺎﻓﻈـﻪ ﭘـﺎك ﻣـﻲ ﺷـﻮد .در ﻣﺮاﺗـﺐ ﺑﻌـﺪي ﻛـﻪ ﺑﺮﻧﺎﻣـﻪ اﺟـﺮا ﻣـﻲ ﺷـﻮد ﻫﻨﮕـﺎم ﻓﺮاﺧـﻮاﻧﻲ ﺗـﺎﺑﻊ ﻣـﻮرد ﻧﻈـﺮ، JITCompilerﻣﺠﺪداً اﺣﻀﺎر ﺷﺪه و ﺗﺎﺑﻊ را ﺑﻪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ. ﻃﺮاﺣﺎﻧﻲ ﺑﺎ ﭘﻴﺶ زﻣﻴﻨﻪ از ﻣﺤﻴﻄﻬﺎﻳﻲ ﻣﺎﻧﻨﺪ C++ﻣﻤﻜﻦ اﺳﺖ ﻋﻘﻴﺪه داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﻛﻪ اﻳﻦ ﻋﻤﻞ ﺗﺎﺛﻴﺮ ﻣﻨﻔـﻲ ﺑـﺮ ﻛـﺎراﻳﻲ ﺑﺮﻧﺎﻣـﻪ ﺧﻮاﻫﺪ داﺷﺖ .ﺑﺎ وﺟﻮد اﻳﻨﻜﻪ ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﺮاي ﻳﻚ ﺳﺎﺧﺘﺎر ﭘﺮدازﻧﺪه ﺧﺎص ﺗﻮﻟﻴﺪ ﻣﻲ ﺷﻮﻧﺪ ،اﻣﺎ ﻫﻨﮕﺎم اﺟﺮا اﻳـﻦ ﻛـﺪﻫﺎ ﺑﻪ راﺣﺘﻲ اﺟﺮا ﻣﻲ ﺷﻮﻧﺪ .اﻣﺎ اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺷﺎﻣﻞ دو ﻣﺮﺣﻠﻪ ﻣﻲ ﺷﻮد .در ﻣﺮﺣﻠﻪ اول ﺳﻮرس ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﻛـﺪ ILﺗﺒﺪﻳﻞ ﺷﻮد و ﺳﭙﺲ در ﻣﺮﺣﻠﻪ ﺑﻌﺪ در ﻫﺮ ﺑﺎر اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ،ﻛﺪ ﺑﺎﻳﺴﺘﻲ ﺑﻪ زﺑﺎن ﻣﺎﺷﻴﻦ ﺗﺒﺪﻳﻞ ﺷﺪه و در ﺣﺎﻓﻈﻪ ذﺧﻴﺮه ﺷـﻮد. اﻳﻦ ﻋﻤﻞ ﻣﻮﺟﺐ ﺻﺮف ﺑﻴﺸﺘﺮ ﺣﺎﻓﻈﻪ و زﻣﺎن ﭘﺮدازﻧﺪه ﻣﻲ ﺷﻮد. در ﻧﮕﺎه اول ﻣﻤﻜﻦ اﺳﺖ ﻧﻈﺮ اﻳﻦ اﻓﺮاد درﺳﺖ ﺟﻠﻮه ﻛﻨﺪ اﻣﺎ ﺣﻘﻴﻘﺖ اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ اﻋﻤﺎل ﺗﺎﺛﻴﺮ ﭼﻨﺪاﻧﻲ ﺑﺮ ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ ﻧﺪارد و ﺑﺮرﺳﻲ ﻫﺎي اﻧﺠﺎم ﺷﺪه در اﻳﻦ زﻣﻴﻨﻪ ﻧﺸﺎن ﻣﻴﺪﻫﺪ ﻛﻪ ﺗﺎﺛﻴﺮي ﻛﻪ اﻧﺠﺎم اﻣﻮر ذﻛﺮ ﺷﺪه ﺑﺮاي اﺟﺮاي ﻛﺪ ﻫـﺎي ﻣـﺪﻳﺮﻳﺖ ﺷـﺪه ﺑـﺮ ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﻣﻴﮕﺬارد اﺻﻼ ﻣﺸﻬﻮد و ﻗﺎﺑﻞ ﺗﻮﺟﻪ ﻧﻴﺴﺖ.
٩٢٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺣﺘﻲ در ﺑﻌﻀﻲ از ﺷﺮاﻳﻂ اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﺳﺮﻳﻌﺘﺮ از ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه اﻧﺠﺎم ﻣﻲ ﺷﻮد .اﻳﻦ اﻣﺮ ﺑـﻪ اﻳـﻦ دﻟﻴـﻞ اﺳﺖ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻧﺴﺒﺖ ﺑﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه اﻃﻼﻋـﺎت ﺑﻴـﺸﺘﺮي از ﻣﺤـﻴﻂ اﺟـﺮا در دﺳﺖ دارد .ﺑﻪ ﻃﻮر ﻣﺜﺎل در ﺷﺮاﻳﻂ زﻳﺮ ﻛﺎﻣﭙﺎﻳﻠﺮ JITﺳﺮﻳﻌﺘﺮ از دﻳﮕﺮ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ ﻋﻤﻞ ﻣﻲ ﻛﻨﺪ: (1ﻳﻚ ﻛﺎﻣﭙﺎﻳﻠﺮ JITاز ﻧﻮع ﺳﺎﺧﺘﺎر ﭘﺮدازﻧﺪه ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮ روي آن اﺟﺮا ﻣﻲ ﺷﻮد اﻃﻼع دارد و ﻣﻲ ﺗﻮاﻧﺪ از دﺳﺘﻮرات وﻳﮋه اي ﻛﻪ آن ﻧﻮع ﭘﺮدازﻧﺪه اراﺋﻪ ﻣﻲ دﻫﺪ ﺣﺪاﻛﺜﺮ اﺳﺘﻔﺎده را داﺷﺘﻪ ﺑﺎﺷﺪ .ﺑﺮاي ﻣﺜﺎل اﻳﻦ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻣﻴﺘﻮاﻧـﺪ ﺑﺮﻧﺎﻣـﻪ را ﺑـﺮاي ﭘﺮدازﻧـﺪه ﻫﺎي Pentium4ﺑﻬﻴﻨﻪ ﻛﻨﺪ .اﻣﺎ ﻣﻌﻤﻮﻻ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﻪ ﺻﻮرﺗﻲ ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﺷﻮﻧﺪ ﻛـﻪ ﺑـﺎ ﺗﻤـﺎم اﻧـﻮاع ﭘﺮدازﻧﺪه ﻫﺎ ﺳﺎزﮔﺎر ﺑﺎﺷﻨﺪ .اﻳﻦ اﻣﺮ از ﺑﻬﺮه وري از اﻣﻜﺎﻧﺎت وﻳﮋه ي ﭘﺮدازﻧﺪه ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﺪ. (2ﻳﻚ ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻣﻲ ﺗﻮاﻧﺪ ﺷﺮاﻳﻄﻲ را ﻛﻪ ﻫﻤﻮاره ﻧﺎدرﺳﺖ ﻫﺴﺘﻨﺪ ﺗﺸﺨﻴﺺ دﻫﺪ و آﻧﻬﺎ را ﻛﺎﻣﭙﺎﻳﻞ ﻧﻜﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻳﻚ دﺳﺘﻮر ﻣﺸﺎﺑﻪ زﻳﺮ در ﻳﻚ ﺗﺎﺑﻊ ﻫﺮﮔﺰ ﻛﺎﻣﭙﺎﻳﻞ ﻧﻤﻲ ﺷﻮد و اﻳﻦ اﻣﺮ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺪ ﻣﻮرد ﻧﻈﺮ ﺑﺮاي ﻣﺤﻴﻄﻲ ﻛﻪ ﺑﺎﻳﺪ در آن اﺟﺮا ﺷﻮد ﺑﻬﻴﻨﻪ ﺷﻮد )if (numberOfCPUs > 1 { . . . } اﻳﻨﻬﺎ ﺗﻨﻬﺎ ﺗﻌﺪاد ﻣﺤﺪودي از دﻻﻳﻠﻲ ﺑﻮدﻧﺪ ﻛﻪ ﻧﺸﺎن دﻫﻨﺪه اﺟﺮاي ﺑﻬﺘﺮ ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻧﺴﺒﺖ ﺑﻪ ﻛﺪ ﻫﺎي ﻣـﺪﻳﺮﻳﺖ ﻧـﺸﺪه ﻫﺴﺘﻨﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ذﻛﺮ ﺷﺪ ﺳﺮﻋﺖ اﻳﻦ ﻛﺪﻫﺎ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻛﺎﻣﻼً ﻣﻨﺎﺳﺐ اﺳﺖ .اﻣﺎ ﺑﺎ وﺟﻮد اﻳﻦ اﮔـﺮ ﻫﻤﭽﻨـﺎن اﻳـﻦ اﺣـﺴﺎس وﺟﻮد دارد ﻛﻪ اﻳﻦ ﻛﺪﻫﺎ ﺳﺮﻋﺖ ﻣﻄﻠﻮب را اراﺋﻪ ﻧﻤﻲ دﻫﻨﺪ ﻣﻲ ﺗﻮان از اﺑﺰارﻫﺎﻳﻲ ﻛﻪ ﺑﺮاي ﺗﺒﺪﻳﻞ ﻛﺪ ILﺑﻪ ﻛﺪ زﺑـﺎن ﻣﺎﺷـﻴﻦ در .NET Framework SDKوﺟﻮد دارد اﺳﺘﻔﺎده ﻛﺮد .ﺑﺮاي ﻣﺜﺎل اﺑﺰاري ﺑﻪ ﻧﺎم ngen.exeوﺟﻮد دارد ﻛـﻪ ﻛـﺪ زﺑﺎن ﻣﺎﺷﻴﻦ ﻣﺮﺑﻮط ﺑﻪ ﻳﻚ ﻓﺎﻳﻞ ﻣﺤﺘﻮي ﻛﺪ ILرا در دﻳﺴﻚ ذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ CLRﻣﺸﺎﻫﺪه ﻛﻨـﺪ ﻛـﻪ ﻛـﺪ زﺑـﺎن ﻣﺎﺷﻴﻦ ﻓﺎﻳﻠﻲ ﻛﻪ ﻗﺼﺪ اﺟﺮاي آن را دارد در دﻳﺴﻚ ﻣﻮﺟﻮد اﺳﺖ از آن ﻛﺪ ﺑﻪ ﺟﺎي ﻛﺪ ILاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ.
ﻣﺠﻤﻮﻋﻪ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻛﻼس :.NET Framework ﻋﻼوه ﺑﺮ ،CLRدر ﻣﺠﻤﻮﻋﻪ .NET Frameworkﺑﺨﺶ دﻳﮕﺮي ﻧﻴﺰ وﺟﻮد دارد ﻛﻪ ﺷﺎﻣﻞ ﻳـﻚ ﻛﺘﺎﺑﺨﺎﻧـﻪ ي ﻛـﻼس ﻣﻲ ﺷﻮد .اﻳﻦ ﺑﺨﺶ ﻛﻪ 1FCLﻧﺎم دارد ﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﻫﺰار ﻛﻼس اﺳﺖ ﻛﻪ ﻫﺮ ﻛﺪام وﻇﻴﻔﻪ ﺧﺎﺻـﻲ را اﻧﺠـﺎم ﻣـﻲ دﻫﻨـﺪ .اﻳـﻦ ﻣﺠﻤﻮﻋﻪ ﺑﺎ ﻫﻢ ،ﻳﻌﻨﻲ CLRو ،FCLﺑﻪ ﻃﺮاﺣﺎن اﺟﺎزه ﻣﻲ دﻫﻨﺪ ﻛﻪ ﭼﻨﺪﻳﻦ ﻣﺪل ﺑﺮﻧﺎﻣﻪ را ﻃﺮاﺣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻋﺒﺎرت اﻧﺪ از: (1وب ﺳﺮوﻳﺴﻬﺎي ﻣﺒﺘﻨﻲ ﺑﺮ :XMLوب ﺳﺮوﻳﺲ ﻫﺎ ﺗﻮاﺑﻌﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﻪ راﺣﺘﻲ از ﻃﺮﻳﻖ ﺷﺒﻜﻪ وب ﻗﺎﺑـﻞ دﺳﺘﺮﺳـﻲ و ﻓﺮاﺧﻮاﻧﻲ ﻫﺴﺘﻨﺪ .اﻳﻦ ﻗﺴﻤﺖ در ﺣﻘﻴﻘﺖ اﺻﻠﻲ ﺗﺮﻳﻦ ﻓﻠﺴﻔﻪ ي ﻇﻬﻮر و اﺑﺪاع .NETﻣﺤﺴﻮب ﻣﻲ ﺷﻮد. (2ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب :اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎ و ﻳﺎ وب ﺳﺎﻳﺖ ﻫﺎﻳﻲ ﻣﺒﺘﻨﻲ ﺑﺮ ﺻﻔﺤﺎت HTMLﻫﺴﺘﻨﺪ .ﻋﻤﻮﻣـﺎً اﻳـﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﺎ اﺳﺘﻔﺎده از درﺧﻮاﺳﺖ اﻃﻼﻋﺎت از ﺳﺮورﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋـﺎﺗﻲ و ﭼﻨـﺪﻳﻦ وب ﺳـﺮوﻳﺲ ،اﻃﻼﻋـﺎت ﻣـﻮرد ﻧﻴـﺎز را درﻳﺎﻓﺖ ﻛﺮده و ﺑﻌﺪ از ﺗﺤﻠﻴﻞ و اﻧﺠﺎم ﭘﺮدازش روي آﻧﻬﺎ ،ﺻﻔﺤﺎت HTMLﻣﺒﻨـﻲ ﺑـﺮ درﺧﻮاﺳـﺖ ﻛـﺎرﺑﺮ را ﺗـﺸﻜﻴﻞ داده و
Framework Class Library
1
٩٢٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
(3
(4
(5
(6
اﻃﻼﻋﺎت ﺧﻮاﺳﺘﻪ ﺷﺪه را از ﻃﺮﻳﻖ ﻣﺮورﮔﺮ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺳﺮوﻳﺲ ﮔﻴﺮﻧﺪه ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .اﻳـﻦ ﻗـﺴﻤﺖ در ﺣﻘﻴﻘـﺖ ﻻﻳـﻪ ﻣﻴﺎﻧﻲ ﻳﺎ ﻻﻳﻪ ﻣﻨﻄﻖ ﺗﺠﺎري در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﭼﻨﺪ ﻻﻳﻪ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد. ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وﻳﻨﺪوز :ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﺑﺎ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﺑﺮاي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ وﻳﻨﺪوز .ﻫﻤﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب ،اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻧﻴﺰ ﻗﺪرت ﺑﺮﻗﺮاري ارﺗﺒﺎط ﺑﺎ ﺳﺮورﻫﺎي ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ را داﺷﺘﻪ و ﻣﻴﺘﻮاﻧـﺪ از وب ﺳﺮوﻳـﺴﻬﺎي ﻣﺒﺘﻨـﻲ ﺑـﺮ XML اﺳﺘﻔﺎده ﻛﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ در ﻣﻮاﻗﻌﻲ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب ﻧﺒﺎﺷﺪ ﻣﻴﺘﻮان از اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺑﺎ اﻣﻜﺎﻧﺎت ﺷﺒﻜﻪ و ﻧﻴـﺰ ﻗﺪرت ﺑﻴﺸﺘﺮ در ﻃﺮاﺣﻲ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ اﺳﺘﻔﺎده ﻛﺮد. ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ ﻛﻨﺴﻮل در وﻳﻨﺪوز :در ﻣﻮاﻗﻌﻲ ﻛﻪ ﻧﻴﺎزي ﺑﻪ راﺑﻂ ﮔﺮاﻓﻴﻜﻲ ﻛﺎرﺑﺮ ﻧﻴﺴﺖ و ﻳﺎ ﻳﻚ راﺑﻂ ﺳﺎده ﻛـﺎﻓﻲ اﺳﺖ ﻣﻲ ﺗﻮان از اﻳﻦ ﻧﻮع ﺑﺮﻧﺎﻣﻪ ﻫﺎ اﺳﺘﻔﺎده ﻛﺮد .ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﺎ و ﺑﻌﻀﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻛـﺎرﺑﺮدي و ﻧﻴـﺰ اﺑﺰارﻫـﺎ از اﻳـﻦ دﺳـﺘﻪ ﻫﺴﺘﻨﺪ. ﺳﺮوﻳﺴﻬﺎي وﻳﻨﺪوز :ﻳﻜﻲ دﻳﮕﺮ از اﻧﻮاع ﺑﺮﻧﺎﻣـﻪ ﻫـﺎﻳﻲ ﻛـﻪ ﻗﺎﺑﻠﻴـﺖ ﻃﺮاﺣـﻲ آن ﺑـﺎ .NETوﺟـﻮد دارد ،ﺳﺮوﻳـﺴﻬﺎي وﻳﻨﺪوزي اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﻣﺮﻛﺰ ﻛﻨﺘﺮل ﺳـﺮوﻳﺲ وﻳﻨـﺪوز ) 1(SCMو ﻧﻴـﺰ .NET Frameworkﻗﺎﺑـﻞ ﻛﻨﺘـﺮل ﻫﺴﺘﻨﺪ. ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ و ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼس :ﺑﻪ وﺳﻴﻠﻪ .NET Frameworkﻣﻲ ﺗﻮان ﺑﻪ ﻃﺮاﺣﻲ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫـﺎﻳﻲ ﭘﺮداﺧﺖ ﻛﻪ ﺑﻪ راﺣﺘﻲ ﻗﺎﺑﻞ ﺗﻮزﻳﻊ و ﻧﻴﺰ ﻗﺎﺑﻞ اﺳﺘﻔﺎده در ﻣﺤﻴﻄﻬﺎي دﻳﮕﺮ ﺑﺎﺷﺪ.
ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ FCLﺷﺎﻣﻞ ﭼﻨﺪﻳﻦ ﻫﺰار ﻛﻼس ﻣﻲ ﺷﻮد ،ﺗﻤﺎم ﻛﻼﺳﻬﺎي ﻣﺮﺗﺒﻂ ﺑﻪ ﻳﻜﺪﻳﮕﺮ در ﻳﻚ ﻓﻀﺎي ﻧﺎم ﮔـﺮدآوري ﺷـﺪه اﻧﺪ .اﺻﻠﻲ ﺗﺮﻳﻦ ﻓﻀﺎي ﻧﺎم ،ﻓﻀﺎي ﻧﺎم Systemاﺳﺖ ﻛﻪ ﻣﺤﺘﻮي ﻛـﻼس Objectو ﺗﻌـﺪادي ﻛـﻼس ﭘﺎﻳـﻪ اي دﻳﮕـﺮ اﺳﺖ .ﻛﻼس Objectﻳﻚ ﻛﻼس ﭘﺎﻳﻪ اﺳﺖ ﻛﻪ ﺗﻤﺎم ﻛﻼﺳﻬﺎي FCLاز اﻳﻦ ﻛﻼس ﻣﺸﺘﻖ ﻣﻲ ﺷﻮﻧﺪ .ﻻزم ﺑﻪ ذﻛﺮ اﺳـﺖ ﻛﻪ ﺗﻤﺎم ﻗﻮاﻋﺪ ﺷﻴﺊ ﮔﺮاﻳﻲ در ﻛﻼﺳﻬﺎي FCLرﻋﺎﻳﺖ ﺷﺪه اﻧﺪ و ﺑﺪﻳﻦ ﺗﺮﺗﻴﺐ اﻳﻦ اﻣﻜﺎن را ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ داده اﻧﺪ ﻛﻪ در ﻫـﺮ ﻣﺮﺣﻠﻪ ﺑﺘﻮاﻧﺪ اﻣﻜﺎﻧﺎت و ﻳﺎ ﺗﻮاﺑﻊ ﺑﺮﻧﺎﻣﻪ را ﻣﻄﺎﺑﻖ ﻧﻴﺎزﻫﺎي ﺧﻮد ﺗﻐﻴﻴﺮ دﻫﺪ و ﻛﻼﺳﻬﺎي ﺟﺪﻳﺪي ﻃﺮاﺣﻲ ﻛﻨﺪ ﻛﻪ ﻋﻼوه ﺑـﺮ اﻣﻜﺎﻧـﺎت ﻛﻼﺳﻬﺎي ﻗﺒﻠﻲ ،ﻧﻴﺎزﻫﺎي ﻃﺮاح و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ را ﻧﻴﺰ ﺑﻪ ﻃﻮر ﻛﺎﻣﻞ ﺑﺮﻃﺮف ﻛﻨﺪ. ﺟﺪول زﻳﺮ ﺑﻌﻀﻲ از ﻓﻀﺎي ﻧﺎم ﻫﺎي ﭘﺮ ﻛﺎرﺑﺮد در FCLرا ﻣﻌﺮﻓﻲ ﻛﺮده و ﺑﻪ ﻃﻮر ﻣﺨﺘﺼﺮ راﺟﻊ ﺑﻪ آﻧﻬﺎ ﺗﻮﺿﻴﺢ ﻣﻴﺪﻫﺪ. ﻓﻀﺎي ﻧﺎم System
System.Collections
System.Diagnostics
System.Drawing
System.EnterpriseServices
ﺷﺮح ﻣﺤﺘﻮي ﺗﻤﺎم ﻛﻼﺳﻬﺎي ﭘﺎﻳﻪ اي اﺳﺖ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﺗﻤﺎم ﺑﺮﻧﺎﻣﻪ ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ. ﻣﺠﻤﻮﻋﻪ اي اﺳﺖ از ﻛﻼﺳﻬﺎ ﻛﻪ ﺑﺮاي ﻧﮕﻬﺪاري آراﻳﻪ ﻫـﺎﻳﻲ از اﺷﻴﺎ ﻛﻪ ﺷﺎﻣﻞ آراﻳﻪ ﻫﺎي ﻋﻤـﻮﻣﻲ ﻣﺜـﻞ ﺻـﻒ ،ﭘـﺸﺘﻪ ،ﻟﻴـﺴﺖ ﭘﻴﻮﻧﺪي و ...ﻣﻲ ﺷﻮد ﺑﻪ ﻛﺎر ﻣﻲ رود. ﻣﺤﺘﻮي ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻣﺴﺘﻨﺪ ﺳﺎزي و ﻧﻴـﺰ ﺧﻄـﺎ ﻳـﺎﺑﻲ در ﺑﺮﻧﺎﻣﻪ اﺳﺖ. ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻧﮕﻬﺪاري اﺷﻴﺎي ﻣﺮﺑﻮط ﺑـﻪ ﮔﺮاﻓﻴـﻚ دو ﺑﻌﺪي اﺳﺖ .اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﺑﻴﺸﺘﺮ ﺑﺮاي ﺑﺮﻧﺎﻣـﻪ ﻫـﺎي ﺗﺤـﺖ وﻳﻨﺪوز و ﻧﻴﺰ ﻧﻤﺎﻳﺶ ﻋﻜﺲ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤـﺖ وب ﺑـﻪ ﻛـﺎر ﻣﻲ رود. اﻳﻦ ﻓﻀﺎي ﻧﺎم ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺗﺮاﻛﻨﺶ ﻫـﺎ،
Windows Service Control Manager
1
٩٣٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
System.Globalization
System.IO
System.Management
System.Net System.Reflection
System.Resources
System.Runtime.InteropServices
System.Runtime.Remoting
System.Runtime.Serialization
System.Security System.Text
System.Threading
System.Xml
ﻓﻌﺎل ﺳﺎزي ،JITاﻣﻨﻴﺖ و ...اﺳﺖ ﻛﻪ ﻣﻮﺟﺐ ﻛﺎراﻳﻲ ﺑﻴـﺸﺘﺮ ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه در ﺳﺮور ﻣﻲ ﺷﻮﻧﺪ. اﻳﻦ ﻗﺴﻤﺖ ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﭘﺸﺘﻴﺒﺎﻧﻲ زﺑﺎﻧﻬﺎي دﻳﮕﺮ از ﻗﺒﻴﻞ ﺣﺮوف آن زﺑﺎﻧﻬﺎ ،ﻧﺤﻮه ي ﻧﻤﺎﻳﺶ ﺗﺎرﻳﺦ و ﻗﺎﻟﺐ ﺑﻨﺪي در آن و ...ﻣﻲ ﺷﻮد. ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي اﻧﺠﺎم ﻋﻤﻠﻴـﺎت ورودي و ﺧﺮوﺟـﻲ از ﻗﺒﻴـﻞ ﻛﺎر ﺑﺎ ﻓﺎﻳﻠﻬﺎ و داﻳﺮﻛﺘﻮري ﻫﺎ را درﺑﺮ دارد. ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻣﺪﻳﺮﻳﺖ دﻳﮕﺮ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺑـﻪ وﺳـﻴﻠﻪ دﺳﺘﮕﺎه ﻫﺎي ﻣﺪﻳﺮﻳﺘﻲ وﻳﻨﺪوز ﻳﺎ WMIاﺳﺖ. ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﺑﺮﻗﺮاري ارﺗﺒﺎﻃﺎت ﺷﺒﻜﻪ اي اﺳﺖ. ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﺑﺮرﺳﻲ و اﺳﺘﻔﺎده از اﻃﻼﻋﺎت داﺧـﻞ metadataاﺳﺖ. ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻣـﺪﻳﺮﻳﺖ ﻣﻨـﺎﺑﻊ ﺧـﺎرﺟﻲ اﺳـﺘﻔﺎده ﺷـﺪه در ﺑﺮﻧﺎﻣﻪ را ﺷﺎﻣﻞ ﻣﻲ ﺷﻮد. ﻛﻼس ﻫﺎي اﻳﻦ ﻓﻀﺎي ﻧﺎم ﺑﻪ ﻛـﺪ ﻫـﺎي ﻣـﺪﻳﺮﻳﺖ ﺷـﺪه اﻳـﻦ اﻣﻜــﺎن را ﻣــﻲ دﻫــﺪ ﻛــﻪ از اﻣﻜﺎﻧــﺎت ﻗﺒﻠــﻲ وﻳﻨــﺪوز از ﻗﺒﻴــﻞ ﻛﺎﻣﭙﻮﻧﻨــﺖ ﻫــﺎي COMو ﻳــﺎ ﺗﻮاﺑــﻊ ﻣﻮﺟــﻮد در ﻓﺎﻳﻠﻬــﺎي Win32اﺳﺘﻔﺎده ﻛﻨﻨﺪ. ﻛﻼس ﻫﺎﻳﻲ را ﺷﺎﻣﻞ ﻣﻲ ﺷﻮد ﻛـﻪ ﺑـﻪ دﻳﮕـﺮ ﻛﻼﺳـﻬﺎ اﺟـﺎزه ﻣﻴﺪﻫﻨﺪ از را دور ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﮔﻴﺮﻧﺪ. ﻛﻼس ﻫﺎﻳﻲ را در ﺑﺮ دارد ﻛﻪ ﺑﻪ اﺷﻴﺎ اﻳﻦ اﻣﻜﺎن را ﻣـﻲ دﻫﻨـﺪ ﺑﻪ رﺷﺘﻪ اي ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ ﻛﻪ ﻣﻌﺮف آﻧﻬﺎ ﺑﺎﺷﺪ و از رﺷﺘﻪ اي ﻛﻪ ﻣﻌﺮف آﻧﻬﺎ اﺳﺖ ﺑﻪ ﻳﻚ ﺷﻴﺊ ﺗﺒﺪﻳﻞ ﺷﻮﻧﺪ. ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻣﺤﺎﻓﻈﺖ از اﻃﻼﻋﺎت و ﻣﻨﺎﺑﻊ ﺑﺮﻧﺎﻣﻪ. ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﻛﺎر ﺑـﺎ ﻣـﺘﻦ در ﻗﺎﻟﺒﻬـﺎي ﻣﺨﺘﻠـﻒ از ﻗﺒﻴـﻞ ASCIIو ﻳﺎ .Unicode ﺷﺎﻣﻞ ﻛﻼس ﻫﺎﻳﻲ اﺳﺖ ﻛﻪ ﺑﺮاي اﺟﺮاي ﻫﻤﺰﻣﺎن ﭘﺮدازش ﻫـﺎ و ﻧﻴﺰ ﻫﻤﺎﻫﻨﮕﻲ در دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد. ﻛﻼس ﻫﺎﻳﻲ ﺑﺮاي ﺑﺮرﺳﻲ و ﭘﺮدازش داده ﻫﺎ در ﻗﺎﻟـﺐ XML را درﺑﺮ دارد.
ﺳﻴﺴﺘﻢ ﻧﻮع داده اي ﻋﻤﻮﻣﻲ: اﺣﺘﻤﺎﻻً ﺗﺎ ﻛﻨﻮن ﻣﺘﻮﺟﻪ اﻳﻦ ﻧﻜﺘﻪ ﺷﺪه اﻳﺪ ﻛﻪ ﻳﻜﻲ از ﻣﻬﻤﺘﺮﻳﻦ ﻗﺴﻤﺘﻬﺎي CLRدرﺑﺎره ي ﻛﺎر ﺑﺎ ﻛﻼﺳـﻬﺎ اﺳـﺖ .اﻳـﻦ ﻛﻼﺳـﻬﺎ ﻛﺎراﻳﻲ ﻻزم را ﺑﻪ ﺑﺮﻧﺎﻣﻪ و ﻳﺎ ﻛﺎﻣﭙﻮﻧﻨﺖ در ﺣﺎل ﻃﺮاﺣﻲ اراﺋﻪ ﻣﻲ دﻫﻨﺪ .ﻛﻼﺳﻬﺎ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻛﺪ ﻫﺎي ﻃﺮاﺣﻲ ﺷﺪه در ﻳﻚ زﺑﺎن در زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﺎﺷﺪ .ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ﻫﺴﺘﻪ اﺻﻠﻲ CLRرا ﻛﻼﺳﻬﺎ ﺗﺸﻜﻴﻞ ﻣـﻲ دﻫﻨـﺪ ،ﻣﺎﻳﻜﺮوﺳـﺎﻓﺖ ﻳـﻚ
٩٣١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺳﺮي ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ در ﻣﻮرد ﻛﻼﺳﻬﺎ در .NETرا ﺗﺤﺖ ﻋﻨﻮان 1CTSﻋﻨﻮان ﻛﺮد ﻛﻪ ﺷﺎﻣﻞ ﭼﮕﻮﻧﮕﻲ ﺗﻌﺮﻳﻒ ﻛﻼﺳﻬﺎ و ﭼﮕﻮﻧﮕﻲ رﻓﺘﺎر آﻧﻬﺎ ﻣﻲ ﺷﻮد. ﻃﺒﻖ ﺧﺼﻮﺻﻴﺎت CTSﻫﺮ ﻛﻼس ﻣﻴﺘﻮاﻧﺪ ﺷﺎﻣﻞ ﭼﻨﺪ ﻋﻀﻮ ﺑﺎﺷﺪ و ﻳﺎ ﺷﺎﻣﻞ ﻫﻴﭻ ﻋﻀﻮي ﻧﺒﺎﺷﺪ .اﻋﻀﺎي ﻗﺎﺑﻞ ﺗﻌﺮﻳﻒ در ﻛﻼس ﻋﺒﺎرت اﻧﺪ از: ﻓﻴﻠﺪ ﻫﺎ :ﻳﻚ ﻣﺘﻐﻴﺮ داده اي اﺳﺖ ﻛﻪ ﻣﻌﺮف وﺿﻌﻴﺖ ﻛﻨﻮﻧﻲ ﺷﻴﺊ اﺳﺖ .ﻓﻴﻠﺪ ﻫﺎ ﺑﻪ وﺳﻴﻠﻪ ﻧﺎم و ﻧﻮع داده اي آﻧﻬﺎ ﻣـﺸﺨﺺ ﻣﻴﺸﻮﻧﺪ. ﻣﺘﺪ ﻫﺎ :ﺗﺎﺑﻌﻲ اﺳﺖ ﻛﻪ ﭘﺮدازش ﺧﺎﺻﻲ را ﺑﺮ روي ﺷﻴﺊ اﻧﺠﺎم ﻣﻲ دﻫﺪ .اﻳﻦ ﭘﺮدازش ﻣﻌﻤﻮﻻ ﺷﺎﻣﻞ ﺗﻐﻴﻴﺮ وﺿـﻌﻴﺖ آن ﻣـﻲ ﺷﻮد .ﻣﺘﺪ ﻫﺎ ﻣﻌﻤﻮﻻ ﺷﺎﻣﻞ ﻳﻚ ﻧﺎم ،ﻟﻴﺴﺖ ﻣﻘﺎدﻳﺮ ورودي ،ﻟﻴﺴﺖ ﻣﻘﺎدﻳﺮ ﺧﺮوﺟﻲ و ﻧﻴﺰ ﻋﺒـﺎرت ﻫـﺎﻳﻲ ﺑـﺮاي ﺗﻌﻴـﻴﻦ ﺳـﻄﺢ دﺳﺘﺮﺳﻲ ﺑﻪ آن ﻫﺴﺘﻨﺪ. ﻣﺸﺨﺼﺎت :2ﺑﺮاي ﻛﺎرﺑﺮ ﻛﻼس اﻳﻦ ﻋﻀﻮ ﻫﻤﺎﻧﻨﺪ ﻳﻚ ﻓﻴﻠﺪ اﺳﺖ اﻣﺎ ﺑﺮاي ﻃﺮاح ﻛﻼس اﻳﻦ ﻋﻀﻮ ﻫﻤﺎﻧﻨﺪ ﻳﻚ )ﻳﺎ دو( ﻣﺘﺪ اﺳﺖ .اﻳﻦ ﻧﻮع ﻋﻀﻮ ﻫﺎي ﻛﻼس ﺑﻪ ﻃﺮاح و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﻨﺪ ﻛـﻪ ﻗﺒـﻞ از ﻗـﺮار دادن ورودي ﻛـﺎرﺑﺮ در ﻣﺘﻐﻴﺮ ﻣﺮﺑﻮﻃﻪ ،ﺑﻪ ﺑﺮرﺳﻲ ﺻﺤﺖ آن ﺑﭙﺮدازد و ﻳﺎ ﭘﺮدازش ﻫﺎي ﻣﻮرد ﻧﻴﺎز دﻳﮕﺮ را ﻗﺒﻞ از ﻗﺮار دادن ﻣﻘﺪار اﻧﺠﺎم دﻫـﺪ .ﻋـﻼوه ﺑﺮ اﻳﻦ ،اﻳﻦ ﻧﻮع ﻋﻀﻮﻫﺎ ﺑﻪ ﻃﺮاﺣﺎن اﺟﺎزه اﻳﺠﺎد ﻓﻴﻠﺪ ﻫﺎي ﻓﻘﻂ ﺧﻮاﻧﺪﻧﻲ ﻳﺎ ﻓﻘﻂ ﻧﻮﺷﺘﻨﻲ را ﻣﻲ دﻫﻨﺪ. روﻳﺪادﻫﺎ :روﻳﺪادﻫﺎ ﻣﻜﺎﻧﻴﺴﻤﻲ ﺑﺮاي اﻃﻼع دﻳﮕﺮ اﺷﻴﺎ از ﻳﻚ رﺧﺪاد ﺧﺎص در ﺷﻴﺊ ﻣﺤﺴﻮب ﻣﻲ ﺷﻮﻧﺪ .ﺑـﺮاي ﻣﺜـﺎل ﻳـﻚ دﻛﻤﻪ ﻣﻲ ﺗﻮاﻧﺪ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻓﺸﺮده ﺷﺪ اﺷﻴﺎي دﻳﮕﺮ را از اﻳﻦ اﺗﻔﺎق ﻣﻄﻠﻊ ﻛﻨﺪ.
(1 (2
(3
(4
CTSﻋﻼوه ﺑﺮ اﻳﻦ ﻣﻮارد اﻣﻜﺎﻧﺎﺗﻲ را ﺑﺮاي ﺗﻌﻴﻴﻦ ﺳﻄﺢ دﺳﺘﺮﺳﻲ ﺑﻪ اﻋﻀﺎ اراﺋﻪ ﻣﻲ دﻫـﺪ .ﺑـﺮاي ﻣﺜـﺎل اﺷـﻴﺎﻳﻲ ﻛـﻪ ﺑـﻪ ﻋﻨـﻮان publicدر ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮﻧﺪ ﺗﻮﺳﻂ ﻛﻼﺳﻬﺎي دﻳﮕﺮ ،ﭼﻪ در داﺧﻞ و ﭼﻪ در ﺧـﺎرج اﺳـﻤﺒﻠﻲ ﻗﺎﺑـﻞ دﺳﺘﺮﺳـﻲ ﻫـﺴﺘﻨﺪ .از ﺳﻮي دﻳﮕﺮ ﺗﻌﻴﻴﻦ ﻳﻚ ﻋﻀﻮ داده اي ﺑﻪ ﻋﻨﻮان ) Assemblyدر internal ،C#ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد( ﺑﺎﻋﺚ ﻣﻴﺸﻮد آن ﻋﻀﻮ ﻓﻘﻂ در ﻛﻼﺳﻬﺎي ﻣﻮﺟﻮد در داﺧﻞ اﺳﻤﺒﻠﻲ ﻗﺎﺑﻞ دﺳﺘﺮس ﺑﺎﺷﺪ. ﻟﻴﺴﺖ زﻳﺮ ﺳﻄﺢ دﺳﺘﺮﺳﻲ ﻫﺎي ﻣﺨﺘﻠﻒ را ﺑﺮاي اﻋﻀﺎي داده اي ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻴﻜﻨﺪ. (1
:Privateﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﻓﻘﻂ ﺑﻪ وﺳﻴﻠﻪ دﻳﮕﺮ ﻣﺘﺪﻫﺎي ﻫﻤﺎن ﻛﻼس ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ.
(2
:Familyﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﻓﻘﻂ ﺑﻪ وﺳﻴﻠﻪ ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ از آن ﻛﻼس ﻣﺸﺘﻖ ﺷﺪه اﻧﺪ ،ﺑﺪون ﺗﻮﺟـﻪ ﺑـﻪ اﻳﻨﻜـﻪ در ﻫﻤﺎن اﺳﻤﺒﻠﻲ ﻗﺮار دارد ﻳﺎ ﻧﻪ ،ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ. :Family and Assemblyﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﻓﻘﻂ در ﺗﻮاﺑﻌﻲ از ﻫﻤﺎن اﺳﻤﺒﻠﻲ ﻛﻪ ﻋﻼوه ﺑﺮ آن از ﻛﻼس ﻣﻮرد ﻧﻈﺮ ﻧﻴﺰ ﻣﺸﺘﻖ ﺷﺪه اﻧﺪ ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ .ﺑﺴﻴﺎري از زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣـﻪ ﻧﻮﻳـﺴﻲ از ﻗﺒﻴـﻞ C#و Visual Basicاﻳﻦ ﻧﻮع ﺳﻄﺢ دﺳﺘﺮﺳﻲ را اراﺋﻪ ﻧﻤﻲ دﻫﻨﺪ. :Assemblyﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﻓﻘﻂ ﺑﻪ وﺳﻴﻠﻪ ﻛﻼﺳﻬﺎي داﺧﻞ ﻫﻤﺎن اﺳﻤﺒﻠﻲ ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ.
(3
(4 (5
(6
:Family or Assemblyﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ ﺑﻪ وﺳﻴﻠﻪ ﺗﻤﺎم ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ از اﻳـﻦ ﻛـﻼس ﻣـﺸﺘﻖ ﻣـﻲ ﺷﻮﻧﺪ ،در ﻫﻤﻪ اﺳﻤﺒﻠﻲ ﻫﺎ ،ﻗﺎﺑﻞ اﺳﺘﻔﺎده اﺳﺖ .ﻋﻼوه ﺑﺮ اﻳـﻦ ،اﻳـﻦ ﻣﺘـﺪ در ﻫﻤـﻪ ﻛﻼﺳـﻬﺎي آن اﺳـﻤﺒﻠﻲ ﻧﻴـﺰ ﻗﺎﺑـﻞ دﺳﺘﺮﺳﻲ اﺳﺖ. :Publicﻣﺘﺪ ﻣﻮرد ﻧﻈﺮ د ﻫﻤﻪ ﻛﻼﺳﻬﺎ ﺻﺮف ﻧﻈﺮ از اﻳﻨﻜﻪ در ﭼﻪ اﺳﻤﺒﻠﻲ ﻗﺮار دارد ،ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ اﺳﺖ.
Common Type System Properties
1 2
٩٣٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻋﻼوه ﺑﺮ اﻳﻦ CTS ،ﻗﻮاﻋﺪي را ﺑﺮاي وراﺛﺖ ،ﻃﻮل ﻋﻤﺮ اﺷﻴﺎ ،ﺗﻮاﺑﻊ ﻣﺠﺎزي و ﻏﻴﺮه ﻧﻴﺰ ﺑﻴﺎن ﻣﻲ ﻛﻨﺪ.
ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ: ﻳﻜﻲ از اﻣﻜﺎﻧﺎﺗﻲ ﻛﻪ ﻫﻤﺮاه ﺑﺎ COMﻋﺮﺿﻪ ﺷﺪ ،اﺳﺘﻔﺎده از ﻛﺪ ﻫﺎي ﻧﻮﺷﺘﻪ ﺷﺪه در ﻳﻚ زﺑﺎن ﺑـﻪ وﺳـﻴﻠﻪ زﺑـﺎﻧﻲ دﻳﮕـﺮ ﺑـﻮد .اﻳـﻦ اﻣﻜﺎن ﺑﻪ وﺳﻴﻠﻪ ي CLRﻧﻴﺰ ﺑﻪ ﻧﺤﻮي ﺑﺴﻴﺎر ﻛﺎﻣﻞ ﺗﺮ اراﺋﻪ ﺷﺪه اﺳﺖ .از ﺳﻮي دﻳﮕﺮ CLR ،ﺑﺎ ﻳﻜﻲ ﻛـﺮدن ﺗﻤـﺎم زﺑﺎﻧﻬـﺎ اﻳـﻦ اﻣﻜﺎن را ﻣﻲ دﻫﺪ ﻛﻪ اﺷﻴﺎي ﺗﻮﻟﻴﺪ ﺷﺪه در ﻳﻚ زﺑﺎن در زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﺎﺷﺪ .اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑـﺎ ﺗﻮﺟـﻪ ﺑـﻪ ﻧـﻮع داده اي ﻋﻤﻮﻣﻲ ﻣﺸﺘﺮك ﺑﻴﻦ ﻫﻤﻪ ي زﺑﺎﻧﻬﺎ ،اﺳﺘﻔﺎده از metadataﻫﺎ ﺑﺮاي ﺷﺮح اﻃﻼﻋﺎت ﻛﻼس و ﻣﺤﻴﻂ اﺟﺮاي ﻋﻤﻮﻣﻲ ﺑﻪ وﺟﻮد آﻣﺪه اﺳﺖ. ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﻣﻜﺎﻧﺎت ﻛﺎﻣﻼ ﻣﺘﻔﺎوﺗﻲ را ﻋﺮﺿﻪ ﻣﻲ ﻛﻨﻨﺪ ،اﻳﻦ ﻗﺎﺑﻠﻴﺖ ﺑﺴﻴﺎر ﺷﮕﻔﺖ اﻧﮕﻴﺰ ﺑـﻪ ﻧﻈـﺮ ﻣـﻲ رﺳﺪ .ﺑﺮاي ﻣﺜﺎل ﺑﻌﻀﻲ از زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺣﺴﺎس ﺑﻪ ﺑﺰرﮔﻲ و ﻛﻮﭼﻜﻲ ﺣﺮوف ﻫﺴﺘﻨﺪ ،ﺑﻌﻀﻲ ﺳﺮﺑﺎر ﮔـﺬاري ﻋﻤﻠﮕـﺮ ﻫـﺎ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ و ﻳﺎ ﺑﻌﻀﻲ اﻳﻦ اﻣﻜﺎن را ﻣﻲ دﻫﻨﺪ ﺗﺎ ﻣﺘﺪﻫﺎي ﺑﺎ ﺗﻌﺪاد ﭘﺎراﻣﺘﺮﻫﺎي ﻧﺎﻣﺤﺪود اﻳﺠﺎد ﻛﻨﻴﻢ. اﮔﺮ در اﻳﺠﺎد ﻳﻚ ﺑﺮﻧﺎﻣﻪ از اﻣﻜﺎﻧﺎت ﺧﺎﺻﻲ ﻳﻚ زﺑﺎن اﺳﺘﻔﺎده ﻛﻨﻴﻢ ،اﺳﺘﻔﺎده از آن ﺑﺮﻧﺎﻣﻪ در ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﺑﺴﻴﺎر ﻣﺸﻜﻞ ﺧﻮاﻫﺪ ﺑﻮد .ﺑﻨﺎﺑﺮاﻳﻦ ﺑﺮاي ﻃﺮاﺣﻲ ﻛﻼس ﻫﺎﻳﻲ ﻛﻪ ﺑﻪ راﺣﺘﻲ در ﺗﻤﺎم زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺑﺎﺷـﻨﺪ ﺑﺎﻳـﺴﺘﻲ از اﻣﻜﺎﻧـﺎﺗﻲ در ﺑﺮﻧﺎﻣـﻪ اﺳﺘﻔﺎده ﻛﺮد ﻛﻪ ﺗﻀﻤﻴﻦ ﺑﺸﻮد در ﻫﻤﻪ زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ دﻳﮕﺮ وﺟﻮد دارﻧﺪ .ﺑﺮاي ﻣﺸﺨﺺ ﺗﺮ ﻛﺮدن اﻳﻦ اﻣﻜﺎﻧﺎت ﻛﻪ در ﺑـﻴﻦ ﻫﻤﻪ ي زﺑﺎﻧﻬﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺸﺘﺮك اﺳﺖ ،ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻳﻚ ﻣﺠﻤﻮﻋﻪ از ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ را ﻣﻌﻴﻦ ﻛﺮده ﻛـﻪ 1CLSﻧـﺎم دارد. ﻣﺠﻤﻮﻋﻪ ي CLRو ،CTSاﻣﻜﺎﻧﺎﺗﻲ ﺑﺴﻴﺎر ﺑﻴﺸﺘﺮ از آﻧﭽﻪ CLSﺗﻌﻴﻴﻦ ﻛﺮده اﺳﺖ را اراﺋﻪ ﻣﻲ دﻫﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﻛﻼس ﺗﺤﺖ ﻃﺮاﺣﻲ ﻧﺒﺎﻳﺪ در زﺑﺎﻧﻬﺎي دﻳﮕﺮ اﺳﺘﻔﺎده ﺷﻮد ﻣﻲ ﺗﻮان از ﺗﻤﺎم اﻣﻜﺎﻧﺎت CTSو CLRاﺳﺘﻔﺎده ﻛﺮد .ﺷﻜﻞ زﻳﺮ ﺳﻌﻲ ﻣﻔﻬـﻮم ذﻛـﺮ ﺷﺪه را ﺑﻴﺎن ﻣﻲ ﻛﻨﺪ.
ﺗﻤﺎم زﺑﺎﻧﻬﺎ زﻳﺮ ﻣﺠﻤﻮﻋﻪ اي از ﺗﻮاﻧﺎﻳﻴﻬﺎي CLRو ﺗﻤﺎم اﻣﻜﺎﻧﺎت CLSرا اراﻳﻪ ﻣﻲ دﻫﻨﺪ ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺨﺺ اﺳﺖ ﻫﻴﭻ زﺑﺎﻧﻲ ﺗﻤﺎﻣﻲ اﻣﻜﺎﻧﺎت CLRرا اراﺋﻪ ﻧﻤﻲ ﻛﻨـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﺑـﺮاي اﺳـﺘﻔﺎده از ﺗﻤـﺎم اﻳـﻦ اﻣﻜﺎﻧـﺎت ﺑﺎﻳـﺴﺘﻲ از زﺑـﺎن ILﻛﻤـﻚ ﮔﺮﻓـﺖ .ﺑـﻪ ﺟـﺰ زﺑـﺎن ،ILدﻳﮕـﺮ زﺑﺎﻧﻬـﺎ از ﻗﺒﻴـﻞ ،Visual Basic ،C# Fortranو ﻏﻴﺮه ﻓﻘﻂ ﻗﺴﻤﺘﻲ از اﻣﻜﺎﻧﺎت CLRو CTSرا اراﻳﻪ ﻣﻲ دﻫﻨﺪ. Common Language Specifications
1
٩٣٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ ﻛﻼﺳﻲ ﺑﻪ ﻣﻨﻈﻮر اﺳﺘﻔﺎده در دﻳﮕﺮ زﺑﺎﻧﻬﺎ ﻃﺮاﺣﻲ ﻣﻲ ﺷﻮد ،ﺑﺎﻳﺴﺘﻲ اﻳﻦ ﻧﻜﺘﻪ را ﻣﺪ ﻧﻈـﺮ ﻗـﺮار داد ﻛـﻪ در آن ﻛـﻼس ﻧﺒﺎﻳـﺪ از اﻣﻜﺎﻧﺎﺗﻲ ﻛﻪ ﺧﺎرج از ﻣﺤﺪوده CLSﻫﺴﺘﻨﺪ اﺳﺘﻔﺎده ﻛﺮد .در ﻏﻴﺮ اﻳﻦ ﺻﻮرت آن ﻗﺴﻤﺖ از ﺑﺮﻧﺎﻣﻪ در زﺑﺎﻧﻬﺎي دﻳﮕـﺮ ﻛـﻪ وﻳﮋﮔـﻲ ﻣﻮرد اﺳﺘﻔﺎده را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﻛﻨﻨﺪ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﺨﻮاﻫﺪ ﺑﻮد. ﺑﺮاي ﻣﺜﺎل در ﻛﺪ زﻳﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺎ اﺳﺘﻔﺎده از ﺧﺼﻴﺼﻪ ي ،CLSCompliantﺑﻪ ﺻﻮرت ﺳﺎزﮔﺎر ﺑﺎ CLSﺗﻌﺮﻳـﻒ ﺷـﺪه اﺳﺖ .اﻣﺎ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺨﺺ اﺳﺖ ،ﺗﻌﺪادي از وﻳﮋﮔﻲ ﻫﺎي ﺑﻪ ﻛﺎر رﻓﺘﻪ در آن ﻗﻮاﻋﺪ CLSرا ﻧﻘﺾ ﻣﻴﻜﻨﻨﺪ .اﻳﻦ ﻣـﻮارد ﺑﺎﻋـﺚ ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ ﻛﺪ ﺑﺎ ﺧﻄﺎ روﺑﺮو ﺷﻮد. // Tell the compiler for check the CLS compliance ])[CLSCompliant(true // Errors appear because the class is public public class App { // Error: Return type of 'App.Abc' is not CLS-Compliant )(public UInt32 Abc { ;return 0 } // Error: Identifier 'App.abc' differing only in case is not // CLS-Compliant )(public void abc } { // No error: method is private )(private UInt32 ABC { ;return 0 } }
در اﻳﻦ ﻛﻼس ،ﻋﺒﺎرت]) [CLSCompliant(trueﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ ﻛﺪ ﻫﺎﻳﻲ از ﺑﺮﻧﺎﻣﻪ ﻛﻪ ﺑﻪ ﺻـﻮرت publicﻫﺴﺘﻨﺪ را ﺑﺮاي ﻫﻤﺎﻫﻨﮓ ﺑﻮدن ﺑﺎ CLSﺑﺮرﺳﻲ ﻛﻨﺪ .ﻫﻨﮕﺎم ﻛﺎﻣﭙﺎﻳﻞ اﻳﻦ ﻛﺪ ،ﻛﺎﻣﭙﺎﻳﻠﺮ در دو ﻗﺴﻤﺖ ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﺧﻄـﺎ ﻣﻮاﺟﻪ ﻣﻲ ﺷﻮد .ﺧﻄﺎي اول ﺑﻪ ﻋﻠﺖ ﻧﻮع داده ﺑﺎزﮔﺸﺘﻲ ﺗﺎﺑﻊ Abcاﺳﺖ ﻛﻪ در ﺑﻌﻀﻲ از زﺑﺎﻧﻬﺎ ﻣﺎﻧﻨـﺪ Visual Basic ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﺷﻮد .ﺧﻄﺎي دوم ﻧﻴﺰ ﻣﺮﺑﻮط ﺑﻪ ﻫﻢ ﻧﺎم ﺑﻮدن ﺗﻮاﺑﻊ Abcو abcاﺳﺖ .اﻳـﻦ ﺗﻮاﺑـﻊ ﻓﻘـﻂ در ﺣـﺴﺎس ﺑـﻮدن ﺑـﻪ ﺣﺮوف ﺗﻔﺎوت دارﻧﺪ ﻛﻪ ﺗﻤﺎم زﺑﺎﻧﻬﺎ ﺑﻪ اﻧﺪازه ﺣﺮوف ﺣﺴﺎس ﻧﻴﺴﺘﻨﺪ. اﻟﺒﺘﻪ ﺗﻤﺎم اﻳﻦ ﺧﻄﺎﻫﺎ ﺑﻪ اﻳﻦ ﻋﻠﺖ اﻳﺠﺎد ﻣﻲ ﺷﻮد ﻛﻪ ﺳﻄﺢ دﺳﺘﺮﺳﻲ ﻛﻼس از ﻧﻮع ﻋﻤﻮﻣﻲ اﺳﺖ .اﮔﺮ ﺳﻄﺢ دﺳﺘﺮﺳـﻲ ﻛـﻼس و ﻳﺎ ﻫﺮ ﻛﺪام از ﺗﻮاﺑﻊ از publicﺑﻪ privateﺗﻐﻴﻴﺮ ﻛﻨﺪ ﺧﻄﺎي ﻣﺮﺑﻮط ﺑﻪ آن ﻧﻴﺰ از ﺑﻴﻦ ﺧﻮاﻫﺪ رﻓﺖ.
٩٣٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺿﻤﻴﻤﻪ :4ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ در .NET در ﺑﺨﺶ ﻗﺒﻠﻲ CLR ،ﻛﻪ ﺑﻪ ﻋﻨﻮان ﻫﺴﺘﻪ اﺻﻠﻲ .NET Frameworkدر ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮد ،ﺑﺮرﺳﻲ ﺷﺪ .ﺑﻪ ﻋﻨﻮان دو وﻳﮋﮔﻲ ﻣﻬﻢ ،CLRﻣﻴﺘﻮان از ﺗﻮاﻧﺎﻳﻲ ﺑﺮﻗﺮاري ارﺗﺒﺎط آن ﺑﻴﻦ زﺑﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ و ﻧﻴﺰ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ ﻗﻮي آن ﻳﺎد ﻛﺮد. در ﺗﻮﺿﻴﺢ وﻳﮋﮔﻲ اول ،ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻗﺴﻤﺖ ﻗﺒﻠﻲ ذﻛﺮ ﺷﺪ CLR ،ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺳﺮي ﺧﺼﻮﺻﻴﺎت ﻋﻤﻮﻣﻲ ﻛﻪ ﺑﻪ وﺳﻴﻠﻪ ﺗﻤﺎم زﺑﺎﻧﻬﺎ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻴﺸﻮد) ،(CLSاﻣﻜﺎن اﺳﺘﻔﺎده از ﻛﻼس ﻧﻮﺷﺘﻪ ﺷﺪه در ﻳﻚ زﺑﺎن را ،در زﺑﺎﻧﻬﺎي دﻳﮕﺮ ﻓﺮاﻫﻢ ﻣﻴﻜﻨﺪ. وﻳﮋﮔﻲ ﻣﻬﻢ دﻳﮕﺮ CLRﻛﻪ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ در آن ﻣﻴﺸﻮد ،ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ آن اﺳﺖ .اﻳﻦ ﺑﺨﺶ در CLRﺑﺮ ﻋﻬﺪه Garbage Collectorاﺳﺖ ﻛﻪ ﺑﻪ ﻋﻠﺖ اﻫﻤﻴﺖ اﻳﻦ ﻣﻮﺿﻮع در اﻳﻦ ﻗﺴﻤﺖ ﻛﺎﻣﻼ ﺗﻮﺿﻴﺢ داده ﻣﻴﺸﻮد.
درك ﻣﺒﺎﻧﻲ ﻛﺎر :Garbage Collector ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻧﺤﻮي از ﻣﻨﺎﺑﻊ ﻣﺸﺨﺼﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﻨﺎﺑﻊ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻓﺎﻳﻠﻬﺎ ،ﺑﺎﻓﺮ ﻫﺎي ﺣﺎﻓﻈﻪ ،ﻓﻀﺎ ﻫﺎي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ، ارﺗﺒﺎﻃﺎت ﺷﺒﻜﻪ اي ،ﻣﻨﺎﺑﻊ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ و ﻣﺎﻧﻨﺪ اﻳﻨﻬﺎ ﺑﺎﺷﻨﺪ .در ﺣﻘﻴﻘﺖ در ﻳﻚ ﻣﺤﻴﻂ ﺷﻴﺊ ﮔﺮا ﻫﺮ ﻧﻮع داده ﺗﻌﺮﻳﻒ ﺷﺪه در ﺑﺮﻧﺎﻣﻪ ﺑﻌﻀﻲ از ﻣﻨﺎﺑﻊ ﻣﻮﺟﻮد ﺑﺮاي ﺑﺮﻧﺎﻣﻪ را اراﺋﻪ ﻣﻲ دﻫﺪ .ﺑﺮاي اﺳﺘﻔﺎده از ﻫﺮ ﻧﻮع از اﻳﻦ داده ﻫﺎ ﻻزم اﺳﺖ ﻛﻪ ﺑﺮاي اراﺋﻪ آن ﻧﻮع ﻣﻘﺪاري ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ داده ﺷﻮد .ﻣﻮارد زﻳﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻳﻚ ﻣﻨﺒﻊ ﻣﻮرد ﻧﻴﺎز اﺳﺖ: (1
(2 (3 (4 (5
ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﻧﻮع داده اي ﻛﻪ ﻣﻨﺒﻊ ﻣﻮرد ﻧﻈﺮ را اراﺋﻪ ﻣﻲ دﻫﺪ .اﻳﻦ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر newobjدر زﺑﺎن IL1ﺻﻮرت ﻣﻲ ﮔﻴﺮد ﻛﻪ اﻳﻦ دﺳﺘﻮر از ﺗﺮﺟﻤﻪ دﺳﺘﻮر newدر زﺑﺎن ﻫﺎﻳﻲ ﻣﺜﻞ C#و Visual Basicو دﻳﮕﺮ زﺑﺎن ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ اﻳﺠﺎد ﻣﻲ ﺷﻮد. ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺗﻨﻈﻴﻢ ﺣﺎﻟﺖ آﻏﺎزﻳﻦ 2ﻣﻨﺎﺑﻊ و ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻛﺮدن آن .ﺗﻮاﺑﻊ Constructorدر اﻳﻦ ﻧﻮع داده ﻫﺎ ﻣﺴﺌﻮل اﻳﻦ ﺗﻨﻈﻴﻤﺎت ﺑﺮاي اﻳﺠﺎد اﻳﻦ ﺣﺎﻟﺖ آﻏﺎزﻳﻦ ﻫﺴﺘﻨﺪ. اﺳﺘﻔﺎده از ﻣﻨﺎﺑﻊ ﺑﺎ دﺳﺘﺮﺳﻲ ﺑﻪ اﻋﻀﺎي ﻣﻮﺟﻮد در ﻧﻮع داده. از ﺑﻴﻦ ﺑﺮدن ﺣﺎﻟﺖ ﻛﻠﻲ ﻣﻨﺎﺑﻊ ﺑﺮاي ﭘﺎك ﻛﺮدن آن. آزاد ﺳﺎزي ﺣﺎﻓﻈﻪ Garbage Collector .ﻣﺴﺌﻮل ﻣﻄﻠﻖ اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود.
اﻳﻦ ﻧﻤﻮﻧﻪ ﺑﻪ ﻇﺎﻫﺮ ﺳﺎده ﻳﻜﻲ از رﻳﺸﻪ ﻫﺎي اﺻﻠﻲ ﺧﻄﺎﻫﺎي اﻳﺠﺎد ﺷﺪه در ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود .ﻣﻮاﻗﻊ زﻳﺎدي ﭘﻴﺶ ﻣﻲ آﻳﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ آزادﺳﺎزي ﻳﻚ ﺣﺎﻓﻈﻪ را وﻗﺘﻲ دﻳﮕﺮ ﻣﻮرد ﻧﻴﺎز ﻧﻴﺴﺖ ﻓﺮاﻣﻮش ﻣﻲ ﻛﻨﺪ .ﻣﻮاﻗﻊ زﻳﺎدي ﭘﻴﺶ ﻣﻲ آﻳﺪ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ از ﻳﻚ ﺣﺎﻓﻈﻪ ﻛﻪ ﻗﺒﻼ آزاد ﺷﺪه اﺳﺘﻔﺎده ﻛﻨﺪ. اﻳﻦ دو ﺑﺎگ ﺑﺮﻧﺎﻣﻪ ﻫﺎ از اﻛﺜﺮ آﻧﻬﺎ ﺑﺪﺗﺮ اﻧﺪ زﻳﺮا ﻣﻌﻤﻮﻻ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﻧﻤﻴﺘﻮاﻧﺪ ﺗﺮﺗﻴﺐ ﻳﺎ زﻣﺎن ﺑﻪ وﺟﻮد آﻣﺪن اﻳﻦ ﺧﻄﺎﻫﺎ را ﭘﻴﺶ ﺑﻴﻨﻲ ﻛﻨﺪ .ﺑﺮاي دﻳﮕﺮ ﺑﺎگ ﻫﺎ ﺷﻤﺎ ﻣﻴﺘﻮاﻧﻴﺪ ﺑﺎ ﻣﺸﺎﻫﺪه رﻓﺘﺎر اﺷﺘﺒﺎه ﻳﻚ ﺑﺮﻧﺎﻣﻪ آن را ﺑﻪ ﺳﺎدﮔﻲ ﺗﺼﺤﻴﺢ ﻛﻨﻴﺪ .اﻣﺎ اﻳﻦ دو ﺑﺎگ ﻣﻮﺟﺐ ﻧﺸﺖ ﻣﻨﺎﺑﻊ) 3ﻣﺼﺮف ﺑﻲ ﺟﺎي ﺣﺎﻓﻈﻪ( و از ﺑﻴﻦ رﻓﺘﻦ ﭘﺎﻳﺪاري اﺷﻴﺎ ﻣﻴﺸﻮﻧﺪ ﻛﻪ ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ را در زﻣﺎﻧﻬﺎي ﻣﺨﺘﻠﻒ ﺗﻐﻴﻴﺮ ﻣﻴﺪﻫﺪ .ﺑﺮاي ﻛﻤﻚ ﺑﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺮاي ﺗﺸﺨﻴﺺ اﻳﻦ ﻧﻮع ﺧﻄﺎﻫﺎ اﺑﺰارﻫﺎي وﻳﮋه اي ﻣﺎﻧﻨﺪ Windows Task Managerو System Monitor ActiveX Controlو NuMega Bounds Checkerو ...ﻃﺮاﺣﻲ ﺷﺪه اﻧﺪ. 1
Intermediate Language Initial State 3 Resource leaks 2
٩٣٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻳﻚ ﻣﺪﻳﺮﻳﺖ ﻣﻨﺒﻊ ﻣﻨﺎﺳﺐ ﺑﺴﻴﺎر ﻣﺸﻜﻞ و ﺧﺴﺘﻪ ﻛﻨﻨﺪه اﺳﺖ .اﻳﻦ ﻣﻮرد ﺗﻤﺮﻛﺰ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ را ﺑﺮ روي ﻣﻄﻠﺐ اﺻﻠﻲ از ﺑﻴﻦ ﻣﻴﺒﺮد .ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﻧﻴﺎز ﺑﻪ ﻳﻚ ﻣﻜﺎﻧﻴﺴﻢ ﻛﻪ ﻣﺪﻳﺮﻳﺖ ﺣﺎﻓﻈﻪ را ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ اﻧﺠﺎم دﻫﺪ در اﻳﻦ زﻣﻴﻨﻪ ﺑﻪ وﺿﻮح اﺣﺴﺎس ﻣﻴﺸﺪ .در ﭘﻠﺖ ﻓﺮم .NETاﻳﻦ اﻣﺮ ﺗﻮﺳﻂ Garbage Collectorاﻧﺠﺎم ﻣﻴﺸﻮد. Garbage Collectionﻛﺎﻣﻼ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ را از ﻛﻨﺘﺮل اﺳﺘﻔﺎده از ﺣﺎﻓﻈﻪ و ﺑﺮرﺳﻲ زﻣﺎن آزادﺳﺎزي آن راﺣﺖ ﻣﻴﻜﻨﺪ. اﮔﺮﭼﻪ Garbage Collectorدرﻣﻮرد ﻣﻨﺎﺑﻊ اراﺋﻪ ﺷﺪه ﺗﻮﺳﻂ ﻧﻮع داده در ﺣﺎﻓﻈﻪ ﻫﻴﭻ ﭼﻴﺰ ﻧﻤﻴﺪاﻧﺪ ،ﻳﻌﻨﻲ Garbage Collectorﻧﻤﻴﺪاﻧﺪ ﭼﻪ ﻃﻮر ﻣﻴﺘﻮاﻧﺪ ﻣﺮﺣﻠﻪ 4از ﻣﻮارد ﺑﺎﻻ را اﻧﺠﺎم دﻫﺪ :از ﺑﻴﻦ ﺑﺮدن ﺣﺎﻟﺖ ﻛﻠﻲ ﻣﻨﺎﺑﻊ ﺑﺮاي ﭘﺎك ﻛﺮدن آن .ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ ﺑﺎﻳﺪ ﻛﺪ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ اﻳﻦ ﻗﺴﻤﺖ را اﻧﺠﺎم دﻫﺪ ﭼﻮن او ﻣﻴﺪاﻧﺪ ﺑﺎﻳﺪ ﭼﻪ ﮔﻮﻧﻪ ﺣﺎﻓﻈﻪ را ﺑﻪ درﺳﺘﻲ و ﻛﺎﻣﻼ آزاد ﻛﻨﺪ .اﻟﺒﺘﻪ Garbage Collectorﻣﻴﺘﻮاﻧﺪ در اﻳﻦ زﻣﻴﻨﻪ ﻧﻴﺰ ﻗﺴﻤﺘﻬﺎﻳﻲ از ﻛﺎر را ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺲ اﻧﺠﺎم دﻫﺪ. اﻟﺒﺘﻪ ،ﺑﻴﺸﺘﺮ ﻧﻮع داده ﻫﺎ ،ﻣﺎﻧﻨﺪ ArrayList، String ، Rectangle ، Point ، Int32و SerializationInfoاز ﻣﻨﺎﺑﻌﻲ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ اﺣﺘﻴﺎﺟﻲ ﺑﻪ ﻧﻮع وﻳﮋه اي از آزادﺳﺎزي ﺣﺎﻓﻈﻪ ﻧﺪارﻧﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻨﺎﺑﻊ ﻳﻚ ﺷﻴﺊ از ﻧﻮع Pointﺑﻪ راﺣﺘﻲ و ﺑﺎ ﻧﺎﺑﻮد ﻛﺮدن ﻓﻴﻠﺪ ﻫﺎي Xو Yدر ﺣﺎﻓﻈﻪ ﺷﻴﺊ آزاد ﻣﻴﺸﻮد. از ﻃﺮف دﻳﮕﺮ ،ﻳﻚ ﻧﻮع داده ﻛﻪ ﻣﻨﺎﺑﻊ ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه اي را اراﺋﻪ ﻣﻴﺪﻫﺪ ،ﻣﺎﻧﻨﺪ ﻳﻚ ﻓﺎﻳﻞ ،ﻳﻚ ارﺗﺒﺎط ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ،ﻳﻚ ﺳﻮﻛﺖ ،ﻳﻚ ،Bitmapﻳﻚ آﻳﻜﻮن و ﻣﺎﻧﻨﺪ اﻳﻨﻬﺎ ﻫﻤﻴﺸﻪ ﺑﻪ اﺟﺮاي ﻣﻘﺪاري ﻛﺪ وﻳﮋه ﺑﺮاي آزاد ﻛﺮدن ﺣﺎﻓﻈﻪ ﮔﺮﻓﺘﻪ ﺷﺪه ﻧﻴﺎز دارﻧﺪ. CLR1ﻧﻴﺎز دارد ﻛﻪ ﺣﺎﻓﻈﻪ ﺗﻤﺎم ﻣﻨﺎﺑﻊ از ﻳﻚ heapﻣﺨﺼﻮص ﻛﻪ managed heapﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد ﺗﺨﺼﻴﺺ داده ﺷﻮد. اﻳﻦ heapﺷﺒﻴﻪ heapزﻣﺎن اﺟﺮاي Cاﺳﺖ و ﻓﻘﻂ از ﻳﻚ ﻟﺤﺎظ ﻣﺘﻔﺎوت اﺳﺖ و آن اﻳﻦ اﺳﺖ ﻛﻪ در اﻳﻦ heapﺷﻤﺎ ﻫﻴﭻ وﻗﺖ ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ داده ﺷﺪه را آزاد ﻧﻤﻴﻜﻨﻴﺪ .در ﺣﻘﻴﻘﺖ اﺷﻴﺎ ﻣﻮﺟﻮد در اﻳﻦ heapوﻗﺘﻲ دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ آﻧﻬﺎ ﻧﺒﺎﺷﺪ آزاد ﻣﻴﺸﻮﻧﺪ. اﻳﻦ ﻣﻮرد اﻳﻦ ﺳﻮال را اﻳﺠﺎد ﻣﻴﻜﻨﺪ ﻛﻪ ﭼﮕﻮﻧﻪ managed heapﻣﺘﻮﺟﻪ ﻣﻴﺸﻮد ﻛﻪ دﻳﮕﺮ ﻧﻴﺎزي ﺑﻪ ﻳﻚ ﺷﻴﺊ ﺧﺎص ﻧﻴﺴﺖ؟ ﭼﻨﺪﻳﻦ اﻟﮕﻮرﻳﺘﻢ از Garbage Collectorدر ﺣﺎل ﺣﺎﺿﺮ در ﻣﺮﺣﻠﻪ آزﻣﺎﻳﺶ ﻫﺴﺘﻨﺪ و ﻫﺮ ﻛﺪام از اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻫﺎ ﺑﺮاي ﻳﻚ ﻣﺤﻴﻂ ﺧﺎص و ﻧﻴﺰ ﺑﺮاي ﻛﺴﺐ ﺑﻬﺘﺮﻳﻦ راﻧﺪﻣﺎن ﺑﻬﻴﻨﻪ ﺳﺎزي ﺷﺪه اﻧﺪ .در اﻳﻦ ﻣﻘﺎﻟﻪ روي اﻟﮕﻮرﻳﺘﻢ Garbage Collectorاﺳﺘﻔﺎده ﺷﺪه در Microsoft .NET Framework CLRﻣﺘﻤﺮﻛﺰ ﺷﺪه اﺳﺖ. زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﭘﺮوﺳﻪ ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ 2ﻣﻴﺸﻮد CLR ،ﻳﻚ ﻗﺴﻤﺖ ﭘﻴﻮﺳﺘﻪ از آدرس ﺣﺎﻓﻈﻪ را ﺑﺮاي آن اﺧﺘﺼﺎص ﻣﻴﺪﻫﺪ اﻳﻦ آدرس ﻓﻀﺎي ﺣﺎﻓﻈﻪ managed heapﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد .اﻳﻦ heapﻫﻤﭽﻨﻴﻦ ﻳﻚ اﺷﺎره ﮔﺮ ﻣﺨﺼﻮص ﻫﻢ دارد ﻛﻪ ﻣﺎ از اﻳﻦ ﺑﻪ ﺑﻌﺪ آن را NextObjPtrﻣﻲ ﻧﺎﻣﻴﻢ .اﻳﻦ اﺷﺎره ﮔﺮ ﻣﻜﺎن ﻗﺮار ﮔﻴﺮي ﺷﻴﺊ ﺑﻌﺪي را در heapﻣﺸﺨﺺ ﻣﻴﻜﻨﺪ .در اﺑﺘﺪا اﻳﻦ اﺷﺎره ﮔﺮ ﺑﻪ آدرس اﺑﺘﺪاي ﻓﻀﺎي ﮔﺮﻓﺘﻪ ﺷﺪه ﺑﺮاي managed heapاﺷﺎره ﻣﻴﻜﻨﺪ. دﺳﺘﻮر newobjدر زﺑﺎن ILﺑﺎﻋﺚ اﻳﺠﺎد ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪ ﻣﻴﺸﻮد .ﺑﻴﺸﺘﺮ زﺑﺎﻧﻬﺎ از ﺟﻤﻠﻪ C#و Visual Basicﺑﺮاي درج اﻳﻦ دﺳﺘﻮر در ﻛﺪ ILﻋﻤﻠﮕﺮ newرا در ﺑﺮﻧﺎﻣﻪ اراﺋﻪ ﻣﻴﺪﻫﻨﺪ .اﻳﻦ دﺳﺘﻮر ILﺑﺎﻋﺚ ﻣﻴﺸﻮد ﻛﻪ CLRﻣﺮاﺣﻞ زﻳﺮ را اﻧﺠﺎم دﻫﺪ: (1ﻣﺤﺎﺳﺒﻪ ﺗﻌﺪاد ﺑﺎﻳﺖ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﻳﻦ ﻧﻮع داده (2اﺿﺎﻓﻪ ﻛﺮدن ﺑﺎﻳﺖ ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي overheadﺷﻴﺊ .ﻫﺮ ﺷﻴﺊ دو ﻓﻴﻠﺪ overheadدارد :ﻳﻚ اﺷﺎره ﮔﺮ ﺑﻪ ﺟﺪول ﺗﺎﺑﻊ و ﻳﻚ SyncBlockIndexه .در ﺳﻴﺴﺘﻤﻬﺎي 32ﺑﻴﺘﻲ ،ﻫﺮ ﻛﺪام از اﻳﻦ ﻓﻴﻠﺪ ﻫﺎ 32ﺑﻴﺖ ﻫﺴﺘﻨﺪ ،ﻛﻪ 8 ﺑﺎﻳﺖ را ﺑﻪ ﻫﺮ ﺷﻴﺊ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .در ﺳﻴﺴﺘﻢ ﻫﺎي 64ﺑﻴﺘﻲ ،ﻫﺮ ﻛﺪام از اﻳﻦ ﻓﻴﻠﺪ ﻫﺎ 64ﺑﻴﺖ اﺳﺖ ﻛﻪ 16ﺑﺎﻳﺖ را ﺑﺮاي ﻫﺮ ﺷﻴﺊ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ. (3ﺳﭙﺲ CLRﭼﻚ ﻣﻴﻜﻨﺪ ﻛﻪ ﺣﺎﻓﻈﻪ ﻣﻮرد ﻧﻴﺎز ﺑﺮاي ﺷﻴﺊ ﺟﺪﻳﺪ در managed heapﻣﻮﺟﻮد ﺑﺎﺷﺪ .اﮔﺮ ﻓﻀﺎي ﻛﺎﻓﻲ ﻣﻮﺟﻮد ﺑﺎﺷﺪ اﻳﻦ ﺷﻴﺊ در آدرﺳﻲ ﻛﻪ NextObjPtrﺑﻪ آن اﺷﺎره ﻣﻴﻜﻨﺪ اﻳﺠﺎد ﻣﻴﺸﻮد .ﺗﺎﺑﻊ constructorﺷﻴﺊ ﻣﺬﻛﻮر ﻓﺮاﺧﻮاﻧﻲ ﻣﻴﺸﻮد )اﺷﺎره ﮔﺮ NextObjPtrﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ thisﺑﻪ constructorﻓﺮﺳﺘﺎده ﻣﻴﺸﻮد( و دﺳﺘﻮر newobjآدرس ﺷﻴﺊ اﻳﺠﺎد ﺷﺪه را ﺑﺮﻣﻴﮕﺮداﻧﺪ .درﺳﺖ ﻗﺒﻞ از اﻳﻨﻜﻪ Common Language Runtime Initialize
1 2
٩٣٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
آدرس ﺑﺮﮔﺮداﻧﺪه ﺷﻮد NextObjPtr ،ﺑﻪ ﺑﻌﺪ از ﺷﻴﺊ اﻳﺠﺎد ﺷﺪه ﭘﻴﺸﺮوي ﻣﻴﻜﻨﺪ و ﻣﺜﻞ ﻗﺒﻞ آدرﺳﻲ ﻛﻪ ﺑﺎﻳﺪ ﺷﻴﺊ ﺑﻌﺪي در آن ﻗﺮار ﮔﻴﺮد را در ﺧﻮد ﻧﮕﻪ ﻣﻴﺪارد. ﺷﻜﻞ زﻳﺮ ﻳﻚ managed heapرا ﻛﻪ ﺳﻪ ﺷﻴﺊ Aو Bو Cرا درﺧﻮد ﻧﮕﻪ ﻣﻴﺪارد را ﻧﺸﺎن ﻣﻴﺪﻫﺪ .اﮔﺮ ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪ اﻳﺠﺎد ﺷﻮد اﻳﻦ ﺷﻴﺊ دﻗﻴﻘﺎ در ﺟﺎﻳﻲ ﻛﻪ NextObjPtrﺑﻪ آن اﺷﺎره ﻣﻴﻜﻨﺪ ﻗﺮار ﻣﻴﮕﻴﺮد )درﺳﺖ ﺑﻌﺪ از ﺷﻴﺊ .(C
در ﻋﻮض اﺟﺎزه دﻫﻴﺪ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ را در heapزﻣﺎن اﺟﺮاي Cﺑﺮرﺳﻲ ﻛﻨﻴﻢ .در ﻳﻚ heapزﻣﺎن اﺟﺮاي Cﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﻳﻚ ﺷﻲ ﺑﻪ ﺣﺮﻛﺖ در ﻣﻴﺎن ﺳﺎﺧﺘﺎرﻫﺎي داده از ﻳﻚ ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ﻧﻴﺎز دارد .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺑﻼك ﺣﺎﻓﻈﻪ ﺑﺎ اﻧﺪازه ﻻزم ﭘﻴﺪا ﺷﺪ اﻳﻦ ﺑﻼك ﺣﺎﻓﻈﻪ ﺗﻘﺴﻴﻢ ﻣﻴﺸﻮد و ﺷﻴﺊ ﻣﺬﻛﻮر در آن اﻳﺠﺎد ﻣﻴﺸﻮد و اﺷﺎره ﮔﺮﻫﺎي ﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﭘﻴﻮﻧﺪي ﺑﺮاي ﻧﮕﻪ داري در آن ﺷﻴﺊ ﺗﻐﻴﻴﺮ داده ﻣﻴﺸﻮﻧﺪ .ﺑﺮاي managed heapﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﻳﻚ ﺷﻴﺊ ﺑﻪ ﻣﻌﻨﺎي اﺿﺎﻓﻪ ﻛﺮدن ﻳﻚ ﻣﻘﺪار ﺑﻪ اﺷﺎره ﮔﺮ اﺳﺖ .در ﺣﻘﻴﻘﺖ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ در managed heapﺗﻘﺮﻳﺒﺎ ﺑﻪ ﺳﺮﻋﺖ اﻳﺠﺎد ﻳﻚ ﻣﺘﻐﻴﻴﺮ در stack اﺳﺖ! ﺑﻪ ﻋﻼوه در ﺑﻴﺸﺘﺮ heapﻫﺎ ﻣﺎﻧﻨﺪ heapزﻣﺎن اﺟﺮاي Cﺣﺎﻓﻈﻪ در ﺟﺎﻳﻲ اﺧﺘﺼﺎص داده ﻣﻴﺸﻮد ﻛﻪ ﻓﻀﺎي ﺧﺎﻟﻲ ﻛﺎﻓﻲ ﻳﺎﻓﺖ ﺷﻮد .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﭼﻨﺪ ﺷﻴﺊ ﺑﻼﻓﺎﺻﻠﻪ ﺑﻌﺪ از ﻫﻢ در ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﺷﻮﻧﺪ ،ﻣﻤﻜﻦ اﺳﺖ اﻳﻦ اﺷﻴﺎ ﭼﻨﺪﻳﻦ ﻣﮕﺎ ﺑﺎﻳﺖ آدرس ﺣﺎﻓﻈﻪ ﺑﺎ ﻫﻢ ﻓﺎﺻﻠﻪ داﺷﺘﻪ ﺑﺎﺷﻨﺪ وﻟﻲ در managed heapاﻳﺠﺎد ﭼﻨﺪ ﺷﻴﺊ ﺑﻼﻓﺎﺻﻠﻪ ﺑﻌﺪ از ﻫﻢ ﺑﺎﻋﺚ ﻗﺮار ﮔﺮﻓﺘﻦ ﺗﺮﺗﻴﺒﻲ اﻳﻦ اﺷﻴﺎ در ﺣﺎﻓﻈﻪ ﻣﻴﺸﻮد. در ﺑﻴﺸﺘﺮ ﺑﺮﻧﺎﻣﻪ ﻫﺎ وﻗﺘﻲ ﺑﺮاي ﻳﻚ ﺷﻴﺊ ﺣﺎﻓﻈﻪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﻳﺎ ﺑﺨﻮاﻫﺪ ﺑﺎ ﻳﻚ ﺷﻴﺊ دﻳﮕﺮ ارﺗﺒﺎط ﻗﻮي داﺷﺘﻪ ﺑﺎﺷﺪ ﻳﺎ ﺑﺨﻮاﻫﺪ ﭼﻨﺪﻳﻦ ﺑﺎر در ﻳﻚ ﻗﻄﻌﻪ ﻛﺪ اﺳﺘﻔﺎده ﺷﻮد .ﺑﺮاي ﻣﺜﺎل ﻣﻌﻤﻮﻻ وﻗﺘﻲ ﻳﻚ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺷﻴﺊ BinaryWriterاﻳﺠﺎد ﺷﺪ ﺑﻼﻓﺎﺻﻠﻪ ﺑﻌﺪ از آن ﻳﻚ ﺣﺎﻓﻈﻪ ﺑﺮاي FileStreamﮔﺮﻓﺘﻪ ﺷﻮد .ﺳﭙﺲ ﺑﺮﻧﺎﻣﻪ از BinaryWriterاﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ ﻛﻪ در ﺣﻘﻴﻘﺖ ﺑﻪ ﺻﻮرت دروﻧﻲ از ﺷﻴﺊ FileStreamﻫﻢ اﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ .در ﻳﻚ ﻣﺤﻴﻂ ﻛﻨﺘﺮل ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ Garbage Collectorﺑﺮاي اﺷﻴﺎي ﺟﺪﻳﺪ ﺑﻪ ﺻﻮرت ﻣﺘﻮاﻟﻲ ﻓﻀﺎ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮد ﻛﻪ اﻳﻦ ﻋﻤﻞ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ راﻧﺪﻣﺎن ﺑﻪ دﻟﻴﻞ ﻣﻮﻗﻌﻴﺖ ارﺟﺎع ﻫﺎ ﻣﻴﺸﻮد .ﺑﻪ وﻳﮋه اﻳﻦ ﻣﻮرد ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻣﺠﻤﻮﻋﻪ ﻛﺎرﻫﺎي ﭘﺮوﺳﻪ ﺷﻤﺎ ﻛﻤﺘﺮ ﺷﺪه و اﻳﻦ ﻧﻴﺰ ﻣﺘﺸﺎﺑﻪ ﻗﺮار ﮔﺮﻓﺘﻦ اﺷﻴﺎي ﻣﻮرد اﺳﺘﻔﺎده ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ در CPU Cacheاﺳﺖ. ﺗﺎ ﻛﻨﻮن اﻳﻨﮕﻮﻧﻪ ﺑﻪ ﻧﻈﺮ ﻣﻴﺮﺳﻴﺪ ﻛﻪ managed heapﺑﺴﻴﺎر ﺑﺮﺗﺮ از heapزﻣﺎن اﺟﺮاي Cاﺳﺖ و اﻳﻦ ﻧﻴﺰ ﺑﻪ دﻟﻴﻞ ﺳﺎدﮔﻲ ﭘﻴﺎده ﺳﺎزي و ﺳﺮﻋﺖ آن اﺳﺖ .اﻣﺎ ﻧﻜﺘﻪ دﻳﮕﺮي ﻛﻪ اﻳﻨﺠﺎ ﺑﺎﻳﺪ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ managed heapاﻳﻦ ﺗﻮاﻧﺎﻳﻲ ﻫﺎ را ﺑﻪ اﻳﻦ دﻟﻴﻞ ﺑﻪ دﺳﺖ ﻣﻲ آورد ﻛﻪ ﻳﻚ ﻓﺮض ﺑﺰرگ اﻧﺠﺎم ﻣﻴﺪﻫﺪ و آن ﻓﺮض اﻳﻦ اﺳﺖ ﻛﻪ ﻓﻀﺎي آدرس و ﺣﺎﻓﻈﻪ ﺑﻴﻨﻬﺎﻳﺖ ﻫﺴﺘﻨﺪ .ﺑﻪ وﺿﻮح اﻳﻦ ﻓﺮض ﻛﻤﻲ ﺧﻨﺪه دار ﺑﻪ ﻧﻈﺮ ﻣﻴﺮﺳﺪ و ﻣﺴﻠﻤﺎ managed heapﺑﺎﻳﺪ ﻳﻚ ﻣﻜﺎﻧﻴﺴﻢ وﻳﮋه اي را ﺑﻪ ﻛﺎر ﺑﺮد ﺗﺎ ﺑﺘﻮاﻧﺪ اﻳﻦ ﻓﺮض را اﻧﺠﺎم دﻫﺪ .اﻳﻦ ﻣﻜﺎﻧﻴﺴﻢ Garbage Collectorﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد ،ﻛﻪ در اداﻣﻪ ﻃﺮز ﻛﺎر آن ﺷﺮح داده ﻣﻴﺸﻮد. زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻋﻤﻠﮕﺮ newرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻴﻜﻨﺪ ﻣﻤﻜﻦ اﺳﺖ ﻓﻀﺎي ﺧﺎﻟﻲ ﻛﺎﻓﻲ ﺑﺮاي ﺷﻴﺊ ﻣﻮرد ﻧﻈﺮ وﺟﻮد ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ. heapاﻳﻦ ﻣﻮﺿﻮع را ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن ﺣﺠﻢ ﻣﻮرد ﻧﻴﺎز ﺑﻪ آدرس ﻣﻮﺟﻮد در NextObjPtrﻣﺘﻮﺟﻪ ﻣﻴﺸﻮد .اﮔﺮ ﻧﺘﻴﺠﻪ از ﻓﻀﺎي در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﺷﺪه ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺗﺠﺎوز ﻛﺮد heapﭘﺮ ﺷﺪه اﺳﺖ و Garbage Collectorﺑﺎﻳﺪ آﻏﺎز ﺑﻪ ﻛﺎر ﻛﻨﺪ.
٩٣٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻣﻬﻢ :ﻣﻄﺎﻟﺒﻲ ﻛﻪ ذﻛﺮ ﺷﺪ در ﺣﻘﻴﻘﻴﺖ ﺻﻮرت ﺳﺎده ﺷﺪه ﻣﺴﺌﻠﻪ ﺑﻮد .در واﻗﻌﻴﺖ ﻳﻚ Garbage Collectionزﻣﺎﻧﻲ رخ ﻣﻲ دﻫﺪ ﻛﻪ ﻧﺴﻞ ﺻﻔﺮ ﻛﺎﻣﻞ ﺷﻮد .ﺑﻌﻀﻲ Garbage Collectorﻫﺎ از ﻧﺴﻞ ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ ﻳﻚ ﻣﻜﺎﻧﻴﺴﻢ ﺑﻪ ﺷﻤﺎر ﻣﻲ رود و ﻫﺪف اﺻﻠﻲ آن اﻓﺰاﻳﺶ ﻛﺎراﻳﻲ اﺳﺖ .اﻳﺪه اﺻﻠﻲ ﺑﻪ اﻳﻦ ﺻﻮرت اﺳﺖ ﻛﻪ اﺷﻴﺎي ﺗﺎزه اﻳﺠﺎد ﺷﺪه ﻧﺴﻞ ﺻﻔﺮ ﺑﻪ ﺷﻤﺎر ﻣﻲ روﻧﺪ و اﺷﻴﺎﻳﻲ ﻗﺪﻳﻤﻲ ﺗﺮ در ﻃﻮل ﻋﻤﺮ ﺑﺮﻧﺎﻣﻪ در ﻧﺴﻞ ﻫﺎي ﺑﺎﻻﺗﺮ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ .ﺟﺪاﺳﺎزي اﺷﻴﺎ و دﺳﺘﻪ ﺑﻨﺪي آﻧﻬﺎ ﺑﻪ ﻧﺴﻞ ﻫﺎي ﻣﺨﺘﻠﻒ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ Garbage Collectorاﺟﺎزه دﻫﺪ اﺷﻴﺎﻳﻲ ﻣﻮﺟﻮد در ﻧﺴﻞ ﺧﺎﺻﻲ را ﺑﻪ ﺟﺎي ﺗﻤﺎم اﺷﻴﺎ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار دﻫﺪ .در ﺑﺨﺶ ﻫﺎي ﺑﻌﺪي ﻧﺴﻞ ﻫﺎ ﺑﺎ ﺟﺰﺋﻴﺎت ﺗﻤﺎم ﺷﺮح داده ﻣﻲ ﺷﻮﻧﺪ .اﻣﺎ ﺗﺎ ان ﻣﺮﺣﻠﻪ ﻓﺮض ﻣﻲ ﺷﻮد ﻛﻪ Garbage collectorوﻗﺘﻲ رخ ﻣﻲ دﻫﺪ ﻛﻪ heapﭘﺮ ﺷﻮد.
اﻟﮕﻮرﻳﺘﻢ :Garbage Collection Garbage Collectionﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ در heapﺷﻴﺊ وﺟﻮد دارد ﻛﻪ دﻳﮕﺮ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻧﺸﻮد .اﮔﺮ ﭼﻨﻴﻦ اﺷﻴﺎي در ﺑﺮﻧﺎﻣﻪ ﻣﻮﺟﻮد ﺑﺎﺷﻨﺪ ﺣﺎﻓﻈﻪ ﮔﺮﻓﺘﻪ ﺷﺪه ﺗﻮﺳﻂ اﻳﻦ اﺷﻴﺎ آزاد ﻣﻴﺸﻮد )اﮔﺮ ﻫﻴﭻ ﺣﺎﻓﻈﻪ اي ﺑﺮاي اﺷﻴﺎي ﺟﺪﻳﺪ در heap ﻣﻮﺟﻮد ﻧﺒﺎﺷﺪ ﺧﻄﺎي OutOfMemoryExceptionﺗﻮﺳﻂ ﻋﻤﻠﮕﺮ newرخ ﻣﻴﺪﻫﺪ( .اﻣﺎ ﭼﮕﻮﻧﻪ Garbage Collectorﺗﺸﺨﻴﺺ ﻣﻴﺪﻫﺪ ﻛﻪ آﻳﺎ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﻣﺘﻐﻴﺮ را ﻧﻴﺎز دارد ﻳﺎ ﺧﻴﺮ؟ ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻤﻜﻦ اﺳﺖ ﺗﺼﻮر ﻛﻨﻴﺪ اﻳﻦ ﺳﻮال ﭘﺎﺳﺦ ﺳﺎده اي ﻧﺪارد. ﻫﺮ ﺑﺮﻧﺎﻣﻪ داراي ﻳﻚ ﻣﺠﻤﻮﻋﻪ از rootﻫﺎ اﺳﺖ .ﻳﻚ rootاﺷﺎره ﮔﺮي اﺳﺖ ﺑﻪ ﻳﻚ ﻧﻮع داده ارﺟﺎﻋﻲ .اﻳﻦ اﺷﺎره ﮔﺮ ﻳﺎ ﺑﻪ ﻳﻚ ﻧﻮع داده ارﺟﺎﻋﻲ در managed heapاﺷﺎره ﻣﻴﻜﻨﺪ ﻳﺎ ﺑﺎ ﻣﻘﺪار nullﻣﻘﺪار دﻫﻲ ﺷﺪه اﺳﺖ.ﺑﺮاي ﻣﺜﺎل ﺗﻤﺎم ﻣﺘﻐﻴﻴﺮ ﻫﺎي اﺳﺘﺎﺗﻴﻚ و ﻳﺎ ﻋﻤﻮﻣﻲ 1ﻳﻚ rootﺑﻪ ﺷﻤﺎر ﻣﻴﺮوﻧﺪ .ﺑﻪ ﻋﻼوه ﻫﺮ ﻣﺘﻐﻴﺮ ﻣﺤﻠﻲ ﻛﻪ از ﻧﻮع ارﺟﺎع ﺑﺎﺷﺪ و ﻳﺎ ﭘﺎراﻣﺘﺮﻫﺎي ﺗﻮاﺑﻊ در stackﻧﻴﺰ ﻳﻚ rootﺑﻪ ﺷﻤﺎر ﻣﻴﺮوﻧﺪ .در ﻧﻬﺎﻳﺖ ،درون ﻳﻚ ﺗﺎﺑﻊ ،ﻳﻚ ﺛﺒﺎت CPUﻛﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ از ﻧﻮع ارﺟﺎع اﺷﺎره ﻛﻨﺪ ﻧﻴﺰ ﻳﻚ rootﺑﻪ ﺷﻤﺎر ﻣﻴﺮود. زﻣﺎﻧﻲ ﻛﻪ ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻳﻚ ﻛﺪ ILرا ﻛﺎﻣﭙﺎﻳﻞ ﻣﻴﻜﻨﺪ ﻋﻼوه ﺑﺮ ﺗﻮﻟﻴﺪ ﻛﺪ ﻫﺎي Nativeﻳﻚ ﺟﺪول داﺧﻠﻲ ﻧﻴﺰ ﺗﺸﻜﻴﻞ ﻣﻴﺪﻫﺪ .ﻣﻨﻄﻘﺎ ﻫﺮ ردﻳﻒ از اﻳﻦ ﺟﺪول ﻳﻚ ﻣﺤﺪوده از ﺑﺎﻳﺖ ﻫﺎي آﻓﺴﺖ را در دﺳﺘﻮرات ﻣﺤﻠﻲ CPUﺑﺮاي ﺗﺎﺑﻊ ﻧﺸﺎن ﻣﻴﺪﻫﻨﺪ و ﺑﺮاي ﻫﺮ ﻛﺪام از اﻳﻦ ﻣﺤﺪوده ﻫﺎ ﻳﻚ ﻣﺠﻤﻮﻋﻪ از آدرس ﻫﺎي ﺣﺎﻓﻈﻪ ﻳﺎ ﺛﺒﺎت ﻫﺎي CPUرا ﻛﻪ ﻣﺤﺘﻮي rootﻫﺎ ﻫﺴﺘﻨﺪ ﻣﺸﺨﺺ ﻣﻴﻜﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﺟﺪول ﻣﻤﻜﻦ اﺳﺖ ﻣﺎﻧﻨﺪ ﺟﺪول زﻳﺮ ﺑﺎﺷﺪ: Sample of a JIT compiler-produced table showing mapping of native code offsets to a method's roots Starting Byte Ending Byte Roots Offset Offset 0x00000000 0x00000020 this, arg1, arg2, ECX, EDX 0x00000021 0x00000122 this, arg2, fs, EBX 0x00000123 0x00000145 Fs
Global Variables
1
٩٣٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﮔﺮ ﻳﻚ Garbage Collectorزﻣﺎﻧﻲ ﻛﻪ ﻛﺪي ﺑﻴﻦ آﻓﺴﺖ 0x00000021و 0x00000122در ﺣﺎل اﺟﺮا اﺳﺖ آﻏﺎز ﺷﻮد Garbage Collector ،ﻣﻴﺪاﻧﺪ ﻛﻪ ﭘﺎراﻣﺘﺮﻫﺎي thisو arg2و ﻣﺘﻐﻴﻴﺮ ﻫﺎي ﻣﺤﻠﻲ fsو ﺛﺒﺎت EBXﻫﻤﻪ rootﻫﺴﺘﻨﺪ و ﺑﻪ اﺷﻴﺎﻳﻲ درون heapاﺷﺎره ﻣﻴﻜﻨﻨﺪ ﻛﻪ ﻧﺒﺎﻳﺪ زﺑﺎﻟﻪ ﺗﻠﻘﻲ ﺷﻮﻧﺪ .ﺑﻪ ﻋﻼوه Garbage Collectorﻣﻴﺘﻮاﻧﺪ ﺑﻴﻦ stackﺣﺮﻛﺖ ﻛﻨﺪ و rootﻫﺎ را ﺑﺮاي ﺗﻤﺎم ﺗﻮاﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﺪه ﺑﺎ اﻣﺘﺤﺎن ﻛﺮدن ﺟﺪول داﺧﻠﻲ ﻫﺮ ﻛﺪام از اﻳﻦ ﺗﻮاﺑﻊ ﻣﺸﺨﺺ ﻛﻨﺪ Garbage Collector .وﺳﻴﻠﻪ دﻳﮕﺮي را ﺑﺮاي ﺑﺪﺳﺖ آوردن ﻣﺠﻤﻮﻋﻪ rootﻫﺎي ﻧﮕﻪ داري ﺷﺪه ﺗﻮﺳﻂ ﻣﺘﻐﻴﺮﻫﺎي ارﺟﺎﻋﻲ اﺳﺘﺎﺗﻴﻚ و ﻋﻤﻮﻣﻲ ﺑﻪ ﻛﺎر ﻣﻴﺒﺮد. ﻧﻜﺘﻪ :در ﺟﺪول ﺑﺎﻻ ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ آرﮔﻮﻣﺎن arg1ﺗﺎﺑﻊ ﺑﻌﺪ از دﺳﺘﻮرات CPUدر آﻓﺴﺖ 0x00000020دﻳﮕﺮ ﺑﻪ ﭼﻴﺰي اﺷﺎره ﻧﻤﻴﻜﻨﺪ و اﻳﻦ اﻣﺮ ﺑﺪﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺷﻴﺌﻲ ﻛﻪ arg1ﺑﻪ آن اﺷﺎره ﻣﻴﻜﻨﺪ ﻫﺮ زﻣﺎن ﺑﻌﺪ از اﺟﺮاي اﻳﻦ دﺳﺘﻮرات ﻣﻴﺘﻮاﻧﺪ ﺗﻮﺳﻂ Garbage Collectorﺟﻤﻊ آوري ﺷﻮد )اﻟﺒﺘﻪ ﻓﺮض ﺑﺮ اﻳﻨﻜﻪ ﻫﻴﭻ ﺷﻴﺊ دﻳﮕﺮي در ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺷﻴﺊ ﻣﻮرد ارﺟﺎع ﺗﻮﺳﻂ arg1اﺷﺎره ﻧﻤﻴﻜﻨﺪ( .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﻪ ﻣﺤﺾ اﻳﻨﻜﻪ ﻳﻚ ﺷﻴﺊ ﻏﻴﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺑﺎﺷﺪ ﺑﺮاي ﺟﻤﻊ آوري ﺷﺪن ﺗﻮﺳﻂ Garbage Collectorداوﻃﻠﺐ ﻣﻴﺸﻮد و ﺑﻪ ﻫﻤﻴﻦ ﻋﻠﺖ ﺑﺎﻗﻲ ﻣﺎﻧﺪن اﺷﻴﺎ ﺗﺎ ﭘﺎﻳﺎن ﻳﻚ ﻣﺘﺪ ﺗﻮﺳﻂ Garbage Collectorﺗﻀﻤﻴﻦ ﻧﻤﻴﺸﻮد. ﺑﺎ وﺟﻮد اﻳﻦ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺑﺮﻧﺎﻣﻪ زﻣﺎﻧﻲ ﻛﻪ در ﺣﺎﻟﺖ debugاﺟﺮا ﺷﺪه ﺑﺎﺷﺪ و ﻳﺎ وﻳﮋﮔﻲ System.Diagnostics.DebuggableAttributeﺑﻪ اﺳﻤﺒﻠﻲ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﺪه ﺑﺎﺷﺪ و ﻳﺎ اﻳﻨﻜﻪ ﭘﺎراﻣﺘﺮ isJITOptimizeDisabledﺑﺎ ﻣﻘﺪار trueدر constructorﺑﺮﻧﺎﻣﻪ ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ ،ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻃﻮل ﻋﻤﺮ ﺗﻤﺎم ﻣﺘﻐﻴﺮ ﻫﺎ را ،ﭼﻪ از ﻧﻮع ارﺟﺎﻋﻲ و ﭼﻪ از ﻧﻮع ﻣﻘﺪار ،ﺗﺎ ﭘﺎﻳﺎن ﻣﺤﺪوده ﺷﺎن اﻓﺰاﻳﺶ ﻣﻴﺪﻫﺪ ﻛﻪ ﻣﻌﻤﻮﻻ ﻫﻤﺎن ﭘﺎﻳﺎن ﺗﺎﺑﻊ اﺳﺖ) ﻛﺎﻣﭙﺎﻳﻠﺮ C#ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻳﻚ ﺳﻮﻳﻴﭻ ﺧﻂ ﻓﺮﻣﺎن ﺑﻪ ﻧﺎم /debugرا اراﺋﻪ ﻣﻴﺪﻫﺪ ﻛﻪ ﺑﺎﻋﺚ اﺿﺎﻓﻪ ﺷﺪن DebuggableAttributeﺑﻪ اﺳﻤﺒﻠﻲ اﺿﺎﻓﻪ ﻣﻴﺸﻮد و ﻧﻴﺰ ﭘﺎراﻣﺘﺮ isJITOptimizeDisabledرا ﻧﻴﺰ trueﻣﻴﻜﻨﺪ( .اﻳﻦ اﻓﺰاﻳﺶ ﻃﻮل ﻋﻤﺮ از ﺟﻤﻊ آوري ﺷﺪن ﻣﺘﻐﻴﺮ ﻫﺎ ﺗﻮﺳﻂ Garbage Collectorدر ﻣﺤﺪوده اﺟﺮاﻳﻲ آﻧﻬﺎ در ﻃﻮل ﺑﺮﻧﺎﻣﻪ ﺟﻠﻮﮔﻴﺮي ﻣﻴﻜﻨﺪ و اﻳﻦ ﻋﻤﻞ ﻓﻘﻂ در زﻣﺎن debugﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻣﻔﻴﺪ واﻗﻊ ﻣﻴﺸﻮد. زﻣﺎﻧﻲ ﻛﻪ Garbage Collectorﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ ،ﻓﺮض ﻣﻴﻜﻨﺪ ﻛﻪ ﺗﻤﺎم اﺷﻴﺎي ﻣﻮﺟﻮد در heapزﺑﺎﻟﻪ ﻫﺴﺘﻨﺪ. ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﻓﺮض ﻣﻴﻜﻨﺪ ﻛﻪ ﻫﻴﭻ ﻛﺪام از rootﻫﺎي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻫﻴﭻ ﺷﻴﺊ در heapاﺷﺎره ﻧﻤﻴﻜﻨﺪ .ﺳﭙﺲ Garbage Collectorﺷﺮوع ﺑﻪ ﺣﺮﻛﺖ در ﻣﻴﺎن rootﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻣﻴﻜﻨﺪ و ﻳﻚ ﮔﺮاف از ﺗﻤﺎم rootﻫﺎي ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﺗﺸﻜﻴﻞ ﻣﻴﺪﻫﺪ .ﺑﺮاي ﻣﺜﺎل Garbage Collectorﻣﻤﻜﻦ اﺳﺖ ﻳﻚ ﻣﺘﻐﻴﺮ ﻋﻤﻮﻣﻲ را ﻛﻪ ﺑﻪ ﻳﻚ ﺷﻴﺊ در heapاﺷﺎره ﻣﻴﻜﻨﺪ ﻣﻮﻗﻌﻴﺖ ﻳﺎﺑﻲ ﻛﻨﺪ .ﺷﻜﻞ زﻳﺮ ﻳﻚ heapرا ﺑﺎ ﭼﻨﺪﻳﻦ ﺷﻴﺊ ﺗﺨﺼﻴﺺ داده ﺷﺪه ﻧﺸﺎن ﻣﻴﺪﻫﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﺸﺨﺺ اﺳﺖ rootﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻓﻘﻂ ﺑﻪ اﺷﻴﺎي Aو Cو Dو Fﺑﻪ ﻃﻮر ﻣﺴﺘﻘﻴﻢ اﺷﺎره ﻣﻴﻜﻨﻨﺪ .ﺑﻨﺎﺑﺮاﻳﻦ ﺗﻤﺎم اﻳﻦ اﺷﻴﺎ از اﻋﻀﺎي ﮔﺮاف ﻣﺤﺴﻮب ﻣﻴﺸﻮﻧﺪ .زﻣﺎن اﺿﺎﻓﻪ ﻛﺮدن ﺷﻴﺊ Garbage Collector،Dﻣﺘﻮﺟﻪ ﻣﻴﺸﻮد ﻛﻪ اﻳﻦ ﺷﻴﺊ ﺑﻪ ﺷﻴﺊ Hاﺷﺎره ﻣﻴﻜﻨﺪ، ﺑﻨﺎﺑﺮاﻳﻦ ﺷﻴﺊ Hﻧﻴﺰ ﺑﻪ ﮔﺮاف ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻴﺸﻮد و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ Garbage Collectorﺗﻤﺎم اﺷﻴﺎي ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ در heapرا ﻣﺸﺨﺺ ﻣﻴﻜﻨﺪ.
٩٣٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
زﻣﺎﻧﻲ ﻛﻪ اﻳﻦ ﺑﺨﺶ از ﮔﺮاف ﻛﺎﻣﻞ ﺷﺪ root ،Garbage Collectorﻫﺎي ﺑﻌﺪي را ﭼﻚ ﻣﻴﻜﻨﺪ و ﻣﺠﺪدا اﺷﻴﺎ را ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ .در ﻃﻮل اﻳﻨﻜﻪ Garbage Collectorاز ﻳﻚ ﺷﻴﺊ ﺑﻪ ﻳﻚ ﺷﻴﺊ دﻳﮕﺮ ﻣﻨﺘﻘﻞ ﻣﻴﺸﻮد ،اﮔﺮ ﺳﻌﻲ ﻛﻨﺪ ﻛﻪ ﻳﻚ ﺷﻴﺊ ﺗﻜﺮاري را ﺑﻪ ﮔﺮاف اﺿﺎﻓﻪ ﻛﻨﺪ Garbage Collector،ﺣﺮﻛﺖ در آن ﻣﺴﻴﺮ را ﻣﺘﻮﻗﻒ ﻣﻴﻜﻨﺪ .اﻳﻦ ﻧﻮع رﻓﺘﺎر دو ﻫﺪف را دﻧﺒﺎل ﻣﻴﻜﻨﺪ :اول اﻳﻨﻜﻪ ﭼﻮن Garbage Collectorاز ﻫﻴﭻ ﺷﻴﺊ دو ﺑﺎر ﻋﺒﻮر ﻧﻤﻴﻜﻨﺪ راﻧﺪﻣﺎن ﺑﺮﻧﺎﻣﻪ را ﺑﻪ ﺷﻜﻞ ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ اﻓﺰاﻳﺶ ﻣﻴﺪﻫﺪ .دوم اﻳﻨﻜﻪ ﻫﺮ ﻗﺪر ﻫﻢ در ﺑﺮﻧﺎﻣﻪ ﻟﻴﺴﺖ ﻫﺎي ﭘﻴﻮﻧﺪي داﻳﺮه اي از اﺷﻴﺎ ﻣﻮﺟﻮد ﺑﺎﺷﻨﺪ ، Garbage Collectorدر ﺣﻠﻘﻪ ﻫﺎي ﺑﻴﻨﻬﺎﻳﺖ ﻧﻤﻲ ﻣﺎﻧﺪ. زﻣﺎﻧﻲ ﻛﻪ ﺗﻤﺎم rootﻫﺎ ﺑﺮرﺳﻲ ﺷﺪﻧﺪ ،ﮔﺮاف Garbage Collectorﻣﺤﺘﻮي ﺗﻤﺎم اﺷﻴﺎﻳﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﻧﺤﻮي از ﻃﺮﻳﻖ rootﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻣﻲ ﺑﺎﺷﻨﺪ و ﻫﺮ ﺷﻴﺊ ﻛﻪ در ﮔﺮاف ﻧﺒﺎﺷﺪ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻧﻴﺴﺖ و ﻳﻚ زﺑﺎﻟﻪ ﻣﺤﺴﻮب ﻣﻴﺸﻮد .ﺑﻌﺪ از اﻳﻦ Garbage Collectorﺑﻪ ﺻﻮرت ﺧﻄﻲ heapرا ﻃﻲ ﻣﻴﻜﻨﺪ و دﻧﺒﺎل ﺑﻼك ﻫﺎي ﭘﻴﻮﺳﺘﻪ از زﺑﺎﻟﻪ ﻫﺎي ﻣﺸﺨﺺ ﺷﺪه ﺗﻮﺳﻂ ﮔﺮاف ﻣﻴﮕﺮدد )ﻛﻪ ﻫﻢ اﻛﻨﻮن ﻓﻀﺎي ﺧﺎﻟﻲ ﻣﺤﺴﻮب ﻣﻴﺸﻮﻧﺪ( .اﮔﺮ ﺑﻼك ﻫﺎي ﻛﻮﭼﻜﻲ ﭘﻴﺪا ﺷﻮﻧﺪ Garbage Collectorاﻳﻦ ﺑﻼك ﻫﺎ را ﺑﻪ ﻫﻤﺎن ﺣﺎل ﻗﺒﻠﻲ رﻫﺎ ﻣﻴﻜﻨﺪ. Garbage اﮔﺮ ﻳﻚ ﺑﻼك ﭘﻴﻮﺳﺘﻪ وﺳﻴﻊ ﺗﻮﺳﻂ Garbage Collectorﻳﺎﻓﺖ ﺷﺪ ،در اﻳﻦ ﺣﺎل، Collectorاﺷﻴﺎي ﻏﻴﺮ زﺑﺎﻟﻪ را ﺑﻪ ﺳﻤﺖ ﭘﺎﻳﻴﻦ ﺣﺎﻓﻈﻪ heapﺷﻴﻔﺖ ﻣﻴﺪﻫﺪ )و اﻳﻦ ﻛﺎر ﺑﺎ ﺗﺎﺑﻊ اﺳﺘﺎﻧﺪارد memcopy اﻧﺠﺎم ﻣﻴﺸﻮد( و ﺑﻪ اﻳﻦ ﻃﺮﻳﻖ heapرا ﻓﺸﺮده ﻣﻴﻜﻨﺪ .ﻃﺒﻴﻌﺘﺎً ﺣﺮﻛﺖ دادن اﺷﻴﺎ ﺑﻪ ﺳﻤﺖ ﭘﺎﻳﻴﻦ در heapﺑﺎﻋﺚ ﻧﺎ ﻣﻌﺘﺒﺮ ﺷﺪن ﺗﻤﺎم اﺷﺎره ﮔﺮﻫﺎي ﻣﻮﺟﻮد ﺑﺮاي آن اﺷﻴﺎ ﻣﻴﺸﻮد .ﺑﻪ ﻋﻼوه ،اﮔﺮ ﺷﻴﺊ ﻣﺤﺘﻮي اﺷﺎره ﮔﺮي ﺑﻪ ﺷﻴﺊ دﻳﮕﺮي ﺑﻮد Garbage Collectorﻣﺴﺌﻮل ﺗﺼﺤﻴﺢ اﻳﻦ اﺷﺎره ﮔﺮﻫﺎ ﻣﻴﺸﻮد .ﺑﻌﺪ از اﻳﻦ ﻛﻪ اﻳﻦ ﻋﻤﻞ ﻓﺸﺮده ﺳﺎزي روي heapاﻧﺠﺎم ﺷﺪ NextObjPtrﺑﻪ آﺧﺮﻳﻦ ﺷﻴﺊ ﻏﻴﺮ زﺑﺎﻟﻪ اﺷﺎره ﻣﻴﻜﻨﺪ .ﺷﻜﻞ زﻳﺮ ﻳﻚ managed heapرا ﺑﻌﺪ از اﺗﻤﺎم ﻛﺎر Garbage Collectorﻧﺸﺎن ﻣﻴﺪﻫﺪ.
٩٤٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
اﻣﺎ ﺑﻪ ﻳﺎد. ﻳﻚ اﻓﺰاﻳﺶ ﺑﺎزدﻫﻲ ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ را اﻳﺠﺎد ﻣﻴﻜﻨﺪGarbage Collector،ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ ﻣﻲ ﺑﻴﻨﻴﺪ managed ﺷﺮوع ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ ﻛﻪ ﻧﺴﻞ ﺻﻔﺮ ﻛﺎﻣﻞ ﺷﻮد و ﺗﺎ آن زﻣﺎنGarbage Collector داﺷﺘﻪ ﺑﺎﺷﻴﺪ زﻣﺎﻧﻲ ﻣﺮﺑﻮطGarbage Collector در ﻧﻬﺎﻳﺖ. اﺳﺖC زﻣﺎن اﺟﺮايheap ﺑﻪ ﺻﻮرت ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ ﺳﺮﻳﻌﺘﺮ ازheap را ﻣﻘﺪار زﻳﺎدي اﻓﺰاﻳﺶ ﻣﻲGarbage Collector روش ﺑﻬﻴﻨﻪ ﺳﺎزي را اراﺋﻪ ﻣﻲ دﻫﺪ ﻛﻪ راﻧﺪﻣﺎن ﻛﺎريCLR ﺑﻪ .دﻫﺪ :ﻛﺪ زﻳﺮ ﻧﺸﺎن ﻣﻴﺪﻫﺪ ﻛﻪ ﭼﮕﻮﻧﻪ ﺑﻪ اﺷﻴﺎ ﺣﺎﻓﻈﻪ ﺗﺨﺼﻴﺺ داده ﻣﻴﺸﻮد و آﻧﻬﺎ ﻣﺪﻳﺮﻳﺖ ﻣﻴﺸﻮﻧﺪ Class App { static void Main() { // ArrayList object created in heap, a is now a root ArrayList a = new ArrayList(); // Create 10000 objects in the heap for(Int32 x=0;x<10000;x++ { a.Add(new Object()); // Object created in heap } //Right now, a is a root (on the thread's stack). So a is // reachable and the 10000 objects it refers to // are reachable. Console.WriteLine(a.Length); //After a.Length returns, a isn't referred to in the code //andis no longer a root. If another thread were to start //a garbage collection before the result of a.Length were //passed to WriteLine, the 10001 objects would have their // memory reclaimed. Console.WriteLine("End Of Method"); } }
ﻣﻤﻜﻦ اﺳﺖ ﺗﻌﺠﺐ ﻛﻨﻴﺪ، ﻳﻚ ﺗﻜﻨﻮﻟﻮژي ﺑﺎ ارزش ﻣﺤﺴﻮب ﻣﻴﺸﻮدGarbage Collector اﮔﺮ ﻓﻜﺮ ﻣﻴﻜﻨﻴﺪ ﻛﻪ:ﻧﻜﺘﻪ اﺣﺘﻴﺎج دارد ﻛﻪGarbage Collector دﻟﻴﻞ اﻳﻦ ﻣﻮرد اﻳﻦ اﺳﺖ ﻛﻪ. ﻗﺮار ﻧﻤﻲ ﮔﻴﺮدANSI C++ ﻛﻪ ﭼﺮا در
٩٤١
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
rootﻫﺎي ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ را ﺗﻌﻴﻴﻦ ﻫﻮﻳﺖ ﻛﻨﺪ و ﻧﻴﺰ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﺪ ﺗﻤﺎم اﺷﺎره ﮔﺮﻫﺎي اﺷﻴﺎ را ﭘﻴﺪا ﻛﻨﺪ .ﻣﺸﻜﻞ ﺑﺎ C++ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺗﻐﻴﻴﺮ ﻧﻮع ﻳﻚ اﺷﺎره ﮔﺮ را از ﻳﻚ ﻧﻮع ﺑﻪ ﻳﻚ ﻧﻮع دﻳﮕﺮ ﻣﺠﺎز ﻣﻴﺪاﻧﺪ و ﻫﻴﭻ راﻫﻲ ﺑﺮاي ﻓﻬﻤﻴﺪن اﻳﻦ ﻛﻪ اﻳﻦ اﺷﺎره ﮔﺮ ﺑﻪ ﭼﻪ ﭼﻴﺰ اﺷﺎره ﻣﻴﻜﻨﺪ وﺟﻮد ﻧﺪارد .در managed heap ،CLRﻫﻤﻴﺸﻪ ﻣﻴﺪاﻧﺪ ﻛﻪ ﻧﻮع واﻗﻌﻲ ﻳﻚ ﺷﻴﺊ ﭼﻴﺴﺖ و از اﻃﻼﻋﺎت metadataﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن اﻳﻨﻜﻪ ﻛﺪام ﻋﻀﻮﻫﺎ از ﻳﻚ ﺷﻲ ﺑﻪ اﺷﻴﺎي دﻳﮕﺮ اﺷﺎره ﻣﻲ ﻛﻨﻨﺪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ.
ارﺟﺎع ﻫﺎي ﺿﻌﻴﻒ: زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ rootﺑﻪ ﻳﻚ ﺷﻴﺊ اﺷﺎره ﻣﻴﻜﻨﺪ ﺷﻴﺊ ﻧﻤﻴﺘﻮاﻧﺪ ﺗﻮﺳﻂ Garbage Collectorﺟﻤﻊ آوري ﺷﻮد ﭼﻮن ﻣﻤﻜﻦ اﺳﺖ ﺑﺮﻧﺎﻣﻪ ﺑﻪ آن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ rootﺑﻪ ﻳﻚ ﺷﻴﺊ اﺷﺎره ﻣﻴﻜﻨﺪ ،اﺻﻄﻼﺣﺎ ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﻪ آن ﺷﻴﺊ ﻣﻮﺟﻮد اﺳﺖ .ﺑﺎ اﻳﻦ وﺟﻮد Garbage Collectorﻫﻤﭽﻨﻴﻦ از ارﺟﺎﻋﺎت ﺿﻌﻴﻒ ﻫﻢ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻴﻜﻨﺪ. ارﺟﺎﻋﺎت ﺿﻌﻴﻒ ﺑﻪ Garbage Collectorاﺟﺎزه ﻣﻲ دﻫﻨﺪ ﻛﻪ ﺷﻴﺊ را ﺟﻤﻊ آوري ﻛﻨﺪ و ﻫﻤﭽﻨﻴﻦ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺟﺎزه دﻫﺪ ﻛﻪ ﺑﻪ آن ﺷﻴﺊ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﺪ. اﮔﺮ ﻓﻘﻂ ارﺟﺎﻋﺎت ﺿﻌﻴﻒ ﺑﻪ ﻳﻚ ﺷﻴﺊ ﻣﻮﺟﻮد ﺑﺎﺷﻨﺪ و Garbage Collectorآﻏﺎز ﺑﻪ ﻛﺎر ﻛﻨﺪ آن ﺷﻴﺊ از heap ﭘﺎك ﻣﻴﺸﻮد و ﺳﭙﺲ زﻣﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺳﻌﻲ ﻛﻨﺪ ﺑﻪ آن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﻨﺪ اﻳﻦ ﻋﻤﻞ ﺑﺎ ﺷﻜﺴﺖ ﻣﻮاﺟﻪ ﻣﻴﺸﻮد .ﺑﻪ ﻋﺒﺎرت دﻳﮕﺮ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻳﻚ ارﺟﺎع ﺿﻌﻴﻒ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺪ ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﻪ آن داﺷﺘﻪ ﺑﺎﺷﺪ .اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻗﺒﻞ از اﻳﻨﻜﻪ Garbage Collectorآن را ﺟﻤﻊ آوري ﻛﻨﺪ ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﻪ آن ﺷﻴﺊ ﺗﺸﻜﻴﻞ دﻫﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ Garbage Collector ﻧﻤﻲ ﺗﻮاﻧﺪ اﻳﻦ ﺷﻴﺊ را ﺣﺬف ﻛﻨﺪ ﭼﻮن ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﻪ آن ﺷﻴﺊ ﻣﻮﺟﻮد اﺳﺖ. اﺟﺎزه دﻫﻴﺪ ﻣﻌﻨﻲ واﻗﻌﻲ ﻣﻮﺿﻮع را در ﻛﺪ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ: )(Void SomeMethod { // Create a string reference to a new Object. ;)(Object o = new Object // Create a strong reference to a short WeakReference object. // The WeakReference object tracks the Object's lifetime. ;)WeakReference wr = new WeakReference(o o = null; // Remove the strong reference to the object. ;O = wr.Target )if(o==null { // A garbage collection occurred and Object's memory was // reclaimed. } else { //A garbage collection didn't occur and I can successfully // access the Object using o. } }
ﻣﻤﻜﻦ اﺳﺖ اﻳﻦ ﺳﻮال اﻳﺠﺎد ﺷﻮد ﻛﻪ اﺳﺘﻔﺎده از ارﺟﺎﻋﺎت ﺿﻌﻴﻒ ﭼﻪ ﻣﺰﻳﺘﻲ را اﻳﺠﺎد ﻣﻴﻜﻨﺪ؟ ﺧﻮب ﺑﻌﻀﻲ از ﺳﺎﺧﺘﺎر داده ﻫﺎ ﺑﻪ ﺳﺎدﮔﻲ اﻳﺠﺎد ﻣﻴﺸﻮﻧﺪ اﻣﺎ ﻣﻘﺪار زﻳﺎدي ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻣﻲ ﻛﻨﻨﺪ .ﺑﺮاي ﻣﺜﺎل ﻣﻤﻜﻦ اﺳﺖ ﺷﻤﺎ ﺑﺮﻧﺎﻣﻪ اي داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺑﻪ ﻟﻴﺴﺘﻲ از ﺗﻤﺎم
٩٤٢
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
داﻳﺮﻛﺘﻮري ﻫﺎ و ﻓﺎﻳﻠﻬﺎي ﻣﻮﺟﻮد در ﻛﺎﻣﭙﻴﻮﺗﺮ ﻧﻴﺎز داﺷﺘﻪ ﺑﺎﺷﺪ .ﺷﻤﺎ ﺑﻪ ﺳﺎدﮔﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ درﺧﺖ از ﺗﻤﺎم اﻳﻦ اﻃﻼﻋﺎت ﺗﺸﻜﻴﻞ دﻫﻴﺪ و ﺑﻪ ﻣﺤﺾ اﻳﻨﻜﻪ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺟﺮا ﺷﺪ ﺑﻪ ﺟﺎي ﻣﺮاﺟﻌﻪ ﺑﻪ ﻫﺎرد ﺑﻪ اﻳﻦ درﺧﺖ در ﺣﺎﻓﻈﻪ ﻣﺮاﺟﻌﻪ ﻛﻨﺪ اﻳﻦ اﻣﺮ ﺳﺮﻋﺖ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ را اﻓﺰاﻳﺶ ﻣﻴﺪﻫﺪ. اﻣﺎ ﻣﺸﻜﻞ اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ ﺳﺎﺧﺘﺎر داده ﺣﺠﻢ ﺑﺴﻴﺎر زﻳﺎدي را از ﺣﺎﻓﻈﻪ اﺷﻐﺎل ﻣﻲ ﻛﻨﺪ .اﮔﺮ ﻛﺎرﺑﺮ ﺑﺨﺶ دﻳﮕﺮي از ﺑﺮﻧﺎﻣﻪ را آﻏﺎز ﻛﻨﺪ، اﻳﻦ درﺧﺖ ﻣﻤﻜﻦ اﺳﺖ دﻳﮕﺮ ﻣﻮرد ﻧﻴﺎز ﻧﺒﺎﺷﺪ اﻣﺎ ﻣﻘﺪار زﻳﺎدي از ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻛﺮده اﺳﺖ .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ارﺟﺎع اﺻﻠﻲ ﺑﻪ اﻳﻦ درﺧﺖ در ﺣﺎﻓﻈﻪ را رﻫﺎ ﻛﻨﻴﺪ .اﻣﺎ اﮔﺮ ﻛﺎرﺑﺮ ﺑﻪ ﻗﺴﻤﺖ اول ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺑﺮﮔﺸﺖ ،ﺷﻤﺎ ﻣﺠﺪدا ﻧﻴﺎز ﺑﻪ ﺑﺎزﺳﺎزي اﻳﻦ درﺧﺖ ﺧﻮاﻫﻴﺪ داﺷﺖ .ارﺟﺎﻋﺎت ﺿﻌﻴﻒ اﻳﻦ اﻣﻜﺎن ار ﺑﻪ ﺷﻤﺎ ﻣﻴﺪﻫﺪ ﻛﻪ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ اﻳﻦ ﻣﻮﻗﻌﻴﺖ را ﻛﻨﺘﺮل ﻛﻨﻴﺪ. زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮ از ﻗﺴﻤﺖ اول ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﺧﺎرج ﺷﻮد ،ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ارﺟﺎع ﺿﻌﻴﻒ ﺑﻪ rootﻣﺮﺑﻮط ﺑﻪ اﻳﻦ درﺧﺖ در ﺣﺎﻓﻈﻪ اﻳﺠﺎد ﻛﻨﻴﺪ و ﺗﻤﺎم ارﺟﺎﻋﺎت ﻗﻮي ﺑﻪ آن را از ﺑﻴﻦ ﺑﺒﺮﻳﺪ .اﮔﺮ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺑﺨﺸﻬﺎي دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻛﻢ ﺷﺪGarbage ، Collectorﺣﺎﻓﻈﻪ ﮔﺮﻓﺘﻪ ﺷﺪه ﺗﻮﺳﻂ درﺧﺖ ﻣﺬﻛﻮر را ﻣﻲ ﮔﻴﺮد و زﻣﺎﻧﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻣﺠﺪدا ﺑﻪ ﻗﺴﻤﺖ اول ﺑﺮﻧﺎﻣﻪ ﺑﺮﮔﺸﺖ و ﺑﺮﻧﺎﻣﻪ ﺳﻌﻲ ﻛﺮد از ارﺟﺎع ﺿﻌﻴﻒ ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﺪﺳﺖ آورد ،اﻳﻦ ﺗﻼش ﺷﻜﺴﺖ ﻣﻲ ﺧﻮرد و ﺑﺮﻧﺎﻣﻪ ﻣﺠﺪدا درﺧﺖ را ﺗﺸﻜﻴﻞ ﻣﻴﺪﻫﺪ. در ﻏﻴﺮ اﻳﻦ ﺻﻮرت ﺑﺮﻧﺎﻣﻪ از ﻫﻤﺎن درﺧﺖ ﻗﺒﻠﻲ ﻣﻮﺟﻮد در ﺣﺎﻓﻈﻪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ. ﻧﻮع داده System.WeakReferenceدو Constructorﻋﻤﻮﻣﻲ را اراﺋﻪ ﻣﻴﺪﻫﺪ: ;)public WeakReference(Object target ;)public WeakReference(Object target, Boolean trackResurrection
ﭘﺎراﻣﺘﺮ targetﺷﻴﺊ را ﻛﻪ WeakReferenceﺑﺎﻳﺪ ﻧﮕﻪ داري ﻛﻨﺪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ .ﭘﺎراﻣﺘﺮ trackResurrectionﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ WeakReferenceﺑﺎﻳﺪ ﺷﻴﺊ را ﺣﺘﻲ ﺑﻌﺪ از finalizeﺷﺪن ﻫﻢ ﻧﮕﻪ داري ﻛﻨﺪ ﻳﺎ ﺧﻴﺮ ﻛﻪ ﻣﻌﻤﻮﻻ ﻣﻘﺪار اﻳﻦ ﭘﺎراﻣﺘﺮ falseاﺳﺖ. ﺑﺮاي راﺣﺘﻲ ﻳﻚ ارﺟﺎع ﺿﻌﻴﻒ را ﻛﻪ ﺑﻌﺪ از اﺣﻴﺎي ﺷﻴﺊ ﻫﻢ آن را ﻧﮕﻪ داري ﻣﻴﻜﻨﺪ ارﺟﺎع ﺿﻌﻴﻒ ﺑﻠﻨﺪ و ارﺟﺎع ﺿﻌﻴﻔﻲ را ﻛﻪ ﺑﻌﺪ از اﺣﻴﺎي ﺷﻴﺊ آن را ﻧﮕﻪ داري ﻧﻤﻲ ﻛﻨﺪ را ارﺟﺎع ﺿﻌﻴﻒ ﻛﻮﺗﺎه ﻣﻲ ﻧﺎﻣﻴﻢ .اﮔﺮ ﻧﻮع داده ﺷﻴﺊ ﺗﺎﺑﻊ finalizeرا ارﺋﻪ ﻧﺪﻫﺪ ارﺟﺎع ﺿﻌﻴﻒ ﻛﻮﺗﺎه و ﺑﻠﻨﺪ ﻣﺎﻧﻨﺪ ﻫﻢ ﻋﻤﻞ ﻣﻲ ﻛﻨﻨﺪ .اﻣﺎ ﺑﻪ ﺷﺪت ﺗﻮﺻﻴﻪ ﻣﻲ ﺷﻮد ﻛﻪ از ﺑﻪ ﻛﺎر ﺑﺮدن ارﺟﺎﻋﺎت ﺿﻌﻴﻒ ﺧﻮدداري ﻛﻨﻴﺪ ،زﻳﺮا اﻳﻦ ﻧﻮع ارﺟﺎﻋﺎت ﺑﻪ ﺷﻤﺎ اﺟﺎزه ﻣﻴﺪﻫﻨﺪ ﻛﻪ ﻳﻚ ﺷﻴﺊ را ﺣﺘﻲ ﺑﻌﺪ از finalizeﺷﺪن ﻫﻢ اﺣﻴﺎ ﻛﻨﻴﺪ ﻛﻪ ﻣﻮﺟﺐ ﺑﻪ وﺟﻮد آﻣﺪن ﻳﻚ ﻣﻮﻗﻌﻴﺖ ﻏﻴﺮ ﻗﺎﺑﻞ ﭘﻴﺶ ﺑﻴﻨﻲ ﺑﺮاي ﺷﻴﺊ ﻣﻲ ﺷﻮد. ﻳﻚ ﺑﺎر ﻛﻪ ﺷﻤﺎ ﻳﻚ ارﺟﺎع ﺿﻌﻴﻒ را ﺑﺮاي ﻳﻚ ﺷﻴﺊ اﻳﺠﺎد ﻛﺮدﻳﺪ ﻋﻤﻮﻣﺎ ﺑﺎﻳﺪ ﺗﻤﺎم ارﺟﺎﻋﺎت ﻗﻮي ﺑﻪ آن را ﺑﺮاﺑﺮ nullﻗﺮار دﻫﻴﺪ ،در ﻏﻴﺮ اﻳﻦ ﺻﻮرت Garbage Collectorﺗﻮاﻧﺎﻳﻲ ﺟﻤﻊ آوري اﻳﻦ ﺷﻴﺊ را در ﻣﻮاﻗﻊ ﺿﺮوري ﻧﺨﻮاﻫﺪ داﺷﺖ. ﺑﺮاي اﺳﺘﻔﺎده ﻣﺠﺪد ﺷﻴﺊ ﺷﻤﺎ ﺑﺎﻳﺪ ارﺟﺎع ﺿﻌﻴﻒ را ﺑﻪ ﻳﻚ ارﺟﺎع ﻗﻮي ﺗﺒﺪﻳﻞ ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ از WeakReference.Targetاﺳﺘﻔﺎده ﻛﻨﻴﺪ و اﻳﻦ ﺷﻴﺊ را ﺑﻪ ﻳﻜﻲ از rootﻫﺎي ﺑﺮﻧﺎﻣﻪ اﺧﺘﺼﺎص دﻫﻴﺪ .اﮔﺮ اﻳﻦ ﻋﺒﺎرت ﻣﻘﺪار nullرا ﺑﺮﮔﺮداﻧﺪ ،ﻳﻌﻨﻲ ﺷﻴﺊ ﻣﺬﻛﻮر ﺗﻮﺳﻂ Garbage Collectorﺟﻤﻊ آوري ﺷﺪه اﺳﺖ ،در ﻏﻴﺮ اﻳﻦ ﺻﻮرت rootﺣﺎوي آدرس ﻳﻚ ارﺟﺎع ﻗﻮي ﺑﻪ اﻳﻦ ﻣﻘﺪار ﻣﺤﺴﻮب ﻣﻲ ﺷﻮد و ﺑﺮﻧﺎﻣﻪ از اﻳﻦ ﻃﺮﻳﻖ ﻣﻲ ﺗﻮاﻧﺪ ﺷﻴﺊ ﻣﺬﻛﻮر را ﻛﻨﺘﺮل ﻛﻨﺪ.
٩٤٣
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﺴﻠﻬﺎ:1 ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﭘﻴﺸﺘﺮ ذﻛﺮ ﺷﺪ ﻧﺴﻠﻬﺎ ﻣﻜﺎﻧﻴﺴﻤﻲ درون CLR Garbage Collectorﺑﻪ ﺷﻤﺎر ﻣﻴﺮود ﻛﻪ ﻫﺪف اﺻﻠﻲ آن ﺑﻬﺒﻮد ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ اﺳـﺖ .ﻳـﻚ Garbage Collectorﻛـﻪ ﺑـﺎ ﻣﻜﺎﻧﻴـﺴﻢ ﻧـﺴﻠﻬﺎ ﻛـﺎر ﻣﻴﻜﻨـﺪ )ﻫﻤﭽﻨـﻴﻦ ﺑـﻪ ﻋﻨـﻮان Garbage Collectorزودﮔﺬر 2ﻫﻢ ﻧﺎﻣﻴﺪه ﻣﻴﺸﻮد( ﻓﺮﺿﻬﺎي زﻳﺮ را ﺑﺮاي ﻛﺎر ﺧﻮد در ﻧﻈﺮ ﻣﻴﮕﻴﺮد: (1ﻫﺮ ﭼﻪ ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪﺗﺮ اﻳﺠﺎد ﺷﺪه ﺑﺎﺷﺪ ﻃﻮل ﻋﻤﺮ ﻛﻮﺗﺎﻫﺘﺮي ﻫﻢ ﺧﻮاﻫﺪ داﺷﺖ. (2ﻫﺮ ﭼﻪ ﻳﻚ ﺷﻴﺊ ﻗﺪﻳﻤﻴﺘﺮ ﺑﺎﺷﺪ ﻃﻮل ﻋﻤﺮ ﺑﻠﻨﺪﺗﺮي ﻫﻢ ﺧﻮاﻫﺪ داﺷﺖ. (3ﺟﻤﻊ آوري ﻗﺴﻤﺘﻲ از heapﺳﺮﻳﻌﺘﺮ از ﺟﻤﻊ آوري ﻛﻞ آن اﺳﺖ. ﻣﻄﺎﻟﻌﺎت زﻳﺎدي ﻣﻌﺘﺒﺮ ﺑﻮدن اﻳﻦ ﻓﺮﺿﻴﺎت را ﺑﺮاي ﻣﺠﻤﻮﻋﻪ ﺑﺰرﮔﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﻮﺟﻮد ﺗﺎﻳﻴﺪ ﻛﺮده اﻧﺪ و اﻳﻦ ﻓﺮﺿﻴﺎت ﺑـﺮ ﻃـﺮز ﭘﻴـﺎده ﺳﺎزي Garbage Collectorﺗﺎﺛﻴﺮ داﺷﺘﻪ اﻧﺪ .در اﻳﻦ ﻗﺴﻤﺖ ﻃﺮز ﻛﺎر اﻳﻦ ﻣﻜﺎﻧﻴﺴﻢ ﺷﺮح داده ﺷﺪه اﺳﺖ. زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ managed heapﺑﺮاي ﺑﺎر اول اﻳﺠﺎد ﻣﻴﺸﻮد داراي ﻫﻴﭻ ﺷﻴﺊ ﻧﻴﺴﺖ .اﺷﻴﺎﻳﻲ ﻛﻪ ﺑﻪ heapاﺿـﺎﻓﻪ ﺷـﻮﻧﺪ در ﻧﺴﻞ ﺻﻔﺮ ﻗﺮار ﻣﻴﮕﻴﺮﻧﺪ .اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﺻـﻔﺮ اﺷـﻴﺎي ﺗـﺎزه اﻳﺠـﺎد ﺷـﺪه اي ﻫـﺴﺘﻨﺪ ﻛـﻪ ﺗـﺎ ﻛﻨـﻮن ﺗﻮﺳـﻂ Garbage Collectorﺑﺮرﺳﻲ ﻧﺸﺪه اﻧﺪ .ﺗﺼﻮﻳﺮ زﻳﺮ ﻳﻚ ﺑﺮﻧﺎﻣﻪ را ﻛﻪ ﺗﺎزه آﻏﺎز ﺑﻪ ﻛﺎر ﻛـﺮده اﺳـﺖ ﻧـﺸﺎن ﻣﻴﺪﻫـﺪ ﻛـﻪ داراي ﭘـﻨﺞ ﺷـﻴﺊ اﺳﺖ)از Aﺗﺎ .( Eﺑﻌﺪ از ﻣﺪﺗﻲ اﺷﻴﺎي Cو Eﻏﻴﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻣﻴﺸﻮﻧﺪ.
زﻣﺎﻧﻲ ﻛﻪ CLRآﻏﺎز ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ ﻳﻚ ﻣﻘﺪار ﻧﻬﺎﻳﻲ را ﺑﺮاي ﻧﺴﻞ ﺻﻔﺮ در ﻧﻈﺮ ﻣﻴﮕﻴﺮد ﻛـﻪ ﺑـﻪ ﻃـﻮر ﭘـﻴﺶ ﻓـﺮض 256ﻛﻴﻠـﻮ ﺑﺎﻳـﺖ اﺳﺖ)اﻟﺒﺘﻪ اﻳﻦ ﻣﻘﺪار ﻣﻮرد ﺗﻐﻴﻴﺮ ﻗﺮار ﻣﻴﮕﻴﺮد( .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ ﺷﻴﺊ ﺑﺨﻮاﻫﺪ اﻳﺠﺎد ﺷﻮد و در ﻧﺴﻞ ﺻﻔﺮ ﻓﻀﺎي ﻛـﺎﻓﻲ وﺟـﻮد ﻧﺪاﺷـﺘﻪ ﺑﺎﺷـﺪ Garbage Collectorآﻏﺰ ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ .اﺟﺎزه دﻫﻴﺪ ﺗﺼﻮر ﻛﻨﻴﻢ ﻛﻪ اﺷﻴﺎي Aﺗﺎ 256 Eﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻓﻀﺎ اﺷﻐﺎل ﻛـﺮده اﻧـﺪ زﻣـﺎﻧﻲ ﻛـﻪ ﺷـﻴﺊ Fﺑﺨﻮاﻫـﺪ ﺗـﺸﻜﻴﻞ ﺷـﻮد Garbage Collectorﺑﺎﻳـﺪ آﻏـﺎز ﺑـﻪ ﻛـﺎر ﻛﻨـﺪGarbage . Collectorﺗﺸﺨﻴﺺ ﻣﻴﺪﻫﺪ ﻛﻪ اﺷﻴﺎي Cو Eزﺑﺎﻟﻪ ﻣﺤﺴﻮب ﻣﻴﺸﻮﻧﺪ و ﺑﻨﺎﺑﺮاﻳﻦ ﺷﻴﺊ Dﺑﺎﻳﺪ ﻓﺸﺮده ﺷﻮد ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ ﺷﻴﺊ ﺑﻪ ﻛﻨﺎر ﺷﻴﺊ Bﻣﻴﺮود .اﺷﻴﺎﻳﻲ ﻛﻪ ﺑﻌﺪ از اﻳﻦ ﻣﺮﺣﻠﻪ ﺑﺎﻗﻲ ﻣﻴﻤﺎﻧﻨﺪ )اﺷﻴﺎي Aو Bو (Dوارد ﻧﺴﻞ ﻳﻚ ﻣﻴﺸﻮﻧﺪ .اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧـﺴﻞ ﻳﻚ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻳﻚ ﺑﺎر ﺗﻮﺳﻂ Garbage Collectorﺑﺮرﺳﻲ ﺷﺪه اﻧﺪ Heap .ﺑﺮﻧﺎﻣـﻪ ﻣﻔـﺮوض ﺑﻌـﺪ از اوﻟﻴﻦ ﻣﺮﺣﻠﻪ ﺑﻪ ﺻﻮرت ﺗﺼﻮﻳﺮ زﻳﺮ در ﻣﻲ آﻳﻨﺪ.
Generations Ephemeral Garbage Collector
1 2
٩٤٤
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻌﺪ از ﻳﻚ ﺑﺎر اﺟﺮاي Garbage Collectorﻫﻴﭻ ﺷﻴﺊ در ﻧﺴﻞ ﺻﻔﺮ ﺑﺎﻗﻲ ﻧﻤﻲ ﻣﺎﻧﺪ .ﻣﺜﻞ ﻫﻤﻴﺸﻪ اﺷﻴﺎﻳﻲ ﻛﻪ ﺑﻌﺪ از اﻳﻦ اﻳﺠﺎد ﻣﻲ ﺷﻮﻧﺪ ﺑﻪ ﻧﺴﻞ ﺻﻔﺮ اﺿﺎﻓﻪ ﻣﻴﺸﻮﻧﺪ .ﺷﻜﻞ زﻳﺮ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ و ﺑﻪ وﺟﻮد آﻣﺪن اﺷﻴﺎي Fﺗﺎ Kرا ﻧـﺸﺎن ﻣﻴﺪﻫـﺪ .ﺑـﻪ ﻋـﻼوه در ﻃﻮل اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اﺷﻴﺎي Bو Hو Jﻏﻴﺮ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﺷﺪه اﻧﺪ و ﺣﺎﻓﻈﻪ ﮔﺮﻓﺘﻪ ﺷﺪه ﺗﻮﺳﻂ آﻧﻬﺎ ﺑﺎﻳﺪ آزاد ﺷﻮد.
ﺣﺎل ﻓﺮض ﻛﻨﻴﻢ ﺑﺎ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺷﻲ Lدر ﻧﺴﻞ ﺻﻔﺮ ﻣﻘﺪار داده ﻫﺎي ﻣﻮﺟﻮد در اﻳﻦ ﻧﺴﻞ از 256ﻛﻴﻠﻮﺑﺎﻳﺖ ﻓﺮاﺗﺮ رود .ﭼﻮن ﻧﺴﻞ ﺻﻔﺮ ﺑﻪ ﺳﺮ ﺣﺪ ﺧﻮد رﺳﻴﺪه اﺳﺖ Garbage Collectorﺑﺎﻳﺪ آﻏﺎز ﺑﻪ ﻛﺎر ﻛﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻋﻤـﻞ Garbage Collectionآﻏﺎز ﻣﻴﺸﻮد Garbage Collectorﺑﺎﻳﺪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮد ﻛﻪ ﻛﺪام ﻧـﺴﻞ ﺑﺎﻳـﺪ ﻣـﻮرد ﺑﺮرﺳـﻲ ﻗـﺮار ﮔﻴﺮد .ﭘﻴﺸﺘﺮ ذﻛﺮ ﺷﺪ ﻛﻪ زﻣﺎﻧﻲ ﻛﻪ CLRآﻏﺎز ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ ﺑﺮاي ﻧﺴﻞ ﺻﻔﺮ 256ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻓﻀﺎ اﺧﺘﺼﺎص ﻣﻴﺪﻫﺪ .ﻫﻤﭽﻨﻴﻦ CLR ﻳﻚ ﺳﺮ ﺣﺪ ﻧﻴﺰ ﺑﺮاي ﻧﺴﻞ ﻳﻚ در ﻧﻈﺮ ﻣﻴﮕﻴﺮد .ﻓﺮض ﻣﻴﻜﻨﻴﻢ اﻳﻦ ﻣﻘﺪار ﻓﻀﺎ ﺷﺎﻣﻞ 2ﻣﮕﺎ ﺑﺎﻳﺖ ﺑﺎﺷﺪ. زﻣﺎﻧﻲ ﻛﻪ ﻋﻤﻞ Garbage Collectionاﻧﺠﺎم ﻣﻴﺸﻮد Garbage Collector،ﻫﻤﭽﻨﻴﻦ ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ ﻛﻪ ﭼﻪ ﻣﻘﺪار ﻓﻀﺎ ﺗﻮﺳﻂ ﻧﺴﻞ ﻳﻚ اﺷﻐﺎل ﺷﺪه اﺳﺖ .در اﻳﻦ ﺣﺎﻟﺖ ﻧﺴﻞ ﻳﻚ ﻓﻀﺎﻳﻲ ﻛﻤﺘﺮ از 2ﻣﮕﺎ ﺑﺎﻳﺖ را اﺷﻐﺎل ﻛﺮده اﺳﺖ ﺑﻨـﺎﺑﺮاﻳﻦ Garbage Collectorﻓﻘﻂ ﻧﺴﻞ ﺻـﻔﺮ را ﻣـﻮرد ﺑﺮرﺳـﻲ ﻗـﺮار ﻣﻴﺪﻫـﺪ .ﻳـﻚ ﺑـﺎر دﻳﮕـﺮ ﻓﺮﺿـﻴﺎت Garbage Collectorرا ﻛﻪ در اﺑﺘﺪا ذﻛﺮ ﺷﺪ ﻣﺮور ﻛﻨﻴﺪ .اوﻟﻴﻦ ﻓﺮض اﻳﻦ ﺑﻮد ﻛﻪ اﺷﻴﺎي ﺗﺎزه اﻳﺠﺎد ﺷﺪه داراي ﻋﻤﺮ ﻛﻮﺗﺎه ﺗـﺮي ﻫـﺴﺘﻨﺪ. ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ ﮔﻮﻧﻪ ﺑﻪ ﻧﻈﺮ ﻣﻴﺮﺳﺪ ﻛﻪ ﻧﺴﻞ ﺻﻔﺮ داراي ﺑﻴﺸﺘﺮﻳﻦ ﻣﻘﺪار زﺑﺎﻟﻪ ﺑﺎﺷﺪ و ﺟﻤﻊ آوري ﺣﺎﻓﻈﻪ از اﻳﻦ ﻧـﺴﻞ ﻣﻮﺟـﺐ آزاد ﺳـﺎزي ﻣﻘﺪار زﻳﺎدي ﺣﺎﻓﻈﻪ ﻣﻴﺸﻮد .ﺑﻨﺎﺑﺮاﻳﻦ Garbage Collectorﻧﺴﻞ ﻳﻚ را رﻫﺎ ﻣﻴﻜﻨﺪ و ﻓﻘﻂ ﺑﻪ ﺟﻤـﻊ آوري ﻧـﺴﻞ ﺻـﻔﺮ ﻣﻴﭙﺮدازد ﻛﻪ اﻳﻦ ﻋﻤﻞ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ ﻛﺎرﻛﺮد ﭘﺮوﺳﻪ Garbage Collectorﻣﻴﺸﻮد. ﺑﻪ وﺿﻮح ،رﻫﺎ ﺳﺎزي اﺷﻴﺎي ﻧﺴﻞ ﻳﻚ وﺟﺐ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ و ﻛـﺎراﻳﻲ Garbage Collectorﻣﻴـﺸﻮد .ﺑـﺎ وﺟـﻮد اﻳـﻦ ﻛﺎراﻳﻲ Garbage Collectorﺑﻴﺸﺘﺮ اﻓﺰاﻳﺶ ﭘﻴﺪا ﻣﻴﻜﻨﺪ ﭼـﻮن ﺗﻤـﺎم اﺷـﻴﺎي ﻣﻮﺟـﻮد در Managed Heapرا ﺑﺮرﺳـﻲ ﻧﻤﻴﻜﻨـﺪ .اﮔـﺮ ﻳـﻚ rootﻳـﺎ ﻳـﻚ ﺷـﻴﺊ از اﻳـﻦ ﻧـﺴﻞ ﺑـﻪ ﺷـﻴﺊ از ﻧـﺴﻞ ﻗـﺪﻳﻤﻲ ﺗـﺮ اﺷـﺎره ﻛﻨـﺪGarbage ، Collectorﻣﻴﺘﻮاﻧﺪ ارﺟﺎﻋﺎت داﺧﻠﻲ اﺷﻴﺎي ﻗﺪﻳﻤﻲ ﺗﺮ را در ﻧﻈﺮ ﻧﮕﻴﺮد ،و ﺑﺪﻳﻦ وﺳﻴﻠﻪ زﻣﺎن ﻣﻮرد ﻧﻴﺎز را ﺑﺮاي ﺗﺸﻜﻴﻞ ﮔﺮاﻓﻲ از اﺷﻴﺎي ﻗﺎﺑﻞ دﺳﺘﺮس ﻛﺎﻫﺶ ﻣﻴﺪﻫﺪ .اﻟﺒﺘﻪ اﻳﻦ اﻣﺮ ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﺷﻴﺊ ﻗﺪﻳﻤﻲ ﺑﻪ ﻳﻚ ﺷﻴﺊ ﺟﺪﻳﺪ اﺷﺎره ﻛﻨـﺪ .ﺑـﺮاي اﻃﻤﻴﻨـﺎن از اﻳﻦ ﻛﻪ اﻳﻦ ﺷﻴﺊ ﻗﺪﻳﻤﻲ ﻧﻴﺰ ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﻣﻴﮕﻴﺮد Garbage Collectorاز ﻳﻚ ﻣﻜﺎﻧﻴﺴﻢ داﺧﻠـﻲ JITاﺳـﺘﻔﺎده ﻣﻴﻜﻨﺪ ﺑﻪ اﻳﻦ ﻧﺤﻮ ﻛﻪ زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﻓﻴﻠﺪ ارﺟﺎع ﻳﻚ ﺷﻴﺊ ﺗﻐﻴﻴﺮ ﻛﺮد ﻳﻚ ﺑﻴﺖ را ﺗﻨﻈﻴﻢ ﻣﻴﻜﻨـﺪ .اﻳـﻦ ﭘـﺸﺘﻴﺒﺎﻧﻲ ﺗﻮﺳـﻂ JITﺑﺎﻋـﺚ ﻣﻴﺸﻮد ﻛﻪ Garbage Collectorﺑﺘﻮاﻧﺪ ﺗﺸﺨﻴﺺ دﻫﺪ ﻛﺪام از اﺷﻴﺎي ﻗﺪﻳﻤﻲ از زﻣﺎن آﺧﺮﻳﻦ ﻋﻤﻞ ﺟﻤﻊ آوري ﺗﺎ ﻛﻨﻮن ﺗﻐﻴﻴﺮ ﻛﺮده اﻧﺪ .ﻓﻘﻂ اﺷﻴﺎي ﻗﺪﻳﻤﻲ ﻛﻪ داراي ﻓﻴﻠﺪ ﻫﺎي ﺗﻐﻴﻴﺮ ﻛﺮده ﻫﺴﺘﻨﺪ اﺣﺘﻴﺎج ﺑﻪ ﺑﺮرﺳﻲ ﺷﺪن ﺑﺮاي اﻳﻨﻜﻪ آﻳﺎ ﺑﻪ ﺷﻴﺌﻲ از ﻧﺴﻞ ﺻﻔﺮ اﺷﺎره ﻣﻴﻜﻨﻨﺪ اﺣﺘﻴﺎج دارﻧﺪ.
٩٤٥
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻧﻜﺘﻪ :ﺗﺴﺘﻬﺎي ﻛﺎراﻳﻲ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻧﺸﺎن ﻣﻴﺪﻫﻨﺪ ﻛﻪ ﻋﻤﻞ Garbage Collectionدر ﻧﺴﻞ ﺻﻔﺮ ﻛﻤﺘﺮ از ﻳﻚ ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ در ﻳﻚ ﻛﺎﻣﭙﻴﻮﺗﺮ ﭘﻨﺘﻴﻮم ﺑﺎ ﺳﺮﻋﺖ 200ﻣﮕﺎ ﻫﺮﺗﺰ زﻣﺎن ﻣﻴﺒﺮد. ﻳﻚ Garbage Collectorﻛﻪ از ﻧﺴﻠﻬﺎ اﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ ﻫﻤﭽﻨﻴﻦ ﺗﺼﻮر ﻣﻴﻜﻨﺪ ﻛﻪ اﺷﻴﺎﻳﻲ ﻛﻪ ﻣﺪت زﻳﺎدي اﺳـﺖ ﻛـﻪ در ﺣﺎﻓﻈﻪ ﻣﺎﻧﺪه اﻧﺪ ﺑﻪ زودي ﻧﻴﺰ از ﺣﺎﻓﻈﻪ ﺧﺎرج ﻧﻤﻴﺸﻮﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ اﺣﺘﻤﺎل ﻣﻴﺮود ﻛﻪ اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﻳـﻚ ﻫﻤﭽﻨـﺎن در ﻃـﻮل ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ دﺳﺘﺮس ﺧﻮاﻫﻨﺪ ﺑﻮد .ﺑﻨﺎﺑﺮاﻳﻦ اﮔﺮ Garbage Collectorاﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﻳﻚ را ﺑﺮرﺳﻲ ﻛﻨﺪ اﺣﺘﻤﺎﻻ ﻣﻘﺪار زﻳﺎدي ﻣﺘﻐﻴﻴﺮ ﻏﻴﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ در ﺑﺮﻧﺎﻣﻪ ﻧﺨﻮاﻫﺪ ﻳﺎﻓﺖ و اﺣﺘﻤﺎﻻ ﺣﺎﻓﻈﻪ زﻳﺎدي را آزاد ﻧﺨﻮاﻫﺪ ﻛﺮد .ﺑﻨﺎﺑﺮاﻳﻦ آزاد ﺳـﺎزي ﻧـﺴﻞ ﻳﻚ ﭼﻴﺰي ﺟﺰ اﺗﻼف وﻗﺖ ﻧﺨﻮاﻫﺪ ﺑﻮد .اﮔﺮ ﻫﺮ زﺑﺎﻟﻪ اي در ﻧﺴﻞ ﻳﻚ ﺑﻪ وﺟﻮد ﺑﻴﺎﻳﺪ در ﻫﻤﺎن ﻧﺴﻞ ﺑﺎﻗﻲ ﺧﻮاﻫـﺪ ﻣﺎﻧـﺪ .ﺑﻌـﺪ از اﺟـﺮاي ﻋﻤﻠﻴﺎت ذﻛﺮ ﺷﺪه ﺷﻜﻞ heapﺑﻪ ﺻﻮرت زﻳﺮ در ﻣﻲ آﻳﻨﺪ.
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻴﺒﻴﻨﻴﺪ ﺗﻤﺎم اﺷﻴﺎي ﻛﻪ از ﻧﺴﻞ ﺻﻔﺮ ﺑﺎﻗﻲ ﻣﺎﻧﺪه اﻧﺪ وارد ﻧﺴﻞ ﻳﻚ ﺷﺪه اﻧـﺪ .ﭼـﻮن Garbage Collector ﻧﺴﻞ ﻳﻚ را ﺑﺮرﺳﻲ ﻧﻤﻴﻜﻨﺪ ﺷﻴﺊ Bﺣﺎﻓﻈﻪ اي را ﻛﻪ ﮔﺮﻓﺘﻪ اﺳـﺖ آزاد ﻧﻤﻴﻜﻨـﺪ ﺑـﺎ وﺟـﻮد اﻳﻨﻜـﻪ از آﺧـﺮﻳﻦ ﻋﻤـﻞ Garbage Collectorﺗﺎ ﻛﻨﻮن اﻳﻦ ﻣﺘﻐﻴﻴﺮ در ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑﻞ اﺳﺘﻔﺎده ﻧﺒﻮده اﺳﺖ .ﻣﺠﺪدا ﺑﻌـﺪ از ﺟﻤـﻊ آوري ﻧـﺴﻞ ﺻـﻔﺮ داراي ﻫـﻴﭻ ﺷـﻴﺊ ﻧﺨﻮاﻫﺪ ﺑﻮد و ﺑﻨﺎﺑﺮاﻳﻦ ﻣﻜﺎﻧﻲ ﺑﺮاي ﻗﺮارﮔﻴﺮي اﺷﻴﺎي ﺟﺪﻳﺪ ﻣﺤﺴﻮب ﻣﻴﺸﻮد .در اداﻣﻪ ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﻛﺎر ﺧﻮد اداﻣﻪ ﻣﻴﺪﻫﺪ و اﺷـﻴﺎي Lﺗـﺎ O را اﻳﺠﺎد ﻣﻴﻜﻨﺪ .و در ﺣﺎل اﺟﺮا ﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده از اﺷﻴﺎي Gو Lو Mرا ﭘﺎﻳﺎن ﻣﻴﺪﻫـﺪ و آﻧﻬـﺎ را ﻏﻴـﺮ ﻗﺎﺑـﻞ دﺳـﺘﺮس ﻣﻴﻜﻨـﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ heapﺑﻪ ﺻﻮرت زﻳﺮ ﺗﺒﺪﻳﻞ ﻣﻴﺸﻮد.
اﺟﺎزه دﻫﻴﺪ ﻓﻜﺮ ﻛﻨﻴﻢ ﻛﻪ ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺷﻴﺊ Pﺑﺎﻋﺚ ﺗﺠﺎوز ﻧﺴﻞ ﺻﻔﺮ از ﺳﺮ ﺣﺪ ﺧﻮد ﺷﻮد و اﻳﻦ ﻋﻤﻞ ﻣﻮﺟﺐ اﺟﺮاي ﻣﺠﺪد Garbage Collectorﺷﻮد .ﭼﻮن ﺗﻤﺎم اﺷﻴﺎي ﻣﻮﺟـﻮد در ﻧـﺴﻞ ﻳـﻚ ﻛﻤﺘـﺮ از 2ﻣﮕـﺎ ﺑﺎﻳـﺖ اﺳـﺖ Garbage Collectorﻣﺠﺪدا ﺗﺼﻤﻴﻢ ﻣﻴﮕﻴﺮد ﻛﻪ ﻓﻘﻂ ﻧﺴﻞ ﺻﻔﺮ را ﺑﺮرﺳﻲ ﻛﻨﺪ و از اﺷﻴﺎي ﻏﻴﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ در ﻧﺴﻞ ﻳﻚ ﭼﺸﻢ ﭘﻮﺷﻲ ﻛﻨﺪ)اﺷﻴﺎي Bو .(Gﺑﻌﺪ از ﻋﻤﻞ ﺟﻤﻊ آوري heapﺑﻪ ﺻﻮرت زﻳﺮ در ﻣﻲ آﻳﺪ.
٩٤٦
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
در ﺗﺼﻮﻳﺮ ﺑﺎﻻ ،ﻣﺸﺎﻫﺪه ﻣﻴﻜﻨﻴﺪ ﻛﻪ ﻧﺴﻞ ﻳﻚ ﺑﻪ ﻣﺮور در ﺣﺎل رﺷﺪ و اﻓﺰاﻳﺶ ﺣﺠﻢ اﺳﺖ .اﺟﺎزه دﻫﻴﺪ ﺗﺼﻮر ﻛﻨﻴﻢ ﻛﻪ اﺷﻴﺎي ﻣﻮﺟـﻮد در ﻧﺴﻞ ﻳﻚ ﺗﺎ ﺳﺮ ﺣﺪ 2ﻣﮕﺎ ﺑﺎﻳﺖ ﻓﻀﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده در ﻧﺴﻞ ﻳﻚ را اﺷﻐﺎل ﻛﺮده اﻧﺪ .در اﻳـﻦ ﻣﺮﺣﻠـﻪ ،ﺑﺮﻧﺎﻣـﻪ ﻣﺮاﺣـﻞ اﺟـﺮاي ﺧـﻮد را ﻫﻤﭽﻨﺎن اداﻣﻪ ﻣﻴﺪﻫﺪ و در اﻳﻦ ﻣﺮﺣﻠﻪ اﺷﻴﺎي Pﺗﺎ Sﺗﻮﻟﻴﺪ ﻣﻴﺸﻮﻧﺪ ﻛﻪ اﻳﻦ اﺷﻴﺎ ﻧﺴﻞ ﺻﻔﺮ را ﻧﻴﺰ ﺗﺎ ﺳﺮ ﺣﺪ ﺧﻮد ﭘﺮ ﻣﻴﻜﻨﻨﺪHeap . در اﻳﻦ ﻣﺮﺣﻠﻪ ﻣﺸﺎﺑﻪ ﺷﻜﻞ زﻳﺮ ﻣﻴﺸﻮد.
زﻣﺎﻧﻲ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﺳﻌﻲ در ﺗﺨﺼﻴﺺ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺷﻴﺊ Tدارد ﻧﺴﻞ ﺻﻔﺮ ﻛﺎﻣﻼ ﭘﺮ اﺳﺖ و Garbage Collectorﺑﺎﻳـﺪ آﻏﺎز ﺑﻪ ﻛﺎر ﻛﻨﺪ .اﻳﻦ ﻣﺮﺗﺒﻪ ،اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﻳﻚ ﻫﺮ 2ﻣﮕﺎ ﺑﺎﻳﺖ ﻓﻀﺎي ﺧﻮد را ﺗﺎ ﺳﺮ ﺣﺪ ﻓﻀﺎي ﻧـﺴﻞ ﻳـﻚ اﺷـﻐﺎل ﻛـﺮده اﻧـﺪ. ﻋﻼوه ﺑﺮ اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﺻﻔﺮ ،ﺗﺼﻮر ﻣﻴﺸﻮد ﻛﻪ ﺑﻌﻀﻲ از اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﻳﻚ ﻫﻢ ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﻗﺎﺑﻞ اﺳـﺘﻔﺎده در آﻣـﺪه اﻧﺪ .ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ ﻣﺮﺗﺒﻪ Garbage Collector ،ﺗﺼﻤﻴﻢ ﻣﻴﮕﻴﺮد ﻛﻪ ﺗﻤﺎم اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﻳﻚ و ﻧﺴﻞ ﺻﻔﺮ را ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار دﻫﺪ .ﺑﻌﺪ از اﻳﻨﻜﻪ ﻫﺮ دو ﻧﺴﻞ ﺑﻪ ﻃـﻮر ﻛﺎﻣـﻞ ﺗﻮﺳـﻂ Garbage Collectorﻣـﻮرد ﺑﺮرﺳـﻲ ﻗـﺮار ﮔﺮﻓﺘﻨـﺪ، heapﺑﻪ ﺻﻮرت ﺷﻜﻞ زﻳﺮ در ﻣﻲ آﻳﺪ.
ﻣﺎﻧﻨﺪ ﻗﺒﻞ ،اﺷﻴﺎﻳﻲ ﻛﻪ در اﻳﻦ ﻣﺮﺣﻠﻪ از ﺟﻤﻊ آوري از ﻧﺴﻞ ﺻﻔﺮ ﺑﺎﻗﻲ ﻣﺎﻧﺪﻧﺪ وارد ﻧﺴﻞ ﻳﻚ ﻣﻴﺸﻮﻧﺪ و ﻧﻴﺰ اﺷﻴﺎﻳﻲ ﻛﻪ در اﻳـﻦ ﻣﺮﺣﻠـﻪ از ﻧﺴﻞ ﻳﻚ ﺑﺎﻗﻲ ﻣﺎﻧﺪﻧﺪ وارد ﻧﺴﻞ دو ﻣﻴﺸﻮﻧﺪ .ﻣﺜﻞ ﻫﻤﻴﺸﻪ ،ﺑﻼﻓﺎﺻﻠﻪ ﻧﺴﻞ ﺻﻔﺮ از اﺷﻴﺎ ﺧﺎﻟﻲ ﻣﻴـﺸﻮد و اﺷـﻴﺎي ﺟﺪﻳـﺪ ﻣﻴﺘﻮاﻧﻨـﺪ در اﻳـﻦ ﻗﺴﻤﺖ ﻗﺮار ﮔﻴﺮﻧﺪ .اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ دو اﺷﻴﺎي ﻫـﺴﺘﻨﺪ ﻛـﻪ ﺣـﺪاﻗﻞ دو ﺑـﺎر ﺗﻮﺳـﻂ Garbage Collectorﻣـﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﺮﻓﺘﻪ اﻧﺪ .ﻣﻤﻜﻦ اﺳﺖ ﺑﻌﺪ از ﻳﻚ ﻳﺎ دو ﺑﺎر ﺟﻤﻊ آوري ﻧﺴﻞ ﺻﻔﺮ ،ﺑﺎ اﻧﺠﺎم اﻳﻦ ﻋﻤﻞ در ﻧـﺴﻞ ﻳـﻚ ﻣﻘـﺪاري ﺣﺎﻓﻈـﻪ آزاد ﺷﻮد ،اﻣﺎ اﻳﻦ ﻋﻤﻞ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ ﻧﺴﻞ ﻳﻚ ﺑﻪ ﺳﺮ ﺣﺪ ﺧﻮد ﻧﺮﺳﺪ اﻧﺠﺎم ﻧﻤﻴﺸﻮد ﻛﻪ اﻳﻦ ﻛﺎر ﻣﻤﻜﻦ اﺳﺖ ﻧﻴﺎز ﺑﻪ ﭼﻨﺪﻳﻦ ﺑـﺎر اﺟـﺮاي ﺟﻤـﻊ آوري در ﻧﺴﻞ ﺻﻔﺮ ﺑﺎﺷﺪ. Managed heapﻓﻘﻂ ﺳﻪ ﻧﺴﻞ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻴﻜﻨﺪ :ﻧﺴﻞ ﺻﻔﺮ ،ﻧﺴﻞ ﻳﻚ و ﻧﺴﻞ دو .ﺑﻨﺎﺑﺮاﻳﻦ ﭼﻴﺰي ﺑﻪ ﻧﺎم ﻧـﺴﻞ ﺳـﻪ وﺟـﻮد ﻧﺪارد .زﻣﺎﻧﻲ ﻛﻪ CLRآﻏﺎز ﺑﻪ ﻛﺎر ﻣﻴﻜﻨﺪ ،ﺳﺮ ﺣﺪ ﻫﺎﻳﻲ را ﺑﺮاي ﻫﺮ ﺳﻪ ﻧﺴﻞ در ﻧﻈﺮ ﻣﻴﮕﻴﺮد .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﭘﻴـﺸﺘﺮ ذﻛـﺮ ﺷـﺪ ،ﺳـﺮ ﺣـﺪ ﺑﺮاي ﻧﺴﻞ ﺻﻔﺮ ﺣﺪود 256ﻛﻴﻠﻮﺑﺎﻳﺖ اﺳﺖ ،ﺳﺮ ﺣﺪ ﺑﺮاي ﻧﺴﻞ ﻳﻚ ﺣﺪوداً 2ﻣﮕﺎ ﺑﺎﻳﺖ اﺳﺖ و ﺳﺮ ﺣﺪ ﺑﺮاي ﻧﺴﻞ دو ﺣﺪود 10ﻣﮕﺎ ﺑﺎﻳﺖ اﺳﺖ .ﺑﻨﺎﺑﺮاﻳﻦ ﺳﺮ ﺣﺪ ﻧﺴﻠﻬﺎ ﺑﻪ ﮔﻮﻧﻪ اي اﻧﺘﺨﺎب ﺷﺪه اﺳﺖ ﻛﻪ ﻣﻮﺟﺐ اﻓﺰاﻳﺶ ﺑﺎزدﻫﻲ و راﻧﺪﻣﺎن ﺑﺮﻧﺎﻣﻪ ﺷﻮد .ﻫﺮﭼﻪ ﺳﺮ ﺣﺪ ﻳـﻚ ﻧـﺴﻞ ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ ﻋﻤﻞ Garbage Collectionﻛﻤﺘﺮ روي آن ﻧﺴﻞ ﺻﻮرت ﻣﻴﮕﻴﺮد .و دوﺑﺎره ،ﺑﻬﺒﻮد ﻛﺎراﻳﻲ ﺑﻪ وﺟﻮد ﻣﻲ آﻳﺪ ﻛﻪ ﺑﻪ دﻟﻴﻞ ﻓﺮﺿﻴﺎت اوﻟﻴﻪ اﺳﺖ :اﺷﻴﺎي ﺟﺪﻳﺪ داراي ﻃﻮل ﻋﻤﺮ ﻛﻮﺗﺎﻫﺘﺮي ﻫﺴﺘﻨﺪ ،اﺷﻴﺎي ﻗﺪﻳﻤﻲ ﻃﻮل ﻋﻤﺮ ﺑﻴﺸﺘﺮي دارﻧﺪ. Garbage Collectorﻣﻮﺟﻮد در CLRﻳﻚ ﺟﻤﻊ آوري ﻛﻨﻨﺪه ﺑﺎ ﺗﻨﻈﻴﻢ ﻛﻨﻨﺪه ﺧﻮدﻛﺎر اﺳﺖ .اﻳﻦ ﺑﺪﻳﻦ ﻣﻌﻨﺎ اﺳـﺖ ﻛـﻪ Garbage Collectorاز رﻓﺘﺎر ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻣﻲ آﻣﻮزد ﻛﻪ ﭼﻪ زﻣﺎﻧﻲ ﺑﺎﻳﺪ ﻋﻤﻞ ﺟﻤﻊ آوري را اﻧﺠﺎم دﻫﺪ .ﺑﺮاي ﻣﺜﺎل اﮔـﺮ
٩٤٧
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﺷﻴﺎي زﻳﺎدي را اﻳﺠﺎد ﻛﻨﺪ و از آﻧﻬﺎ ﺑﺮاي ﻣﺪت زﻣﺎن ﻛﻮﺗﺎﻫﻲ اﺳﺘﻔﺎده ﻛﻨﺪ ،اﻳﻦ اﻣﺮ ﻣﻤﻜﻦ اﺳﺖ ﻛـﻪ آزاد ﺳـﺎزي ﺣﺎﻓﻈـﻪ در ﻧﺴﻞ ﺻﻔﺮ ﻣﻘﺪار زﻳﺎدي ﺣﺎﻓﻈﻪ را آزاد ﻛﻨﺪ.ﺣﺘﻲ ﻣﻤﻜﻦ اﺳﺖ ﺗﻤﺎم ﺣﺎﻓﻈﻪ ﮔﺮﻓﺘﻪ ﺷﺪه در ﻧﺴﻞ ﺻﻔﺮ آزاد ﺷﻮد. اﮔﺮ Garbage Collectorﻣﺸﺎﻫﺪه ﻛﻨﺪ ﻛﻪ ﺑﻌﺪ از اﻧﺠﺎم ﺟﻤﻊ آوري ﻧﺴﻞ ﻳﻚ ﺗﻌـﺪاد ﻣﺤـﺪودي از اﺷـﻴﺎ ﺑـﺎﻗﻲ ﻣﺎﻧﺪﻧـﺪ، ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮد ﻛﻪ ﺳﺮ ﺣﺪ ﻧﺴﻞ ﺻﻔﺮ را از 256ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﺑﻪ 128ﻛﻴﻠﻮ ﺑﺎﻳﺖ ﻛﺎﻫﺶ دﻫﺪ .اﻳﻦ ﻛﺎﻫﺶ در ﻓﻀﺎي ﻣﻌـﻴﻦ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﻋﻤﻞ ﺟﻤﻊ آوري ﺑﺎﻳﺪ در ﻓﻮاﺻﻞ زﻣﺎﻧﻲ ﻛﻮﺗﺎه ﺗﺮي رخ دﻫﺪ اﻣﺎ ﻓﻀﺎي ﻛﻤﺘﺮي را ﺑﺮرﺳﻲ ﻛﻨﺪ .ﺑﻨـﺎﺑﺮاﻳﻦ ﻛﺎرﻫـﺎي ﭘﺮوﺳﻪ ﺷﻤﺎ ﺑﻪ ﺻﻮرت ﻗﺎﺑﻞ ﺗﻮﺟﻬﻲ اﻓﺰاﻳﺶ ﻧﻤﻲ ﻳﺎﺑﺪ .اﮔﺮ ﺗﻤﺎم اﺷﻴﺎي ﻣﻮﺟﻮد در ﻧﺴﻞ ﺻﻔﺮ زﺑﺎﻟﻪ ﻣﺤـﺴﻮب ﺷـﻮﻧﺪ دﻳﮕـﺮ اﺣﺘﻴـﺎﺟﻲ ﺑـﻪ ﻓـﺸﺮده ﺳـﺎزي ﺣﺎﻓﻈـﻪ ﺗﻮﺳـﻂ Garbage Collectorﻧﻴـﺴﺖ .اﻳـﻦ ﻋﻤـﻞ ﻣﻴﺘﻮاﻧـﺪ ﺑـﻪ ﺳـﺎدﮔﻲ ﺑـﺎ آوردن اﺷـﺎره ﮔـﺮ NextObjPtrﺑﻪ اﺑﺘﺪاي ﺣﺎﻓﻈﻪ ﻣﻮرد ﻧﻈﺮ ﺑﺮاي ﻧﺴﻞ ﺻﻔﺮ اﻧﺠﺎم ﺷﻮد .اﻳﻦ ﻋﻤﻞ ﺑﻪ ﺳﺮﻋﺖ ﺣﺎﻓﻈﻪ را آزاد ﻣﻴﻜﻨﺪ! ﻧﻜﺘﻪ Garbage Collector:ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻧﺤﻮ ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ASP.NETو ﺳﺮوﻳﺴﻬﺎي وب ﻣﺒﺘﻨـﻲ ﺑـﺮ XMLﻛـﺎر ﻣﻴﻜﻨﺪ .ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ ،ASP.NETﻳﻚ ﺗﻘﺎﺿﺎ از ﻃﺮف ﻛﻼﻳﻨﺖ ﻣﻴﺮﺳﺪ ،ﻳﻚ ﺟﻌﺒﻪ از اﺷﻴﺎي ﺟﺪﻳﺪ ﺗﺸﻜﻴﻞ ﻣﻴﺸﻮد ،اﺷـﻴﺎ ﻛﺎرﻫﺎي ﺗﻌﻴﻴﻦ ﺷﺪه ﺗﻮﺳﻂ ﻛﻼﻳﻨﺖ را اﻧﺠﺎم ﻣﻴﺪﻫﻨﺪ ،و ﻧﺘﻴﺠﻪ ﺑﻪ ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﺑﺮ ﻣﻴﮕﺮدد .در اﻳﻦ ﻣﺮﺣﻠﻪ ﺗﻤـﺎم اﺷـﻴﺎي ﻣﻮﺟـﻮد ﺑـﺮاي اﻧﺠﺎم ﺗﻘﺎﺿﺎي ﻛﻼﻳﻨﺖ زﺑﺎﻟﻪ ﺗﻠﻘﻲ ﻣﻴﺸﻮﻧﺪ .ﺑﻪ ﺑﻴﺎن دﻳﮕﺮ ،ﻫﺮ ﺗﻘﺎﺿﺎي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ ASP.NETﺑﺎﻋﺚ اﻳﺠﺎد ﺣﺠـﻢ زﻳـﺎدي از زﺑﺎﻟﻪ ﻣﻴﺸﻮﻧﺪ .ﭼﻮن اﻳﻦ اﺷﻴﺎ اﻏﻠﺐ ﺑﻼﻓﺎﺻﻠﻪ ﺑﻌﺪ از اﻳﺠﺎد دﻳﮕﺮ ﻗﺎﺑﻞ دﺳﺘﺮﺳﻲ ﻧﻴﺴﺘﻨﺪ ﻫﺮ ﻋﻤﻞ ﺟﻤـﻊ آوري ﻣﻮﺟـﺐ آزاد ﺳـﺎزي ﻣﻘـﺪار Garbage زﻳ ـﺎدي از ﺣﺎﻓﻈــﻪ ﻣﻴ ـﺸﻮد .اﻳ ـﻦ ﻛــﺎر ﻣﺠﻤﻮﻋــﻪ ﻛﺎرﻫــﺎي ﭘﺮوﺳــﻪ را ﺑــﺴﻴﺎر ﻛــﺎﻫﺶ ﻣﻴﺪﻫــﺪ ﺑﻨــﺎﺑﺮاﻳﻦ راﻧــﺪﻣﺎن Collectorﻣﺤﺴﻮس ﺧﻮاﻫﺪ ﺑﻮد. ﺑﻪ ﺑﻴﺎن دﻳﮕﺮ ،اﮔﺮ Garbage Collectorﻧﺴﻞ ﺻﻔﺮ را ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار دﻫﺪ و ﻣﺸﺎﻫﺪه ﻛﻨﺪ ﻛﻪ ﻣﻘـﺪار زﻳـﺎدي از اﺷـﻴﺎ وارد ﻧﺴﻞ ﻳﻚ ﺷﺪﻧﺪ ،ﻣﻘﺪار زﻳﺎدي از ﺣﺎﻓﻈﻪ ﺗﻮﺳﻂ Garbage Collectionآزاد ﻧﻤﻴـﺸﻮد ،ﺑﻨـﺎﺑﺮاﻳﻦ Garbage Collectorﺳﺮ ﺣﺪ ﻧﺴﻞ ﺻﻔﺮ را ﺗﺎ 512ﻛﻴﻠﻮ ﺑﺎﻳﺖ اﻓﺰاﻳﺶ ﻣﻴﺪﻫﺪ .در اﻳﻦ ﻣﺮﺣﻠﻪ ﻛﻤﺘﺮ اﻧﺠﺎم ﻣﻴﺸﻮد اﻣﺎ ﺑﺎ ﻫﺮ ﺑﺎر اﻧﺠـﺎم اﻳـﻦ ﻋﻤﻞ ﻣﻘﺪار زﻳﺎدي ﺣﺎﻓﻈﻪ آزاد ﻣﻴﺸﻮد. در ﻃﻮل اﻳﻦ ﻗﺴﻤﺖ ﭼﮕﻮﻧﮕﻲ ﺗﻐﻴﻴﺮ دﻳﻨﺎﻣﻴﻚ ﺳﺮ ﺣﺪ ﻧﺴﻞ ﺻﻔﺮ ﺷﺮح داده ﺷﺪ .اﻣﺎ ﻋﻼوه ﺑﺮ ﺳﺮ ﺣﺪ ﻧﺴﻞ ﺻﻔﺮ ﺳﺮ ﺣﺪ ﻧـﺴﻠﻬﺎي ﻳـﻚ و دو ﻧﻴﺰ ﺑﺮ اﺳﺎس ﻫﻤﻴﻦ اﻟﮕﻮرﻳﺘﻢ ﺗﻐﻴﻴﺮ ﻣﻴﻜﻨﻨـﺪ .ﺑـﻪ اﻳـﻦ ﻣﻌﻨـﻲ ﻛـﻪ زﻣـﺎﻧﻲ ﻛـﻪ اﻳـﻦ ﻧـﺴﻠﻬﺎ ﻣـﻮرد ﻋﻤـﻞ ﺟﻤـﻊ آوري ﻗـﺮار ﻣﻴﮕﻴﺮﻧـﺪ Garbage Collectorﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ ﻛﻪ ﭼﻪ ﻣﻘﺪار ﻓﻀﺎ آزاد ﺷﺪه اﺳﺖ و ﭼﻪ ﻣﻘﺪار از اﺷﻴﺎ ﺑﻪ ﻧـﺴﻞ ﺑﻌـﺪ رﻓﺘـﻪ اﻧـﺪ .ﺑـﺮ اﺳﺎس ﻧﺘﺎﻳﺞ اﻳﻦ ﺑﺮرﺳﻴﻬﺎ Garbage Collectorﻣﻤﻜﻦ اﺳﺖ ﻇﺮﻓﻴﺖ اﻳﻦ ﻧﺴﻠﻬﺎ را ﻛﺎﻫﺶ ﻳﺎ اﻓﺰاﻳﺶ دﻫـﺪ ﻛـﻪ ﺑﺎﻋـﺚ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻣﻴﺸﻮد.
دﻳﮕﺮ ﻧﺘﺎﻳﺞ ﻛﺎراﻳﻲ :Garbage Collector ﭘﻴﺸﺘﺮ در اﻳﻦ ﻣﻘﺎﻟﻪ اﻟﮕﻮرﻳﺘﻢ ﻛﺎر Garbage Collectorﺷﺮح داده ﺷﺪ .ﺑﺎ اﻳﻦ وﺟﻮد در ﻃﻮل اﻳﻦ ﺗﻮﺿﻴﺤﺎت ﻳﻚ ﻓﺮض ﺑﺰرگ ﺻﻮرت ﮔﺮﻓﺘﻪ ﺑﻮد :اﻳﻨﻜﻪ ﻓﻘﻂ ﻳﻚ ﺗﺮد 1در ﺣﺎل اﺟـﺮا اﺳـﺖ .اﻣـﺎ در ﻣـﺪل واﻗﻌـﻲ ﭼﻨـﺪﻳﻦ ﺗـﺮد ﺑـﻪ managed heap دﺳﺘﺮﺳﻲ دارﻧﺪ و ﻳﺎ ﺣﺪاﻗﻞ اﺷﻴﺎي ﻗﺮار ﮔﺮﻓﺘﻪ در managed heapرو ﺗﻐﻴﻴﺮ ﻣﻴﺪﻫﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺗﺮد ﻣﻮﺟﺐ اﺟـﺮاي ﻋﻤـﻞ ﺟﻤﻊ آوري ﺗﻮﺳﻂ Garbage Collectorﻣﻴﺸﻮد ،دﻳﮕﺮ ﺗﺮد ﻫﺎ ﺣﻖ دﺳﺘﺮﺳﻲ ﺑـﻪ اﺷـﻴﺎي ﻣﻮﺟـﻮد در managed heapرا ﻧﺪارﻧﺪ)اﻳﻦ ﻣﻮرد ﺷﺎﻣﻞ ارﺟﺎع ﻫﺎي اﺷﻴﺎي ﻣﻮﺟﻮد در stackﻫـﻢ ﻣﻴـﺸﻮد( زﻳـﺮا Garbage Collector ﻣﻤﻜﻦ اﺳﺖ ﻣﻜﺎن اﻳﻦ اﺷﻴﺎ را ﺗﻐﻴﻴﺮ دﻫﺪ.
Thread
1
٩٤٨
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﺑﻨﺎﺑﺮاﻳﻦ وﻗﺘﻲ Garbage Collectorﺑﺨﻮاﻫﺪ ﻋﻤﻞ ﺟﻤﻊ آوري را آﻏﺎز ﻛﻨﺪ ،ﺗﻤﺎم ﺗﺮد ﻫﺎﻳﻲ ﻛﻪ در ﺣﺎل اﺟﺮاي ﻛﺪ ﻫـﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه 1ﻫﺴﺘﻨﺪ ﺑﻪ ﺣﺎل ﺗﻌﻠﻴﻖ در ﻣﻲ آﻳﻨﺪ CLR.داراي ﭼﻨﺪﻳﻦ ﻣﻜﺎﻧﻴﺴﻢ ﻧﺴﺒﺘﺎً ﻣﺘﻔﺎوت اﺳﺖ ﻛﻪ ﻣﻴﺘﻮاﻧﺪ ﺗﺮد ﻫﺎ را ﺑﻪ ﺣﺎﻟﺖ ﺗﻌﻠﻴﻖ در آورد ﺑﻨﺎﺑﺮاﻳﻦ ﻋﻤﻞ ﺟﻤﻊ آوري ﻣﻴﺘﻮاﻧﺪ ﺑﻪ درﺳﺘﻲ اﺟﺮا ﺷﻮد .دﻟﻴﻞ اﻳﻨﻜﻪ CLRاز ﭼﻨﺪﻳﻦ ﻣﻜﺎﻧﻴﺴﻢ اﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ ﺑﻪ ﺣﺎﻟﺖ اﺟﺮا ﻧﮕـﺎه داﺷﺘﻦ ﺗﺮد ﻫﺎ ﺗﺎ ﺣﺪاﻛﺜﺮ زﻣﺎن ﻣﻤﻜﻦ و ﻛﺎﻫﺶ ﺳﺮﺑﺎر ﻛﺮدن آﻧﻬﺎ در ﺣﺎﻓﻈﻪ ﺗﺎ ﺣﺪاﻗﻞ زﻣﺎن ﻣﻤﻜﻦ اﺳﺖ .ﺗـﺸﺮﻳﺢ اﻳـﻦ ﻣﻜﺎﻧﻴـﺴﻢ ﻫـﺎ از اﻫﺪاف اﻳﻦ ﻣﻘﺎﻟﻪ ﺧﺎرج اﺳﺖ اﻣﺎ ﺗﺎ اﻳﻦ ﺣﺪ ﻻزم اﺳﺖ ذﻛﺮ ﺷﻮد ﻛﻪ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻓﻌﺎﻟﻴﺘﻬﺎي زﻳﺎدي را ﺑﺮاي ﻛﺎﻫﺶ ﻓﺸﺎر ﭘﺮدازﺷﻲ ﻧﺎﺷـﻲ از Garbage Collectorاﻧﺠﺎم داده اﺳﺖ .و ﻧﻴﺰ اﻳﻦ ﻣﻜﺎﻧﻴﺴﻢ ﻫﺎ ﺑﻪ ﺳﺮﻋﺖ در ﺣﺎل ﺗﻐﻴﻴﺮ ﻫﺴﺘﻨﺪ ﺗﺎ ﺑﻪ ﺑﻬﺘﺮﻳﻦ ﻛـﺎراﻳﻲ ﺧﻮد ﺑﺮﺳﻨﺪ. زﻣﺎﻧﻲ ﻛﻪ CLRﻣﻴﺨﻮاﻫﺪ Garbage Collectorرا اﺟﺮا ﻛﻨﺪ ،اﺑﺘﺪا ﺗﻤﺎم ﺗـﺮد ﻫـﺎ در ﭘﺮوﺳـﻪ ﺟـﺎري را ﻛـﻪ در ﺣـﺎل اﺟﺮاي ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻫﺴﺘﻨﺪ ﺑﻪ ﺣﺎل ﺗﻌﻠﻴﻖ در ﻣﻲ آورد .ﺳﭙﺲ CLRﺑـﺮاي ﺗﻌﻴـﻴﻦ ﻣﻮﻗﻌﻴـﺖ ﻫـﺮ ﺗـﺮد ﺗﻤـﺎم اﺷـﺎره ﮔﺮﻫـﺎي دﺳﺘﻮرات در ﺣﺎل اﺟﺮا ﺗﻮﺳﻂ ﺗﺮد ﻫﺎ را ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ .ﺳﭙﺲ ﺑﺮاي ﺗﻌﻴﻴﻦ اﻳﻨﻜﻪ ﭼﻪ ﻛﺪي ﺗﻮﺳﻂ ﺗﺮد در ﺣﺎل اﺟﺮا ﺑﻮده آدرس اﺷـﺎره ﮔـﺮ دﺳﺘﻮر ﺑﺎ ﺟﺪول اﻳﺠﺎد ﺷﺪه ﺗﻮﺳﻂ ﻛﺎﻣﭙﺎﻳﻠﺮ JITﻣﻘﺎﻳﺴﻪ ﻣﻴﺸﻮد. اﮔﺮ دﺳﺘﻮر درﺣﺎل اﺟﺮا ﺗﻮﺳﻂ ﺗﺮد در ﻳﻚ آﻓﺴﺖ ﻣﺸﺨﺺ ﺷﺪه ﺑﻪ وﺳﻴﻠﻪ ﺟﺪول ﻣﺬﻛﻮر ﺑﺎﺷﺪ ﮔﻔﺘﻪ ﻣﻴﺸﻮد ﻛﻪ ﺗﺮد ﺑـﻪ ﻳـﻚ ﻧﻘﻄـﻪ اﻣـﻦ دﺳﺘﺮﺳﻲ دارد .ﻳﻚ ﻧﻘﻄﻪ اﻣﻦ ﻧﻘﻄﻪ اي اﺳﺖ ﻛﻪ در آﻧﺠﺎ ﻣﻴﺘﻮان ﺑﺪون ﻫﻴﭻ ﻣﺸﻜﻠﻲ ﺗﺮد را ﺑﻪ ﺣﺎل ﺗﻌﻠﻴﻖ در آورد ﺗـﺎ Garbage Collectorﻛﺎر ﺧﻮد را آﻏﺎز ﻛﻨﺪ.اﮔﺮ اﺷﺎره ﮔﺮ دﺳﺘﻮر در ﺣﺎل اﺟﺮاي ﺗﺮد در روي ﻳﻚ آﻓـﺴﺖ ﻣـﺸﺨﺺ ﺷـﺪه ﺗﻮﺳـﻂ ﺟـﺪول دروﻧﻲ ﺗﺎﺑﻊ ﻗﺮار ﻧﺪاﺷﺖ ،ﺑﻨﺎﺑﺮاﻳﻦ ﺗﺮد در ﻳﻚ ﻧﻘﻄﻪ اﻣﻦ ﻗﺮار ﻧﺪارد و CLRﻧﻤﻴﺘﻮاﻧﺪ Garbage Collectorرا اﺟﺮا ﻛﻨـﺪ. در اﻳﻦ ﺣﺎﻟﺖ CLRﺗﺮد را ﻫﺎﻳﺠﻚ 2ﻣﻴﻜﻨﺪ :ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻛﻪ CLRاﺳﺘﻚ ﻣﺮﺑﻮط ﺑـﻪ ﺗـﺮد را ﺑـﻪ ﮔﻮﻧـﻪ اي ﺗﻐﻴﻴـﺮ ﻣﻴﺪﻫـﺪ ﻛـﻪ آدرس ﺑﺎزﮔﺸﺖ ﺑﻪ ﻳﻚ ﺗﺎﺑﻊ ﺧﺎص ﭘﻴﺎده ﺳﺎزي ﺷﺪه درون CLRاﺷﺎره ﻛﻨﺪ .ﺳﭙﺲ ﺗﺮد ﺑﻪ اداﻣﻪ ﻛﺎر ﺧﻮد ﺑﺎزﻣﻴﮕﺮدد .زﻣﺎﻧﻲ ﻛـﻪ ﻣﺘـﺪ در ﺣـﺎل اﺟﺮا ﺗﻮﺳﻂ ﺗﺮد اداﻣﻪ ﭘﻴﺪا ﻛﻨﺪ ،اﻳﻦ ﺗﺎﺑﻊ وﻳﮋه اﺟﺮا ﺧﻮاﻫﺪ ﺷﺪ و ﺗﺮد ﺑﻪ ﺣﺎﻟﺖ ﺗﻌﻠﻖ درﺧﻮاﻫﺪ آﻣﺪ. ﺑﺎ وﺟﻮد اﻳﻦ ﻣﻤﻜﻦ اﺳﺖ در ﺑﻌﻀﻲ ﻣﻮاﻗﻊ ﺗﺮد از ﻣﺘﺪ ﺧﻮد ﺑﺎز ﻧﮕﺮدد .ﺑﻨﺎﺑﺮاﻳﻦ زﻣـﺎﻧﻲ ﻛـﻪ ﺗـﺮد ﺑـﻪ اﺟـﺮاي ﺧـﻮد اداﻣـﻪ ﻣﻴﺪﻫـﺪCLR ، 250ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ ﺻﺒﺮ ﻣﻴﻜﻨﺪ .ﺳﭙﺲ دوﺑﺎره ﺑﺮرﺳﻲ ﻣﻴﻜﻨﺪ ﻛﻪ آﻳﺎ ﺗﺮد ﺑﻪ ﻳﻚ ﻧﻘﻄﻪ اﻣﻦ ﻃﺒﻖ ﺟﺪول JITرﺳﻴﺪه اﺳﺖ ﻳﺎ ﻧﻪ .اﮔﺮ ﺗﺮد ﺑـﻪ ﻳﻚ ﻧﻘﻄﻪ اﻣﻦ رﺳﻴﺪه ﺑﻮد CLRﺗﺮد را ﺑﻪ ﺣﺎﻟﺖ ﺗﻌﻠﻴﻖ درﻣﻲ آورد و Garbage Collectorرا اﺟﺮا ﻣﻴﻜﻨﺪ در ﻏﻴﺮ اﻳـﻦ ﺻﻮرت ﻣﺠﺪدا ﺳﻌﻲ ﻣﻴﻜﻨﺪ ﺑﺎ ﺗﻐﻴﻴﺮ Stackﻣﺮﺑﻮط ﺑﻪ ﺗﺮد اﺟﺮاي آن را ﺑﻪ ﺗﺎﺑﻊ دﻳﮕﺮي اﻧﺘﻘﺎل دﻫﺪ در ﺻﻮرت ﺷﻜﺴﺖ ﻣﺠﺪدا CLR ﺑﺮاي ﭼﻨﺪ ﻣﻴﻠﻲ ﺛﺎﻧﻴﻪ دﻳﮕﺮ ﻧﻴﺰ ﺻﺒﺮ ﻣﻴﻜﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﺗﻤﺎم ﺗﺮد ﻫﺎ ﺑﻪ ﻳﻚ ﻧﻘﻄﻪ اﻣـﻦ رﺳـﻴﺪﻧﺪ ﻳـﺎ اﻳﻨﻜـﻪ ﺑـﺎ ﻣﻮﻓﻘﻴـﺖ ﻫﺎﻳﺠـﻚ ﺷـﺪﻧﺪ، Garbage Collectorﻣﻴﺘﻮاﻧﺪ ﻛﺎر ﺧﻮد را آﻏﺎز ﻛﻨﺪ .زﻣﺎﻧﻲ ﻛﻪ ﻋﻤﻞ ﺟﻤﻊ آوري اﻧﺠﺎم ﺷﺪ ﺗﻤﺎم ﺗﺮد ﻫﺎ ﺑﻪ وﺿﻌﻴﺖ ﻗﺒﻠﻲ ﺧﻮد ﺑﺮ ﻣﻴﮕﺮدﻧﺪ و اﺟﺮاي ﺑﺮﻧﺎﻣﻪ اداﻣﻪ ﭘﻴﺪا ﻣﻴﻜﻨﺪ .ﺗﺮد ﻫﺎي ﻫﺎﻳﺠﻚ ﺷﺪه ﻫﻢ ﺑﻪ ﻣﺘﺪﻫﺎي اوﻟﻴﻪ ﺧﻮد ﺑﺎزﻣﻴﮕﺮدﻧﺪ. ﻧﻜﺘﻪ :اﻳﻦ اﻟﮕﻮرﻳﺘﻢ ﻳﻚ ﭘﻴﭻ ﺧﻮردﮔﻲ ﻛﻮﭼﻚ دارد .اﮔﺮ CLRﻳﻚ ﺗﺮد را ﺑﻪ ﺣﺎﻟﺖ ﺗﻌﻮﻳﻖ درآورد و درﻳﺎﺑﺪ ﻛﻪ ﺗﺮد در ﺣﺎل اﺟﺮاي ﻳﻚ ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه 3ﺑﻮد آدرس ﺑﺎزﮔﺸﺖ ﺗﺮد ﻫﺎﻳﺠﻚ ﻣﻴﺸﻮد و ﺑﻪ ﺗﺮد اﺟﺎزه داده ﻣﻴﺸﻮد ﻛﻪ ﺑﻪ اﺟﺮاي ﺧﻮد اداﻣﻪ دﻫﺪ .ﺑﺎ اﻳﻦ وﺟﻮد در اﻳﻦ ﺣﺎﻟﺖ ﺑﻪ Garbage Collectorاﺟﺎزه داده ﻣﻴﺸﻮد ﻛﻪ اﺟﺮا ﺷﻮد در ﺣﺎﻟﻲ ﻛﻪ ﺗﺮد ﻣﺬﻛﻮر در ﺣﺎل اﺟﺮا اﺳـﺖ .اﻳـﻦ ﻣـﻮرد ﻫﻴﭻ اﺷﻜﺎﻟﻲ را ﺑﻪ وﺟﻮد ﻧﻤﻲ آورد زﻳﺮا ﻛﺪ ﻫﺎي ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﻪ اﺷـﻴﺎي ﻣﻮﺟـﻮد در managed heapدﺳﺘﺮﺳـﻲ ﻧﺪارﻧـﺪ ﺗـﺎ زﻣﺎﻧﻲ ﻛﻪ آن اﺷﻴﺎ ﭘﻴﻦ 4ﺷﻮﻧﺪ .ﻳﻚ ﺷﻴﺊ ﭘﻴﻦ ﺷﺪه ﺷـﻲ اﺳـﺖ ﻛـﻪ Garbage Collectorﺣـﻖ ﺣﺮﻛـﺖ دادن آن را در managed heapﻧﺪارد .اﮔﺮ ﺗﺮدي ﻛﻪ در ﺣﺎل ﺣﺎﺿﺮ در ﺣﺎل اﺟﺮاي ﻳﻚ ﻛﺪ ﻣﺪﻳﺮﻳﺖ ﻧﺸﺪه ﺑﻮد ،ﺷﺮوع ﺑـﻪ اﺟـﺮاي ﻳـﻚ ﻛـﺪ ﻣﺪﻳﺮﻳﺖ ﺷﺪه ﻛﻨﺪ ،ﺗﺮد ﻫﺎﻳﺠﻚ ﻣﻴﺸﻮد و ﺑﻪ ﺣﺎﻟﺖ ﺗﻌﻠﻴﻖ درﻣﻲ آﻳﺪ ﺗﺎ زﻣﺎﻧﻲ ﻛﻪ Garbage Collectionﺑﻪ درﺳﺘﻲ ﺑـﻪ اﺗﻤﺎم ﺑﺮﺳﺪ.
Managed Code Hijack Unmanaged Code Pin
1 2 3 4
٩٤٩
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
ﻋﻼوه ﺑﺮ ﻣﻜﺎﻧﻴﺴﻤﻬﺎي ذﻛﺮ ﺷﺪه)ﻧﺴﻠﻬﺎ ،ﻧﻘﺎط اﻣﻦ ،و ﻫﺎﻳﺠﻚ ﻛﺮدن( Garbage Collector ،از ﺑﻌﻀﻲ از ﻣﻜﺎﻧﻴـﺴﻤﻬﺎي اﺿﺎﻓﻲ دﻳﮕﺮي ﻧﻴﺰ اﺳﺘﻔﺎده ﻣﻴﻜﻨﺪ ﻛﻪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﺑﺎزدﻫﻲ آن ﻣﻴﺸﻮد.
اﺷﻴﺎي ﺑﺰرگ: ﻓﻘﻂ ﻳﻚ ﻧﻜﺘﻪ ﻗﺎﺑﻞ ذﻛﺮ دﻳﮕﺮ ﻛﻪ ﺑﺎﻋﺚ اﻓﺰاﻳﺶ ﺳﺮﻋﺖ و ﺑﺎزدﻫﻲ ﺑﻬﺘﺮ ﻣﻴﺸﻮد ﺑﺎﻗﻲ ﻣﺎﻧﺪه اﺳﺖ .ﻫﺮ ﺷﻴﺊ ﻛﻪ 85000ﺑﺎﻳـﺖ ﻳـﺎ ﺑﻴـﺸﺘﺮ ﻓﻀﺎي ﺣﺎﻓﻈﻪ را اﺷﻐﺎل ﻛﻨﺪ ﻳﻚ ﺷﻴﺊ ﺑﺰرگ در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮد .اﺷﻴﺎي ﺑﺰرگ در ﻳﻚ heapوﻳﮋه اﺷـﻴﺎي ﺑـﺰرگ ﻗـﺮار ﻣﻴﮕﻴﺮﻧـﺪ. اﺷﻴﺎي درون اﻳﻦ heapﻣﺎﻧﻨﺪ اﺷﻴﺎي ﻛﻮﭼﻚ )ﻛﻪ راﺟﻊ ﺑﻪ آﻧﻬﺎ ﺻﺤﺒﺖ ﺷﺪ( finalizeو آزاد ﻣﻴﺸﻮﻧﺪ .ﺑﺎ اﻳﻦ وﺟﻮد اﻳﻦ اﺷـﻴﺎ ﻫﻴﭻ وﻗﺖ ﺗﺤﺖ ﻓﺸﺮده ﺳﺎزي ﻗﺮار ﻧﻤﻲ ﮔﻴﺮﻧﺪ زﻳﺮا ﺷﻴﻔﺖ دادن 85000ﺑﺎﻳـﺖ ﺑـﻼك ﺣﺎﻓﻈـﻪ درون heapﻣﻘـﺪار زﻳـﺎدي از زﻣـﺎن CPUرا ﻫﺪر ﻣﻴﺪﻫﺪ. اﺷﻴﺎي ﺑﺰرگ ﻫﻤﻮاره ﺑﻪ ﻋﻨﻮان ﻧﺴﻞ دو در ﻧﻈﺮ ﮔﺮﻓﺘﻪ ﻣﻴﺸﻮﻧﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ اﺷﻴﺎ ﺑﺎﻳﺪ ﻓﻘﻂ ﺑﺮاي ﻣﻨﺎﺑﻌﻲ ﻛﻪ ﻣﺪت زﻣﺎن زﻳﺎدي در ﺣﺎﻓﻈﻪ ﻣﻲ ﻣﺎﻧﻨﺪ اﻳﺠﺎد ﺷﻮﻧﺪ .ﺗﺨﺼﻴﺺ اﺷﻴﺎﻳﻲ ﻛﻪ داراي ﻃﻮل ﻋﻤﺮ ﻛﻮﺗﺎه ﻫﺴﺘﻨﺪ در ﻗﺴﻤﺖ اﺷﻴﺎي ﺑﺰرگ ﺑﺎﻋﺚ ﻣﻴﺸﻮد ﻛﻪ ﻋﻤﻞ ﺟﻤـﻊ آوري ﻧﺴﻞ دو ﺳﺮﻳﻌﺘﺮ اﻧﺠﺎم ﺷﻮد و اﻳﻦ ﻣﻮرد ﻧﻴﺰ ﺑﻪ ﺑﺎزدﻫﻲ و ﻛﺎراﻳﻲ ﺑﺮﻧﺎﻣﻪ ﺻﺪﻣﻪ وارد ﻣﻴﻜﻨﺪ.
٩٥٠
www.pupuol.com
ﭘﻮﭘﻮﻝ ﻣﺮﺟﻊ ﺩﺍﻧﺸﮕﺎﻩ ﻭ ﻣﺪﺭﺳﻪ
:ﻣﻨﺎﺑﻊ 1) 2) 3) 4) 5) 6) 7)
Wrox Press – Beginning Visual C# 2005 Worx Press – Beginnign Visual Basic .NET 2005 O'Reilly Press – C# Essentials Second Edition Microsoft Press – Microsoft Visual C# .NET Step By Step O'Reilly Press – Learning C# William Pollock – The Book Of Visual Studio .NET Micorosft Press – Applied Microsoft .NET Framework Programming
٩٥١
www.pupuol.com