Professional Documents
Culture Documents
VB6 PDF
VB6 PDF
ﺑﻘﻠﻢ
ﺗﺮآﻲ اﻟﻌﺴﻴﺮي
ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ
اﺑﻨﻚ اﻟﻤﺨﻠﺺ،
Visual Basicﻟﻠﺠﻤﻴﻊ
ﻧﺤﻮ ﺑﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ OOP
اﻟﻄﺒﻌﺔ اﻻوﻟﻰ 2002
* ﺣﻘﻮق آﺘﺎب " Visual Basicﻟﻠﺠﻤﻴﻊ – ﻧﺤﻮ ﺑﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ "OOPﻣﺤﻔﻮﻇﺔ ﻟﻠﻤﺆﻟﻒ وﻻ ﻳﺤﻖ
ﻷي ﺷﺨﺺ او ﺟﻬﺔ رﺳﻤﻴﺔ إﻋﺎدة ﻧﺸﺮ هﺬا اﻟﻜﺘﺎب او ﺟﺰء ﻣﻨﻪ ﺑﺄي وﺳـﻴﻠﺔ دون اﻻذن اﻟﺨﻄـﻲ ﻣـﻦ
اﻟﻤﺆﻟﻒ.
* اﺳﻤﺎء اﻟﺒﺮاﻣﺞ اﻟﻤـﺬآﻮرة ﻓـﻲ هـﺬا اﻟﻜﺘـﺎب ﻣﺜـﻞ Windows ،Visual Basicوﻏﻴﺮهـﺎ هـﻲ ﻋﻼﻣـﺎت
ﺗﺠﺎرﻳﺔ ﻣﺴﺠﻠﺔ ﻻﺻﺤﺎﺑﻬﺎ ،واﻟﻤﺆﻟﻒ ﻳﺤﺘـﺮم هـﺬﻩ اﻟﻌﻼﻣـﺎت وﻳﻘـﺮ ﺑﻬـﺎ ﻟﻤﺎﻟﻴﻜﻬـﺎ ﺳـﻮاء آـﺎﻧﻮا اﻓـﺮاد او
ﺷﺮآﺎت او أي ﺟﻬﺔ ﺗﻨﻈﻴﻤﻴﺔ ،وﻟﻢ ﻳﺘﻢ ذآﺮهﺎ ﻟﻼﺧﺘﺼﺎر.
* ﺗﻢ اﺧﺘﺒﺎر اﻟﻤﺎدة اﻟﻌﻠﻤﻴﺔ ﻓﻲ هﺬا اﻟﻜﺘﺎب واﻟﺘﺤﻘـﻖ ﻣﻨﻬـﺎ وﻣﺮاﺟﻌﺘﻬـﺎ ،اﻻ ان اﻟﻤﺆﻟـﻒ ﻏﻴـﺮ ﻣﺴـﺌﻮل
ﺑﺄي ﺷﻜﻞ ﻣﻦ اﻻﺷﻜﺎل ﻋﻦ اﻻﺿﺮار اﻟﻨﺎﺗﺠﺔ ﺳﻮاء ﺑﺘﻄﺒﻴﻖ اﻟﻤﻌﻠﻮﻣﺎت ﻓﻲ هﺬا اﻟﻜﺘﺎب ،او اﺳـﺘﺨﺪام
اﻻآﻮاد او اﻟﺒﺮاﻣﺞ اﻟﺘﺎﺑﻌﺔ ﻟﻪ.
* ﺟﻤﻴﻊ اﻻراء اﻟﻤﻮﺟﻮدة ﻓﻲ هﺬا اﻟﻜﺘﺎب ﺗﻌﺒﺮ ﻋﻦ رأي اﻟﻤﺆﻟﻒ اﻟﺸﺨﺼﻲ ﺣﺘﻰ ﻟﻮ ﻟﻢ ﺗﻮﺛﻖ ﺑﺎﻣﺜﻠﺔ او
ادﻟﺔ ﺣﺴﻴﺔ.
* اﻟﻜﺘﺎب ﻣﺠﺎﻧﻲ %100وﻻ ﻳﺤﻖ ﻻي ﺷﺨﺺ ﺑﻴﻌﻪ او اﺳﺘﻐﻼﻟﻪ ﺑﺄي ﺷﻜﻞ ﺗﺠﺎري.
اﻟﻤﺤﺘﻮﻳﺎت
ﺷﻜﺮ وﺗﻘﺪﻳﺮ -----------------------------------------------------ا
----------------------------------------------------ب اﻟﻤﻘﺪﻣﺔ
ﺷﻜﺮ وﺗﻘﺪﻳﺮ
اذا آﺎﻧﺖ اﻻﺳﻤﺎء اﻟﺘﺎﻟﻴﺔ ﻻ ﺗﻌﻨﻲ ﻟﻚ ﺷﻴﺌﺎ ،ﻓﻬﻲ ﺗﻌﻨﻲ اﻟﻜﺜﻴﺮ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻲ:
ﻓﻲ اﻟﺒﺪاﻳﺔ اود ان اﺷﻜﺮ ﺟﻤﻴﻊ آﺘﺎب ﻣﻮﻗﻌﻲ اﻟﺴﺎﺑﻖ "اﻟﻰ اﻟﻘﻤﺔ ﻣـﻊ "Visual Basic
ﻣﺒﺘﺪﺋﺎ ﺑﻌﺎﺷـﻖ اﻻﺳـﻤﺒﻠﻲ اﺣﻤـﺪ اﻟﺸـﻤﺮي ،وﻣـﻦ ﻟﻴﺒﻴـﺎ ﻃـﺎرق ﻣﻮﺳـﻰ ،واﻟﻤﺒـﺮﻣﺞ
اﻟﻤﺨﻀﺮم ﺻﺎﻟﺢ اﻟﻐﺎﻣﺪي ،وﺧﺒﻴـﺮ اﻟﻔـﻼش إﻳـﺎد زآـﺮي ،واﻟﺰﻣﻴـﻞ رود ﺳـﺘﻴﻔﻦ ،واﺧـﻲ
ﻋﺒﺪاﷲ اﻟﻌﺴﻴﺮي.
آﻤﺎ اود ان اﺗﻘﺪم ﺑﺎﻟﺸﻜﺮ اﻟﺠﺰﻳﻞ اﻟـﻰ ﺟﻤﻴـﻊ ﻣﺸـﺮﻓﻲ vb4arab.comواﻟـﺬي ﻳﻌﺘﺒـﺮ
اآﺒﺮ ﻣﻮﻗﻊ ﻋﺮﺑﻲ ﻳﺨﺘﺺ ﺑﺎﻟـ ،Visual Basicاﺷﻜﺮ اﻻﺳـﺎﺗﺬة :ﻣﺤﻤـﺪ اﻟﺤﻠﺒـﻲ ،ﻣﺤﻤـﺪ
ﺣﻤﻮد ،ﺣﺴﻦ اﻟﺤﺮﺑﻲ ،وﻟﻴﺪ ﻋﺒﺪاﷲ ،ﻃـﺎرق اﻟﻌﺒﻴـﺪ ،ﻋﺎﺻـﻔﺔ ،ﺻـﺎﻟﺢ اﻟﻌﻨـﺰي ،ﻣﺤﻤـﺪ
اﻟﺪوﺳﺮي ،اوراﻧﻮس ،ﺳﺎهﺮ ،ﺟﺎد واﻟﻤﺆﺳﺲ ﻋﺒﺪاﷲ اﻟﻌﺘﻴﻖ ﻋﻠﻰ آﻞ ﻣﺎ ﻗـﺪﻣﻮﻩ ﻣـﻦ
ﺟﻬﻮد ﺟﺒﺎرة ﻟﻤﺒﺮﻣﺠﻲ Visual Basicاﻟﻌﺮب.
اﺧﺘﺺ ﺑﺎﻟﺸﻜﺮ اﻟﺠﺰﻳﻞ ﻟﻼﺳﺘﺎذ ﺳﺎﻟﻢ اﻟﻤﺎﻟﻜﻲ –ﻣﺸﺮف ﻋﺎم ﺑﻤﻮﻗﻊ -vb4arabﻋﻠـﻰ
ﻣﺮاﺟﻌﺘﻪ اﻟﺪﻗﻴﻘﺔ واﻗﺘﺮاﺣﺎﺗﻪ اﻟﻨﻴـﺮة ﻟﻬـﺬا اﻟﻜﺘـﺎب .واﻻﺳـﺘﺎذ ﻗـﺎروط –ﻣـﺪرس ﻣـﺎدة اﻟــ
JAVAو اﻟـ C++ﺑﺠﺎﻣﻌﺔ اﻟﻤﻠـﻚ ﻓﻬـﺪ ﻟﻠﺒﺘـﺮول واﻟﻤﻌـﺎدن -ﻋﻠـﻰ دروﺳـﻪ اﻟﻘﻮﻳـﺔ ﻓـﻲ
اﺳــﺎﻟﻴﺐ ﺑﺮﻣﺠــﺔ .OOPواﻻﺳــﺘﺎذ دوﻧﻮﻓﺎﻧــﺪ –اﺳــﺘﺎذ ﻓــﻲ ﺑﺮﻧــﺎﻣﺞ اﻟﻠﻐــﺔ اﻻﻧﺠﻠﻴﺰﻳــﺔ
ﺑﺎﻟﺠﺎﻣﻌﺔ -ﻋﻠﻰ ﻣﻘﺮر ﻓـﻦ آﺘﺎﺑـﺔ اﻟﻤﻘـﺎﻻت واﻋـﺪاد اﻟﺘﻘـﺎرﻳﺮ وارﺷـﺎدي ﻟﻄﺮﻳﻘـﺔ ﺗـﺄﻟﻴﻒ
اﻟﻜﺘﺐ .وﺷﻜﺮ ﺟﺰﻳﻞ اﻟﻰ اﺳﻄﻮرة اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﺴـﻴﺪ ﺑـﺮوس ﻣـﺎآﻴﻨﻲ –ﻣﺆﻟـﻒ آﺘـﺎب
-Hardcore Visual Basicﻋﻠﻰ اﻻذن واﻟﺴـﻤﺎح ﻟـﻲ ﺑﺘﺮﺟﻤـﺔ ﺑﻌـﺾ اﻟﻤﻘﺘﻄﻔـﺎت ﻣـﻦ
آﺘﺎﺑﻪ وﺗﻄﺒﻴﻖ اآﻮادﻩ اﻻﺣﺘﺮاﻓﻴﺔ.
وﻻ اﻧﺴﻰ ﺷـﻜﺮ اﻟـﺰﻣﻼء ﻓﻬـﺪ اﻟﻌﻤﻴـﺮ ،ﻋﺒـﺪاﷲ اﻟﻘﺤﻄـﺎﻧﻲ ،ﺳـﻌﺪ اﻟﺪوﺳـﺮي وﻧـﺎﻳﻒ
اﻟﻌﺘﻴﺒﻲ ﻋﻠﻰ اﺧﺘﺒﺎراﺗﻬﻢ اﻟﻘﻮﻳﺔ ﻻآﻮاد ﺑﺮاﻣﺠﻲ وﺗﺼﺤﻴﺢ ﻣﻌﻈﻢ اﺧﻄﺎﺋﻬﺎ.
واذا آﺎن ﺷﻜﺮ آﻞ هﺆﻻء ﻓﻲ آﻔـﺔ ،ﻓـﺎن ﺷـﻜﺮ اﻋـﺰ واﻏﻠـﻰ اﻟﺒﺸـﺮ ﻋﻨـﺪي ﻓـﻲ آﻔـﺔ
اﺧﺮى .اﻣﻲ واﺑﻲ اﺷﻜﺮآﻤﺎ ﻋﻠﻰ آﻞ ﻣﺎ ﻗﺪﻣﺘﻮﻩ ﻟﻲ ﻓﻲ ﺣﻴﺎﺗﻲ.
واﺧﻴﺮا ،اﺗﻤﻨﻰ ان ﺗﺴﺘﻤﻌﻮا ﺑﻘﺮاءة هﺬا اﻟﻜﺘﺎب واﺳﺄل اﷲ ﺳﺒﺤﺎﻧﻪ وﺗﻌﺎﻟﻰ ان ﻳﺠﻌﻠـﻪ
ﻣﻦ اﻟﻌﻠﻢ اﻟﺬي ﻳﻨﺘﻔﻊ ﺑﻪ اﻧﻪ ﺳﻤﻴﻊ ﻣﺠﻴﺐ اﻟﺪﻋﻮات.
ب
اﻟﻤﻘﺪﻣﺔ
رﺣﻠﺔ ﻋﺸﺮ ﺳﻨﻮات ﻣﻦ ﻋﻤﺮ اﻻﻧﺴﺎن ﻟﻴﺴﺖ آﺮﺣﻠﺔ ﺳﻴﺎﺣﻴﺔ ﺗﺨﺘﻔـﻲ ﺁﺛﺎرهـﺎ ﺑﻤﺠـﺮد
اﻟﻌﻮدة اﻟﻰ اﻟﻤﻜﺘﺐ ﻓﻲ اﻟﻌﻤﻞ ،ﻓﻬﻲ رﺣﻠﺔ ﻃﻮﻳﻠﺔ ﺻـﺎﺣﺒﺘﻬﺎ ﻗـﺮاءات ﻵﻻف اﻟﺼـﻔﺤﺎت
وﺳﻬﺮات ﺑﻌﺪد اﻟﻨﺠﻮم اﻟﺘﻲ آﻨﺖ اراهﺎ ﺑﻌﺪ اﻧﺼﺎف اﻟﻠﻴـﺎﻟﻲ ﺑﺎﺳـﻄﺎ ﻳـﺪي ﻋﻠـﻰ ﻟﻮﺣـﺔ
اﻟﻤﻔﺎﺗﻴﺢ ،ﻣﺘﻮﻏﻼ ﻓﻲ ﺻﺮاﻋﺎت ﻣﻊ اﻟﺴﺎﺣﺮ اﻟﺬي اﺣﺒﺒﺘﻪ وآﺮهﺘﻪ .Visual Basic
ﻋﻼﻗﺔ اﻟﺤﺐ واﻟﻜﺮﻩ ﻟﻴﺴﺖ ﻋﻼﻗﺔ ﺧﻴﺎﻟﻴﺔ آﻤﺎ ﺗﺴﻄﺮهﺎ ﺧﺰﻋﺒﻼت واﺳﺎﻃﻴﺮ اﻟﻌﺸـﺎق،
ﻓﻤﻨﺬ اﻻﺻﺪار VB1ﺑﺪأ ﻗﻠﺒﻲ ﻳﺨﻔﻖ اﻟﻰ ﺗﻠﻚ اﻟﻠﻐﺔ –ﻣﺒـﺪﺋﻴﺎ -ﺑﺴـﺒﺐ ﻣﺼـﻤﻢ اﻟﻨﻤـﺎذج
Form Designerاﻟﺬي ﺳﺎهﻢ ﻓﻲ ﻧﺴـﻴﺎن اواﻣـﺮ اﻟﻤﺨﺮﺟـﺎت Locate ،Printو Color
ﻟﻜﺘﺎﺑﺔ ﻣﺌﺎت اﻻﺳﻄﺮ -اﺷـﺒﻪ ﺑﺎﻟﻤﺨﻄﻮﻃـﺎت اﻟﻔﺮﻋﻮﻧﻴـﺔ -واﻟﺨﺎﺻـﺔ ﺑﺘﺼـﻤﻴﻢ اﻟﻮاﺟﻬـﺎت.
وﻟﻜﻦ ﻣﺎ ان ﻟﺒﺜﺖ اﻟﻌﻼﻗﺔ اﻟﻐﺮاﻣﻴﺔ ﺑﺎﻻﺷﺘﻌﺎل ،ﺣﺘﻰ ﺑﺪأ ﺷﺮﻳﺎن اﻟﻜﺮﻩ ﻟـ Visual Basic
ﻳﻨﻤﻮ ﺷﻴﺌﺎ ﻓﺸﻴﺌﺎ ﺑﺴـﺒﺐ ﻗﺼـﻮر Visual Basicوﺿـﻌﻔﻪ -اﻟﻌـﺎﺟﺰ ﻋـﻦ اﻟﻤﺮاوﻏـﺔ -ﻋﻨـﺪ
اﻟﺘﺤﺪث ﻋﻦ ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ .BASICاﻻ ان ﻋﻼﻗﺔ اﻟﺤﺐ ﺗﻄﻐﻰ ﻋﻠـﻰ ﻋﻼﻗـﺔ اﻟﻜـﺮﻩ ﻣـﻦ
ﺟﺪﻳﺪ آﻠﻤﺎ اﺳﺘﺨﺪم ﻣﺆﺷﺮ اﻟﻔﺄرة Mouseﻋﺎﺋﺪا ﻟﺘﺼﻤﻴﻢ اﻟﻮاﺟﻬﺎت ﺑﻤﺼـﻤﻢ اﻟﻨﻤـﺎذج،
وﺗﻄﻐﻰ ﻋﻼﻗﺔ اﻟﻜﺮﻩ ﻣﺮة اﺧﺮى ﺣـﻴﻦ اﺳـﺘﺨﺪام ﻟﻮﺣـﺔ اﻟﻤﻔـﺎﺗﻴﺢ وآﺘﺎﺑـﺔ اﻻآـﻮاد ﻓـﻲ
ﻧﺎﻓﺬة ﻣﺤﺮر اﻻآﻮاد .Code Window
وآﻤﺎ ﻳﻘﻮﻟـﻮن "اﻟﺤﻴـﺎة ﺗﺠـﺎرب" ،ﻓﺒﻌـﺪ ﻋﺸـﺮ ﺳـﻨﻮات ﻣـﻦ اﻟﺒﺮﻣﺠـﺔ ﺑــ ،Visual Basic
اآﺘﺸﻔﺖ ان اﻟﻜﻠﻤﺎت -اﻟﺘﻲ ﺑﺪأت ﺑﻬﺎ ﻣﻘﺪﻣﺘﻲ -ﻻ اﺳﺎس ﻟﻬﺎ ﻣﻦ اﻟﺼﺤﺔ! ﻓـ Visual
Basicﻳﻤﻜﻨﻚ ﻣﻦ ﺗﺼﻤﻴﻢ ﻧﻮاﻓﺬ ﺗﻀـﻊ ﻋﻠﻴﻬـﺎ ازرار Buttonsوﺧﺎﻧـﺎت ﻧـﺺ ،TextBoxes
آﻤﺎ ﻳﻤﻜﻨﻚ ﻣﻦ اﻻﺗﺼﺎل ﺑﻘﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت DataBasesﻟﺤﻔـﻆ اﻟﺒﻴﺎﻧـﺎت ﻋﻠـﻰ اﻻﻗـﺮاص،
وهﺬا ﺑﺤﺪ ذاﺗﻪ ﻳﻠﺒﻲ رﻏﺒﺔ ﺁﻻف –ان ﻟﻢ ﻳﻜﻦ ﻣﻼﻳﻴﻦ -اﻟﻤﺒﺮﻣﺠﻴﻦ ﺣﻮل اﻟﻌﺎﻟﻢ ﻟﻴﻘﺘﻨﻌـﻮا
ان Visual Basicاﻓﻀﻞ ﻣﻨﺼﺔ ﺗﻄﻮﻳﺮ اﻟﺘﻄﺒﻴﻘﺎت ﻋﻠﻰ ﻣﺪى اﻟﺘﺎرﻳﺦ.
ﻣﻦ ﻧﺎﺣﻴﺔ اﺧﺮى ،ﻻ ﻳﻤﻜﻨﻚ Visual Basicﻣـﻦ ادارة اﻟـﺬاآﺮة Memory Management
ﺑﻄﺮﻳﻘــﺔ ﺳــﻬﻠﺔ –ﻣﻘﻨﻌــﺔ ﻟﻠﻤﺒــﺮﻣﺠﻴﻦ -وذﻟــﻚ ﺑﺴــﺒﺐ ﺿــﻌﻒ ﺗﻌﺎﻣﻠــﻪ ﻣــﻊ اﻟﻤﺆﺷــﺮات
،Pointersو ﻋﻨﺪ اﻟﺤﺪﻳﺚ ﻋﻦ اﻟﻤﺸﺎرﻳﻊ اﻟﻌﻤﻼﻗﺔ ،ﻓﻄﺎﻗـﺔ Visual Basicﻻ ﺗﺴـﺘﻮﻋﺐ
اآﻮاد ﺣﺠﻤﻬﺎ اآﺜﺮ ﻣـﻦ K64ﻓـﻲ ﻧﺎﻓـﺬة ﻧﻤـﻮذج واﺣـﺪة او اﺟـﺮاء واﺣـﺪ ،وهـﺬا اﻟﻘﺼـﻮر
ﻳﻜﻔﻲ ان ﻳﺠﻌﻞ Visual Basicاﺳﻮأ ﻣﻨﺼـﺔ ﺗﻄـﻮﻳﺮ اﻟﺘﻄﺒﻴﻘـﺎت ﻓـﻲ ﻧﻈـﺮ ﺁﻻف –ان ﻟـﻢ
ﻳﻜﻦ ﻣﻼﻳﻴﻦ -اﻟﻤﺒﺮﻣﺠﻴﻦ ﺣﻮل اﻟﻌﺎﻟﻢ اﻳﻀﺎ!
إﻻ ان اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﻤﻮاﻟﻴﻦ ﻟــ Visual Basicﻗـﺪﻣﻮا ﻋﺸـﺮات اﻟﺤﻠـﻮل ﻟﻤﺤﺎوﻟـﺔ ﺗﻐﻄﻴـﺔ
واﻻﻟﺘﻔﺎف ﺣﻮل ﻗﺼﻮر اﻟﻠﻐﺔ ﻓﻲ اﻟﻘﻀـﺎﻳﺎ اﻟﺴـﺎﺑﻘﺔ ،واﻟﻤﺒـﺮﻣﺠﻴﻦ اﻟﻤﻌـﺎدﻳﻦ ﻟــ Visual
Basicاﺛﺒﺘﻮا ان ﺗﻠﻚ اﻟﺤﻠﻮل ﻗﺪ أﻋﻤﺖ اﻟﻘﺼـﻮر ﺑـﺪﻻ ﻣـﻦ ﺗﻜﺤﻴﻠﻬـﺎ ،ﻓﻬـﻲ ﻗـﺪ اﺿـﻌﻔﺖ
آﻔﺎءة اﻟﺘﻨﻔﻴﺬ وزادت اﻻآﻮاد ﺗﻌﻘﻴﺪا.
ج
اﻣﺎ اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﻤﺤﺎﻳﺪﻳﻦ –واﻟﻤﺆﻟﻒ ﺑﻴﻦ ﺻﻔﻮﻓﻬﻢ -ﻳﻘﻮﻟﻮن ﻟﻚ ﺑﻜـﻞ اﺧﺘﺼـﺎر :اذا آـﺎن
Visual Basicﻳﻘﺪم ﻟﻚ ﺣﻠﻮل ﻟﻤﺸﺎآﻠﻚ ،ﻓﻜﻦ ﻣﺒﺮﻣﺞ ،Visual Basicواذا آﺎن Visual
Basicﻻ ﻳﻘﺪم ﻟﻚ ﺣﻠﻮل ﻟﻤﺸﺎآﻠﻚ ،ﻓﻼ ﺗﻜﻦ ﻣﺒﺮﻣﺞ .Visual Basic
وﻣﻦ ﻣﻨﻄﻠﻖ اﻟﻤﺤﺎﻳﺪة ،اﻗﺪم ﻟﻚ هﺬا اﻟﻜﺘﺎب ﻟﻴﺸﺮح ﻟـﻚ اﻟﺒﺮﻣﺠـﺔ ﺑﺎﺳـﺘﺨﺪام Visual
Basicوﻟﻦ اﺗﻌﺪى هـﺬا اﻟﻨﻄـﺎق اﺑـﺪا ،ﻓـﻼ ﺗﺘﻮﻗـﻊ ﻓﺼـﻮل –ﻣﻀـﻴﻌﺔ ﻟﻠﻮﻗـﺖ -ﺗﻘـﺎرن ﻟـﻚ
Visual Basicﻣﻊ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻻﺧﺮى ،او ﻣﺎدﺣﺔ Visual Basicآﻠﻐـﺔ ﺑﺮﻣﺠـﺔ اﻟﻌﻘـﺪ
اﻻﺧﻴـﺮ ،او ﻣﻈﻬـﺮة ﻋﻴـﻮب Visual Basicﺣﺘـﻰ ﺗﺸـﻮﻩ ﺳـﻤﻌﺘﻪ .ﻓﻬـﺬا اﻟﻜﺘـﺎب ﻳﺤـﺎول
ﺗﺸﻴﻴﺪ ﺑﻨﻴﺔ ﻗﻮﻳﺔ ﻟﻚ ﺣﺘﻰ ﺗﻤﻜﻨﻚ ﻣﻦ اﻻﻧﻄﻼق ﻓﻲ ﺑﺮﻣﺠﺔ Visual Basicﻣـﻦ اوﺳـﻊ
اﺑﻮاﺑﻪ.
ﻟﻠﻤﺒﺘﺪﺋﻴﻦ :ﻓﻬﻮ ﻳﻌﺮﻓﻬﻢ ﻋﻠـﻰ Visual Basicوﺑﻴﺌـﺔ اﻟﺘﻄـﻮﻳﺮ اﻟﻤﺘﻜﺎﻣﻠـﺔ اﻟﺨﺎﺻـﺔ ﺑـﻪ،
وﻳﺸـﺮح ﻟﻬـﻢ آـﻞ ﻣــﺎ ﻳﺤﺘﺎﺟﻮﻧـﻪ ﻟﻠﺒﺮﻣﺠــﺔ اﻟﻔﻌﻠﻴـﺔ ﺑـــ Visual Basicآﺸــﺮح اﻟﻨﻤــﺎذج
واﻻدوات ،ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ ،BASICﺣﻠﻮل ﻟﻤﺸﺎآﻠﻬﻢ اﻟﻴﻮﻣﻴـﺔ وزﻳـﺎدة ﺛﻘـﺎﻓﺘﻬﻢ اﻟﺒﺮﻣﺠﻴـﺔ
ﺑﺘﻘﺪﻳﻢ ﻣﻔﻬﻮم اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ OOPوﺗﻄﺒﻴﻘﻬﺎ ﺑـ .Visual Basic
ﻟﻠﻤﺘﻮﺳﻄﻴﻦ :ﻓﻬﻮ ﻳﺤﻘﻖ ﻟﻬﻢ ﻗﻔـﺰة ﻧﻮﻋﻴـﺔ اﻟـﻰ ﻣﻮاﺿـﻴﻊ ﻣﺘﻘﺪﻣـﺔ آﺒﺮﻣﺠـﺔ ﻗﻮاﻋـﺪ
اﻟﺒﻴﺎﻧــﺎت ،DataBasesﺗﻄﺒﻴﻘــﺎت ﻣﺘﻘﺪﻣــﺔ ﻋﻠــﻰ اﻟﻨﻤــﺎذج ،ﻗﻀــﺎﻳﺎ ﺣــﻮل اﺟــﺮاءات API
وﺑﺮﻣﺠﺔ اﻟﻤﻜﻮﻧﺎت COMواﻟﻤﻜﻮﻧﺎت اﻟﻤﻮزﻋﺔ .DCOM
ﻟﻠﻤﺘﻘﺪﻣﻴﻦ :هﺬا اﻟﻜﺘﺎب ﻻﻳﻘﺪم ﻟﻠﻤﺘﻘﺪﻣﻴﻦ ﺳﻮى اﻋـﺎدة اﻧﻌـﺎش Refreshذاآـﺮﺗﻬﻢ
ﻟﻤﻮاﺿﻴﻊ ﺑﺮﻣﺠﻴﺔ ﺧﺎﺻﺔ ﺑـ ،Visual Basicواﻟﺴﺒﺐ اﻟﺬي ﻳﺠﻌﻞ هﺬا اﻟﻜﺘﺎب ﻣﻮﺟﻪ ﻟﻬﻢ
ﻻ ﻳﻌﺪو ان ﻳﻜﻮن اﻻ ﺳﺒﺐ ﺷﺨﺼﻲ ﻟﻠﻤﺆﻟﻒ ،وهﻲ زﻳﺎدة اﻟﺜﻘﺔ ﺑﻨﻔﺴﻪ ﻋﻨﺪﻣﺎ ﻳﻌﻠﻢ ان
ﻣﺒﺮﻣﺠﻲ Visual Basicاﻟﻤﺘﻘﺪﻣﻴﻦ ﻗﺪ اﻋﺤﺒﻮا ﻓﻲ آﺘﺎﺑﻪ.
د
ﻧﻘﻄﺔ اﺧﺮى اود ﺗﻮﺿﻴﺤﻬﺎ هﻲ ان هـﺬا اﻟﻜﺘـﺎب ﻟـﻴﺲ ﻣﺮﺟـﻊ Referenceﻣـﻦ ﻣﺮاﺟـﻊ
MSDNﺗﺮﺟﻢ اﻟﻰ اﻟﻠﻐﺔ اﻟﻌﺮﺑﻴﺔ .ﻓـﻼ ﺗﺘﻮﻗـﻊ ان اﻗـﻮم ﺑﺸـﺮح ﺟﻤﻴـﻊ اﻟﺜﻮاﺑـﺖ ،اﻟـﺪوال،
اﻟﻜﺎﺋﻨﺎت ....اﻟﺦ ﺷﺮﺣﺎ ﺗﻔﺼﻴﻠﻴﺎ ،وذﻟﻚ ﻻﻧﻨﻲ ارﻳﺪ ان اﻧﺘﻬﻲ ﻣﻦ آﺘﺎﺑﺔ اﻟﻜﺘﺎب ﻗﺒـﻞ ان
ﺗﺸــﻴﺐ ﺷــﻌﺮات رأﺳــﻲ .ﻣــﻊ ذﻟــﻚ ،ﺗﻌﺮﺿــﺖ –ﺑﺎﺧﺘﺼــﺎر -ﻟﻤﺌــﺎت اﻟــﺪوال ،اﻟﺨﺼــﺎﺋﺺ،
اﻟﻜﺎﺋﻨﺎت ....اﻟﺦ ﺑﻴﻦ ﺻﻔﺤﺎت هﺬا اﻟﻜﺘﺎب .ﻟﺬﻟﻚ ،ارﺟﻮ ﻣﻨﻚ اﻟﺤﺼﻮل ﻓﻲ اﻗـﺮب ﻓﺮﺻـﺔ
ﻋﻠﻰ ﻧﺴﺨﺔ ﻣﻦ اﺳﻄﻮاﻧﺔ ﻣﻜﺘﺒﺔ MSDNﻟﻠﺤﺼـﻮل ﻋﻠـﻰ اﻟﺘﻌﻠﻴﻤـﺎت اﻟﻔﻮرﻳـﺔ واﻟـﺪﻋﻢ
اﻟﻔﻨﻲ اﻟﻼزم ﻟﻠﺘﻮﻏﻞ ﻓﻲ ﺗﻔﺎﺻﻴﻞ ﺟﻤﻴﻊ اﻟﺪوال ،اﻟﻜﺎﺋﻨﺎت واﻋﻀـﺎﺋﻬﺎ ،اﻟﺜﻮاﺑـﺖ ....اﻟـﺦ
ﻗﺒﻞ ان ﺗﺒﺪأ ﺑﻘﺮاءة اﻟﻜﺘﺎب.
ﻣﻮاﺿﻴﻊ اﻟﻜﺘﺎب
ﺻﻔﺤﺔ اﻟﻤﺤﺘﻮﻳﺎت اﻋﻄﺘﻚ ﻓﻜﺮة ﻋﺎﻣﺔ ﻋﻦ ﻣﻮاﺿﻴﻊ اﻟﻜﺘﺎب ،وهﻨﺎ اﻋﻄﻴﻚ ﻣﻠﺨﺺ ﻻﺟﺰاء
اﻟﻜﺘﺎب اﻻرﺑﻌﺔ:
آﻠﻤﺔ اﺧﻴﺮة
ﺑﺎﻻﻋﺘﻤﺎد ﻋﻠﻰ ﻣﺠﻬـﻮدي ،ﻓﺎﻧـﻪ ﻳﺴـﺘﺤﻴﻞ ﻋﻠـﻲ آﺘﺎﺑـﺔ وﻟـﻮ ﺣـﺮف واﺣـﺪ ﻣـﻦ ﺣـﺮوف
اﻟﻜﺘﺎب ان ﻟﻢ ﻳﻜﺘﺐ اﷲ ﺳﺒﺤﺎﻧﻪ وﺗﻌﺎﻟﻰ اﻟﺘﻮﻓﻴﻖ اوﻻ واﺧﻴﺮا ﻻﺗﻤﺎﻣﻪ .ﻣـﺎ اود ان اﻗﻮﻟـﻪ
ﻟــﻚ ﻋﺰﻳــﺰي اﻟﻘــﺎرئ ،ان اﻟﻜﺘــﺎب اﻟــﺬي اﻣــﺎم ﻋﻴﻨﻴــﻚ ﻗــﺪ آﻠﻔﻨــﻲ اﻟﻜﺜﻴــﺮ واﻟﻜﺜﻴــﺮ ﻣــﻦ
اﻟﻤﺠﻬﻮد اﻟﻌﻘﻠﻲ واﻟﺒﺪﻧﻲ وﻣﺌﺎت ﻣﻦ ﺳـﺎﻋﺎت ﻋﻤـﺮي ﻣﺤـﺎوﻻ ﺗﻘـﺪﻳﻢ ﺷـﺊ ﻟﻠﻤﻜﺘﺒـﺔ
اﻟﻌﺮﺑﻴﺔ اﻻﻟﻜﺘﺮوﻧﻴﺔ ﻣﻦ ﺧﻼﻟﻪ .اذا آﺎن اﻟﺘﻔﻜﻴﺮ ﻓﻲ ﻧﺠﺎح هﺬا اﻟﻜﺘﺎب اﻣﺮ ﺑﻌﻴﺪ اﻟﻤـﺪى،
ﻓﺤﺴﺒﻲ ان ﻻ ﻳﻔﺸﻞ ،وان ﻓﺸـﻞ ﻓﻠـﻴﺲ ﻟـﻲ ﺳـﻮى ان أﻋـﻮد اﻟـﻰ آﺮاﺳـﻲ اﻟﻘـﺮاء
ﺑﺎﺣﺜﺎ ﻋﻦ ﻣﺆﻟﻒ ﻋﺮﺑﻲ ﻓﻲ ﻣﻨﺼﺔ اﻟﻜﺘﺎب ﻳﺮﺷﺪﻧﻲ اﻟﻰ ﺿـﺎﻟﺘﻲ ﻓـﻲ ﻣﻮاﺟﻬـﺔ اﻟﻌﺼـﺮ
اﻟﺤﺎﻟﻲ ﻟﺘﻘﻨﻴﺔ اﻟﻤﻌﻠﻮﻣﺎت.
اﺧﻴﺮا ،اود ان اﻋﺘﺬر ﺷﺪﻳﺪ اﻻﻋﺘﺬار ﻋﻦ ﻋﺪم ارﻓﺎق ﺑﺮﻳﺪي اﻻﻟﻜﺘﺮوﻧـﻲ ﻋﻠـﻰ ﺻـﻔﺤﺎت
اﻟﻜﺘﺎب -ﻻﺳﺒﺎب ﺷﺨﺼﻴﺔ -رﻏﻢ اﻧﻨﻲ ﻟﺴﺖ ﻣﻠﺰم ﺑﺎرﻓﺎﻗﻪ ﻃﺎﻟﻤﺎ آﻮﻧـﻪ آﺘـﺎب ﻣﺠـﺎﻧﻲ
ﻟﻠﺠﻤﻴﻊ ،ﻓﻼ ﺗﺘﻮﻗﻊ دﻋﻤﺎ ﻓﻨﻴﺎ ﻣﻨﻲ .آﻤﺎ ارﺟﻮ ان ﻻ ﺗﺤﺎول اﻟﻐﺎء اﺳـﻤﻲ ﻣـﻦ ﺻـﻔﺤﺎت
اﻟﻜﺘﺎب واﺳـﺘﺒﺪاﻟﻪ ﺑﺎﺳـﻤﻚ او اﺳـﻢ ﺷـﺨﺺ ﻋﺰﻳـﺰ ﻋﻠـﻰ ﻗﻠﺒـﻚ ،ﻓـﺎن ذﻟـﻚ ﻻ ﻳﺮﺳـﻢ
اﻻﺑﺘﺴﺎﻣﺔ ﻋﻠﻰ ﺷﻔﺘﺎي.
ﺗﺮآﻲ اﻟﻌﺴﻴﺮي
اﻟﻈﻬﺮان – ﻳﻨﺎﻳﺮ 2002
اﻟﺠﺰء اﻻول
اﻻﺳﺎﺳﻴﺎت
2
اﻟﻔﺼﻞ اﻻول
ﺗﻌﺮف ﻋﻠﻰ Visual Basic
ﺑﺴﻢ اﷲ ﻧﺒﺪأ وﻋﻠﻰ ﺑﺮآﺘﻪ ﻧﺴﻴﺮ ﻣﻊ اﻟﺠﻤﻠﺔ .Visual Basicﺗﺨﺘﻠﻒ وﺟﻬﺎت اﻟﻨﻈﺮ ﺑﻴﻦ
اﻟﻤﺒﺮﻣﺠﻴﻦ ﺣـﻮل ﺗﻌﺮﻳـﻒ او ﺗﺼـﻨﻴﻒ ،Visual Basicهـﻞ Visual Basicﻟﻐـﺔ ﺑﺮﻣﺠـﺔ ام
ﺑﺮﻧﺎﻣﺞ ﺗﺼﻤﻴﻢ ﻧﻮاﻓـﺬ ام ﻣﻨـﺘﺞ ﻣﺘﻜﺎﻣـﻞ؟ ﺗﻘﻨﻴـﺎ Visual Basic ،ﻋﺒـﺎرة ﻋـﻦ ﻣﻜﺘﺒـﺔ ﻣـﻦ
اﻟﻤﻜﺘﺒﺎت ﺗﻮﻓﺮ ﻋﺪة اواﻣﺮ ﺑﺮﻣﺠﻴﺔ ﻣﺘﻜﺎﻣﻠﺔ ﻣﻊ اﺑﻨﺘﻬـﺎ – Visual Basic for Application
ﺗﺨﺘﺼﺮ .VBAاﻻ ان اﻟﻤﺘﻌﺎرف ﻋﻠﻴﻪ ﺑﻴﻦ اﻟﻤﺒـﺮﻣﺠﻴﻦ هـﻮ ان Visual Basicﻟﻐـﺔ ﺑﺮﻣﺠـﺔ
وﺑﺮﻧﺎﻣﺞ ﺗﺼﻤﻴﻢ ﻧﻮاﻓﺬ وﻣﻜﺘﺒﺎت ﺗﺸﻐﻴﻠﻴﺔ ،أي ﺑﺎﺧﺘﺼﺎر هﻮ ﻣﻨﺘﺞ ﻣﺘﻜﺎﻣﻞ .ﻟﺬﻟﻚ ،ﻋﻨﺪﻣﺎ
اﺗﺤﺪث ﻋﻦ Visual Basicﻓﻲ هﺬا اﻟﻜﺘﺎب ﻓﺎﻧﻨﻲ اﻗﺼﺪ ﺟﻤﻴﻊ اﻟﺘﻌﺮﻳﻔﺎت اﻟﺴﺎﺑﻘﺔ ،ﻓﻠﻮ
ذآﺮت ﻣﺰاﻳﺎ ﻟﻐﺔ Visual Basicﻓـﺎﻧﻨﻲ اﻗﺼـﺪ اﻟﻠﻐـﺔ اﻟﺤﻨﻮﻧـﺔ ،BASICوﻟـﻮ ﺗﺤـﺪﺛﺖ ﻋـﻦ
دوال واﺟﺮاءات Visual Basicﻓﺎﻧﻨﻲ اﻟﻤﺢ اﻟﻰ ﻣﻜﺘﺒﺎت Visual Basicاﻟﺘﺸـﻐﻴﻠﻴﺔ ،وﻟـﻮ
ﺗﻄﺮﻗﺖ اﻟﻰ ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ اﻟﻤﺘﻜﺎﻣﻠﺔ ﻟـ – Visual Basicآﻤﺎ ﻓﻲ اﻟﻔﻘـﺮة اﻟﺘﺎﻟﻴـﺔ -ﻓـﺎﻧﻨﻲ
اﻗﺼﺪ ﺑﺮﻧﺎﻣﺞ ﺗﺼﻤﻴﻢ اﻟﻨﻮاﻓﺬ.
اذا آﻨﺖ ﺟﺪﻳﺪا ﻋﻠﻰ هﺬﻩ اﻟﺒﻴﺌﺔ –أي ﻟﻢ ﺗﺴﺘﺨﺪم -VB5ﻓﻤﻦ اﻟﻀﺮوري اﻟـﺘﻤﻌﻦ ﻓـﻲ
آﻠﻤﺎت هﺬا اﻟﻔﺼـﻞ ﺑﺎﻟـﺬات واﻻ ﻓﺎﻧـﻚ ﻟـﻦ ﺗـﺪل اﻟﻄـﺮق اﻟﻤﺆدﻳـﺔ اﻟـﻰ ﺳـﺎﺣﺔ اﻟﻌﻤـﻞ.
اﻟﻄﺮق ﺳﺘﻜﻮن ﻧﻮاﻓﺬ ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ ،واﻟﻌﻤﻞ هﻮ اﻟﺴﺒﺐ اﻟﺬي ﺟﻌﻠﻚ –ﻋﻠﻰ ﻣﺎ اﻋﺘﻘـﺪ-
ﺗﻘﺮأ هﺬا اﻟﻜﺘﺎب.
آﻤﺎ ﺗﻼﺣﻆ ﻓﻲ ﺷﻜﻞ ،1-1ﺗﺤﺘﻮي ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ ﻋﻠﻰ اﻟﻜﺜﻴﺮ ﻣـﻦ اﻟﻨﻮاﻓـﺬ اﻟﻤﺤﻀـﻮﻧﺔ
ﺑﻬــﺎ Child Windowsواﻟﻌﺪﻳــﺪ ﻣــﻦ اﻟﻘــﻮاﺋﻢ Menusوﻣﺠﻤﻮﻋــﺎت ﻣــﻦ اﻻزرار ﺗــﺪﻋﻰ
اﺷﺮﻃﺔ اﻻدوات ،Toolbarsواﻟﻴﻚ ﻳﺎ ﺳﻴﺪي ﺗﻔﺎﺻﻴﻠﻬﺎ:
إذا ﻟﻢ ﻳﺮق ﻟﻚ هﺬا اﻟﺘﻐﻴﻴﺮ ،واردت اﻟﻌﻮدة إﻟﻰ اﻟﻮﺿﻊ اﻟﺴﺎﺑﻖ ،ﻓﺎﺧﺘﺮ ﻣﻼﺣﻈﺔ:
اﻷﻣﺮ … Optionsﻣﻦ ﻗﺎﺋﻤﺔ ،Toolsوﻣﻦ ﻣﺮﺑﻊ اﻟﺤﻮار اﻟﺬي ﻳﻈﻬﺮ
اﻣﺎﻣﻚ اﺧﺘﺮ ﺗﺒﻮﻳﺐ ُ ،Environmentواﻧﻘﺮ ﻋﻠﻰ اﻟﺨﻴﺎر Prompt for
.project
اذا آــﺎن ﻋــﺪد اﻻدوات اﻟﻤﻮﺟــﻮدة ﻓــﻲ ﺻــﻨﺪوق اﻻدوات آﺒﻴــﺮا ﺟــﺪا ،ﻓﻴﻔﻀــﻞ ان ﺗﻘــﻮم
ﺑﻌﻤﻠﻴﺔ ﺗﻘﺴﻴﻢ اﻻدوات اﻟﻰ ﻣﺠﻤﻮﻋـﺎت ﺗﺨﺘﻔـﻲ وﺗﻈﻬـﺮ ﻣﺘـﻰ ﻣـﺎ ﺷـﺌﺖ ﻋـﻦ ﻃﺮﻳـﻖ
اﻟﻨﻘﺮ ﺑﺰر اﻟﻔـﺄرة اﻻﻳﻤـﻦ ﻋﻠـﻰ ﻧﺎﻓـﺬة ﺻـﻨﺪوق اﻻدوات واﺧﺘﻴـﺎر اﻻﻣـﺮ … Add Tabﻣـﻦ
اﻟﻘﺎﺋﻤـﺔ اﻟﻤﻨﺴــﺪﻟﺔ وﻣــﻦ ﺛـﻢ آﺘﺎﺑــﺔ اﺳــﻢ اﻟﻤﺠﻤﻮﻋــﺔ .ﻃﺮﻳﻘـﺔ ﺗﻨﻈــﻴﻢ ﻣﺤﺘﻮﻳــﺎت آــﻞ
ﻣﺠﻤﻮﻋﺔ ﺗﺘﺒﻊ اﺳـﻠﻮب اﻟﺴـﺤﺐ واﻻﻟﻘـﺎء Drag & Dropوهـﻮ ﻧﻔـﺲ اﻻﺳـﻠﻮب اﻟـﺬي
ﺗﺘﺒﻌﻪ ﻟﻨﺴﺦ او ﻧﻘﻞ ﻣﻠﻔﺎت ﺟﻬﺎزك .اﺧﻴﺮا ،اذا اردت ﺣﺬف اﻟﻤﺠﻤﻮﻋﺔ ،ﻗﻢ ﺑﺎﻟﻨﻘﺮ ﻋﻠـﻰ
اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ ﺑﺰر اﻟﻔﺄرة اﻻﻳﻤﻦ واﺧﺘﻴﺎر اﻻﻣﺮ Delete Tabﻣﻦ اﻟﻘﺎﺋﻤـﺔ اﻟﻤﻨﺴـﺪﻟﺔ،
ﻣﻊ اﻟﻌﻠﻢ ان اﻟﻤﺠﻤﻮﻋﺔ اﻟﺮﺋﻴﺴﺔ واﻟﺘﻲ ﺗﺴﻤﻰ Generalﻟﻦ ﺗﺘﻤﻜﻦ ﻣﻦ ﺣﺬﻓﻬﺎ.
ﻳﺒﺪو اﻧﻨﻲ ﻧﺴﻴﺖ ﻧﻘﻄﺔ ﻣﻬﻤﺔ وهﻲ آﻴـﻒ ﺗﻌـﺮض ﻧﺎﻓـﺬة ﺻـﻨﺪوق اﻻدوات ﻓـﻲ ﺣﺎﻟـﺔ
اﻏﻼﻗﻬﺎ ،ﻳﺘﻢ ذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﺧﺘﻴﺎر اﻻﻣﺮ Toolboxﻣﻦ اﻟﻘﺎﺋﻤﺔ .View
اﻟﻨﻤﻮذج ،Formﻣﻦ هﺬﻩ اﻟﺨﺼﺎﺋﺺ اﻟﺤﺠﻢ ،اﻟﻤﻮﻗﻊ ،اﻟﻠﻮن ،اﻟﻌﻨﻮان ....اﻟﺦ .اذا آﺎﻧـﺖ
هﺬﻩ اﻟﻨﺎﻓﺬة ﻣﺨﻔﻴﺔ اﺧﺘﺮ اﻻﻣﺮ Properties Windowﻣﻦ ﻗﺎﺋﻤﺔ Viewاو اﺿـﻐﻂ ﻋﻠـﻰ
اﻟﻤﻔﺘﺎح ].[F4
ﻓﻲ اﻋﻠﻰ اﻟﻨﺎﻓﺬة ﻳﻮﺟﺪ ﻗﺎﺋﻤﺔ ﺗﺴﻤﻰ ﻓﻲ ﻋﺎﻟﻢ Visual Basicﺑـﺄداة اﻟــ ComboBox
ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﺪﻳﺪ اﻟﻜﺎﺋﻦ او اﻷداة اﻟﺘﻲ ﺗـﻮد ﻋـﺮض ﺧﺼﺎﺋﺼـﻬﺎ .ﺑﺎﻣﻜﺎﻧـﻚ ﺗﺤﺪﻳـﺪ اﻷداة
ﻣﺒﺎﺷــﺮة ﺑــﺎﻟﻨﻘﺮ ﻋﻠﻴﻬــﺎ -وهــﻲ ﻋﻠــﻰ ﻧﺎﻓــﺬة اﻟﻨﻤــﻮذج -وﺳــﺘﻼﺣﻆ ان ﻣﺤﺘﻮﻳــﺎت ﻧﺎﻓــﺬة
اﻟﺨﺼﺎﺋﺺ ﻗﺪ ﺗﻐﻴﺮت .اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،ﻳﻤﻜﻨﻚ اﺧﺘﻴﺎر ﻃﺮﻳﻘﺔ ﺗﺮﺗﻴـﺐ ﺟـﺪول اﻟﺨﺼـﺎﺋﺺ اﻣـﺎ
ﺗﺮﺗﻴﺐ اﺑﺠﺪي Alphabeticاو ﻣﺼﻨﻒ .Categorizedوﺑﺎﻟﻨﺴـﺒﺔ ﻟﻠﺠـﺪول ،ﻓـﺎن اﻟﻌﻤـﻮد
اﻻﻳﺴﺮ ﻳﻌﺮض ﻟﻚ اﻟﺨﺼﺎﺋﺺ اﻟﻤﺘﻮﻓﺮة ﻟﻸداة اﻣﺎ اﻻﻳﻤﻦ ﻓﻴﻌﺮض ﻗﻴﻤﺔ آﻞ ﺧﺎﺻـﻴﺔ ﻣـﻦ
هﺬﻩ اﻟﺨﺼﺎﺋﺺ .ﺑﻌﺾ اﻟﺨﺼـﺎﺋﺺ ﺗﺴـﺘﻄﻴﻊ ﺗﻌـﺪﻳﻠﻬﺎ ﻣﺒﺎﺷـﺮة ﺑﻜﺘﺎﺑـﺔ ﻗﻴﻤـﺔ ﻋﺪدﻳـﺔ او
ﺣﺮﻓﻴﺔ آـ ،Captionوﺑﻌﻀﻬﺎ ﻋﻠﻴﻚ اﺧﺘﻴﺎر ﻗﻴﻤﺔ ﻣﻦ ﻋـﺪة ﻗـﻴﻢ آــ Visibleاو ﻟـﻮن ﻣـﻦ
ﻣﺠﻤﻮﻋﺔ ﻟﻮح اﻻﻟﻮان آـ ،BackColorوهﻨـﺎك ﻧـﻮع ﻳﻈﻬـﺮ ﻟـﻚ ﻣﺮﺑـﻊ ﺻـﻐﻴﺮ ﻓـﻲ اﻗﺼـﻰ
ﻳﻤﻴﻦ اﻟﻌﻤﻮد ﻣﻜﺘﻮب ﻋﻠﻴﻪ ﺛـﻼث ﻧﻘـﺎط " "...ﻳﻘﺼـﺪ ﺑـﻪ ﺻـﻨﺪوق ﺣـﻮار Dialog Boxﻟـﻪ
ﺧﻴﺎرات اﺿﺎﻓﻴﺔ آﺎﻟﺨﺎﺻﻴﺔ .Font
ﺑﺎﻣﻜﺎﻧﻚ ﻣﺸﺎهﺪة ﻧﺎﻓﺬة ﻣﺤﺮر اﻻآﻮاد اﻣﺎ ﺑﺎﻟﻨﻘﺮ اﻟﻤﺰدوج ﺑﺎﻟﻔـﺄرة ﻋﻠـﻰ اﻷداة او ﻧﺎﻓـﺬة
اﻟﻨﻤــﻮذج ،او ﺑﺎﻟﻀــﻐﻂ ﻋﻠــﻰ اﻟﻤﻔﺘــﺎح ] .[F7اﺧﻴــﺮا ،اذا آﻨــﺖ ﻻ ﺗﺤــﺐ ﻣﺸــﺎهﺪة اﻓــﻼم
اﻟﺮﻋﺐ اﻟﺒﺮﻣﺠﻲ اﻟﻤﺘﻤﺜﻠﺔ ﻓﻲ اﻻآﻮاد اﻟﻄﻮﻳﻠﺔ ،ﺗﻤﻜﻨﻚ هﺬﻩ اﻟﻨﺎﻓﺬة ﻣـﻦ ﻋـﺮض اﺟـﺮاء
ﻣﻌﻴﻦ واﺧﻔﺎء ﺳﺎﺋﺮ اﻻآﻮاد ﻋﻦ ﻃﺮﻳﻖ اﻟﻨﻘﺮ ﻋﻠﻰ اﻟﺰر Procedure Viewاﻟﻤﻮﺟﻮد ﻓـﻲ
اﻟﺮآﻦ اﻟﺴﻔﻠﻲ اﻻﻳﺴﺮ ﻣﻦ اﻟﻨﺎﻓﺬة ،ﻟﻜﻦ ﻋﻤﻠﻴﺔ اﻟﺘﻨﻘﻞ ﺑﻴﻦ اﻻﺟﺮاءات ﺳـﺘﻜﻮن ﻣﻤﻠـﺔ
ﺑﻌﺾ اﻟﺸﺊ ﻋـﻦ ﻃﺮﻳـﻖ اﻟﻘـﺎﺋﻤﺘﻴﻦ ComboBoxesاﻟﻤﻮﺟﻮدﺗـﺎن ﻓـﻲ اﻋﻠـﻰ اﻟﻨﺎﻓـﺬة،
اﻟﻘﺎﺋﻤﺔ اﻟﻴﺴﺮى ﺗﻌﺮض ﺟﻤﻴﻊ اﻻدوات اﻟﻤﻮﺟﻮدة ﻓﻲ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج اﻟﺤﺎﻟﻴﺔ ،ﺑﺎﻻﺿﺎﻓﺔ
إﻟﻰ اﻟﻨﻤﻮذج ﻧﻔﺴﺔ ،وآﺬﻟﻚ اﻟﻌﺒﺎرة ) (Generalوهﻲ ﺗﺸﻴﺮ إﻟﻰ ﻗﺴﻢ اﻻﻋﻼﻧﺎت ﻓـﻲ
اﻟﻨﻤﻮذج وآﺬﻟﻚ اﻻﺟـﺮاءات واﻟـﺪوال اﻟﺘـﻲ ﺗﻘـﻮم ﺑﺎﻧﺸـﺎءهﺎ ،واﻟﻘﺎﺋﻤـﺔ اﻟﻴﻤﻨـﻰ ﺗﻌـﺮض
ﺟﻤﻴﻊ اﻻﺟﺮاءات واﻻﺣﺪاث اﻟﻤﺮﺗﺒﻄﺔ ﺑﻤﺎ ﻳﺘﻢ اﺧﺘﻴﺎرة ﻓﻲ اﻟﻘﺎﺋﻤﺔ اﻻوﻟﻰ.
وﻗﺖ اﻟﺘﻨﻔﻴﺬ Run Timeهﻮ اﻟﻤﺮﺣﻠﺔ اﻟﺘﻲ ﻳﺘﻢ ﺗﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺠﻚ ﻓﻴﻬﺎ – ﻣﻼﺣﻈﺔ:
ﺑﻌـﺪ اﻟﻀـﻐﻂ ﻋﻠـﻰ اﻟﻤﻔﺘـﺎح ] ،[F5اﻣـﺎ وﻗـﺖ اﻟﺘﺼـﻤﻴﻢ Design Time
ﻓﻬﻲ اﻟﻤﺮﺣﻠﺔ اﻟﺘـﻲ ﺗﺼـﻤﻢ ﺑﺮﻧﺎﻣﺠـﻚ ﺑﻬـﺎ .ﻳﻮﺟـﺪ وﻗـﺖ ﺧـﺎص ﻳﻌـﺮف
ﺑﺎﻻﻳﻘﺎف اﻟﻤﺆﻗﺖ Pause Timeاو اﻟﻘﻄﻊ Breakوهﻮ ﺑﺎﺧﺘﺼـﺎر ﻋﻤﻠﻴـﺔ
اﻟﻮﻗﻒ اﻟﻤﺆﻗﺖ ﻟﺘﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺠﻚ وﻟﻜﻦ ﻟﻴﺲ اﻧﻬﺎﺋﻪ.
اﻟﻨﺎﻓﺬة وﻗﺖ اﻻﻳﻘﺎف اﻟﻤﺆﻗﺖ ﻓﻲ ﺣﺎل وﺟﻮد اﺟﺮاءات ﻣﻨﺘﻈـﺮة اﻻﺳـﺘﺪﻋﺎء ﻋـﻦ ﻃﺮﻳـﻖ
اﻻﻣﺮ Call Stackاﻟﻤﻮﺟﻮد ﻓﻲ ﻗﺎﺋﻤﺔ Viewاو اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺎﺗﻴﺢ ].[Ctrl+L
اﻟﻘﺎﺋﻤﺔ :File
ﺗﺤﺘﻮي هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﻋﻠـﻰ اواﻣـﺮ اﺳﺎﺳـﻴﺔ ﺧﺎﺻـﺔ ﻟﻠﻤﺸـﺎرﻳﻊ ﺑﺸـﻜﻞ ﻋـﺎم ،آﺈﻧﺸـﺎء
ﻣﺸــﺮوع ﺟﺪﻳــﺪ ،ﺣﻔــﻆ ﻣﺤﺘﻮﻳــﺎت اﻟﻤﺸــﺮوع ،ﻃﺒﺎﻋــﺔ ﻣﺤﺘﻮﻳــﺎت اﻟﻤﺸــﺮوع وﺗﺮﺟﻤــﺔ
اﻟﻤﺸﺮوع وﺗﺤﻮﻳﻠﻪ اﻟﻰ ﻣﻠﻒ ﺛﻨﺎﺋﻲ .Binaryاﻟﻤﻴﺰة اﻟﺘﻲ اﺿﻴﻔﺖ ﻟـ VB6هﻲ اﻣﻜﺎﻧﻴـﺔ
ﻓﺘﺢ اآﺜﺮ ﻣﻦ ﻣﺸﺮوع ﻓﻲ ﻧﺴﺨﺔ واﺣـﺪة ﻣـﻦ اﻟﺒﻴﺌـﺔ ،وهـﻲ ﻣﻴـﺰة ﺗﻌـﺮف ﺑﺎﻟﻤﺸـﺎرﻳﻊ
اﻟﻤﺘﻌﺪدة .Multiple Projects
اﻟﻘﺎﺋﻤﺔ :Edit
ﺗﺤﻮي هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﻋﻠﻰ اواﻣﺮ اﻟﺘﺤﺮﻳﺮ اﻟﻘﻴﺎﺳﻴﺔ آﺎﻟﻘﺺ ،اﻟﻨﺴـﺦ واﻟﻠﺼـﻖ .ﺑﺎﻻﺿـﺎﻓﺔ
اﻟﻰ اواﻣﺮ ﺧﺎﺻﺔ ﺑﻘﻮاﻋـﺪ اﻟﺒﻴﺎﻧـﺎت ﻓـﻲ ﺣﺎﻟـﺔ وﺟـﻮد ﻗﺎﻋـﺪة ﺑﻴﺎﻧـﺎت ﻓـﻲ ﻧﺎﻓـﺬة ﻋـﺮض
اﻟﺒﻴﺎﻧﺎت .Data Viewﻣﻌﻈﻢ اﻻواﻣﺮ اﻟﻮاردة ﻓﻲ اﺳﻔﻞ هـﺬﻩ اﻟﻘﺎﺋﻤـﺔ ﺗﺴـﺘﺨﺪﻣﻬﺎ ﻣـﻊ
ﻧﺎﻓﺬة ﻣﺤﺮر اﻻآﻮاد .Code Window
10
اﻟﻘﺎﺋﻤﺔ :View
ذآﺮت ﻣﻌﻈﻢ ﻣﺤﺘﻮﻳﺎﺗﻬﺎ ﻓﻲ ﻓﻘﺮة "ﻧﻮاﻓﺬ ﺑﻴﺌـﺔ اﻟﺘﻄـﻮﻳﺮ اﻟﻤﺘﻜﺎﻣﻠـﺔ" ،وﺑﺎﻻﻋﺘﻤـﺎد ﻋﻠـﻰ
ﻧﺒﺎهﺘﻚ وﻣﺪى اﺳﺘﻌﻴﺒﺎك ﻳﻤﻜﻨﻚ ﻣﻌﺮﻓﺔ اﻟﻐﺮض هﺬﻩ اﻟﻘﺎﺋﻤﺔ.
اﻟﻘﺎﺋﻤﺔ :Project
ﻣﻌﻈﻢ اواﻣﺮهﺎ ﺧﺎﺻﺔ ﺑﻤﺤﺘﻮﻳﺎت اﻟﻤﺸﺎرﻳﻊ ،ﻓﻬﻲ ﺗﻤﻜﻨﻚ ﻣﻦ اﺿـﺎﻓﺔ ﻋﻨﺼـﺮ او ﻋﻨﺎﺻـﺮ
ﻣﻦ ﻋﻨﺎﺻﺮ اﻟﻤﺸﺮوع آﻨﻮاﻓﺬ اﻟﻨﻤﺎذج ،Formsﻣﻠﻔﺎت اﻟﺒﺮﻣﺠﺔ ،Moduleﻓﺌﺎت Classes
....اﻟــﺦ .اﻟﻤﺰﻳــﺪ اﻳﻀــﺎ ،ﻳﻤﻜﻨــﻚ اﺿــﺎﻓﺔ ادوات ﺗﺤﻜــﻢ ActiveX Controlsاﺿــﺎﻓﻴﺔ ﻋــﻦ
ﻃﺮﻳﻖ اﻻﻣﺮ Componentsاو ﺗﻀﻤﻴﻦ ﻣﻜﺘﺒﺎت ActiveX DLLﺧﺎرﺟﻴﺔ ﻋﻦ ﻃﺮﻳـﻖ اﻻﻣـﺮ
.References
اﻟﻘﺎﺋﻤﺔ :Format
اﻻواﻣﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﺧﺎﺻﺔ ﺑﺘﻨﺴﻴﻖ اﻻدوات اﻟﺘـﻲ ﺗﻀـﻌﻬﺎ ﻋﻠـﻰ ﻧﺎﻓـﺬة
اﻟﻨﻤﻮذج ﻣﻦ ﻧﺎﺣﻴﺔ ﻣﻮﻗﻌﻬﺎ ﻋﻠﻰ اﻟﻨﺎﻓﺬة ،ﻓﺘﻮﺟﺪ اواﻣﺮ ﻣﺮﻧﺔ ﺗـﻮﻓﺮ ﻋﻠﻴـﻚ ﺟﻬـﺪ ﻣﺤـﺎذاة
اﻻدوات او ﺗﻮﺳﻴﻄﻬﺎ ﻋﻠﻰ اﻟﻨﺎﻓﺬة ،ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ﺗﻐﻴﻴﺮ ﺗﺮﺗﻴﺐ ﻇﻬـﻮر اﻻدوات أي وﺿـﻊ
أداة ﻓﻮق اﻟﻜﻞ او أداة ﺧﻠـﻒ اﻟﻜـﻞ .اﻻﻣـﺮ اﻻﺧﻴـﺮ Lock Controlsﺗﺴـﺘﺨﺪﻣﻪ اذا آﻨـﺖ
راﺿﻴﺎ ﻋﻦ ﺗﺼﻤﻴﻢ اﻻدوات وﺗﻮد ﻣﻨﻊ ﻧﻔﺴﻚ ﻣﻦ ﺗﻐﻴﻴـﺮ اﺣﺠﺎﻣﻬـﺎ او ﻣﻮاﻗﻌـﺎ ﻋـﻦ ﻃﺮﻳـﻖ
اﻟﺨﻄﺄ ،هﺬا اﻟﻘﻔﻞ ﺗﺴﺘﻄﻴﻊ ﻓﺘﺤﺔ ﺑﻜﻞ ﺑﺴﺎﻃﺔ ﺑﺎﺧﺘﻴﺎر ﻧﻔﺲ اﻻﻣﺮ ﻣﺮة اﺧﺮى.
اﻟﻘﺎﺋﻤﺔ :Debug
ﻣﻌﻈﻢ اواﻣﺮ اﻟﺘﻨﻘﻴﺢ وﺿﻌﺖ اﺳﻔﻞ هﺬﻩ اﻟﻘﺎﺋﻤﺔ .ﻣﻦ هﺬﻩ اﻻواﻣﺮ اﺧﺘﻴﺎر ﻃﺮﻳﻘﺔ ﺗﻨﻔﻴـﺬ
اﻟﺒﺮﻧﺎﻣﺞ ،آﺘﻨﻔﻴﺬ ﺳﻄﺮ واﺣـﺪ ﻣﻨـﻪ ،Step Intoاﺟـﺮاء آﺎﻣـﻞ ،Step Overاﻣـﺮ ﺳـﺎﺑﻖ
Step Outاو اﻟﺘﻨﻔﻴﺬ ﺣﺘﻰ اﻟﻮﺻﻮل اﻟﻰ اﻟﺴﻄﺮ اﻟﺬي ﻳﻮﺟﺪ ﻋﻠﻴﻪ ﻣﺆﺷﺮ اﻟﻜﺘﺎﺑـﺔ Run
.to Cursorوﺑﺎﻟﻨﺴﺒﺔ ﻟﻨﻘﺎط اﻟﻘﻄﻊ BreakPointsﻓﻬﻲ ﻋﻼﻣـﺎت ﺗﻈﻬـﺮ ﻣﺒـﺪﺋﻴﺎ ﺑـﺎﻟﻠﻮن
اﻻﺣﻤﺮ ﻋﻠﻰ ﺳﻄﺮ ﻣﻌﻴﻦ ﺑﺤﻴﺚ ﺗﺘﻢ ﻋﻤﻠﻴـﺔ اﻻﻳﻘـﺎف اﻟﻤﺆﻗـﺖ ﻟﻠﺒﺮﻧـﺎﻣﺞ ﻋﻨـﺪ اﻟﻮﺻـﻮل
اﻟﻰ هﺬﻩ اﻟﻌﻼﻣﺎت.
اﻟﻘﺎﺋﻤﺔ :Run
ﻋﻦ ﻃﺮﻳﻖ هﺬﻩ اﻟﻨﺎﻓﺬة اﻟﺒﺴﻴﻄﺔ ﺗﺴﺘﻄﻴﻊ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ وﺗﺘﻤﻜﻨﻚ ﻣﻦ اﺧﺘﻴﺎر اﻻواﻣـﺮ
اﻻﺧﺮى آﺎﻻﻳﻘﺎف اﻟﻤﺆﻗﺖ Breakاو اﻧﻬﺎء ﻋﻤﻠﻴﺔ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧـﺎﻣﺞ .Endﺑﺎﻟﻨﺴـﺒﺔ ﻟﻼﻣـﺮ
Start with Full Compileهﻮ ﻣﺸﺎﺑﻪ ﻻﻣﺮ اﻟﺘﻨﻔﻴﺬ Startوﻟﻦ ﺗﺤﺘﺎﺟـﻪ اﻻ ﻓـﻲ ﺣـﺎﻻت
ﻧﺎدرة ﺳﺘﺠﺪهﺎ ﻻﺣﻘﺎ ﻓﻲ هﺬا اﻟﻜﺘﺎب.
11
اﻟﻘﺎﺋﻤﺔ :Query
هــﺬﻩ اﻟﻘﺎﺋﻤــﺔ ﺟﺪﻳــﺪة ﻋﻠــﻰ ﻣﺒﺮﻣﺠــﻲ VB5وهــﻲ ﻣﺘــﻮﻓﺮة ﻟﻨﺴــﺨﺔ اﻟﻤﺤﺘــﺮﻓﻴﻦ
Professional Editionواﻟﻤﺆﺳﺴــﺎت Enterprise Editionﻟﻼﺻــﺪار اﻟﺴــﺎدس .VB6
اواﻣﺮ هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﻏﻴﺮ ﻣﻤﻜﻨﺔ ﺣﺘـﻰ ﺗﻨﺸـﺊ ﺟﻤﻠـﺔ اﺳـﺘﻌﻼم SQLﺑﺎﺳـﺘﺨﺪام اﻷداة
.Microsoft Query Builder
اﻟﻘﺎﺋﻤﺔ :Diagram
اﻳﻀﺎ هﺬﻩ ﻗﺎﺋﻤﺔ ﺟﺪﻳﺪة ﻋﻠﻰ ﻣﺒﺮﻣﺠﻲ VB5وﻣﺘـﻮﻓﺮة ﻟـﻨﻔﺲ اﻟﻨﺴـﺦ اﻟﻤـﺬآﻮرة ﻓـﻲ
اﻟﻔﻘﺮة اﻟﺴﺎﺑﻘﺔ .اواﻣﺮ هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﻏﻴﺮ ﻣﻤﻜﻨﺔ اﻻ ﻓﻲ ﺣﺎﻟﺔ ﺗﻌﺎﻣﻠﻚ ﻣﻊ ﻗﺎﻋﺪة ﺑﻴﺎﻧـﺎت
SQL Serverاو .ORACLE
اﻟﻘﺎﺋﻤﺔ :Tools
ﺗﺤﺘﻮي ﻋﻠﻰ اواﻣﺮ ﻣﺨﺘﻠﻔـﺔ اﻟﺘﺼـﺎﻧﻴﻒ آﻤﺤـﺮر اﻟﻘـﻮاﺋﻢ Menu Editorوﻣﺴـﻬﻞ آﺘﺎﺑـﺔ
اﻻﺟﺮاءات Add Procedureوﻏﻴﺮهﺎ ...اذا ادرت ﺗﺨﺼﻴﺺ ﺑﻴﺌـﺔ اﻟﺘﻄـﻮﻳﺮ اﻟﻤﺘﻜﺎﻣﻠـﺔ IDE
ﻓـﺎﻻﻣﺮ Optionsﻳﻤﻜﻨــﻚ ﻣــﻦ اﻟﻮﺻــﻮل اﻟــﻰ ﺻـﻨﺪوق اﻟﺤــﻮار Optionsاﻟــﺬي ﻳــﻮﻓﺮ ﻟــﻚ
ﻋﺸﺮات اﻟﺨﻴﺎرات واﻟﺨﺎﺻﺔ ﺑﺘﻐﻴﻴﺮ اﻋﺪادات ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ .IDE
اﻟﻘﺎﺋﻤﺔ :Add-Ins
اﻻواﻣﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ هﺬﻩ اﻟﻘﺎﺋﻤﺔ ﻋﺒﺎرة ﻋﻦ ﺑﺮاﻣﺞ ﻣﺴﺘﻘﻠﺔ ﺗﺴﻤﻰ اﻻﺿـﺎﻓﺎت Add-
Insهﺪﻓﻬﺎ ﺗﻮﻓﻴﺮ ﺧﺪﻣﺎت اﺿﺎﻓﻴﺔ ﻟﺒﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ ﺗﺰﻳﺪ ﻣﻦ ﻣﺮوﻧﺘﻬﺎ .ﺗﻄﻮﻳﺮ هﺬا اﻟﻨﻮع ﻣـﻦ
اﻟﺒﺮاﻣﺞ ﺧﺎرج ﻧﻄﺎق اﻟﻜﺘﺎب.
اﻟﻘﺎﺋﻤﺔ :Window
اذا آﻨﺖ ﺑﺤﺎﺟﺔ اﻟﻰ ﺷﺮح ﻣﺤﺘﻮﻳﺎت هﺬﻩ اﻟﻘﺎﺋﻤﺔ ،ﻓﻴﺒﺪو اﻧﻚ ﺟﺪﻳﺪ ﻟﻴﺲ ﻋﻠﻰ Visual
Basicﻓﺤﺴﺐ واﻧﻤﺎ ﻋﻠﻰ ﺟﻤﻴﻊ ﺗﻄﺒﻴﻘﺎت ﺑﻴﺌﺔ ،Windowsﻓﺎﻓﻀﻞ ﺷﺮح اﺳـﻄﺮﻩ ﻟـﻚ
هﻮ ﺑﺎن ﺗﻮﻗﻒ ﻗﺮاءة اﻟﻜﺘﺎب –اﻻﻳﻘﺎف اﻟﻤﺆﻗﺖ -ﻓﻲ اﻟﺤﺎل ،وﺗﺤﺎول اﻟﺘﻌـﺮف ﻋﻠـﻰ ﺑﻴﺌـﺔ
Windowsوﻣﻦ ﺛﻢ ﺗﻌﻮد ﻟﻤﺘﺎﺑﻌﺔ اﻟﻘﺮاءة.
اﻟﻘﺎﺋﻤﺔ :Help
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻤﺴﺘﺨﺪﻣﻲ اﻻﺻﺪار اﻟﺴﺎدس ﻣﻦ ،Visual Basicﻓﻠﻦ ﻳﺘﻤﻜﻨﻮا ﻣﻦ اﻟﻮﺻـﻮل
اﻟﻰ اﻟﺘﻌﻠﻴﻤﺎت اﻟﻔﻮرﻳﺔ اﻻ ﻓﻲ ﺣﺎﻟﺔ اﻧﺰال ﻧﺴـﺨﺔ ﻣـﻦ ﻣﻜﺘﺒـﺔ Microsoft Developer
Networkواﻟﻤﺄﻟﻮﻓﺔ ﺑﺎﻻﺧﺘﺼﺎر .MSDN
12
اﺷﺮﻃﺔ اﻻدوات
ﺟﻤﻴﻊ اﻻزرار اﻟﻤﻮﺟﻮدة ﻓﻲ اﺷﺮﻃﺔ اﻻدوات ﻣﻨﺴﻮﺧﺔ ﻣﻦ اﻟﻘﻮاﺋﻢ اﻟﺴـﺎﺑﻘﺔ ،ﻓﻼﻳﻮﺟـﺪ
داﻋــﻲ ﻻﻋــﺎدة اﻟﺸــﺮح .اﻣــﺎ اﻟﻐــﺮض ﻣــﻦ ﻧﺴــﺨﻬﺎ ﻓﻬــﻮ ﺗﺴــﺮﻳﻊ ﻋﻤﻠﻴــﺔ اﺧﺘﻴــﺎر اﻻﻣــﺮ.
ﺗﺴﺘﻄﻴﻊ اﻟﺘﺤﻜﻢ ﻓﻲ اﺷﺮﻃﺔ اﻻدوات وﺗﺤﺮﻳﺮهﺎ آﻤـﺎ ﺗﻔﻌـﻞ ﻣـﻊ ﺗﻄﺒﻴﻘـﺎت MS-Office
ﺑﺎﻟﻀﻐﻂ ﺑﺰر اﻟﻔﺄرة اﻻﻳﻤﻦ ﻋﻠﻰ ﺷﺮﻳﻂ اﻻدوات واﺧﺘﻴﺎر اﻻﻣـﺮ Customizeﻣـﻦ اﻟﻘﺎﺋﻤـﺔ
اﻟﻤﻨﺴﺪﻟﺔ .اﺣﺐ ان اﻧﻮﻩ هﻨﺎ ﺑﺎن ﺻـﻨﺪوق اﻻدوات ToolBoxﻗـﺪ ادرﺟﺘـﻪ ﺿـﻤﻦ ﻓﻘـﺮة
ﻧﻮاﻓﺬ ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ ،ﻓﻼ ﺗﻌﺘﻘﺪ اﻧﻪ ﻣﻦ ﻓﺌﺔ اﺷﺮﻃﺔ اﻻدوات رﻏﻢ اﻟﺸﺒﻪ اﻟﻜﺒﻴﺮ ﺑﻴﻨﻬﻢ.
ﻣﻦ اﻟﻤﺸﺎرﻳﻊ هﻲ ﻣﺸﺎرﻳﻊ ﺑﻨﺎء ﺑـﺮاﻣﺞ ﻗﻴﺎﺳـﻴﺔ ﺗﻌﻤـﻞ ﺗﺤـﺖ ﺑﻴﺌـﺔ ،Windowsوﻋﻨـﺪ
اﻟﺘﺮﺟﻤﺔ ﺗﻜﻮن ﻣﻠﻔﺎﺗﻬﺎ ﻣﻦ اﻟﻨﻮع .EXE
ﺑﻌﺪ ﻗﻴﺎﻣﻚ ﺑﻌﻤﻠﻴﺔ إﻧﺸﺎء اﻟﻤﺸﺮوع اﻟﺠﺪﻳﺪ ،ﻗﻢ ﺑﻜﺘﺎﺑﺔ اﺳﻢ ﻣﻨﺎﺳـﺐ ﻟﻠﻤﺸـﺮوع ﻓـﻲ
ﺧﺎﻧـﺔ اﻟــﻨﺺ Project Nameاﻟﻤﻮﺟــﻮدة ﻓــﻲ ﺻــﻨﺪوق اﻟﺤــﻮار …Project Properties
واﻟﺬي ﺗﺼﻞ اﻟﻴـﻪ ﺑﺎﺧﺘﻴـﺎر اﻻﻣـﺮ Project1 Propertiesﻣـﻦ ﻗﺎﺋﻤـﺔ .Viewاآﺘـﺐ اﺳـﻢ
اﺑﺘﺪاﺋﻲ ﻟﻠﻤﺸﺮوع وﻟﻴﻜﻦ .MyFirstProgram
ﻳﻜﻮن ﻋﻨﻮان اﻻﻣﺮ اﻟﺴﺎﺑﻖ ﻣﺨﺘﻠﻒ ﻣﻦ اﺳﻢ ﻣﺸﺮوع اﻟـﻰ ﺁﺧـﺮ .ﻓﺒﻌـﺪ ﻣﻼﺣﻈﺔ:
ﺗﻌـﺪﻳﻠﻚ ﻻﺳـﻢ اﻟﻤﺸـﺮوع ،ﺳـﻴﻜﻮن ﻋﻨـﻮان اﻻﻣـﺮ MyFirstProgram
….Properties
اﺧﺘﺮ اﻻﻣﺮ Save Projectﻣﻦ ﻗﺎﺋﻤﺔ Fileﻟﺤﻔﻆ ﻣﻠﻔﺎت اﻟﻤﺸـﺮوع ،ﺗـﺬآﺮ ان اﻟﻤﺸـﺮوع
ﻳﺤﺘﻮي ﻋﻠﻰ ﻋﺪة ﻣﻠﻔﺎت ﻟﺬﻟﻚ ﻳﻔﻀﻞ اﻧﺸﺎء ﻣﺠﻠـﺪ Folderﺧـﺎص ﺑﻤﻠﻔـﺎت اﻟﻤﺸـﺮوع
ﻗﺒﻞ ﺣﻔﻈﻪ .ﻣﻠﻒ اﻟﻤﺸﺮوع اﻟﺮﺋﻴﺲ ﻳﻜﻮن اﻣﺘـﺪادﻩ ،VBPاﻣـﺎ اﻟﻤﻠﻔـﺎت اﻻﺧـﺮى ﻓﻬـﻲ
ﻋﻨﺎﺻــﺮ ﻣﻜﻮﻧــﺔ ﻟﻠﻤﺸــﺮوع آﻨﻮاﻓــﺬ اﻟﻨﻤــﺎذج ،*.FRMﻣﻠﻔــﺎت اﻟﺒﺮﻣﺠــﺔ ،*.BASﻣﻠﻔــﺎت
اﻟﻔﺌﺎت .... *.CLSاﻟﺦ.
ﺑﻌﺪ ﺗﺮﺗﻴﺐ اﻻدوات وﻣﺤﺎذاﺗﻬﺎ ﺳﻨﺒﺪأ ﺑﻌﻤﻠﻴﺔ ﺗﻌﻴﻴﻦ ﺧﺼﺎﺋﺼﻬﺎ .ﺣﺪد اﻷداة ﺑﺎﻟﻨﻘﺮ ﻋﻠﻴﻬﺎ
واﻧﺘﻘﻞ اﻟـﻰ ﻧﺎﻓـﺬة اﻟﺨﺼـﺎﺋﺺ وﻗـﻢ ﺑﺘﻌـﺪﻳﻞ ﻗـﻴﻢ ﺧﺼـﺎﺋﺺ اﻻدوات آﻤـﺎ ﻓـﻲ اﻟﺠـﺪول
اﻟﺘﺎﻟﻲ:
ﻣﻦ ﺗﻘﺎﻟﻴﺪ ﻣﺒﺮﻣﺠﻲ Visual Basicآﺘﺎﺑﺔ ﺣﺮوف ﺑﺎدﺋﺔ ﻗﺒﻞ اﺳﻢ اﻷداة ﻣﻼﺣﻈﺔ:
ﺑﺤﻴﺚ ﻳﺴﺘﺪل اﻟﻤﺒﺮﻣﺞ ﻋﻠـﻰ ﻧـﻮع اﻻداة ﻋـﻦ ﻃﺮﻳـﻖ اﻷﺳـﻢ آــ frm
ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج cmd ،ﻟﺰر اﻻواﻣﺮ txt ،ﻟﺨﺎﻧﺔ اﻟﻨﺺ ....اﻟﺦ ،وﺳـﺘﻼﺣﻆ
اﻧﻨــﻲ اﺗﺒﻌﻬــﺎ ﺑﺸــﻜﻞ ﺟﻠﻴــﻞ ﻓــﻲ اﻟﻜﺘــﺎب ﻟﺘﻤﺴــﻜﻲ ﺑﻌــﺎدات وﺗﻘﺎﻟﻴــﺪ
اﺣﺰاب Visual Basicاﻟﺒﺮﻣﺠﻴﺔ.
End Sub
15
أي آﻮد ﺗﻜﺘﺒﻪ ﺑﻴﻦ اﻟﺴﻄﺮﻳﻦ اﻟﺴﺎﺑﻘﻴﻦ ﺳﻴﺘﻢ ﺗﻨﻔﻴـﺬﻩ اذا ﻣـﺎ ﻗـﺎم اﻟﻤﺴـﺘﺨﺪم ﺑـﺎﻟﻨﻘﺮ
ﻋﻠﻰ زر اﻻواﻣﺮ ،ﻓﻬﻮ ﻣﻜﺎن اﻟﺤـﺪث Clickاﻟﺘـﺎﺑﻊ ﻟـﻸداة .cmdMultiplyوهـﺬﻩ ﻓﻠﺴـﻔﺔ
اﻟﺒﺮﻣﺠﺔ اﻟﻤﺴﻴﺮة ﺑﺎﻻﺣﺪاث ،Event Driven Programmingﻓـﺎﻻآﻮاد ﻻ ﻳـﺘﻢ ﺗﻨﻔﻴـﺬهﺎ
ﻣﻦ اول ﺳﻄﺮ اﻟﻰ اﺧﺮ ﺳﻄﺮ آﻤﺎ ﻓﻲ اﻟﺴﺎﺑﻖ .آﺤـﻞ اﻟﺴـﻄﺮ اﻟﺴـﺎﺑﻖ ﺑﻜﺘﺎﺑـﺔ اﻟﻜـﻮد
اﻟﺘﺎﻟﻲ اﻟﺨﺎص ﺑﺎﺟﺮاء ﻋﻤﻠﻴﺔ اﻟﻀﺮب:
ان ﻟﻢ ﺗﻔﻬﻢ اﻟﻐﺮض ﻣﻦ اﻟﻜﻮد اﻟﺴـﺎﺑﻖ ،ﻓﺎﻟﻔﺼـﻮل اﻟﻘﺎدﻣـﺔ ﺁﺗﻴـﺔ اﻟﻴـﻚ ،وﺳـﺘﺠﺪ ﻓﻴﻬـﺎ
اﻟﺠﻮاب اﻟﺸﺎﻓﻲ ،وﻟﻜﻦ اﻋﺮف اﻻن –ﺑﺸﻜﻞ ﻣﺆﻗـﺖ -ان اﻟﻜـﻮد اﻟﺴـﺎﺑﻖ ﻳﻘـﻮم ﺑﻌﻤﻠﻴـﺔ
ﺿﺮب اﻟﻘﻴﻢ اﻟﺘﻲ ﺳﻴﻜﺘﺒﻬﺎ اﻟﻤﺴﺘﺨﺪم ﻓﻲ ﺧﺎﻧﺎت اﻟـﻨﺺ وﺳﻴﻀـﻊ ﻧـﺎﺗﺞ اﻟﻀـﺮب ﻓـﻲ
أداة اﻟﻌﻨﻮان.
اﻟﻬﺪف ﻣﻦ هﺬﻩ اﻟﺨﻄﻮة ﻟﻴﺲ ﺷﺮح اﻻآﻮاد او ﻃﺮﻳﻘـﺔ ﺗﻔـﺎدي اﻻﺧﻄـﺎء ،واﻧﻤـﺎ ﺗﻮﺿـﻴﺢ
ﻗﻀﻴﺔ اﻟﺘﺠﺮﺑﺔ واﻟﺘﻌﺪﻳﻞ وﺑﻴﺎن اهﻤﻴﺘﻬﺎ ﻗﺒﻞ اﻻﻧﺘﻬﺎء ﻣﻦ ﺗﺼﻤﻴﻢ اﻟﺒﺮﻧﺎﻣﺞ.
اﻟﻤﻴﺰة ﻓﻲ ﻋﻤﻠﻴﺔ اﻟﺘﺮﺟﻤﺔ هﻲ اﻣﻜﺎﻧﻴﺔ ﺗﻨﻔﻴﺬ ﺑﺮﻧﺎﻣﺠـﻚ ﻋﻠـﻰ ﺟﻤﻴـﻊ اﻻﺟﻬـﺰة اﻟﺘـﻲ
ﺗﺤﻤﻞ ﻧﻈﺎم اﻟﺘﺸﻐﻴﻞ Windowsﺑﺎﺧﺘﻼف اﺻﺪاراﺗﻪ واﻟﺘﻲ ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ ﻧﺴﺨﺔ ﻣﻦ
Visual Basicﺷﺮﻳﻄﺔ وﺟﻮد ﺑﻌﺾ ﻣﻜﺘﺒـﺎت DLLاﻟﺘـﻲ ﺗـﺄﺗﻲ ﻣـﻊ ،Visual Basicﻟﻌـﻞ
اﺑﺮزهﺎ ﻣﻜﺘﺒﺔ .MSVBVM60.DLLﻟﺬﻟﻚ ،ﻋﻠﻴﻚ ارﻓﺎق هﺬﻩ اﻟﻤﻜﺘﺒﺔ ﻣﻊ ﻣﻠـﻒ ﺑﺮﻧﺎﻣﺠـﻚ
اﻟﺮﺋﻴﺴﻲ EXEاﻟﻰ اﻻﺟﻬﺰة اﻻﺧﺮى واﻟﺘﻲ ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ .Visual Basic
17
اﻟﻔﺼﻞ اﻟﺜﺎﻧﻲ
اﻟﻨﻤﺎذج واﻻدوات
اﻟﺨﺼﺎﺋﺺ اﻟﻤﺸﺘﺮآﺔ
اﻟﺨﺎﺻﻴﺔ هﻲ ﻗﻴﻤﺔ ﺗﺆﺛﺮ اﻣﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺨﺎرﺟﻲ ﻟﻸداة آــ ،Captionاو ﻓـﻲ ﺳـﻠﻮك
ﻋﻤﻞ اﻷداة آـ .Enabledﻧﺎﻓﺬة اﻟﺨﺼﺎﺋﺺ هﻲ اﻟﻤﻜﺎن اﻟﺬي ﻳﻤﻜﻨـﻚ ﻣـﻦ ﺗﻐﻴﻴـﺮ ﻗﻴﻤـﺔ
18
اﻟﺨﺎﺻﻴﺔ وﻗﺖ اﻟﺘﺼﻤﻴﻢ ،اﻣـﺎ وﻗـﺖ اﻟﺘﻨﻔﻴـﺬ ﻓﻌﻠﻴـﻚ آﺘﺎﺑـﺔ اﻟﻜـﻮد واﻟـﺬي ﺗﻜـﻮن ﺻـﻴﻐﺘﻪ
ﻣﺒﺘﺪﺋﺔ ﺑﺎﺳﻢ اﻷداة ﻓﻨﻘﻄﺔ ﺛﻢ اﺳﻢ اﻟﺨﺎﺻﻴﺔ:
”ﺗﺮآﻲ اﻟﻌﺴﻴﺮي“ = Text1.Text
PictureBox1.BackColor = 0
Label1.Caption = Text1.Text
او اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Withاذا آﻨﺖ ﺗﺮﻏﺐ ﺗﻌﺪﻳﻞ ﻣﺠﻤﻮﻋـﺔ ﺧﺼـﺎﺋﺺ ﻟﻜـﺎﺋﻦ
او اداة ﻣﻌﻴﻨﺔ:
With Text1
"ﺗﺮآﻲ اﻟﻌﺴﻴﺮي" = .Text
.Font.Bold = True
.BackColor = vbBlack
.ForeColor = vbWhite
End With
ﺗﺘﻤﻴﺰ ﺑﻌﺾ اﻷدوات ﺑﻮﺟﻮد ﺧﺎﺻﻴﺔ اﻓﺘﺮاﺿـﻴﺔ ﻟﻬـﺎ ﺗﻌـﺮف ﺑــ ،Default Propertyﺗﻐﻨﻴـﻚ
هﺬﻩ اﻟﺨﺎﺻـﻴﺔ ﻋـﻦ آﺘﺎﺑـﺔ اﺳـﻢ اﻟﺨﺎﺻـﻴﺔ ﺑﻌـﺪ اﻷداة اذا اردت ﺗﻐﻴﻴـﺮ ﻗﻴﻤﺘﻬـﺎ ﺑﺮﻣﺠﻴـﺎً.
ﻣﻌﻈــﻢ اﻻدوات اﻟﺪاﺧﻠﻴــﺔ ﺗﻜــﻮن ﺧﺎﺻــﻴﺘﻬﺎ اﻻﻓﺘﺮاﺿــﻴﺔ هــﻲ Captionواﻟﺨﺎﺻــﻴﺔ Text
ﻷداة اﻟﻨﺺ:
ﺑﺎﻟﻨﺴــﺒﺔ ﻟﻨﺎﻓــﺬة اﻟﻨﻤــﻮذج ،ﻳﻤﻜﻨــﻚ اﻟﻮﺻــﻮل اﻟــﻰ ﺧﺼﺎﺋﺼــﻬﺎ دون اﻻﻟﺘــﺰام ﺑﺎﻟﺼــﻴﻐﺔ
اﻟﺴﺎﺑﻘﺔ ﻓﺘﺴﺘﻄﻴﻊ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Meاو ﺣﺘﻰ ﺗﺠﺎهﻠﻬﺎ:
ﻣﻦ اﻟﻀﺮوري ان اﻧﺒﻪ هﻨﺎ إﻟﻰ اﻧﻪ ﻟﻴﺴﺖ آﻞ اﻟﺨﺼﺎﺋﺺ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ وﻗـﺖ اﻟﺘﺼـﻤﻴﻢ
واﻟﺘﻨﻔﻴﺬ ،ﻓﺒﻌﺾ اﻟﺨﺼﺎﺋﺺ آـ BorderStyleاﻟﺘﺎﺑﻌﺔ ﻟﻨﺎﻓـﺬة اﻟﻨﻤـﻮذج ﻻﻳﻤﻜﻨـﻚ ﺗﻌـﺪﻳﻠﻬﺎ
19
اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﺘﺤﺪﻳﺪ ﻣﻮﻗﻌﻬﺎ هﻲ اﻟـ Twipآﻤﺎ ﺳﻨﻌﺮف ﻻﺣﻘﺎ .اذا آﻨﺖ ﺗﺮﻳـﺪ ﺗﻮﺳـﻴﻂ
اﻷداة وﻗﺖ اﻟﺘﺼﻤﻴﻢ ﻓﻲ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج ،ﺣـﺪد اﻷداة ﺛـﻢ اﺧﺘـﺮ اﺣـﺪ اﻻواﻣـﺮ اﻟﻤﻮﺟـﻮدة
ﻓﻲ اﻟﻘﺎﺋﻤﺔ اﻟﻔﺮﻋﻴﺔ Center in Formﻣﻦ ﻗﺎﺋﻤﺔ ،Formatاﻣﺎ ﻓﻲ وﻗﺖ اﻟﺘﻨﻔﻴﺬ ﻓﻬـﺬا
اﻟﻜﻮد ﻳﻔﻲ ﺑﺎﻟﻐﺮض:
ﺑﺎﻟﻨﺴﺒﺔ ﻟﺨﺼﺎﺋﺺ اﻟﺤﺠـﻢ Heightو Widthﻓﻬـﻲ ﺗﻤﺜـﻞ ﻋـﺮض وﻃـﻮل اﻷداة ﺑـﻨﻔﺲ
اﻟﻮﺣﺪة اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﺨﺼﺎﺋﺺ اﻟﻤﻮﻗﻊ .ﻓـﻲ ﺣـﺎﻻت ﻣﻌﻴﻨـﺔ ﻟـﻦ ﺗﺴـﺘﻄﻴﻊ ﺗﻐﻴﻴـﺮ ﻗﻴﻤـﺔ
اﻟﺨﺎﺻــﻴﺔ Heightﻟــﺒﻌﺾ اﻻدوات آــﺄداة اﻟـــ – ComboBoxاذا آﺎﻧــﺖ ﺧﺎﺻــﻴﺘﻬﺎ Style
ﻧﺴﺎوي ،0ﻓﻘﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ Heightهﻨـﺎ ﺳـﺘﻜﻮن ﻣﻌﺘﻤـﺪة ﻋﻠـﻰ ﻧـﻮع وﺣﺠـﻢ اﻟﺨـﻂ
اﻟﻤﺴــﺘﺨﺪم ﻓــﻲ اﻟﺨﺎﺻــﻴﺔ Fontاﻟﺘﺎﺑﻌــﺔ ﻟﻬــﺎ .وﺑﻌــﺾ اﻻدوات –آــﺄداة -ListBoxﻓــﺈن
اﻟﺘﺤﻜﻢ ﻓﻲ ﺧﺎﺻﻴﺘﻬﺎ Heightﻟﻴﺲ دﻗﻴـﻖ ﺗﻤﺎﻣـﺎ ،ﻓﻘﻴﻤـﺔ هـﺬﻩ اﻟﺨﺎﺻـﻴﺔ ﺗﻤﺜـﻞ ﻋـﺪد
اﻟﺴﻄﻮر xارﺗﻔﺎع آﻞ ﺳـﻄﺮ ،ﻓـﻼ ﺗﺘﻮﻗـﻊ ﻇﻬـﻮر ﺟـﺰء ﻣـﻦ ﺳـﻄﺮ ﻻن ﺳـﻄﻮر اﻟﻨﺼـﻮص
اﻟﻤﻮﺟﻮدة ﻓﻴﻬﺎ اﻣﺎ أن ﺗﻌﺮض آﺎﻣﻠﺔ او ﻻ ﺗﻌﺮض.
ﺧﺼﺎﺋﺺ اﻻﺣﺘﻀﺎن
ﺧﺼـــﺎﺋﺺ اﻻﺣﺘﻀـــﺎن Parentو Containerﺗﻤـــﺜﻼن ﻣﺮﺟـــﻊ Referenceاﻟـــﻰ ﻧﺎﻓـــﺬة
اﻟﻨﻤﻮذج اﻟﺤﺎﺿﻨﺔ ﻟـﻸداة ﻓـﻲ اﻟﺨﺎﺻـﻴﺔ Parentاو اﻷداة اﻟﺤﺎﺿـﻨﺔ ﻟـﻸداة .Container
اﻟﺨﺎﺻﻴﺔ Parentهﻲ ﻟﻠﻘﺮاءة ﻓﻘﻂ –أي ﻻ ﻳﻤﻜﻨـﻚ ﺗﻌـﺪﻳﻠﻬﺎ ،اﻣـﺎ اﻟﺨﺎﺻـﻴﺔ Container
ﻓﻬﻲ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ ﻓﻲ أي وﻗﺖ ﺗﺮﻳﺪ ﺗﻐﻴﻴﺮ اﻷداة اﻟﺤﺎﺿﻨﺔ ﻟﻸداة:
ﻻﺑــﺪ ﻣــﻦ اﺳــﺘﺨﺪام اﻟﻤﻌﺎﻣــﻞ Setﻓــﻲ اﻟﻜــﻮد اﻟﺴــﺎﺑﻖ ،ﻻﻧــﻚ ﺗﻘــﻮم ﻣﻼﺣﻈﺔ:
ﺑﺎﺳﻨﺎد ﻗﻴﻢ ﻟﻜﺎﺋﻨﺎت وﻟﻴﺲ ﻗﻴﻢ ﻋﺎدﻳﺔ ،اﻟﻔﺼﻞ اﻟﺨﺎﻣﺲ ﺳﻴﻮﺿـﺢ ﻟـﻚ
اﺳﺒﺎب اﺳﺘﺨﺪام اﻟﻤﻌﺎﻣﻞ Setﺑﻤﺸﻴﺌﺔ اﷲ.
ﻣﻦ اﻟﻤﺮوﻧﺔ اﻟﺘﻲ ﺗﻮﻓﺮهﺎ ﻟﻚ هﺎﺗـﺎن اﻟﺨﺎﺻـﻴﺘﺎن هـﻲ اﻣﻜﺎﻧﻴـﺔ اﻟﻮﺻـﻮل اﻟـﻰ اﻋﻀـﺎء –
ﺧﺼﺎﺋﺺ وﻃﺮق -اﻷداة او ﻧﺎﻓﺬة اﻟﻨﻤﻮذج اﻟﺤﺎﺿﻨﺔ ﻟـﻸداة ،ﻓـﺎﻟﻜﻮد اﻟﺘـﺎﻟﻲ ﻳﻘـﻮم ﺑﺘﻐﻴﻴـﺮ
اﻟﺨﺎﺻﻴﺔ Captionﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج اﻟﺤﺎﺿﻨﺔ ﻟﻸداة:
21
اذا آﺎﻧﺖ اﻷداة ﻣﻮﺟﻮدة ﻋﻠﻰ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج وﻟﻢ ﺗﺤﺘﻀﻨﻬﺎ أداة اﺧﺮى ،ﻓﺎن اﻟﺨﺎﺻـﻴﺘﺎن
Parentو Containerﺗﻤﺜﻼن ﻧﻔﺲ اﻟﻤﺮﺟﻊ ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج.
With Label1
”.Font.Name = “Tahoma
.Font.Bold = True
.Font.Size = 20
End With
ﻣﻦ اﻟﻤﺮوﻧﺔ اﻟﺘﻲ ﻳﻮﻓﺮهﺎ ﻟﻚ اﻟﻜﺎﺋﻦ Fontهﻲ ﻓﻜﺮة ﻧﺴﺦ ﺟﻤﻴﻊ ﺧﺼـﺎﺋﺺ اﻟﺨـﻂ ﻣـﻦ
أداة اﻟﻰ اﺧﺮى:
ﻣﻦ اﻟﻤﻬﻢ ان ﺗﻌﻠﻢ اﻧـﻪ ﻓـﻲ اﻟﻜـﻮد اﻟﺴـﺎﺑﻖ ﻗﻤﻨـﺎ ﺑﻨﺴـﺦ اﻟﻜـﺎﺋﻦ Fontاﻟﺘـﺎﺑﻊ ﻟـﻸداة
Label2ﻣﻜﺎن اﻟﻜﺎﺋﻦ Fontاﻟﺘﺎﺑﻊ ﻟﻸداة Label1ﻓﺎﻟﻜﺎﺋﻦ Fontاﺻﺒﺢ آﺎﺋﻦ واﺣﺪ ﺗـﺮﺗﺒﻂ
ﺑﻪ اﻻداﺗـﻴﻦ ،واﻟـﺪﻟﻴﻞ اﻧـﻪ ﻟـﻮ ﻗﻤـﺖ ﺑﺘﻌـﺪﻳﻞ اﺣـﺪ ﺧﺼـﺎﺋﺺ اﻟﺨـﻂ ﻟـﻸداة Label2ﻓـﺎن
ﺧﺎﺻﻴﺔ اﻟﺨﻂ اﻟﺘﺎﺑﻌﺔ ﻟﻸداة Label1ﺳﺘﺘﺄﺛﺮ اﻳﻀﺎ:
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺨﺎﺻﻴﺔ Font.Nameﻓﻬﻲ ﺗﻤﺜﻞ اﺳﻢ اﻟﺨﻂ اﻟﻤﺮاد اﺳﺘﺨﺪاﻣﻪ ،وﻓـﻲ ﺣـﺎل
اﺳــﺘﺨﺪاﻣﻚ ﻟﺨــﻂ ﻏﻴــﺮ ﻣﻮﺟــﻮد ﻓــﻲ ﻧﻈــﺎم اﻟﺘﺸــﻐﻴﻞ ﻓــﺎن Visual Basicﻳﻀــﻊ ﺧــﻂ
اﻓﺘﺮاﺿــﻲ ﻣــﻦ ﻋﻨــﺪﻩ ،وﻟﻼﺳــﻒ ﻻ اﺳــﺘﻄﻴﻊ ان اذآــﺮ ﺑﺎﻟﺘﺤﺪﻳــﺪ ﻣــﺎ هــﻮ اﻟﺨــﻂ اﻟــﺬي
ﺳﻴﺴﺘﺨﺪﻣﺔ Visual Basicﻓﻬﻮ ﻳﺨﺘﻠـﻒ ﻣـﻦ ﺟﻬـﺎز اﻟـﻰ اﺧـﺮ .اﻣـﺎ ﺑﺎﻟﻨﺴـﺒﺔ ﻟﻠﺨﻄـﻮط
اﻟﺘـﻲ ﻻ ﺗﻨـﺪرج ﺗﺤـﺖ ﺗﻘﻨﻴـﺔ ،True Typeﻓـﺎن ﺣﺠـﻢ اﻟﺨـﻂ Font.Sizeﻻ ﻳﺘـﻮﻓﺮ ﺑﻜـﻞ
اﻟﻤﻘﺎﺳﺎت ،ﻓﻼ ﺗﺜـﻖ ﺑﺎﻟﻘﻴﻤـﺔ اﻟﺘـﻲ ارﺳـﻠﺘﻬﺎ اﻟـﻰ هـﺬﻩ اﻟﺨﺎﺻـﻴﺔ ،ﻻن Visual Basic
ﻳﻘﻮم ﺑﺘﻐﻴﻴﺮهﺎ:
ﺧﺼﺎﺋﺺ اﻟﻠﻮن
اﻟﺨﺎﺻﻴﺘﺎن BackColorو ForeColorﺗﻤـﺜﻼن ﻟـﻮن اﻟﺨﻠﻔﻴـﺔ وﻟـﻮن اﻟﺨـﻂ ﻟـﻸداة .ﺑﻌـﺾ
اﻻدوات آـ ScorllBarﻻ ﺗﺪﻋﻢ هﺎﺗﺎن اﻟﺨﺎﺻﻴﺘﺎن ،ﻓﺄﻟﻮاﻧﻬﺎ ﺗﻜﻮن ﻗﻴﺎﺳﻴﺔ ﻣﺴﺘﻮﺣﺎﻩ ﻣـﻦ
ﻧﻈﺎم اﻟﺘﺸﻐﻴﻞ .ﺑﻌﺾ اﻻدوات آـ Labelﻻ ﻳﻤﻜﻦ ان ﺗﻠﺤﻆ اﻟﺘﻐﻴﻴﺮ ﻓـﻲ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ
BackColorاﻻ اذا آﺎﻧﺖ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ BackStyleﺗﺴﺎوي .1-Opaqueآـﺬﻟﻚ اﻟﺤـﺎل
ﻣﻊ زر اﻻواﻣﺮ ،CommandButtonﻓﻠﻦ ﺗﺘﻤﻜﻦ ﻣﻦ ﻣﺸﺎهﺪة اﻟﺘﻐﻴﻴـﺮ اﻟﻠـﻮﻧﻲ ﻟﺨﻠﻔﻴﺘـﻪ
اﻻ اذا ﺣﻮﻟـــﺖ ﻗﻴﻤـــﺔ ﺧﺎﺻـــﻴﺘﻪ Styleاﻟـــﻰ 1–Graphicalﻣـــﻊ اﻟﻌﻠـــﻢ ان اﻟﺨﺎﺻـــﻴﺔ
ForeColorﻟﻴﺴﺖ ﻣﺪﻋﻮﻣﺔ ﻓﻴﻪ.
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻘﻴﻢ اﻻﻟﻮان ﻓﻤﻦ اﻻﻓﻀﻞ ان اﻗﺴﻤﻬﺎ ﻟـﻚ اﻟـﻰ ﻗﺴـﻤﻴﻦ :اﻻﻟـﻮان اﻟﻘﻴﺎﺳـﻴﺔ
Standard Colorواﻻﻟﻮان اﻟﺨﺎﺻـﺔ .Custom Colorاﻻﻟـﻮان اﻟﻘﻴﺎﺳـﻴﺔ هـﻲ اﻟﻤﻔﻀـﻠﺔ
ﻓﻲ ﻣﻌﻈﻢ اﻻﺣﻮال ﻟﻼدوات ﻻﻧﻬﺎ اﻟﻮان ﻳﺤﺪدهﺎ اﻟﻤﺴﺘﺨﺪم ﻋﻦ ﻃﺮﻳـﻖ ﺧﺎﻧـﺔ اﻟﺘﺒﻮﻳـﺐ
Appearanceﻓﻲ ﺻﻨﺪوق اﻟﺤﻮار Display Propertiesﻣﻦ ﻟﻮﺣﺔ اﻟﺘﺤﻜﻢ ،ﻓﻬﻲ اﻟـﻮان
ﺗﻨﺎﺳﺐ ﻣﺰاج اﻟﻤﺴـﺘﺨﺪم وﻳﺮﻳـﺪ ان ﺗﻈﻬـﺮ ﺟﻤﻴـﻊ ﺗﻄﺒﻴﻘـﺎت Windowsﺑﻬـﺬﻩ اﻻﻟـﻮان.
ﻟﺬﻟﻚ ،ﻣﻦ اﺳﺎﻟﻴﺐ اﺣﺘﺮام ذوق اﻟﻤﺴﺘﺨﺪم هﻮ اﺳﺘﺨﺪام اﻻﻟـﻮان اﻟﺘـﻲ ﺗﻨﺎﺳـﺒﻪ ﻋـﻦ
23
ﻃﺮﻳﻖ اﻻﻋﺘﻤﺎد ﻋﻠﻰ اﻻﻟﻮان اﻟﻘﻴﺎﺳﻴﺔ .Standard Colorاﻣﺎ اﻟﻨﻮع اﻻﺧﺮ وهـﻮ اﻻﻟـﻮان
اﻟﺨﺎﺻــﺔ ،ﻓﻬــﻲ اﻟــﻮان ﺳــﺘﺎﺗﻴﻜﻴﺔ أي ﺛﺎﺑﺘــﺔ ﻻ ﺗﺘﻐﻴــﺮ ﻣﻬﻤــﺎ ﻗــﺎم اﻟﻤﺴــﺘﺨﺪم ﺑﺘﻌــﺪﻳﻞ
ﺧﺼــﺎﺋﺺ ﺳــﻄﺢ ﻣﻜﺘﺒــﻪ ،وان ﻟــﻢ ﺗﻜــﻦ ﻣﺼــﻤﻢ راﻗــﻲ ﻓــﻲ اﺧﺘﻴــﺎر اﻻﻟــﻮان اﻟﻤﻨﺎﺳــﺒﺔ
ﻻدواﺗــﻚ ،ﻓﺎﻧﺼــﺤﻚ ﺑﺎﻻﻧﺘﻘــﺎل اﻟــﻰ ﻓﻘــﺮة "ﺧﺼــﺎﺋﺺ اﻟﺠﺪوﻟــﺔ" .اﻣــﺎ اذا آﻨــﺖ ﻣــﻦ
اﻟﻤﻌﺎﺷﺮﻳﻦ ﻟﻠﻴﻮﻧﺎردو داﻓﻨﺸﻲ او ﻣﺎﻳﻜـﻞ اﻧﺠﻠـﻮ ،ﻓﺘﺴـﺘﻄﻴﻊ اﺳـﺘﺨﺪام ﻣﺠﻤﻮﻋـﺔ ﻣـﻦ
اﻟﺜﻮاﺑﺖ ﺗﻤﺜﻞ ارﻗﺎم اﻻﻟﻮان:
Me.BackColor = vbGreen
Me.BackColor = vbBlue
او داﻟﺔ QBColorواﺳﺘﺨﺪام ﻧﻔﺲ اﻻﻋﺪاد اﻟﺘﻲ آﻨﺖ ﺗﺴـﺘﺨﺪﻣﻬﺎ ﻓـﻲ اﻳـﺎم ﻃﻔﻮﻟﺘـﻚ
ﻣﻊ ﺑﻴﺌﺔ :MS-DOS
وإن آﻨﺖ ﺗﺘﻤﺘﻊ ﺑﺬاآﺮة ﻗﻮﻳﺔ ﺟﺪا ﺟﺪا ﺟﺪا ﺗﺤﻔﻆ اآﺜﺮ ﻣﻦ 16ﻣﻠﻴـﻮن ﻟـﻮن ،ﻓﺘﺴـﺘﻄﻴﻊ
اﻻﺳﺘﻔﺎدة ﻣﻦ هﺬﻩ اﻟﺬاآﺮة ﻗﺒﻞ اﻟﺠﻨﻮن واﺳﺘﺨﺪم اﻟﺜﻮاﺑﺖ اﻟﻌﺪدﻳﺔ ﻣﺒﺎﺷﺮة:
Me.BackColor = 4234232
ﻗﻴﻤﺔ ﺳﺖ ﻋﺸﺮﻳﺔ ‘ Me.ForeColor = &H53FF2
آﻞ اﻟﻄﺮق اﻟﺴـﺎﺑﻘﺔ ﺗﻌﻤـﻞ ﺑﺸـﻜﻞ ﺟﻴـﺪ ﻓـﻲ وﻗـﺖ اﻟﺘﻨﻔﻴـﺬ وﺣﺘـﻰ وﻗـﺖ اﻟﺘﺼـﻤﻴﻢ،
ﻓﺘﺴﺘﻄﻴﻊ اﺳﺘﺨﺪام اﻟﺪوال اﻟﺴﺎﺑﻘﺔ QBColorو RGBﻓﻲ ﺧﺎﻧﺔ آﺘﺎﺑﺔ ﻗﻴﻤﺔ ﺧﺼـﺎﺋﺺ
اﻻﻟﻮان ﻓﻲ ﺟﺪول ﻧﺎﻓﺬة اﻟﺨﺼﺎﺋﺺ ،رﻏﻢ اﻧﻬـﺎ ﺗـﻮﻓﺮ ﻟـﻚ ﻟـﻮح اﻟـﻮان ﻳﻌﻄﻴـﻚ ﻓﻜـﺮة ﻋـﻦ
ﻋﻤﻖ اﻟﻠﻮن ﻗﺒﻞ اﺧﺘﻴﺎرﻩ.
ﺧﺼﺎﺋﺺ اﻟﺠﺪوﻟﺔ
ﻣﻌﻈﻢ ﻣﺴـﺘﺨﺪﻣﻲ ﺗﻄﺒﻴﻘـﺎت Windowsﻳﻔﻀـﻠﻮن اﺳـﺘﺨﺪام ﻣﻔﺘـﺎح اﻟﺠﺪوﻟـﺔ ][TAB
ﻟﻠﺘﻨﻘﻞ ﺑﻴﻦ اﻻدوات .ﻣﻌﻈﻢ اﻻدوات اﻟﺘـﻲ ﻟﻬـﺎ ﻗﺎﺑﻠﻴـﺔ اﻧﺘﻘـﺎل اﻟﺘﺮآﻴـﺰ Focusﻋﻠﻴﻬـﺎ –
24
آﺄداة اﻟﻨﺺ ،ﺗﺤﺘﻮي ﻋﻠﻰ ﺧﺼﺎﺋﺺ اﻟﺠﺪوﻟﺔ TabStopو .TabIndexﺣﺪد ﻋـﻦ ﻃﺮﻳـﻖ
اﻟﺨﺎﺻﻴﺔ TabStopﻣﺎ اذا آﻨﺖ ﺗﺮﻳﺪ ﺟﻌﻞ اﻟﺘﺮآﻴـﺰ ﻳﻨﺘﻘـﻞ اﻟـﻰ اﻷداة ﺑﻤﺠـﺮد ان ﻳﻀـﻐﻂ
اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ اﻟﻤﻔﺘﺎح ] ،[TABورﺗﺐ ﻓﻬﺮس اﻟﺘﺮآﻴﺰ ﻋﻦ ﻃﺮق اﻟﺨﺎﺻﻴﺔ TabIndex
ﻟﻜﻞ أداة ،ﻣﻊ اﻟﻌﻠﻢ ان ﺗﺮﻗﻴﻢ اﻟﻔﻬﺮس ﻳﺒﺪأ ﻋﺎدة ﻣﻦ اﻟﺼﻔﺮ.
Command1.MousePointer = vbCustom
)”Command1.MouseIcon = LoadPicture (“C:\Test.ICO
ﻟﻦ ﺗﻼﺣﻆ ﺗﻐﻴﻴﺮ اﻟﻤﺆﺷﺮ اﻻ اذا ﻣﺮر اﻟﻤﺴـﺘﺨﺪم ﻣﺆﺷـﺮ اﻟﻔـﺄرة ﻓـﻮق اﻷداة .ﻣـﻊ ذﻟـﻚ،
هﻨﺎك ﻋﺪة ﻋﻮاﻣﻞ ﺗﻤﻨﻊ Visual Basicﻣﻦ ﺗﻐﻴﻴﺮ ﺷﻜﻞ اﻟﻤﺆﺷـﺮ ان ﺗـﻢ ﺗﻐﻴﻴـﺮ اﻟﻤﺆﺷـﺮ
اﻟﻌﺎم ﻟﻠﺒﺮﻧﺎﻣﺞ واﻟﻤﺘﻤﺜﻞ ﻓﻲ اﻟﻜﺎﺋﻦ ،Screenﺟﺮب هﺬا اﻟﻜﻮد ﻟﻠﺤﻈﺔ:
Screen.MousePointer = 2
ﻟﻦ ﻳﺘﻐﻴﺮ ﺷﻜﻞ اﻟﻤﺆﺷﺮ اﺑﺪا ‘ Command1.MousePointer = 5
رﻏﻢ اﻧﻨﺎ ﺧﺼﺼﻨﺎ رﻣﺰ ﻣﻌﻴﻦ ﻟﺰر اﻻواﻣﺮ ،اﻻ ان Visual Basicﺗﺠﺎهﻞ ﺗﺨﺼﻴﺼﻨﺎ وآﺄﻧﻨـﺎ ﻻ
ﻧﻌﻨﻴﻪ ﺷﻴﺌﺎ ،اﻟﺘﺠﺎهﻞ ﻣﻦ Visual Basicﻟﻴﺲ اﻧﻘﺎص ﻓـﻲ ﺗﻘـﺪﻳﺮﻧﺎ او اﺣﺘﺮاﻣﻨـﺎ ،واﻧﻤـﺎ
ﻓﻲ اﺳﻠﻮب ﺗﻌﺎﻣﻞ Visual Basicﻣﻊ ﺧﺎﺻﻴﺔ MousePointerواﻟﺬي ﻳﻜﻮن آﺎﻟﺘﺎﻟﻲ:
-اذا آﺎﻧﺖ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ MousePointerاﻟﺘﺎﺑﻌـﺔ ﻟﻠﻜـﺎﺋﻦ Screenﻏﻴـﺮ ،0-Default
ﻓــﺎن Visual Basicﺳــﻴﺘﺠﺎهﻞ ﺟﻤﻴــﻊ ﺧﺼــﺎﺋﺺ MousePointerاﻟﺘﺎﺑﻌــﺔ ﻟﺴــﺎﺋﺮ
اﻻدوات ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ ،وﺳﻴﻜﻮن ﺷﻜﻞ اﻟﻤﺆﺷﺮ هﻮ اﻟﺸﻜﻞ اﻟﺬي ﺗﺤﺪدﻩ ﻓﻲ هـﺬﻩ
اﻟﺨﺎﺻﻴﺔ داﺋﻤﺎ واﺑﺪا اﻻ ﻓﻲ ﺣﺎﻟﺔ اﻧﺘﻘﺎل اﻟﻤﺆﺷﺮ اﻟﻰ ﺑﺮﻧﺎﻣﺞ اﺧﺮ.
25
اآﻮاد اﻻﺟﺮاء ‘
…
ﺗﻘﻨﻴـﺔ اﻟﻤـﺮﺁة ﻇﻬـﺮت ﻣﻨـﺬ اﻻﺻـﺪار Windows 98وهـﻲ ﺗﻘﻨﻴـﺔ ﺗﻘـﻮم ﻣﻼﺣﻈﺔ:
ﺑﻘﻠــﺐ ﺷــﻜﻞ ادوات Windowsاﻟﻘﻴﺎﺳــﻴﺔ واﻟﺸــﺎﺋﻌﺔ اﻟــﻰ اﻻﺗﺠــﺎﻩ
اﻟﻌﺮﺑﻲ –ﻣﻦ اﻟﻴﻤـﻴﻦ اﻟـﻰ اﻟﻴﺴـﺎر .ﻃﺮﻳﻘـﺔ ﺗﻄﺒﻴﻘﻬـﺎ ﺗـﺘﻢ ﻋـﻦ ﻃﺮﻳـﻖ
اﻟﺨــﻮض ﻓــﻲ اﺟــﺮاءات APIﺧﺎﺻــﺔ ،ﺳــﻨﺘﻌﺮف ﻋﻠﻴﻬــﺎ ﻓــﻲ اﻟﻔﺼــﻮل
اﻟﻼﺣﻘﺔ ﺑﻤﺸﻴﺌﺔ اﷲ.
End Sub
ﺧﺼﺎﺋﺺ اﺧﺮى
ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﻤﺸﺘﺮآﺔ اﻻﺧﺮى ﺧﺎﺻﻴﺔ اﻟﺮؤﻳﺔ Visibleاﻟﺘﻲ ﺗﻤﻜﻨﻚ ﻣﻦ اﺧﻔـﺎء اﻷداة
واﻻدوات اﻟﻤﺤﻀﻮﻧﺔ ﺑﻬﺎ ﻋﻦ ﻋـﻴﻦ اﻟﻤﺴـﺘﺨﺪم ﻟﻜﻨﻬـﺎ ﻇـﺎهﺮة ﻟﻌـﻴﻦ اﻟﻤﺒـﺮﻣﺞ ،ﻓـﺎﻷداة
28
ﻣﻮﺟﻮدة ﻓﻲ اﻟﺬاآﺮة وﺑﺎﻣﻜﺎن اﻟﻤﺒﺮﻣﺞ اﻟﻮﺻﻮل اﻟﻴﻬﺎ ﺣﺘﻰ وان آﺎﻧـﺖ ﻣﺨﻔﻴـﺔ .ﺧﺎﺻـﻴﺔ
اﻟﺘﻤﻜﻴﻦ Enabledﺗﻤﻨﻊ اﻟﻤﺴـﺘﺨﺪم ﻣـﻦ اﻟﺘﻔﺎﻋـﻞ ﻣـﻊ اﻷداة ﺳـﻮاء ﺑـﺎﻟﻨﻘﺮ او اﻟﻜﺘﺎﺑـﺔ
ﻋﻠﻴﻬﺎ وهﻲ ﺗﺆﺛﺮ اﻳﻀﺎ ﻋﻠﻰ اﻻدوات اﻟﻤﺤﻀﻮﻧﺔ ﺑﻬﺎ .اﻟﺨﺎﺻﻴﺔ Tagﺗﺤﻔﻆ ﻗﻴﻤـﺔ ﺣﺮﻓﻴـﺔ
Stringﺗﻜﻮن ﻗﻴﻤﺔ اﺿﺎﻓﻴﺔ -ﻻ راﺣﺖ وﻻ ﺟﺖ -وﻻ ﺗﺆﺛﺮ ﺑﺎي ﺷﻜﻞ ﻣـﻦ اﻻﺷـﻜﺎل ﻋﻠـﻰ
ﺳﻠﻮك او ﻣﻈﻬﺮ اﻷداة .اﻟﺨﺎﺻﻴﺔ Indexﺗﺴﺘﺨﺪم ﻓﻲ ﺣﺎﻟﺔ ﻧﺴـﺦ اﻻدوات ﻟﺘﻜـﻮﻳﻦ ﻣـﺎ
ﻳﻌﺮف ﺑﻤﺼﻔﻮﻓﺔ اﻻدوات Control Arrayواﻟﺬي ﺳﻨﺘﻄﺮق اﻟﻴﻪ ﻓﻲ ﻓﺼـﻞ "اﻻﺳـﺘﺨﺪام
اﻟﻤﺘﻘﺪم ﻟﻠﻨﻤﺎذج".
وﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﺘﻲ ﺗﺆﺛﺮ ﻋﻠﻰ ﻣﻈﻬﺮ اﻷداة واﻟﻤﺪﻋﻮﻣـﺔ ﻋﻠـﻰ ﺑﻌـﺾ اﻻدوات ﺧﺎﺻـﻴﺔ
اﻟﻤﻈﻬــﺮ Appearanceاﻟﺘــﻲ ﺗﻌﻄــﻲ ﻣﻈﻬــﺮ ﺛﻼﺛــﻲ اﻻﺑﻌــﺎد 3-Dﻟــﻸداة ،واﻟﺨﺎﺻــﻴﺔ
BorderStyleاﻟﺘﻲ ﺗﺨﻔﻲ او ﺗﻈﻬﺮ اﻟﺤـﺪود اﻟﺨﺎرﺟﻴـﺔ ﻟـﻸداة وأﻳﻀـﺎ ﺧﺎﺻـﻴﺔ اﻟﻤﺤـﺎذاة
Alignاﻟﺘﻲ ﺗﺤﺎذي اﻷداة ﺗﻠﻘﺎﺋﻴﺎ ﺣﺘﻰ ﻣﻊ ﺗﻐﻴﻴﺮ ﺣﺠﻢ اﻟﻨﺎﻓﺬة دون اﻟﺤﺎﺟﺔ اﻟـﻰ آﺘﺎﺑـﺔ
اآﻮاد اﺿﺎﻓﻴﺔ.
ﺗﻼﺣﻆ ﻓﻲ ﻣﻌﻈﻢ ﺗﻄﺒﻴﻘﺎت Windowsﻇﻬﻮر ﻣﺮﺑﻊ اﺻـﻔﺮ ﻋﻨـﺪﻣﺎ ﺗﻘـﻮم ﺑﺘﻮﺟﻴـﻪ ﻣﺆﺷـﺮ
اﻟﻔﺄرة اﻟﻰ أداة ﻣﻌﻴﻨﺔ واﻻﻧﺘﻈﺎر ﺑﻀﻊ ﺛﻮاﻧﻲ دون ﺗﺤﺮﻳﻚ اﻟﻤﺆﺷـﺮ ،هـﺬا اﻟﻤﺮﺑـﻊ ﻳـﺪﻋﻰ
أداة اﻟﺘﻠﻤﻴﺢ ،ToolTipﺑﺎﻣﻜﺎﻧﻚ ﺗﺨﺼﻴﺺ ﺗﻠﻴﻤﺢ ﻟﻜﻞ أداة ﻣﻮﺟﻮدة ﻓـﻲ ﻧﺎﻓـﺬة اﻟﻨﻤـﻮذج
ﻋﻦ ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ .ToolTipText
اﺧﻴــﺮا ،اﻟﺨﺼــﺎﺋﺺ اﻟﻘﺪﻳﻤــﺔ آﺨﺼــﺎﺋﺺ اﻟﺴــﺤﺐ واﻻﻟﻘــﺎء DragModeو DragIconاو
ﺧﺼﺎﺋﺺ اﻟﺮﺑﻂ اﻟﺪﻳﻨﺎﻣﻴﻜﻲ .... LinkItem ،LinkMode ،LinkTopicاﻟﺦ ﻣﻦ اﻟﺨﺼـﺎﺋﺺ
اﻟﺘﻲ ﻗﺪ ﺟﺎر ﻋﻠﻴﻬﺎ اﻟﺰﻣﻦ وﻃﻐﺖ ﻋﻠﻴﻬﺎ ﺗﻘﻨﻴﺎت اﻓﻀﻞ ﻣﻨﻬﺎ .اذا آﻨـﺖ ﻣﻀـﻄﺮ ﻟﺘﺤﻘﻴـﻖ
اﻟﺘﻮاﻓﻘﻴﺔ Compatibilityﻣﻊ ﺑﺮاﻣﺠـﻚ اﻟﻘﺪﻳﻤـﺔ ،ﻓﻬـﻲ ﻣﺎزاﻟـﺖ ﻣﺪﻋﻮﻣـﺔ ﺑﺸـﻜﻞ ﺟﻴـﺪ
ﺟﺪا ،اﻣﺎ هﺬا اﻟﻜﺘﺎب ﻓﻠﻦ ﻳﻨﻈﺮ اﻟﻰ اﻟﺨﻠﻒ اﺑﺪا وﻟﻦ ﻳﺬآﺮ هﺬﻩ اﻟﺨﺼﺎﺋﺺ ﺑﻌـﺪ اﻟﻨﻘﻄـﺔ
اﻟﺘﺎﻟﻴﺔ.
اﻟﻄﺮق اﻟﻤﺸﺘﺮآﺔ
ﺑﻌﺪ اﻟﺨﺼﺎﺋﺺ ﺗﺄﺗﻲ اﻟﻄﺮق ،اﻟﻄﺮق ﻋﺒﺎرة ﻋـﻦ اواﻣـﺮ ﺗﺮﺳـﻠﻬﺎ اﻟـﻰ اﻷداة ﻟﺘﺤﺮﻳﻜﻬـﺎ او
ﻧﻘﻞ اﻟﺘﺮآﻴﺰ إﻟﻴﻬﺎ .واﻟﻮاﻗﻊ ان اﻟﻄﺮق Methodsهﻲ ﻋﺒﺎرة ﻋـﻦ دوال Functionsﺗﻌـﻮد
ﺑﻘﻴﻢ ﻣﻌﻴﻨﻪ ،او اﺟﺮاءات Sub’sﺗﻘﻮم ﺑﻮﻇﻴﻔﺔ ﻣﺎ وﻟﻜﻨﻬﺎ ﻻ ﺗﻌﻴﺪ أي ﻗﻴﻤـﺔ .وآﻤـﺎ ﺗﻮﺟـﺪ
اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﻤﺸﺘﺮآﺔ ﺑﻴﻦ اﻻدوات ،ﺗﻮﺟﺪ اﻳﻀﺎً ﻋﺪة ﻃﺮق ﻣﺸﺘﺮآﺔ هﻲ:
اﻟﻄﺮﻳﻘﺔ Move
اذا آﺎﻧــﺖ اﻷداة ﺗــﺪﻋﻢ ﺧﺼــﺎﺋﺺ اﻟﻤﻮﻗــﻊ واﻟﺤﺠــﻢ Height ،Top ،Leftو ،Widthﻓــﺎن
اﻟﻄﺮﻳﻘﺔ Moveﻣﺪﻋﻮﻣﺔ ﺑﻬﺎ ﻻ ﻣﺤﺎﻟﺔ .ﻓﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ:
29
Form1.Left = 100
Form1.Top = 200
Form1.Height = 300
Form1.Width = 400
ﻳﻘﻮم ﻳﺘﻔﺠﻴﺮ اﻟﺤﺪث 4 Form_Resizeﻣﺮات اﻟﻰ ﺟﺎﻧﺐ اﻧﻪ ﻳﺴـﺘﻬﻠﻚ 4ﺳـﻄﻮر ﻣﻤﻠـﺔ
ﺗﺆدي اﻟﻰ ﺑﻂء ﻓﻲ اﻟﺘﻨﻔﻴﺬ ،ﻣﻦ هﻨﺎ ﺗﺒﺮز ﻣﻴﺰة اﻟﻄﺮﻳﻘﺔ :Move
ﺟﻤﻴﻊ اﻟﻘﻴﻢ اﻟﻤﺮﺳﻠﺔ اﺧﺘﻴﺎرﻳﺔ ﺑﺎﺳﺘﺜﻨﺎء اﻟﻘﻴﻤـﺔ اﻻوﻟـﻰ ،وﻻ ﺗﺴـﺘﻄﻴﻊ ارﺳـﺎل ﻗﻴﻤـﺔ
دون ارﺳﺎل ﻗﻴﻤﺔ ﺳﺎﺑﻘﺔ ﻟﻬﺎ:
اﻟﻄﺮﻳﻘﺔ SetFocus
ﺗﻮﺟﻴﻪ اﻟﺘﺮآﻴﺰ اﻟـﻰ اﻷداة ﻳـﺘﻢ ﺑﺎﺳـﺘﺪﻋﺎء اﻟﻄﺮﻳﻘـﺔ SetFocusاﻟﺨﺎﺻـﺔ ﺑﻬـﺎ .اذا آﺎﻧـﺖ
اﻷداة ﻣﺨﻔﻴـﺔ او ﻏﻴـﺮ ﻣﻤﻜﻨــﺔ ،ﻓـﺎن هـﺬﻩ اﻟﻄﺮﻳﻘــﺔ ﺳﺘﺘﺴـﺒﺐ ﻓـﻲ وﻗــﻮع ﺧﻄـﺄ وﻗــﺖ
اﻟﺘﺸـﻐﻴﻞ .Run Time Errorﻟـﺬﻟﻚ ،ﻳﻨﺼـﺢ ﺑـﺎﻟﺘﺤﻘﻖ ﻣـﻦ ﺧﺎﺻـﻴﺘﻲ اﻟﻈﻬـﻮر Visible
واﻟﺘﻤﻜﻴﻦ Enabledﻗﺒﻞ ﻧﻘﻞ اﻟﺘﺮآﻴﺰ اﻟﻰ اﻷداة:
اذا آﻨﺖ ﺗﺮﻳﺪ ﻣﻨﻊ اﻟﻤﺴﺘﺨﺪم ﻣﻦ ﻧﻘﻞ اﻟﺘﺮآﻴﺰ اﻟﻰ أي أداة اﺧـﺮى ﻗﺒـﻞ ﺗﺤﻘـﻖ ﺷـﺮط
ﻣﻌﻴﻦ ،ﻓﺎﻓﻀﻞ ﻣﻜﺎن هﻮ اﻟﺤﺪث :LostFocus
اﻋﻴــﺪ واآــﺮر ،ﻻ ﺗﺤــﺎول اﺳــﺘﺨﺪام هــﺬﻩ اﻟﻄﺮﻳﻘــﺔ اﻻ ﻓــﻲ ﺣﺎﻟــﺔ ﻇﻬــﻮر اﻷداة ،ﻓﻠــﻮ
اﺳــﺘﺨﺪﻣﺘﻬﺎ ﻓــﻲ اﻟﺤــﺪث Form_Loadﻣــﺜﻼ ،ﻋﻠﻴــﻚ اﻇﻬــﺎر اﻟﻨﺎﻓــﺬة ﻗﺒــﻞ اﺳــﺘﺨﺪام
اﻟﻄﺮﻳﻘﺔ:
اﻟﻄﺮﻳﻘﺔ ZOrder
ﻗﺪ ﺗﺤﺘﺎج اﻟﻰ اﻋﺎدة وﺿﻊ أداة ﻓـﻮق اﻻدوات او ﺧﻠـﻒ اﻻدوات وﻗـﺖ اﻟﺘﻨﻔﻴـﺬ ،اﻟﻄﺮﻳﻘـﺔ
ZOrderﺗﻔﻲ ﺑﺎﻟﻐﺮض ﻟﻮﺿﻊ اﻷداة ﻓـﻮق اﻻدوات اﻻﺧـﺮى ،وﻗـﺪ ﺗﺠﻌﻠﻬـﺎ ﺧﻠـﻒ اﻻدوات
اﺧﺮى ﻓﻲ ﺣﺎﻟﺔ ارﺳﺎل اﻟﻘﻴﻤﺔ :1
اﻟﻄﺮﻳﻘﺔ Refresh
هﺬﻩ اﻟﻄﺮﻳﻘﺔ ﺗﻄﻠﺐ ﻣﻦ اﻷداة اﻋﺎدة رﺳﻢ ﻧﻔﺴﻬﺎ .ﻋﻤﻠﻴﺎً ﻟـﻦ ﺗﺤﺘـﺎج ﻻﺳـﺘﺪﻋﺎء هـﺬﻩ
اﻟﻄﺮﻳﻘﺔ آﺜﻴﺮا ﻓـ Visual Basicﻳﻘﻮم ﺑﺮﺳﻢ اﻷداة ﺗﻠﻘﺎﺋﻴﺎ ﺑﻤﺠﺮد ﺗﻐﻴﻴﺮ ﻗـﻴﻢ ﺧﺼﺎﺋﺼـﻬﺎ.
اﻻ اﻧﻚ ﻗﺪ ﺗﺠﺒﺮ Visual Basicﻹﻋﺎدة رﺳﻢ اﻷداة ﻓﻲ ﺣﺎﻻت اﻟﻀﻐﻂ اﻟﺸﺪﻳﺪ ﻋﻠﻴﻪ:
Dim X As Long
For X = 0 To 100000
)Label1.Caption = CStr(X
Label1.Refresh
Next
End Sub
ﻗﺪ ﻳﻘﺘﺮح ﻋﻠﻲ اﺣﺪ ﻣﺒﺮﻣﺠﻲ Visual Basicاﻟﻘﺪﻣﺎء ﺑﺎﺳﺘﺨﺪام اﻟﺪاﻟﺔ .DoEventsﻓﻲ
اﻟﺒﺪاﻳﺔ ﺳﺎﺷﻜﺮﻩ ﻋﻠﻰ اﻗﺘﺮاﺣﻪ اﻟﺬآﻲ وﻟﻜﻦ ﺳﺄرﻓﺾ اﻗﺘﺮاﺣـﻪ هﻨـﺎ ﻻن وﻇﻴﻔـﺔ هـﺬﻩ
اﻟﺪاﻟﺔ ﻟﻴﺴﺖ ﻣﻘﺼﻮرة ﻋﻠﻰ اﻋﺎدة اﻟﺮﺳﻢ ﻓﻘﻂ واﻧﻤﺎ ﺗﺘﻌﺪى هـﺬا اﻟـﺪور ﺑﻜﺜﻴـﺮ ،ﻓﻬـﻲ
ﺧﺎﺻﺔ ﻟﻌﻤﻠﻴﺔ ﺗﻮزﻳﻊ اﻟﻤﻌﺎﻟﺠﺔ Processingﻟﺒﺎﻗﻲ اﺟﺰاء اﻟﺒﺮﻧﺎﻣﺞ وﻟﻴﺲ اﻻدوات ﻓﻘـﻂ،
ﻣﻤﺎ ﻳﺆدي اﻟﻰ ﺑﻄﺊ ﻓﻲ اﻟﺴﺮﻋﺔ .ﻟﻴﺲ هﺬا ﻓﻘﻂ ،ﺑﻞ ﻗﺪ ﺗﺆدي اﻟﻰ ﺷﻮاﺋﺐ ﺑﺮﻣﺠﻴﺔ
،Bugsﻓﻬﻲ ﺗﻌﻄﻲ ﻓﺮﺻﺔ آﺒﻴﺮة ﻟﻠﻤﺴﺘﺨﺪم ﻻﻋـﺎدة اﻟﻀـﻐﻂ ﻋﻠـﻰ اﻟـﺰر Command1
ﻣﺮة اﺧﺮى ﻗﺒﻞ ان ﻳﻨﺘﻬﻲ اﻻﺟﺮاء ﻣﻦ اآﻤﺎل اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﻳﺔ اﻻوﻟـﻰ .ﻋﻠـﻰ اﻟﻌﻤـﻮم،
ﺷﻜﺮا ﻋﻠﻰ اﻻﻗﺘﺮاح!
اﻻﺣﺪاث اﻟﻤﺸﺘﺮآﺔ
ﻓﻠﺴﻔﺔ اﻟﺒﺮﻣﺠﺔ اﻟﻤﺴـﻴﺮة ﺑﺎﻻﺣـﺪاث Event Driven Programmingﺗﻘﺘﻀـﻲ ﻋﻤﻠﻴـﺔ
ﺗﻨﻔﻴﺬ اﻻآﻮاد ﻋﻨﺪ ﺣﺎﻻت ﻣﻌﻴﻨﺔ ﺗﻌﺮف ﺑﻮﻗﻮع اﻻﺣﺪاث او اﻧﻔﺠﺎر اﻻﺣﺪاث .ﻓﻌﻨﺪﻣﺎ ﺗﺼﻠﻚ
رﺳﺎﻟﺔ اﻣﺮ ﻣﻦ رﺋﻴﺴﻚ ﻓﻲ اﻟﻌﻤﻞ ،ﻓـﺈن اﺳـﺘﺠﺎﺑﺘﻚ ﻟﻠﺤـﺪث ﺗﻜـﻮن ﺑﺘﻨﻔﻴـﺬ ﻣـﺎ ﻳﻄﻠـﺐ
ﻣﻨﻚ .آﺬﻟﻚ اﻟﺤﺎل ﻣﻊ اﻻدوات ،ﻓﺎﻻآﻮاد اﻟﺘﻲ ﺗﻀـﻌﻬﺎ ﻟـﻦ ﻳـﺘﻢ ﺗﻨﻔﻴـﺬهﺎ اﻻ ﻋﻨـﺪ وﻗـﻮع
اﻟﺤﺪث ﻋﻠﻴﻬﺎ .واﻻﺣﺪاث ﻋﺒﺎرة ﻋﻦ اﺟﺮاءات Sub’sاﺳﻤﺎﺋﻬﺎ ﺗﺘﺒﻊ اﻟﺼﻴﻐﺔ:
اﺳﻢ اﻟﻜﺎﺋﻦ_اﻟﺤﺪث
)( Form_Click
)( Command1_Click
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج ،ﺗﺴﻤﻴﺔ اﺣﺪاﺛﻬﺎ داﺋﻤﺎ ﻣـﺎ ﺗﺒـﺪأ ﺑﺎﻟﻜﻠﻤـﺔ Formوﻟـﻴﺲ اﺳـﻢ
اﻟﻨﻤﻮذج اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺨﺎﺻﻴﺔ .Nameوآﻤﺎ ﻋﻠﻤﻨﺎ ﺑﻮﺟـﻮد ﺧﺼـﺎﺋﺺ وﻃـﺮق ﻣﺸـﺘﺮآﺔ
ﺑﻴﻦ اﻻدوات ،ﻓﺎن اﻻﺣﺪاث ﻻ ﺗﺸﺬ ﻋﻦ هﺬﻩ اﻟﻘﺎﻋﺪة:
اﺣﺪاث اﻟﻔﺄرة
%50ﻣﻦ اآـﻮادك اﻟﻤﺴـﺘﺠﺎﺑﺔ ﺗﻜـﻮن ردة ﻓﻌـﻞ ﻻﻋﻤـﺎل دراﻣﻴـﺔ ﻗـﺎم ﺑﻬـﺎ اﻟﻤﺴـﺘﺨﺪم
ﺑﺎﻟﻔﺄرة .اول ﺣﺪث ﺗﻌﺮﺿﻪ ﻟـﻚ ﻣﻌﻈـﻢ اﻻدوات ﻋﻨـﺪ اﻟﻨﻘـﺮ اﻟﻤـﺰدوج ﻋﻠﻴﻬـﺎ هـﻮ اﻟﺤـﺪث
Clickواﻟﺬي ﻳﻨﻔﺠﺮ ﻓﻲ ﻟﺤﻈﺔ اﻟﻨﻘﺮ ﻋﻠﻰ اﻷداة ﺑﺰر اﻟﻔﺄرة اﻻﻳﺴـﺮ .واﻟﺤـﺪث DblClick
ﻳﻤﺜﻞ اﻟﻨﻘﺮ اﻟﻤﺰدوج .ﻻ ﺗﺜﻖ آﺜﻴﺮا ﻓﻲ اﻟﺤﺪث Clickوﺗﻌﺘﻘﺪ اﻧﻪ ﻻ ﻳﻨﻔﺠﺮ اﻻ ﻓـﻲ ﺣﺎﻟـﺔ
اﻟﻨﻘﺮ ﺑﺰر اﻟﻔﺄرة اﻻﻳﺴﺮ ،ﻓﻌﻨﺪ ﻗﻴﺎﻣﻚ ﺑﺘﻐﻴﻴﺮ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ Valueﻟﻼداﺗـﻴﻦ CheckBox
و ،OptionButtonﻳﻘﻮم Visual Basicﺗﻠﻘﺎﺋﻴﺎ ﺑﺘﻔﺠﻴﺮ اﻟﺤﺪث Clickاﻟﺘﺎﺑﻊ ﻟﻸداة .ﻧﻔﺲ
اﻻﻧﻔﺠﺎر ﻳﺤـﺪث ﻋﻨـﺪﻣﺎ ﺗﻘـﻮم ﺑﺘﻐﻴﻴـﺮ اﻟﺨﺎﺻـﻴﺔ ListIndexاﻟﺘﺎﺑﻌـﺔ ﻟﻼداﺗـﻴﻦ ListBoxو
.ComboBox
ﻣﻦ اﻻﺳﺎﻟﻴﺐ اﻟﺨﺎﻃﺌﺔ اﻟﺘﻲ ﻳﺘﺒﻌﻬﺎ ﻗﻠﻴﻞ ﻣﻦ اﻟﻤﺒـﺮﻣﺠﻴﻦ هـﻲ آﺘﺎﺑـﺔ اآـﻮاد ﻓـﻲ آـﻼ
اﻟﺤـﺪﺛﻴﻦ Clickو DblClickﻟـﻨﻔﺲ اﻷداة ،رﻏـﻢ اﻧـﻚ ﺗﺴـﺘﻄﻴﻊ ﻋﻤـﻞ ذﻟـﻚ ﺑــ Visual
،Basicاﻻ اﻧﻬﺎ ﻃﺮﻳﻘﺔ ﻏﻴﺮ ﻣﺮﻧﺔ ﺗﺴﺒﺐ اﻟﺘﺸﻮﻳﺶ ﻋﻠﻰ ﻣﺴﺘﺨﺪم ﺑﺮﻧﺎﻣﺠﻚ ﺗﺆدي ﺑـﻪ
اﻟـﻰ اﻻﺳـﺘﻐﻨﺎء ﻋـﻦ اﻟﻔـﺄرة .ﻓﻠـﻮ ﻗـﺎم اﻟﻤﺴـﺘﺨﺪم ﺑـﺎﻟﻨﻘﺮ اﻟﻤـﺰدوج ﻋﻠـﻰ اﻷداة ،ﻓـﺎن
اﻟﺤﺪث Clickﺳﻴﺘﻢ ﺗﻨﻔﻴـﺬﻩ اوﻻ وﻣـﻦ ﺛـﻢ ﺗﻨﻔﻴـﺬ اﻟﺤـﺪث .DblClickاذا آـﺎن ﻻﺑـﺪ ﻣـﻦ
اﺳﺘﺨﺪام اﻟﺤﺪﺛﻴﻦ ﻓﻲ أداة واﺣﺪة ،ﻓﺎﺗﻤﻨﻰ ﻣﻦ ﺻﻤﻴﻢ ﻗﻠﺒﻲ ﻣﻌﺮﻓﺔ اﻟﺤﺪث اﻟﻤﻘﺼـﻮد
ﻗﺒﻞ ﺗﻨﻔﻴﺬﻩ ﺣﺘﻰ ﻻ ﻳﺴﺘﻐﻨﻲ اﻟﻤﺴﺘﺨﺪم ﻋﻦ ﻓﺄرﺗﻪ:
End Sub
End Sub
اذا آﻨﺖ ﺗﺮﻳﺪ ﻣﻌﺮﻓﺔ اﻟﻤﺰﻳﺪ ﻣﻦ اﻟﺘﻔﺎﺻﻴﻞ ﺣﻮل ﻋﻤﻠﻴﺔ اﻟﻨﻘﺮ اﻟﺘﻲ ﻗﺎم ﺑﻬﺎ اﻟﻤﺴﺘﺨﺪم،
آﻤﻮﻗﻊ ﻣﺆﺷﺮ اﻟﻔﺄرة او اﻟﺰر اﻟﺬي اﺳﺘﺨﺪﻣﻪ اﻟﻤﺴـﺘﺨﺪم ﺳـﻮاء اﻻﻳﻤـﻦ او اﻻﻳﺴـﺮ ....
اﻟـــﺦ ﻣـــﻦ ﺗﻔﺎﺻـــﻴﻞ دﻗﻴﻘـــﺔ ،ﻓﻴﺴـــﺮﻧﻲ ان اﻋـــﺮض ﻋﻠﻴـــﻚ اﻻﺣـــﺪاث ،MouseDown
MouseMoveو MouseUpاﻟﺘﻲ ﺗﻌﻄﻴﻚ ﺗﻔﺎﺻﻴﻞ اآﺜﺮ ﻋﻦ ﻋﻤﻠﻴﺎت اﻟﻔﺄرة ﻋﻠﻰ ﺷـﻜﻞ
ﻣﺘﻐﻴــﺮات ﻣﺮﺳــﻠﺔ هــﻲ :ﻧــﻮع اﻟــﺰر اﻟﻤﺴــﺘﺨﺪم ،Buttonاﻟﻤﻔــﺎﺗﻴﺢ اﻟﻤﻀــﻐﻮﻃﺔ ،Shift
اﻻﺣﺪاﺛﻲ اﻟﺴﻴﻨﻲ ﻟﻠﻤﺆﺷﺮ Xواﻻﺣﺪاﺛﻲ اﻟﺼﺎدي ﻟﻠﻤﺆﺷﺮ .Y
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺰر اﻟﻤﺴﺘﺨﺪم ،Buttonﻓﻘـﺪ ﻳﻜـﻮن اﻟـﺰر اﻻﻳﻤـﻦ و/او اﻻﻳﺴـﺮ و/او اﻻوﺳـﻂ
ﻟﻠﻔﺄرة ،هﺬا اﻟﻤﺜﺎل ﻳﻌﻄﻴﻚ ﻓﻜﺮة ﻋﻦ ﻃﺮﻳﻘﺔ ﻣﻌﺮﻓﺔ اﻻزرار اﻟﻤﻀﻐﻮﻃﺔ:
اﻣﺎ اﻟﻤﻔﺘﺎح اﻟﻤﻀﻐﻮط ،Shiftﻓﻬﻮ ﻧﻔﺲ اﻟﻤﺘﻐﻴﺮ Shiftاﻟﺨﺎص ﺑﺎﺣـﺪاث ﻟﻮﺣـﺔ اﻟﻤﻔـﺎﺗﻴﺢ
KeyUpو KeyDownواﻟﻤﺜﺎل اﻟﺘﻄﺒﻴﻘﻲ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻌﻪ ﻣﻮﺟﻮد ﻓﻲ ﻓﻘﺮة "اﺣﺪاث ﻟﻮﺣـﺔ
اﻟﻤﻔﺎﺗﻴﺢ" اﻟﺘﻲ ﺳﺘﺼﻞ اﻟﻴﻬـﺎ ﻗﺮﻳﺒـﺎ .وﺑﺎﻟﻨﺴـﺒﺔ ﻟﻼﺣـﺪاﺛﻴﺎت Xو Yﻓﻬـﻲ ﺗﻤﺜـﻞ ﻣﻮﻗـﻊ
ﻣﺆﺷﺮ اﻟﻔﺄرة ﺑﺎﻟﻨﺴـﺒﺔ ﻟـﻸداة ﻧﻔﺴـﻬﺎ وﻟـﻴﺲ اﻟﺸﺎﺷـﺔ ،ﺣﻴـﺚ ﺗﻤﺜـﻞ اﻟﻨﻘﻄـﺔ )(0 ،0
34
اﻟﺰاوﻳﺔ اﻟﻌﻠﻮﻳﺔ اﻟﻴﺴﺮى ﻟﻸداة ،وﺗـﺰداد ﻗﻴﻤـﺔ Xآﻠﻤـﺎ اﺗﺠـﻪ ﻣﺆﺷـﺮ اﻟﻔـﺄرة اﻟـﻰ ﺟﻬـﺔ
اﻟﻴﻤﻴﻦ وﺗﺰداد ﻗﻴﻤﺔ Yآﻠﻤﺎ اﺗﺠﻪ ﻣﺆﺷﺮ اﻟﻔﺄرة اﻟﻰ اﻻﺳﻔﻞ.
ﻳﺘﻢ ﺗﻔﺠﻴﺮ اﻟﺤﺪث MouseMoveﺑﻤﺠـﺮد ان ﻳﻘـﻮم اﻟﻤﺴـﺘﺨﺪم ﺑﺘﺤﺮﻳـﻚ اﻟﻤﺆﺷـﺮ ﻓـﻮق
اﻷداة ،وﻧﻬﺎﻳﺔ اﻟﺤـﺪث ﺗﻜـﻮن ﻟﺤﻈـﺔ ﺧـﺮوج اﻟﻤﺆﺷـﺮ ﻋـﻦ ﺣـﺪود اﻷداة .اﻣـﺎ ﻓـﻲ ﺣﺎﻟـﺔ
اﻻﻟﺘﻘﺎط Capturingﻓﺎن اﻟﺤﺪث MouseMoveﺳﻴﺘﻢ ﺗﻔﺠﻴﺮﻩ ﺣﺘﻰ ﻟﻮ ﺗﻌـﺪى اﻟﻤﺆﺷـﺮ
ﺣﺪود اﻷداة ﻣﻤﺎ ﻳﺘﺮﺗﺐ ﻋﻨﻪ ﻗﻴﻢ ﺳﺎﻟﺒﺔ ﻟﻼﺣﺪاﺛﻴﺎت Xو Yﻓﻲ ﺣﺎﻟﺔ آﻮن ﻣﺆﺷﺮ اﻟﻔﺄرة
زﺣﻒ ﻳﺴﺎر او ﻓﻮق اﻷداة.
اﺧﻴﺮا ،ﻓـﻲ ﺣﺎﻟـﺔ ﻗﻴـﺎم اﻟﻤﺴـﺘﺨﺪم ﺑـﺎﻟﻨﻘﺮ اﻟﻤـﺰدوج Double Clickﻋﻠـﻰ اﻷداة ،ﻓـﺎن
ﺗﺮﺗﻴﺐ وﻗﻮع او اﻧﻔﺠﺎر اﻻﺣﺪاث ﻳﺘﻢ ﻋﻠﻰ اﻟﻨﺤﻮ اﻟﺘﺎﻟﻲ:
MouseUp <- DblClick <- MouseMove <- Click <- MouseUp <- MouseDown
MouseMove <-ﻣﺮة اﺧﺮى.
اﺣﺪاث اﻟﺘﺮآﻴﺰ
ﻳــﺘﻢ ﺗﻔﺠﻴــﺮ اﻟﺤــﺪث GotFocusﻋﻨــﺪﻣﺎ ﺗﺴــﺘﻘﺒﻞ اﻷداة اﻟﺘﺮآﻴــﺰ ،واﻟﺤــﺪث LostFocus
ﻋﻨﺪﻣﺎ ﺗﻔﻘﺪ اﻷداة اﻟﺘﺮآﻴﺰ ،ﺳﻮاء آـﺎن ذﻟـﻚ ﺑﺎﻟﻔـﺄرة او ﻟﻮﺣـﺔ اﻟﻤﻔـﺎﺗﻴﺢ أو ﺑﺮﻣﺠﻴـﺎ .أﻣـﺎ
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج ،ﻓﻬﺬﻩ اﻻﺣﺪاث ﺗﻌﻤﻞ ﺟﻴﺪا ﺑﻬـﺎ ﺷـﺮﻳﻄﺔ ﻋـﺪم وﺟـﻮد أي أداة
ﻗﺎﺑﻠﺔ ﻻﺳﺘﻘﺒﺎل اﻟﺘﺮآﻴﺰ.
ﻟﻦ ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺗﻔﺠﻴﺮ اﻻﺣـﺪاث ﺑﺎﻟﻄﺮﻳﻘـﺔ اﻟﻤﺘﻮﻗﻌـﺔ اذا ﻓﻘـﺪت اﻟﻨﺎﻓـﺬة ﻣﻼﺣﻈﺔ:
ﺗﺮآﻴﺰهﺎ ﺑﺴﺒﺐ اﻻﻧﺘﻘﺎل اﻟـﻰ ﺗﻄﺒﻴـﻖ اﺧـﺮ او اﺳـﺘﻘﺒﻠﺖ ﺗﺮآﻴﺰهـﺎ ﺑﻌـﺪ
اﻻﻧﺘﻘﺎل ﻣﻦ ﺗﻄﺒﻴـﻖ اﺧـﺮ .ﺑﺎﺧﺘﺼـﺎر ،اﺣـﺪاث اﻟﺘﺮآﻴـﺰ ﻻ ﺗﻌﻤـﻞ اﻻ ﺑـﻴﻦ
ﻧﻮاﻓﺬ وادوات ﺑﺮﻧﺎﻣﺠﻚ ﻓﻘﻂ.
35
اﻟﻤﺘﻐﻴﺮ KeyAsciiﻣﺮﺳﻞ ﺑﺎﻟﻤﺮﺟﻊ وﻟﻴﺲ اﻟﻘﻴﻤﺔ اي ﻳﻤﻜﻨﻚ ﺗﻌﺪﻳﻞ ﻗﻴﻤﺘﻪ ﻣﻤـﺎ ﻳﺘﺮﺗـﺐ
ﻋﻠﻴﻪ ﻣﺮوﻧﺔ آﺒﻴﺮ ﻓﻲ اﻟﺘﺤﻜﻢ ﻓﻲ ﻣﺪﺧﻼت اﻟﻤﺴﺘﺨﺪم ،هﺬا اﻟﻜﻮد ﻣـﺜﻼ ﻳﺤـﻮل ﺟﻤﻴـﻊ
اﻟﺤﺮوف اﻟﻤﺪﺧﻠﺔ ﻓﻲ أداة اﻟﻨﺺ اﻟﻰ ﺣﺮوف آﺒﻴﺮة :Capital
واذا اﺳﻨﺪت ﻗﻴﻤﺔ اﻟﺼـﻔﺮ اﻟـﻰ هـﺬا اﻟﻤﺘﻐﻴـﺮ ،ﻓﺎﻧـﻚ ﻗـﺪ اﻟﻐﻴـﺖ ﻋﻤﻠﻴـﺔ ارﺳـﺎل ﻗﻴﻤـﺔ
اﻟﻤﻔﺘﺎح اﻟﻰ اﻷداة اﻟﻤﺴﺘﻘﺒﻠﺔ ﻟﻪ .هـﺬا اﻟﻜـﻮد ﻣـﺜﻼ ﻳﻤﻨـﻊ اﻟﻤﺴـﺘﺨﺪم ﻣـﻦ آﺘﺎﺑـﺔ أي
ﺷﺊ ﻓﻲ أدا اﻟﻨﺺ ﻋﺪا اﻻﻋﺪاد :9 ،... ،1 ،0
ﺗﻼﺣﻆ اﻧﻨﻲ اﻋﺘﻤﺪ ﻓﻲ اﻻﻣﺜﻠﺔ اﻟﺴﺎﺑﻘﺔ ﻋﻠـﻰ اﻟـﺪاﻟﺘﻴﻦ Ascو .Chr$ ﻣﻼﺣﻈﺔ:
ﻣﻊ ذﻟﻚ ،ﻳﻤﻜﻨﻚ اﻻﺳـﺘﻐﻨﺎء ﻋﻨﻬﻤـﺎ اذا آﻨـﺖ ﺗﻌـﺮف اﻟﻤﻘﺎﺑـﻞ اﻟﻌـﺪدي
ﻟﻠﺤﺮف اﻟﻤﻄﻠﻮب ﻓﻲ ﺟﺪول .ASCII
اﻟﻨﻤﻮذج ﺳﺘﺘﺠﺎهﻞ هﺬﻩ اﻻﺣـﺪاث وآﺄﻧﻬـﺎ ﻏﻴـﺮ ﻣﻮﺟـﻮدة ،وﻟـﻦ ﺗﻔﺠـﺮ اﻻ اﺣـﺪاث اﻷداة
ﻓﻘﻂ.
ﻧﺎﻓﺬة اﻟﻨﻤﻮذج
ﻧﺎﻓﺬة اﻟﻨﻤﻮذج ﻋﺰﻳﺰة ﻋﻠﻰ ﻗﻠـﻮب ﺟﻤﻴـﻊ ﻣﺒﺮﻣﺠـﻲ ،Visual Basicﻓﻬـﻲ اﻟﺒـﺆرة اﻟﺘـﻲ
ﻧﺮى Visual Basicﻣﻦ ﺧﻼﻟﻬﺎ ﻣﻊ اﻻﺳﻢ اﻻﺑﺘﺪاﺋﻲ ﻟﻬﺎ Form1واﻟـﺬي ﺻـﺎﺣﺒﻨﻲ ﻣﻨـﺬ
ﻋﺸﺮ ﺳﻨﻮات ﻣﻊ ﺑﺪاﻳﺎت .VB1وﻟﺤﺒﻲ ﻟﻬﺎ وﺗﻘـﺪﻳﺮي ﻟﻠﻌﺸـﺮة اﻟﻄﻮﻳﻠـﺔ ﺑﻴﻨـﻲ وﺑﻴﻨﻬـﺎ،
ﻗﺮرت ﺗﺨﺼﻴﺺ ﻓﻘﺮة ﺧﺎﺻﺔ ﺑﻬﺎ ﻓﻲ هـﺬا اﻟﻔﺼـﻞ وﻓﺼـﻞ آﺎﻣـﻞ "اﻻﺳـﺘﺨﺪام اﻟﻤﺘﻘـﺪم
ﻟﻠﻨﻤﺎذج" ﻓﻲ هﺬا اﻟﻜﺘﺎب ،ﻋﺴﺎهﺎ ان ﺗﻤﻴﺰﻧﻲ ﺑﻴﻦ اﻟﻤﺒﺮﻣﺠﻴﻦ آﻤﺎ ﻣﻴﺰﺗﻬﺎ ﻋـﻦ ﺳـﺎﺋﺮ
اﻟﻜﺎﺋﻨﺎت!
ﻗﺒﻞ ان اﺧﻮض ﻓﻲ ﺗﻔﺼﻴﻞ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج واﺗﺤـﺪث ﻋـﻦ ﺧﺼﺎﺋﺼـﻬﺎ ،ﻃﺮﻗﻬـﺎ واﺣـﺪاﺛﻬﺎ،
ﺑﻮدي اﻟﺘﻄﺮق اﻟﻰ ﻓﻜـﺮة اﻟﻘﻮاﻟـﺐ Templatesاو ﻗﻮاﻟـﺐ اﻟﻨﻤـﺎذج ،Form Templates
وهﻲ ﻋﺒﺎرة ﻋﻦ ﻧﻤﺎذج ﺟﺎهﺰة اﻟﺘﺼﻤﻴﻢ وﻣﻀﺒﻮﻃﺔ اﻟﺨﺼﺎﺋﺺ ﺗﺴﺘﺨﺪﻣﻬﺎ ﻓﻲ ﺑﺮاﻣﺠﻚ
اﻟﻴﻮﻣﻴﺔ ﺑﺼﻮرة ﻣﺘﻜﺮرة دون اﻟﺤﺎﺟﺔ اﻟﻰ اﻋﺎدة ﺗﺼﻤﻴﻤﻬﺎ ﻣﻦ اﻟﺼـﻔﺮ .اﺧﺘـﺮ اﻻﻣـﺮ Add
Formﻣﻦ ﻗﺎﺋﻤﺔ Projectوﺳﺘﻔﻬﻢ اﻟﻔﻜﺮة ﻣﻦ ﻗﻮاﻟﺐ اﻟﻨﻤﺎذج اﻟﺠﺎهﺰة .ﻓﻔﻲ ﺻـﻨﺪوق
اﻟﺤﻮار اﻟﺬي ﺳﻴﻈﻬﺮ اﻣﺎﻣﻚ ،ﺳﺘﺠﺪ اﻟﻌﺪﻳﺪ ﻣﻦ اﻟﻨﻤﺎذج اﻟﺘـﻲ ﺗﺴـﺘﺨﺪﻣﻬﺎ آﺜﻴـﺮا ﻓـﻲ
ﺑﺮاﻣﺠﻚ اﻻﻋﺘﻴﺎدﻳﺔ ،واذا آﺎﻧﺖ ﻻ ﺗﻤﻸ ﺑﺮﻳﻖ ﻋﻴﻨﻴﻚ ،ﺻﻤﻢ ﻳﺎ ﻣﺼﻤﻢ اﻟﻨﻤﺎذج آﻤﺎ ﺗﺮﻳـﺪ،
وﻣﻦ ﺛﻢ ﻗﻢ ﺑﺤﻔﻈﻬﺎ ﻓﻲ اﻟﻤﺠﻠـﺪ - \VB98\Template\Formsاو اﻟﻤﺴـﺎراﻟﻤﺤﺪد ﻓـﻲ
ﺧﺎﻧﺔ اﻟﺘﺒﻮﻳﺐ Environmentﻓـﻲ ﺻـﻨﺪوق اﻟﺤـﻮار -Optionsﺳـﺘﻼﺣﻆ وﺟـﻮد ﻧﺎﻓـﺬﺗﻚ
آﻘﺎﻟﺐ Templateﺑﻴﻦ اﻟﻘﻮاﻟﺐ اﻟﺴﺎﺑﻘﺔ.
ﺧﺼﺎﺋﺺ اﻟﻨﻤﻮذج
ﺑﻌــﺪ ان ﺗﺒــﺮق ﻧﺎﻓــﺬة اﻟﻨﻤــﻮذج اﻣــﺎم ﻋﻴﻨﻴــﻚ ،ﺳــﺘﺒﺪأ ﺑﻮﺿــﻊ اﻻدوات ﻋﻠﻴﻬــﺎ وﻣــﻦ ﺛــﻢ
ﺗﺤﺠﻴﻤﻬﺎ .وﺑﻌﺪ ذﻟﻚ ،ﺗﻘﻮم ﺑﺎﺧﺘﻴﺎر ﺷﻜﻞ ﺣﺪودهﺎ ﻣﻊ اﻟﺨﺎﺻـﻴﺔ .BorderStyleاﻟﻘﻴﻤـﺔ
0-Noneﻻ اﺳﺘﺨﺪﻣﻬﺎ اﻻ ﻓﻲ اﻟﺸﺎﺷـﺔ اﻻﻓﺘﺘﺎﺣﻴـﺔ Splash Screenﻟﺒﺮاﻣﺠـﻲ ﻻﻧﻬـﺎ
38
ﺧﺼﺎﺋﺺ اﻟﺼﻮر:
ﻋﻦ ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ AutoRedrawﺗﺤﺪد ﻣﺎ اذا آﺎﻧﺖ اﻋﺎدة رﺳﻢ ﻧﺎﻓـﺬة اﻟﻨﻤـﻮذج ﺗـﺘﻢ
ﺗﻠﻘﺎﺋﻴﺎ Trueاو ﻳﺪوﻳﺎ Falseﺑﻮاﺳﻄﺔ اآﻮادك .ﻓـﻲ اﻟﺤﺎﻟـﺔ اﻻوﻟـﻰ ﻓـﺎن ﺳـﺮﻋﺔ اﻋـﺎدة
اﻟﺮﺳﻢ ﺗﻜﻮن اﺳﺮع ﻣﻦ اﻟﺤﺎﻟﺔ اﻟﺜﺎﻧﻴﺔ ،اﻻ اﻧﻬﺎ ﺗﺴﺘﻬﻠﻚ اﻻف اﻟﻜﻴﻠﻮﺑﺎﻳﺘﺎت ﻓﻲ اﻟﺬاآﺮة
ﻣﻤﺎ ﻳﻘﻠﻞ ﻣﻦ ﻣﺼﺎدر اﻟﻨﻈـﺎم System Resourcesاﻟﻤﺘﺎﺣـﺔ ﻟﻠﺒـﺮاﻣﺞ اﻻﺧـﺮى ،ﻟـﻚ ان
ﺗﺘﺨﻴــﻞ ﻧﺎﻓــﺬة ﺣﺠﻤﻬــﺎ 800x600ﻣــﻊ ﻋﻤــﻖ ﻟــﻮﻧﻲ True Colorﺗﺴــﺘﻬﻠﻚ 1406
آﻴﻠﻮﺑﺎﻳﺖ –ﻣﺎ ﻳﺰﻳﺪ ﻋﻠﻰ 1ﻣﻴﺠـﺎ ،وﻟـﻚ ان ﺗﺘﺨﻴـﻞ 5او 9ﻧﻮاﻓـﺬ ﺟﺸـﻌﺔ ﻣـﻦ ﺑﺮﻧﺎﻣﺠـﻚ
ﻣﻔﺘﻮﺣﺔ ،وآﻢ ﺳﺘﺴﺒﺐ ﻣـﻦ اﻟـﺒﻂء ﻓـﻲ اﻟﺘﺤﻤﻴـﻞ واﻟﺤﺠـﺰ اﻟﻜﺒﻴـﺮ ﻓـﻲ اﻟـﺬاآﺮة؟ ﻣـﻦ
39
اﻟﻤﻬﻢ ان اذآﺮ هﻨﺎ ﺑﺎن اﻟﺤﺪث Form_Paintﻟﻦ ﻳﺘﻢ ﺗﻔﺠﻴـﺮﻩ اﺑـﺪا ﻃﺎﻟﻤـﺎ آﺎﻧـﺖ ﻗﻴﻤـﺔ
هﺬﻩ اﻟﺨﺎﺻﻴﺔ .Trueﺑﺎﺧﺘﺼـﺎر ،ﻻ ﺗﺴـﺘﺨﺪم هـﺬﻩ اﻟﺨﺎﺻـﻴﺔ اﻻ ﻋﻨـﺪ اﻟﺤﺎﺟـﺔ اﻟﻤﺎﺳـﺔ
ﻓﻘﻂ ،وﺣﺎول وﺿﻊ اآﻮاد اﻟﻜﺘﺎﺑﺔ واﻟﺮﺳﻢ آــ .... Line ،Printاﻟـﺦ ﺑـﻴﻦ ﺳـﻄﻮر اﻟﺤـﺪث
.Form_Paint
اذا آﻨﺖ ﺗﺴﺘﺨﺪم ﻃﺮق اﻟﺮﺳـﻢ .... Circle ،Lineاﻟـﺦ ﺑﻜﺜـﺮة ،ﻓﺎﻧﺼـﺤﻚ ﺑﺘﻐﻴﻴـﺮ ﻗﻴﻤـﺔ
اﻟﺨﺎﺻﻴﺔ ClipControlsاﻟﻰ Falseﺣﺘﻰ ﺗﺰﻳﺪ ﺳﺮﻋﺔ ﻃﺮق اﻟﺮﺳﻢ ﺑﻤﻘﺪار اﻟﻀﻌﻒ ﻻن
Visual Basicﻟﻦ ﻳﻘﻮم ﺑﺈﻧﺸﺎء ﻣﻨﻄﻘﺔ Clipping regionوﻟﻦ ﻳﻘﻮم ﺑﺎﻋـﺎدة اﻟﺮﺳـﻢ اﻻ
ﻟﻠﻤﻨﺎﻃﻖ اﻟﺘﻲ ﺗﺤﺘﺎج اﻟﻰ اﻋﺎدة رﺳﻢ ،اﻣﺎ اذا ﻟـﻢ ﺗﺴـﺘﺨﺪم ﻃـﺮق اﻟﺮﺳـﻢ ،ﻓﺎﻟﻘﻴﻤـﺔ
Trueﺗﻜﻮن ﻣﻨﺎﺳﺒﺔ ﻟﻬﺬﻩ اﻟﺨﺎﺻﻴﺔ.
اﻟﺨﺎﺻﻴﺔ HasDCﺗﺨﻴـﺮك ﻓﻴﻤـﺎ ﻟـﻮ آﻨـﺖ ﺗﺮﻳـﺪ إﻧﺸـﺎء ﺳـﻴﺎق رﺳـﻢ Device Context
ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج ام ﻻ ،ﺳﻴﺎق اﻟﺮﺳﻢ ﻋﺒﺎرة ﻋﻦ ﺗﺮآﻴﺐ ﺧﺎص ﺑﻨﻈـﺎم اﻟﺘﺸـﻐﻴﻞ ﻳﺤﻤـﻞ
ﻣﻮاﺻﻔﺎت وﺑﻴﺎﻧﺎت اﻟﺼﻮرة .اذا آﻨﺖ ﻻ ﺗﻨﻮي وﺿﻊ ﺻﻮرة ﻓﻲ اﻟﺨﺎﺻﻴﺔ ،Pictureﻓﺎﺟﻌـﻞ
ﻗﻴﻤــﺔ هــﺬﻩ اﻟﺨﺎﺻــﻴﺔ Falseآــﻲ ﺗﻘﻠــﻞ ﻣــﻦ اﺳــﺘﻬﻼك ﻣﺼــﺎدر اﻟﻨﻈــﺎم ﻣــﻊ اﻟﻌﻠــﻢ ان
اﻟﺨﺎﺻــﻴﺔ hDCﻟــﻦ ﺗﻌﻤــﻞ ﻣﻌــﻚ اﻻ اذا ﻗﻤــﺖ ﺑﺘﺤﻤﻴــﻞ ﺻــﻮرة ﻋﻠــﻰ ﻧﺎﻓــﺬة اﻟﻨﻤــﻮذج
ﻓﺴﺘﺤﻤﻞ اﻟﺨﺎﺻﻴﺔ hDCﻗﻴﻤﺔ ﻣﺆﻗﺘﺔ ﺗﺰول ﻣﺒﺎﺷﺮة ﺑﻌﺪ زوال اﻟﺼﻮرة.
اﻟﺨﺎﺻﻴﺔ Iconﺗﻤﺜﻞ اﻟﺮﻣﺰ اﻟﺬي ﻳﻈﻬﺮ ﻓﻲ ﺻﻨﺪوق اﻟﺘﺤﻜﻢ Control Boxاﻟﺘﺎﺑﻊ ﻟﻨﺎﻓﺬة
اﻟﻨﻤﻮذج واﻟﺮﻣﺰ اﻟﻈﺎهﺮ ﻋﻠﻰ زر اﻟﻨﺎﻓﺬة ﻓﻲ ﺷـﺮﻳﻂ اﻟﻤﻬـﺎم ،هـﺬا إذا آﺎﻧـﺖ اﻟﺨﺎﺻـﻴﺔ
ShowInTaskbarﺗﺴــﺎوي ،Trueاﻣــﺎ ان آﺎﻧــﺖ ﻗﻴﻤــﺔ اﻟﺨﺎﺻــﻴﺔ ) (Noneﻓــﺎن ﻧﻈــﺎم
اﻟﺘﺸﻐﻴﻞ ﻳﻀﻊ رﻣﺰ اﻓﺘﺮاﺿﻲ ﺷـﺮﻳﻄﺔ أن ﺗﻜـﻮن ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ ControlBoxﺗﺴـﺎوي
.Trueﻣـﻦ اﻟﻀـﺮوري أن ﺗﻌﻠـﻢ اﻧـﻪ ﻻ ﻳﻤﻜﻨـﻚ ﺗﺨﺼـﻴﺺ رﻣـﺰ اﻟﺒﺮﻧـﺎﻣﺞ EXE File Icon
ﺑﺸــﻜﻞ ﻣﺴــﺘﻘﻞ ،ﻓـــ Visual Basicﻳﺨﻴــﺮك ﺑــﻴﻦ اﺣــﺪ رﻣــﻮز ﻧﻮاﻓــﺬ اﻟﻨﻤــﺎذج اﻟﺘﺎﺑﻌــﺔ
ﻟﻤﺸﺮوﻋﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﻘﺎﺋﻤﺔ Iconﻣﻦ ﺧﺎﻧﺔ اﻟﺘﺒﻮﻳﺐ Makeاﻟﻤﻮﺟـﻮدة ﻓـﻲ ﺻـﻨﺪوق
ﺣﻮار ﺧﺼﺎﺋﺺ اﻟﻤﺸﺮوع .Project Properties
اﻟﺨﺎﺻﻴﺔ Pictureﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﻤﻴﻞ ﻣﻠﻒ ﺻـﻮرة ووﺿـﻌﻪ ﻓـﻲ داﺧـﻞ ﻧﺎﻓـﺬة اﻟﻨﻤـﻮذج،
ﺗــﺪﻋﻢ هــﺬﻩ اﻟﺨﺎﺻــﻴﺔ هﻴﺌــﺎت ﻣﺨﺘﻠﻔــﺔ ﻣــﻦ اﻟﻤﻠﻔــﺎت هــﻲ،JPG ،GIF ،DIB ،BMP :
ICO ،EMF ،WMFو .CURﺗﺴﺘﻄﻴﻊ ﺗﺤﻤﻴﻞ ﻣﻠﻒ اﻟﺼﻮرة وﻗﺖ اﻟﺘﺼﻤﻴﻢ ﺑﺎﺧﺘﻴﺎر اﺳـﻢ
اﻟﻤﻠﻒ ﻣﻦ ﺻﻨﺪوق ﺣـﻮار اﻟﺨﺎﺻـﻴﺔ ،او اﺳـﺘﺨﺪام ﻃﺮﻳﻘـﺔ اﺧـﺮى اﻓﻀـﻠﻬﺎ آﺜﻴـﺮا وهـﻲ
ﻧﺴﺦ Copyاﻟﺼﻮرة ﻣـﻦ اﻟﺒﺮﻧـﺎﻣﺞ اﻟـﺬي ﻳﻌﺮﺿـﻬﺎ اﻟـﻰ اﻟﺤﺎﻓﻈـﺔ Clipboardوﻣـﻦ ﺛـﻢ
ﻟﺼﻘﻬﺎ ﺑﺎﺧﺘﻴﺎر اﻻﻣﺮ Pasteﻣﻦ اﻟﻘﺎﺋﻤﺔ .Editواذا اردت وﺿﻊ اﻟﺼﻮرة ﻓﻲ وﻗﺖ اﻟﺘﻨﻔﻴﺬ،
ﻓﺎﻟﺪاﻟﺔ LoadPictureﺗﻤﻜﻨﻚ ﻣﻦ ﻓﻌﻞ ذﻟﻚ او ﺳﺮﻗﺔ ﺻﻮرة ﺗﺎﺑﻌﺔ ﻟﻜﺎﺋﻦ ﺁﺧﺮ:
ﺧﺼﺎﺋﺺ اﻟﺮﺳﻢ:
اﻟﺨﺎﺻﻴﺔ Imageﺗﻤﺜﻞ اﻟﺮﺳﻤﺔ اﻟﻤﻮﺟﻮدة ﻋﻠﻰ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج اﻟﻨﺎﺗﺠﺔ ﻣـﻦ اﺳـﺘﺨﺪام
ﻃﺮق اﻟﺮﺳﻢ .... Cirle ،Lineاﻟﺦ ،وﺳﺘﻜﻮن داﺋﻤﺎ ﻓﻮق اﻟﺼﻮرة اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺨﺎﺻﻴﺔ
،Pictureﻟﻦ ﺗﺴﺘﻄﻴﻊ اﺳﺘﺨﺪام او اﻻﺳﺘﻔﺎدة –ان ﺻﺢ اﻟﺘﻌﺒﻴﺮ -ﻣﻦ هـﺬﻩ اﻟﺨﺎﺻـﻴﺔ اﻻ
ان آﺎﻧﺖ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ AutoRedrawهﻲ .True
اﻟﺨﺎﺻﻴﺔ DrawWidthﺗﺤﺪد ﻋﺮض او ﺳـﻤﻚ اﻟﻔﺮﺷـﺎة اﻟﻤﺴـﺘﺨﺪﻣﺔ ﻟﺮﺳـﻢ اﻟﺨﻄـﻮط
واﻻﺷﻜﺎل ﺑﻄـﺮق اﻟﺮﺳـﻢ Line ،PSetو Circleاﻣـﺎ اﻟﺨﺎﺻـﻴﺔ ForeColorﻓﻬـﻲ ﺗﺤـﺪد
اﻟﻠﻮن اﻻﻓﺘﺮاﺿﻲ ﻟﻠﻄﺮق اﻟﺴﺎﺑﻘﺔ .ﺑﺎﻟﻨﺴـﺒﺔ ﻟﻠﺨﺎﺻـﻴﺔ DrawStyleﻓﻬـﻲ ﺗﻤﻜﻨـﻚ ﻣـﻦ
ﺗﺤﺪﻳﺪ ﺷﻜﻞ اﻟـﻨﻘﺶ ﻟﺮﺳـﻢ اﻟﺨﻄـﻮط واﻟـﺪواﺋﺮ ﺑﺎﺳـﺘﺨﺪام اﻟﻄـﺮﻳﻘﺘﻴﻦ Lineو ،Cirlce
آﺬﻟﻚ ﺗﻤﻜﻨﻚ ﻣﻨﻪ اﻟﺨﺎﺻﻴﺔ FillStyleﻟﻠﻤﻨﻄﻘﺔ اﻟﺪاﺧﻠﻴﺔ ﻣﻦ اﻟﻤﺮﺑﻊ او اﻟﺪاﺋﺮة ﻣـﻊ ﻟـﻮن
اﻟﺘﻌﺒﺌــﺔ اﻟﻤﻮﺟــﻮد ﻓــﻲ اﻟﺨﺎﺻــﻴﺔ .FillColorاﻣــﺎ اﻟﺨﺎﺻــﻴﺘﺎن CurrentXو CurrentY
ﻓﺘﻤﺜﻼن اﻻﺣﺪاﺛﻴﺎت اﻟﺤﺎﻟﻴﺔ اﻟﺘـﻲ ﺗﺴـﺘﺨﺪم ﻟﻄـﺮق اﻟﻤﺨﺮﺟـﺎت واﻟﺮﺳـﻢ Line ،Print
....اﻟﺦ ،واﻟﻠﺘﺎن ﺗﺘﺄﺛﺮان ﺑﻜﻞ ﻋﻤﻠﻴـﺔ رﺳـﻢ او ﺧـﺮج ﺑﺎﺳـﺘﺨﺪام اﻟﻄـﺮق اﻟﺴـﺎﺑﻘﺔ .اﻣـﺎ
اﻟﺨﺎﺻﻴﺔ FontTransparentﻓﻬﻲ ﺗﺤﺪد اﺳﻠﻮب ﺧﺮج اﻟﻄﺒﺎﻋﺔ ﺑﺎﺳﺘﺨﺪام اﻻﻣﺮ ،Print
ﻓﺈن آﺎﻧﺖ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ ﺗﺴﺎوي Falseﻓﺴﻴﻜﻮن ﻟﻮن ﺧﻠﻔﻴﺔ اﻟﻄﺒﺎﻋﺔ هﻮ ﻧﻔـﺲ ﻟـﻮن
اﻟﺨﻠﻔﻴﺔ BackColorﻟﻠﻨﻤﻮذج ،أﻣﺎ إن آﺎﻧﺖ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ Trueﻓـﺈن ﺧﻠﻔﻴـﺔ اﻟﻄﺒﺎﻋـﺔ
ﺳﺘﻜﻮن ﺷﻔﺎﻓﺔ.
41
اﻟﺨﺎﺻﻴﺔ :DrawMode
ﺗﻌﺘﺒﺮ اﻟﺨﺎﺻﻴﺔ DrawModeﻣﻦ اﻗﻮى ﺧﺼﺎﺋﺺ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج اﻟﺮﺳﻮﻣﻴﺔ ،ﻓﻌﻦ ﻃﺮﻳﻘﻬﺎ
ﺗﺤﺪد ﻃﺮﻳﻘﺔ اﻟﺘﻔﺎﻋﻞ ﺑﻴﻦ اﻟﺮﺳﻮم اﻟﺘﻲ ﺗﺮﺳﻤﻬﺎ ﺑﻄﺮق اﻟﺮﺳﻢ –آـ -Lineﻣـﻊ اﻟﻨﻘـﺎط
اﻟﻤﻮﺟﻮدة ﻋﻠﻰ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج .اﻟﻘﻴﻤﺔ اﻻﻓﺘﺮاﺿﻴﺔ ﻟﻬﺬﻩ اﻟﺨﺎﺻـﻴﺔ هـﻲ 13-Copy Pen
وﺗﻌﻨﻲ ان اﻟﻠﻮن ﺳﻴﻈﻬﺮ آﻤﺎ هﻮ ﻣﻄﻠﻮب ،ﻓﺎﻟﻤﺮﺑﻊ اﻻﺑـﻴﺾ ﺳـﻴﻜﻮن اﺑـﻴﺾ وﻟـﻮ رﺳـﻢ
ﻋﻠﻰ ﻣﺮﺑﻊ اﺳﻮد ،واﻟﺪاﺋﺮة اﻟﺤﻤﺮاء ﺳﺘﺮﺳﻢ ﺣﻤﺮاء وﻟﻮ ﻋﻠﻰ ﺳﻄﺢ ارﺟﻮاﻧﻲ .اﻻ اﻧـﻚ
ﻓﻲ ﺑﻌﺾ اﻟﺤﺎﻻت اﻟﻔﻨﻴﺔ ﺗﻮد ان ﺗﺮﺳـﻢ رﺳـﻮم ﺗﺘـﺄﺛﺮ ﺑـﺎﻻﻟﻮان اﻟﻤﻮﺟـﻮدة ﻋﻠـﻰ ﻟﻮﺣـﺔ
اﻟﺮﺳﻢ وهﺬا ﻣﺜﺎل واﻗﻌﻲ ﺗﺠﺪﻩ آﺜﻴﺮا ﻓﻲ ﺑﺮاﻣﺞ اﻟﺘﺮآﻴﺐ ﺷﻜﻞ :1-2
)ا(
)ب(
)ج(
ﺷﻜﻞ :1-2ﺗﺄﺛﻴﺮ اﻟﺨﺎﺻﻴﺔ DrawModeﻋﻠﻰ ﻣﺨﺮﺟﺎت اﻟﺮﺳﻢ.
ﺗﻼﺣﻆ ﻓـﻲ اﻟﺸـﻜﻞ ) 1-2ا( ان اﻟﻤﺴـﺘﻄﻴﻞ اﻻزرق اﻟـﺬي رﺳـﻤﻨﺎﻩ ﻋﻠـﻰ اﻟﻤﻨﻄﻘـﺔ
اﻟﺒﻴﻀﺎء ﻗﺪ رﺳﻢ ﺑﺸﻜﻞ ﺟﻴﺪ ﺟﺪا ،وﻳﻈﻬﺮ اﻟﻔـﺮق ﻓـﻲ اﻟﻔـﻦ اﻟﺘﺼـﻤﻴﻤﻲ واﺿـﺤﺎ ﺑـﻴﻦ
اﻟﺸﻜﻠﻴﻦ )ب( و )ج( ،ﻓﻔﻲ اﻟﺸﻜﻞ )ب( ﻗﻤﻨـﺎ ﺑﺮﺳـﻢ اﻟﻤﺴـﺘﻄﻴﻞ اﻻزرق آﻤـﺎ ﻧﺮﻳـﺪﻩ
ازرق ﻣﻤﺎ اﺛﺮ وﻏﻄﻰ ﻋﻠﻰ اﻟﻨﺺ اﻟﻤﻜﺘﻮب " "50%وﻟﻦ ﻳﺘﻤﻜﻦ اﻟﻤﺴﺘﺨﺪم ﻣﻦ رؤﻳﺘـﻪ،
اﻣﺎ ﻓﻲ اﻟﺸﻜﻞ )ج( ﻓﻘﺪ اﺳـﺘﺨﺪﻣﻨﺎ اﻟﻘﻴﻤـﺔ اﻟﻤﻨﺎﺳـﺒﺔ ﻟﻠﺨﺎﺻـﻴﺔ DrawModeﺑﺤﻴـﺚ
ﺗﻘﻠﺐ اﻟﻠﻮن اﻻزرق اﻟﻰ اﺑﻴﺾ ﻓﻲ ﺣﺎﻟﺔ اﻟﺮﺳﻢ ﻓﻮق اﻟﻠﻮن اﻻﺳﻮد .ﻟﻤﻌﺮﻓﺔ آﻴـﻒ ﺗـﺘﻢ
ﻋﻤﻠﻴﺔ ﺗﻐﻴﻴﺮ اﻻﻟﻮان ،ﻋﻠﻴﻚ ان ﺗﻌﻠﻢ ان اﻻﻟﻮان ﻓﻲ ﺣﻘﻴﻘﺘﻬﺎ ﻣﺎ هـﻲ اﻻ اﻋـﺪاد ﺗﺘﺤـﻮل
ﺑﺎﻟﻨﻈﺎم اﻟﺜﻨﺎﺋﻲ اﻟﻰ ارﻗﺎم ﺷﺒﻴﻪ ﺑـ ،10011101010اﻟﻠﻮن اﻟـﺬي ﺗﺴـﺘﺨﺪﻣﻪ ﻳﺴـﻤﻰ
42
ﻟﻮن اﻟﻘﻠﻢ ،Pen Colorواﻟﻠﻮن اﻟﻤﻮﺟﻮد ﻋﻠﻰ ﻟﻮح او ﺳـﻄﺢ اﻟﺮﺳـﻢ ﻳﺴـﻤﻰ Screen
،Colorﻓﺎﻟﻘﻴﻤﺔ 15-MergePenﻟﻠﺨﺎﺻﻴﺔ DrawModeﺗﻘﻮم ﺑﺘﻄﺒﻴﻖ اﻟﻤﻌﺎدﻟﺔ اﻟﺘﺎﻟﻴﺔ:
S = S Or P
ﻓﻠﻮ آﺎن اﻟﻠﻮن اﻟﻤﺴﺘﺨﺪم هﻮ 170 = 10101010واﻟﻠﻮن اﻟﻤﻮﺟﻮد ﻋﻠﻰ اﻟﺸﺎﺷﺔ هـﻮ
،85 = 01010101ﻓﺎن اﻟﻠﻮن اﻟﻨﺎﺗﺞ –ﻣﻦ ﺗﺄﺛﻴﺮ اﻟﻘﻴﻤﺔ 15-MergePenﺳﻴﻜﻮن:
اﻟﺨﺎﺻﻴﺔ :ScaleMode
ﻓﻲ ﺑﺪاﻳﺔ اﻟﻔﺼﻞ وﺑﺎﻟﺘﺤﺪﻳﺪ ﻋﻨﺪ ﻓﻘﺮة "ﺧﺼـﺎﺋﺺ اﻟﻤﻮﻗـﻊ واﻟﺤﺠـﻢ" ذآـﺮت ان اﻟﻮﺣـﺪة
اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﻘﻴﺎس اﺣﺪاﺛﻴﺎت ﻣﻮاﻗـﻊ وﻃـﻮل وﻋـﺮض اﻻدوات هـﻲ اﻟﻮﺣـﺪة اﻟﻤﻮﺟـﻮدة
ﻓــﻲ اﻟﺨﺎﺻــﻴﺔ .ScaleModeﺗــﻮﻓﺮ ﻟــﻚ هــﺬﻩ اﻟﺨﺎﺻــﻴﺔ 8ﻗــﻴﻢ ﺗﻤﺜــﻞ وﺣــﺪات Units
ﺗﺴــﺘﺨﺪم ﻟﻠﻘﻴــﺎس هــﻲ 1-Twip :واﻟﺘــﻲ ﺗﻌــﺎدل 0.567ﺳــﻢ 2-Point ،ﺗﻌــﺎدل 0.72
اﻧﺶ 3-Pixel ،ﺗﻌﺎدل ﻧﻘﻄﺔ واﺣﺪة ﻋﻠـﻰ اﻟﺸﺎﺷـﺔ 4-Character ،ﺗﻌـﺎدل Twips 120
اﻓﻘﻴــﺎ و Twips 240ﻋﺎﻣﻮدﻳــﺎ 5-Inch ،ﺗﻌــﺎدل اﻧــﺶ واﺣــﺪ 6-Milimeter ،ﺗﻌــﺎدل ﻣﻠــﻢ
واﺣﺪ 7-Centimeter ،ﺗﻌﺎدل واﺣﺪ ﺳﻢ و 0-Userوﺣﺪة ﻗﻴﺎس ﺧﺎﺻﺔ ﻳﺘﻢ ﺗﻌﺮﻳﻔﻬﺎ ﻣﻦ
ﻗﺒﻞ اﻟﻤﺒﺮﻣﺞ.
اﻟﺨﺎﺻــﻴﺘﺎن Widthو Heightﺗﻌــﻮدان ﺑﻌــﺮض وارﺗﻔــﺎع اﻟﻨﺎﻓــﺬة داﺋﻤــﺎ ﺑﺎﻟﻮﺣــﺪة ،Twip
ﻓﺎﻟﻘﻴﻤﺔ اﻟﺘﺎﺑﻌﺔ ﻟﻠﺨﺎﺻـﻴﺔ ScaleModeﺗـﺆﺛﺮ ﻋﻠـﻰ اﻟﻮﺣـﺪة اﻟﻤﺴـﺘﺨﺪﻣﺔ ﻓـﻲ اﻻدوات
اﻟﻤﺤﻀﻮﻧﺔ ﻓﻘﻂ وﻟﻴﺲ اﻟﺤﺎﺿﻨﺔ ،اﻣﺎ ﻟﻤﻌﺮﻓﺔ ﻋﺮض وارﺗﻔﺎع ﻧﺎﻓﺬة اﻟﻨﻤﻮذج ﺑﻮﺣـﺪة ﻏﻴـﺮ
اﻟـ ،Twipﻗﻢ ﺑﺘﺤﺪﻳﺪ اﻟﻮﺣـﺪة ﻓـﻲ اﻟﺨﺎﺻـﻴﺔ ScaleModeواﺳـﺘﻌﻠﻢ ﻋـﻦ اﻟﻌـﺮض ﻋـﻦ
ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ ScaleWidthواﻻرﺗﻔﺎع ﻋﻦ ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ :ScaleHeight
Print ScaleWidth
End Sub
اﺧﻴﺮا ،اﻟﻘﻴﻤﺔ 0-Userهﻲ وﺣﺪة ﺗﻌـﺮف ﻣـﻦ ﻗﺒـﻞ اﻟﻤﺒـﺮﻣﺞ ،ﺗﺴـﺘﻄﻴﻊ ﺗﻌﺮﻳـﻒ وﺣـﺪة
ﺧﺎﺻــﺔ ﺑــﻚ ﻋــﻦ ﻃﺮﻳــﻖ اﺳــﻨﺎد ﻗــﻴﻢ اﻟــﻰ اﻟﺨﺼــﺎﺋﺺ ،ScaleHeight ،ScaleWidth
ScaleLeftو .ScaleTopﻗﺪ ﺗﺤﺘﺎج ﺗﻌﺮﻳﻒ وﺣﺪة ﻗﻴﺎس رﺳـﻢ ﺧﺎﺻـﺔ ﺑـﻚ ﻓـﻲ ﺣـﺎﻻت
ﻧﺎدرة ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻋﺮض اﻟﻤﺨﻄﻄﺎت اﻟﺮﺳﻮﻣﻴﺔ ﺑﺸﻜﻞ اﺳﺘﺜﻨﺎﺋﻲ.
ﻃﺮق اﻟﻨﻤﻮذج
ﺑﻤﺎ ان اﻟﻔﻘﺮة اﻟﺴﺎﺑﻘﺔ ﺗﺤـﺪﺛﺖ ﻋـﻦ وﺣـﺪات اﻟﻘﻴـﺎس اﻟﺘﺎﺑﻌـﺔ ﻟﻠﺨﺎﺻـﻴﺔ ،ScaleMode
ﻓﺴﺄﺑﺪأ ﺑﺎﻟﺘﺤﺪث ﻋﻦ اﻟﻄﺮق ScaleXو .ScaleYهﺬﻩ اﻟﻄﺮق ﺗﻤﻜﻨﻚ ﻣﻦ اﺟﺮاء ﻋﻤﻠﻴـﺔ
ﺗﺤﻮﻳﻞ اﻟﻘﻴﺎﺳﺎت ﺑﻴﻦ اﻟﻮﺣﺪات اﻟﺴـﺎﺑﻘﺔ اﻓﻘﻴـﺎ وﻋﺎﻣﻮدﻳـﺎ .ارﺳـﻞ اﻟﻘﻴﻤـﺔ ﺛـﻢ وﺣـﺪﺗﻬﺎ
اﻻﺻﻠﻴﺔ ﺛﻢ اﻟﻮﺣﺪة اﻟﻤﻄﻠﻮﺑﺔ:
ﻃﺮق اﻟﺮﺳﻢ
اﻟﻄﺮﻳﻘــﺔ Clsﺗﻤﺴــﺢ ﺟﻤﻴــﻊ اﻟﺮﺳــﻮم اﻟﻤﻮﺟــﻮدة ﻋﻠــﻰ اﻟﻨﺎﻓــﺬة وﺗﺼــﻔﺮ اﻻﺣــﺪاﺛﻴﺎت
CurrentXو CurrentYاﻟﻰ اﻻﺣﺪاﺛﻲ ) ،(0, 0واﻟﻄﺮﻳﻘﺔ Pointﺗﻌﻮد ﺑﺎﻟﻘﻴﻤـﺔ اﻟﻌﺪدﻳـﺔ
ﻟﻠﻮن اﻟﻤﻮﺟﻮد ﻓﻲ اﻻﺣﺪاﺛﻲ ) (x, yﻋﻠﻰ اﻟﻨﺎﻓﺬة:
اﻟﻄﺮﻳﻘﺔ PSetﺗﻤﻜﻨﻚ ﻣﻦ رﺳﻢ ﻧﻘﻄﺔ ﻋﻠﻰ اﻟﻨﺎﻓﺬة ﺑﺎرﺳﺎل اﻻﺣﺪاﺛﻲ ) (X, Yﻟﻠﻨﻘﻄﺔ،
ﺳﻴﻜﻮن ﻟﻮن اﻟﻨﻘﻄﺔ هـﻮ ﻧﻔـﺲ اﻟﻠـﻮن اﻟﻤﻮﺟـﻮد ﻓـﻲ اﻟﺨﺎﺻـﻴﺔ ForeColorاو ﺑﺎﻣﻜﺎﻧـﻚ
ارﺳﺎل اﻟﻠﻮن:
Me.ForeColor = vbBlack
)PSet (0, 0 ﻧﻘﻄﺔ ﺳﻮداء ‘
PSet (500, 500), vbRed ﻧﻘﻄﺔ ﺣﻤﺮاء ‘
Cls
Me.CurrentX = 0
Me.CurrentY = 0
For X = 0 To 100
45
ForeColor = vbGreen
)Me.Line (0, 0) - (Me.ScaleWidth, Me.ScaleHeight ﺧﻂ اﺧﻀﺮ ‘
ﺧﻂ اﺣﻤﺮ ‘ Me.Line (0, Me.ScaleHeight) - (Me.ScaleWidth, 0), vbRed
ﻓﻲ ﺣﺎﻟـﺔ ﺗﺠﺎهﻠـﻚ ﻟﻼﺣـﺪاﺛﻲ ) (X1, Y1ﻓـﺎن اﻟﻘـﻴﻢ اﻟﺤﺎﻟﻴـﺔ ﻟﻠﺨﺼـﺎﺋﺺ CurrentXو
CurrentYهﻲ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ:
اﻟﻄﺮﻳﻘﺔ Lineﺗﻤﻜﻨﻚ ﻣﻦ رﺳﻢ اﻟﻤﺴﺘﻄﻴﻼت ﻋﻮﺿـﺎ ﻋـﻦ اﻟﺨﻄـﻮط ﺑﺎرﺳـﺎل اﻟﺤـﺮف B
ﻣﻊ اﻟﻌﻠﻢ ان اﻟﻨﻘﺶ ﺳﻴﻜﻮن اﻟﻨﻘﺶ اﻟﻤﺤﺪد ﻓﻲ اﻟﺨﺎﺻﻴﺔ FillStyleواﻟﻠﻮن :FillColor
ForeColor = vbWhite
Line (0, 0) - (200, 200), , B ﻣﺮﺑﻊ اﺑﻴﺾ ‘
Line – Step (200, 200), vbBlue, B ﻣﺮﺑﻊ ازرق ‘
ForeColor = vbWhite
Line (0, 0) - (200, 200), , BF ﻣﺮﺑﻊ اﺑﻴﺾ ‘
Line – Step (200, 200), vbBlue, BF ﻣﺮﺑﻊ ازرق ‘
واﺧﺘﻢ ﻓﻘﺮة ﻃﺮق اﻟﺮﺳﻢ ﺑﺎﻟﻄﺮﻳﻘﺔ Cirlceاﻟﺘﻲ ﻣﻦ اﻟﻮاﺿﺢ اﻧﻬﺎ ﻻ ﺗﺮﺳﻢ ﻧﺠﻮم! واﻧﻤﺎ
دواﺋﺮ ﺑﺎرﺳﺎل اﺣﺪاﺛﻲ ﻧﻘﻄﺔ ﻣﺮآﺰ اﻟﺪاﺋﺮة وﻣﻦ ﺛﻢ ﻃﻮل ﻗﻄﺮهﺎ:
46
ForeColor = vbWhite
Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 500 داﺋﺮة ﺑﻴﻀﺎء ‘
Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 200, vbGreen داﺋﺮة ﺧﻀﺮاء ‘
ﻋﻤﻠﻴــﺔ ﺗﻠــﻮﻳﻦ اﻟــﺪاﺋﺮة ﻻ ﺗــﺘﻢ ﺑﺎﺳــﺘﺨﺪام BFآﻤــﺎ ﻓــﻲ اﻟﻄﺮﻳﻘــﺔ ،BFواﻧﻤــﺎ ﺑﺎﻟﻘﻴﻤــﺔ
اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺨﺎﺻﻴﺔ FillColorﻣﻊ اﻟﻨﻘﺶ .FillStyle
ﻣﻦ اﻻﺷﻴﺎء اﻟﺘﻲ ﺗﻌﺠﺒﻨﻲ ﻓﻲ اﻟﻄﺮﻳﻘﺔ Cirlceهـﻲ اﻣﻜﺎﻧﻴـﺔ رﺳـﻢ اﻻﻗـﻮاس ﺑﺘﺤﺪﻳـﺪ
زاوﻳﺔ اﻟﻨﻬﺎﻳﺔ واﻟﺒﺪاﻳﺔ ﺑﻮﺣﺪة اﻟﺮادﻳﺎن :Radian
Const PI = 3.14
ﻧﺼﻒ داﺋﺮة ﻓﺘﺤﻬﺘﻬﺎ اﻟﻰ اﻻﻋﻠﻰ ‘
Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 1000, , 0, PI
ﻧﺼﻒ داﺋﺮة ﻓﺘﺤﻬﺘﻬﺎ اﻟﻰ اﻻﺳﻔﻞ ‘
Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 800, , PI, 0
رﺑﻊ داﺋﺮة ‘
Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 500, , 0, PI / 2
ﻣﻦ اﻻﺷﻴﺎء اﻟﺘﻲ ﺗﺰﻳﺪ ﻣﻦ ﻗﻮة اﻟﻄﺮﻳﻘﺔ Circleهـﻲ اﻣﻜﺎﻧﻴـﺔ اﻳﺼـﺎل اﻃـﺮاف اﻻﻗـﻮاس
ﺑﻤﺮآﺰ اﻟﺪاﺋﺮة وﺗﻠـﻮﻳﻦ ﺟـﺰء ﻣﻌـﻴﻦ آﻤـﺎ ﻳﺤـﺪث ﻣـﻊ اﻟﻤﺨﻄﻄـﺎت ،Chartsوﻟﻌﻤـﻞ ذﻟـﻚ
ﻳﺸﺘﺮط اﺳﺘﺨﺪام اﻟﻘﻴﻢ اﻟﺴﺎﻟﺒﺔ:
Const PI = 3.14
FillStyle = 0
FillColor = vbBlue
)Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), 1000, , - (PI), - (PI / 2
اﻣﺎ اﻟﻄﺮﻳﻘﺔ PaintPictureﻓﻬﻲ اﻗﻮى ﻃﺮق اﻟﺮﺳﻢ واﻟﺘﻲ ﻇﻬـﺮت ﻣﻨـﺬ اﻻﺻـﺪار ،VB5
اﻟﻐﺮض ﻣﻦ هﺬﻩ اﻟﻄﺮﻳﻘﺔ هﻮ رﺳﻢ ﺻﻮر ﺗﺎﺑﻌﺔ ﻟﻠﻜﺎﺋﻦ او اﻟﺨﺎﺻﻴﺔ Pictureوﺗﻄﻠﺐ ﻣﻨﻚ
10ﻣﺘﻐﻴﺮات! ﻻ ﺗﺨﻒ وﺗﺘﺠﻨﺐ اﺳﺘﺨﺪاﻣﻬﺎ ﻟﻜﺜﺮة اﻟﻤﺘﻐﻴـﺮات ،ﻓﺎﻟﻤﻄﻠﻮﺑـﺔ هـﻲ اﻟـﺜﻼث
اﻻوﻟﻰ اﻣﺎ اﻟﺒﺎﻗﻴﺔ ﻓﻬﻲ اﺧﺘﻴﺎرﻳﺔ ،ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﺘﻐﻴﺮات ﻓﺎﻷول هﻮ آﺎﺋﻦ اﻟﺼﻮرة ،واﻻرﺑـﻊ
47
اﻟﺘﺎﻟﻴــﺔ ﺗﺤــﺪد ﺑﻬــﺎ اﻟﻤﻨﻄﻘــﺔ اﻟﺘــﻲ ﺳﺘﺮﺳــﻢ اﻟﺼــﻮرة ﻋﻠﻴﻬــﺎ ،واﻻرﺑﻌــﺔ اﻟﺘﺎﻟﻴــﺔ ﺗﺤــﺪد
اﻟﻤﻨﻄﻘﺔ اﻟﺘﻲ ﺗﺮﻳﺪ رﺳﻤﻬﺎ ﻓﻌﻼ ﻣﻦ اﻟﺼﻮرة اﻻﺻﻠﻴﺔ ،واﻟﻤﺘﻐﻴـﺮ اﻻﺧﻴـﺮ ﻳﺤـﺪد اﺳـﻠﻮب
رﺳﻢ اﻟﺼﻮرة ﻋﻠﻰ اﻟﻬﺪف ،وهﻮ ﻳﺘﻄﺎﺑﻖ ﺗﻤﺎﻣـﺎً ﻣـﻊ ﻣـﺎ اوﺿـﺤﺘﻪ ﺳـﺎﺑﻘﺎً ﺣـﻮل ﺧﺎﺻـﻴﺔ
.DrawMode
ﺗﻤﻜﻨﻚ اﻟﻄﺮﻳﻘﺔ PaintPictureﻣـﻦ ﻓﻌـﻞ اﺷـﻴﺎء آﺜﻴـﺮة ﻋﻠـﻰ اﻟﺼـﻮر ،آﻘﻠﺒﻬـﺎ ،ﻋﻜـﺲ
اﻟﻮاﻧﻬﺎ ،ﺗﻤﺪﻳﺪهﺎ ،ﺗﺤﺮﻳﻜﻬﺎ ....اﻟﺦ ،ﺗﺠﺪ ﻓﻲ ﻣﻠﻒ اﻟﻜﺘﺎب Codes.ZIPﻣﺜﺎل ﻳﻌﺮض ﻟـﻚ
ﺗﻄﺒﻴﻘﺎت ﻋﻤﻠﻴﺔ ﻋﻠﻰ اﻟﻄﺮﻳﻘﺔ PaintPictureوهﺬا اﻟﺠﺰء اﻻﺳﺎﺳﻲ ﻣﻨﻪ:
وﻣﺎزال Printﻣﻮﺟﻮد
ﻣــﺎزال Visual Basicﻣﺤﺘﻔﻈــﺎ ﺑﺴــﻤﺎت ﻟﻐــﺔ BASICاﻟﻘﺪﻳﻤــﺔ ،ﻓــﺎﻻﻣﺮ Printﻻ ﻳــﺰال
ﻣﻮﺟﻮد ﻣﻨﺬ ﻣﻨﺘﺼﻒ اﻟﺴﺘﻴﻨﺎت ﺣﺘﻰ اﻻﺻﺪار .VB6ﻟﻴﺲ هﺬا ﻓﻘﻂ ،ﺑﻞ ﻣﺎزاﻟـﺖ اﻟﺼـﻴﻎ
اﻟﻘﺪﻳﻤﺔ آﺎﻟﻔﻮاﺻﻞ اﻟﻤﻨﻘﻮﻃﺔ ";" واﻟﻌﺎدﻳﺔ ﻣﺪﻋﻮﻣﺔ ﻓﻲ :Visual Basic
"ﻋﺎدﻳﺔ" ",ﻓﺎﺻﻠﺔ" Print
"ﻣﻨﻘﻮﻃﺔ" ;"ﻓﺎﺻﻠﺔ" Print
رﻏﻢ ان Printﻣﺼﻨﻒ ﺿـﻤﻦ ﻃـﺮق اﻟﻜﺎﺋﻨـﺎت ،اﻻ اﻧـﻪ –ﺗﻘﻨﻴـﺎ -ﻻ ﻳﻌﺘﺒـﺮ ﻣﻼﺣﻈﺔ:
ﻃﺮﻳﻘﺔ .ﻓﻬﻮ ﺣﺎﻟﺔ ﺧﺎﺻﺔ ﺗﻌﻤﺪهﺎ ﻣﻄـﻮروا Visual Basicﺣﺘـﻰ ﺗﺘـﺰاﻣﻦ
اﻟﺘﻮاﻓﻴﻘﻴﺔ ﻣﻊ ﻟﻐﺔ .BASIC
ﻧﻮع وﺣﺠﻢ اﻟﺨﻂ اﻟﻨـﺎﺗﺞ ﻣـﻦ اﻻﻣـﺮ ،Printهـﻮ ﻧﻔـﺲ اﻟﻘـﻴﻢ اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﺨﺎﺻـﻴﺔ
.Fontاﻟﺪوال TextHeightو TextWidthﺗﻔﻴﺪان ﻟﻤﻌﺮﻓﺔ ارﺗﻔﺎع وﻋﺮض اﻟﻨﺺ وﺗﺨﺘﻠـﻒ
ﺑﺎﺧﺘﻼف ﻧﻮع وﺣﺠﻢ اﻟﺨﻂ ﻟﺘﺘﻤﻜﻦ ﻣﻦ اﺧﺘﻴـﺎر اﻻﺣـﺪاﺛﻲ اﻟﻤﻨﺎﺳـﺐ ﻟﺒـﺪء اﻟﻜﺘﺎﺑـﺔ آﻤـﺎ
ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ اﻟﺬي ﻳﻜﺘﺐ اﻟﻨﺺ ﻓﻲ وﺳﻂ اﻟﻨﺎﻓﺬة:
Print sText
اﺧﻴﺮا ،ﺟﻤﻴﻊ اﻟﻤﺨﺮﺟﺎت اﻟﻨﺼﻴﺔ ﻋﺒﺎرة ﻋﻦ ﻧﻘﺎط ﺗﺘﺸﻜﻞ ﻓﻲ ﺻﻮرة ﺣﺎﻟﻬﺎ آﺤـﺎل ﻃـﺮق
اﻟﺮﺳــﻢ ،واﻟﺨﺎﺻــﻴﺔ Imageهــﻲ اﻟﻤﺴــﺌﻮﻟﺔ ﻋــﻦ ﺣﻔــﻆ اﻟﻤﻌﻠﻮﻣــﺎت اﻟﻜﺎﻣﻠــﺔ ﻟﻬــﺬﻩ
اﻟﻤﺨﺮﺟﺎت.
اﺣﺪاث اﻟﻨﻤﻮذج
ﻧﺎﻓﺬة اﻟﻨﻤﻮذج هﻲ اآﺜﺮ آﺎﺋﻦ ﻣﻦ آﺎﺋﻨﺎت Visual Basicﻳﺤﺘﻮي ﻋﻠـﻰ اﺣـﺪاث ،ﻣﻌﻈـﻢ
اﺣﺪاﺛﻬﺎ ﺗﻢ ﺷﺮﺣﻬﺎ ﻓﻲ ﻓﻘﺮة "اﻻﺣﺪاث اﻟﻤﺸﺘﺮآﺔ" .اﻣﺎ اﻻﺣﺪاث اﻟﺨﺎﺻـﺔ ﺑﻬـﺎ ﻓﺘﻔﺠـﺮ
ﻣﻦ ﺑﺪاﻳﺔ ﺗﺤﻤﻴﻞ اﻟﻨﺎﻓﺬة ﺣﺘﻰ اﻏﻼﻗﻬﺎ ﺑﻬﺬا اﻟﺘﺮﺗﻴﺐ:
<- (Deactivate) <- Paint <- Activate <- Resize <- Load <- Initialize
.Terminate <- Unload <- QueryUnload
اﻟﺤﺪث :Initialize
ﻳﺘﻢ ﺗﻔﺠﻴﺮ هﺬا اﻟﺤﺪث ﺑﻤﺠﺮد اﺳﺘﺨﺪام آﺎﺋﻦ اﻟﻨﻤﻮذج ﻓـﻲ اآـﻮادك او اﻧﺸـﺎء ﻧﺴـﺨﺔ
ﺟﺪﻳﺪة ﻣﻦ آﺎﺋﻦ اﻟﻨﻤﻮذج ،ﻳﻘﻮم Visual Basicﺑﺘﻔﺠﻴﺮ هﺬا اﻟﺤﺪث ﻣﺒﻜﺮا ﺟـﺪا أي ﻗﺒـﻞ
اﻧﺸﺎء ﻧﺎﻓﺬة اﻟﻨﻤﻮذج ووﺿﻊ اﻻدوات ﻋﻠﻴﻬﺎ:
ﻗﺪ ﺗﺴﺘﻔﻴﺪ ﻣﻦ هﺬا اﻟﺤﺪث ﻟﺘﻌﻴﻴﻦ ﻗـﻴﻢ اﺑﺘﺪاﺋﻴـﺔ ﻟﻠﻤﺘﻐﻴـﺮات اﻟﺘﺎﺑﻌـﺔ ﻟﻨﺎﻓـﺬة اﻟﻨﻤـﻮذج
ﻗﺒﻞ اﻧﺸﺎء اﻟﻨﺎﻓﺬة:
End Sub
اﻟﺤﺪث :Load
ﻳﺘﻢ ﺗﻔﺠﻴﺮ اﻟﺤﺪث Loadﺑﻤﺠﺮد اﻟﺒـﺪء ﻓـﻲ ﻋﻤﻠﻴـﺔ ﺗﺤﻤﻴـﻞ اﻟﻨﺎﻓـﺬة ﺑﺎﺳـﺘﺨﺪام اﻟﺪاﻟـﺔ
:Load
Load Form2
ﻣﻦ اﻟﻀﺮوري ﻣﻌﺮﻓـﺔ ان اﻟﺤـﺪث Loadﻻ ﻳﺘﺴـﺒﺐ ﻓـﻲ ﻇﻬـﻮر اﻟﻨﺎﻓـﺬة ﻓﻬـﻮ ﻳﻘـﻊ ﻋﻨـﺪ
ﺗﺤﻤﻴــﻞ واﻧﺸــﺎء اﻟﻨﺎﻓــﺬة ﻓﻘــﻂ ،ﻓــﻼ ﺗﺤــﺎول اﺳــﺘﺨﺪام اﻻواﻣــﺮ اﻟﺘﺎﺑﻌــﺔ ﻟﻠﻮاﺟﻬــﺔ آـــ
SetFocusاو ﻃﺮق اﻟﺮﺳﻢ ....اﻟﺦ .ﻗﺪ ﺗﺴﺘﻔﻴﺪ ﻣﻦ هـﺬا اﻟﺤـﺪث ﺑﻮﺿـﻊ ﻗـﻴﻢ اﺑﺘﺪاﺋﻴـﺔ
آـ:
اﻟﺤﺪث :Resize
ﺑﻤﺠــﺮد ان ﺗﻈﻬــﺮ ﻧﺎﻓــﺬة اﻟﻨﻤــﻮذج ،ﻓــﺎن اﻟﺤــﺪث Resizeﻳــﺘﻢ ﺗﻔﺠﻴــﺮﻩ او آﻠﻤــﺎ ﻗــﺎم
اﻟﻤﺴﺘﺨﺪﻳﻢ ﺑﺘﺤﺠﻴﻢ اﻟﻨﺎﻓﺬة وﺗﻐﻴﻴﺮ ﺣﺠﻤﻬـﺎ ،ﻗـﺪ ﺗﺴـﺘﺨﺪم هـﺬا اﻟﺤـﺪث ﺑﻜﺜـﺮة ﻋﻨـﺪ
رﻏﺒﺘﻚ ﻓﻲ ﻣﺤﺎذاة اﻻدوات او ﺗﻐﻴﻴﺮ ﺣﺠﻤﻬﺎ آﻠﻤﺎ ﻗﺎم اﻟﻤﺘﺴﺨﺪم ﺑﺘﻐﻴﻴﺮ ﺣﺠﻢ اﻟﻨﺎﻓﺬة:
اﻟﺤﺪث :Activate
ﻳﺘﻢ ﺗﻔﺠﻴﺮ اﻟﺤﺪث ﺑﻤﺠﺮد ﻇﻬﻮر اﻟﻨﺎﻓﺬة –ﺑﻌﺪ اﻟﺤـﺪث -Resizeاو ﺑﻤﺠـﺮد آـﻮن اﻟﻨﺎﻓـﺬة
هﻲ اﻟﻨﺎﻓﺬة اﻟﻨﺸـﻄﺔ .Active Windowﻣـﻊ ذﻟـﻚ ،ﻟـﻦ ﻳـﺘﻢ ﺗﻔﺠﻴـﺮ اﻟﺤـﺪث اذا اﻧﺘﻘـﻞ
اﻟﻤﺴﺘﺨﺪم ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﺁﺧﺮ اﻟﻰ ﺑﺮﻧﺎﻣﺠﻚ ،أي أن هﺬا اﻟﺤـﺪث ﻻ ﻳـﺘﻢ ﺗﻔﺠﻴـﺮﻩ إﻻ ﻋﻨـﺪ
اﻟﺘﻨﻘﻞ ﺑﻴﻦ ﻧﻮاﻓﺬ ﺑﺮﻧﺎﻣﺠﻚ ﻓﻘﻂ .ﻗﺪ ﻳﻔﻴﺪك هﺬا اﻟﺤﺪث ﻓﻲ ﺗﻐﻴﻴـﺮ ﻣﺤﺘﻮﻳـﺎت اﻟﻨﺎﻓـﺬة –
آﺘﺠﺪﻳﺚ اﻟﺒﻴﺎﻧﺎت -ﺑﻤﺠﺮد ﻗﻴﺎم اﻟﻤﺴﺘﺨﺪم ﺑﺘﻐﻴﻴـﺮ ﻣﺤﺘﻮﻳـﺎت ﻧﺎﻓـﺬة اﺧـﺮى ﻓـﻲ ﻧﻔـﺲ
اﻟﺒﺮﻧﺎﻣﺞ:
اﻟﺤﺪث :Paint
ﻳﺘﻢ ﺗﻔﺠﻴﺮ هﺬا اﻟﺤﺪث آﻠﻤﺎ دﻋﺖ اﻟﺤﺎﺟﺔ اﻟﻰ اﻋﺎدة رﺳﻢ اﻟﻨﺎﻓـﺬة ،ﻓﻠـﻮ ﻗﻤـﺖ ﺑﻮﺿـﻊ
اﻟﻨﺎﻓﺬة س ﻓﻮق اﻟﻨﺎﻓـﺬة ص وﻣـﻦ ﺛـﻢ ﺗﻌـﻮد اﻟـﻰ اﻟﻨﺎﻓـﺬة س ،ﻓـﺎن اﻟﺤـﺪث Paintﻟـﻪ
ﻧﺼﻴﺐ ﻣﻦ اﻟﻮﻗﻮع ،آﺬﻟﻚ ﻋﻨﺪﻣﺎ ﺗﺨﻔـﻲ اﺟـﺰاء ﻣـﻦ اﻟﻨﺎﻓـﺬة وﻣـﻦ ﺛـﻢ ﺗﻈﻬﺮهـﺎ ﺳـﻴﺘﻢ
ﺗﻔﺠﻴﺮ اﻟﺤﺪث .ﻣﻦ اﻟﻀـﺮوري ﺟـﺪا ﺟـﺪا اﺧﺒـﺎرك ﺑﺎﻧـﻪ ﻓـﻲ ﺣﺎﻟـﺔ آـﻮن ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ
AutoRedrawﺗﺴﺎوي Trueﻓـﺎن اﻟﺤـﺪث Paintﻟـﻦ ﻳـﺘﻢ ﺗﻔﺠﻴـﺮﻩ ﺣﺘـﻰ ﺗﺤـﺞ اﻟﺒﻘـﺮة
ﻋﻠﻰ ﻗﺮوﻧﻬﺎ! اﻓﻀﻞ اآﻮاد ﻳﻤﻜﻨﻚ وﺿﻌﻬﺎ ﺑﻴﻦ ﺳﻄﻮر هﺬا اﻟﺤـﺪث هـﻲ اآـﻮاد اﻟﺮﺳـﻢ،
اﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻳﺮﺳﻢ داﺋﺮة ﺗﻐﻄﻲ ﻣﻌﻈﻢ اﺟﺰاء اﻟﻨﺎﻓﺬة:
ﻣﻦ اﻟﻤﻔﻴﺪ ان اذآﺮ هﻨﺎ ﺑﺎن ﺗﻐﻴﻴﺮ ﺣﺠﻢ اﻟﻨﺎﻓﺬة ﻳـﺆدي اﻟـﻰ ﺗﻔﺠﻴـﺮ اﻟﺤـﺪث Paintﻓـﻲ
ﺣﺎﻟﺔ ان ﻗﺎم اﻟﻤﺴﺘﺨﺪم ﺑﺘﻜﺒﻴﺮ اﻟﺤﺠﻢ ،اﻣﺎ ﻋﻨﺪ ﺗﺼـﻐﻴﺮ اﻟﺤﺠـﻢ ﻓـﺎن اﻟﺤـﺪث Paintﻻ
ﻳﺘﻢ ﺗﻔﺠﻴﺮﻩ ،وذﻟﻚ ﻻﻧﻪ ﻻ ﺗﻮﺟﺪ ﺣﺎﺟﺔ ﻻﻋﺎدة رﺳﻢ اﺟﺰاء ﻣﻦ اﻟﻨﺎﻓﺬة ،ﻓﻘﺪ ﺗﻼﺣﻆ ﻓـﻲ
اﻟﻜﻮد اﻟﺴﺎﺑﻖ اﻧﻚ اذا ﻗﻤﺖ ﺑﺘﺼﻐﻴﻴﺮ ﺣﺠﻢ اﻟﻨﺎﻓﺬة ،ﻓﺎن اﻟﺪاﺋﺮة ﻟﻦ ﻳﺘﻢ اﻋﺎدة رﺳـﻤﻬﺎ،
واﻟﻔﻜﺮة اﻟﺬآﻴﺔ اﻟﺘﻲ ﻗﺪ ﺗﺠﺒﺮ Visual Basicﻻﻋﺎدة رﺳﻢ اﻟـﺪاﺋﺮة هـﻲ ﻃﺮﻳـﻖ اﻟﺤـﺪث
:Resize
51
رﻏﻢ ان اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﺻﺤﻴﺢ ،اﻻ اﻧﻪ ﻻ ﻳﺨﺮج ﻣﻦ اﺻﺎﺑﻊ ﻣﺒـﺮﻣﺞ ﺣﺮﻳـﻒ ،واﻟﺴـﺒﺐ ان
اﻟﺤــﺪث Paintﺳــﻴﺘﻢ ﺗﻨﻔﻴــﺬﻩ ﻣــﺮﺗﻴﻦ آﻠﻤــﺎ ﻗــﺎم اﻟﻤﺴــﺘﺨﺪم ﺑﺘﻜﺒﻴﻴــﺮ ﺣﺠــﻢ اﻟﻨﺎﻓــﺬة،
ﻓــﺎﻷوﻟﻰ ﺑﺴــﺒﺐ اﻋــﺎدة اﻟﺮﺳــﻢ واﻟﺜﺎﻧﻴــﺔ ﺑﺴــﺒﺐ اﻻﺳــﺘﺪﻋﺎء اﻟﻤﻮﺟــﻮد ﻓــﻲ اﻟﺤــﺪث
،Resizeﻟﺬﻟﻚ ﺗﺠﺪ ان اﻟﻤﺒﺮﻣﺞ اﻟﺬآﻲ ﻻ ﻳﺴﺘﺪﻋﻲ اﻟﺤﺪث Fomr_Paintﻣﺒﺎﺷﺮة ﺑـﻞ
ﻳﺘﺮك اﻻﻣﺮ ﻟـ Visual Basicﻟﻴﻔﻌﻠﻪ ﻋﻨﺪ وﻗﺖ اﻟﺤﺎﺟﺔ ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﻳﻘﺔ :Refresh
ﺑﻌﺪ اﻟﺤﺪث اﻟﺘﻠﻘﺎﺋﻲ اﻻﺧﻴـﺮ Paintﺗﻜـﻮن ﻧﺎﻓـﺬة اﻟﻨﻤـﻮذج ﺟـﺎهﺰة ﻻﺳـﺘﻘﺒﺎل اﻻﺣـﺪاث
اﻟﺨﺎﺻﺔ ﻟﺒﺎﻗﻲ اﻻدوات او اﺣﺪاﺛﻬﺎ اﻻﺧﺮى آـ Clickوﻏﻴﺮهﺎ ،اﻣﺎ ﻓﻲ ﺣﺎﻟـﺔ ﻋـﺪم وﺟـﻮد
أي اداة ﻗﺎﺑﻠﺔ ﻻﺳﺘﻘﺒﺎل اﻟﺘﺮآﻴﺰ ،ﻓﺎن اﻟﺤﺪث GotFocusاﻟﺨﺎص ﺑﻨﺎﻓﺬة اﻟﻨﻤﻮذج ﺳﻴﺘﻢ
ﺗﻔﺠﻴﺮﻩ ﻓﻮرا.
اﻟﺤﺪث :Deactivate
هﻮ ﻋﻜﺲ اﻟﺤﺪث Activateوﻳﺘﻢ ﺗﻔﺠﻴﺮﻩ ﺑﻤﺠﺮد ان ﻳﻨﺘﻘـﻞ اﻟﺘﺮآﻴـﺰ اﻟـﻰ ﻧﺎﻓـﺬة اﺧـﺮى
ﺗﺎﺑﻌﺔ ﻟﺒﺮﻧﺎﻣﺠﻚ ﻓﻘﻂ .ﻗﺪ ﻳﻨﻔﺬ هﺬا اﻟﺤـﺪث اﻳﻀـﺎ ﻓـﻲ ﺣﺎﻟـﺔ اﻻﺧﻔـﺎء اﻟﻤﺆﻗـﺖ ﻟﻠﻨﺎﻓـﺬة
ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﻳﻘﺔ Hideاو ﺗﻌﺪﻳﻞ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ Visibleاﻟﻰ .False
اﻟﺤﺪث :QueryUnload
ﻳﺘﻢ ﺗﻨﻔﻴﺬ اﻟﺤﺪث QueryUnloadﻋﻨﺪﻣﺎ ﺗﻜﻮن اﻟﻨﺎﻓﺬة ﻋﻠﻰ وﺷﻚ اﻻزاﻟﺔ اﻟﻨﻬﺎﺋﻴـﺔ ﻣـﻦ
اﻟﺬاآﺮة –وﻟﻴﺲ اﻻﺧﻔﺎء اﻟﻤﺆﻗﺖ .ﻳﻤﻜﻨﻚ هﺬا اﻟﺤﺪث ﻣﻦ اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ
ﺗﺴﺒﺒﺖ ﻓﻲ اﻏﻼق اﻟﻨﺎﻓﺬة ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺘﻐﻴﺮ اﻟﻤﺮﺳـﻞ .UnloadModeاﻟﻤﺰﻳـﺪ اﻳﻀـﺎ،
ﺗﺴــﺘﻄﻴﻊ اﻟﻐــﺎء ﻓﻜــﺮة اﻏــﻼق اﻟﻨﺎﻓــﺬة ﻋــﻦ ﻃﺮﻳــﻖ اﺳــﻨﺎد اﻟﻘﻴﻤــﺔ Trueاﻟــﻰ اﻟﻤﺘﻐﻴــﺮ
اﻟﻤﺮﺳﻞ ،Cancelﻓﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ ﻟﻦ ﻳﻤﻜﻦ اﻟﻤﺴﺘﺨﺪم ﻣﻦ اﻏﻼق اﻟﻨﺎﻓـﺬة ﺑﺎﺳـﺘﺨﺪام
ﺻﻨﺪوق اﻟﺘﺤﻜﻢ Control Boxاو اﻟﺰر اﻏﻼق " "Xاﻟﻤﻮﺟﻮد ﻓﻲ اﻋﻠﻰ اﻟﻨﺎﻓﺬة:
End If
End Sub
اﻟﺤﺪث :Unload
ان ﻟﻢ ﺗﻘﻢ ﺑﺎﻟﻐﺎء ﻋﻤﻠﻴﺔ اﻏﻼق اﻟﻨﺎﻓﺬة ﻓﻲ اﻟﺤﺪث اﻟﺴﺎﺑﻖ ،ﻓﺎن اﻟﺤـﺪث Unloadهـﻮ
اﻟﺤﺪث اﻟﺘﺎﻟﻲ ،ﻣﻌﻄﻴﻚ ﻓﺮﺻﺔ اﺧﻴﺮة ﻻﻟﻐـﺎء ﻋﻤﻠﻴـﺔ اﻏـﻼق اﻟﻨﺎﻓـﺬة ﻋـﻦ ﻃﺮﻳـﻖ ﻧﻔـﺲ
اﻟﻤﺘﻐﻴﺮ اﻟﻤﺮﺳﻞ ،Cancelاﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﺘﻐﻴﺮ UnloadModeﻓﻬﻮ ﻏﻴﺮ ﻣﻮﺟﻮد.
اﻟﺤﺪث :Terminate
ﻳﺘﻢ ﺗﻔﺠﻴﺮ هﺬا اﻟﺤﺪث ﺑﻤﺠﺮد ﻣـﻮت آـﺎﺋﻦ اﻟﻨﻤـﻮذج ،ﻣﻮﺿـﻮع ﻣـﻮت اﻟﻜﺎﺋﻨـﺎت هـﻮ اﺣـﺪ
ﻓﻘﺮات اﻟﻔﺼﻞ اﻟﺨﺎﻣﺲ "اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ ."OOP
اﻟﻘﻮاﺋﻢ Menus
ﻳﻤﻜﻨﻚ Visual Basicﻣـﻦ ﺗﺼـﻤﻴﻢ ﻗﺎﺋﻤـﺔ Menuﻟﻨﻮاﻓـﺬ اﻟﻨﻤـﺎذج وﻗـﺖ اﻟﺘﺼـﻤﻴﻢ ﻋـﻦ
ﻃﺮﻳﻖ ﺻﻨﺪوق اﻟﺤﻮار ﻣﺤﺮر اﻟﻨﻤﺎذج ،Menu Editorﺣﺪد ﻧﺎﻓﺬة اﻟﻨﻤﻮذج ﺛﻢ اﺧﺘـﺮ اﻻﻣـﺮ
… Menu Editorﻣــﻦ ﻗﺎﺋﻤــﺔ .Toolsواذا آﻨــﺖ ﺗﻌــﺎﻧﻲ ﻣــﻦ آﺜــﺮة اﻋــﺎدة ﺗﻜــﺮار ﺗﻌﺒﺌــﺔ
ﻣﺤﺘﻮﻳﺎت اﻟﻘﻮاﺋﻢ ،ﺗﺴﺘﻄﻴﻊ اﺳـﺘﺨﺪام ﻗﻮاﻟـﺐ اﻟﻘﻮاﺋـﺐ Template Menuﻋـﻦ ﻃﺮﻳـﻖ
اﻻﺿﺎﻓﺔ Add-Inﻣﺪﻳﺮ اﻟﻘﻮاﻟﺐ .VB6 Template Manager
ﻣﺒﺪﺋﻴﺎ ،آﻞ وﺣﺪة ﻣﻦ وﺣـﺪات اﻟﻘﺎﺋﻤـﺔ ﺗﺤﺘـﻮي ﻋﻠـﻰ اﻟﺨﺎﺻـﻴﺔ Captionاﻟﺘـﻲ ﺗﻤﺜـﻞ
اﻟﻨﺺ اﻟﻈﺎهﺮ ﻋﻠﻰ اﻟﻘﺎﺋﻤﺔ ،اﺳﺘﺨﺪم اﻟﺮﻣﺰ "&" ﻟﻮﺿﻊ ﺧـﻂ ﺗﺤـﺖ اﻟﺤـﺮف اﻟـﺬي ﻳﻠﻴـﻪ
ﺣﺘﻰ ﺗﻤﻜﻦ اﻟﻤﺴﺘﺨﺪم ﻣﻦ اﻟﻮﺻﻮل اﻟﻰ اﻻﻣﺮ ﻓﻲ اﻟﻘﺎﺋﻤﺔ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘـﺎح Alt
واﻟﺤﺮف اﻟـﺬي ﻳﻠـﻲ اﻟﺮﻣـﺰ ،واذا آﺎﻧـﺖ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ Captionاﻟﺮﻣـﺰ " "-ﻓﻘـﻂ ،ﻓـﺎن
اﻟﻘﺎﺋﻤﺔ ﺳﺘﻜﻮن ﻋﺒﺎرة ﻋﻦ ﺧـﻂ ﻓﺎﺻـﻞ .اﻣـﺎ اﻟﺨﺎﺻـﻴﺔ Nameﺗﻤﺜـﻞ اﻻﺳـﻢ اﻟﺒﺮﻣﺠـﻲ
ﻟﻠﻘﺎﺋﻤﺔ واﻟﺬي ﺗﻨﻄﺒﻖ ﻋﻠﻴﻪ ﻧﻔﺲ ﺷﺮوط اﻻدوات ﻓﻲ اﻟﺘﺴﻴﻤﺔ ،ﻓﺎﻟﻘﺎﺋﻤـﺔ ﻣـﺎهﻲ اﻻ
أداة ﻟﻜﻦ ﻣﻦ ﻧـﻮع ﺧـﺎص ،ﻓﺒﺎﻣﻜﺎﻧـﻚ آﺘﺎﺑـﺔ اآـﻮاد ﺗﻌـﺪل ﻓـﻲ ﺧﺼـﺎﺋﺺ اﻟﻘﺎﺋﻤـﺔ وﻗـﺖ
اﻟﺘﻨﻔﻴﺬ:
”&ﻣﻠﻒ“ = mnuFile.Caption
mnuEdit.Enabled = False
53
PopupMenu frmMain.mnuHelp
اﻻدوات اﻟﺪاﺧﻠﻴﺔ
ﻓﻴﻤــﺎ ﻳﻠــﻲ ﻋــﺮض ﻣﻠﺨــﺺ ﻟﺠﻤﻴــﻊ اﻻدوات اﻟﺪاﺧﻠﻴــﺔ اﻟﻤﻮﺟــﻮدة ﻓــﻲ ﺻــﻨﺪوق اﻻدوات
ToolBoxواﻟﺒﺪاﻳﺔ ﻣﻊ أداة اﻟﻌﻨﻮان :Label
اذا اردت ﻋـــﺮض اﻟﺮﻣـــﺰ "&" ﻋﻠـــﻰ اﻷداة وآﺎﻧـــﺖ ﻗﻴﻤـــﺔ اﻟﺨﺎﺻـــﻴﺔ ﻣﻼﺣﻈﺔ:
UseMnemonicﺗﺴﺎوي ،Trueﻓﻴﺸﺘﺮط آﺘﺎﺑﺔ اﻟﺮﻣﺰ ﻣﺮﺗﻴﻦ.
ﻣﻦ ﺧﺼﺎﺋﺺ وﻗﺖ اﻟﺘﻨﻔﻴﺬ Run Time Propertiesاﻟﺘﺎﺑﻌـﺔ ﻻداة اﻟـﻨﺺ هـﻲ ﺧﺼـﺎﺋﺺ
ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﺪﻳﺪ ﻧﺺ ﻣﻌﻴﻦ ،ﺣﻴﺚ ﺗﻀﻊ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ ﻓـﻲ اﻟﺨﺎﺻـﻴﺔ SelStartوﻃـﻮل
اﻟﺘﺤﺪﻳﺪ ﻓﻲ اﻟﺨﺎﺻﻴﺔ .SelLengthاﻟﻜـﻮد اﻟﺘـﺎﻟﻲ ﻳﻘـﻮم ﺑﺘﺤﺪﻳـﺪ اﻟـﻨﺺ ﺑﻤﺠـﺮد اﻧﺘﻘـﺎل
اﻟﺘﺮآﻴﺰ اﻟﻰ أداة اﻟﻨﺺ:
واذا اردت ﻣﻌﺮﻓﺔ او اﺳﺘﺒﺪال اﻟﻨﺺ اﻟﻤﺤﺪد ﻓﺎﺳﺘﺨﺪم اﻟﺨﺎﺻﻴﺔ .SelTextاﻣﺎ اﻟﺨﺎﺻﻴﺔ
Textﻓﻬﻲ ﺗﻤﺜﻞ آﺎﻣﻞ اﻟﻨﺺ اﻟﻤﻮﺟﻮد ﻓـﻲ اﻻداة ﺳـﻮاء آـﺎن ﻣﺤـﺪدا او ﻻ ،ﻓﻠـﻮ اردت
اﺿﺎﻓﺔ ﻧﺺ اﻟﻰ اﻻداة دون ﺣﺬف اﻟﻨﺺ اﻟﻤﻮﺟﻮد ﺑﻬﺎ ﻓﺎآﺘﺐ ﺷﻴﺌﺎ ﻣﺜﻞ:
ﻣﻦ اﻟﻀﺮوري اﻟﺘﻨﻮﻳـﻪ هﻨـﺎ ﺑـﺎن اﻟﻤﺴـﺘﺨﺪم ﻟـﻦ ﻳﺴـﺘﻄﻴﻊ اﺳـﺘﺨﺪام ﻣﻔﺘـﺎح اﻟﺠﺪوﻟـﺔ
] [TABاﺛﻨﺎء اﻟﻜﺘﺎﺑﺔ ﻓﻲ ﺧﺎﻧﺔ اﻟـﻨﺺ ،واﻟﺴـﺒﺐ ﻓـﻲ ذﻟـﻚ ﻣﻨﻄﻘـﻲ ،ﻓﺎﻟﻤﻔﺘـﺎح ][TAB
ﻳﺆدي اﻟﻰ اﻧﺘﻘﺎل اﻟﺘﺮآﻴﺰ اﻟﻰ اﻻدوات اﻻﺧﺮى ،ﺗﺴﺘﻄﻴﻊ اﻟﻠﺘﻔﺎف ﺣﻮل هﺬﻩ اﻟﻤﺸـﻜﻠﺔ
اﻟﺒﺴﻴﻄﺔ ﺑﺎﻟﻐﺎء اﻟﺨﺎﺻﻴﺔ TabStopﻟﺠﻤﻴﻊ اﻻدوات وﻣﻦ ﺛﻢ اﻋﺎدﺗﻬﺎ:
Next
Err.Clear
End Sub
ﻣﻦ اﻟﻤﺸﺎآﻞ اﻟﺘﻲ ﺗﻮاﺟﻪ ﻣﺴﺘﺨﺪﻣﻲ Windows 2000, XPاﻟﻌﺮب هﻲ ﻋـﺪم ﻇﻬـﻮر
اﻟﺤﺮوف اﻟﻌﺮﺑﻴﺔ ﺑﺎﻟﺸﻜﻞ اﻟﻤﻄﻠﻮب –اﺣﻴﺎﻧﺎ -ﻋﻨﺪ ﻧﺴﺨﻬﺎ ﻣﻦ أداة اﻟﻨﺺ واﻟﺼـﺎﻗﻬﺎ اﻟـﻰ
ﺑﺮﻧــﺎﻣﺞ ﺁﺧــﺮ ،واﻟﺴــﺒﺐ ﻓــﻲ ذﻟــﻚ ﻳﺘﻌﻠــﻖ ﺑﺘﻮزﻳــﻊ ﺻــﻔﺤﺎت اﻟﻤﺤــﺎرف اﻟﺘﺎﺑﻌــﺔ ﻟﺘﺮﻣﻴــﺰ
UNICODEﻻن ﺗﺮﻣﻴﺰ أدوات Visual Basicﻣﺎ زال ﻣﺒﻨـﻲ ﻋﻠـﻰ ﺟـﺪول ،ASCIIﻻ ارﻳـﺪ
ان اﻓﺼــﻞ ﻓــﻲ اﻟﻤﻮﺿــﻮع اآﺜــﺮ ﻣــﻦ ذﻟــﻚ ﺣﺘــﻰ ﻻ ﻧﺨــﺮج ﻋــﻦ ﻣﺠــﺎل اﻟﻔﻘــﺮة ،وﻟﻜﻨــﻚ
ﺗﺴﺘﻄﻴﻊ ﺣﻞ هـﺬﻩ اﻟﻤﺸـﻜﻠﺔ ﺑﺘﻐﻴﻴـﺮ اﻟﻠﻐـﺔ اﻟـﻰ اﻟﻠﻐـﺔ اﻟﻌﺮﺑﻴـﺔ ﺑﺎﻟﻀـﻐﻂ ﻋﻠـﻰ اﻻزرار
] [Alt+SHIFTاو ﻋﻤﻞ ذﻟﻚ ﺑﺮﻣﺠﻴﺎ ﻗﺒﻞ ﻋﻤﻠﻴﺔ اﻟﻨﺴﺦ او اﻟﻘﺺ:
)(Sub BeforeCopyOrCut
LoadKeyboardLayout "00000401", 1
End Sub
أداة اﻟﻨﺺ ﻻ ﺗﺤﺘﻮي اﻻ ﻋﻠﻰ اﻋﺪاد ،وﻟﻌﻞ اﻟﺤﺪث اﻟﻤﻨﺎﺳﺐ ﻟﻜﺘﺎﺑـﺔ آـﻮد اﻟﺘﺤﻘـﻖ هـﻮ
ﺣﺪث :KeyPress
ﻣﻬﻼ ﻣﻬﻼ اﺧﻲ اﻟﻜـﺮﻳﻢ ،ﻋـﺎﻟﻢ اﻟﺒﺮﻣﺠـﺔ ﻟﻌﺒـﺔ ﻋﻘﻠﻴـﺔ وﻣﻨﻄﻘﻴـﺔ ،واﻻﻣـﻮر ﻓﻴـﻪ ﻻ ﺗـﺘﻢ
ﺑﺎﻟﺴﻬﻮﻟﺔ اﻟﺘﻲ ﺗﺘﻮﻗﻌﻬﺎ! ﻻﻧﻪ ﻣﺎ زاﻟـﺖ هﻨﺎﻟـﻚ اﻣﻜﺎﻧﻴـﺔ ان ﻳـﺪﺧﻞ اﻟﻤﺴـﺘﺨﺪم ﺣـﺮوف
ﻓﻲ أداة اﻟﻨﺺ وهﻲ ﺑﺎﺧﺘﺼﺎر :ﻋﻦ ﻃﺮﻳﻖ ﻟﺼﻖ ﻗﻴﻢ ﺣﺮﻓﻴﺔ ﻣـﻦ اﻟﺤﺎﻓﻈـﺔ أي ﺑﺎﻟﻀـﻐﻂ
ﻋﻠﻰ اﻟﻤﻔﺘﺎﺣﻴﻦ .Ctrl + Vﻓـﻮرا ﺳـﺘﻜﻮن اﺟﺎﺑﺘـﻚ اﻟﺬآﻴـﺔ ﺟـﺪا هـﻲ ان ﻧﻜﺘـﺐ اآـﻮاد
اﺿﺎﻓﻴﺔ ﻓﻲ ﺣﺪث KeyDownﻧﻤﻨﻊ ﻓﻴـﻪ اﻟﻤﺴـﺘﺨﺪم ﻣـﻦ اﺟـﺮاء ﻋﻤﻠﻴـﺔ اﻟﻠﺼـﻖ .ﺻـﺢ
ﻟﺴﺎﻧﻚ! ﻟﻜﻨﻚ ﻧﺴﻴﺖ ﻃﺮﻳﻘﺔ اﺧﺮى ﻟﻠﺼﻖ وهﻲ ﻋﻦ ﻃﺮﻳﻖ اﻟﻘﺎﺋﻤـﺔ اﻟﻤﺨﺘﺼـﺮة اﻟﺘـﻲ
ﻳﻀﻴﻔﻬﺎ Visual Basicاﻟﻰ أداة اﻟﻨﺺ واﻟﺘﻲ ﺗﻈﻬﺮ ﻋﻦ ﻃﺮﻳﻖ زر اﻟﻔﺄرة اﻻﻳﻤـﻦ ،واﻟﺘـﻲ
ﻣﻦ ﺧﻼﻟﻬﺎ ﻳﺴﺘﻄﻴﻊ اﻟﻤﺴﺘﺨﺪم ان ﻳﻠﺼﻖ اﻟﻨﺼﻮص!
ﻻ ﺗﻮﺟﺪ ﻣﺸﻜﻠﺔ اﻻ وﻟﻬﺎ ﺣﻞ ﻓﻬﺬا ﻋﺎﻟﻢ اﻟﺒﺮﻣﺠﺔ ﻣﺸـﺎآﻞ وﺣﻠـﻮل .ﻣـﻦ وﺟﻬـﺔ ﻧﻈـﺮي
اﻟﺸﺨﺼﻴﺔ ،ارى ان اﻓﻀﻞ ﻣﻜﺎن -اﻗﺼﺪ ﺣﺪث -ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻧـﻮع ﻗﻴﻤـﺔ اﻟـﻨﺺ اﻟﻤـﺪﺧﻞ
هﻮ اﻟﺤﺪث ،Changeﻟﻜﻦ اﻟﻤﺸﻜﻠﺔ ﻓﻴﻪ اﻧﻪ ﻳﺘﻄﻠـﺐ ﺗﺼـﺮﻳﺢ ﻣﺘﻐﻴـﺮﻳﻦ ﻋـﺎﻣﻴﻦ ﻟﻠﻌـﻮدة
ﺑﺎﻟﻘﻴﻤﺔ اﻟﻘﺪﻳﻤﺔ ﻷداة اﻟﻨﺺ اذا آﺎﻧﺖ اﻟﻘﻴﻤﺔ اﻟﺠﺪﻳﺪة ﻟﻴﺴﺖ ﻋﺪدﻳﺔ:
آﻤﺎ ﺗﻼﺣﻆ ،ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻟﻚ ﻣﻨﻲ ﺿﻤﺎن ان اﻟﻤﺴﺘﺨﺪم ﻟﻦ ﻳﺴﺘﻄﻴﻊ ادﺧـﺎل اﻻ
اﻻرﻗﺎم ﻟﻜﻦ ﻓﻲ اﺣﺪ اﻟﺴﻄﻮر آﺘﺒﺖ اﻟﺘﻌﻠﻴﻖ "ﺗﻮﺟﺪ ﻣﺸﻜﻠﺔ ﺧﻄﻴﺮة هﻨﺎ" واﻟﺴﺒﺐ اﻧﻪ
ﻋﻨـﺪﻣﺎ ﻳـﺘﻢ ﺗﻨﻔﻴـﺬ اﻟﺴـﻄﺮ ،Text1.Text = OldTextﺳـﻴﻘﻮم Visual Basicﺑﺘﻨﻔﻴـﺬ
اﻻﺟﺮاء Text1_Changeﻣﻦ ﺟﺪﻳﺪ! أي ان هﺬا اﻻﺟﺮاء ﺳﻴﺘﻢ ﺗﻨﻔﻴﺬﻩ آﻤـﺎ ﻳﻌـﺮف ﻓـﻲ
ﻋــﺎﻟﻢ اﻟﺒﺮﻣﺠــﺔ ﺗﺮاﺟﻌــﻲ Recursivlyوهــﻮ اﺣــﺪ اﺳــﺎﻟﻴﺐ اﻟﺨﻮارزﻣﻴــﺎت اﻟﺘﺮاﺟﻌﻴــﺔ
.Recursionوﺣﺘﻰ ﺗﺘﻔﺎدى هﺬﻩ اﻟﻤﺸﻜﻠﺔ اﺳـﺘﺨﺪم ﻣﺘﻐﻴـﺮ ﺳـﺘﺎﺗﻴﻜﻲ ﻳﻤﻨـﻊ ﺣـﺪوث
ذﻟﻚ:
End If
End Sub
ﻣﺎزاﻟﺖ ﺗﻮﺟﺪ ﻣﺸﻜﻠﺔ اﺧﺮى وﺧﻄﻴﺮة اﻳﻀﺎ! وهﻲ ﺗﺘﻌﻠﻖ ﺑﻤﻮﻗﻊ اﻟﻤﺆﺷﺮ Caretاﻟﺨﺎص
ﺑﺄداة اﻟﻨﺺ .ﻓﺎﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻻ ﻳﻘﻮم ﺑﺤﻔﻆ ﻣﻮﻗﻊ اﻟﻤﺆﺷـﺮ اﻻ ﻓـﻲ ﺣﺎﻟـﺔ ﺗﻐﻴﻴـﺮ اﻟﻘﻴﻤـﺔ
ﻷداة اﻟﻨﺺ ﻣﻤﺎ ﻳﺘﺴﺒﺐ ﻓـﻲ ﻣﺸـﺎآﻞ ﻻ ﻧﻬﺎﻳـﺔ ﻟﻬـﺎ ﻋﻨـﺪﻣﺎ ﻳﻘـﻮم اﻟﻤﺴـﺘﺨﺪم ﺑﺘﻐﻴﻴـﺮ
ﻣﻜﺎن اﻟﻤﺆﺷﺮ دون ﺗﻐﻴﻴﺮ اﻟﻘﻴﻤﺔ آﺘﺤﺮﻳﻜﻪ ﺑﻼﺳﻬﻢ ﻓﻲ ﻟﻮﺣﺔ اﻟﻤﻔـﺎﺗﻴﺢ او ﺑـﺰر اﻟﻔـﺄرة.
واﻟﺤﻞ ﻋﻦ ﻃﺮﻳﻖ ﺣﻔﻆ ﻗﻴﻤﺔ ﻣﻮﻗﻊ اﻟﻤﺆﺷﺮ ﻓﻲ ﺣﺎﻟﺔ ﺣﺪوث ذﻟﻚ:
آﻤﺎ ﻳﻘﻮل اﺧﻮاﻧﻨﺎ اﻻﻋﺰاء ﻓﻲ ﻣﺼﺮ :دي ﻟﻮ ﻋﻠﻰ ﺟﻮﺳﺘﻲ ،اﻟﻴﻮزر ﻣـﺶ ﺣﺎﻳﺌـﺪر ﻳﻜﺘـﺐ
ﺣﺎﺟﻪ ﻏﻴﺮ ﻧﻤﺮﻩ! ﻟﻜﻦ ﻣـﻦ ﻧﺎﺣﻴـﺔ ﻋﻘﻠﻴـﺔ هـﻞ ﻣـﻦ اﻟﻤﻌﻘـﻮل اﻧـﻚ ﺳـﺘﻜﺘﺐ آـﻞ هـﺬﻩ
اﻻآﻮاد ،آﻠﻤﺎ اﺣﺘﺠﺖ اﻟﺘﺤﻘﻖ ﻣﻦ ان اﻟﻤﺴﺘﺨﺪم ﻗﺎم ﺑﺎدﺧﺎل ارﻗﺎم ﻓﻲ أداة اﻟﻨﺺ!؟
ﺑﻜﻞ ﺗﺄآﻴﺪ ﻟﻮ ﻟﻢ ﻳﻜﻦ هﻨﺎك ﺣﻞ ﺁﺧﺮ ﻟﻤﺎ آﻨﺖ ﻗﺪ ﻋﺮﺿـﺖ اﻟﻤﺸـﻜﻠﺔ ﻣـﻦ اﻟﺒﺪاﻳـﺔ ،ﻻن
اﻟﺤﻞ ﻳﺘﻢ ﺑﺎﺧﺘﺒﺎر اﻟﻘﻴﻤﺔ ﺑﻌﺪ ان ﻳﻨﺘﻬﻲ اﻟﻤﺴﺘﺨﺪم ﻣﻦ ادﺧﺎل اﻟﻘﻴﻤﺔ وﻟﻴﺲ ﻓﻲ اﺛﻨﺎء
ذﻟﻚ .وﻳﺘﻢ ذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﻟﺤﺪث Validateاﻟﺬي ﻇﻬﺮ آﺤﻞ ﻟﻤﺒﺮﻣﺠـﻲ Visual Basic
ﻟﻤﻮاﺟﻬﺔ ﻣﺜﻞ هﺬﻩ اﻟﻤﺸﺎآﻞ ﺑﺎﻟﺘﺤﺪﻳﺪ ﻣﻊ اﺻـﺪارﻩ اﻟﺴـﺎدس .ﺣـﺪث Validateﻳﻌﻤـﻞ
ﺑﺎﻟﺘﻜﺎﻣــﻞ ﻣــﻊ اﻟﺨﺎﺻــﻴﺔ ،CausesValidationﻟﻤﻌﺮﻓــﺔ آﻴــﻒ ﻳــﺘﻢ ذﻟــﻚ ،راﻗــﺐ هــﺬا
اﻟﺴﻴﻨﺎرﻳﻮ :ﻋﻨﺪﻣﺎ ﻳﻨﺘﻘﻞ اﻟﺘﺮآﻴﺰ ﻣﻦ أدا اﻟﻨﺺ Text1اﻟﻰ اﻻداة ،Xﻳﻘﻮم Visual Basic
ﺑﺎﺧﺘﺒﺎر ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ CausesValidationاﻟﺘﺎﺑﻌﺔ ﻟـﻼداة ،Xواذا آﺎﻧـﺖ ﻗﻴﻤﺘﻬـﺎ ،True
60
ﻓﺘﻼﺣﻆ اﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻐﻴﻴﺮ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ Cancelاﻟﻰ Trueﺣﺘﻰ ﻧﻠﻐﻲ ﻋﻤﻠﻴـﺔ اﻻدﺧـﺎل
ﻣﻦ اﻟﻤﺴﺘﺨﺪم وﻧﻌﻮد ﺑﺎﻟﺘﺮآﻴﺰ اﻟﻰ أدا اﻟﻨﺺ .Text1وﻗﺪ ﻳﺴﺄل ﺳﺎﺋﻞ وﻳﻘﻮل ﻟﻤـﺎذا ﻻ
ﻧﺴﺘﺨﺪم اﻟﺤﺪث LostFocusﺑﺪﻻ ﻣﻦ Validate؟ واﻟﺠﻮاب هـﻮ ان اﻟﺤـﺪث LostFocus
ﻏﻴﺮ ﻣﺮن! أي اﻧﻚ ﺗﺤﺘﺎج اﻟﻰ اآـﻮاد اﺿـﺎﻓﻴﺔ ﻟﺘﻌـﺪﻳﻞ اﻟﺨﻴـﺎرات )ﻓـﻼ ﻳﻮﺟـﺪ ﺑـﻪ اﻟﻤﺘﻐﻴـﺮ
(Cancelاﻟﻤﺰﻳﺪ اﻳﻀﺎ ،اﻟﺤﺪث LostFocusﺳﻴﻘﻮم داﺋﻤﺎ ﺑﺎﺧﺘﺒﺎر اﻟﻘﻴﻤﺔ رﻏﻢ اﻧﻚ ﻻ ﺗﻮد
اﺧﺘﺒﺎر اﻟﻘﻴﻤـﺔ داﺋﻤـﺎ ،ﻣـﺜﻼ ﻋﻨـﺪﻣﺎ ﻳﻘـﻮم اﻟﻤﺴـﺘﺨﺪم ﺑﺎﻟﻀـﻐﻂ ﻋﻠـﻰ اﻟـﺰر اﻟﻐـﺎء اﻻﻣـﺮ
Cancelاﻟﺨﺎص ﺑﺼﻨﺪوق اﻟﺤﻮار اﻟﺬي ﺻﻤﻤﺘﻪ.
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺨﺎﺻﻴﺔ Captionﻓﻬﻲ ﺗﺘﺄﺛﺮ ﺑﺎﻟﺮﻣﺰ "&" داﺋﻤﺎ آﻤﺎ ﺗﺘـﺄﺛﺮ أداة ﻣﻼﺣﻈﺔ:
اﻟﻌﻨﻮان Labelﺑﻬﺬا اﻟﺮﻣﺰ ﻋﻨﺪﻣﺎ ﺗﻜﻮن ﻗﻴﻤﺔ ﺧﺎﺻـﻴﺘﻬﺎ UseMnemonic
ﺗﺴﺎوي .True
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺨﺎﺻﻴﺔ Captionﻓﻬﻲ ﺗﺘﺄﺛﺮ ﺑﺎﻟﺮﻣﺰ "&" ﺗﻤﺎﻣﺎً آﻤﺎ ﺗﺘﺄﺛﺮ أداة ﻣﻼﺣﻈﺔ:
زر اﻻواﻣﺮ CommandButtonﺑﻬﺬا اﻟﺮﻣﺰ.
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺨﺎﺻﻴﺔ Captionﻓﻬﻲ ﺗﺘﺄﺛﺮ ﺑﺎﻟﺮﻣﺰ "&" ﺗﻤﺎﻣﺎً آﻤﺎ ﺗﺘﺄﺛﺮ أداة ﻣﻼﺣﻈﺔ:
زر اﻻواﻣﺮ CommandButtonﺑﻬﺬا اﻟﺮﻣﺰ.
ﻧﻔﺲ اﻟﻌﺪد اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺨﺎﺻﻴﺔ Columnsرﻏﻢ اﻧﻲ ﻻ اﺣﺒـﺬ هـﺬﻩ اﻟﻄﺮﻳﻘـﺔ ﻟﻌـﺮض
ﻣﺤﺘﻮﻳﺎت اﻻداة.
ﺗﻐﻴﻴــﺮ ارﺗﻔــﺎع اﻻداة Heightﻟــﻦ ﻳﻜــﻮن دﻗﻴﻘــﺎ آﻤــﺎ هــﻮ اﻟﺤــﺎل ﻣــﻊ اﻻدوات اﻻﺧــﺮى،
واﻟﺴﺒﺐ ان Visual Basicﻳﺤﺎول ﺗﻌﺪﻳﻞ ارﺗﻔﺎع اﻻداة ﺣﺘﻰ ﺗﻌﺮض اﻟﺴـﻄﺮ آـﺎﻣﻼ ﻓـﻲ
اﻟﻘﺎﺋﻤﺔ ،ﻓﻠﻦ ﺗﺴﺘﻄﻴﻊ ﻋﺮض ﻧﺼﻒ اﻟﺴﻄﺮ اﻻ اذا ﻗﻤﺖ ﺑﺎﻟﻐـﺎء اﻟﻤﺤـﺎذاة اﻟﺘـﻲ ﻳﻔﻌﻠﻬـﺎ
Visual Basicﻋﻦ ﻃﺮﻳﻖ ﺟﻌﻞ ﻗﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ IntegralHeightﺗﺴﺎوي .False
ﺗﺴﺘﻄﻴﻊ ﺗﻌﺒﺌﺔ ﻣﺤﺘﻮﻳﺎت اﻻداة ﻓﻲ وﻗﺖ اﻟﺘﺼـﻤﻴﻢ ﻋـﻦ ﻃﺮﻳـﻖ اﻟﺨﺎﺻـﻴﺔ Listاو وﻗـﺖ
اﻟﺘﻨﻔﻴﺬ ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﻳﻖ :AddItem
”اﻻول“ List1.AddItem
”اﻟﺜﺎﻧﻲ“ List1.AddItem
”اﻟﺜﺎﻟﺚ“ List1.AddItem
اذا آﻨﺖ ﺳﺘﻀﻴﻒ ﻣﺌﺎت او اﻻف اﻟﻌﻨﺎﺻﺮ وﻗﺖ اﻟﺘﻨﻔﻴﺬ ،ﻓﻴﻨﺼﺢ ﺑﺎﺧﻔﺎء اﻻداة ﻣﺆﻗﺘﺎ وﺑﻌﺪ
اﺿﺎﻓﺔ اﻟﻌﻨﺎﺻﺮ ﺗﻌﻴﺪ اﻇﻬﺎرهﺎﻣﻦ ﺟﺪﻳﺪ ،وذﻟﻚ ﻷن اﻻداة ﺗﻌﻴﺪ رﺳﻢ ﻧﻔﺴﻬﺎ ﺗﻠﻘﺎﺋﻴـﺎً ﻣـﻊ
اﺿﺎﻓﺔ أي ﻋﻨﺼﺮ إﻟﻴﻬﺎ ،ﻣﻤﺎ ﻳﺘﺴﺒﺐ ﻓﻲ ﺑﻂء اﻟﺘﻨﻔﻴﺬ وآﺬﻟﻚ ارﺗﻌﺎش اﻻداة:
List1.Visible = False
For X = 0 To 10000
List1.AddItem X
Next
List1.Visible = True
اﻟﻌﻨﺎﺻﺮ اﻟﺠﺪﻳﺪة ﺗﻀﺎف اﻟﻰ ﻧﻬﺎﻳﺔ ﺳﻠﺴﻠﺔ اﻟﻌﻨﺎﺻﺮ -اذا آﺎﻧﺖ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ Sorted
ﺗﺴﺎوي -Falseﻣﺎﻟﻢ ﺗﺤﺪد ﻣﻮﻗﻌﻬﺎ ﺑﻨﻔﺴﻚ:
”اﻟﺜﺎﻟﺚ“ List1.AddItem
”, 0اﻻول“ List1.AddItem
”, 1اﻟﺜﺎﻧﻲ“ List1.AddItem
ﺗﺬآﺮ ان ﺗﺤﺪﻳﺪ ﻣﻮﻗﻊ اﻟﻌﻨﺼﺮ ﻳﺆﺛﺮ ﻓﻲ ﺗﺮﺗﻴﺐ اﻟﻌﻨﺎﺻﺮ اﻻﺧـﺮى .ﺑﺎﻣﻜﺎﻧـﻚ ﺣـﺬف اﻟﻌﻨﺼـﺮ
ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﻳﻘﺔ RemoveItemاو اﻟﻄﺮﻳﻘﺔ Clearﻟﺤﺬف ﺟﻤﻴﻊ اﻟﻌﻨﺎﺻﺮ:
List1.RemoveItem 0
List1.Clear
63
اﻟﺨﺎﺻﻴﺔ ListIndexﺗﻌﻮد ﺑﻘﻴﻤﺔ اﻟﻌﻨﺼﺮ اﻟﻤﺤﺪد ﻓـﻲ اﻻداة ،وﺗﻌـﻮد ﺑﺎﻟﻘﻴﻤـﺔ 1-ان ﻟـﻢ
ﻳﻜﻦ هﻨﺎك أي ﻋﻨﺼﺮ ﻣﺤﺪد ،ﺑﺎﻣﻜﺎﻧﻚ ﺗﻌﺪﻳﻞ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ اﻳﻀـﺎ ،اﻣـﺎ اﻟﺨﺎﺻـﻴﺔ Text
ﻓﻬﻲ ﺗﻌﻮد ﺑﻨﺺ اﻟﻌﻨﺼﺮ اﻟﻤﺤﺪد:
List1.ListIndex = 0
Print List1.Text
For X = 0 To List1.ListCount
)Print List1.List (0
Next
iCounter = 0
آـ .... DrawMode ،AutoRedraw ،HasDCاﻟﺦ آﻤﺎ اﻧﻬﺎ ﻻ ﺗﺪﻋﻢ ﻃﺮق اﻟﺮﺳﻢ ،Line
.... Cirlceاﻟﺦ ،واﻻﺣﺪاث .... Resize ،Paintاﻟﺦ ،اذا آﻨﺖ ﻻ ﺗﻨـﻮي اﺳـﺘﺨﺪاﻣﻬﺎ ﻓﻘـﺪ
ﺗﺨﺴﺮ اﻟﻜﺜﻴﺮ! ﻻن اﻻداة Imageهﻲ اداة ﻣـﻦ اﻟﻨـﻮع ﻣﻌﺪوﻣـﺔ اﻟﻨﻮاﻓـﺬ Windowless
Controlأي اﻧﻬــﺎ اﺳــﺮع ﺑﻜﺜﻴــﺮ ﻣــﻦ اﻻداة ،PictureBoxآﻤــﺎ ان اﺳــﺘﻬﻼآﻬﺎ ﻟﻤﺼــﺎدر
اﻟﻨﻈﺎم System Resourcesاﻗﻞ ﺑﻜﺜﻴﺮ ﻣﻦ اﻻداة .PictureBoxﻓـﺎذا آـﺎن اﺳـﺘﺨﺪاﻣﻚ
ﻻدوات اﻟﺼﻮرة ﻗﺎﺻﺮا ﻋﻠﻰ ﻋﺮض اﻟﺼﻮر ﻓﻘﻂ ،اﺳﺘﺨﺪم اﻻداة Imageﻋﻮﺿﺎ ﻋﻦ اﻻداة
.PictureBox
ادوات اﻟﻤﻠﻔﺎت
ﻣــﻦ اﻟﻮاﺿــﺢ ان ادوات اﻟﻤﻠﻔــﺎت DirListBox ،DriverListBoxو FileListBoxﻏﺮﺿــﻬﺎ
اﻻﺳﺎﺳﻲ هﻮ ﻋﺮض ﻣﻠﻔﺎت اﻟﺠﻬﺎز ،ﻳﻌﻴﺒﻬﺎ اﻧﻬﺎ ادوات ﻗﺪﻳﻤﺔ ﺟﺪا ،وﺷﻜﻠﻬﺎ اﻟﺨﺎرﺣﻲ
ﻻ ﻳﻼﺋــﻢ ادوات ﻋــﺮض اﻟﻤﻠﻔــﺎت اﻟﺸــﺎﺋﻌﺔ ﻟﺒﻴﺌــﺔ ،Windowsورﻏــﻢ اﻧﻨــﻲ ﻻ اﺣﺒــﺬ
اﺳﺘﺨﺪاﻣﻬﺎ ،اﻻ اﻧﻨﻲ ﻣﻠﺰم ﺑﺸﺮﺣﻬﺎ ﻓﻬﻲ –ﻋﻠﻰ اﻻﻗﻞ -ﺗﻌﺘﺒﺮ ﻣـﻦ اﻻدوات اﻟﺪاﺧﻠﻴـﺔ،
وآﻤﺎ ﻳﻘﻮﻟﻮن" :ﻳﻤﻜﻨﻬﺎ ﺗﻔﻚ ازﻣﺔ!".
ﻓﻲ اﻏﻠﺐ اﻟﻨﻮاﻓﺬ ،ﺗﻌﻤﻞ هﺬﻩ اﻻدوات ﺟﻨﺒـﺎ اﻟـﻰ ﺟﻨـﺐ ﻓﺘﺒـﺪأ ﺑـﺎﻻداة DriverListBox
وﺗﺤﺪد ﺣﺮف ﻣﺤﺮك اﻻﻗﺮاص اﻻﺑﺘﺪاﺋﻲ DiskDriveﻋﻦ ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ :Drive
ﺛــﻢ ﺗﻨﺘﻘــﻞ اﻟــﻰ اﻟﺤــﺪث Changeﺣﺘــﻰ ﺗﻐﻴــﺮ ﻣﺴــﺎر اﻻدﻟــﺔ اﻟﻤﻮﺟــﻮدة ﻓــﻲ اﻻداة
DirListBoxﻓـــﻲ آـــﻞ ﻣـــﺮة ﻳﻘـــﻮم ﺑﻬـــﺎ اﻟﻤﺴـــﺘﺨﺪم ﺑﺘﻐﻴﻴـــﺮ اﻟﻤﺤـــﺮك ﻓـــﻲ اﻻداة
:DriveListBox
ﻣﻦ اﻟﻤﻬﻢ ﺟﺪا ﺗﻮﻗﻊ اﻟﺨﻄﺄ ﻓﻲ اﻟﻜﻮد اﻟﺴـﺎﺑﻖ ،ﻓﻠـﻮ ﻗـﺎم اﻟﻤﺴـﺘﺨﺪم ﺑﺎﺧﺘﻴـﺎر ﻣﺤـﺮك
اﻗــﺮاص ﻻ ﻳﻮﺟــﺪ ﺑــﻪ ﻗــﺮص -آــﺎﻟﻤﺤﺮك :Aﻣــﺜﻼ -ﻓﺮﺳــﺎﻟﺔ اﻟﺨﻄــﺄ ﺳــﺘﻨﻔﺠﺮ ﻓــﻲ وﺟــﻪ
اﻟﻤﺴﺘﺨﺪم وﺗﻨﻬﻲ اﻟﺒﺮﻧﺎﻣﺞ:
”File1.Pattern = “*.EXE
”File1.Pattern = “*.TXT;*.DOC;*.RTF
”*File1.Pattern = “ABC*.
File1.ReadOnly = False
File1.Hidden = True
ادوات اﺧﺮى
ﻣﻦ اﻻدوات اﻻﺧﺮى اﻟﺘﻲ أود ان اﺧﺘﻢ ﺑﻬﺎ هﺬا اﻟﻔﺼﻞ هـﻲ أداة اﻻﻃـﺎر Frameاﻟﺘـﻲ
ﺗﺴﺘﺨﺪم ﺑﻜﺜـﺮة ﻟﺤﻀـﻦ اﻻدوات وﺗﻘﺴـﻴﻤﻬﺎ إﻟـﻰ ﻣﺠﻤﻮﻋـﺎت ،وﻳﻤﻜﻨـﻚ اﻟـﺘﺤﻜﻢ ﻓـﻲ
ﻇﻬـﻮر او اﺧﻔــﺎء اﻟﺤــﺪ اﻟﺨـﺎرﺟﻲ ﻟﻬــﺎ ﻋــﻦ ﻃﺮﻳـﻖ اﻟﺨﺎﺻــﻴﺔ .BorderStyleواداة رﺳــﻢ
اﻟﺨﻄﻮط Lineاﻟﺘﻲ ﻻ ﻳﻮﺟﺪ داﻋﻲ ﻟﺬآﺮ اﻟﺸﻜﻞ اﻟﺬي ﺗﺮﺳﻤﻪ وﻟﻜﻦ ﻣﺎ دﻋﺎﻧﻲ ﻟـﺬآﺮﻩ
هﻮ ﺧﺼﺎﺋﺺ اﻟﻤﻮﻗﻊ واﻟﺤﺠﻢ اﻟﺘﺎﺑﻌﺔ ﻟﻬـﺎ Y1 ،X2 ،X1و Y2ﻓﻬـﻲ ﻟﻴﺴـﺖ ،Top ،Left
Widthو ،Heightوﻟﻜﻨﻬﺎ اﺣﺪاﺛﻴﺎت ﻧﻘﻄﺘﻲ اﻟﺒﺪاﻳﺔ واﻟﻨﻬﺎﻳﺔ ﻟﻠﺨـﻂ اﻟـﺬي ﺗﺮﻳـﺪ رﺳـﻤﺔ
اﻣﺎ اداة رﺳﻢ اﻻﺷﻜﺎل Shapeﻓﺘﺴﺘﺨﺪم ﻟﺮﺳﻢ ﺷـﻜﻞ ﻣـﻦ ﺑـﻴﻦ 6اﺷـﻜﺎل ﻣﺨﺘﻠﻔـﺔ
ﺗﺴﺘﻄﻴﻊ ﺗﺤﺪﻳﺪهﺎ ﻋﻦ ﻃﺮﻳﻖ اﻟﺨﺎﺻﻴﺔ اﻟﺘﻲ ﺗﺤﻤﻞ ﻧﻔـﺲ اﺳـﻢ اﻻداة .وأداة اﻟﻤﺆﻗـﺖ
Timerاﻟﺘﻲ ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﻨﻔﻴﺬ اﻻواﻣﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ ﺣـﺪﺛﻬﺎ اﻟﻮﺣﻴـﺪ Timerآـﻞ ﻓﺘـﺮة
ﻣﻌﻴﻨﺔ ،ﺗﺤﺪﻳﺪ هﺬﻩ اﻟﻔﺘﺮة ﺗﻀﻌﻪ ﻓﻲ اﻟﺨﺎﺻﻴﺔ Intervalووﺣﺪﺗﻬﺎ 0.001ﺛﺎﻧﻴﺔ .اﻣﺎ أداة
رﺑﻂ اﻟﻜﺎﺋﻨﺎت وﺗﻀﻤﻴﻨﻬﺎ OLEﻓﻬﻲ ﺗﻤﻜﻨﻚ ﻣﻦ اﺳﺘﺨﺪام ﺗﻘﻨﻴﺔ OLEﻟﻮﺿـﻊ ﻣﺴـﺘﻨﺪات
ﻣﺨﺘﻠﻔﺔ ﻣﻦ ﺗﻄﺒﻴﻘﺎت ﻣﺨﺘﻠﻔﺔ ﻓﻲ ﻧﺎﻓﺬة اﻟﻨﻤﻮذج .اﻟﺘﺤﺪث ﻋﻦ ﺗﻔﺎﺻﻴﻞ اﻻداة او ﺗﻘﻨﻴﺔ
OLEﺧﺎرج ﻧﻄﺎق هﺬا اﻟﻜﺘﺎب.
اﺧﻴﺮا وﻣﻊ ﻧﻬﺎﻳﺔ هﺬا اﻟﻔﺼﻞ ،ﺑﻮدي ﻋﺮض هﺬﻩ اﻟﻤﻼﺣﻈﺔ اﻟﺘﻲ آﺘﺒﻬﺎ اﻻﺳـﺘﺎذ ﺳـﺎﻟﻢ
اﻟﻤﺎﻟﻜﻲ ﻋﻨﺪ ﻣﺮاﺟﻌﺘﻪ ﻟﻬﺬا اﻟﻔﺼﻞ ﺣﻮل اﻟﺘﻌﺒﻴﺮ "اﻧﻔﺠﺎر اﻻﺣﺪاث" :
ووﺳﻊ ﺻﺪرك.
70
اﻟﻔﺼﻞ اﻟﺜﺎﻟﺚ
ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ BASIC
ان Visual Basicﺷﺨﺼﻴﺔ اﺻﻴﻠﺔ ﻣﻌﺘﺰة ﺑﺎﻣﺠﺎدهﺎ وﺗﺎرﻳﺨﻬـﺎ ،ﻓﻤـﺎ زاﻟـﺖ Visual Basic
ﻣﺤﺘﻔﻈﺔ ﺑﺴﻤﺎت ﻟﻐﺔ اﻟﺒﺮﻣﺠﺔ BASICاﻟﺘﻲ ﺗﺼـﻨﻒ ﻣـﻦ ﻟﻐـﺎت اﻟﺒﺮﻣﺠـﺔ اﻟﻌﻠﻴـﺎ High
،level programming languageﻟﻐﺔ BASICهـﻲ روح ﻟﻐـﺔ اﻟﺒﺮﻣﺠـﺔ ،Visual Basic
وهﻲ اﻟﻠﻐﺔ اﻟﺘﻲ زادت ﻣﻦ اﺳﻬﻢ وﺷﻌﺒﻴﺔ Visual Basicاﻟﻰ ﺟﺎﻧﺐ ﻣﺼـﻤﻢ اﻟﻨﻤـﺎذج
.Form Designerﻓﻤﻌﻈﻢ اﻟﺼﻴﻎ Syntaxاﻟﺘﻲ ﻇﻬﺮت ﺑﻬﺎ اﻟﻠﻐﺔ ﻣﻨﺬ ﺑﺪاﻳـﺔ اﻟﺴـﺘﻴﻨﺎت
ﻣﺎزاﻟﺖ ﻣﺪﻋﻮﻣﺔ ﺑﺸﻜﻞ ﺟﻴﺪ ﻓﻲ اﺣﺪث اﺻﺪارات .Visual Basicﻟﻴﺲ هـﺬا ﻓﻘـﻂ ،ﺑـﻞ
اﺿﻴﻔﺖ اﻟﻴﻬﺎ اﻟﻌﺸﺮات ﻣﻦ اﻟـﺪوال واﻟﺼـﻴﻎ اﻟﺒﺮﻣﺠﻴـﺔ ﺣﺘـﻰ ﺗﻼﺋـﻢ ﻗـﻮة Visual Basic
وﺗﺤﺎآﻲ ﺗﻄﺒﻴﻘﺎت Windowsﻓﻲ اﻣﻜﺎﻧﻴﺎﺗﻬﺎ.
اﻟﻤﺘﻐﻴﺮات واﻟﺜﻮاﺑﺖ
اﻟﻤﺘﻐﻴﺮات واﻟﺜﻮاﺑﺖ هﻲ اﺳﺎس أي ﻟﻐـﺔ ﺑﺮﻣﺠـﺔ .إن اﺳـﺘﻴﻌﺎب اﻧـﻮاع اﻟﻤﺘﻐﻴـﺮات ﻣـﻦ
اﻟﻤﺴــﺎﺋﻞ اﻟﻀــﺮورﻳﺔ اﻟﺘــﻲ ﺗﻤﻜﻨــﻚ ﻣــﻦ اﺧﺘﻴــﺎر اﻻﻧــﻮاع اﻟﻤﻨﺎﺳــﺒﺔ ﻟﻠﻤﺘﻐﻴــﺮات ﺳــﻮاء
ﻻرﺳﺎﻟﻬﺎ اﻟﻰ اﻟﺪوال او ﻹﺟﺮاء اﻟﻌﻤﻠﻴﺎت اﻟﺤﺴﺎﺑﻴﺔ ﻋﻠﻴﻬـﺎ .ﺑـﻮدي اﻟﺘﺤـﺪث ﻋـﻦ ﻣﺒـﺪﺋﺎ
ﻗﺎﺑﻠﻴﺔ اﻟﺮؤﻳﺔ وﻋﻤﺮ اﻟﺤﻴﺎة ﻗﺒﻞ اﻟﺨﻮض ﻓﻲ ﺗﻔﺎﺻﻴﻞ اﻟﻤﺘﻐﻴﺮات.
End Sub
اﻣﺎ ﻋﻤﺮ اﻟﺤﻴﺎة LifeTimeﻟﻠﻤﺘﻐﻴﺮ ،ﻓﻬﻲ ﺗﻤﺜﻞ اﻟﻔﺘﺮة اﻟﺘﻲ ﻳﻈﻞ ﻓﻴﻬﺎ اﻟﻤﺘﻐﻴﺮ ﻣﺤﺘﻔﻈﺎ
ﺑﻘﻴﻤﺘﻪ ،ﻓﺎﻟﻤﺘﻐﻴﺮ Xاﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ ،ﺳﻴﻨﺘﻬﻲ وﻳﺰال ﺗﻠﻘﺎﺋﻴـﺎ ﻣـﻦ اﻟـﺬاآﺮة
ﺑﻤﺠﺮد اﻟﺨﺮوج ﻣﻦ اﻻﺟـﺮاء .Sub1وﻟﻜـﻲ ﺗﻔﻬـﻢ اﻻﺳـﻠﻮب اﻟـﺬي ﻳﺘﺒﻌـﻪ Visual Basic
ﻟﺘﻄﺒﻴﻖ ﻣﺒﺪأ ﻗﺎﺑﻠﻴﺔ اﻟﺮؤﻳﺔ وﻋﻤﺮ اﻟﻤﺘﻐﻴﺮات ،ﻋﻠﻴﻚ ﻣﻌﺮﻓﺔ اﻧﻮاع اﻟﻤﺘﻐﻴﺮات ﻣـﻦ ﻣﻨﻈـﻮر
اﻟﺮؤﻳﺔ وﻋﻤﺮ اﻟﺤﻴﺎة:
اذا آﺎﻧﺖ اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة Option Explicitﻣﻮﺟـﻮدة ﻓـﻲ اﻋﻠـﻰ ﻣﻨﻄﻘـﺔ اﻻﻋﻼﻧـﺎت
اﻟﻌﺎﻣﺔ ﻟﻨﺎﻓـﺬة اﻟﻨﻤـﻮذج او ﻣﻠـﻒ اﻟﺒﺮﻣﺠـﺔ ،BASﻓﻌﻠﻴـﻚ اﻟﻼﻟﺘـﺰام ﺑﺎﻟﺘﺼـﺮﻳﺢ آﻤـﺎ ﻓـﻲ
اﻟﺼﻴﻐﺔ اﻟﺴﺎﺑﻘﺔ ،وان ﻟﻢ ﺗﻜﻦ اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠـﻮزة Option Explicitﻣﺴـﻄﻮرة ﻓﻴﻤﻜﻨـﻚ
ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮ ﻣﺒﺎﺷﺮة دون اﻻﻟﺘﺰام ﺑﻌﻤﻠﻴﺔ اﻟﺘﺼﺮﻳﺢ ﺑﺎﺳﻨﺎد ﻗﻴﻤﺔ اﺑﺘﺪاﺋﻴﺔ ﻟﻪ:
ﺻﺤﻴﺢ ان اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻳﻮﻓﺮ ﻋﻠﻴﻚ ﻋﻨﺎء ﺗﺼﺮﻳﺢ اﻟﻤﺘﻐﻴﺮ ﻻ اﻧﻪ ﻏﻴﺮ ﻣﺤﺒﺬ ﺑﺸﻜﻞ آﺒﻴـﺮ
ﻟﺪى اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﺠﺎدﻳﻦ ،ﻗﺪ ﻳﻌﺮض هﺬا اﻟﻤﺜﺎل اﺣﺪ اﻻﺳﺒﺎب:
اﻟﻨﺎﺗﺞ ﻣﻦ ﻋﻤﻠﻴﺔ اﻟﻄﺒﺎﻋﺔ Printﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻟﻦ ﻳﻜﻮن آﻤﺎ هﻮ ﻣﺘﻮﻗﻊ "اﻟﺸـﺮآﺔ
اﻟﺘﺠﺎرﻳــﺔ" ،ﻓــﺎﻟﻤﺘﻐﻴﺮ اﻟﻤﺴــﺘﺨﺪم ﻓــﻲ اﻟﺴــﻄﺮ اﻟﺜــﺎﻧﻲ هــﻮ sConpanyNameوﻟــﻴﺲ
sCompanyNameوهﺬا اﻟﺨﻄﺄ آﻔﻴﻞ ﻓﻲ ﻧﻤﻮ اﻟﺸﻮاﺋﺐ اﻟﺒﺮﻣﺠﻴﺔ Bugsﻓﻲ ﺑﺮاﻣﺠﻚ.
ﺳﺒﺐ ﺁﺧﺮ ﻗﺪ ﻳﺠﻌﻠﻚ ﺗﺤﺒﺬ اﻻﻟﺘﺰام ﺑﻌﻤﻠﻴﺔ اﻟﺘﺼـﺮﻳﺢ وهـﻮ ان ﺟﻤﻴـﻊ اﻟﻤﺘﻐﻴـﺮات ﺗﻜـﻮن
ﻣﻦ اﻟﻨﻮع Variantان ﻟﻢ ﻳﺘﻢ ﺗﺼـﺮﻳﺢ ﻧـﻮع ﻏﻴـﺮ ذﻟـﻚ ،واﻟﻨـﻮع Variantهـﻮ اﺑﻄـﺄ اﻧـﻮاع
اﻟﻤﺘﻐﻴﺮات آﻤﺎ ﺳﻴﺄﺗﻲ ﻻﺣﻘﺎ.
ﻓﻲ ﻣﺜﺎﻟﻨﺎ اﻟﺴﺎﺑﻖ؛ ﻳﺆدي ﻓﺮض اﻻﻋﻼن ﻋﻦ اﻟﻤﺘﻐﻴﺮات Option Explicitإﻟﻰ اﻻﻋـﻼن
ﻋﻦ ﺧﻄﺄ و ﺗﻮﻗﻒ اﻟﺒﺮﻧﺎﻣﺞ .وﻓﻲ ﺟﻤﻴﻊ اﻟﺤﺎﻻت ﻓﺈن اﻟﺨﻄﺄ ﻓﻲ آﺘﺎﺑﺔ اﺳـﻢ اﻟﻤﺘﻐﻴـﺮ أو
اﺳﻨﺎد ﻗﻴﻤﺔ إﻟﻰ ﻣﺘﻐﻴﺮات ﻟﻢ ﻳﺘﻢ اﻻﻋﻼن ﻋﻨﻬﺎ ﻣﺴﺒﻘﺎً ﺳﻴﺘﺘﺴﺒﺐ ﻓﻲ اﻹﻋـﻼن ﻋـﻦ
ﺧﻄﺄ ،وﺳﻴﺘﻮﻗﻒ اﻟﺒﺮﻧﺎﻣﺞ اﻳﻀﺎً.
ﺗﻮﻓﺮ ﻟﻚ ﺑﻴﺌﺔ اﻟﺘﻄﻮﻳﺮ اﻟﻤﺘﻜﺎﻣﻠﺔ IDEﺧﻴﺎر ﻳﻠﺰﻣﻚ ﺑﻌﻤﻠﻴـﺔ اﻟﺘﺼـﺮﻳﺢ أي ﻣﻼﺣﻈﺔ:
ﺑﻜﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Option Explicitﻓﻲ ﺟﻤﻴﻊ وﺣﺪات ﺑﺮاﻣﺠـﻚ
آﻨﻮاﻓــﺬ اﻟﻨﻤــﺎذج ،ﻣﻠﻔــﺎت اﻟﺒﺮﻣﺠــﺔ ....اﻟــﺦ .ﻟﺘﻔﻌﻴــﻞ اﻻﺧﺘﻴــﺎر ،ﺣــﺪد
اﻻﺧﺘﻴـﺎر Require Variable Declarationﻣـﻦ ﺧﺎﻧـﺔ اﻟﺘﺒﻮﻳـﺐ Editor
ﻓﻲ ﺻﻨﺪوق اﻟﺤﻮار .Options
اﺧﻴﺮا ،اﻟﻘﻴﻤﺔ اﻻﺑﺘﺪاﺋﻴﺔ ﻟﻠﻤﺘﻐﻴﺮ اﻟﻌﺪدي اﻟﻤﺼﺮح هﻲ ،0واﻟﺤﺮﻓﻲ ﻳﻜﻮن ﻗﻴﻤﺔ ﺣﺮﻓﻴـﺔ
ﺧﺎﻟﻴﺔ "" ،اﻣﺎ اﻟﻜﺎﺋﻨﺎت ﻓﻬﻲ ﻻ ﺷﺊ .Nothing
ﺗﺴــﺘﻄﻴﻊ ﺟﻌــﻞ ﺟﻤﻴــﻊ اﻟﻤﺘﻐﻴــﺮات اﻟﺘﺎﺑﻌــﺔ ﻟﻼﺟــﺮاء ﺳــﺘﺎﺗﻴﻜﻴﺔ ﺑﻮﺿــﻊ ﻧﻔــﺲ اﻟﻜﻠﻤــﺔ
اﻟﻤﺤﺠﻮزة ﻋﻨﺪ ﺑﺪاﻳﺔ اﻻﺟﺮاء:
73
ﻻ ﺗﺤﺎول ﺗﻄﺒﻴﻖ اﻟﻜﻮد اﻟﺴـﺎﺑﻖ آﺜﻴـﺮا ،ﻓـﺎﻟﻤﺘﻐﻴﺮات اﻟﺴـﺘﺎﺗﻴﻜﻴﺔ اﺑﻄـﺄ ﻣـﻦ اﻟﻤﺘﻐﻴـﺮات
اﻟﺪﻳﻨﺎﻣﻴﻜﻴﺔ اﻟﻰ ﺟﺎﻧﺐ ﻗﻴﺎﻣﻬﺎ ﺑﺤﺠﺰ ﻣﻮاﻗﻊ هـﺬﻩ اﻟﻤﺘﻐﻴـﺮات ﻓـﻲ اﻟـﺬاآﺮة ﻃـﻮال ﻓﺘـﺮة
ﻋﻤﻞ اﻟﺒﺮﻧﺎﻣﺞ ،ﻓﻼ ﺗﺤﺎول اﺳﺘﺨﺪاﻣﻬﺎ اﻻ ﻋﻨﺪ اﻟﺤﺎﺟﺔ آﺎﻟﺮﻏﺒﺔ ﻓﻲ ﺗﻨﻔﻴﺬ اﺟـﺮاء ﻣﻌـﻴﻦ
ﻟﻤﺮة واﺣﺪة ﻣﺜﻼ او اﻻﺣﺘﻔﺎظ ﺑﻘﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﻓﻲ ﻋﺪاد:
اﺧﻴــﺮا ،اﻟﻜﻠﻤــﺔ اﻟﻤﺤﺠــﻮزة Staticﻻ ﺗﻄﺒــﻖ اﻻ ﻋﻠــﻰ اﻟﻤﺘﻐﻴــﺮات اﻟﻤﺤﻠﻴــﺔ ﻓــﻼ ﺗﺤــﺎول
اﺳﺘﺨﺪاﻣﻬﺎ ﻋﻠﻰ ﻣﺘﻐﻴﺮات ﻋﺎﻣﺔ او ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻮﺣﺪة ﻓﻬﻲ ﺑﻄﺒﻴﻌﺘﻬﺎ ﺳﺘﺎﺗﻴﻜﻴﺔ.
ﻣﻦ اﻟﻮﺣﺪات اﻟﻤﻜﻮﻧﺔ ﻟﻠﻤﺸﺮوع .ﻳﻤﻜﻨـﻚ ﺗﺼـﺮﻳﺢ ﻣﺘﻐﻴـﺮ ﻋﻠـﻰ ﻣﺴـﺘﻮى اﻟﻮﺣـﺪة ﻓـﻲ
ﻣﻨﻄﻘﺔ اﻻﻋﻼﻧﺎت اﻟﻌﺎﻣﺔ ﻟﻠﻮﺣﺪة أي ﺧﺎرج اﻻﺟﺮاءات.
ﻗﺎﺑﻠﻴﺔ اﻟﺮؤﻳﺔ ﻟﻬﺬا اﻟﻨﻮع ﻣـﻦ اﻟﻤﺘﻐﻴـﺮات ﻳﻜـﻮن ﻋـﺎم ﻟﺠﻤﻴـﻊ اآـﻮاد اﻟﻮﺣـﺪة ﻓـﻲ ﺣﺎﻟـﺔ
اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Dimاو :Private
اﻣﺎ اذا آﻨﺖ ﺗﺮﻳﺪ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴـﺮات ﻋﺎﻣـﺔ ﻗﺎﺑﻠـﺔ ﻟﻠﻮﺻـﻮل ﻣـﻦ ﺟﻤﻴـﻊ اﻧﺤـﺎء اﻟﻤﺸـﺮوع،
ﻓﺎﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Publicﺗﻔﻲ ﺑﺎﻟﻐﺮض:
اﻣﺎ ﻋﻤﺮ اﻟﺤﻴﺎة ﻟﻬﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺘﻐﻴﺮات ﻓﻴﻜﻮن ﻣﺮاﻓـﻖ ﻟﻌﻤـﺮ ﺣﻴـﺎة اﻟﻜـﺎﺋﻦ اﻟﺘـﺎﺑﻊ ﻟـﻪ
واﻟﻤﺼــﺮح ﻓﻴــﻪ –آﻌﻤــﺮ ﺣﻴــﺎة اﻟﻤﺘﻐﻴــﺮات اﻟﺴــﺘﺎﺗﻴﻜﻴﺔ ،وﺑﺎﻟﻨﺴــﺒﺔ ﻟﻠﻤﺘﻐﻴــﺮات اﻟﻌﺎﻣــﺔ
اﻟﻤﺼﺮﺣﺔ ﻓﻲ ﻣﻠﻔﺎت اﻟﺒﺮﻣﺠﺔ ،BASﻓﺴـﺘﻈﻞ ﻣﺤﺘﻔﻈـﺔ ﺑﻘﻴﻤﺘﻬـﺎ ﺣﺘـﻰ ﻧﻬﺎﻳـﺔ ﺗﻨﻔﻴـﺬ
اﻟﺒﺮﻧﺎﻣﺞ.
اﻟﻤﺘﻐﻴﺮات
ﻧﺴﺘﻄﻴﻊ ان ﻧﻌﺮف اﻟﻤﺘﻐﻴﺮات ﺑﻤﻨﻈﻮرﻳﻦ ،ﺑﺎﻟﻤﻨﻈﻮر اﻟﺮﻳﺎﺿـﻲ ﻳﻌـﺮف اﻟﻤﺘﻐﻴـﺮ ﻋﻠـﻰ اﻧـﻪ
ﻣﺠﻬﻮل س ﻳﺤﺘﻮي ﻋﻠﻰ ﻗﻴﻤﺔ ﻣﻌﻴﻨـﺔ ،اﻣـﺎ ﺑـﺎﻟﻤﻨﻈﻮر اﻟﺒﺮﻣﺠـﻲ –وهـﻮ اﻻهـﻢ -ﻳﻌـﺮف
اﻟﻤﺘﻐﻴﺮ ﻋﻠﻰ اﻧﻪ ﻗﻴﻤﺔ ﺗﺤﻔﻆ ﻓﻲ ذاآﺮة اﻟﺠﻬﺎز .وﺗﺨﺘﻠﻒ اﻟﻤﺴـﺎﺣﺔ اﻟﻤﺤﺠـﻮزة ﻟﺤﻔـﻆ
هﺬﻩ اﻟﻘﻴﻤﺔ ﺑﺎﺧﺘﻼف ﻧـﻮع اﻟﻤﺘﻐﻴـﺮ ،ﻓﻤﺘﻐﻴـﺮﻣﻦ اﻟﻨـﻮع Byteﻻ ﻳﺴـﺘﻬﻠﻚ ﺳـﻮى ﺑﺎﻳـﺖ
واﺣﺪ ﻣﻦ ذاآﺮة اﻟﺤﺎﺳﺐ ،ﻓﻲ ﺣﻴﻦ أن ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع Stringﻗﺪ ﻳﺤﺠﺰ ﻣﺴﺎﺣﺔ ﺗﺼـﻞ
اﻟﻰ 2ﺟﻴﺠﺎﺑﺎﻳﺖ.
وﻓﻴﻤﺎ ﻳﻠﻲ ﻋﺮض ﻟﺠﻤﻴﻊ اﻧﻮاع اﻟﻤﺘﻐﻴﺮات اﻟﻤﺪﻋﻮﻣﺔ ﻣﻦ ﻗﺒﻞ :Visual Basic
اﻟﻤﺘﻐﻴﺮات Doubleو Singleﻓﻼ ﺗﺴﺘﺨﺪﻣﻬﺎ ﺑﻜﺜﺮة ﻓـﻲ ﺣﺎﻟـﺔ ﺗﻄﺒﻴـﻖ ﺁﻻف اﻟﻌﻤﻠﻴـﺎت
اﻟﺤﺴﺎﺑﻴﺔ ﻋﻠﻴﻬﺎ.
Dim X As Variant
)X = CDec (Text1.Text) * CDec (Text2.Text
وﻻ ﺗﻨﺴﻰ ان اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع Variantهﻲ اﺑﻄﺄ اﻧﻮاع اﻟﻤﺘﻐﻴﺮات آﻤﺎ ﺳﺘﻘﺮأ ﻓﻲ
ﻓﻘﺮة "اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع "Varaintﻗﺮﻳﺒﺎ.
dDateVar = Now
اﻃﺒﻊ اﻟﺘﺎرﻳﺦ ﻓﻘﻂ ‘
)Print Int(dDateVar
اﻃﺒﻊ اﻟﻮﻗﺖ ﻓﻘﻂ ‘
))Print CDate(dDateVar - Int(dDateVar
اﺿﻒ اﺳﺒﻮع واﺣﺪ ‘
Print dDateVar + 7
اﺣﺬف 30ﻳﻮم ‘
79
ﻓﺎﻟﻌﺪد اﻻﻗﺼﻰ ﻣـﻦ اﻟﺤـﺮوف اﻟﺘـﻲ ﻳﻤﻜـﻦ ﻟﻠﻤﺘﻐﻴـﺮ FixedStrان ﻳﺤﻤﻠـﻪ هـﻮ 12ﻣﻤـﺎ
ﻳﺆدي اﻟﻰ اﺳﺘﻬﻼك ﻣﺴﺎﺣﺔ ﻗﺪرهﺎ 24ﺑﺎﻳـﺖ –ﻻ ﺗﻨﺴـﻰ ان UNICODEﻳﺴـﺘﻬﻠﻚ 2
ﺑﺎﻳﺖ ﻟﻠﺤﺮف اﻟﻮاﺣﺪ .ﻣﻦ ﻋﻴﻮب اﻟﻤﺘﻐﻴـﺮات ﺛﺎﺑﺘـﺔ اﻟﻄـﻮل هـﻮ ﻋـﺪم ﺗﻮاﻓﻘﻬـﺎ ﻣـﻊ ﺗﻘﻴﻨـﺔ
COMوﻣﻌﻈﻢ دوال ﻣﻜﺘﺒﺎت VBو VBAاﻟﺪاﺧﻠﻴﺔ واﺟﺮاءات APIﻻ ﺗﺪﻋﻢ هﺬا اﻟﻨﻮع ﻣﻦ
اﻟﻤﺘﻐﻴــﺮات ،وﺣﺘــﻰ ﻟــﻮ آــﺎن ﻋــﺪد ﺣــﺮوف اﻟﻘﻴﻤــﺔ اﻟﻤﺴــﻨﺪة اﻗــﻞ ﻣــﻦ ﻋــﺪد اﻟﺤــﺮوف
اﻟﻤﺼﺮﺣﺔ ،ﻓﺎن اﻟﻤﺴﺎﻓﺎت " " ﺳﺘﺤﻞ ﻣﺤﻞ اﻟﺨﺎﻧﺎت اﻟﻔﺎرﻏﺔ ،وﻻ ﻳﻤﻜﻦ ﻟﻬﺬا اﻟﻨﻮع ﻣﻦ
اﻟﻤﺘﻐﻴﺮات ان ﺗﻜﻮن ﻣﺮﺋﻴـﺔ ﻋﻠـﻰ ﻣﺴـﺘﻮى اﻟﻮﺣـﺪة ﻣـﻦ اﻟﻨـﻮع ،Publicآﻤـﺎ ﻻ ﻳﻤﻜﻨـﻪ
ﺣﻤﻞ ﻋﺪد ﻣﻦ اﻟﺤﺮوف اآﺒﺮ ﻣﻦ 64آﻴﻠﻮﺑﺎﻳﺖ ،اﻻ ان اﻟﻤﻴﺰة اﻟﺘﻲ ﺗﻈﻬﺮ ﺑﻬﺎ ﻋﻨﺪ اﺳﻨﺎد
80
اﻟﻘﻴﻢ اﻟﺤﺮﻓﻴﺔ ﻟﻬﺬا اﻟﻤﺘﻐﻴﺮات ﻓﻨﺘﺎﺋﺠﻬﺎ ﺗﻜﻮن داﺋﻤـﺎ اﺳـﺮع ﻣـﻦ اﻟﻤﺘﻐﻴـﺮات ﻣـﻦ اﻟﻨـﻮع
اﻟﻤﺘﻐﻴﺮة اﻟﻄﻮل ،وذﻟﻚ ﻻن Visual Basicﻻ ﻳﻘـﻮم ﺑـﺎي ﻋﻤﻠﻴـﺎت اﺣﺘﺠـﺎز ﻓـﻲ اﻟـﺬاآﺮة
واﻟﺘﺤﻘﻖ ﻣﻦ اﻟﻤﺴﺎﺣﺔ اﻟﻤﺘﻮﻓﺮة ....اﻟﺦ.
Dim X As Object
Dim Y As Form
Dim Z As Text
اود ان اؤﺟﻞ ﺷﺮح ﺗﻔﺎﺻﻴﻞ اﻟﻜﺎﺋﻨﺎت –اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع -Objectﺣﺘﻰ اﻟﻮﺻﻮل اﻟﻰ
اﻟﻔﺼﻞ اﻟﺨﺎﻣﺲ "اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ" وﺣﺘﻰ ذﻟﻚ اﻟﺤﻴﻦ ،ﻻ ﺗﺴﻨﺪ آﺎﺋﻦ اﻟﻰ آﺎﺋﻦ
اﻻ ﺑﺎﺳﺘﺨﺪام اﻟﻌﺒﺎرة :Set
Dim X As Variant
Dim Y As Variant
Dim Z As Variant
ﻻ ﺗﺤﺎول اﻻﻋﺘﻤﺎد ﻋﻠﻰ اﻟﻄﺮق اﻟﺴﺎﺑﻘﺔ ﺑﺸـﻜﻞ اﺳـﺘﺜﻨﺎﺋﻲ ،ﻓﻘـﺪ ﺗﻌﻄﻴـﻚ ﻧﺘـﺎﺋﺞ ﻏﻴـﺮ
ﻣﺘﻮﻗﻌﺔ ،ﻓﻤﺜﻼ اﺳﺘﺨﺪام ﻣﻌﺎﻣﻞ اﻟﺠﻤﻊ +ﻣﻊ ﻣﺘﻐﻴﺮﻳﻦ ﻣﻦ اﻟﻨﻮع Variantﻳـﺆدي اﻟـﻰ
ﺟﻤﻌﻬﻤﺎ اذا آﺎﻧﺖ ﻗﻴﻢ ﻋﺪدﻳﺔ ،اﻣـﺎ اﻟﺤﺮﻓﻴـﺔ ﻓﺘـﺘﻢ ﻋﻤﻠﻴـﺔ اﻟـﺪﻣﺞ ﺑﻴﻨﻬﻤـﺎ آﺎﺳـﺘﺨﺪام
ﻣﻌﺎﻣﻞ اﻟـﺪﻣﺞ & ،واذا آـﺎن اﺣـﺪ اﻟﻤﺘﻐﻴـﺮﻳﻦ ﺣﺮﻓـﻲ واﻻﺧـﺮ ﻋـﺪدي ﻓﺴـﻴﻘﻮم Visual
Basicﺑﻤﺤﺎوﻟﺔ ﺗﺤﻮﻳﻞ اﻟﻘﻴﻤﺔ اﻟﺤﺮﻓﻴﺔ اﻟﻰ ﻋﺪدﻳـﺔ ،وان ﻟـﻢ ﻳﺴـﺘﻄﻊ ﻓﺮﺳـﺎﻟﺔ اﻟﺨﻄـﺄ
Type Mismatchﺳﻴﻜﻮن ﻟﻬﺎ ﻧﺼﻴﺐ ﻓﻲ اﻟﻈﻬﻮر:
Dim X As Variant
Dim Y As Variant
Dim Z As Variant
X = 20
82
"Y = "20
Z=X+Y ‘ Z = 40
"X = "20
Z=X+Y ”‘ Z = “2020
Print Z
X = 20
"Y = "abcd
Z=X+Y رﺳﺎﻟﺔ ﺧﻄﺄ ‘
اذا ﻓﺘﻨﺖ ﻓﻲ اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع Variantواﻋﺠﺒﺖ ﺑﻬﺎ آﺜﻴﺮا ،ﻓﺘﺬآﺮ اﻧﻬـﺎ اﺑﻄـﺄ اﻧـﻮاع
اﻟﻤﺘﻐﻴــﺮات ،ﻓــﻼ ﺗﺤــﺎول اﻻﻋﺘﻤــﺎد ﻋﻠﻴﻬــﺎ اﻻ ﻋﻨــﺪ اﻟﻀــﺮورة اﻟﻘﺼــﻮى او ﻋﻨــﺪ اﻟﺤﺎﺟــﺔ
ﻻﺳﺘﺨﺪام اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع .Decimal
ﺗﺴﺘﻄﻴﻊ ﻣﻌﺮﻓﺔ ﻧـﻮع اﻟﻘﻴﻤـﺔ اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﻤﺘﻐﻴـﺮ ﻣـﻦ اﻟﻨـﻮع Variantﺑﺎﺳـﺘﺨﺪام
اﻟﺪاﻟﺔ :VarType
Dim X As Variant
X = 20
)Print VarType(X ﺗﻄﺒﻊ 2وهﻮ اﻟﻨﻮع ‘ Integer
"X = "20
Print X ﺗﻄﺒﻊ 20وهﻮ اﻟﻨﻮع ‘ String
اذا ﻟﻢ ﺗﺴﻨﺪ أي ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ Variantﻓﺎن اﻟﻘﻴﻤﺔ اﻻﺑﺘﺪاﺋﻴﺔ ﻟـﻪ هـﻲ Emptyواﻟﺘـﻲ
ﺗﺴﺘﻄﻴﻊ اﺧﺘﺒﺎرهﺎ ﺑﺎﻟﺪاﻟﺔ :IsEmpty
Dim X As Variant
اﻣﺎ اﻟﻘﻴﻤـﺔ Nullﻓﻬـﻲ ﻻ ﺗﻌﻨـﻲ ،Emptyﻻن Nullﻻ ﺗﻌﺘﺒـﺮ ﻗﻴﻤـﺔ ﺧﺎﻟﻴـﺔ ﻓﻬـﻲ ﻗﻴﻤـﺔ
ﻣﻌﻴﻨﺔ ﺗﺴﺘﺨﺪم ﻓﻲ اﻟﻐﺎﻟﺐ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت :DataBases
83
Dim X As Variant
X = Null
)Print IsNull(X ‘ True
)Print VarType(X ﺗﻄﺒﻊ 1وهﻮ اﻟﻨﻮع ‘ Null
Dim X As Variant
Set X = Text1
)Print IsObject(X ‘ True
"اﻟﻨﺺ" = X.Text ‘ Text1.Text
اﺧﻴﺮا ،اﻟﻤﺘﻐﻴﺮات ﻣﻦ اﻟﻨﻮع Variantﻳﻤﻜﻦ ﻟﻬﺎ ان ﺗﺤﻮي ﻣﺼﻔﻮﻓﺎت آﻤـﺎ ﺳـﻴﺄﺗﻲ ﻓـﻲ
ﻓﻘﺮة "اﻟﺘﺮآﻴﺒﺎت واﻟﻤﺼﻔﻮﻓﺎت" ،وﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺘﺮآﻴﺒﺎت ﻣﻦ اﻟﻨﻮع UDTﻓﻴﻤﻜﻦ اﺣﺘﻀـﺎﻧﻬﺎ
ﻓــﻲ اﻟﻤﺘﻐﻴــﺮات Variantﺷــﺮﻳﻄﺔ ان ﻳﻜــﻮن اﻟﺘﺮآﻴــﺐ ﻣــﻦ اﻟﻨــﻮع Publicﻣﺼــﺮح ﻋﻠــﻰ
ﻣﺴﺘﻮى اﻟﻮﺣﺪة اﻟﺒﺮﻣﺠﻴﺔ ،Moduleأو ﻋﻠـﻰ ﻣﺴـﺘﻮى وﺣـﺪة اﻟﻔﺌـﺎت اﻟﻌﺎﻣـﺔ Public
.Classes
اﻟﺜﻮاﺑﺖ
اﺑﺴﻂ اﻧﻮاع اﻟﺜﻮاﺑـﺖ هـﻲ اﻟﺜﻮاﺑـﺖ اﻟﻌﺪدﻳـﺔ واﻟﺘـﻲ ﻳﻤﻜﻨـﻚ آﺘﺎﺑﺘﻬـﺎ ﻣﺒﺎﺷـﺮة ﺑﺎﻟﻨﻈـﺎم
اﻟﻌﺸـــﺮي Decimalاو ﺑﺎﺿـــﺎﻓﺔ اﻟﺒﺎدﺋـــﺔ &Hﻟﻠﻨﻈـــﺎم اﻟﺴﺘﻌﺸـــﺮي Hexadecimalاو
اﻟﺒﺎدﺋﺔ &Oﻟﻠﻨﻈﺎم اﻟﺜﻤﺎﻧﻲ:
ﻣﻦ اﻟﻀﺮوري ان اﻧﺒﻪ هﻨﺎ ﺑﺎن ﺟﻤﻴـﻊ اﻻﻋـﺪاد اﻟﻤﺴـﺘﺨﺪﻣﺔ ﻓـﻲ اﻟﻨﻈـﺎم اﻟﺴﺘﻌﺸـﺮي
Hexadecimalآـ F ،E ،.... 2 ،1 ،0واﻟﻨﻈﺎم اﻟﺜﻤﺎﻧﻲ Octalواﻟﺘﻲ ﺗﻜﺘﺒﻬﺎ ﻓﻲ اآﻮادك
84
ﺗﻌﺘﺒﺮ ﻓﻲ ﻧﻈﺮ Visual Basicاﻋﺪاد ﻣﻦ اﻟﻨﻮع Integerﻣﺎﻟﻢ ﺗﻀﻴﻒ اﻟﺮﻣﺰ & ﺑﻌـﺪ ﻧﻬﺎﻳـﺔ
اﻟﻌﺪد ﻓﺴﻴﻜﻮن ﻣﻦ اﻟﻨﻮع ،Longﻗﺪ ﺗﻜﻮن ﺟﻤﻠﺘﻲ اﻟﺴﺎﺑﻘﺔ ﻟﻴﺴﺖ ذات اهﻤﻴﺔ آﺒﻴـﺮة
ﻋﻨﺪ ﻣﻌﻈﻢ اﻟﻤﺒﺮﻣﺠﻴﻦ اﻟﻤﺒﺘﺪﺋﻴﻦ ،ﻟﺬﻟﻚ ﻋﻠﻲ ان اﺷﺪ اﻧﺘﺒﺎهﻬﻢ ﺑﻬﺬا اﻟﻤﺜﺎل:
ﺳﺘﻌﺸﺮي ‘
‘ &HF000 = 61440
Print &HF000 هﻨﺎ ﺗﻄﺒﻊ ‘ -4096
&Print &HF000 هﻨﺎ ﺗﻄﺒﻊ ‘ 61440
ﺛﻤﺎﻧﻲ‘
‘&O170000 = 61440
Print &O170000 هﻨﺎ ﺗﻄﺒﻊ ‘-4096
&Print &O170000 هﻨﺎ ﺗﻄﺒﻊ ‘61440
ﺑﻌــﺪ اﻟﺜﻮاﺑــﺖ اﻟﻌﺪدﻳــﺔ ﺗــﺄﺗﻲ اﻟﺜﻮاﺑــﺖ اﻟﺤﺮﻓﻴــﺔ ،Stringsواﻟﺘــﻲ ﻳﺸــﺘﺮط آﺘﺎﺑﺘﻬــﺎ ﺑــﻴﻦ
ﻋﻼﻣﺘﻲ اﻟﺘﻨﺼﻴﺺ اﻟﻤﺰدوﺟﺔ " و " ،وﻻﺳﺘﺨﺪام ﻋﻼﻣﺔ اﻟﺘﻨﺼﻴﺺ " ﻓـﻲ ﻧﻔـﺲ اﻟﺜﺎﺑـﺖ
اﻟﺤﺮﻓﻲ ،آﺮرهﺎ ﻣﺮﺗﻴﻦ:
ﻓﻜﺮة اﻟﺜﻮاﺑﺖ اﻟﻤﺴﻤﺎة ﺷﺒﻴﻬﻪ ﺑﻔﻜﺮة اﻟﻤﺘﻐﻴﺮات ،وﻳﻜﻤﻦ اﻟﻔـﺮق ﺑﻴﻨﻬﻤـﺎ ﻓـﻲ أن ﻗـﻴﻢ
اﻟﺜﻮاﺑـﺖ ﻻﻳﻤﻜﻨــﻚ ﺗﻌـﺪﻳﻠﻬﺎ وﻗــﺖ اﻟﺘﻨﻔﻴـﺬ ﻻﻧﻬــﺎ ﻗـﻴﻢ ﻟﻴﺴــﺖ ﻣﻮﺟـﻮدة ﺑﺎﻟــﺬاآﺮة آﻘــﻴﻢ
اﻟﻤﺘﻐﻴﺮات ،واﻧﻤﺎ ﻳﺘﻢ اﺳﺘﺒﺪال هﺬﻩ اﻻﺳﻤﺎء ﺑﻘﻴﻤﺘﻬﺎ اﻟﻔﻌﻠﻴﺔ ﻓﻲ اﻟﻜـﻮد اﺛﻨـﺎء ﻋﻤﻠﻴـﺔ
اﻟﺘﺮﺟﻤﺔ ،Compilingﻓﺎﻟﺜﻮاﺑﺖ ﺗﺤﻔﻆ ﻣﺒﺎﺷﺮة ﻓﻲ اﻟﻤﻠﻒ اﻟﺘﻨﻔﻴﺬي EXEﻟﻠﺒﺮﻧﺎﻣﺞ.
ﺗﺴﺘﻄﻴﻊ ﺗﻌﺮﻳﻒ ﺛﺎﺑﺖ ﺟﺪﻳﺪ ﺑﺎﺳﺘﺨﺪام اﻟﻌﺒﺎرة :Const
Const PI = 3.14
Print PI
ارﺟﻮ ان ﺗﻠﺘﺰم ﺑﺎﻟﻘﻴﻤﺔ اﻟﻤﻨﺎﺳﺒﺔ ﻋﻨﺪ ﺗﺤﺪﻳـﺪ ﻧـﻮع اﻟﺜﺎﺑـﺖ ،ﻓـﻼ ﺗﺴـﻨﺪ ﻗﻴﻤـﺔ ﻋﺸـﺮﻳﺔ
ﻟﺜﺎﺑﺖ ﺻﺤﻴﺢ -آﺎﻟﻨﻮع Integerﻣـﺜﻼ ،ﻻن ﻗﻴﻤـﺔ اﻟﺜﺎﺑـﺖ ﺳـﺘﺘﻐﻴﺮ ان ﻟـﻢ ﺗﻈﻬـﺮ رﺳـﺎﻟﺔ
اﻟﺨﻄﺄ :Type Mismatch
اﺧﻴﺮا ،ﻗﺎﺑﻠﻴﺔ اﻟﺮؤﻳﺔ اﻻﻓﺘﺮاﺿﻴﺔ ﻟﻠﺜﻮاﺑﺖ ﺗﻜﻮن Privateﻋﻠﻰ ﻣﺴﺘﻮى اﻻﺟﺮاء اﻟﻤﺤﻠﻲ،
او ﻋﻠﻰ ﻣﺴﺘﻮى ﻧﺎﻓﺬة اﻟﻨﻤﻮذج او اﻟﻔﺌﺔ اذا ﺻﺮح ﻋﻨﻬﺎ ﻓﻲ ﻣﻨﻄﻘﺔ اﻻﻋﻼﻧـﺎت اﻟﻌﺎﻣـﺔ،
او ﻋﻠﻰ ﻣﺴـﺘﻮى اﻟﻤﺸـﺮوع اذا ﺻـﺮح ﻋﻨﻬـﺎ ﻓـﻲ ﻣﻠﻔـﺎت اﻟﺒﺮﻣﺠـﺔ .BASﻣـﻊ ﺗﻀـﻤﻴﻦ
اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة :Public
اﻟﺘﺮآﻴﺒﺎت واﻟﻤﺼﻔﻮﻓﺎت
ﺑﺎﻻﺿــﺎﻓﺔ اﻟــﻰ اﻧــﻮاع اﻟﻤﺘﻐﻴــﺮات اﻟﺴــﺎﺑﻘﺔ ،ﺗﺴــﺘﻄﻴﻊ ﺗﺨﺼــﻴﺺ اﻧــﻮاع ﺟﺪﻳــﺪة ﺗﻌــﺮف
ﺑﺎﻟﺘﺮآﻴﺒﺎت ،آﻤﺎ ﻳﻤﻜﻨﻚ رﺑﻂ ﺳﻠﺴﻠﺔ ﻣﻦ اﻟﻤﺘﻐﻴﺮات ﻓﻲ ﻣﺼﻔﻮﻓﺎت اﺣﺎدﻳﺔ او ﻣﺘﻌـﺪدة
اﻻﺑﻌﺎد.
ﺗﺮآﻴﺒﺎت Enum
ﻳﻤﻜﻨﻚ ﺗﻌﺮﻳﻒ ﻧﻮع ﺟﺪﻳﺪ ﻣﻦ اﻟﻤﺘﻐﻴﺮات ﺑﺤﻴﺚ ﻳﺤﺘﻮي ﻋﻠﻰ ﻗﻴﻤـﺔ ﻣـﻦ ﻣﺠﻤﻮﻋـﺔ ﻗـﻴﻢ
ﺗﻌــﺮف ﺑﺎﻟـــ .Enumerationﺗﺴــﺘﻄﻴﻊ اﺳــﺘﺨﺪام اﻟﻜﻠﻤــﺔ اﻟﻤﺤﺠــﻮزة Enumﻟﺘﻌﺮﻳــﻒ
اﻟﺘﺮآﻴﺐ ﺷﺮﻳﻄﺔ ان ﻳﻜﻮن ﻓﻲ ﻣﻨﻄﻘﺔ اﻻﻋﻼﻧﺎت اﻟﻌﺎﻣﺔ ،هﺬا ﻣﺜﺎل ﻳﻌﺮف ﺗﺮآﻴـﺐ ﻷﻳـﺎم
اﻻﺳﺒﻮع:
TuesDay
Wednessday
Thursday
Friday
End Enum
Dim X As enmDay
Dim Y As enmDay
X = Saturday
Y=X
ﺣﻘﻴﻘﺔ اﻟﻤﺘﻐﻴـﺮات ﻣـﻦ اﻟﻨـﻮع ﺗﺮآﻴﺒـﺎت Enumﻣـﺎهﻲ اﻻ ﻣﺘﻐﻴـﺮات ﻋﺪدﻳـﺔ ﻣـﻦ اﻟﻨـﻮع
Longﻓﺘﺴﺘﻄﻴﻊ اﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ آﻤﺎ ﻟﻮ آﺎﻧﺖ ﻣﺘﻐﻴﺮات ﻋﺪدﻳﺔ:
Dim X As enmDay
X = Saturday
Print X
X=X+1
Print X
آﻤﺎ ﺗﻼﺣﻆ ،ﻳﺒﺪأ ﺗﺮﻗﻴﻢ ﻋﻨﺎﺻﺮ اﻟﺘﺮآﻴﺐ ﻣﻦ اﻟﻌﺪد ،0وﻟﺘﺨﺼﻴﺺ ﻗﻴﻢ ﻣﻦ ﻋﻨﺪك ،ارﺟـﻊ
اﻟﻰ ﺗﻌﺮﻳﻒ اﻟﺘﺮآﻴﺐ وﺿﻊ اﻟﻘﻴﻢ ﻣﻦ ﻋﻨﺪك:
87
ﺑﻞ ﻳﻤﻜﻨﻚ ﻧﺴﺦ آﺂﻓﺔ ﻗﻴﻢ اﻟﺘﺮآﻴﺐ اﻟﻰ ﺗﺮآﻴﺐ ﺁﺧﺮ ﻣﻦ ﻧﻔﺲ اﻟﻨﻮع:
Ali = Turki
Print Ali.sName
اﻟﻮﺻﻮل اﻟﻰ ﻋﻨﺎﺻﺮ اﻟﺘﺮآﻴﺐ اﻟﻤﺤﻀﻦ ﻳﺘﻢ ﻣﻦ ﺧﻼل اﻟﺘﺮآﻴﺐ اﻟﺤﺎﺿﻦ ﻟﻬﺎ:
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻘﺎﺑﻠﻴﺔ اﻟﺮؤﻳﺔ ﻓﻠﻦ ﺗﺴﺘﻄﻴﻊ ﺗﻌﺮﻳﻒ اﻟﺘﺮآﻴﺒـﺎت ﺑﺎﺳـﺘﺨﺪام اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة
Publicاﻻ ﻓــﻲ اﻟﻔﺌــﺎت ،Classesواذا آﻨ ـﺖ ﻋﻨﻴــﺪا واﺻــﺮرت ﻋﻠــﻰ اﺳــﺘﺨﺪام اﻟﻜﻠﻤــﺔ
اﻟﻤﺤﺠﻮزة Publicﻓـﻲ ﻣﻠﻔـﺎت اﻟﺒﺮﻣﺠـﺔ ،BASﻓﺴﻴﺴـﻤﺢ ﻟـﻚ Visual Basicﺑﺘﺼـﺮﻳﺢ
89
ﻣﺘﻐﻴﺮات ﺟﺪﻳﺪة ﻣﻦ اﻟﺘﺮآﻴﺐ اﻟﻌﺎم ،وﻟﻜﻨﻚ ﺳﺘﺼـﺎب ﺑﺨﻴﺒـﺔ اﻣـﻞ آﺒﻴـﺮة ان ﻋﻠﻤـﺖ ان
اﻻﺟﺮاءت اﻟﻤﺼﺮﺣﺔ ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻮﺣﺪة Publicﻻ ﻳﻤﻜﻨﻚ اﺳﺘﺨﺪام هﺬﻩ اﻟﺘﺮآﻴﺒـﺎت
آﻘﻴﻢ ﻣﺴﺘﻘﺒﻠﺔ Parametersﻟﻬﺎ:
اﻟﻤﺼﻔﻮﻓﺎت
ﻳﻤﻜﻨﻚ Visual Basicﻣﻦ اﻧﺸﺎء واﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺼﻔﻮﻓﺎت Arraysﺳﻮاء آﺎﻧـﺖ اﺣﺎدﻳـﺔ
اﻟﺒﻌﺪ او ﻣﺘﻌﺪدة اﻻﺑﻌﺎد –ﻗﺪ ﺗﺼﻞ اﻟﻰ 60ﺑﻌﺪا:
ﺗﺴﺘﻄﻴﻊ اﻟﺒﺪء ﻓﻲ ﻋﻤﻠﻴﺔ اﺳﻨﺎد اﻟﻘﻴﻢ ﺑﻤﺠﺮد ﺗﺼﺮﻳﺢ اﻟﻤﺼﻔﻮﻓﺔ ﻣﻊ اﻟﻌﻠﻢ ان ﻓﻬـﺮس
اﻟﻤﺼﻔﻮﻓﺔ Array Indexﻳﺒـﺪأ ﻣـﻦ ﺻـﻔﺮ ﻣـﺎﻟﻢ ﺗﺴـﺘﺨﺪم اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة Option
Base 1ﻓﻲ ﻣﻨﻄﻘﺔ اﻻﻋﻼﻧﺎت اﻟﻌﺎﻣﺔ ﻟﻠﻮﺣﺪة اﻟﺒﺮﻣﺠﻴﺔ ﻓﺎﻧﻪ ﺳﻴﺒﺪأ ﺑﻮاﺣﺪ:
رﻏﻢ ان ﺑﺪء ﺗﺮﻗﻴﻢ ﻓﻬﺮس اﻟﻤﺼﻔﻮﻓﺔ ﻳﻤﻜﻦ ان ﻳﺒﺪأ ﺑﻮاﺣﺪ ،اﻻ اﻧﻨـﻲ ﻻ ﻣﻼﺣﻈﺔ:
اﺣﺒــﺬ ﻟﻤﺒﺮﻣﺠــﻲ Visual Basicﻓﻌــﻞ ذﻟــﻚ ،ﻓﻌﻨــﺪ ﻧﻘــﻞ اﻻآــﻮاد ﺑــﻴﻦ
اﻟﻤﺸﺎرﻳﻊ اﻟﻤﺨﺘﻠﻔﺔ او اﻟﻮﺣﺪات اﻟﺒﺮﻣﺠﻴﺔ اﻟﻤﺨﺘﻠﻔﺔ ﻗﺪ ﻻ ﻳـﺘﻢ ﺗﻔﻌﻴـﻞ
اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠـﻮزة Option Base 1ﻣﻤـﺎ ﻳﺘﺮﺗـﺐ ﻋﻨـﻪ ﻇﻬـﻮر ﻋﺸـﺮات
اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ.
وﻟﻤﻌﺮﻓﺔ رﻗﻢ اﻟﻌﻨﺼﺮ اﻻول اﺳﺘﺨﺪم اﻟﺪاﻟﺔ LBoundﺑﻴﻨﻤﺎ اﻟﺪاﻟﺔ UBoundﺗﻌـﻮد ﺑـﺮﻗﻢ
اﻟﻌﻨﺼﺮ اﻻﺧﻴﺮ:
اﻣﺎ ﻣﻊ اﻟﻤﺼﻔﻮﻓﺎت اﻟﻤﺘﻌﺪدة اﻻﺑﻌﺎد ،ﻋﻠﻴﻚ ارﺳﺎل رﻗﻢ اﻟﺒﻌﺪ ﻣـﻊ اﻟـﺪاﻟﺘﻴﻦ UBoundو
:LBound
ﻗﺒﻞ ان ﺗﺒﺪأ ﻓﻲ ﻋﻤﻠﻴﺔ اﺳﻨﺎد اﻟﻘﻴﻢ ،ﻋﻠﻴﻚ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠـﻮزة ReDimاوﻻ
ﻣﻊ ذآﺮ اﻟﺤﺠﻢ:
ﻟﻮ اردت زﻳﺎدة او ﺗﻘﻠﻴﺺ ﺣﺠﻢ اﻟﻤﺼﻔﻮﻓﺔ ،اﺳﺘﺨﺪم ReDimﻣﺮة اﺧﺮى وﻋﻠﻴﻚ ﻣﻌﺮﻓـﺔ
ان ﺟﻤﻴﻊ ﻣﺤﺘﻮﻳﺎت اﻟﻤﺼﻔﻮﻓﺔ ﺳﻮف ﺗﻠﻐﻰ:
واذا رﻏﺒــﺖ ﺑﺘﻐﻴﻴــﺮ ﺣﺠــﻢ اﻟﻤﺼــﻔﻮﻓﺔ دون اﻟﻤﺨــﺎﻃﺮة ﺑﻔﻘــﺪ اﻟﺒﻴﺎﻧــﺎت اﻟﻤﻮﺟــﻮدة ﻓﻴﻬــﺎ،
ﻓﺎﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Preserveﺟﺎهﺰة ﻟﻼﺳﺘﺨﺪام:
ﻣﺴﺘﺤﻴﻞ ‘
)ReDim Preserve OneDim (3, 3
)ReDim Preserve TwoDim (1
وﻟﻜﻦ هﺬا ﻣﻤﻜﻦ ‘
)ReDim OneDim (3, 3
)ReDim TwoDim (1
ﻣﻦ اﻟﻤﺰاﻳـﺎ اﻟﺘـﻲ اﺿـﻴﻔﺖ اﻟـﻰ اﻻﺻـﺪار VB6ﻟﻠﻤﺼـﻔﻮﻓﺎت اﻟﺪﻳﻨﺎﻣﻴﻜﻴـﺔ هـﻲ اﻣﻜﺎﻧﻴـﺔ
ﻧﺴﺦ ﻗﻴﻢ ﻣﺼﻔﻮﻓﺔ آﺎﻣﻠﺔ اﻟﻰ اﺧﺮى ﻓـﻲ ﺳـﻄﺮ واﺣـﺪ ﺷـﺮﻳﻄﺔ ان ﺗﻜﻮﻧـﺎ ﻣـﻦ ﻧﻔـﺲ
اﻟﻨﻮع ،ﻓﺒﺎﻣﻜﺎﻧﻚ آﺘﺎﺑﺔ ﺷﻴﺌﺎ ﻣﺜﻞ:
ﻧﻘﻄﺔ اﺧﻴﺮة ﺣﻮل اﻟﻤﺼﻔﻮﻓﺎت اﻟﺪﻳﻨﺎﻣﻴﻜﺔ وهـﻲ اﻣﻜﺎﻧﻴـﺔ ﺗـﺪﻣﻴﺮهﺎ ﺑﺎﺳـﺘﺨﺪام اﻟﻌﺒـﺎرة
:Erase
Erase OneDim
"اﻟﺮﻳﺎض" = )Cities(0
"ﺟﺪة" = )Cities(1
"اﺑﻬﺎ" = )Cities(2
vCities = Cities
)Print vCities(1 ﺟﺪة ‘
93
ﻣﻦ اﻻﺷﻴﺎء اﻟﺘﻲ ﺗﻌﺠﺒﻨﻲ ﻓـﻲ اﻟﻤﺘﻐﻴـﺮات ﻣـﻦ اﻟﻨـﻮع Variantهـﻮ اﻧﺸـﺎء ﻣﺼـﻔﻮﻓﺎت
ﻣﺨﺘﻠﻔﺔ اﻻﺑﻌﺎد ،Variable-Dimension Arraysوهﻲ ﻣﺼـﻔﻮﻓﺎت اﺑﻌﺎدهـﺎ ﺗﺨﺘﻠـﻒ ﻣـﻦ
ﻋﻨﺼﺮ ﻻﺧﺮ ،ﻓﻘﺪ ﻳﻜﻮن اﻟﻌﻨﺼﺮ اﻻول اﺣﺎدي اﻟﺒﻌﺪ واﻟﺜﺎﻧﻲ ﺛﻨﺎﺋﻲ اﻟﺒﻌﺪ واﻟﺜﺎﻟـﺚ ﺛﻼﺛـﻲ
اﻟﺒﻌﺪ وﺗﻄﺒﻴﻘﻬﺎ ﺳﻬﻞ ﺟﺪا ،اﻟﻄﺒﺨـﺔ آﻠﻬـﺎ اﺣﺘـﻮاء ﻣﺼـﻔﻮﻓﺔ ﻣـﻦ اﻟﻨـﻮع Variantﻋﻠـﻰ
ﻋﺪة ﻣﺼﻔﻮﻓﺎت:
)Print VarDim(0
)Print VarDim(1)(0), VarDim(1)(1
)Print VarDim(2)(0), VarDim(2)(1), VarDim(2)(2
اﻟﻤﺠﻤﻮﻋﺎت
ﺗﻠﻌﺐ اﻟﻤﺼﻔﻮﻓﺎت دورا ﺣﻴﻮﻳﺎ ﻓﻲ ﺑﺮاﻣﺠﻚ اﻟﺠﺪﻳﺔ ﺧﺎﺻﺔ ﺑﺎﻻﻣﻮر اﻟﺘﻲ ﺗﺘﻌﻠﻖ ﺑﺎﻟﺤﻠﻘﺎت
اﻟﺘﻜﺮارﻳﺔ وﻏﻴﺮهﺎ .اﻻ ان اﻟﻤﺠﻤﻮﻋﺎت Collectionsﺗﻌﺘﺒـﺮ اآﺜـﺮ ﻣﺮوﻧـﺔ ﻣـﻦ اﻟﻤﺼـﻔﻮﻓﺎت
ﻣﻦ ﺣﻴﺚ اﺿﺎﻓﺔ وازاﻟﺔ اﻟﻌﻨﺎﺻﺮ ﻣﻨﻬﺎ .اﻟﻬﺪف ﻣﻦ هﺬﻩ اﻟﻔﻘﺮة هﻮ ﺗﻌﺮﻳﻔﻚ ﺑﺎﻟﻤﺠﻤﻮﻋﺎت
وﻃﺮق اﺳﺘﺨﺪاﻣﺎﺗﻬﺎ.
ﻣﺰاﻳﺎ اﻟﻤﺠﻤﻮﻋﺎت:
اﻟﻤﺠﻤﻮﻋــﺎت Collectionsﻋﺒــﺎرة ﻋــﻦ آﺎﺋﻨــﺎت ﻣﺸــﺘﻘﺔ ﻣــﻦ ﻣﻜﺘﺒــﺔ ،VBAوﻇﻴﻔﺘﻬــﺎ
اﻟﺮﺋﻴﺴﻴﺔ ﻣﺜﻞ وﻇﻴﻔﺔ اﻟﻤﺼﻔﻮﻓﺎت ﺗﻤﺎﻣﺎ اﻟﻰ اﻧﻬﺎ ﺗﺨﺘﻠﻒ ﻋﻨﻬﺎ ﻓﻲ اﻟﻨﻘﺎط اﻟﺘﺎﻟﻴﺔ:
94
-اﻟﻤﺠﻤﻮﻋـﺎت ﻻ ﺗﺤﺘـﺎج اﻟـﻰ ﺗﺤﺪﻳـﺪ ﺣﺠﻤﻬــﺎ ﻋﻨـﺪ ﻋﻤﻠﻴـﺔ ﺗﺼـﺮﻳﺤﻬﺎ .ﻓﻌﻨـﺪ ﺗﺼــﺮﻳﺤﻚ
ﻟﻤﺠﻤﻮﻋﺔ ﺟﺪﻳﺪةـ ﺗﺴﺘﻄﻴﻊ اﺿﺎﻓﺔ اﻟﻌﻨﺎﺻﺮ ﻟﻬﺎ وﻗﺖ اﻟﺘﻨﻔﻴﺬ دﻳﻨﺎﻣﻴﻜﻴﺎ أي ﺑﺪون ﺗﺤﺪﻳـﺪ
أي ﺣﺠﻢ ﻟﻬﺎ ﺳﺘﺎﺗﻴﻜﻴﺎ.
-ﺗﺴﺘﻄﻴﻊ اﺿﺎﻓﺔ اﻟﻌﻨﺎﺻﺮ اﻟﻰ اﻟﻤﺠﻤﻮﻋﺎت ﻓﻲ أي ﻣﻜﺎن ﺗﺮﻳـﺪﻩ ﻓـﻲ اﻟﻤﺠﻤﻮﻋـﺔ .أي
ﻟﺴﺖ ﻣﻀﻄﺮا ﻟﻮﺿﻌﻬﺎ ﻓﻲ ﻧﻬﺎﻳﺔ اﻟﻘﺎﺋﻤﺔ ﻣﺜﻞ اﻟﻤﺼﻔﻮﻓﺎت ،ﻓﺎﻟﻤﺠﻤﻮﻋﺎت ﺗﻌﻄﻴﻚ ﺣﺮﻳﺔ
آﺒﻴﺮة ﻓﻲ اﺿﺎﻓﺔ وﺣﺬف اﻟﻌﻨﺎﺻﺮ ﺳﻮاء آﺎﻧﺖ ﻓﻲ ﺑﺪاﻳﺔ اﻟﻤﺠﻤﻮﻋﺔ او ﻧﻬﺎﻳﺘﻬـﺎ او ﺣﺘـﻰ
ﻓﻲ وﺳﻄﻬﺎ.
-اﻟﻤﺠﻤﻮﻋﺔ اﻟﻮاﺣﺪة ﻳﻤﻜﻦ ان ﺗﺤﺘﻮي ﻋﻨﺎﺻﺮهﺎ ﻋﻠـﻰ اﻧـﻮاع ﺑﻴﺎﻧـﺎت ﻣﺨﺘﻠﻔـﺔ ،أي ﻗـﺪ
ﻳﻜﻮن اﻟﻌﻨﺼﺮ اﻻول ﻓﻴﻬﺎ Stringواﻟﺜﺎﻧﻲ Integerﺑﻌﻜـﺲ اﻟﻤﺼـﻔﻮﻓﺎت اﻟﺘـﻲ ﻻﺑـﺪ ﻣـﻦ
ﺗﻮﺣﻴﺪ ﻧﻮع ﻋﻨﺎﺻﺮهﺎ.
-ﺗــﻮﻓﺮ اﻟﻤﺠﻤﻮﻋــﺎت ﻃــﺮق اﺧــﺮى ﻟﺘﺤﺪﻳــﺪ ﻋﻨﺎﺻــﺮهﺎ ﻋــﻦ ﻃﺮﻳــﻖ ﻣﻔــﺎﺗﻴﺢ Keyﺑــﺪون
اﺳﺘﺨﺪام اﺳﻠﻮب اﻟﺘﺮﻗﻴﻢ اﻟﺬي ﺗﺘﺒﻌﻪ اﻟﻤﺼﻔﻮﻓﺎت.
ﺑﻌﺪ هﺬﻩ اﻟﻤﺰاﻳﺎ ﻗﺪ ﺗﺤﺮم اﺳﺘﺨﺪام اﻟﻤﺼﻔﻮﻓﺎت وﺗﻨﺘﻘﻞ اﻟـﻰ اﻟﻤﺠﻤﻮﻋـﺎت اﻟـﻰ اﻻﺑـﺪ!
ﻟﻜﻦ ﻣﻦ اﻟﻤﻬﻢ ﺟﺪا ان ﺗﻀﻊ ﻓﻲ ذهﻨﻚ ان اﻟﻤﺠﻤﻮﻋﺎت اﺑﻄﺄ ﻣﻦ اﻟﻤﺼﻔﻮﻓﺎت ﺑﺎآﺜﺮ ﻣﻦ
100ﻣﺮة! ﻟﺬﻟﻚ ،ﻻ ﺗﺴﺘﺨﺪﻣﻬﺎ ان آﺎﻧـﺖ اﻟﺴـﺮﻋﺔ ﺗﻌﻨـﻲ ﻟـﻚ اﻟﺸـﺊ اﻟﻜﺜﻴـﺮ .اﻟﻤﺰﻳـﺪ
اﻳﻀﺎ ،اﻟﻤﺠﻤﻮﻋﺎت ﺗﺴﺘﻬﻠﻚ ﻣﺴﺎﺣﺔ اآﺒﺮ ﺑﻜﺜﻴﺮ ﻣﻦ اﻟﻤﺴﺎﺣﺔ اﻟﻤﻄﻠﻮﺑﺔ ﻓـﻲ اﻟـﺬاآﺮة،
وﻳﻌﻴﺐ اﻟﻤﺠﻤﻮﻋﺎت ان ﻋﻨﺎﺻﺮهﺎ اﻟﻤﻀﺎﻓﺔ ﻗﺎﺑﻠﺔ ﻟﻠﻘـﺮاءة ﻟﻜـﻦ ﻟﻴﺴـﺖ ﻗﺎﺑﻠـﺔ ﻟﻠﺘﻌـﺪﻳﻞ!
ﻓﻠﺘﻌﺪﻳﻞ ﻗﻴﻤﺔ ﻋﻨﺼﺮ ﻣﻦ ﻋﻨﺎﺻﺮ اﻟﻤﺠﻤﻮﻋﺔ ،ﻋﻠﻴﻚ اﻟﻘﻴﺎم ﺑﺎﺳﻠﻮب ﻏﻴﺮ ﻣﺒﺎﺷﺮ آﺤـﺬف
اﻟﻌﻨﺼﺮ اﻟﻤﺮاد ﺗﻌﺪﻳﻠﻪ واﺿﺎﻓﺘﻪ ﻣﻦ ﺟﺪﻳﺪ ﺑﻌﺪ اﻟﺘﻌﺪﻳﻞ.
ﺑﺮﻣﺠﺔ اﻟﻤﺠﻤﻮﻋﺎت:
اﻟﺨﻄﻮة اﻻوﻟﻰ اﻟﺘﻲ ﺗﺤﺘﺎﺟﻬﺎ هﻲ اﻧﺸﺎء آﺎﺋﻦ اﻟﻤﺠﻤﻮﻋـﺔ واﻟـﺬي ﺗﺤﺼـﻞ ﻋﻠﻴـﻪ ﻣـﻦ
اﻟﻨﻮع -اﻟﻔﺌﺔ:Collection -
وﻻﺿﺎﻓﺔ ﻋﻨﺎﺻﺮ اﻟﻰ اﻟﻤﺠﻤﻮﻋﺔ ،اﺳﺘﺨﺪم اﻟﻄﺮﻳﻘﺔ Addﻣﻊ ارﺳﺎل ﻗﻴﻤﺔ اﻟﻌﻨﺼـﺮ ﻟﻬـﺎ.
آﺬﻟﻚ ،ﺗﺴﺘﻄﻴﻊ ارﺳﺎل ﻣﻔﺘﺎح Keyاذا اردت ﺣﺘﻰ ﺗﺴﺘﺨﺪم آﻄﺮﻳﻘـﺔ اﺧـﺮى ﻟﻠﻮﺻـﻮل
اﻟﻰ اﻟﻌﻨﺼﺮ ﺑﺪون اﻻﻋﺘﻤﺎد ﻋﻠﻰ رﻗﻤﻪ:
95
-او ﺣﺘـﻰ ﺗﺠـﺎهﻼ- Item ﺗﺴﺘﻄﻴﻊ اﻟﻮﺻﻮل اﻟﻰ ﻋﻨﺎﺻﺮ اﻟﻤﺠﻤﻮﻋﺔ ﻋﻦ ﻃﺮﻳﻖ اﻟﻄﺮﻳﻘـﺔ
:وارﺳﺎل رﻗﻢ اﻟﻌﻨﺼﺮ او ﻣﻔﺘﺎﺣﻪ
MyCol.Remove 1
MyCol.Remove "mail"
:ﻟﻜﻦ ﺗﺬآﺮ! ﻋﻠﻴﻚ ﺑﺎﻋﺎدة اﻧﺸﺎء اﻟﻜﺎﺋﻦ ﺣﺘﻰ ﺗﺘﻤﻜﻦ ﻣﻦ اﺿﺎﻓﺔ ﻋﻨﺎﺻﺮ ﺟﺪﻳﺪة
Print MyCol.Count
96
اﻻﺟﺮاءات واﻟﺪوال
ﻳﻤﻜﻨــﻚ ﺣﺒﻴــﺐ اﻟﻘﻠــﺐ Visual Basicﻣــﻦ ﺗﻌﺮﻳــﻒ اﺟــﺮاءات Sub’sودوال ،Functions
ﺣﻴﺚ ﻳﻤﻜﻦ ﻟﻠﺪوال ﻣﻦ اﻟﻌﻮدة ﺑﻘﻴﻤﺔ ﺑﻌﺪ ﻧﻬﺎﻳﺔ ﺗﻨﻔﻴﺬ اﻟﺪاﻟﺔ ،ﻧـﻮع اﻟﻘﻴﻤـﺔ اﻟﺘـﻲ ﺗﻌـﻮد
ﺑﻬﺎ اﻟﺪاﻟﺔ هﻮ اﻟﻨﻮع اﻟﺬي ﺗﻜﺘﺒﺘﻪ ﻓﻲ ﻧﻬﺎﻳﺔ ﺗﻌﺮﻳﻒ اﻟﺪاﻟﺔ:
اﻟﻜﻮد اﻟﻤﻮﺟﻮد داﺧﻞ اﻟﺪاﻟﺔ ،ﻳﺘﻌﺎﻣﻞ ﻣﻊ اﺳﻢ اﻟﺪاﻟﺔ آﻤﺘﻐﻴﺮ ﻣﻦ ﻧﻔﺲ ﻧﻮع اﻟﺪاﻟﺔ:
”“ = OddNumbers
For iCounter = 0 To 9
If iCounter Mod 2 <> 0 Then
OddNumbers = OddNumbers & iCounter
End If
Next
End Function
ﺗﻨﺘﻬﻲ ﻋﻤﻠﻴـﺔ ﺗﻨﻔﻴـﺬ اﻻﺟـﺮاء او اﻟﺪاﻟـﺔ ﺑﻤﺠـﺮد اﻟﻮﺻـﻮل اﻟـﻰ ﻧﻬﺎﻳﺘـﻪ ،ﺗﺴـﺘﻄﻴﻊ اﻧﻬـﺎء
ﺗﻨﻔﻴﺬهﻤﺎ ﻗﺒﻞ ذﻟـﻚ ﺑﺎﺳـﺘﺨﺪام اﻟﻌﺒـﺎرة Exit Subﻟﻼﺟـﺮاءات واﻟﻌﺒـﺎرة Exit Function
ﻟﻠﺪوال ،هﺬا ﻣﺜﺎل ﻟﻠﺨﻮارزﻣﻴﺎت اﻟﺘﺮاﺟﻌﻴﺔ Recursionﻳﺴﺘﺨﺪم Exit Functionﻻﻧﻬـﺎء
ﻋﻤﻠﻴﺔ ﺗﻨﻔﻴﺬ اﻟﺪاﻟﺔ:
97
اﻣﺎ اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Privateاﻟﺴﺎﺑﻘﺔ ﻻﺳﻢ اﻻﺟﺮاء او اﻟﺪاﻟـﺔ ،ﻓﻬـﻲ ﺗﻤﻨـﻊ اﻟﻤﺒـﺮﻣﺞ
ﻣﻦ اﺳﺘﺪﻋﺎء اﻻﺟﺮاء ﻣﻦ ﺧﺎرج اﻟﻮﺣﺪة اﻟﺒﺮﻣﺠﻴﺔ:
اﻣﺎ ﺗـﺄﺛﻴﺮ اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة Friendﻓﻬـﻮ ﻧﻔـﺲ ﺗـﺄﺛﻴﺮ اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة Publicﻓـﻲ
اﻟﻤﺸﺎرﻳﻊ اﻟﻘﻴﺎﺳﻴﺔ ،Standard EXEوﻳﻜﻤﻦ اﻟﻔﺮق ﺑﻴﻨﻬﻤﺎ ﻓـﻲ ﺣـﺎﻻت ﺑﻨـﺎء ﻣﺸـﺎرﻳﻊ
ﻣﻦ اﻟﻨﻮع ActiveXﺣﻴﺚ ان اﻻﺟﺮاءات ﻣﻦ اﻟﻨﻮع Publicﻳﻤﻜﻦ ان ﻳﺴﺘﺪﻋﻴﻬﺎ اﻟﻤﺒـﺮﻣﺞ
ﻣﻦ ﺧﺎرج اﻟﻤﺸﺮوع ﻋﻦ ﻃﺮﻳﻖ اﻻﺗﺼﺎل ،COMاﻣـﺎ اﻻﺟـﺮاءات ﻣـﻦ اﻟﻨـﻮع Friendﻓﻠـﻦ
ﻳﺘﻤﻜﻦ أي ﺷﺨﺺ ﻣﻦ اﺳﺘﺪﻋﺎﺋﻬﺎ ﻣﺎ داﻣﺖ اآﻮادﻩ ﺧﺎرج اآﻮاد ﻣﺸﺮوﻋﻚ.
)(Sub Start
هﻨﺎ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ ‘
Dim X As Integer
' X=0
Print X
MySub X
' X=5
99
Print X
End Sub
ﻓﻜﻤﺎ ﺗﻼﺣﻆ ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ ،اﻻﺟﺮاء MySubﺗﻮﻗﻊ اﺳﺘﻘﺒﺎل ﻣﺮﺟﻊ ﻟﻤﺘﻐﻴﺮ ﻣﻦ ﻧـﻮع
Integerﻣﻤﺎ ﻳﻌﻄﻴﻪ اﻟﻘﺪرة ﻋﻠﻰ ﺗﻐﻴﻴﺮ اﻟﻘﻴﻤﺔ اﻟﻤﺮﺳﻠﺔ ﻟﻪ .اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺤﻠﻮل ﻳﻮﻓﺮهـﺎ
ﻟﻚ اﺳﻠﻮب اﻻﺳﺘﺪﻋﺎء ﺑﺎﻟﻤﺮﺟﻊ ﻟﻌﻞ اﺳﻬﻠﻬﺎ اﺟﺮاء ﻳﻘﻮم ﺑﺘﺒﺪﻳﻞ ﻗﻴﻤﺘﻴﻦ ﻣﺮﺳﻠﺘﻴﻦ ﻟﻪ:
اﻣﺎ اﻻرﺳـﺎل ﺑﺎﻟﻘﻴﻤـﺔ ﻓﻬـﻮ اﺑﻄـﺄ ﻣـﻦ اﻻرﺳـﺎل ﺑـﺎﻟﻤﺮﺟﻊ ﺧﺎﺻـﺔ ﻣـﻊ اﻟﺤـﺮوف Strings
واﻟﺴﺒﺐ ﻓﻲ ذﻟﻚ ان Visual Basicﺳﻴﻀﻄﺮ ﻟﻨﺴﺦ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴـﺮ اﻟـﻰ ﻣﻜـﺎن ﻣﺆﻗـﺖ
ﻓﻲ اﻟﺬاآﺮة ،آﺬﻟﻚ ﻟـﻦ ﺗﺴـﺘﻄﻴﻊ ﺗﻌـﺪﻳﻞ ﻗﻴﻤـﺔ اﻟﻤﺘﻐﻴـﺮ اﻟﻤﺮﺳـﻞ ﻟـﻚ .ﻟﺠﻌـﻞ اﻻﺟـﺮاء
ﻳﺴﺘﻘﺒﻞ ﻣﺘﻐﻴﺮات ﺑﺎﻟﻘﻴﻤﺔ اﺳﺘﺨﺪم اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة :ByVal
)(Sub Start
هﻨﺎ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ ‘
Dim X As Integer, Y As Integer
' X = 0, Y = 0
Print X, Y
MySub X, Y
' X = 3, Y = 0
Print X, Y
End Sub
Y = 10
End Sub
-اذا آﺎن ﻣﺠﺎل اﻟﺘﺮآﻴﺐ ﻣﻦ ﻧﻮع Privateوﻣﻌـﺮف ﻓـﻲ داﺧـﻞ وﺣـﺪة ﺑﺮﻣﺠﻴـﺔ آﻨﺎﻓـﺬة
ﻧﻤﻮذج ،ﻓﺌﺔ ،ﻣﻠﻒ ﺑﺮﻣﺠﺔ اﻟﺦ ..ﻓﺎن اﻻﺟﺮاءت اﻟﺘﻲ داﺧﻞ ﺗﻠﻚ اﻟﻮﺣﺪة اﻟﺒﺮﻣﺠﻴﺔ ﻳﻤﻜـﻦ
ﻟﻬﺎ ان ﺗﺴﺘﻘﺒﻞ اﻟﻤﺘﻐﻴﺮات ﻣﻦ ﻧﻮع ذﻟﻚ اﻟﺘﺮآﻴﺐ.
-اذا آــﺎن اﻟﺘﺮآﻴــﺐ ﻣﺠﺎﻟــﻪ ﻋــﺎم Publicﻣﻌــﺮف ﻓــﻲ ﻣﻠــﻒ ﺑﺮﻣﺠــﺔ BASﻓــﺎن ﺟﻤﻴــﻊ
اﻻﺟﺮاءات اﻟﺘﻲ ﻓﻲ ﻧﻔﺲ اﻟﻤﺸﺮوع ﻗﺎﺑﻠﺔ ﻻﺳﺘﻘﺒﺎل ذﻟﻚ اﻟﺘﺮآﻴﺐ ﺷﺮﻳﻄﺔ ان ﻻ ﺗﻜﻮن
هﺬﻩ اﻻﺟﺮاءات ﻣﻦ اﻟﻨﻮع .Public
-ﻓﻲ ﺣﺎﻟﺔ آﻮن اﻟﺘﺮآﻴﺐ ﻣﻌﺮف ﻓﻲ ﻓﺌﺔ Classﻓﻲ ﻣﺸﺮوع ﻣﻦ اﻟﻨـﻮع ،ActiveXﻓـﺎن
اﻻﺟﺮاءات اﻟﻤﻮﺟﻮدة ﻓﻲ ﺑﺮﻧﺎﻣﺠﻚ ﺗﺴـﺘﻄﻴﻊ ان ﺗﺴـﺘﻘﺒﻞ ذﻟـﻚ اﻟﺘﺮآﻴـﺐ اﻟﻤﻌـﺮف ﻓـﻲ
داﺧﻞ ﻣﻜﻮن COMاذا آﺎﻧﺖ اﻟﺨﺎﺻﻴﺔ Instancingﻻ ﺗﺴﺎوي .1-Private
101
اﻟﻤﺘﻐﻴﺮات اﻻﺧﺘﻴﺎرﻳﺔ:
اذا آﺎن ﻋﺪد اﻟﻤﺘﻐﻴﺮات اﻟﻤﺮﺳﻠﺔ ﻟﻼﺟﺮاء ﻏﻴـﺮ ﻋـﺪد اﻟﻤﺘﻐﻴـﺮات اﻟﻤﺼـﺮﺣﺔ ﻓﻴـﻪ واﻟﺘـﻲ
ﻳﺘﻮﻗﻌﻬﺎ ،ﻓﺎن رﺳﺎﻟﺔ اﻟﺨﻄﺄ ﻟﻬﺎ ﻧﺼﻴﺐ .ﻟﺬﻟﻚ ،ﻓـﻲ ﺣـﺎﻻت آﺜﻴـﺮة ﺟـﺪا ﺗﺮﻳـﺪ ان ﺗﺠﻌـﻞ
اﺟــﺮاءك ﻣــﺮن ﺑﻤــﺎ ﻓﻴــﻪ اﻟﻜﻔﺎﻳــﺔ وذﻟــﻚ ﻋــﻦ ﻃﺮﻳــﻖ ﺗﻌﺮﻳــﻒ ﻣﺘﻐﻴــﺮات اﺧﺘﻴﺎرﻳــﺔ ﺗﻌﻄــﻲ
اﻟﻤﺴﺘﺨﺪم ﺣﺮﻳـﺔ ﻣـﺎ اذا آـﺎن ﻳﺮﻳـﺪ ان ﻳﺮﺳـﻠﻬﺎ او ﻻ .ﺗـﺘﻢ هـﺬﻩ اﻟﻌﻤﻠﻴـﺔ ﻋـﻦ ﻃﺮﻳـﻖ
اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة .Optionalواذا اردت ﻣﻌﺮﻓﺔ ﻣﺎ اذا آﺎن اﻟﻤﺴﺘﺨﺪم ﻗﺪ ارﺳـﻞ ﻗﻴﻤـﺔ
اﻟﻰ اﻻﺟﺮاء ﺗﺤﻘﻖ ﻋـﻦ ﻃﺮﻳـﻖ اﻟﺪاﻟـﺔ ،IsMissingﻟﻜـﻦ اﺣـﺬر! داﻟـﺔ IsMissingﺗﻌـﻮد
ﺑﻘﻴﻢ ﺻﺤﻴﺤﺔ ﻓﻲ ﺣﺎﻟﺔ آﻮن اﻟﻤﺘﻐﻴﺮ اﻟﻤﺮﺳﻞ ﻟﻬﺎ ﻣﻦ ﻧﻮع Variantﻓﻘﻂ:
)(Sub Start
هﻨﺎ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ ‘
اﻟﻤﺸﻜﻠﺔ هﻨﺎ ان اﻟﻤﺘﻐﻴﺮات ﻻﺑﺪ ان ﺗﻜﻮن ﻣﻦ ﻧﻮع Variantﺣﺘﻰ ﻧﺘﻤﻜﻦ اﻟﺘﺤﻘـﻖ ﻣـﻦ
ارﺳﺎﻟﻬﺎ ﻋﻦ ﻃﺮﻳﻖ اﻟﺪاﻟﺔ IsMissingوهﻮ اﺑﻄﺄ اﻻﻧﻮاع اﺳﺘﺨﺪام .ﻟﺬﻟﻚ ،ﻳﺒﺪو ان اﻟﺤـﻞ
اﻻﻓﻀﻞ هﻮ ﻋﻦ ﻃﺮﻳﻖ وﺿﻊ ﻗﻴﻤﺔ اﻓﺘﺮاﺿﻴﺔ ﺗﺴﺘﺨﺪم ﻓﻲ ﺣﺎﻟـﺔ ﻟـﻢ ﻳـﺘﻢ ارﺳـﺎل ﻗـﻴﻢ
ﻟﻠﻤﺘﻐﻴﺮات:
102
)(Sub Start
هﻨﺎ ﻧﻘﻄﺔ اﻟﺒﺪاﻳﺔ ‘
'Sum = 10
)Print Sum (5, 5
'Sum = 100
)Print Sum (20, 20, 20, 20, 20
'Sum = 1000
)Print Sum (250, 250, 250, 250
T=1
ElseIf M < 0 Then
T = -1
Else
T=0
End If
End If
End If
ﺗﺴﺘﻄﻴﻊ اﺧﺘﺼﺎر اﻟﺠﻤـﻞ اﻟﺸـﺮﻃﻴﺔ ،ﻓﻠـﻮ ﻻﺣﻈـﺖ ﻓـﻲ ﺟﻤﻠـﺔ Ifاﻻوﻟـﻰ اﻧﻨـﺎ اﺧﺘﺒﺮﻧـﺎ
اﻟﻘﻴﻤﺔ اﻟﻤﻨﻄﻘﻴﺔ Valueاذا ﻣﺎ آﺎﻧﺖ ﺻـﺢ او ﺧﻄـﺄ .اﻟﻤﺒﺮﻣﺠـﻮن اﻟﻤﺘﻤﺮﺳـﻮن ﻳﻔﻀـﻠﻮن
آﺘﺎﺑﺘﻬﺎ ﺑﻬﺬا اﻟﺸﻜﻞ:
End If
اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﺻﺤﻴﺢ واﻟﺴﺒﺐ ﻓﻲ ذﻟﻚ ،ان Visual Basicﻳﻌﺘﺒﺮ اي ﻗﻴﻤﺔ ﻏﻴـﺮ اﻟﺼـﻔﺮ
هﻲ Trueاﻣﺎ اﻟﺼﻔﺮ ﻓﻬﻲ Falseﻓﻲ ﺣﺎﻟﺔ اﺧﺘﺒﺎر اﻟﺸﺮوط ﻣـﻊ ﺟﻤﻠـﺔ .Ifﻗـﺪ ﺗﺨﺘﺼـﺮ
ﺟﻤﻠﺔ اﻟﺸﺮط اﻟﺜﺎﻧﻴﺔ اﻳﻀﺎ آﻤﺎ ﻓﻲ هﺬا اﻟﻜﻮد:
If x Then
End If
105
ﺻﺤﻴﺢ ان اﻟﻨﺘﻴﺠﺔ ﻣﻤﺎﺛﻠﺔ ،ﻟﻜﻦ ﺣﺎول ﺗﺠﻨﺐ اﻻﺧﺘﺼﺎر ﻓـﻲ ﺣﺎﻟـﺔ اﺳـﺘﺨﺪام ﻗـﻴﻢ ﻏﻴـﺮ
ﻣﻨﻄﻘﻴﺔ ﺣﺘﻰ ﻻ ﺗﻈﻬﺮ ﻟﻚ ﻧﺘﺎﺋﺞ ﻏﻴﺮ ﻣﺘﻮﻗﻌﺔ .ﻻن اﻟﻘـﻴﻢ اﻟﻤﻨﺎﺳـﺒﺔ ﻟﻼﺧﺘﺼـﺎرات هـﻲ
اﻟﻘﻴﻢ اﻟﻤﻨﻄﻘﻴﺔ ﻓﻘﻂ وﻓﻴﻤﺎ ﻋﺪى ذﻟﻚ ﻗﺪ ﻳﺴﺒﺐ ﻟﻚ اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺸﻮاﺋﺐ .راﻗﺐ اﻟﻜﻮد
اﻟﺘﺎﻟﻲ:
x=3
y=4
اﻟﻄﺮﻳﻘﺔ اﻟﺼﺤﻴﺤﺔ ‘ If x <> 0 And y <> 0 Then
If x And y Then ﻣﺸﻜﻠﺔ ﻓﻲ هﺬا اﻻﺧﺘﺼﺎر ‘
ﻟﻘﺪ اﺳـﺘﺨﺪﻣﺖ اﺳـﻠﻮب اﻻﺧﺘﺼـﺎر وﻳﺒـﺪو ان ﺟﻤﻠﺘـﻰ اﻟﺸـﺮط ﻣﺘﻤـﺎﺛﻠﺘﻴﻦ ،ﻟﻜـﻦ هـﻞ
ﺗﺼﺪق ان اﻟﺸﺮﻃﻴﻦ اﻟﺴﺎﺑﻘﻴﻦ ﻣﺨﺘﻠﻔﺎن ﺗﻤﺎﻣﺎ! اذا اردت ﻣﻌﺮﻓﺔ اﻟﺴـﺒﺐ ﻗـﻢ ﺑـﺎﻟﺮﺟﻮع
اﻟﻰ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮﻳﻦ xو yﺑﻨﻈﺎم اﻻﻋـﺪاد اﻟﺜﻨـﺎﺋﻲ 0011و 0100وﺳـﺘﻌﺮف اﻟﺴـﺒﺐ،
واﻟﺬي ﻧﺴﺘﻨﺘﺞ ﻣﻨـﻪ ﺑﺎﺧﺘﺼـﺎر ﻋﻠـﻰ ان ﻣﻌـﺎﻣﻼت اﻟـﺮﺑﻂ آــ Andو Orﺗﻘـﻮم ﺑﻤﻘﺎرﻧـﺔ
اﻟﻘﻴﻢ اﻟﺜﻨﺎﺋﻴﺔ ﻟﻠﻌﺪد ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ ﻧﻮﻋﻪ.
ﺗﻜﻤﻦ ﻗـﻮة ﻋﺒـﺎرة Caseﻓـﻲ اﻣﻜﺎﻧﻴـﺔ ﺗﻄﺒﻴـﻖ اﻟﻤﻌـﺎﻣﻼت اﻟﻤﻨﻄﻘﻴـﺔ او ﺗﺤﺪﻳـﺪ ﻣﺠـﺎل
ﻟﻠﻘﻴﻢ:
106
اﻟﺤﻠﻘﺎت اﻟﺘﻜﺮارﻳﺔ
ﺣﺪد اﻟﻘﻴﻤﺔ اﻻﺑﺘﺪاﺋﻴﺔ واﻟﻘﻴﻤﺔ اﻟﻨﻬﺎﺋﻴﺔ ﻟﻠﺤﻠﻘﺔ :For … Next
وﻋﻠﻴﻚ ﻣﻌﺮﻓﺔ ان ﻣﻘﺪار اﻟﺰﻳﺎدة ﺳﻴﻀﺎف اﻟﻰ ﻣﺘﻐﻴﺮ اﻟﺤﻠﻘﺔ ﺣﺘﻰ ﺑﻌﺪ ﻧﻬﺎﻳﺘﻬﺎ:
ﻳﻤﻜﻨﻚ ﺗﻄﺒﻴﻖ ﻓﻜﺮة اﻟﺤﻠﻘﺎت اﻟﻤﺘﺪاﺧﻠﺔ Nested Loopsآﻬﺬا اﻟﻜﻮد اﻟﺬي ﻳﻄﺒﻊ ﺟﺪول
اﻟﻀﺮب:
Dim A As Integer
Dim b As Integer
108
For A = 1 To 5
For b = A To 5
Print A, "x", b, "=", A * b
Next
Next
‘ ﻃﺒﺎﻋﺔ ﻣﺤﺘﻮﻳﺎﺗﻬﺎ
For Each Y In X
Print Y
Next
109
ﺳــﺘﺘﻢ ﻋﻤﻠﻴــﺔ ﺗﻨﻔﻴــﺬ اﻟﺤﻠﻘــﺔ ﻣﺎداﻣــﺖ اﻟﺠﻤﻠــﺔ اﻟﺸــﺮﻳﻂ ﺻــﺤﻴﺤﺔ Trueﻓــﻲ ﺣــﺎل
اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠـﻮزة Whileاو Falseﻓـﻲ ﺣـﺎل اﺳـﺘﺨﺪام اﻟﻜﻠﻤـﺔ اﻟﻤﺤﺠـﻮزة
.Untilواذا اردت ﺗﻨﻔﻴﺬ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﻳﺔ ﻣﺮة واﺣﺪ ﻋﻠﻰ اﻻﻗﻞ ،ﺿﻊ ﺣﻤﻞ اﻟﺸـﺮط ﻓـﻲ
اﺳﻔﻞ اﻟﺤﻠﻘﺔ:
Do
…
", vbYesNo ) = vbNoهﻞ ﺗﺮﻳﺪ اﻧﻬﺎء اﻟﺤﻠﻘﺔ؟"(Loop While MsgBox
Do
…
", vbYesNo ) = vbYesهﻞ ﺗﺮﻳﺪ اﻧﻬﺎء اﻟﺤﻠﻘﺔ؟"(Loop Until MsgBox
ﺑﺎﻣﻜﺎﻧﻚ وﺿﻊ ﺟﻤﻠﺔ اﻟﺸﺮط ﻓﻲ داﺧـﻞ اﻟﺤﻠﻘـﺔ اﻳﻀـﺎ ﺑﺎﺳـﺘﺨﺪام ﻋﺒـﺎرة Ifاو ،Select
ﻟﻜﻦ ﻻ ﺗﻨﺴﻰ اﻧﻬﺎء اﻟﺤﻠﻘﺔ ﺑﺎﻟﻌﺒﺎرة :Exit Do
Do
", vbYesNo ) = vbYes Thenهﻞ ﺗﺮﻳﺪ اﻧﻬﺎء اﻟﺤﻠﻘﺔ؟"(If MsgBox
Exit Do
End If
…
Loop
110
A=5
For iCounter = 1 To A
…
Next
iCounter = 1
Do
…
iCounter = iCounter + 1
Loop Until iCounter > A
اﻻ ان اﻻﺧﺘﻼف ﺳﻴﻈﻬﺮ ﻓﻲ ﺣﺎل ﻣﺎ اذا ﺗﻢ ﺗﻐﻴﻴـﺮ ﻗﻴﻤـﺔ اﻟﻤﺘﻐﻴـﺮ ،Aﻓﺎﻟﺤﻠﻘـﺔ … For
Nextﺳــﻴﺘﻢ ﺗﻨﻔﻴــﺬﻩ داﺋﻤــﺎ 5ﻣــﺮات ﺣﺘــﻰ وان ﺗﻐﻴــﺮت ﻓﻴﻤــﺔ اﻟﻤﺘﻐﻴــﺮ Aﻓــﻲ داﺧــﻞ
اﻟﺤﻠﻘﺔ ،ﺑﻴﻨﻤﺎ ﺗﻐﻴﻴﺮ اﻟﻘﻴﻤﺔ ﻳﺆﺛﺮ ﺑﺸﻜﻞ آﺒﻴـﺮ ﻋﻠـﻰ ﻋـﺪد ﻣـﺮات ﺗﻜـﺮار اﻟﺤﻠﻘـﺔ … Do
.Loop
ﺗﺤﺴﻴﻦ اﻟﻜﻔﺎءة
ﺑﺼﻔﺔ ﻋﺎﻣـﺔ ،ﻓـﺎن اﻟﻤﺼـﻄﻠﺢ ﺗﺤﺴـﻴﻦ اﻟﻜﻔـﺎءة Optimizationﻳﻄﻠـﻖ ﻋﻠـﻰ اﺳـﺎﻟﻴﺐ
ﺑﺮﻣﺠﻴــﺔ ﺗﺘﺒــﻊ ﻟﺰﻳــﺎدة ﺳــﺮﻋﺔ ﺗﻨﻔﻴــﺬ اﻟﻜــﻮد او اﻟﺘﻘﻠﻴــﻞ ﻣــﻦ اﺳــﺘﻬﻼك ﻣﺼــﺎدر اﻟﻨﻈــﺎم
System Resourcesوﻏﻴﺮهــﺎ .اﻣــﺎ ﻓــﻲ ﻣﻮﺿــﻮع هــﺬﻩ اﻟﻔﻘــﺮة ﻓﺴــﻨﻨﺎﻗﺶ ﺗﻘﻨﻴــﺎت
ﻟﺘﺤﺴﻴﻦ اﻟﻜﻔﺎءة واﻟﺨﺎﺻﺔ ﻟﻌﻤﻠﻴـﺔ اﻟﺘﺮﺟﻤـﺔ واﻟﺘـﻲ ﻳﻮﻓﺮهـﺎ Visual Basicﻣـﻦ ﺧـﻼل
ﺧﺎﻧـﺔ اﻟﺘﺒﻮﻳـﺐ Compileاﻟﻤﻮﺟـﻮدة ﻓـﻲ ﺻـﻨﺪوق ﺣـﻮار ﺧﺼـﺎﺋﺺ اﻟﻤﺸـﺮوع Project
.Properties
Native Codeﻓﻬﻲ ﺗﺤﻮﻳﻞ اﻟﺸﻴﻔﺮة اﻟﻤﺼـﺪرﻳﺔ اﻟـﻰ ﻟﻐـﺔ اﻻﻟـﺔ Machine Language
ﻳﻔﻬﻤﺎ اﻟﺠﻬﺎز ﻣﺒﺎﺷﺮة .اﻟﻤﻴﺰة ﻓﻲ اﻟﻤﻠﻔﺎت اﻟﺘﻨﻔﻴﺬﻳﺔ ﻣـﻦ ﻧـﻮع P-Codeهـﻲ ﺣﺠﻤﻬـﺎ
اﻟﺼﻐﻴﺮ ﻧﺴﺒﻴﺎ آﺬﻟﻚ ﺗﻮاﻓﻘﻴﺘﻬﺎ اﻟﻤﻄﻠﻘﺔ ﻣـﻊ اآـﻮاد اﻟﺘﻨﻔﻴـﺬ داﺧـﻞ ﺑﻴﺌـﺔ .Visual Basic
اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،اآﻮاد P-Codeﺗﻜﻮن ﻋﺮﺿﺔ ﻻﺣﺪاث اﻧﻬﻴﺎر اﻟﺒﺮﻧﺎﻣﺞ ﺑﻨﺴﺒﺔ اﻗﻞ ﺑﻜﺜﻴﺮ ﻣـﻦ
اآﻮاد .Native Codeﻣﻦ ﻧﺎﺣﻴﺔ اﺧـﺮى ،اآـﻮاد P-Codeاﺑﻄـﺄ ﻣـﻦ اآـﻮاد Native Code
ﻻﻧﻬﺎ ﻟﻴﺴﺖ اآﻮاد Machine Languageﺣﻘﻴﻘﻴﺔ ﺑـﻞ هـﻲ ﻟﻐـﺔ ﻣﻔﺴـﺮ Visual Basic
ﻓﻘﻂ .ﻓـﻲ ﺣﺎﻟـﺔ اﺧﺘﻴـﺎرك ﻟﺘﺮﺟﻤـﺔ اﻟـﻰ اآـﻮاد ﻣـﻦ ﻧـﻮع ،Native Codeﻓﺴـﻴﻮﻓﺮ ﻟـﻚ
Visual Basicﺧﻴــﺎرات اﺿــﺎﻓﻴﺔ ﺗﺠــﺪهﺎ ﻓــﻲ ﺧﺎﻧــﺔ اﻟﺘﺒﻮﻳــﺐ Compileاﻟﻤﻮﺟــﻮدة ﻓــﻲ
ﺻﻨﺪوق اﻟﺤﻮار :Project Properties
:No Optimization
ﻟﻦ ﻳﻘـﻮم اﻟﻤﺘـﺮﺟﻢ ﺑـﺎي ﻣﺤـﺎوﻻت ﻟﻌﻤﻠﻴـﺎت ﺗﺤﺴـﻴﻦ اﻟﻜﻔـﺎءة Optimizationﻟﻠﻤﻠـﻒ
اﻟﺘﻨﻔﻴﺬي.
:Assume No Aliasing
هﺬا اﻻﺧﺘﻴﺎر ﺳﻴﺰﻳﺪ ﻣﻦ ﺳﺮﻋﺔ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ ﻟﻜﻦ ﻣـﻦ اﻟﻀـﺮوري ﺟـﺪا ﻋـﺪم ﺗﻄﺒﻴـﻖ
ﻣﺒﺪأ اﻻﺳﺘﻌﺎرة .واﻻﺳﺘﻌﺎرة –ﺑﺸﻜﻞ ﻣﺒﺴﻂ -هﻲ ﻋﻤﻠﻴﺔ اﺳﺘﻌﺎرة اﺳﻢ ﻟﻤﺘﻐﻴـﺮ ﻋـﺎم
وارﺳﺎﻟﻪ اﻟﻰ اﺟﺮاء ﺑﺎﻟﻤﺮﺟﻊ :ByRef
Dim X
)(Sub AliasingSub
ﻋﻤﻠﻴﺔ اﻻﺳﺘﻌﺎرة ‘
MySub X
End Sub
اﻟﻔﺼﻞ اﻟﺮاﺑﻊ
ﻣﻜﺘﺒﺎت VBو VBA
ﻳﻮﻓﺮ ﻟﻚ Visual Basicﻣﺌـﺎت اﻻﺟـﺮاءات واﻟﻜﺎﺋﻨـﺎت اﻟﻤﻀـﻤﻨﺔ ﻓـﻲ ﻣﻜﺘﺒـﺎت VBو VBA
واﻟﺘﻲ ﻻ ﻏﻨﻰ ﻋﻨﻬﺎ ﻓﻲ ﺑﺮاﻣﺠﻚ اﻟﺠﺪﻳﺔ ،ﺻﺤﻴﺢ اﻧـﻚ ﺗﺴـﺘﻄﻴﻊ ﻣﺤﺎآـﺎة ﻣﻌﻈـﻢ هـﺬﻩ
اﻟــﺪوال ﺑﻜﺘﺎﺑــﺔ اآــﻮاد ﻻﻧﺠﺎزهــﺎ ،اﻻ ان اﺳــﺘﺨﺪام اﻻﺟــﺮاءت واﻟــﺪوال اﻟﻤﺸــﻤﻮﻟﺔ ﻓــﻲ
ﻣﻜﺘﺒﺎت Visual Basicﻳﻌﺘﺒﺮ اﻓﻀـﻞ ﺑﻜﺜﻴـﺮ ﻣـﻦ اﻧﺠﺎزهـﺎ ﺑﻨﻔﺴـﻚ ﻣـﻦ ﻣﻨﻈـﻮر ﺗﺤﺴـﻴﻦ
اﻟﻜﻔﺎءة ،Optimizationﻓﻬﺬﻩ اﻟﺪوال ﺻـﻤﻤﻬﺎ ﻣﺒﺮﻣﺠـﻮن ﻣﺤﺘﺮﻓـﻮن ﺑﻠﻐـﺎت اﺧـﺮى ﻣﻤـﺎ
ﻳﺠﻌﻞ ﺗﻨﻔﻴﺬهﺎ اﺳﺮع ﺑﻜﺜﻴﺮ ﻣﻦ اآﻮادك اﻟﻤﻜﺘﻮﺑﺔ ﺑـ .Visual Basicﻳﺄﺧﺬك هـﺬا اﻟﻔﺼـﻞ
ﻓﻲ ﺟﻮﻟﺔ ﻣﻊ اﻟﻌﺸﺮات ﻣﻦ هـﺬﻩ اﻟـﺪوال واﻻﺟـﺮاءت واﻟﺘـﻲ ﺳـﺄﺗﻄﺮق اﻟﻴﻬـﺎ ﺑﺎﺧﺘﺼـﺎر
ﺑﺎﺧﺘﺼــﺎر ،اﻣــﺎ اذا اردت ﺷــﺮﺣﺎ واﻓﻴــﺎ ﻟﻬــﺎ ﻓﻤﻜﺘﺒــﺔ MSDNﺑﺎﻧﺘﻈــﺎرك ﺣﺘــﻰ ﺗﺒﺤــﺮ ﻓــﻲ
ﺻﻔﺤﺎﺗﻬﺎ.
اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﻋﺪاد
ﻳــﻮﻓﺮ ﻟــﻚ Visual Basicﻋﺸــﺮات اﻟﻤﻌــﺎﻣﻼت Operatorsواﻟــﺪوال اﻟﺨﺎﺻــﺔ ﺑﺎﻻﻋــﺪاد
ﺑﺎﺧﺘﻼف اﻧﻮاﻋﻬﺎ .... Long ،Integer ،Byteاﻟـﺦ ،ﺑﺎﻻﺿـﺎﻓﺔ اﻟـﻰ دوال رﻳﺎﺿـﻴﺔ آـﺪوال
اﻟﻤﺜﻠﺜﺎت او اﻟﺪوال اﻻﺳﻴﺔ.
اﻟﻤﻌﺎﻣﻼت اﻟﺮﻳﺎﺿﻴﺔ
ﻳﻮﻓﺮ ﻟﻚ Visual Basicاﻟﻤﻌﺎﻣﻼت اﻻرﺑـﻊ اﻟﺮﺋﻴﺴـﻴﺔ * ،- ،+و ،/وﻓـﻲ ﺣﺎﻟـﺔ ﺗﻄﺒﻴﻘﻬـﺎ
ﻋﻠﻰ اﻧﻮاع ﻣﺨﺘﻠﻔﺔ ﻣـﻦ اﻟﻘـﻴﻢ ،ﻓـﺎن اﻟﻘـﻴﻢ اﻻﺑﺴـﻂ ﺳـﺘﺘﺤﻮل ﻣﺆﻗﺘـﺎ اﻟـﻰ اﻻﻋﻘـﺪ –
Integerاﻟﻰ Longو Singleاﻟﻰ ،Doubleﺑﺎﻟﻨﺴـﺒﺔ ﻟﻤﻌﺎﻣـﻞ اﻟﻘﺴـﻤﺔ /ﻓﻬـﻮ ﻳﻘـﻮم
ﺑﺘﺤﻮﻳﻞ ﺟﻤﻴﻊ اﻟﻘﻴﻢ اﻟﻤﺘﻤﺜﻠﺔ ﻓﻲ اﻟﺤﺪﻳﻦ اﻻﻳﻤﻦ واﻻﻳﺴﺮ اﻟﻰ اﻟﻨـﻮع ،Doubleﻟـﺬﻟﻚ
ﻳﻨﺼﺢ ﺑﺎﺳﺘﺨﺪام ﻣﻌﺎﻣﻞ اﻟﻘﺴﻤﺔ اﻟﺼﺤﻴﺤﺔ \ ﻣﻊ اﻟﻤﺘﻐﻴﺮات اﻟﺼﺤﻴﺤﺔ Integer ،Byte
و Longﻓﻬﻮ اﺳﺮع ارﺑﻊ ﻣﺮات ﻣﻦ اﻟﻤﻌﺎﻣﻞ :/
115
آﺬﻟﻚ ﻣﻌﺎﻣﻞ اﻻس ^ ﻓﻬﻮ ﻳﺤﻮل ﺟﻤﻴﻊ اﻟﻘﻴﻢ اﻟﻰ اﻟﻨﻮع ،Doubleوﻓـﻲ اﺣﻴـﺎن آﺜﻴـﺮة
ﻟﻦ ﺗﺤﺘﺎج اﻻ ﻟﻠﻤﺘﻐﻴﺮات اﻟﺼﺤﻴﺤﺔ ،ﻟﺬﻟﻚ ﻳﻨﺼﺢ ﺑﺎﺳﺘﺨﺪام ﻣﻌﺎﻣـﻞ اﻟﻀـﺮب ﻋﻮﺿـﺎ ﻋـﻦ
اﻻس:
اﻣﺎ ﻣﻌﺎﻣﻞ ﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ MODﻓﻴﻘﻮم ﺑﺘﺤﻮﻳﻞ اﻟﻘﻴﻢ اﻟـﻰ Longﻣﻤـﺎ ﻻ ﻳﻌﻄـﻲ دﻗـﺔ
ﻓﻲ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻧﻮاع اﻟﻔﺎﺻﻠﺔ اﻟﻌﺎﺋﻤﺔ اﻻﺧﺮى آــ Doubleو ،Singleﺗﺴـﺘﻄﻴﻊ ﺗﻄـﻮﻳﺮ
داﻟﺔ اﺧﺮى ﺗﻌﻮد ﺑﺒﺎﻗﻲ اﻟﻘﺴﻤﺔ ﻟﻼﻋﺪاد ﻏﻴﺮ :Long
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻤﻌﺎﻣﻼت اﻟﻤﻨﻄﻘﻴﺔ ،ﻓﻴﻮﻓﺮ Visual Basicﺳﺖ ﻣﻌـﺎﻣﻼت ﻣﻨﻄﻘﻴـﺔ هـﻲ =،
< >= ،> ،<= ،و >< .ﺑﺎﻟﻨﺴــﺒﺔ ﻟﻤﻌﺎﻣــﻞ اﻟﻤﺴــﺎواة = ﻓﻬــﻮ ﻟــﻴﺲ آﻤﻌﺎﻣ ـﻞ اﺳــﻨﺎد
اﻟﻘﻴﻢ اﻟﻰ اﻟﻤﺘﻐﻴﺮات ،ﻓﻤﻌﺎﻣﻞ اﻟﻤﺴﺎواة = هـﻮ اﻟﻤﻌﺎﻣـﻞ اﻟـﺬي ﻳﻄﺒﻘـﻪ Visual Basic
ﻓﻲ داﺧﻞ اﻟﺠﻤﻞ اﻟﺸﺮﻃﻴﺔ او ﺣﺘﻰ اذا ﺳﺒﻘﻪ ﻣﻌﺎﻣﻞ اﺳﻨﺎد ﺁﺧﺮ ،ﻓﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ:
ﻳﺒــﻴﻦ ﻟﻨــﺎ ان اﻟﻤﻌﺎﻣــﻞ = اﻟﺜــﺎﻧﻲ اﻟﻤﻮﺟــﻮد ﻓــﻲ اﻟﺴــﻄﺮ اﻟﺜــﺎﻧﻲ هــﻮ ﻣﻌﺎﻣ ـﻞ ﻣﻘﺎرﻧــﺔ
اﻟﻤﺴﺎواة وﻟﻴﺲ اﺳﻨﺎد اﻟﻘﻴﻢ.
ﺗﻔﺮق ﻣﻌﻈﻢ ﻟﻐﺎت اﻟﺒﺮﻣﺠـﺔ اﻻﺧـﺮى ﺑـﻴﻦ ﻣﻌﺎﻣـﻞ اﻟﻤﺴـﺎواة وﻣﻌﺎﻣـﻞ ﻣﻼﺣﻈﺔ:
اﺳﻨﺎد اﻟﻘﻴﻢ ،ﻓﻨﺠﺪ ﻓﻲ ﻟﻐﺔ اﻟـ Cﻣﻌﺎﻣﻞ اﻟﻤﺴـﺎواة هـﻮ == وﻣﻌﺎﻣـﻞ
اﺳﻨﺎد اﻟﻘﻴﻢ هﻮ =.
116
اﻣﺎ ﻣﻌﺎﻣﻼت اﻟـﺮﺑﻂ XOR ،ANDو NOTﻓﻬـﻲ ﻣﺪﻋﻮﻣـﺔ اﻳﻀـﺎ ﻟـﺮﺑﻂ اﻟﺠﻤـﻞ اﻟﻤﻨﻄﻘﻴـﺔ
وﻳﻤﻜﻨﻚ اﺳﺘﺨﺪاﻣﻬﺎ ﻟﻼﻋﺪاد ﺣﻴـﺚ ﺗـﺆﺛﺮ ﻋﻠـﻰ اﻟﺒﺘـﺎت Bitsاﻟﺘـﻲ ﺗﻤﺜـﻞ ﻗﻴﻤـﺔ اﻟﻌـﺪد
ﺑﺎﻟﻨﻈﺎم اﻟﺜﻨﺎﺋﻲ .Binary
اﺳﺒﻘﻴﺔ اﻟﻤﻌﺎﻣﻼت:
ﻣﻦ اﻟﻤﻔﻴﺪ ان اذآﺮ هﻨﺎ ،ان ﻣﻦ اﻻﺧﻄﺎء اﻟﺸﺎﺋﻌﺔ اﻟﺘﻲ ﻳﻘﻊ ﻓﻴﻬﺎ اﻏﻠﺐ اﻟﻤﺒﺮﻣﺠﻴﻦ هﻮ
ﻧﺴﻴﺎن ان اﺳﺒﻘﻴﺔ اﻟﻤﻌﺎﻣﻞ Andاﻋﻠﻰ ﻣﻦ اﻟﻤﻌﺎﻣﻞ ،Orﻓﻤﻘﺎرﻧﺔ اﻟﻤﻌﺎﻣـﻞ Andﺗـﺘﻢ
ﻗﺒـﻞ ﻣﻘﺎرﻧــﺔ اﻟﻤﻌﺎﻣــﻞ Orﺣﺘــﻰ وﻟــﻮ آــﺎن اﻟﻤﻌﺎﻣــﻞ Orهــﻮ اﻟﺴــﺎﺑﻖ اي ﻓــﻲ اﻟﺠﻬــﺔ
اﻟﻴﺴﺮى ﻗﺒﻞ اﻟﻤﻌﺎﻣﻞ ،Andﻓﻔﻲ هﺬا اﻟﻤﺜﺎل:
ﻟﻠﻮهﻠﺔ اﻻوﻟﻰ ﻳﻌﺘﻘﺪ اﻟﻤﺒﺮﻣﺞ ان اﻟﻨﺘﻴﺠـﺔ هـﻲ Falseﺑﻴﻨﻤـﺎ اﻟﻨﺘﻴﺠـﺔ اﻟﺤﻘﻴﻘﻴـﺔ هـﻲ
Trueوذﻟﻚ ،ﻻن اﻟﻤﻌﺎﻣﻞ اﻟﺸـﺮﻃﻲ Andﻳـﺘﻢ اﺧﺘﺒـﺎرﻩ ﻗﺒـﻞ اﻟﻤﻌﺎﻣـﻞ اﻟﺸـﺮﻃﻲ .Or
وﻟﺘﺠﻨﺐ ذﻟﻚ ،اﺳﺘﺨﺪم اﻻﻗﻮاس:
اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،اﺳﺒﻘﻴﺔ اﻟﻤﻌﺎﻣﻞ Notاﻋﻠﻰ ﻣﻦ اﺳـﺒﻘﻴﺔ اﻟﻤﻌﺎﻣـﻞ Andاي ﻳـﺘﻢ ﺗﻨﻔﻴـﺬﻩ
داﺋﻤﺎ ﻗﺒﻞ ﻣﻌﺎﻣﻞ Andﻓﺎﻟﻌﺒﺎرة :
ﺳﺘﻘﻮم ﺑﺘﻨﻔﻴﺬ اﻟﻤﻌﺎﻣﻞ Notﻋﻠﻰ آﻠﻤﺔ Trueاﻻوﻟﻰ ﻓﻘـﻂ ﺣﺘـﻰ ﺗﻜـﻮن False And
Falseوﺑﻌﺪ ذﻟﻚ ﻳﺄﺗﻲ دور اﻟﻤﻌﺎﻣﻞ Andوآﻤﺎ هﻮ واﺿﺢ ﻓﻨﺘﻴﺠـﺔ اﻟﺘﻌﺒﻴـﺮ هـﻲ .False
اﻣـﺎ اذا اردت ﺗﻨﻔﻴــﺬ اﻟﻤﻌﺎﻣــﻞ Andوﻣــﻦ ﺛـﻢ ﻋﻜــﺲ اﻟﻨﺘﻴﺠــﺔ ﻓﺘﺴــﺘﻄﻴﻊ ان ﺗﺴــﺘﺨﺪم
اﻻﻗﻮاس واﻟﺘﻲ ﻟﻬﺎ اﻷﺳﺒﻘﻴﺔ اﻷوﻟﻰ ﻋﻠﻰ ﺟﻤﻴﻊ اﻟﻤﻌﺎﻣﻼت ﻣﺜﻞ:
اﻟﺪوال اﻟﺮﻳﺎﺿﻴﺔ
ﻣﻦ اﻟﺪوال اﻟﺮﻳﺎﺿﻴﺔ اﻟﺘﻲ ﻳﻮﻓﺮهﺎ ﻟﻚ Visual Basicداﻟـﺔ اﻟﻘﻴﻤـﺔ اﻟﻤﻄﻠﻘـﺔ Absوداﻟـﺔ
اﻟﺠﺬر اﻟﺘﺮﺑﻴﻌﻲ Sqrواﻟﺪاﻟﺔ اﻻﺳﻴﺔ ،Expاﻣﺎ اﻟﺪاﻟﺔ Sgnﻓﻬﻲ ﺗﻌﻮد ﺑـﺎﻟﻘﻴﻢ 1اذا آـﺎن
اﻟﻌﺪد اﻟﻤﺮﺳﻞ ﻟﻬﺎ ﻣﻮﺟﺐ ،واﻟﻘﻴﻤﺔ 1-اذا آﺎن اﻟﻌﺪد اﻟﻤﺮﺳـﻞ ﻟﻬـﺎ ﺳـﺎﻟﺐ ،وﺻـﻔﺮ اذا
آﺎن اﻟﻌﺪد اﻟﻤﺮﺳﻞ ﺻﻔﺮ.
ﺑﺎﻟﻨﺴﺒﺔ ﻟﺪاﻟـﺔ اﻟﻠﻮﻏـﺎرﺛﻢ Logﻓﻬـﻲ ﺗﻌـﻮد ﺑﺎﻟﻠﻮﻏـﺎرﺛﻢ اﻟﻄﺒﻴﻌـﻲ ﻟﻠﻌـﺪد ،اﻣـﺎ ﻟﻼﻋـﺪاد
اﻻﺧﺮى ،ﻓﺘﺴﺘﻄﻴﻊ ﺗﻄﻮﻳﺮ هﺬﻩ اﻟﺪاﻟﺔ:
اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻳﺬآﺮﻧﻲ ﺑﺘﻄﻮﻳﺮ داﻟﺔ اﻟﺠـﺬر اﻟﺘﺮﺑﻴﻌـﻲ Sqrاﻳﻀـﺎ ،ﺣﻴـﺚ ﻳﻤﻜـﻦ ان ﺗﻌـﻮد
ﺑﺎﻟﺠﺬر اﻟﻨﻮﻧﻲ ﻟﻠﻌﺪد:
اﺧﻴﺮا اﻟﺪوال اﻟﻤﺜﻠﺜﻴـﺔ Tan ،Cos ،Sinو Atnاﻟﺘـﻲ ﺗﻌـﻮد ﺑﺎﻟﻘﻴﻤـﺔ اﻟﻤﻨﺎﺳـﺒﺔ اﺳـﺘﻨﺎدا
اﻟــﻰ اﻟﺰاوﻳــﺔ اﻟﻤﺮﺳــﻠﺔ ﻟﻬــﺎ ﺑﺎﻟﺮادﻳــﺎن ،اﻣــﺎ ﺑﺎﻟﻨﺴــﺒﺔ ﻟﻠــﺪوال اﻟﻤﺜﻠﺜﻴــﺔ اﻻﺧــﺮى ،Sec
.... ،Cosecاﻟﺦ ﻓﻴﻤﻜﻨﻚ اﺷﺘﻘﺎﻗﻬﺎ ﺑﺘﻄﺒﻴﻘـﺎت ﻣﻌﺎدﻻﺗﻬـﺎ اﻟﻤﻌﺮوﻓـﺔ ،هـﺬﻩ واﺣـﺪة ﻣـﻦ
ﻋﻨﺪي ،واﻟﺒﻘﻴﺔ ﻋﻠﻴﻚ:
ﺗﻨﺴﻴﻖ اﻻﻋﺪاد
ﻣﻦ اﻗﻮى دوال اﻟﺘﻨﺴﻴﻖ هﻲ داﻟﺔ Formatاﻟﺘﻲ ﺗﻮﻓﺮ ﻟﻚ ﺧﻴﺎرات ﻻ ﻧﻬﺎﺋﻴـﺔ ﻟﺘﻨﺴـﻴﻖ
اﻻﻋﺪاد ،اﻟﺤﺮوف ،اﻟﻮﻗﺖ واﻟﺘﺎرﻳﺦ اﻳﻀﺎ ،ﺳﺎﺳﺮد ﻟﻚ ﻓـﻲ هـﺬﻩ اﻟﻔﻘـﺮة ﻃـﺮق ﺗﻨﺴـﻴﻖ
اﻻﻋﺪاد ﻓﻘﻂ.
اﻟﺼﻴﻐﺔ اﻟﻤﺒﺴﻄﺔ ﻟﻠﺪاﻟﺔ Formatﺗﺘﻄﻠﺐ اﻟﻌﺒﺎرة -او اﻟﻘﻴﻤﺔ -و ﻃﺮﻳﻘﺔ اﻟﺘﻨﺴﻴﻖ:
ﻳﻮﺟﺪ ﻧﻮﻋﺎن ﻣﻦ ﻃﺮق اﻟﺘﻨﺴﻴﻖ .اﻟﻨـﻮع اﻻول هـﻮ اﻟﺘﻨﺴـﻴﻘﺎت اﻟﻘﻴﺎﺳـﻴﺔ واﻟﺜـﺎﻧﻲ هـﻮ
اﻟﺘﻨﺴﻴﻘﺎت اﻟﺨﺎﺻﺔ .اﻟﺘﻨﺴﻴﻘﺎت اﻟﻘﻴﺎﺳﻴﺔ ﻋﺒﺎرة ﻋﻦ ﻗﻴﻢ ﻧﺤﺪد ﻧﻮع ﺗﻨﺴﻴﻖ اﻻرﻗﺎم آـ
General Numberﻟﺘﻨﺴﻴﻖ اﻟـﺮﻗﻢ ﺑﺸـﻜﻞ ﻋـﺎم او Currencyﻟﺘﻨﺴـﻴﻖ اﻟـﺮﻗﻢ ﻋﻠـﻰ
ﺷﻜﻞ ﻋﻤﻠﺔ وﻏﻴﺮهﺎ ﻣﻦ اﻟﻘﻴﻢ اﻟﺘﻲ ﺗﺠﺪهﺎ ﻓﻲ ﻣﻜﺘﺒﺔ :MSDN
‘ 1234567
)"Print Format(1234567, "General Number
1,234,567.00ر.س‘ .
)”Print Format(1234567, "Currency
‘ 1,234,567
)”Print Format(1234567, "Standard
اﻣﺎ اﻟﺘﻨﺴﻴﻘﺎت اﻟﺨﺎﺻﺔ ﻓﻬﻲ ﺗﻨﺴﻴﻘﺎت ﺗﺤﺪدهﺎ ﺑﻨﻔﺴﻚ .واﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻋﻼﻣﺎت آــ
.... 0 ،% ،#اﻟﺦ ،ﺗﺠﺪهﺎ اﻳﻀﺎ ﻓﻲ ﻣﻜﺘﺒﺔ :MSDN
' 1, 234.57
)"Print Format(1234.567, "#,##.00
' 23.4%
)"Print Format(0.234, "#.#%
' 020.0
)"Print Format(20, "00#.00
دوال اﺧﺮى
ﻣﻦ دوال ﺣﺬف اﻟﻔﻮاﺻﻞ اﻟﺪاﻟﺘﻴﻦ Intو ،Fixاﻻوﻟﻰ ﺗﺤﺬف اﻟﻔﺎﺻﻠﺔ وﺗﺤﻮل اﻟﻌﺪد اﻟـﻰ
ﻋﺪد ﺻﺤﻴﺢ اﻗﻞ ﻣﻦ او ﻳﺴﺎوي اﻟﻌﺪد اﻟﻤﺮﺳﻞ ﺑﻴﻨﻤﺎ اﻟﺜﺎﻧﻴﺔ ﺗﺤﺬف اﻟﻔﺎﺻﻠﺔ ﻓﻘﻂ:
119
اﻣﺎ داﻟﺔ اﻟﺘﻘﺮﻳﺐ Roundﻓﻘﺪ ﻇﻬﺮت ﻓﻲ اﻻﺻﺪار VB6اﻟﺘﻲ ﺗﻤﻜﻨـﻚ ﻣـﻦ ﺗﺤﺪﻳـﺪ ﻋـﺪد
اﻻرﻗﺎم اﻟﻌﺸﺮﻳﺔ:
Do
If (iNum And 2 ^ iCounter) = 2 ^ iCounter Then
Bin = "1" & Bin
Else
Bin = "0" & Bin
End If
iCounter = iCounter + 1
Loop Until 2 ^ iCounter > iNum
End Function
اﻣﺎ اﻟﺪاﻟﺔ Rndﻓﻬﻲ ﺗﻌﻮد ﺑﻘﻴﻤﺔ ﻋﺸﻮاﺋﻴﺔ اﺻـﻐﺮ ﻣـﻦ 1واآﺒـﺮ ﻣـﻦ او ﺗﺴـﺎوي ﺻـﻔﺮ،
ﺗﺴﺘﻄﻴﻊ ﺗﺨﺼﻴﺺ ﻣﺠﺎل ﻣﻌﻴﻦ ﻣﻦ اﻻﻋﺪاد ﺑﺎﺳﺘﺨﺪام هﺬﻩ اﻟﻤﻌﺎدﻟﺔ:
اﺧﻴﺮا ،دوال ﺗﺤﻮﻳﻞ اﻟﻘﻴﻢ اﻟﻰ اﻋﺪاد ﻟﻌﻞ اﺷﻬﺮهﺎ ،Valﻟﻜﻦ اﻟﻤﻔﻀـﻞ اﺳـﺘﺨﺪام دوال
اﻟﺘﺤﻮﻳــﻞ اﻟﺘــﻲ ﺗﻤﻜﻨــﻚ ﻣــﻦ ﺗﺤﺪﻳــﺪ ﻧــﻮع اﻟﻘﻴﻤــﺔ آـــ CIntﻟﻼﻋــﺪاد Integerو CLng
ﻟﻼﻋﺪاد CDbl ،Longﻟﻼﻋﺪاد .... Doubleاﻟﺦ.
اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺤﺮوف
ﻣﻦ ﻣﻨﺎ ﻻ ﻳﺴﺘﺨﺪم اﻟﺤﺮوف؟ ﺗﻮﻓﺮ ﻟﻚ ﻣﻜﺘﺒـﺎت VBو VBAﻋﺸـﺮات اﻟـﺪوال اﻟﻤﺨﺘﺼـﺔ
ﻓﻲ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺘﻐﻴﺮات واﻟﺜﻮاﺑﺖ اﻟﺤﺮﻓﻴﺔ .Stringsاﻋﺮض ﻋﻠﻴﻚ ﻓـﻲ هـﺬﻩ اﻟﻔﻜـﺮة
ﻣﻌﻈﻢ هﺬﻩ اﻟﺪوال ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ﺗﻄﺒﻴﻖ ﻓﻜﺮة اﻟﺒﺤﺚ واﻻﺳﺘﺒﺪال Find and Replace
وﻟﻜﻨﻲ ﺳﺄﺑﺪأ ﺑﺎﻟﻤﻌﺎﻣﻼت اﻟﺤﺮﻓﻴﺔ.
اﻟﻤﻌﺎﻣﻼت اﻟﺤﺮﻓﻴﺔ
اﻟﺮﻣﺰ & ﻳﻤﺜﻞ ﻣﻌﺎﻣﻞ اﻟﺪﻣﺞ Combine Operatorﻟﻠﻘﻴﻢ اﻟﺤﺮﻓﻴﺔ:
”ﺗﺮآﻲ“ = sMyName
”اﻟﻌﺴﻴﺮي “ & sMyName = sMyName
Print sMyName ”ﺗﺮآﻲ اﻟﻌﺴﻴﺮي“ ‘
اﻣﺎ ﻣﻌﺎﻣﻞ اﻟﺠﻤـﻊ " "+ﻓﺄﻧـﺎ ﻻ اﺣﺒـﺬ اﺳـﺘﺨﺪاﻣﻪ آﺜﻴـﺮا ،ﻓـﺎذا آـﺎن ﻧـﻮع اﻟﻘـﻴﻢ ﺣﺮﻓﻴـﺔ
ﻓﺴﻴﺘﺤﻮل اﻟﻰ ﻣﻌﺎﻣﻞ اﻟﺠﻤﻊ "&"،واذا آﺎﻧﺖ اﺣﺪى اﻟﻘﻴﻢ ﻋﺪدﻳﺔ واﻟﺜﺎﻧﻴﺔ ﺣﺮﻓﻴﺔ ﻗﺎﺑﻠﺔ
ﻟﻠﺘﺤﻮﻳــﻞ اﻟــﻰ ﻋﺪدﻳــﺔ ﻓﺴــﻴﻜﻮن ﻣﻌﺎﻣــﻞ ﺟﻤــﻊ ،اﻣــﺎ اذا آﺎﻧــﺖ اﺣــﺪى اﻟﻘــﻴﻢ ﻋﺪدﻳــﺔ
واﻻﺧﺮى ﺣﺮﻓﻴﺔ ﻻﻳﻤﻜﻦ ﺗﺤﻮﻳﻠﻬﺎ اﻟﻰ ﻋﺪدﻳﺔ ،ﻓﺎن رﺳﺎﻟﺔ اﻟﺨﻄﺄ Type Mismatchﻟﻬـﺎ
ﻧﺼﻴﺐ ﻣﻦ اﻟﻈﻬﻮر:
ﺑﺎﻟﻨﺴــﺒﺔ ﻟﻠﻤﻌــﺎﻣﻼت اﻟﻤﻨﻄﻘﻴــﺔ < .... = ،<> ،اﻟــﺦ ﻓــﻴﻤﻜﻦ ﺗﻄﺒﻴﻘﻬــﺎ ﻋﻠــﻰ اﻟﻘــﻴﻢ
اﻟﺤﺮﻓﻴــﺔ اﻳﻀــﺎ ،ﺣﻴــﺚ ﺗﻜــﻮن ﻗﻴﻤــﺔ اﻟﺤــﺮوف هــﻲ اﻟﻤﻘﺎﺑــﻞ ﻟﻬــﺎ ﻓــﻲ ﺟــﺪول ASCIIاو
:UNICODE
اﺣﻴﺎﻧﺎ ﺗﻮد ﺗﺠﺎهـﻞ اﻟﺪﻗـﺔ اﻟﺘـﻲ ﻳﻔﺮﺿـﻬﺎ ﻋﻠﻴـﻚ ﻣﻌﺎﻣـﻞ اﻟﻤﺴـﺎواة وﺗﺴـﺘﺨﺪم ﻣﻌﺎﻣـﻞ
اﻟﺘﺸﺎﺑﻪ Likeاﻟﺬي ﻳﺘﻴﺢ ﻟﻚ اﺳﺘﻌﻤﺎل اﻟﺤـﺮوف اﻟﺘﻌﻮﻳﻀـﻴﺔ ،ﻓﻴﻤﺜـﻞ اﻟﺮﻣـﺰ #أي رﻗـﻢ
واﻟﺮﻣﺰ ؟ أي ﺣﺮف ،واﻟﺮﻣﺰ * أي ﻋﺪد ﻣﻌﻴﻦ ﻣﻦ اﻟﺤﺮوف واﻻرﻗﺎم:
… = sMyString
او ﺑﺎﻣﻜﺎﻧﻚ ﺗﺤﺪﻳﺪ ﺣﺮوف ﻣﻌﻴﻨﺔ او ﻣﺠﺎل ﻣﻌﻴﻦ ﺑﺎﺳﺘﺨﺪام اﻻﻗﻮاس ] و [:
… = sMyString
وﺣﺘﻰ ﻳﻤﻜﻨﻚ اﺳﺘﺜﻨﺎء ﺣﺮوف ﻣﻌﻴﻨﺔ او ﻣﺠﺎل ﻣﻌﻴﻦ ﺑﺎﺳﺘﺨﺪام اﻟﺮﻣﺰ !:
… = sMyString
اﻟﺒﺤﺚ واﻻﺳﺘﺒﺪال
ﺗﺴﺘﻄﻴﻊ اﻟﺒﺤﺚ ﻋﻦ آﻠﻤﺔ او ﺣﺮوف ﻣﻌﻴﻨﺔ داﺧﻞ ﻗﻴﻤﺔ ﺣﺮﻓﻴﺔ ﻋﻦ ﻃﺮﻳﻖ اﻟﺪاﻟﺔ InStr
اﻟﺘﻲ ﺗﻌﻮد ﺑﻤﻮﻗﻊ ذﻟﻚ اﻟﺤﺮف او ﺑﺪاﻳﺔ اﻟﻜﻠﻤﺔ:
lStartPoint = 1
)"ﺗﺮآﻲ" lPosition = InStr (lStartPoint, Text1.Text,
If lPosition > 0 Then
Text1.SelStart = lPosition - 1
Text1.SelLength = 4
End If
اﻣــﺎ اﻟﺪاﻟــﺔ InStrRevﻓﻬــﻲ ﺷــﺒﻴﻬﻪ ﺑﺎﻟﺪاﻟــﺔ اﻟﺴــﺎﺑﻘﺔ وﻟﻜــﻦ ﻋﻤﻠﻴــﺔ اﻟﺒﺤــﺚ ﺗﻜــﻮن
ﻣﻌﺎآﺴﺔ -أي ﺗﺒﺪأ ﻣﻦ ﻧﻬﺎﻳﺔ اﻟﻘﻴﻤﺔ اﻟﻤﺮﺳﻠﺔ.
ﺑﺎﻟﻨﺴﺒﺔ ﻟﻌﻤﻠﻴﺔ اﺳﺘﺒﺪال اﻟﻨﺼﻮص ،ﻓﻠﻦ ﺗﺠﺪ اﺳﺮع ﻣﻦ اﻟﺪاﻟﺔ Replaceاﻟﺘﻲ ﺗﻤﻜﻨﻚ
ﻣﻦ اﺳﺘﺒﺪال ﺣﺮوف ﻣﻌﻴﻨﺔ ﺑﺤﺮوف اﺧﺮى .هﻨﺎ ﺳﻨﺴﺘﺒﺪل ﺟﻤﻴﻊ آﻠﻤﺎت "ﻣﺤﻤﺪ" اﻟﻰ
"ﻣﺤﻤﺪ ﺻﻠﻰ اﷲ ﻋﻠﻴﻪ وﺳﻠﻢ" اﻟﻤﻮﺟﻮدة ﻓﻲ أداة اﻟﻨﺺ:
ﺗﻨﺴﻴﻖ اﻟﺤﺮوف
ﺳﺘﺴــﺘﺨﺪم اﻟﺪاﻟــﺔ Formatاﻳﻀــﺎ ﻟﺘﻨﺴــﻴﻖ اﻟﺤــﺮوف ،وﻟﻜــﻦ ﻻ ﺗﻮﺟــﺪ ﺑﻬــﺎ ﺗﻨﺴــﻴﻘﺎت
ﻗﻴﺎﺳﻴﺔ ﻟﻠﺤﺮوف ،اﻣﺎ اﻟﺘﻨﺴﻴﻘﺎت اﻟﺨﺎﺻﺔ ﻓﻬﻲ ﺗﺴﺘﺨﺪم اﻟﺮﻣﺰ @ اﻟﺬي ﻳﻤﺜﻞ ﺣﺮف او
ﻣﺴﺎﻓﺔ واﻟﺮﻣﺰ & اﻟﺬي ﻳﻤﺜﻞ ﺣﺮف او ﻻ ﺷﺊ:
دوال اﺧﺮى
ﻣﻦ اﻟﺪوال اﻟﺤﺮﻓﻴﺔ اﻻﺧﺮى دوال اﺳﺘﺨﻼص اﻟﺤﺮوف اﻟﻴﺴﺮى ،Left$اﻟﺤﺮوف اﻟﻴﻤﻨﻰ
Right$و اﻟﺤﺮوف اﻟﻮﺳﻄﻰ :Mid$
”sMyString = “ABCDEFGHIJKLMNOPQRSTUVWXYZ
)Print Left$ ( sMyString, 5 ‘ ABCDE
)Print Right$ ( sMyString, 5 ‘ VWXYZ
)Print Mid$ ( sMyString, 20, 5 ‘ TUVWX
)Print Mid$ ( sMyString, 20 ‘ TUVWXYZ
وﻋﻨﺪ اﻟﺤﺪﻳﺚ ﻋـﻦ ﺣـﺮوف ﻟﻐﺘﻨـﺎ اﻟﺠﻤﻴﻠـﺔ ،ﻓﻤـﻦ اﻟﻤﻌـﺮوف ان اﻟـﺪاﻟﺘﻴﻦ Rightو Left
ﺗﻌﻄﻴﺎن ﻧﺘـﺎﺋﺞ ﻋﻜﺴـﻴﺔ ﻣـﻊ اﻟﺤـﺮوف اﻟﻌﺮﺑﻴـﺔ .ﻓﺎﻻﺳـﺘﺪﻋﺎء Right$ﻟﻠﺠﻤﻠـﺔ "ﻣﺮﺣﺒـﺎ"
ﺳﺒﺪأ ﻣﻦ اﻻﻟﻒ ﻓﺎﻟﺒﺎء ﻓﺎﻟﺤﺎء اﻟـﺦ ..ﻣﻤـﺎ ﻳﺴـﺒﺐ اﻟﺘﺸـﻮﻳﺶ ﻋﻠـﻰ اﻟﻤﺒـﺮﻣﺞ اﻟﻌﺮﺑـﻲ.
اﻟﻔﻜﺮة ﺑﻜﻞ ﺑﺴﺎﻃﺔ ﻟﺠﻌﻞ هﺎﺗﻴﻦ اﻟﺪاﻟﺘﻴﻦ ﺗﻌﻤﻼن ﺑﺸﻜﻞ ﺻﺤﻴﺢ ﻣﻊ اﻟﺤﺮوف اﻟﻌﺮﺑﻴـﺔ،
هﻲ ﻋﻦ ﻃﺮﻳﻖ ﺗﻄﻮﻳﺮ داﻟﺘﻴﻦ ﻋﺮﺑﻴﺘﻴﻦ ArRightو :ArLeft
"sMyString = "abcde
"Mid$(sMyString, 2, 3) = "BCD
Print sMyString ”‘ “aBCDe
وﺑﺪﻻ ﻣﻦ ﻣﻌﺮﻓـﺔ ﻣـﺎ اذا آـﺎن اﻟﻤﺘﻐﻴـﺮ اﻟﺤﺮﻓـﻲ ﺧﺎﻟﻴـﺎ ﺑﺎﺳـﺘﺨﺪام ﻋﻼﻣـﺎت اﻟﺘﻨﺼـﻴﺺ،
اﺳﺘﺨﺪم اﻟﺪاﻟﺔ Lenاﻟﺘﻲ ﺗﻌﻮد ﺑﻌﺪد ﺣﺮوف اﻟﻘﻴﻤﺔ اﻟﻤﺮﺳﻠﺔ ﻓﻬﻲ اﺳﺮع ﻣـﺮﺗﻴﻦ ﻣـﻦ
اﻟﻄﺮﻳﻘﺔ اﻻوﻟﻰ:
” sMyString = “ 12345
)Print RTrim$ (sMyString ”‘ “ 12345
)Print LTrim$ (sMyString ” ‘ “12345
)Print Trim$ (sMyString ”‘ “12345
اﻟﺪاﻟﺔ Ascﺗﻌﻮد ﺑﺎﻟﻌﺪد اﻟﻤﻘﺎﺑﻞ ﻟﻠﺤﺮف ﻓـﻲ ﺟـﺪول ،ASCIIاﻣـﺎ AscWﻓﻬـﻲ ﻟﻠﺘﺮﻣﻴـﺰ
،UNICODEواﻟﺪوال Chr$و ChrW$ﺗﻌﻮد ﺑﺎﻟﺤﺮف اﻟﻤﻘﺎﺑﻞ ﻟﻠﻌﺪد –أي اﻟﻌﻜﺲ:
ﻣﻦ اﻟﺪوال اﻻﺧﺮى داﻟﺘﻲ UCase$و LCase$اﻟﻠﺘﺎن ﺗﻘﻮﻣﺎن ﺑﺘﻜﺒﻴﺮ اﻟﺤﺮوف اﻻﻧﺠﻠﻴﺰﻳﺔ
وﺗﺼــﻐﻴﺮهﺎ .اﺳــﺘﺨﺪام هﺎﺗــﺎن اﻟــﺪاﻟﺘﺎن ﻣﺴــﺄﻟﺔ ﺿــﺮورﻳﺔ ﺧﺎﺻــﺔ ﻋﻨــﺪ ﻣﻘﺎرﻧــﺔ اﻟﻘــﻴﻢ
اﻟﺤﺮﻓﻴﺔ ،ﻓﻼ ﺗﻨﺴﻰ ان ” “Turkiﻻ ﺗﺴﺎوي ”:“TURKI
ﺑﻌﺾ اﻟﺪوال اﻟﺤﺮﻓﻴﺔ ﺗﺘﻮﻓﺮ ﻣﻨﻬـﺎ ﻧﺴـﺨﺘﻴﻦ ،اﻻوﻟـﻰ ﺗﻌـﻮد ﺑﻘﻴﻤـﺔ ﻣـﻦ ﻣﻼﺣﻈﺔ:
اﻟﻨــﻮع Stringواﻟﺜﺎﻧﻴــﺔ ﺗﻌــﻮد ﺑﻘﻴﻤــﺔ ﻣــﻦ اﻟﻨــﻮع .Variantﺣــﺎول داﺋﻤــﺎ
اﺳﺘﺨﺪام اﻟﻨﺴﺨﺔ اﻻوﻟﻰ ﻣﻦ اﻟﺪاﻟﺔ –اذا ﺗـﻮﻓﺮت -ﻋـﻦ ﻃﺮﻳـﻖ اﺿـﺎﻓﺔ
اﻟﺮﻣﺰ $ﺑﻌﺪ اﺳﻢ اﻟﺪاﻟﺔ ﻟﺘﺮﻓﻊ ﻋﺐء ﺗﺤﻮﻳﻞ ﻧﻮع اﻟﻘﻴﻤﺔ اﻟﺬي ﻳﻘﻮم ﺑـﻪ
Visual Basicﻣﻤﺎ ﻳﺆدي اﻟﻰ زﻳﺎدة ﺳﺮﻋﺔ اﻟﺘﻨﻔﻴﺬ.
اﻟﺪاﻟﺔ Splitﺗﻤﻜﻨﻚ ﻣﻦ ﻓﺼﻞ ﺟﻤﻴﻊ اﻟﻜﻠﻤﺎت وﻧﺴﺦ آﻞ آﻠﻤﺔ اﻟﻰ ﻣﺼﻔﻮﻓﺔ ،اﻓﺘﺮاﺿـﻴﺎ
اﻟﻔﺎﺻﻞ ﺑﻴﻦ اﻟﻜﻠﻤﺎت هﻲ اﻟﻤﺴﺎﻓﺔ آﻤﺎ ﻳﻤﻜﻨﻚ ﺗﺤﺪﻳﺪ ﻓﺎﺻﻞ ﻣﻌﻴﻦ:
)X = Split(Text1.Text
126
واذا ﻧﺪﻣﺖ ﻋﻠﻰ ﺗﻘﺴﻴﻢ اﻟﻜﻠﻤﺎت ،ﻓﺎﻟﺪاﻟﺔ Joinﺗﻌﻴﺪ اﻟﻮﺿﻊ آﻤﺎ آﺎن ﺳﺎﺑﻘﺎ:
اﺧﻴﺮا ،داﻟﺘﻲ ﺗﺤﻮﻳﻞ اﻟﻘـﻴﻢ اﻟـﻰ ﺣﺮﻓﻴـﺔ Str$و ،CStrواﻟﻔـﺮق ﺑﻴﻨﻬﻤـﺎ هـﻮ ان اﻻوﻟـﻰ
ﺗﻀﻴﻒ ﻣﺴﺎﻓﺔ ﻳﺴﺎر اﻟﻌﺪد اﻟﻤﺮﺳﻞ ﻟﻬﺎ ان آﺎن ﻣﻮﺟﺐ ام اﻟﺜﺎﻧﻴﺔ ﻓﻼ.
MyDate = #1/20/2001#
Print MyDate
MyDate = #2:30:00 AM#
Print MyDate
MyDate = #1/20/2001 2:30:00 AM#
Print MyDate
127
وﻗﺒﻞ ان اﺑﺪأ ﻓـﻲ اﻟﺤـﺪﻳﺚ ﻋـﻦ دوال اﻟﻮﻗـﺖ واﻟﺘـﺎرﻳﺦ ،اود ان اﻋﺮﻓـﻚ ﻋﻠـﻰ اﻟﺨﺎﺻـﻴﺔ
Calendarاﻟﺘﺎﺑﻌﺔ ﻟﻠﻜﺎﺋﻦ VBAواﻟﺘﻲ ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﻐﻴﻴﺮ ﻧﻈﺎم اﻟﺘـﺎرﻳﺦ اﻟﺘـﺎﺑﻊ ﻟﺒﺮﻧﺎﻣﺠـﻚ
اﻟﻰ ﻣﻴﻼدي او هﺠﺮي:
ﻣﻊ اﻟﻌﻠﻢ ان اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﺗﻀﻌﻬﺎ ﻓﻲ هﺬﻩ اﻟﺨﺎﺻﻴﺔ ﺗﺆﺛﺮ ﻋﻠﻰ ﻧﻮع اﻟﻘﻴﻤﺔ اﻟﺘـﻲ ﺗﻌـﻮد
ﺑﻬﺎ دوال اﻟﺘﺎرﻳﺦ اﻻﺧﺮى وﻟﻜﻨﻬﺎ ﻻ ﺗﺆﺛﺮ ﻓﻲ ﻗﻴﻢ اﻟﻮﻗﺖ واﻟﺘﺎرﻳﺦ:
VBA.Calendar = vbCalHijri
MyDate = #1/16/1421# اﻟﻘﻴﻤﺔ هﻨﺎ ﺑﺎﻟﺘﺎرﻳﺦ اﻟﻤﻴﻼدي وﻟﻴﺲ اﻟﻬﺠﺮي ‘
Print MyDate ﻣﺨﺮﺟﺎت اﻻﻣﺮ هﻨﺎ ﺑﺎﻟﻬﺠﺮي ‘
واﻻن اﻋﺮض ﻟﻚ دوال اﻟﻮﻗـﺖ واﻟﺘـﺎرﻳﺦ ﻣﺒﺘـﺪﺋﺎ ﺑﺎﻟـﺪاﻟﺘﻴﻦ Dateو Timeاﻟﻠﺘـﺎن ﺗﻌـﻮدان
ﺑﺘﺎرﻳﺦ اﻟﻴﻮم واﻟﻮﻗﺖ اﻟﺤﺎﻟﻲ:
Print Date
Print Time
اﻣﺎ اذا ﺗﻌﺎﻣﻠـﺖ ﻣـﻊ Dateو Timeآﻌﺒـﺎرات ،Statementﻓﻬـﻲ ﺳـﺘﻐﻴﺮ ﻗﻴﻤـﺔ اﻟﻮﻗـﺖ
واﻟﺘﺎرﻳﺦ ﻓﻲ اﻟﻨﻈﺎم:
Date = #1/20/2001#
Time = #12:00:00 AM#
Print Now
128
اﻣﺎ اﻟﺪاﻟﺔ Timerﻓﻬﻲ ﺗﻌﻮد ﺑﻌﺪد اﻟﺜﻮاﻧﻲ ﻣﻦ ﻣﻨﺘﺼﻒ اﻟﻠﻴـﻞ ﺣﺘـﻰ وﻗـﺖ اﺳـﺘﺪﻋﺎﺋﻬﺎ
أي هﻲ ﺗﻌﻤﻞ آﻌﺪاد ،ﻗﺪ ﺗﺴﺘﻔﻴﺪ ﻣﻨﻬـﺎ وﺗﻄـﻮر اﺟـﺮاء اﻧﺘﻈـﺎر ﻣﺆﻗـﺖ ﻗﺒـﻞ ﺗﻨﻔﻴـﺬ آـﻮد
ﻣﻌﻴﻦ:
sStartTime = Timer
Do: DoEvents : Loop Until Timer – sStartTime >= iSeconds
End Sub
ﻟﻦ ﺗﺘﻤﻜﻦ ﻣﻦ اﺳﺘﺨﺪام اﻟﺜﺎﺑﺖ ﺑﻴﻦ اﻟﻌﻼﻣﺘـﻴﻦ #و #ﻣﺒﺎﺷـﺮة اذا آﻨـﺖ ﺗﺮﻏـﺐ ﻓـﻲ
ﺗﻌﻴﻴﻦ ﻗﻴﻢ ﻟﻤﺘﻐﻴﺮات ﺑﺎﺳﺘﺨﺪام اﻟﺘﺎرﻳﺦ اﻟﻬﺠﺮي ،وﻟﻜﻦ ﻣﻊ اﻟﺪاﻟـﺔ DateSerialﻳﻤﻜﻨـﻚ
ﻋﻤﻞ ذﻟﻚ ﻓﻬﻲ ﺗﺘﺄﺛﺮ ﺑﻘﻴﻤﺔ اﻟﺨﺎﺻﻴﺔ Calendarاﻟﺘﺎﺑﻌﺔ ﻟﻠﻜﺎﺋﻦ :VBA
VBA.Calendar = vbCalHijri
27ﺷﻮال MyDate = DateSerial(1422, 10, 27) ‘ 1422
Print MyDate
VBA.Calendar = vbCalGreg
ﻳﻮاﻓﻖ 11ﻳﻨﺎﻳﺮ Print MyDate ‘ 2002
129
آﻤــﺎ ﺗﺘــﻮﻓﺮ داﻟــﺔ اﺧــﺮى ﻟﻠﻮﻗــﺖ هــﻲ اﻟﺪاﻟــﺔ .TimeSerialاﻣــﺎ ﺑﺎﻟﻨﺴــﺒﺔ ﻟﻠــﺪاﻟﺘﻴﻦ
DateValueو TimeValueﻓﻬﻤﺎ ﺗﻌﻮدان ﺑﻘﻴﻤﺔ اﻟﺘﺎرﻳﺦ او اﻟﻮﻗﺖ اﻟﻤﻮﺟﻮد ﻓـﻲ اﻟﻘﻴﻤـﺔ
اﻟﻤﺮﺳﻠﺔ اﻟﻴﻬﻤﺎ:
ﺑﺎﻣﻜﺎﻧﻚ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ DatePartاﻟﺘـﻲ ﺗﺴـﺘﺨﺮج ﺟـﺰء ﻣﻌـﻴﻦ ﻣـﻦ ﻗﻴﻤـﺔ اﻟﻮﻗـﺖ او
اﻟﺘﺎرﻳﺦ ،وﻟﻜﻨـﻲ اﻓﻀـﻞ اﻟـﺪوال Minute ،Hour ،Year ،Month ،Dayو Secondﻓﻬـﻲ
ﺗﻌﻮد ﺑﻘﻴﻤﺔ اﻟﻴﻮم ،اﻟﺸﻬﺮ ،اﻟﺴﻨﺔ ،اﻟﺴﺎﻋﺔ ،اﻟﺪﻗﻴﻘﺔ واﻟﺜﺎﻧﻴـﺔ اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﻘﻴﻤـﺔ
اﻟﻤﺮﺳﻠﺔ اﻟﻴﻬﻢ:
وﻟﺘﻄﺒﻴﻖ ﻋﻤﻠﻴﺎت رﻳﺎﺿﻴﺔ اآﺜﺮ دﻗﺔ وﺳـﻬﻮﻟﺔ ،ﻳﻔﻀـﻞ اﺳـﺘﺨﺪام اﻟـﺪاﻟﺘﻴﻦ DateAddو
،DateDiffاﻻوﻟﻰ ﻻﺿـﺎﻓﺔ ﺗـﺎرﻳﺦ ﻋﻠـﻰ ﺗـﺎرﻳﺦ واﻟﺜﺎﻧﻴـﺔ ﻟﻤﻌﺮﻓـﺔ اﻟﻔـﺎرق ﺑﻴﻨﻬﻤـﺎ .داﻟـﺔ
DateAddﻟﻬﺎ ﺻﻴﻐﺔ ﻋﺎﻣﺔ هﻲ:
اﻟﻔﺘﺮة هﻲ اﻟﻮﺣـﺪة اﻟﻤﺴـﺘﺨﺪم واﻟﺘـﻲ ﻗـﺪ ﺗﻜـﻮن ﺳـﻨﺔ " "yyyyﺷـﻬﺮ " "mﻳـﻮم ""d
....اﻟﺦ ،اﻣﺎ اﻟﻌﺪد ﻓﻬﻮ ﻋﺪد اﻟﻮﺣﺪات ﻣﻦ اﻟﻔﺘﺮة اﻟﺘـﻲ ﺗﺮﻳـﺪ اﺿـﺎﻓﺘﻬﺎ ،اﻣـﺎ اﻟﺘـﺎرﻳﺦ ﻓﻬـﻮ
اﻟﻘﻴﻤﺔ اﻟﺬي ﺗﺮﻳﺪ اﺿﺎﻓﺔ اﻟﺘﺎرﻳﺦ ﻋﻠﻴﻬﺎ:
130
اﻣﺎ ﻟﻤﻌﺮﻓﺔ اﻟﻔﺮق ﺑـﻴﻦ ﺗـﺎرﻳﺨﻴﻦ ﻓﺎﺳـﺘﺨﺪم داﻟـﺔ DateDiffوﺻـﻴﻐﺘﻬﺎ اﻟﻌﺎﻣـﺔ ﺷـﺒﻴﻬﻪ
ﺑﺎﻻوﻟﻰ ،اﻻ اﻧﻬﺎ ﺗﻄﻠﺐ ﻗﻴﻤﺔ اﻟﺘﺎرﻳﺦ ﻣﻜﺎن ﻗﻴﻤﺔ اﻟﻌﺪد:
sMyDate = Now
VBA.Calendar = vbCalHijri
ﻣﺤﺮم ‘ )Print MonthName(1
VBA.Calendar = vbCalGreg
ﻳﻨﺎﻳﺮ ‘ )Print MonthName(1
اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت
ﻳﻤﻜﻨﻚ اﻻﻣﺮ Name … Asﻣﻦ اﻋـﺎدة ﺗﺴـﻤﻴﺔ اﻟﻤﻠـﻒ او ﻧﻘﻠـﻪ ،واﻻﻣـﺮ FileCopyﻣـﻦ
ﻧﺴﺦ اﻟﻤﻠﻒ ،ﺑﻴﻨﻤﺎ اﻻﻣﺮ Killﻳﺤﺬف اﻟﻤﻠﻒ:
”sFile = “C:\File.EXT
ﻣﺨﻔﻲ ‘ … If GetAttr(sFile) And vbHidden Then
ﻟﻠﻘﺮاءة ﻓﻘﻂ ‘ … If GetAttr(sFile) And vbReadOnly Then
ارﺷﻴﻒ ‘ … If GetAttr(sFile) And vbArchive Then
…
SetAttr sFile, vbHidden ﻣﺨﻔﻲ ‘
SetAttr sFile, vbArchive + vbReadOnly ارﺷﻴﻒ وﻟﻠﻘﺮاءة ﻓﻘﻂ ‘
ﻋﻜﺲ ﺧﺎﺻﻴﺔ ﻟﻠﻘﺮاءة ﻓﻘﻂ ‘ SetAttr sFile, GetAttr(sFile) Xor vbReadOnly
اﻟﻤﻴﺰة اﻟﺘﻲ ﺗﻌﺠﺒﻨﻲ ﻓﻲ اﻟﺪاﻟﺔ FileLenهﻲ ﻗﺎﺑﻠﻴﺘﻬﺎ ﻋﻠـﻰ اﻟﻌـﻮدة ﺑﺤﺠـﻢ اﻟﻤﻠﻔـﺎت
ﺣﺘﻰ وان آﺎﻧﺖ ﻣﻔﺘﻮﺣﺔ ،واﻟﻌﻴﺐ اﻟﺬي ﻻ ﻳﻌﺠﺒﻨـﻲ ﻓـﻲ ﻧﻔـﺲ اﻟﺪاﻟـﺔ هـﻮ ان اﻟﻘﻴﻤـﺔ
اﻟﺘﻲ ﺗﻌﻮد ﺑﻬﺎ هﻲ ﺣﺠﻢ اﻟﻤﻠﻒ ﻗﺒﻞ اﻟﻔﺘﺢ -أي ﻟـﻦ ﺗﻌـﻮد ﺑﻘﻴﻤـﺔ ﺻـﺤﻴﺤﺔ ﻓـﻲ ﺣـﺎل
ﻗﻴﺎم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺘﻐﻴﻴﺮ ﺣﺠﻢ اﻟﻤﻠﻒ.
اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺠﻠﺪات
ﺗﻌﻮد اﻟﺪاﻟـﺔ CurDir$ﺑﻘﻴﻤـﺔ ﺣﺮﻓﻴـﺔ ﺗﻤﺜـﻞ اﻟـﺪﻟﻴﻞ اﻟﺤـﺎﻟﻲ ﻟﻠﻘـﺮص اﻟـﺬي ﻳﻨﻔـﺬ ﻣﻨـﻪ
اﻟﺒﺮﻧﺎﻣﺞ او ﻣﺤﺮك اﻗﺮاص ﺁﺧﺮ ﺗﺮﺳﻠﻪ اﻟﻰ اﻟﺪاﻟﺔ:
وﻗـﺪ ﺗﺮﻏــﺐ ﻓـﻲ ﺗﻐﻴﻴــﺮ اﻟــﺪﻟﻴﻞ اﻟﺤـﺎﻟﻲ ﺑﺎﺳــﺘﺨﺪام اﻻﻣــﺮﻳﻦ ChDriveو ،ChDirاﻻول
ﻟﺘﻐﻴﻴﺮ اﻟﻘﺮص واﻟﺜﺎﻧﻲ ﻟﺘﻐﻴﻴﺮ اﻟﺪﻟﻴﻞ:
”ChDrive “D:
”ChDir “D:\MsgFolder
ان ﻗﻤــﺖ ﺑﺘﻐﻴﻴــﺮ اﻟــﺪﻟﻴﻞ اﻟﺤــﺎﻟﻲ ﺑﺎﺳــﺘﺨﺪام اﻻﻣــﺮ ChDirﻓﻘــﻂ دون ﻣﻼﺣﻈﺔ:
ﺗﻐﻴﻴــﺮ اﻟﻘــﺮص ﺑﺎﺳــﺘﺨﺪام اﻻﻣــﺮ ،ChDriveﻓﺴــﺘﻘﻮم ﺑﺘﻐﻴﻴــﺮ اﻟــﺪﻟﻴﻞ
اﻟﺤﺎﻟﻲ ﻟﺬﻟﻚ اﻟﻘﺮص ﻓﻘﻂ ،اﻣﺎ اﻟﺪﻟﻴﻞ اﻟﺤﺎﻟﻲ اﻟﺬي ﺳﺘﻌﻮد ﺑـﻪ اﻟﺪاﻟـﺔ
CurDir$ﻟﻢ ﻳﺘﻐﻴﺮ.
اذا آﻨﺖ ﻻ ﺗﻌﺮف ﻣﺎ اﻟﻔﺎﺋﺪة ﻣﻦ ﻣﻌﺮﻓﺔ اﻟﺪﻟﻴﻞ اﻟﺤﺎﻟﻲ ﻟﻠﻘﺮص ،ﻓﻴﺒﺪو ان ﻋﺼﺮ اﻟﺒﺮﻣﺠﺔ
ﺗﺤﺖ اﻟﻨﻈﺎم MS-DOSﻟﻢ ﺗﺸﻬﺪﻩ اﺻﺎﺑﻌﻚ اﻟﺮﻗﻴﻘﺔ .ﺑﺸﻜﻞ ﻣﺒﺴﻂ ،اﻟﻔﺎﺋﺪة اﻟﺘـﻲ ﻗـﺪ
ﺗﺠﻨﻴﻬﺎ ﻣﻦ ﺗﻐﻴﻴﺮ اﻟﺪﻟﻴﻞ اﻟﺤﺎﻟﻲ هﻮ ﻋﺪم اﻟﺤﺎﺟﺔ اﻟﻰ ﺗﺤﺪﻳﺪ ﻣﺴﺎر اﻟﻤﻠﻔﺎت ﻓﻲ ذﻟـﻚ
اﻟﺪﻟﻴﻞ ،ﻓﻬﺬا اﻟﻜﻮد:
”ChDrive “C:
”ChDir “C:\UnwantedFolder
”*Kill “*.
133
اﻟﺨﻄﻮة اﻻوﻟﻰ ‘
)”sFileName = Dir$ (“C:\Winnt\*.EXE
اﻟﺨﻄﻮة اﻟﺜﺎﻧﻴﺔ ‘
)Do While Len (sFileName
List1.AddItem sFileName
sFileName = Dir$
Loop
ﺗﺤﺮﻳﺮ اﻟﻤﻠﻔﺎت
ﺑﺎﻻﺿﺎﻓﺔ اواﻣﺮ ودوال اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻤﻠﻔﺎت واﻟﻤﺠﻠﺪات اﻟﺴﺎﺑﻘﺔ ،ﺗـﻮﻓﺮ ﻟـﻚ ﻣﻜﺘﺒـﺎت
VBو VBAاواﻣﺮ ودوال اﺧﺮى ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﺮﻳﺮ اﻟﻤﻠﻔـﺎت ﻟﺤﻔـﻆ ﺑﻴﺎﻧـﺎت ﺑﺮاﻣﺠـﻚ ﻓﻴﻬـﺎ
ﺑﺎﻟﺘﻨﺴﻴﻖ واﻟﻬﻴﺌﺔ اﻟﺘﻲ ﺗﺮﻳﺪهﺎ .ﻗﺒﻞ اﺟﺮاء أي ﻋﻤﻠﻴﺎت ﺗﺤﺮﻳﺮ ﻋﻠﻰ اﻟﻤﻠـﻒ ،ﻻﺑـﺪ ﻣـﻦ
ﻓﺘﺤﻪ ﺑﺎﺳﺘﺨﺪام اﻟﻌﺒﺎرة Openاﻟﺘﻲ ﺿﻴﻐﺘﻬﺎ:
ﺑﺎﻟﻨﺴﺒﺔ ﻟﺮﻗﻢ اﻟﻤﻠﻒ ،ﻓﻬﻮ رﻗﻢ ﻳﻤﺜﻞ اﻟﻤﻠﻒ ﺑﺤﻴﺚ ﻳﻤﻜﻨﻚ اﻟﻮﺻﻮل اﻟﻴﻪ ﻣﻦ آﺎﻓﺔ اﻧﺤﺎء
اﻟﺒﺮﻧﺎﻣﺞ ،وﻻ ﻳﻤﻜﻦ ﻟﻬﺬا اﻟﺮﻗﻢ ان ﻳﺸﻤﻞ اآﺜﺮ ﻣـﻦ ﻣﻠـﻒ واﺣـﺪ ،ﻟـﺬﻟﻚ ﺣﺘـﻰ ﺗﺘﻔـﺎدى
اﺧﻄﺎء اﻟﺘﻌﺎرض ،ﻳﻔﻀﻞ اﺳﺘﺨﺪام اﻟﺪاﻟﺔ FreeFileاﻟﺘﻲ ﺗﻌﻮد ﺑـﺮﻗﻢ ﻏﻴـﺮ ﻣﺤﺠـﻮز ﻟﻔـﺘﺢ
اﻟﻤﻠﻒ .وﺑﺎﻟﻨﺴﺒﺔ ﻟﻼﻗﻔﺎل ،ﻓﻬﻲ ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﺪﻳﺪ ﺧﺎﺻﻴﺔ اﻻﻗﻔﺎل ﻋﻠﻰ اﻟﻤﻠﻒ ﺑﺤﻴﺚ
ﻳﻤﻜﻨﻚ ﻣﻨﻊ آﺎﻓﺔ اﻟﺒﺮاﻣﺞ اﻻﺧـﺮى ﻣـﻦ اﻟﻘـﺮاءة ﻣـﻦ اﻟﻤﻠـﻒ ،Lock Readاﻟﻜﺘﺎﺑـﺔ اﻟـﻰ
134
اﻟﻤﻠﻒ Lock Writeاو اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻣﻦ واﻟـﻰ اﻟﻤﻠـﻒ .Lock Read Writeاﻣـﺎ ﻧـﻮع
اﻟﻮﺻﻮل ،ﻓﻬﻲ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﺗﻮد ان ﺗﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻒ ﺑﻬﺎ وهﻲ ﺛﻼﺛﺔ اﻧﻮاع:
اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻻ اﺳﺘﺨﺪﻣﻪ آﺜﻴﺮا ﻓﺄﻧﺎ اﻓﻀﻞ ﻗﺮاءة اﻟﻤﻠﻒ آﺎﻣﻼ ﺑﺪاﻟـﺔ واﺣـﺪة ﺗﺴـﻤﻰ
،Input$واﺳﺘﺨﺪم ﻓﻲ ذﻟﻚ اﻟﺪاﻟﺔ LOFاﻟﺘﻲ ﺗﻌﻮد ﺑﺎﻟﺤﺠﻢ اﻟﻜﻠﻲ ﻟﻠﻤﻠﻒ:
وﻻ ﺗﻨﺴــﻰ اﻏــﻼق اﻟﻤﻠــﻒ ﺑﺎﺳــﺘﺨﺪام اﻟﻌﺒــﺎرة Closeاﻟﺘــﻲ ﺳــﺘﻐﻠﻖ آﺎﻓــﺔ اﻟﻤﻠﻔــﺎت
اﻟﻤﻔﺘﻮﺣﺔ ان ﻟﻢ ﺗﺮﺳﻞ ﻟﻬﺎ رﻗﻢ ﻣﻠﻒ ﻣﻌﻴﻦ:
ﻋﻤﻠﻴﺔ اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻣﻦ اﻟﻤﻠﻒ ﻣﺘﺸﺎﺑﻬﺘﺎن ﻣﻦ ﻧﺎﺣﻴﺔ اﻟﺼﻴﻐﺔ اﻟﻰ ﺣﺪ آﺒﻴﺮ .آﻞ ﻣﺎ
هﻮ ﻣﻄﻠﻮب ﻣﻨﻚ هﻮ ﻣﻌﺮﻓﺔ اﻟﻤﻮﻗـﻊ ﻓـﻲ اﻟﻤﻠـﻒ وﺣﺠـﻢ اﻟﻌﻤﻠﻴـﺔ .ﻋﻨـﺪﻣﺎ ﺗﻘـﻮم ﺑﻔـﺘﺢ
اﻟﻤﻠﻒ ﻻول ﻣﺮة ،ﻓﺎن ﻣﻮﻗﻊ ﻣﺆﺷﺮ اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻣـﻦ اﻟﻤﻠـﻒ هـﻮ ،1وهـﻮ اول ﺑﺎﻳـﺖ
ﻣﻮﺟﻮد ﻓﻲ ﺧﺎرﻃﺔ اﻟﻤﻠﻒ .ﻟﻤﻌﺮﻓﺔ ﻣﻮﻗﻊ اﺧﺮ ﺑﺎﻳﺖ اﺳﺘﺨﺪم اﻟﺪاﻟـﺔ LOFواﻟﺘـﻲ ﺗﻌـﻮد
ﺑﺤﺠﻢ اﻟﻤﻠﻒ واﻟﺬي ﺑﺪﻳﻬﻴﺎ ﻳﺮﻣﺰ اﻟﻰ ﻣﻮﻗﻊ اﻟﺒﺎﻳﺖ اﻻﺧﻴﺮ:
اﻟﺬي آﻨﺖ اﻗﺼﺪﻩ ﻣﻦ "ﺣﺠﻢ اﻟﻌﻤﻠﻴﺔ" هﻮ ﺣﺠﻢ اﻟﺒﺎﻳﺘﺎت اﻟﺘﻲ ﺗﺮﻳﺪ ﻗﺮاءﺗﻬﺎ ﻣﻦ اﻟﻤﻠﻒ
او آﺘﺎﺑﺘﻬﺎ اﻟﻰ اﻟﻤﻠﻒ .آﻞ هﺬا ﻳﺘﻢ ﺑﺎﺳﺘﺨﺪام اﻻﻣﺮ Getﻟﻠﻘﺮاءة او Putﻟﻠﻜﺘﺎﺑﺔ .راﻗـﺐ
هﺬا اﻟﻜﻮد:
Dim X As Long
ﻣﻦ اﻟﻤﻬﻢ اﻟﺘﻨﻮﻳﻪ هﻨﺎ ﺑﺎن ﻋﻤﻠﻴﺔ اﻟﻘﺮاءة ﻣﻦ اﻟﻤﻠﻒ ﺗﺆدي اﻟﻰ زﻳـﺎدة اﻟﻤﻮﻗـﻊ اﻟﺤـﺎﻟﻲ
ﻟﻠﻤﺆﺷﺮ ﺑﻤﻘﺪار ﺣﺠﻢ اﻟﻌﻤﻠﻴﺔ .ﻓﻔﻲ اﻟﺴـﻄﺮ اﻟﺜـﺎﻧﻲ ﻟـﻢ اﺣـﺪد ﻣﻮﻗـﻊ اﻟﻤﺆﺷـﺮ ،ﻻﻧـﻪ
ﺳﻴﺰﻳﺪ ﺑﺸﻜﻞ ﺗﻠﻘﺎﺋﻲ 4ﺑﺎﻳﺘﺎت وذﻟـﻚ ﺑﺴـﺒﺐ ان ﺣﺠـﻢ اﻟﻌﻤﻠﻴـﺔ اﻟﺴـﺎﺑﻖ = 4ﺑﺎﻳـﺖ
ﻟﻘﺮاءة ﻗﻴﻤﺔ ﻣﻦ ﻧﻮع .Longهﺬا اﻟﻜﻮد ﻳﻘﻮم ﺑﻘﺮاءة ﺟﻤﻴـﻊ اﻻرﻗـﺎم ﻣـﻦ ﻣﻠـﻒ وآﺘﺎﺑﺘﻬـﺎ
ﻓﻲ ﻣﻠﻒ اﺧﺮ:
ﺑﺪون ﺷﻚ ﺗﺤﺘﺎج اﻟﻰ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻘﻴﻢ اﻟﺤﺮﻓﻴﺔ Stringsواﻟﺘﻲ ﺗـﺘﻢ ﺑـﻨﻔﺲ اﻟﻄﺮﻳﻘـﺔ
ﻟﻜﻨﻚ ﺑﺤﺎﺟﺔ اﻟﻰ اﻋﻄﺎء Visual Basicﻣﻌﻠﻮﻣﺎت ﻋـﻦ ﺣﺠـﻢ اﻟﻘﻴﻤـﺔ اﻟﺤﺮﻓﻴـﺔ .ﻳﻤﻜﻨـﻚ
ﻋﻤﻞ ذﻟﻚ؟ ﺑﺎﺳﺘﺨﺪام اﻟﻨﻮع اﻟﺤﺮﻓﻲ اﻟﺜﺎﺑﺖ اﻟﺤﺠﻢ .Fixed Length Stringآﻤـﺎ ﻓـﻲ
اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ واﻟﺬي ﺳﻴﻘﺮأ 100ﺑﺎﻳﺖ ﻣﻦ اﻟﻤﻠﻒ:
واذا آﻨﺖ ﻻ ﺗﻔﻀﻞ اﺳﺘﺨﺪام هﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺘﻐﻴﺮات ،ﻓﻴﻤﻜﻨﻚ ﻋﻤﻞ أي ﺷـﺊ ﺗﺨﺒـﺮ
ﻓﻴﻪ Visual Basicان ﺣﺠﻢ اﻟﻤﺘﻐﻴﺮ اﻟﺤﺮﻓﻲ هﻮ 100وذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ اﺳﻨﺎد أي ﻗﻴﻤﺔ
ﻣﺆﻗﺘﺔ:
Dim Y As String
137
وﻋﻤﻠﻴﺔ آﺘﺎﺑﺔ اﻟﻘﻴﻢ اﻟﺤﺮﻓﻴﺔ اﻟﻰ اﻟﻤﻠﻒ ﻳﻤﻜﻦ ﻟﻬﺎ ان ﺗﺘﻢ ﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ ﻣﺜﻞ:
ﺗﺬآﺮ داﺋﻤﺎ ان اﻟﻨﻮع Stringهﻮ ﺗﺮﻣﻴﺰ اﺣﺎدي ﻓﻲ اﻟﺬاآﺮة ﻣﻤﺎ ﻳﺆدي اﻟﻰ ﺑﻄﺊ ﻋﻤﻠﻴـﺔ
اﻟﺘﺤﻮﻳﻞ ﺧﺎﺻﺔ ﻓﻲ ﺣﺎﻟﺔ آﻮن اﻟﻘـﻴﻢ اﻟﺤﺮﻓﻴـﺔ آﺒﻴـﺮ ﺟـﺪا .وﻟﺰﻳـﺎدة اﻟﺴـﺮﻋﺔ اآﺜـﺮ ﻣـﻦ
،%50اﺳﺘﺨﺪم ﻋﻤﻠﻴﺔ اﻟﻤﺼﻔﻮﻓﺎت ﻟﻠﻨﻮع ﻟﻬﺬا اﻟﻨﻮع ﻣﻦ اﻟﻘﻴﻢ -اﻟﻨـﻮع Byteﺑـﺪﻻ ﻣـﻦ
:String
اﺳﺘﺨﺪم اﻟﻌﺒﺎرة Putﻟﻠﻜﺘﺎﺑﺔ اﻟﻰ اﻟﻤﻠﻒ واﻟﻌﺒﺎرة Getﻟﻠﻘـﺮاءة ﻣـﻦ اﻟﻤﻠـﻒ آﻤـﺎ آﻨـﺖ
ﺗﻔﻌﻞ ﻣﻊ اﻟﻤﻠﻔـﺎت اﻟﺜﻨﺎﺋﻴـﺔ ،وﻟﻜـﻦ ﻋﻠﻴـﻚ ﻣﻌﺮﻓـﺔ ان ﺣﺠـﻢ اﻟﻌﻤﻠﻴـﺔ وﺧﻄـﻮات اﻧﺘﻘـﺎل
اﻟﻤﺆﺷﺮ ﺗﺘﺄﺛﺮ ﺑﺎﻟﺤﺠﻢ اﻟﻤﺼﺮح ﻋﻨﺪ ﻓﺘﺢ اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ .Len
138
ﻣـﺜﻼ ﻳﻤﻜﻨـﻚ،ﻳﻔﻴﺪك هﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻠﻔﺎت ﻟﻤﺤﺎآﺎة ﻗﻮاﻋﺪ اﻟﺒﻴﺎﻧﺎت ﺑﻄﺮﻳﻘﺔ ﻣﺒﺴﻄﺔ
: واﻟﻜﺘﺎﺑﺔ اﻟﻰ اﻟﻤﻠﻒUDT ﺗﻌﺮﻳﻒ ﺗﺮآﻴﺐ
آﺎﺋﻨﺎت اﺧﺮى
ﻣﺠﻤﻮﻋﺔ ﻻ ﻏﻨـﻰVBA وVB ﺗﻮﻓﺮ ﻟﻚ ﻣﻜﺘﺒﺎت،اﻟﻰ ﺟﺎﻧﺐ اﻟﺪوال واﻻﺟﺮاءات اﻟﺴﺎﺑﻘﺔ
.ﻋﻨﻬﺎ ﻣﻦ اﻟﻜﺎﺋﻨﺎت اﻟﻤﺴﺘﺨﺪﻣﺔ ﻓﻲ ﺑﺮاﻣﺠﻚ اﻟﺠﺪﻳﺔ
139
Open App.Path & “\” & App.EXEName & “.EXE” For Binary As #1
ﻣــﻦ اﻟﻀــﺮوري اﻟﺘﺤﻘــﻖ ﻣــﻦ اﻟﺮﻣــﺰ "\" ﻗﺒــﻞ اﺳــﺘﺨﺪام اﻟﺨﺎﺻــﻴﺔ ،Pathﻓﻔــﻲ اﻟﻜــﻮد
اﻟﺴﺎﺑﻖ اﺿﻔﻨﺎ هﺬا اﻟﺮﻣﺰ ﺑﻌﺪ اﻟﺨﺎﺻﻴﺔ Pathوذﻟﻚ ﻻن ﻣﺴﺎر اﻟﺒﺮﻧﺎﻣﺞ ﻟﻦ ﻳﻀـﺎف اﻟﻴـﻪ
هﺬا اﻟﺮﻣﺰ ،وﻟﻜﻦ ﺗﻈﻬﺮ اﻟﻤﺸﻜﻠﺔ ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ اذا ﺗﻤـﺖ ﻋﻤﻠﻴـﺔ ﺗﻨﻔﻴـﺬ اﻟﺒﺮﻧـﺎﻣﺞ
ﻣﻦ اﻟﺪﻟﻴﻞ اﻟﺠﺬري Boot Directoryﻟﻠﻘﺮص ،اﻧﻈﺮ اﻟﻰ اﻟﺮﻣﺰ "\" ﻓـﻲ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ
Pathاذا ﻧﻔﺬ اﻟﺒﺮﻧﺎﻣﺞ ﻣﻦ دﻟﻴﻞ ﺟﺬري او ﻓﺮﻋﻲ:
وﺣﺘﻰ ﺗﺘﺠﻨﺐ اﻟﻤﺸﻜﻠﺔ اﻟﺴﺎﺑﻘﺔ ،ﻃﻮر هﺬﻩ اﻟﺪاﻟﺔ وﺣﺎول اﻻﻋﺘﻤـﺎد ﻋﻠﻴـﻪ ﻋﻮﺿـﺎ ﻋـﻦ
اﻟﺨﺎﺻﻴﺔ Pathﻣﺠﺮدة:
اﻟﺨﺎﺻﻴﺔ PrevInstanceﺗﻤﻜﻨﻚ ﻣﻦ ﻣﻌﺮﻓﺔ ﻣـﺎ اذا آﺎﻧـﺖ ﻧﺴـﺨﺔ اﺧـﺮى ﻣـﻦ اﻟﺒﺮﻧـﺎﻣﺞ
اﻟﺘﻨﻔﻴﺬي ﻗﻴﺪ اﻟﻌﻤﻞ او ﻻ ،ﻗﺪ ﺗﺴﺘﻄﻴﻊ ﻣﻨﻊ اﻟﻤﺴﺘﺨﺪم ﻣﻦ ﺗﺸﻐﻴﻞ اآﺜﺮ ﻣـﻦ ﻧﺴـﺨﺔ
ﻟﻠﺒﺮﻧﺎﻣﺞ ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ ﺑﻬﺬا اﻟﻜﻮد:
140
ﻣﻊ ذﻟﻚ ،ﻻ ﺗﺜﻖ ﻓﻲ اﻟﻜـﻮد اﻟﺴـﺎﺑﻖ آﺜﻴـﺮا ،ﻓﺎﻟﻤﺴـﺘﺨﺪم ﺑﺎﻣﻜﺎﻧـﻪ ﺗﺸـﻐﻴﻞ اآﺜـﺮ ﻣـﻦ
ﻧﺴﺨﺔ ﻣﻦ ﻧﻔﺲ اﻟﺒﺮﻧﺎﻣﺞ اذا ﻗﺎم ﺑﻨﺴﺦ ﻣﻠﻒ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻰ ﻣﺠﻠﺪ اﺧـﺮ او ﺣﺘـﻰ اﻟـﻰ
ﻧﻔﺲ اﻟﻤﺠﻠﺪ ﺑﺎﺳﻢ ﺁﺧﺮ.
ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﺘـﻲ ﻳﻤﻜﻨـﻚ ﺗﻌـﺪﻳﻞ ﻗﻴﻤﻬـﺎ اﻟﺨﺎﺻـﻴﺔ TaskVisibleاﻟﺘـﻲ ﺗﻤﻜﻨـﻚ ﻣـﻦ
اﺧﻔﺎء او اﻇﻬﺎر اﺳﻢ او رﻣﺰ اﻟﺒﺮﻧﺎﻣﺞ ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﺒﺮاﻣﺞ -Task Listوهﻲ اﻟﻨﺎﻓﺬة اﻟﺘﻲ
ﺗﻤﻜﻨــﻚ ﻣــﻦ ﻋــﺮض ﺟﻤﻴــﻊ اﻟﺒــﺮاﻣﺞ اﻟﻌﺎﻣﻠــﺔ ﻋــﻦ ﻃﺮﻳــﻖ اﻟﻀــﻐﻂ ﻋﻠــﻰ اﻟﻤﻔــﺎﺗﻴﺢ
] [Ctrl+Alt+Delاو ] ،[Ctrl+Shift+ESCﻓﻼﺧﻔﺎء اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ ﻓﻲ أي وﻗﺖ:
App.TaskVisible = False
وآﺬﻟﻚ اﻟﺨﺎﺻﻴﺔ Titleاﻟﺘﻲ ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﺤﺪﻳﺪ اﻟﻨﺺ اﻟﻈﺎهﺮ ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﺒـﺮاﻣﺞ Task
،Listﻳﻜﻮن اﻟﻨﺺ اﻻﻓﺘﺮاﺿﻲ هﻮ اﻟﻨﺺ اﻟﻤﻮﺟﻮد ﻋﻨـﺪ ﺧﺎﻧـﺔ اﺳـﻢ اﻟﻤﺸـﺮوع Project
Nameﻓــﻲ ﺻــﻨﺪوق ﺣــﻮار ﺧﺼــﺎﺋﺺ اﻟﻤﺸــﺮوع Project Propertiesﻗﺒــﻞ ﻋﻤﻠﻴــﺔ
اﻟﺘﺮﺟﻤﺔ.
ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻻﺧﺮى اﻟﺘﻲ ﺗﺠﺪهﺎ ﻓـﻲ ﺻـﻨﺪوق اﻟﺤـﻮار اﻟﺴـﺎﺑﻖ واﻟﻜـﺎﺋﻦ Appهـﻲ
ﺧﺼــﺎﺋﺺ رﻗــﻢ اﺻــﺪار اﻟﺒﺮﻧــﺎﻣﺞ .... Minor ،Majorاﻟــﺦ ،وﺧﺼــﺎﺋﺺ ﺣﻘــﻮق اﻟﻤﻠﻜﻴــﺔ
.... Trademarks ،LegalCopyRightاﻟﺦ وهﻲ ﻟﻠﻘﺮاءة ﻓﻘﻂ وﻗﺖ اﻟﺘﻨﻔﻴﺬ.
Clipboard.Clear
Clipboard.SetText Text1.Text, vbCFText
141
Clipboard.Clear
Clipboard.SetText RichTextBox1.Text, vbCFRTF
Clipboard.Clear
Clipboard.SetData Picture1.Picture
رﻏﻢ ان أداة اﻟﺼﻮرة PictureBoxﻳﻤﻜﻨﻬﺎ ﻋﺮض اﻧﻮاع وهﻴﺌـﺎت ﻣﺨﺘﻠﻔـﺔ ﻣـﻦ اﻟﺼـﻮر ،اﻻ
ان اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﻟﻦ ﻳﻌﻤﻞ اﻻ اذا آﺎﻧﺖ هﻴﺌﺔ اﻟﺼﻮرة ﻣـﻦ اﻟﻨـﻮع ،vbCFBitmapﻟـﺬﻟﻚ
ﻳﻔﻀﻞ ﺗﻤﻜﻴﻦ ﺟﻤﻴﻊ اﻟﻬﻴﺌﺎت اﻻﺧﺮى:
ﻗﺒﻞ اﻟﺘﻮﻏﻞ ﻓﻲ اﻋﻀﺎء آﺎﺋﻦ اﻟﻄﺎﺑﻌﺔ اود ان اﺗﻄﺮق اﻟﻰ ﻣﺠﻤﻮﻋﺔ اﻟﻄﺎﺑﻌـﺎت Printers
.Collectionهﺬﻩ اﻟﻤﺠﻤﻮﻋﺔ ﺗﻤﺜـﻞ ﺟﻤﻴـﻊ اﻟﻄﺎﺑﻌـﺎت اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﺠﻬـﺎز اﻟﺤـﺎﻟﻲ.
ﻻﺗﺴﺘﻄﻴﻊ ﺗﻌﺪﻳﻞ ﻣﺰاﻳﺎ هﺬﻩ اﻟﻄﺎﺑﻌﺎت ﺑﺸﻜﻞ ﻣﺒﺎﺷـﺮ .ﻓﻼﺑـﺪ ﻓـﻲ اﻟﺒﺪاﻳـﺔ ﻣـﻦ ﺗﺤﺪﻳـﺪ
اﻟﻄﺎﺑﻌﺔ وﺗﻌﻴﻴﻨﻬﺎ ﻟﻼﺳﺘﺨﺪام وﻣﻦ ﺛﻢ ﺗﺴﺘﻄﻴﻊ ﺗﻌﺪﻳﻞ اﻟﺨﺼﺎﺋﺺ.
ﻣــﻦ اﻟﺨﺼــﺎﺋﺺ اﻟﻤﻮﺟــﻮدة ﻓــﻲ ﻣﺠﻤﻮﻋــﺔ اﻟﻄﺎﺑﻌــﺎت Printersﺧﺎﺻــﻴﺔ اﺳــﻢ اﻟﻄﺎﺑﻌــﺔ
DeviceNameاو اﺳــﻢ اﻟﻤﺸــﻐﻞ ،DeriverNameرﻗــﻢ اﻟﻤﻨﻔــﺬ Portاﻟﻤﺮآــﺐ ﻋﻠﻴــﻪ
اﻟﻄﺎﺑﻌﺔ ....اﻟﺦ:
Dim X As Integer
اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ ‘
‘ Printers Collection
For X = 0 To Printers.Count -1
Print Printers(X).DeviceName
Next
ﺑﻜﻞ ﺗﺄآﻴﺪ ﺗﻮد ﻣﻦ اﻟﻤﺴﺘﺨﺪم ﺗﺤﺪﻳﺪ اﻟﻄﺎﺑﻌﺔ اﻟﺘﻲ ﻳﺮﻳﺪ اﺳﺘﺨﺪاﻣﻬﺎ .آﻞ ﻣﺎ ﻋﻠﻴﻚ هﻮ
ﺗﻮﻓﻴﺮ آﻮد ﻣﻨﺎﺳﺐ ﻟﺘﻌﻴﻴﻦ اﻟﻄﺎﺑﻌـﺔ اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﻤﺠﻤﻮﻋـﺔ Printersاﻟـﻰ اﻟﻜـﺎﺋﻦ
.Printerهﺬا ﻣﺜﺎل ﻟﻌﻤﻞ ذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻻداة :ListBox
اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ ‘
‘ Printers Collection
For X = 0 To Printers.Count -1
List1.AddItem Printers(X).DeviceName
Next
End Sub
Printer.RightToLeft =True
Printer.FontSize = 40
”ﺗﺮآﻲ اﻟﻌﺴﻴﺮي“ Printer.Print
اﺑﺪأ ﻋﻤﻠﻴﺔ اﻟﻄﺒﺎﻋﺔ ‘
Print.EndDoc
اآﺘﺸﺎف اﻻﺧﻄﺎء
ﻣﻤــﺎ ﻻ ﺷــﻚ ﻓﻴــﻪ ،ان ﻣــﻦ اهــﻢ اﺳــﺒﺎب اﻧﺘﺸــﺎر اﻟﺸــﻌﻴﺮات اﻟﺒﻴﻀــﺎء ﻓــﻲ رؤوس
اﻟﻤﺒﺮﻣﺠﻴﻦ هﻲ اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ .ﻓﻜﻢ ﻣﻦ ﻣﺒﺮﻣﺞ آﺴﺮ ﺷﺎﺷﺔ ﺟﻬﺎزﻩ ﺑﺴﺒﺐ آﺜـﺮة
اﻻﺧﻄﺎء ﻏﻴﺮ اﻟﻤﺘﺪارآﺔ ﻓﻲ ﺑﺮﻧﺎﻣﺠـﻪ ،وآـﻢ ﻣـﻦ ﻣﺒـﺮﻣﺞ ﺗﻮﻗـﻒ ﻋـﻦ إآﻤـﺎل ﻣﺸـﺎرﻳﻌﻪ
ﺑﺴﺒﺐ ﻋﺪم ﻣﻌﺮﻓﺔ ﻣﺼﺪر اﻟﺨﻄﺄ .آﺘﺎﺑﺔ ﺑﺮﻧﺎﻣﺞ دون اﺧﻄﺎء ﺷﻲء ﻳﺘﺤﻘﻖ ﻓـﻲ اﻟﺨﻴـﺎل
ﻓﻘﻂ! ﻟﻜﻦ آﻠﻤﺎ زادت اﺣﺘﻴﺎﻃﺎﺗﻚ ﻟﺘﻔﺎدي اﻻﺧﻄﺎء ﻗﻠﺖ ﻧﺴﺒﺔ ﻇﻬﻮرهﺎ.
ﻓﻜﺮة ﻋﺎﻣﺔ
ﺗﺼﻨﻒ اﻻﺧﻄﺎء ﻓﻲ أي ﻟﻐﺔ ﺑﺮﻣﺠﺔ اﻟﻰ ﺻﻨﻔﻴﻦ ﻋﻠـﻰ اﺳـﺎس وﻗـﺖ ﺣـﺪوﺛﻬﺎ اﻣـﺎ ﻓـﻲ
وﻗﺖ اﻟﺘﺼﻤﻴﻢ او وﻗﺖ اﻟﺘﻨﻔﻴﺬ .هﺬﻩ اﻻﺧﻄـﺎء ﺗﺴـﺒﺐ اﻧﻬﻴـﺎر ﺑﺮﻧﺎﻣﺠـﻚ واﻧﻬـﺎء ﺗﻨﻔﻴـﺬﻩ.
ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ذﻟﻚ ،ﻳﻮﺟﺪ ﻧﻮع ﻣـﻦ اﻻﺧﻄـﺎء اﻟﺘـﻲ ﻻ ﺗﻈﻬـﺮ ﻟـﻚ ﺑﺸـﻜﻞ ﻣﺒﺎﺷـﺮ ﺗﻌـﺮف
ﺑﺎﻟﺸﻮاﺋﺐ .Bugsﻟﻨﻠﻘﻲ ﻧﻈﺮة ﻋﻠﻰ هﺬﻩ اﻻﺻﻨﺎف:
145
Dim X As Byte
X = 256
ﻣﻦ اﻟﻮاﺿﺢ ان اﻟﺼﻴﻐﺔ اﻟﻨﺤﻮﻳﺔ ﻟﻬﺬا اﻟﻜﻮد ﺻﺤﻴﺤﺔ ﻟﻜﻦ ﻣـﻦ اﻟﻨﺎﺣﻴـﺔ اﻟﻤﻨﻄﻘﻴـﺔ ﺧﻄـﺄ.
ﺟــﺮب ﺗﻨﻔﻴــﺬ اﻟﺒﺮﻧــﺎﻣﺞ وﺳــﺘﻼﺣﻆ ﻇﻬــﻮر رﺳــﺎﻟﺔ ﺧﻄــﺄ OverFlowوذﻟــﻚ ﻻن اﻟﻘﻴﻤــﺔ
اﻟﻘﺼﻮى اﻟﺘﻲ ﻳﻤﻜﻦ ان ﻳﺤﻤﻠﻬﺎ أي ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع Byteهﻲ .255ﻃﺒﻌﺎ اﺧﻄـﺎء وﻗـﺖ
اﻟﺘﻨﻔﻴــﺬ آﺜﻴــﺮة ﺟــﺪا ﺟــﺪا ،ﻓﺎﻧــﺖ ﻋﻨــﺪﻣﺎ ﺗﺼــﻤﻢ اﻟﺒﺮﻧــﺎﻣﺞ ﺗﺘﻮﻗــﻊ ان آــﻞ اﻻﺣﺘﻤــﺎﻻت
اﻟﺨﺎرﺟﻴﺔ آﻤﺎ هﻲ ﻓﻲ ﺣﺎﻟﺔ ﺗﺼﻤﻴﻢ اﻟﺒﺮﻧﺎﻣﺞ .ﻣﺜﻼ ﻟﻮ وﺟـﺪ ﻓـﻲ اﺣـﺪ ﺳـﻄﻮر ﺑﺮﻧـﺎﻣﺞ
اﻣﺮ ﻳﻘﻮم ﺑﻤﺴﺢ ﻣﻠﻒ ﻣﻌﻴﻦ وآﺘﺒﺖ هﺬا اﻟﻜﻮد:
” Kill “FileName.EXT
ﻗﺪ ﻋﻤﻞ ﻣﻌﻚ ﺑﺎﻟﺸﻜﻞ اﻟﻤﻄﻠﻮب ،ﻟﻜﻦ اﻓﺘﺮض ان اﻟﻤﻠﻒ ﻟﻢ ﻳﻜﻦ ﻣﻮﺟﻮد؟ ﻓـﺎن رﺳـﺎﻟﺔ
اﻟﺨﻄﺄ ﺳﻴﻜﻮن ﻟﻬﺎ ﻧﺼﻴﺐ ﻣﻦ ﻋﻤﺮ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ .ﻓﻠﻮ آﻨﺖ ذآﻴـﺎ ﺳـﺘﺘﺄآﺪ ﻣـﻦ وﺟـﻮد
اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام داﻟﺔ Dirوﻣﻦ ﺛﻢ ﺣﺬﻓﻪ:
146
ﻳﺒﺪو ان ذآﺎﺋﻚ ﺧﺎرق ﺟﺪا ﻳﺎ ﻗﺎرئ هﺬﻩ اﻟﺴﻄﻮر ﻟﻜﻦ ﻣﻬﻼ آﺎﺗـﺐ هـﺬﻩ اﻟﺴـﻄﻮر ﻟﺪﻳـﻪ
ﺷﺊ اﺧﺮ ﻟﻴﺨﺒﺮك ﺑﻪ .ﻣﺎذا ﻟﻮ آﺎن اﻟﻤﻠﻒ ﻣﻮﺟﻮد ﻟﻜﻦ ﺧﺎﺻﻴﺔ ReadOnlyﻣﺪﻋﻮﻣـﺔ ﺑـﻪ
أي اﻧﻪ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﺤﺬف؟؟ ارأﻳﺖ رﺳﺎﻟﺔ اﻟﺨﻄﺄ ﺳـﺘﻈﻬﺮ ﻣـﻦ ﺟﺪﻳـﺪ .اذن ﺳﺘﺴـﺘﺨﺪم
ذآﺎﺋﻚ اﻟﺨﺎرق وﺗﺘﺄآﺪ ﻣﻦ وﺟﻮد اﻟﻤﻠﻒ وﻣﻦ ﺛﻢ ﻣﻦ ﻋﺪم وﺟﻮد ﺧﺎﺻﻴﺔ :ReadOnly
ﺣﺴﻨﺎ ﻳﺎ ﻗﺎرﺋﻲ اﻟﻔﺎﺿـﻞ ،ﻟـﻚ ﻣﻨـﻲ ﻓـﺎﺋﻖ اﻟﺘﻘـﺪﻳﺮ واﻻﺣﺘـﺮام ﻋﻠـﻰ ﻣﺤﺎوﻟﺘـﻚ اﻟﺮاﺋﻌـﺔ
ﻟﺘﺠﻨـﺐ اﻟﺨﻄــﺄ ﻟﻜــﻦ ﻣــﻊ ذﻟــﻚ ﻓﻬﻨــﺎك اﺣﺘﻤــﺎل اﺧــﺮ ﻟﻮﻗــﻮع اﻟﺨﻄــﺄ! اﻓﺘــﺮض ان اﻟﻤﻠــﻒ
FileName.EXTﻳﺘﻢ اﺳﺘﺨﺪاﻣﻪ ﻣﻦ ﻗﺒﻞ ﺑﺮﻧـﺎﻣﺞ اﺧـﺮ Processوآﺎﻧـﺖ ﻋﻠﻴـﻪ ﺧﺎﺻـﻴﺔ
اﻻﻗﻔﺎل -أي ﻣﺴﻤﻮح ﻟﻠﺒﺮﻧﺎﻣﺞ اﻟﺬي ﻳﺴﺘﺨﺪﻣﻪ ﻓﻘﻂ -ﻓﺎﻧﻚ ﻟـﻦ ﺗﺴـﺘﻄﻴﻊ ﻓـﺘﺢ اﻟﻤﻠـﻒ
وﺳﺘﻈﻬﺮ رﺳﺎﻟﺔ اﻟﺨﻄﺄ اﻟﺘﻲ اﺧﺒﺮﺗﻚ ﺑﻬﺎ واآﻮن ﻗﺪ ﻏﻠﺒﺘﻚ ﻓﻲ هﺬا اﻟﺘﺤﺪي.
اﻟﻘﻀﻴﺔ ﻟﻴﺴﺖ ﻣﻦ ﻳﻐﻠﺐ ﻣﻦ ،ﻓﻜﻠﻨﺎ ﻣﺒﺮﻣﺠﻴﻦ ﻧﻨﺴﻰ آﺜﻴﺮا .ﻟﻜﻦ ﻻﺑﺪ ﻷي ﻣﺒﺮﻣﺞ ﻣﻦ
وﺿﻊ ﺟﻤﻴﻊ وآﺎﻓﺔ اﻻﺣﺘﻤﺎﻻت اﻟﻤﻤﻜﻨﺔ ﻟﺘﻔﺎدي وﺗﺠﻨﺐ اﻻﺧﻄﺎء آﻤﺎ ﺳﻨﺮى ﻻﺣﻘﺎ.
اﻟﺸﻮاﺋﺐ :Bugs
ﻗﺪ ﻳﻜﻮن اﻟﻜﻮد ﺳﻠﻴﻢ ﻣﻦ ﻧﺎﺣﻴﺔ ﻧﺤﻮﻳﺔ وﻻ ﺗﻮﺟﺪ ﺑﻪ أي اﺧﻄﺎء ﻓﻲ وﻗـﺖ اﻟﺘﻨﻔﻴـﺬ ﻟﻜـﻦ
ﺑﻪ ﺷﻮاﺋﺐ .ﻻ ﻳﻮﺟﺪ ﺑﺮﻧﺎﻣﺞ اﻻ وﺑﻪ ﺷﻮاﺋﺐ .اﻟﺸﻮاﺋﺐ هﻲ اﺧﻄـﺎء ﻓـﻲ ﺳـﻠﻮك ﺗﻨﻔﻴـﺬ
اﻟﺒﺮﻧﺎﻣﺞ ﻟﻜﻨﻬﺎ ﻻ ﺗﺴﺒﺐ ﻓﻲ اﻳﻘﺎﻓـﻪ ،وهـﻲ ﺻـﻌﺒﺔ اﻻﻳﺠـﺎد واﻻآﺘﺸـﺎف .ﻟـﺬﻟﻚ ،ﺗﺠـﺪ
ﻏﺎﻟﺒﺎ ﻓﻲ اﻟﺒﺮاﻣﺞ اﻟﺘﺠﺎرﻳﺔ اﻟﻜﺒﻴـﺮة ﺻـﺪور ﻧﺴـﺦ ﺗﺠﺮﻳﺒﻴـﺔ Betaﺗـﻮزع ﻋﻠـﻰ اﺷـﺨﺎص
وﺷــﺮآﺎت ﻣﻌﻴﻨــﺔ اﻟﻬــﺪف ﻣﻨﻬــﺎ ﺗﺠﺮﺑــﺔ اﻟﺒﺮﻧــﺎﻣﺞ واﻟﺘﺤﻘــﻖ ﻣــﻦ واآﺘﺸــﺎف اﻟﺸــﻮاﺋﺐ
اﻟﻤﻮﺟﻮدة ﻓﻴـﻪ .ﻣـﻦ اآﺒـﺮ اﻻﺧﻄـﺎء اﻟـﺬي ﻳﻘـﻊ ﻓﻴﻬـﺎ اﻟﻤﺒـﺮﻣﺞ هـﻲ ﻣﺤﺎوﻟـﺔ اآﺘﺸـﺎف
اﻟﺸﻮاﺋﺐ ﺑﻨﻔﺴﻪ ،ﻷﻧﻚ ﻟﻦ ﺗﺴﺘﻄﻴﻊ اآﺘﺸﺎف اﻟﺸـﻮاﺋﺐ اﻻ ﻋـﻦ ﻃﺮﻳـﻖ ﻏﻴـﺮك ،ﻓﻔـﻲ
ﺣﺎﻟﺔ ﺗﺠﺮﺑﺔ ﺑﺮاﻣﺠﻚ اﻟﺸﺨﺼﻴﺔ ﻓﺎﻧﻚ اآﺜﺮ ﻣﻦ ﻳﻌﺮف ﻃﺮﻳﻘﺔ اﻟﺘﻌﺎﻣـﻞ ﻣﻌﻬـﺎ ،ﻟﻜـﻦ ﻓـﻲ
ﺣﺎﻟﺔ وﺟﻮد ﻧﺴﺨﺔ ﻣﻦ اﻟﺒﺮﻧـﺎﻣﺞ ﻋﻨـﺪ ﺷـﺨﺺ اﺧـﺮ ﻓﺎﻟﻮﺿـﻊ ﻳﺨﺘﻠـﻒ ،وﺗﺒـﺪأ اﻟﺸـﻮاﺋﺐ
ﺑﺎﻟﻈﻬﻮر ﻟﺪﻳﻪ.
Visual Basicﺑﻪ ﺷﻮاﺋﺐ .هﻨﺎك اﻟﻜﺜﻴـﺮ ﻣـﻦ اﻟﺸـﻮاﺋﺐ اﻟﺘـﻲ ﺗﻜﺘﺸـﻒ ﺷـﻬﺮﻳﺎ وﺗﺼـﺪر
ﺷﺮآﺔ Microsoftﺗﻘﺎرﻳﺮ ﻋﻨﻬـﺎ ﺗﺠـﺪهﺎ ﺑﺸـﻜﻞ دوري ﻓـﻲ ﻣﻜﺘﺒـﺔ ،MSDNﺑﻌﻀـﻬﺎ ﺗـﻢ
147
اﺻﻼﺣﻪ واﻟـﺒﻌﺾ اﻻﺧـﺮ ﻻ .اﻟﻤﻘﺼـﺪ ﻣـﻦ هـﺬا اﻟﻜـﻼم ،اﻧـﻪ ﻣﻬﻤـﺎ آـﺎن ﻣﺴـﺘﻮاك ﻓـﻲ
اﻟﺒﺮﻣﺠﺔ ﻻﺑﺪ ﻣﻦ وﺟﻮد ﺷﻮاﺋﺐ ﻓﻲ ﺑﺮﻧﺎﻣﺠﻚ.
ﻳﻮﺟﺪ اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﻜﺘﺐ اﻟﺘﻲ ﺗﻨﺎﻗﺶ ﻣﺴﺄﻟﺔ اﻟﺸﻮاﺋﺐ اﻟﺒﺮﻣﺠﻴﺔ وآﻴﻔﻴﺔ ﺗﻔﺎدﻳﻬﺎ -اﻗﺼﺪ
اﻻﻗﻼل ﻣﻨﻬﺎ -اﻻ اﻧﻬﺎ ﻣﻮاﺿﻴﻊ ﺧﺎرج ﻧﻄﺎق اﻟﻜﺘﺎب.
اﻟﻜﺎﺋﻦ Err
ﻋﻮدا اﻟﻰ ﻣﻮﺿﻮع اﺧﻄﺎء وﻗﺖ اﻟﺘﺸﻐﻴﻞ وﺑﺎﻟﺘﺤﺪﻳﺪ ﻓﻲ ﻣﺜـﺎل اﻟﻤﻠـﻒ ،FileName.EXT
ﺑﺪﻻ ﻣﻦ آﺘﺎﺑﺔ ﻋﺸﺮات اﻻﺳﻄﺮ ﻟﻠﺘﺄآﺪ ﻣﻦ ﻗﺎﺑﻠﻴﺔ ﺣﺬف اﻟﻤﻠﻒ ،اﺳﺘﺨﺪم آﺎﺋﻦ اﻟﺨﻄـﺄ
.Errﻗﺒﻞ ﺗﻄﺒﻴﻖ هﺬا اﻟﻜﺎﺋﻦ ،ﻋﻠﻴﻚ ﻣﻌﺮﻓﺔ أن آﻞ ﺧﻄﺄ ﻣﻦ اﺧﻄﺎء وﻗـﺖ اﻟﺘﺸـﻐﻴﻞ ﻟـﻪ
رﻗﻢ ﺧﺎص ﻳﻤﻴﺰة ﻋﻦ ﻏﻴﺮة ﻣﻦ اﻻﺧﻄﺎء ﺑﻪ وآﺬﻟﻚ وﺻﻒ ﻧﺼـﻲ ﻣﺨﺘﺼـﺮ ﻟﻠﺨﻄـﺄ ،وﻋﻨـﺪ
ﺣﺪوث اﻟﺨﻄﺄ ﻳﺘﻢ وﺿﻊ هﺬﻩ اﻟﺒﻴﺎﻧﺎت -اﻟﺨﺎﺻﺔ ﺑﺎﻟﺨﻄـﺄ -ﻓـﻲ اﻟﻜـﺎﺋﻦ .Errﻋﻨـﺪ رﻏﺒﺘـﻚ
ﻓﻲ اﻻﺳﺘﻤﺮار ﻓﻲ ﻋﻤﻠﻴـﺔ ﺗﻨﻔﻴـﺬ اﻟﺒﺮﻧـﺎﻣﺞ ﺣﺘـﻰ ﻋﻨـﺪ وﻗـﻮع اﻟﺨﻄـﺄ ﻻﺑـﺪ ﻣـﻦ آﺘﺎﺑـﺔ
اﻟﺘﻌﻠﻴﻤﺔ On Error Resume Nextﻋﻨﺪ ﺑﺪاﻳﺔ آﻞ اﺟﺮاء ﺗﺘﻮﻗﻊ ﺣﺪوث ﺧﻄﺄ ﻓﻴـﻪ ﺣﺘـﻰ
ﻳﺴﺘﻤﺮ ﻓﻲ ﺗﻨﻔﻴﺬ ﺳﻄﻮر اﻟﺒﺮﻧﺎﻣﺞ راﻗﺐ هﺬا اﻟﻤﺜﺎل:
”Kill “FileName.EXT
If Err Then
MsgBox Err.Description
Err.Clear
End If
هﻨﺎ ﺳﻨﻘﻮم ﺑﻤﺤﺎوﻟﺔ ﺣﺬف اﻟﻤﻠﻒ ،ان ﻟﻢ ﻳﺴﺘﻄﻊ اﻟﺒﺮﻧﺎﻣﺞ ﻓﻌﻞ ذﻟﻚ ﻓـﺎن اﻟﻜـﺎﺋﻦ Err
ﺳﻴﺤﺘﻮي ﻋﻠﻰ ﺧﺼﺎﺋﺺ ﺗﺘﻌﻠﻖ ﺑﺬﻟﻚ اﻟﺨﻄﺄ وﺳﻨﻈﻬﺮ رﺳﺎﻟﺔ ﺗﻮﺿﺢ وﺻﻒ اﻟﺨﻄﺄ .ﻣـﻦ
اﻟﻤﻬﻢ اﻟﺘﺄآﺪ ﻣﻦ ﺗﻨﻈﻴﻒ اﻟﻜﺎﺋﻦ Errﻋﻦ ﻃﺮﻳﻖ اﺳـﺘﺪﻋﺎء اﻟﻄﺮﻳﻘـﺔ Clearﺣﺘـﻰ ﻧﺨﺒـﺮ
اﻟﺒﺮﻧﺎﻣﺞ اﻧﻨﺎ اﻧﺘﻬﻴﻨﺎ ﻣﻦ ﻗﻨﺺ اﻟﺨﻄﺄ واﻧﻪ ﻻ ﻳﻮﺟﺪ ﺧﻄﺄ اﺧﺮ.
اﻣﺎ اذا آﺎﻧـﺖ اآـﻮاد اﻻﺟـﺮاء ﻃﻮﻳﻠـﺔ وﻻ ﺗـﻮد ان ﺗﻜﺘـﺐ اﻟﺠﻤﻠـﺔ اﻟﺸـﺮﻃﻴﺔ If Err Then
ﻣﺮات ﻣﺘﻌﺪدة ،ﻓﻴﻔﻀﻞ اﺳﺘﺨﺪام On Error Goto Xواﻟﺘـﻲ ﺗـﺆدي اﻟـﻰ اﻻﻧﺘﻘـﺎل اﻟـﻰ
ﺳﻄﺮ ﻣﻌﻴﻦ ﻓﻲ ﺣﺎل ﺣﺪوث أي ﺧﻄﺄ ﻓﻲ ﺗﻨﻔﻴﺬ اآﻮاد اﻻﺟﺮاء:
148
Sub LongSub ()
On Error Goto X:
…
…
…
X:
MsgBox Err.Description
Err.Clear
End Sub
149
اﻟﻔﺼﻞ اﻟﺨﺎﻣﺲ
اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ OOP
ﻋﺮّﻓﺖ اﻻﺻﺪارات VB2 ،VB1و VB3ان Visual Basicهـﻲ ﻟﻐـﺔ ﺑﺮﻣﺠـﺔ ﻣﺒﻨﻴـﺔ ﻋﻠـﻰ
اﻟﻜﺎﺋﻨﺎت – Object Based Programming Languageﺗﺨﺘﺼﺮ ،OBPاﻣﺎ ﻧﻘﻄﺔ اﻟﺘﺤـﻮل
آﺎﻧﺖ ﻣﻨﺬ اﻧﻄﻼق اﻻﺻﺪار VB4واﻟﺬي ﻣﻜﻨﻨﺎ ﻣﻦ اﻋﺘﺒﺎر Visual Basicﻋﻠـﻰ اﻧﻬـﺎ ﻟﻐـﺔ
ﺑﺮﻣﺠﺔ آﺎﺋﻨﻴـﺔ اﻟﺘﻮﺟـﻪ – Object Oriented Programming Languageﺗﺨﺘﺼـﺮ -OOP
ﺑﻌﺪ اﺿﺎﻓﺔ ﻣﻴﺰة ﺗﻌﺮﻳﻒ اﻟﻔﺌﺎت Classesﻋﻠﻰ هﺬﻩ اﻟﻠﻐﺔ ،اﻻ ان اﻟﺒﻌﺾ ﻳﻌﺘـﺮض ﻋﻠـﻰ
وﺻﻒ Visual Basicﺑﺎﻧﻬﺎ OOPﻟﻌﺪم دﻋﻤﻬﺎ ﻟـﺒﻌﺾ اﻟﻤﻴـﺰات اﻻﺳﺎﺳـﻴﺔ ﻟﻠﻐـﺎت OOP
آﺎﻟﻮراﺛﺔ ،Inheritanceإﻋﺎدة اﻟﺘﻌﺮﻳﻒ .... OverLoadingاﻟﺦ ،ﻣـﻦ ﻧﺎﺣﻴـﺔ اﺧـﺮى ﻓﻬـﻮ
ﻳﺪﻋﻢ اﻟﻤﺒﺪأ اﻻﺳﺎﺳﻲ ﻟﻠﻐﺎت OOPوهﻮ اﻟﺘﻐﻠﻴﻒ Encapsulationﻋﻦ ﻃﺮﻳـﻖ ﺗﻌﺮﻳـﻒ
اﻟﻔﺌﺎت Classesواﻟﻮاﺟﻬﺎت .Interfaces
ﺧﻼﺻﺔ اﻟﻘﻮل Visual Basic ،ﻻ ﻳﻌﺘﺒﺮ ﻟﻐﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟـﻪ OOPﺣﻘﻴﻘﻴـﺔ آﻠﻐـﺎت ،C++
SmallTalkاو ،JAVAوﻟﻜﻨﻪ ﻳﻤﻜﻨﻚ ﻣﻦ ﻣﺤﺎآﺎة ﻟﻐـﺎت OOPوﺗﻄﺒﻴـﻖ ﻣﻌﻈـﻢ ﻣﺒﺎدﺋﻬـﺎ.
وﻣﻦ ﻣﻨﻄﻠﻖ ﻋﻨﻮان هﺬا اﻟﻜﺘﺎب " Visual Basicﻟﻠﺠﻤﻴﻊ -ﻧﺤﻮ ﺑﺮﻣﺠﺔ آﺎﺋﻨﻴـﺔ اﻟﺘﻮﺟـﻪ"،
ﻓﻬﺬا اﻟﻔﺼﻞ هﻮ ﻣﺪﺧﻠﻚ اﻟﺮﺋﻴﺲ اﻟﻰ اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﺔ اﻟﺘﻮﺟﻪ OOPوﺗﻄﺒﻴﻘﻬﺎ ﺑـ Visual
،Basicوﺳﺘﻜﻮن ﺟﻤﻴﻊ اﻟﻔﺼﻮل اﻟﻼﺣﻘﺔ ﻣﻦ هﺬا اﻟﻜﺘﺎب ﻣﺒﻨﻴﺔ ﻋﻠﻰ هﺬا اﻟﻔﺼﻞ.
ﻧﻈﺮاً ﻷن ﺟﻤﻴﻊ اﻟﻔﺼﻮل اﻟﻼﺣﻘﺔ ﻣﻦ هﺬا اﻟﻜﺘﺎب ﺳﺘﻜﻮن ﻣﺒﻨﻴﺔ ﻋﻠﻰ ﻣـﺎ ﺗﻌﻠﻤﺘـﻪ ﻣـﻦ
هﺬا اﻟﻔﺼﻞ ،ﻓﺎﻧﻲ ارﺟﻮ ﻣﻨﻚ أن ﺗﺘﻘﺒﻞ ﻣﻨﻲ هﺎﺗﻴﻦ اﻟﻨﺼﻴﺤﺘﻴﻦ:
-ﻻ ﺗﺤﺎول ﺗﺠـﺎوز إي ﻓﻘـﺮة .اذا ﺷـﻌﺮت أﻧـﻚ ﻏﻴـﺮ ﻣﺴـﺘﻮﻋﺐ ﻟﻠﻔﻜـﺮة ،ﺣـﺎول ﻗـﺮاءة
اﻟﻔﻘﺮة ﺟﺪﻳﺪ ﻣﻊ ﺗﻄﺒﻴﻖ اﻷﻣﺜﻠﺔ اﻟﻤﺪرﺟﺔ.
-ﺣﺎول اﺑﺘﻜﺎر اﻣﺜﻠﺔ ﺟﺪﻳﺪة ﻣﻦ وﺣﻲ اﻓﻜﺎرك ،وﻗـﻢ ﺑﺘﻄﺒﻴﻘﻬـﺎ ،ﻟﺘﺘﻤـﺮس ﻋﻠـﻰ هـﺬا
اﻷﺳﻠﻮب ﻣﻦ اﻟﺒﺮﻣﺠﺔ.
ﻓﻲ ﺑﺮﻧﺎﻣﺠﻚ ﻋﺒﺎرة ﻋﻦ آﺎﺋﻦ Objectاو ﺷﺊ Thingﻟﻪ ﺑﻴﺎﻧﺎت واﻓﻌـﺎل ﺧﺎﺻـﺔ ﺑـﻪ أي
اﺷﺒﻪ ﺑﺎﻟﻌﺎﻟﻢ اﻟﺤﻘﻴﻘﻲ اﻟﺬي ﺗﺮاﻩ ﻳﻮﻣﻴﺎ ،ﻓﺎﻻﻧﺴﺎن آﺎﺋﻦ ﻟـﻪ ﺻـﻔﺎت ﻣﻌﻴﻨـﺔ )ﺧﺼـﺎﺋﺺ
(Propertiesآﺎﻻﺳـﻢ ،اﻟﻌﻤـﺮ ،اﻟﻠـﻮن ،اﻟﻄـﻮل ،اﻟــﻮزن .... ،اﻟـﺦ ،وﻟـﻪ اﻓﻌـﺎل ﻳﻘـﻮم ﺑﻬــﺎ
)ﻃﺮق (Methodsآﺎﻟﻤﺸﻲ ،اﻟﻜﺘﺎﺑﺔ ،اﻟﻀﺤﻚ ،اﻟﺒﻜﺎء ،اﻟﻨﻮم .... ،اﻟﺦ ،آﻤﺎ ان اﻻﻧﺴﺎن
ﺗﺤﺪث ﻋﻠﻴﻪ وﻗﺎﺋﻊ )اﺣﺪاث (Eventsﺗﺆﺛﺮ ﻓﻴﻪ وﻳﻨﺘﺞ ﻋﻨﻬﺎ ردود ﻓﻌﻞ آﺎﺳـﺘﻘﺒﺎل رﺳـﺎﻟﺔ
ﻣﻔﺮﺣﺔ او ﻣﺤﺰﻧﺔ ،اﻟﺘﻌﺮض ﻟﺠﻠﻄﺔ ﻓﻲ اﻟﻤﺦ ،وﺻﻮل ﻟﻜﻤﺔ ﺧﻄﺎﻓﻴﺔ ﻓﻲ اﻟﻔـﻚ اﻻﻳﻤـﻦ،
ﺻﻔﻌﺔ ﻗﻮﻳﺔ ﻓﻲ اﻟﺨﺪ اﻻﻳﺴﺮ .... ،اﻟﺦ.
آﺬﻟﻚ اﻟﺤﺎل ﻣـﻊ آﺎﺋﻨـﺎت ،Visual Basicﻓﻬـﻲ ﺗﺤﺘـﻮي ﻋﻠـﻰ ﺧﺼـﺎﺋﺺ ﺗﺤـﻮي ﺑﻴﺎﻧـﺎت
ﺧﺎﺻﺔ ﺑﻬﺎ ﻣﺜﻞ .... BackColor ،Height ،Left :اﻟﺦ ،وﻃـﺮق ﻟﺘﻔﻌـﻞ اﻓﻌـﺎل ﺧﺎﺻـﺔ ﺑﻬـﺎ
ﻣﺜﻞ .... ZOrder ،Refresh ،Move :اﻟﺦ ،واﺣﺪاث ﺗﻘﻊ ﻋﻠﻴﻬﺎ آــ ،MouseMove ،Click
.... ،KeyPressاﻟﺦ ﺗﻨﺘﺞ ﻋﻨﻬﺎ ردود ﻓﻌﻞ ﺧﺎﺻﺔ.
ﻟﻤﺎذا OOP؟
ﺑﺼﺮاﺣﺔ اﻟﻔﻮاﺋﺪ اﻟﺘﻲ ﺗﺠﻨﻴﻬﺎ ﻣﻦ OOPآﺜﻴﺮة ﺟﺪا وﻟﻜﻨﻲ ﺳﺎﺧﺘﺼﺮ ﺛﻼﺛﺔ ﻣﻨﻬﺎ:
ﻋﻨﺪﻣﺎ ﺗﻜﺒﺮ ﺣﺠﻢ اﻟﺒﺮاﻣﺞ ﺗﺰداد ﻋﻤﻠﻴـﺔ ادارﺗﻬـﺎ ﺗﻌﻘﻴـﺪا ،ﻟﻜـﻦ ﻣـﻊ OOPﻓﺎﻟﺒﺮﻧـﺎﻣﺞ -
ﻳﺘﻜﻮن ﻣﻦ ﻣﺠﻤﻮﻋﺔ آﺎﺋﻨﺎت ﺑﺤﻴﺚ اﻧﻪ ﻟﻮ ﺣﺪﺛﺖ ﻣﺸـﻜﻠﺔ ﻓـﻲ اﺣـﺪهﺎ ﻓﻜـﻞ ﻣـﺎهﻮ
ﻣﻄﻠﻮب هﻮ ﺗﻌـﺪﻳﻞ ذﻟـﻚ اﻟﻜـﺎﺋﻦ دون ان ﺗﺘـﺄﺛﺮ اﻟﻜﺎﺋﻨـﺎت اﻻﺧـﺮى ،وﺣﺘـﻰ ﻟـﻮ اردت
ﺗﻄﻮﻳﺮ اﺣﺪ اﻟﻜﺎﺋﻨﺎت ﻓﻠﺴﺖ ﻣﻀﻄﺮا اﻟﻰ ﺗﻨﻘﻴﺢ ﺁﻻف اﻻﺳﻄﺮ ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ ،وآﻞ ﻣﺎ
ﻳﺘﻮﺟﺐ ﻋﻠﻴﻚ اﻟﻘﻴﺎم ﺑﻪ هﻮ اﻻﻧﺘﻘﺎل اﻟﻰ آﻮد اﻟﻔﺌﺔ وﺗﻄﻮﻳﺮﻩ ﻓﻘﻂ.
ﺗﺼﻤﻴﻢ اﻟﺒﺮاﻣﺞ واﻟﺘﺨﻄﻴﻂ ﻟﺒﻨﻴﺘﻬﺎ اﺻـﺒﺤﺖ اﺳـﻬﻞ ﻣـﻦ اﻟﺒﺮﻣﺠـﺔ اﻻﺟﺮاﺋﻴـﺔ واﻗـﺮب -
اﻟﻰ اﻟﻌﺎﻟﻢ اﻟﺤﻘﻴﻘﻲ ،ﻓﻌﻨﺪﻣﺎ ﺗﺨﻄﻂ ﻟﺒﺮﻧﺎﻣﺞ ﺟﺪﻳـﺪ ﻓﻨﻈﺮﺗـﻚ ﺳـﺘﻜﻮن ﺑﻌﻴـﺪة ﻋـﻦ
اﻻآﻮاد وﻗﺮﻳﺒﺔ اﻟـﻰ اﻟﺘﺼـﻤﻴﻢ ﺑﺤﻴـﺚ ﺗﻨﺠـﺰ ﻣﻬﺎﻣـﻚ ﺑﺴـﺮﻋﺔ اآﺒـﺮ وﺳـﻬﻮﻟﺔ اآﺜـﺮ.
ﻓﻌﻨﺪﻣﺎ ﺗﺼﻤﻢ ﻓﺌﺔ ﺟﺪﻳﺪة ،ﻓﻠﻦ ﻳﺸﻐﻠﻚ أي آﻮد او ﻣﺘﻐﻴﺮ ﺧﺎرج هﺬﻩ اﻟﻔﺌﺔ ﻗﺪ ﻳـﺆﺛﺮ
ﻋﻠﻰ ﺳﻠﻮك ﺗﻨﻔﻴﺬ اﻻآﻮاد ،وﺳﻴﻜﻮن آﻞ ﺗﺮآﻴـﺰك ﻋﻠـﻰ هـﺬﻩ اﻟﻔﺌـﺔ وآﺄﻧﻬـﺎ اﻟﺠـﺰء
اﻟﻮﺣﻴــﺪ اﻟﻤﻮﺟــﻮد ﻓــﻲ اﻟﺒﺮﻧــﺎﻣﺞ ،ﻣﻤــﺎ ﻳﻘﻠــﻞ ﻧﺴــﺒﺔ اﻟﺸــﻮاﺋﺐ Bugsوﻋــﺪم ﺗــﺄﺛﺮ
ﻣﺘﻐﻴﺮات وﺑﻴﺎﻧﺎت ﺑﺮﻧﺎﻣﺠﻚ.
OOPﺳﺘﺠﻌﻞ ﺣﻴﺎﺗﻚ اﺳﻬﻞ ،ﻓﻠﻮ ﺗﺨﻴﻠـﺖ Visual Basicدون آﺎﺋﻨـﺎت واردت ﺗﻐﻴﻴـﺮ -
اﺳﻢ اﻟﻨﺎﻓﺬة ،ﻓﻘﺪ ﺗﻜﺘﺐ ﺷﻴﺌﺎ ﻣﺜﻞ:
151
ﺳﻤﺎت OOP
ﻣــﻦ اﻟﻀــﺮوري ان اوﺿــﺢ اﻟﻔــﺮق ﺑــﻴﻦ اﻟﻔﺌــﺔ Classواﻟﻜــﺎﺋﻦ ،Objectﻓﺎﻟﻔﺌــﺔ –ﺑﺸــﻜﻞ
ﻣﺒﺴﻂ -هﻲ ﻣﺠﺮد وﺻﻒ ﻟﺨﺼﺎﺋﺺ ،ﻃـﺮق واﺣـﺪاث اﻟﻜـﺎﺋﻦ ،ﺑﻴﻨﻤـﺎ اﻟﻜـﺎﺋﻦ هـﻮ وﺣـﺪة
ﺗﺤﺘﻮي ﻋﻠﻰ ﺑﻴﺎﻧﺎت واآﻮاد ﻣﻌﺮﻓﺔ ﻓﻲ اﻟﻔﺌﺔ .اﻋﻮد ﻟﻠﻤﺜﺎل اﻟﺴﺎﺑﻖ ،ﻓﺎﻻﻧﺴﺎن هﻮ ﻓﺌـﺔ
ﺧﻠﻘﻬﺎ اﷲ ﻋﺰ وﺟﻞ واﺻﻔﺔ ﻟﺨﺼﺎﺋﺺ ،ﻃﺮق واﺣﺪاث آﺎﺋﻨﺎت ﻣﺸﺘﻘﺔ ﻣﻨﻬﺎ ،ﻓﺄﻧﺎ –واﻋﻮذ
ﺑﺎﷲ ﻣﻦ آﻠﻤﺔ اﻧﺎ -آﺎﺋﻦ ﻟﺪي ﺧﺼﺎﺋﺺ ﻣﻦ ﻓﺌﺔ اﻻﻧﺴﺎن آﺎﻻﺳﻢ ﺗﺮآﻲ ،اﻟﻌﻤـﺮ .... 99
اﻟﺦ ،واﻧﺖ اﻳﻀﺎ آﺎﺋﻦ ﻟﺪﻳﻚ ﺧﺼﺎﺋﺺ ﻣﻦ ﻧﻔﺲ اﻟﻔﺌﺔ "اﻻﻧﺴـﺎن" آﺎﺳـﻤﻚ س ،ﻋﻤـﺮك
ص ....اﻟــﺦ .آــﺬﻟﻚ اﻟﺤــﺎل ﻣــﻊ ،Visual Basicﻓــﺎدوات اﻟــﻨﺺ Text1و Text2هــﻲ
آﺎﺋﻨﺎت ﻣﻦ اﻟﻔﺌـﺔ ،TextBoxوادوات اﻟﻌﻨـﻮان Label2 ،Label1و Labe3هـﻲ آﺎﺋﻨـﺎت
ﻣﻦ اﻟﻔﺌﺔ .Label
ﺑﻮدي ان اﻋﺮض ﻋﻠﻴﻚ ﺑﺎﺧﺘﺼﺎر اﻟﺴﻤﺎت اﻟﺜﻼث ﻟـ :OOP
اﻟﺘﻐﻠﻴﻒ:
ﻳﻘﺼﺪ ﺑﺎﻟﺘﻐﻠﻴﻒ Encapsulationﻓﻲ ﻟﻐـﺎت OOPﺑﻮﺿـﻊ ﺟﻤﻴـﻊ اﻻﺷـﻴﺎء ﻣﻌـﺎ Putting
،everything togetherﺑﺤﻴﺚ ﺗﺤﻘﻖ اﺳﺘﻘﻼﻟﻴﺔ اﻟﻜﺎﺋﻦ اﻟﻤﻄﻠﻘﺔ ﺑﺒﻴﺎﻧﺎﺗـﻪ اﻟﺨﺎﺻـﺔ ﺑـﻪ
وﺣﺘﻰ اآﻮادﻩ ،ﻣﻦ اﻟﻤﺰاﻳﺎ اﻟﺘﻲ ﻳﻘﺪﻣﻬﺎ ﻟﻚ اﻟﺘﻐﻠﻴﻒ هﻮ اﻣﻜﺎﻧﻴﺔ ﺗﻄـﻮﻳﺮ اﻟﺒﻨﻴـﺔ اﻟﺘﺤﺘﻴـﺔ
ﻟﻠﻜﺎﺋﻦ ﺑﺪون ان ﻳﺘﺄﺛﺮ ﺗﺮآﻴﺐ ﺑﺮﻧﺎﻣﺠﻚ ودون اﻟﺤﺎﺟﺔ اﻟﻰ ﺗﻌﺪﻳﻞ ﺳﻄﺮ واﺣﺪ ﻣـﻦ اآـﻮاد
اﻟﺒﺮﻧﺎﻣﺞ ،ﻣﺜﻼ ﻟﻮ ﻗﻤﺖ ﺑﺘﺼﻤﻴﻢ ﻓﺌﺔ ﻟﻠﺒﺤﺚ ﻋﻦ اﻟﻤﻠﻔﺎت واﻋﺘﻤﺪت ﻋﻠﻴﻪ ﺑﺪرﺟﺔ آﺒﻴـﺮة
ﻓﻲ ﺑﺮﻧﺎﻣﺠﻚ ،وﺑﻌﺪ ﻓﺘﺮة ﻣـﻦ اﻻﺧﺘﺒـﺎرات واﻟﺘﺠـﺎرب اﻟﻘﻮﻳـﺔ ﻻﺣﻈـﺖ ﺑـﻂء ﻓـﻲ ﻋﻤﻠﻴـﺔ
اﻟﺘﻨﻔﻴﺬ ،ﻓﻜﻞ ﻣﺎ ﺳﺘﻔﻌﻠﻪ هـﻮ ﺗﻌـﺪﻳﻞ اﻟﺒﻨﻴـﺔ اﻟﺘﺤﺘﻴـﺔ ﻟﻠﻔﺌـﺔ اﻟﺨﺎﺻـﺔ ﺑﺎﻟﺒﺤـﺚ وﺗﻄـﻮﻳﺮ
ﺧﻮارزﻣﻴــﺎت اآﻮادهــﺎ دون ﺗﻐﻴﻴــﺮ ﺳــﻄﺮ واﺣــﺪ ﻣــﻦ ﺳــﻄﻮر اﻟﺒﺮﻧــﺎﻣﺞ اﻻﺧــﺮى واﻟﺘــﻲ
ﺗﺴﺘﻌﻤﻞ هﺬﻩ اﻟﻔﺌﺔ ﺑﺎﻟﺘﺤﺪﻳﺪ.
آﻠﻤﺎ زادت اﺳﺘﻘﻼﻟﻴﺔ اﻟﻔﺌـﺔ ،آﻠﻤـﺎ زادت آﻔـﺎءة اﻋـﺎدة اﺳـﺘﺨﺪاﻣﻬﺎ ﻓـﻲ ﺑﺮﻧـﺎﻣﺞ ﺁﺧـﺮ
وﺗﻄﺒﻴﻖ اﺳﻠﻮب اﻋـﺎدة اﺳـﺘﺨﺪام اﻻآـﻮاد .Code Reusabilityﻣﺒـﺪأ اﻋـﺎدة اﺳـﺘﺨﺪام
اﻻآﻮاد ﻣﻦ اﺣﺪ اﻟﻤﺒﺎدئ اﻟﻀﺮورﻳﺔ اﻟﺘﻲ ﻳﺘﻮﺟﺐ ﻋﻠﻴﻚ ﻣﺤﺎوﻟﺔ واﻟﺘﻌـﻮد ﻋﻠـﻰ ﺗﻄﺒﻴﻘﻬـﺎ
داﺋﻤﺎ ﻓﻲ ﺑﺮاﻣﺠﻚ وﻣﺸﺎرﻳﻌﻚ اﻟﻴﻮﻣﻴﺔ ،ﺑﺤﻴﺚ ﺗﺘﻤﻜﻦ ﻣﻦ اﻻﺳﺘﻔﺎدة ﻣـﻦ اﻟﻔﺌـﺔ اﻟﺘـﻲ
ﺻﻤﻤﺘﻬﺎ ﻓﻲ اآﺜﺮ ﻣﻦ ﻣﺸﺮوع واآﺜـﺮ ﻣـﻦ ﺑﺮﻧـﺎﻣﺞ .وﺣﺘـﻰ ﺗﻨﺸـﺊ ﻓﺌـﺔ ﻗﺎﺑﻠـﺔ ﻻﻋـﺎدة
اﻻﺳﺘﺨﺪام ،ﺣﺎول داﺋﻤﺎ وﻗﺒﻞ ان ﺗﺒﺪأ ﺑﻜﺘﺎﺑﺔ ﺳﻄﺮ واﺣـﺪ ﻣـﻦ اﻟﻔﺌـﺔ ﺑﺎﺧـﺬ اﺣﺘﻴﺎﻃﺎﺗـﻚ
152
ﻟﻠﻤﺴﺘﻘﺒﻞ واﺳﺄل ﻧﻔﺴﻚ اﺳﺌﻠﺔ ﺷﺒﻴﻬﻪ ﺑـ :آﻴﻒ ﻳﻤﻜﻨﻨﻲ اﻻﺳﺘﻔﺎدة ﻣﻦ هﺬﻩ اﻟﻔﺌـﺔ
ﻓﻲ ﺑﺮﻧﺎﻣﺞ ﺁﺧﺮ؟ آﻴﻒ اﺳﻤﻲ واﺣﺪد اﻟﺨﺼﺎﺋﺺ ،اﻟﻄﺮق واﻻﺣﺪاث ﺑﺤﻴـﺚ ﺗﻜـﻮن ﻗﺎﺑﻠـﺔ
ﻟﻠﻌﻤﻞ ﻣﻊ اآﺜﺮ ﻣﻦ ﺑﺮﻧﺎﻣﺞ وﻗﺎﺑﻠﺔ ﻟﻠﺘﻄﻮﻳﺮ اﻳﻀﺎ ؟ آﻴﻒ اﺟﻌﻞ هﺬﻩ اﻟﻔﺌﺔ ﻣﺴـﺘﻘﻠﺔ ﻗـﺪر
اﻟﻤﺴﺘﻄﺎع ﻋﻦ أي اآﻮاد او آﺎﺋﻨﺎت اﺧﺮى ﻓـﻲ اﻟﺒﺮﻧـﺎﻣﺞ ﺑﺤﻴـﺚ ﻳﻤﻜﻨﻨـﻲ اﺳـﺘﺨﺪاﻣﻬﺎ
ﻓﻲ ﺑﺮﻧﺎﻣﺞ ﺁﺧﺮ؟ ....اﻟﺦ ﻣﻦ اﻻﺳﺌﻠﺔ واﻻﻋﺘﺒﺎرات اﻟﺘﻲ ﻻﺑﺪ ﻣـﻦ وﺿـﻌﻬﺎ ﻓـﻲ اﻻﻋﺘﺒـﺎر
ﻗﺒﻞ ﺑﻨﺎء اﻟﻔﺌﺔ وﻋﻨﺪ آﺘﺎﺑﺔ آﻞ اﺟﺮاء ﻣﻦ اﺟﺮاءاﺗﻬﺎ.
ﺗﻌﺪد اﻟﻮاﺟﻬﺎت:
ﺑﺒﺎﺳﻄﺔ ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت Polymorphismهﻮ ﻗﺪرة اﻟﻔﺌﺔ ﻋﻠﻰ اﺣﺘﻮاﺋﻬﺎ اآﺜـﺮ ﻣـﻦ
واﺟﻬﺔ ﺑﺤﻴﺚ ﺗﻤﻜﻨﻚ ﻣﻦ ﺗﻮﺣﻴﺪ ﻋـﺪة ﻓﺌـﺎت ﻣﺨﺘﻠﻔـﺔ ﺑﺎﺳـﻤﺎء اﻋﻀـﺎء ﻣﺘﺸـﺎﺑﻬﻪ ،ﻓﻠـﻮ
اﻣﻌﻨﺖ اﻟﻨﻈﺮ ﻗﻠﻴﻼً ﻓﻲ ادوات Visual Basicﺳﺘﺠﺪ اﻧﻬﺎ ﻣﺨﺘﻠﻔﺔ اﻟﻤﻬﺎم واﻻﻧﺠـﺎزات اﻻ
اﻧﻬــﺎ ﺗﺤﺘــﻮي ﻋﻠــﻰ ﺧﺼــﺎﺋﺺ ،ﻃــﺮق واﺣــﺪاث ﻣﺸــﺘﺮآﺔ آـــ Move ،Leftو Clickﻣﻤــﺎ
ﻳﺴﻬﻞ ﻋﻠﻴﻚ آﻤﺒﺮﻣﺞ ﺣﻔﻈﻬﺎ وﺗﻮﺣﻴﺪ اﻻﺟﺮاءات اﻟﺘﻲ ﺗﺴﺘﺨﺪم هﺬﻩ اﻻﻋﻀﺎء .اﻟﻔﺼـﻞ
اﻟﻘﺎدم ﻳﻨﺎﻗﺶ ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت ﺑﺎﻟﺘﻔﺼﻴﻞ.
اﻟﻮراﺛﺔ:
اﻟﻮراﺛﺔ Inheritanceهﻲ ﻗﺪرة ﻓﺌﺔ ﻋﻠﻰ اﺷﺘﻘﺎق اﻋﻀﺎء ﻣﻦ ﻓﺌﺔ ام ﺑﺤﻴـﺚ ﺗﺰﻳـﺪ ﻣـﻦ
ﻗﻮة اﻟﻔﺌﺔ اﻟﻮارﺛﺔ وﺗﻀﻴﻒ اﻋﻀﺎء ﺟﺪﻳـﺪة ﻟﻠﻔﺌـﺔ اﻻم ،ﻓﻠـﻮ آـﺎن ﻟـﺪﻳﻚ ﻓﺌـﺔ ﻗﻮﻳـﺔ واردت
اﺿﺎﻓﺔ ﻃﺮﻳﻘﺔ او ﺧﺎﺻﻴﺔ ﻟﻬﺎ ،ﻓـﻼ ﻳﻮﺟـﺪ داﻋـﻲ ﻻﻋـﺎدة ﺑﻨـﺎء اﻟﻔﺌـﺔ ﻣـﻦ ﺟﺪﻳـﺪ واﺿـﺎﻓﺔ
اﻟﺨﺎﺻﻴﺔ او اﻟﻄﺮﻳﻘﺔ اﻟﻤﻄﻠﻮﺑﺔ ،ﻓﻜـﻞ ﻣـﺎ ﺳـﺘﻘﻮم ﺑـﻪ هـﻲ ﻋﻤﻠﻴـﺔ اﻧﺸـﺎء ﻓﺌـﺔ ﺧﺎﻟﻴـﺔ
ﺗﻀﻴﻒ اﻟﻴﻬﺎ اﻟﺨﺎﺻﻴﺔ او اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﺗﺮﻳﺪهﺎ وﻣﻦ ﺛﻢ ﺗﺸـﺘﻘﻬﺎ ﻣـﻦ اﻟﻔﺌـﺔ اﻟﺘـﻲ ﺗﺮﻳـﺪ
ﺗﻄﻮﻳﺮهﺎ واﺿﺎﻓﺔ اﻟﺨﺎﺻﻴﺔ او اﻟﻄﺮﻳﻘﺔ ﻟﻬﺎ .اﻟﻔﺼﻞ اﻟﻘﺎدم ﻳﻨﺎﻗﺶ ﻣﺒﺪأ اﻟﻮراﺛﺔ ﺑﺎﻟﺘﻔﺼﻴﻞ.
وﺑﻬﺬا ﻧﻜﻮن ﻗﺪ اﻧﺠﺰﻧﺎ اول ﻓﺌﺔ ﺑﺎﻻﺳﻢ CPersonﺗﺤﺘـﻮي ﻋﻠـﻰ اﻟﺨﺎﺻـﻴﺘﻴﻦ sNameو
.dBirthDateﺗﺴــﺘﻄﻴﻊ اﺳــﺘﺨﺪام اﻟﻔﺌــﺔ CPersonﻓــﻲ أي ﻣﻜــﺎن داﺧــﻞ ﻣﺸــﺮوﻋﻚ،
اذهﺐ اﻟﻰ اﻟﺤﺪث Clickاﻟﺘﺎﺑﻊ ﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج واآﺘﺐ هﺬا اﻟﻜﻮد:
ﻗﻤﻨﺎ -ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ -ﺑﺎﻧﺸﺎء آﺎﺋﻨﻴﻦ Turkiو Khaledﻣـﻦ اﻟﻔﺌـﺔ اﻟﺘـﻲ ﺻـﻤﻤﻨﺎهﺎ
ﻟﻠﺘـﻮ ،CPersonوﻣـﻦ ﺛـﻢ ﻗﻤﻨـﺎ ﺑﺘﻌﻴـﻴﻦ ﻗـﻴﻢ ﻟﻠﺨﺎﺻـﻴﺘﻴﻦ sNameو dBirthDateﻟﻜــﻞ
آــﺎﺋﻦ ﻋﻠــﻰ ﺣــﺪة ،وﺧﺘﻤﻨــﺎ اﻟﻜــﻮد ﺑﻄﺒﺎﻋــﺔ ﻗــﻴﻢ اﻟﺨﺼــﺎﺋﺺ اﻟﺘﺎﺑﻌــﺔ ﻟﻠﻜــﺎﺋﻨﻴﻦ Turkiو
.Khaled
ﺻﺤﻴﺢ ان اﻟﻔﺌﺔ اﻟﺴﺎﺑﻘﺔ ﻟﻦ ﺗﻄﺒﻘﻬﺎ ﻓﻲ ﺣﻴﺎﺗﻚ اﻟﺒﺮﻣﺠﻴﺔ –ﺑﺸﻜﻞ ﺟﺎد -ﻟﻄﺒﺎﻋـﺔ ﻗـﻴﻢ
ﻣﺘﻐﻴﺮات ،اﻻ ان اﻟﻐﺮض اﻻﺳﺎﺳﻲ هﻮ ﻣﺠﺮد ﺗﻮﺿﻴﺢ ﻓﻜﺮة اﻟﻔﺌﺎت وﻃﺮﻳﻘﺔ اﺳﺘﺨﺪاﻣﻬﺎ.
ﺑﻨﺎء اﻟﻔﺌﺎت
واﻻن ﺑﻌﺪ ان ﻋﺮﻓﺘﻚ ﻋﻠﻰ اﻟﻔﻜﺮة اﻻﺳﺎﺳﻴﺔ ﻣﻦ اﻟﻔﺌﺎت Classesﺳﻨﺒﺪأ ﺑﺎﻟﺘﻮﻏﻞ ﻓـﻲ
ﺗﻔﺎﺻﻴﻞ ﺑﻨﺎء ﺧﺼﺎﺋﺼﻬﺎ ،ﻃﺮﻗﻬﺎ واﺣﺪاﺛﻬﺎ ﺣﺘﻰ ﺗﺰﻳﺪ ﻣﻦ ﻗﻮة اﻟﻔﺌﺔ.
ﺑﻨﺎء اﻟﺨﺼﺎﺋﺺ
اذا ﻋﺪﻧﺎ اﻟﻰ ﻣﺜﺎل اﻟﻔﺌﺔ CPersonاﻟﺴﺎﺑﻖ ،ﻓﺴـﻨﻼﺣﻆ ان اﻟﻤﺒـﺮﻣﺞ ﻳﺴـﺘﻄﻴﻊ اﺳـﻨﺎد
أي ﻗﻴﻤﺔ ﻟﻠﺨﺎﺻـﻴﺔ ،dBirthDateوﻗـﺪ ﻳﻌﻄـﻲ ﻓﺮﺻـﺔ ﻟﻠﻤﺴـﺘﺨﺪم ﺑﺎدﺧـﺎل اﻟﻌﻤـﺮ ﻣـﻦ
ﺧﺎﻧﺔ ﻧﺺ:
اﻟﻤﺸﻜﻠﺔ ﻓﻲ اﻟﻜـﻮد اﻟﺴـﺎﺑﻖ ،ان اﻟﻤﺴـﺘﺨﺪم ﺑﺎﻣﻜﺎﻧـﻪ ادﺧـﺎل أي ﻋـﺪد ﻳﻤﺜـﻞ ﺗـﺎرﻳﺦ
ﻣﻴﻼد اﻟﺸﺨﺺ وﻗﺪ ﻳﻜﻮن ﺗﺎرﻳﺦ ﻟﻢ ﻳﺤﻞ ﺑﻌﺪ ،ﻟﺬﻟﻚ ﻋﻠﻴﻚ اﻟﺘﺤﻘـﻖ ﻣـﻦ ﺗـﺎرﻳﺦ اﻟﻤـﻴﻼد
ﻓﻲ آﻞ ﻣﺮة ﺗﻤﻜﻦ اﻟﻤﺴﺘﺨﺪم ﻣﻦ ادﺧﺎل ﻗﻴﻤﺔ ﻟﻠﺨﺎﺻﻴﺔ :dBirthDate
ﻳﻌﻴﺐ اﻟﻜﻮد اﻟﺴﺎﺑﻖ اﻧﻪ ﻳﻠﺰﻣﻚ ﺑﻌﻤﻠﻴﺔ اﻟﺘﺤﻘﻖ ﻣﻦ اﻟﻘﻴﻤﺔ ﻓﻲ آـﻞ ﻣـﺮة ﺗﺮﻳـﺪ اﺳـﻨﺎد
ﻗﻴﻤﺔ ﻟﻠﺨﺎﺻﻴﺔ ،dBirthDateواﻟﺤﻞ هﻮ ﺑﺎﺳﺘﺨﺪام ﻧﻮع ﺧﺎص ﻣـﻦ اﻻﺟـﺮاءات ﻳﺴـﻤﻰ
اﻟﺨﺼﺎﺋﺺ واﻟﺘﻲ ﺗﻤﺜﻞ ﺧﺼﺎﺋﺺ اﻟﻜﺎﺋﻦ ﻟﺘﺤﻤﻴﻪ ﻣﻦ اﻟﻘﻴﻢ اﻟﺨﺎﻃﺌﺔ:
ﻓﻲ اﻟﺤﻘﻴﻘﺔ ،اﻇﻬﺎر رﺳﺎﻟﺔ MsgBoxﻣﻦ داﺧﻞ اﻟﻔﺌﺔ –آﻤﺎ ﻓﻲ اﻟﻜﻮد ﻣﻼﺣﻈﺔ:
اﻟﺴﺎﺑﻖ -ﻳﻌﺘﺒﺮ اﺳـﻠﻮب ﻏﻴـﺮ اﺣﺘﺮاﻓـﻲ وﺗﺼـﻤﻴﻢ ﺳـﻲء ﺟـﺪا ﻟﻠﻔﺌـﺎت
ﺧﺎﺻﺔ ﻋﻨﺪﻣﺎ ﺗﺰﻳـﺪ اﺣﺠﺎﻣﻬـﺎ ،وﻳﻔﻀـﻞ ارﺳـﺎل رﺳـﺎﻟﺔ ﺧﻄـﺄ ﺑﺎﻟﻄﺮﻳﻘـﺔ
Err.Raiseﺑــﺪﻻ ﻣــﻦ .MsgBoxاﻻ اﻧﻨــﻲ اﺳــﺘﺨﺪﻣﺖ اﻟﺪاﻟــﺔ MsgBox
ﻓﻲ اﻟﻤﺜﺎل ﻟﺘﻘﺮﻳﺐ اﻟﻔﻜﺮة اﻟﻴﻚ.
155
ﺳﻴﻨﺎرﻳﻮ ﺗﻨﻔﻴﺬ اﻻﺟﺮاءات اﻟﺴـﺎﺑﻘﺔ ﺳـﻴﻜﻮن آﺎﻟﺘـﺎﻟﻲ :ﻓـﻲ آـﻞ ﻣـﺮة ﺗﻘـﻮم ﺑﺘﻌﻴـﻴﻦ او
اﺳﻨﺎد ﻗﻴﻤﺔ ﺟﺪﻳﺪة ﻟﻠﺨﺎﺻﻴﺔ ،dBirthDateﺳﻴﺘﻢ اﺳـﺘﺪﻋﺎء اﻻﺟـﺮاء Let dBirthDate
وارﺳﺎل اﻟﻘﻴﻤﺔ اﻟﺠﺪﻳﺪة اﻟﻰ اﻟﻤﺘﻐﻴﺮ ،dNewValueوﻓﻲ آﻞ ﻣﺮة ﺗﻘـﻮم ﺑﻘـﺮاءة ﻗﻴﻤـﺔ
اﻟﺨﺎﺻﻴﺔ ،dBirthDateﺳﻴﺘﻢ اﺳﺘﺪﻋﺎء اﻻﺟـﺮاء Get dBirthDateواﻟـﺬي ﻳﻌـﻮد ﺑﻘﻴﻤـﺔ
اﻟﺨﺎﺻﻴﺔ .ﺑﺎﻣﻜﺎﻧﻚ اﻳﻀﺎ اﺿﺎﻓﺔ ﺧﺎﺻﻴﺔ ﺟﺪﻳﺪة iAgeدون اﻟﺤﺎﺟﺔ ﻟﺘﻌﺮﻳـﻒ ﻣﺘﻐﻴـﺮ ﺧـﺎص
Privateﻟﻬﺎ:
ﺗﻼﺣﻆ اﻧﻨﻲ ﻟﻢ اﺳﺘﺨﺪم اﻻ اﺟﺮاء واﺣـﺪ وهـﻮ Get iAgeوﺗﺠﺎهﻠـﺖ اﻻﺟـﺮاء Let iAge
وذﻟﻚ ﻻﻧﻲ ارﻳﺪ ان اﺟﻌﻞ اﻟﺨﺎﺻﻴﺔ iAgeﻟﻠﻘﺮاءة ﻓﻘﻂ ،Read Onlyﻓﻠﻮ ﺣﺎول اﻟﻤﺒـﺮﻣﺞ
ﺗﻌﻴﻴﻦ او آﺘﺎﺑﺔ ﻗﻴﻤﺔ ﺟﺪﻳﺪة ﻟﻠﺨﺎﺻﻴﺔ ﺳﺘﻈﻬﺮ رﺳﺎﻟﺔ ﺧﻄﺄ :Read Only Property
وﺑﺎﻣﻜﺎﻧﻚ ﺗﻄﺒﻴﻖ اﻟﻌﻜﺲ ،أي اﺳﺘﺨﺪام اﻻﺟﺮاء Property Letدون اﻻﺟﺮاء Property
Getﻟﺘﺠﻌﻞ اﻟﺨﺎﺻﻴﺔ ﻟﻠﻜﺘﺎﺑﺔ ﻓﻘﻂ :Write Only Property
اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،ﻳﻤﻜﻨـﻚ اﻟﺘﻌﺎﻣـﻞ ﻣـﻊ اﺟـﺮاءات اﻟﺨﺼـﺎﺋﺺ آـﺎﺟﺮاءات Sub’sاو Functions
ﻋﺎدﻳﺔ ﻟﺘﻤﻜﻨﻬﺎ ﻣﻦ اﺳﺘﻘﺒﺎل ﻗﻴﻢ :Parameters
وﻋﻨﺪ اﻟﺤﺪﻳﺚ ﻋﻦ اﻟﺨﺼﺎﺋﺺ اﻟﺘﻲ ﺗﻤﻜﻨﻚ ﻣﻦ اﺳﻨﺎد ﻗﻴﻢ ﻟﻜﺎﺋﻨـﺎت ،ﻓﻌﻠﻴـﻚ اﺳـﺘﺨﺪام
اﻻﺟﺮاء Property Setﻋﻮﺿﺎ ﻋﻦ اﻻﺟﺮاء :Property Let
ﺑﻨﺎء اﻟﻄﺮق
اﻟﻄﺮق Methodsﻣﺎهﻲ اﻻ اﺟﺮاءات Sub’sاو دوال Functionﻣﻌﺮﻓﺔ داﺧﻞ اﻟﻔﺌـﺔ ،وﻻ
اﻋﺘﻘﺪ اﻧﻚ ﺑﺤﺎﺟـﺔ اﻟـﻰ اﻋـﺎدة اﻟﻔﺼـﻞ اﻟﺜﺎﻟـﺚ "ﻟﻐـﺔ اﻟﺒﺮﻣﺠـﺔ "BASICﻟﺘﻔﺎﺻـﻴﻞ ﺑﻨـﺎء
اﻻﺟﺮاءات واﻟﺪوال .ﻣﻊ ذﻟﻚ ،هﺬا ﻣﺜﺎل ﻟﻄﺮﻳﻘﺔ ﺗﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ :CPerson
اﺳﺘﺪﻋﻲ اﻟﻄﺮﻳﻘﺔ ‘
_ Turki.SetData txtName, CDate(txtBirthDate), Array(txtAddress1,
)txtAddress2, txtAddress3
ﺣﺘﻰ ﻟﻮ ﻟﻢ ﺗﻘﺘﻊ ﺑﻔﻜﺮة ﺗﻌﻴﻴﻦ اﻟﺨﺼﺎﺋﺺ ﺑﺎﺳﺘﺨﺪام اﻟﻄـﺮق آﻤـﺎ ﻓـﻲ ﻣﻼﺣﻈﺔ:
اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ،ﺗﺬآﺮ ان اﺳﺘﺪﻋﺎء اﻟﻄﺮﻳﻘـﺔ اﻟﺴـﺎﺑﻘﺔ اﺳـﺮع ﺑﺨﻤـﺲ
ﻣﺮات ﻣﻦ ﺗﻌﻴﻴﻦ ﻗﻴﻤﺔ آﻞ ﺧﺎﺻﻴﺔ ﻋﻠﻰ ﺣﺪﻩ ،وﺳـﺘﺆﺛﺮ هـﺬﻩ اﻟﺴـﺮﻋﺔ
آﻠﻤﺎ آﺎﻧﺖ اآﻮاد اﻟﻜﺎﺋﻦ اﺑﻌﺪ –آﻤﻜﻮﻧﺎت COMاو .DCOM
158
ﺑﻨﺎء اﻻﺣﺪاث
ﻋﻨﺪﻣﺎ ﻧﺮﺑﻂ ﺑﻴﻦ آﻠﻤﺘﻲ اﻻﺣﺪاث واﻟﻔﺌﺎت ﻳﺘﺒﺎدر ﻟﺬهﻦ ﻣﺒﺮﻣﺠـﻲ VB4ﺣـﺪث اﻻﻧﺸـﺎء
Class_Initializeواﻻﻧﻬﺎء .Class_Terminatesﻟﻜﻦ ﻣﻊ اﻻﺻـﺪارات اﻻﺣـﺪث ،اﺻـﺒﺤﺖ
اﻟﻔﺌﺎت ﻗﺎﺑﻠﺔ ﻋﻠﻰ اﻧﺸﺎء وﺗﻌﺮﻳﻒ اﺣﺪاث ﺟﺪﻳﺪة ﻗﺎﺑﻠـﺔ ﻟﻠﺘﺼـﺮﻳﺢ ﻣـﻦ اﻟﻌﻤـﻼء Clients
اﻟﻤﺴﺘﺨﺪﻣﻴﻦ ﻟﺘﻠﻚ اﻟﻔﺌﺔ –واﻟﺬﻳﻦ ﻗﺪ ﺗﻜﻮن اﻧﺖ اﺣﺪهﻢ.
اﻟﻔﻜﺮة ﻟﻴﺴﺖ ﺻﻌﺒﺔ او ﻣﺨﺘﻠﻔﺔ ﻋﻦ اﻻﺣﺪاث اﻟﻤﻮﺟﻮدة ﻓﻲ اﻻدوات ،ﻟﻨﺄﺧﺬ ﻣﺜﻼ ﻧﺎﻓﺬة
اﻟﻨﻤﻮذج ،Formﺗﻢ ﺗﻌﺮﻳﻒ ﺣﺪث ﻓﻴﻬﺎ ﺑﺎﺳﻢ Clickوﻻﺷﺘﻘﺎق واﺳﺘﺨﺪام ذﻟـﻚ اﻟﺤـﺪث
آﻞ ﻣﺎ هﻮ ﻣﻄﻠﻮب ﻣﻨﻚ وﺿﻊ اﺳﻢ اﻟﻜﺎﺋﻦ ﺛﻢ ﺷﺮﻃﺔ ﺳـﻔﻠﻴﺔ وﻣـﻦ ﺛـﻢ اﺳـﻢ اﻟﺤـﺪث
آﻤﺎ ﻓﻲ هﺬا اﻟﻜﻮد:
ﻣﻦ هﻨﺎ ﻳﺘﻀﺢ ﻟﻨـﺎ ان اﻟﺤـﺪث ﺑﻜـﻞ ﺑﺴـﺎﻃﺔ ﻋﺒـﺎرة ﻋـﻦ اﺟـﺮاء Subﻗـﺪ ﻳﺤﺘـﻮي ﻋﻠـﻰ
ﻣﺘﻐﻴــﺮات اﺿــﺎﻓﻴﺔ Parametersآــﺎﻟﻤﻮﺟﻮدة ﻓــﻲ ﺣــﺪث MouseDownاو .KeyPress
اﻟﺬي ﺳﻨﻔﻌﻠﻪ هﻨﺎ ﺑﺎﻟﻀﺒﻂ هﻮ ﺗﻌﺮﻳﻒ ﺣـﺪث ﺑﺎﺳـﻢ DataHasBeenSentﻣﻮﺟـﻮد ﻓـﻲ
اﻟﻔﺌﺔ .CPersonوﻟﺘﻌﺮﻳﻒ هﺬا اﻟﺤﺪث اﻟﺠﺪﻳﺪ ﻓﻲ اﻟﻔﺌﺔ ﺳﻨﺴﺘﺨﺪم اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة
:Event
ﻟﻜﻦ ﻣﻬﻼ! ﻣﺘﻰ ﻳﺴﺘﻢ ﺗﻨﻔﻴﺬ هﺬا اﻟﺤﺪث؟ هﻞ ﺳﻴﻜﻮن ذﻟﻚ ﻋﻨﺪ اﺳـﺘﺨﺪام ﺧﺼـﺎﺋﺺ
وﻃــﺮق اﻟﻜــﺎﺋﻦ آــﻞ ﻣــﺮة؟ ام ﻋﻨــﺪﻣﺎ ﺗــﺰداد ﺷــﻬﻮة Visual Basicﻟﺘﻔﺠﻴــﺮ اﻻﺣــﺪاث؟
واﻟﺠﻮاب ﻓﻲ أي وﻗـﺖ ﺗﺮﻳـﺪﻩ ﻋـﻦ ﻃﺮﻳـﻖ اﺳـﺘﺨﺪام اﻟﻌﺒـﺎرة RaiseEventﻓـﻲ داﺧـﻞ
اﻟﻔﺌﺔ .اآﺘﺐ هﺬا اﻟﻜﻮد ﻓﻲ اﻟﻔﺌﺔ :CPerson
Option Explicit
واﻻن ﻧﻨﺘﻘﻞ اﻟﻰ اﻟﺠﻬﺔ اﻻﺧﺮى وﻣﻌﺮﻓﺔ آﻴﻔﻴﺔ اﻟﺘﻔﺎﻋﻞ ﻣﻊ هـﺬا اﻟﺤـﺪث آﻤـﺎ ﺗﺘﻔﺎﻋـﻞ
ﻣﻊ اﺣﺪاث اﻻدوات اﻻﺧﺮى آـ Clickوﻏﻴﺮهﺎ ،ﺗﺘﻢ اﻟﻌﻤﻠﻴﺔ ﺑﻨﻔﺲ اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﺗﺘﻌﺎﻣﻞ
ﻣﻊ اﻻدوات ﺷﺮﻳﻄﺔ:
Option Explicit
”ﺧﺎﻟﺪ“ = Khaled.sName
Caller.SendData Khaled
End Sub
ﻻ ﻳﻮﺟﺪ داﻋﻲ ﻟﻜﺘﺎﺑﺔ اﺳﻢ اﻟﺤﺪث اﻟﻄﻮﻳﻞ ﺑﻠﻮﺣـﺔ اﻟﻤﻔـﺎﺗﻴﺢ ،ﻓﺒﻤﺠـﺮد ﻣﻼﺣﻈﺔ:
ﺗﻌﺮﻳﻔﻚ ﻟﻠﺴﻄﺮ اﻟﺬي ﺗﻮﺟﺪ ﺑﻪ آﻠﻤﺔ WithEventsاﻧﺘﻘﻞ اﻟﻰ اﻟﻘﺎﺋﻤـﺔ
اﻟﻤﻨﺴﺪﻟﺔ Combo Boxﻓﻲ اﻋﻠـﻰ ﻳﺴـﺎر ﻧﺎﻓـﺬة اﻟﺘﺤﺮﻳـﺮ ﺣﺘـﻰ ﺗـﺮى
اﺳــﻢ اﻟﻜــﺎﺋﻦ MyCallerﻣــﻊ ﺑــﺎﻗﻲ اﺳــﻤﺎء اﻻدوات اﻟﻤﻮﺟــﻮدة ﻓــﻲ
اﻟﻨﺎﻓﺬة.
اﻟﻘﺎء اﻻﺣﺪاث:
ﻋــﻦ ﻃﺮﻳﻘــﺔ اﻟﻜﻠﻤــﺔ اﻟﻤﺤﺠــﻮزة WithEventsﺗﺴــﺘﻄﻴﻊ ﺗﻄﺒﻴــﻖ ﻣﺒــﺪأ اﻟﻘــﺎء اﻻﺣــﺪاث
،Event Multicastingوهﻲ ﻋﻤﻠﻴﺔ رﻣﻲ اﻻﺣـﺪاث ﻣـﻦ آـﺎﺋﻦ او اداة اﻟـﻰ ﻓﺌـﺔ آـﺎﺋﻦ
ﺁﺧﺮ ﺑﻤﺠـﺮد ﺗﻔﺠﻴـﺮ اﻟﺤـﺪث وﻗﺒـﻞ ان ﺗﻨﻔﻴـﺬ اآـﻮادﻩ .ﺳﺄوﺿـﺢ اﻟﻔﻜـﺮة ﺑﺎﻟﻤﺜـﺎل اﻟﻘـﺪﻳﻢ
اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻔﺼﻞ اﻟﺜﺎﻧﻲ "اﻟﻨﻤﺎذج واﻻدوات" وﺑﺎﻟﺘﺤﺪﻳﺪ ﻋﻨﺪ ﻓﻘﺮة "اﻟﺴـﻴﻄﺮة ﻋﻠـﻰ
اﻟﻤــﺪﺧﻼت" اﻟﺘﺎﺑﻌــﺔ ﻟﻔﻘــﺮة "أداة اﻟــﻨﺺ ،"TextBoxﺗﻼﺣــﻆ ان اﻟﻜــﻮد اﻟﻤﺴــﺘﺨﺪم
ﻟﻠﺴﻴﻄﺮة ﻋﻠﻰ اﻟﻤﺪﺧﻼت آﺎن ﻃﻮﻳـﻞ ﺟـﺪا ،وﻗـﺪ اﺗﻔﻘﻨـﺎ –ﻣﻨـﺬ اﻟﺒﺪاﻳـﺔ -اﻧـﻪ ﻣـﻦ ﻏﻴـﺮ
اﻟﻤﻌﻘﻮل اﺳﺘﺨﺪام آﻞ هﺬﻩ اﻻآﻮاد ﻟﻠﺘﺤﻘﻖ ﻣﻦ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﻳﻜﺘﺒﻬﺎ اﻟﻤﺴـﺘﺨﺪم ﻓـﻲ
ﺧﺎﻧﺔ اﻟﻨﺺ ،وﻟﻜﻦ هﻨﺎ ﺳﻨﺴﺘﺨﺪم اﻟﻜﻮد ﻣﺮة واﺣﺪة ﻓﻘﻂ ،وﺳﻨﻀﻌﻪ ﻓـﻲ ﻓﺌـﺔ ﺑﺎﺳـﻢ
:CNumTextBox
واﻻن ﻓﻲ آﻞ ﻣﺮة ﺗﺮﻳﺪ اﻧﺸﺎء اداة ﻧﺺ TextBoxﺟﺪﻳﺪة ﻻ ﺗﻘﺒﻞ اﻻ اﻻﻋﺪاد ،ﻓﻼ ﻳﻮﺟـﺪ
داﻋﻲ ﻟﻜﺘﺎﺑﺔ آﻞ اﻻآﻮاد اﻟﺴﺎﺑﻘﺔ ،واﻧﻤﺎ ﻗﻢ ﺑﺎﻟﻘﺎء ﺟﻤﻴﻊ اﺣﺪاث اداة اﻟﻨﺺ اﻟﻰ اﻟﻔﺌﺔ:
ﺗﻤﻜﻨــﺎ ﺑﺒﺴــﺎﻃﺔ ﺷــﺪﻳﺪة ﻓــﻲ اﻟﻜــﻮد اﻟﺴــﺎﺑﻖ ﻣــﻦ ﺟﻌــﻞ اﻻداﺗــﻴﻦ Text1و Text2ﻻ
ﺗﻘﺒﻼن اﻻ اﻋﺪاد ﺑﻔﻀﻞ اﻟﻘﺎء اﻻﺣﺪاث .Event Multicasting
ﻣﺜﺎل ﺗﻄﺒﻴﻘﻲ
ﺑﺎﻣﻜﺎﻧﻚ ﺗﻄﺒﻴﻖ ﻣﺌﺎت اﻻﻣﺜﻠﺔ واﻧﺸـﺎء ﻣﺌـﺎت اﻟﻔﺌـﺎت ﺣﺘـﻰ ﺗﺠﻌـﻞ ﺣﻴﺎﺗـﻚ اﺳـﻬﻞ ،اﻻ
اﻧﻨﻲ ﺳﺄآﺘﻔﻲ ﺑﺘﻄﺒﻴﻖ ﻣﺜﺎل ﺑﺴﻴﻂ ﺟﺪا ﻳﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﺜﻨﺎﺋﻴﺔ.
اﻟﻔﺌﺔ :CFile
ﻗـﺪ ﺗﺘﻌﺎﻣــﻞ آﺜﻴــﺮا ﻣــﻊ اﻟﻤﻠﻔــﺎت اﻟﺜﻨﺎﺋﻴــﺔ واﻟﺘــﻲ ﺗﺘﻄﻠــﺐ دﻗــﺔ ﻓــﻲ اﺳــﺘﺨﺪام دواﻟﻬــﺎ،
ﻋﺒﺎراﺗﻬﺎ واواﻣﺮهﺎ ،وﺑﻜﻞ ﺗﺄآﻴﺪ اﻻﺧﻄﺎء اﻟﺼﻐﻴﺮة ﺗﺴﺒﺐ اﻟـﻰ ﺗﻐﻴﻴـﺮ هﻴﺌـﺔ اﻟﻤﻠـﻒ ﻣﻤـﺎ
ﻳﻨﺘﺞ ﻋﻨﻪ ﺷﻮاﺋﺐ واﺧﻄﺎء وﻗﺖ اﻟﺘﻨﻔﻴﺬ .ﺳﻨﺼﻤﻢ ﻓﺌﺔ CFileﺗﻤﻜﻨﻨﺎ ﻣﻦ ﺗﺤﺮﻳﺮ اﻟﻤﻠﻔﺎت
اﻟﺜﻨﺎﺋﻴﺔ ﺑﻄﺮﻳﻘﺔ اﺳﻬﻞ ،ﻓﺒﺪﻻ ﻣﻦ آﺘﺎﺑﺔ هﺬﻩ اﻻآﻮاد اﻟﻤﻌﻘﺪة:
163
iFreeFile = FreeFile
Open “MyFile.TXT” For Binary As #iFreeFile
ﻟﻠﻘﺮاءة ‘
Dim sTemp As String
Print sTemp
ﻣﺎ رأﻳﻚ ﺑﻜﺘﺎﺑﺔ هﺬﻩ اﻻآﻮاد:
”MyFile.OpenFile “MyFile.TXT
”اﺳﻠﻮب آﺎﺋﻨﻲ ﺟﻤﻴﻞ“ MyFile.PutData
)Print MyFile.GetData (16
ﻻ ﻳﻘﺘﺼﺮ اﻟﻔﺮق ﺑﻴﻦ اﻻﺳﻠﻮب اﻻﺟﺮاﺋﻲ اﻻول واﻻﺳﻠﻮب اﻟﻜﺎﺋﻨﻲ اﻟﺜﺎﻧﻲ ﻋﻠﻰ اﺧﺘﺼـﺎر
ﻋﺪد ﺳﻄﻮر اﻻآﻮاد ﻓﻘﻂ ،ﺑﻞ ﺣﺘﻰ ﻓﻲ ﺣﺎﻻت ﻧﺴﻴﺎن آﺘﺎﺑـﺔ اﻻواﻣـﺮ اﻟﻀـﺮورﻳﺔ ،ﻓﻤـﺜﻼ
ﺗﻼﺣﻆ اﻧﻨﻲ ﻟﻢ اﻏﻠﻖ اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام اﻻﻣﺮ Closeﻣﻤﺎ ﻳﺆدي اﻟـﻰ اﺣﺘﺠـﺎز ﻣﺴـﺎﺣﺔ
ﺑﺎﻟﺬاآﺮة ،اﺿﻒ اﻟﻰ ذﻟﻚ اﺣﺘﺠﺎز رﻗﻢ اﻟﻤﻠﻒ وﻋﺪم اﻣﻜﺎﻧﻴﺔ اﺳﺘﺨﺪاﻣﻪ ﻟﻔﺘﺢ ﻣﻠﻒ ﺁﺧﺮ.
اﻣـﺎ ﻣـﻊ اﻻﺳـﻠﻮب اﻟﻜـﺎﺋﻨﻲ ،ﻓـﻼ ﻳﻮﺟــﺪ داﻋـﻲ ﻻن اﻏﻠـﻖ اﻟﻤﻠـﻒ ﺑﺎﺳـﺘﺪﻋﺎء اﻟﻄﺮﻳﻘــﺔ
،CloseFileﻻن اﻟﻜﺎﺋﻨﺎت ﻣﻦ اﻟﻨﻮع CFileﺗﻘـﻮم ﺑـﺎﻏﻼق ﻣﻠﻔﺎﺗﻬـﺎ ﺗﻠﻘﺎﺋﻴـﺎ ﺑﻤﺠـﺮد ﻣـﻮت
اﻟﻜﺎﺋﻦ ،ﻓﻬﺬا اﻟﻜﻮد ﻗﺪ اﺿﻔﺘﻪ ﻓﻲ ﺣﺪث اﻟﺘﺪﻣﻴﺮ ﻟﻠﻔﺌﺔ :CFile
وﻗـﺪ ﺗﻀـﻴﻒCFile.CLS ﺳﺘﺠﺪ اﻟﻜﺜﻴـﺮ ﻣـﻦ اﻟﺨﺼـﺎﺋﺺ اﻟﺘـﻲ ﻗـﺪ اﺿـﻔﺘﻬﺎ ﻓـﻲ اﻟﻤﻠـﻒ
اﻟﺘـﻲ ﺗﺤـﺪدlCursorLoc ﺧﺬ ﻣﺜﻼ هﺬﻩ اﻟﺨﺎﺻﻴﺔ.ﻋﺸﺮات اﻟﺨﺼﺎﺋﺺ ﺑﻘﺪر ﻣﺎ ﻳﺤﻠﻮ ﻟﻚ
:ﻣﻮﻗﻊ ﻣﺆﺷﺮ اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ ﻣﻦ واﻟﻰ اﻟﻤﻠﻒ
اﺳﺘﺨﺪام اﻟﻜﺎﺋﻨﺎت
ﺗﻌﺮﻓﺖ ﻓﻲ اﻟﺼﻔﺤﺎت اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ اﻟﻔﺌﺎت واﻟﻔﻜﺮة ﻣﻨﻬـﺎ وآﻴﻔﻴـﺔ ﺑﻨﺎﺋﻬـﺎ ،واﻻن ﺣـﺎن
دور اﺳﺘﺨﺪام اﻟﻔﺌﺎت واﻧﺸﺎء اﻟﻜﺎﺋﻨﺎت ﻣﻨﻬﺎ واﻟﺘﻌﺮف ﻋﻠـﻰ ﺑﻌـﺾ اﻟﺘﻔﺎﺻـﻴﻞ اﻟﻤﺘﻌﻠﻘـﺔ
ﺑﺎﻟﻜﺎﺋﻨﺎت.
ﻣﻦ اﻻﺷﻴﺎء اﻟﻌﺠﻴﺒﺔ ﺟﺪا ﺟﺪا واﻟﺘﻲ ﺗﻐﺎﻟﻂ اﻟﻤﻨﻄﻖ اﻟﺒﺮﻣﺠﻲ ،ان ﻋﻤﻠﻴﺔ اﻧﺸﺎء اﻟﻜﺎﺋﻦ
ﺑﺎﺳﺘﺨﺪام اﻟﻜﻠﻤـﺔ Newﻓـﻲ ﻧﻔـﺲ وﻗـﺖ اﻟﺘﺼـﺮﻳﺢ –أي ﻣـﻊ ﻋﺒـﺎرة Dimﻣﺜـﻞ اﻟﻜـﻮد
اﻟﺴﺎﺑﻖ -ﻻ ﺗﺆدي اﻟﻰ ﺗﻔﺠﻴﺮ ﺣﺪث اﻻﻧﺸﺎء Class_Initializeاﻟﺘﺎﺑﻊ ﻟﻠﻜﺎﺋﻦ! وﻟـﻦ ﻳـﺘﻢ
ﺗﻔﺠﻴﺮﻩ ﺣﺘﻰ ﺗﺴﺘﺨﺪم اﻟﻜﺎﺋﻦ ﻓﻲ اآﻮادك .واﻟﺴﺒﺐ اﻟﻐﺮﻳﺐ ﺟﺪا –ﺑﺎﻟﻨﺴـﺒﺔ ﻟـﻲ -هـﻮ
ان Visual Basicﻟﻦ ﻳﻘﻮم ﻓﻌﻠﻴﺎ ﺑﺎﻧﺸﺎء اﻟﻜﺎﺋﻦ ﺣﺘﻰ ﺗﺬآﺮﻩ وﺗﺴـﺘﺨﺪﻣﻪ ﻓـﻲ اآـﻮادك،
ﺑﺎﻟﺮﻏﻢ ﻣﻦ اﻧﻨﺎ اﺳﺘﺨﺪﻣﻨﺎ اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Newﻋﻨﺪ اﻟﺘﺼﺮﻳﺢ ﻻﻧﺸﺎءﻩ!
اﻟﻌﺒﺎرة :Set
ﺗﺴﺘﺨﺪم اﻟﻌﺒﺎرة Setﻓﻲ اﻟﻌﺎدة ﻻﺳﻨﺎد آﺎﺋﻦ اﻟﻰ ﺁﺧﺮ:
ﻣﻦ اﻟﻀﺮوري اﺳﺘﺨﺪام اﻟﻌﺒﺎرة Setﻋﻨﺪ اﺳﻨﺎد اﻟﻜﺎﺋﻨﺎت ،ﻻﻧـﻚ ان ﻟـﻢ ﺗﺴـﺘﺨﺪﻣﻬﺎ ﻗـﺪ
ﺗﻈﻬﺮ ﻟﻚ رﺳﺎﻟﺔ ﺧﻄﺄ او ﺣﺘﻰ ﻧﺘـﺎﺋﺞ ﻏﻴـﺮ ﻣﺘﻮﻗﻌـﺔ ،ﻓﻠـﻮ اﻓﺘﺮﺿـﻨﺎ ان اﻟﻜـﺎﺋﻨﻴﻦ Turkiو
Khaledﻟﻬﻤﺎ ﺧﺎﺻﻴﺔ اﻓﺘﺮاﺿﻴﺔ واﺣﺪة هﻲ ،sNameوﻗﻤﺖ ﺑﺎﺳﻨﺎد ﻗﻴﻤﺔ اﻟﻜﺎﺋﻦ اﻻول
اﻟﻰ اﻟﺜﺎﻧﻲ دون اﺳﺘﺨﺪام اﻟﻌﺒﺎرة :Set
Khaled = Turki
ﻓﺎﻧﻚ ﻓﻲ اﻟﺤﻘﻴﻘﺔ ﻟﻢ ﺗﺴﻨﺪ اﻻ ﻗﻴﻤﺔ ﺧﺎﺻـﻴﺔ اﻟﻜـﺎﺋﻦ اﻻول اﻻﻓﺘﺮاﺿـﻴﺔ اﻟـﻰ اﻟﺨﺎﺻـﻴﺔ
اﻻﻓﺘﺮاﺿﻴﺔ ﻟﻠﻜﺎﺋﻦ اﻟﺜﺎﻧﻲ ،أي ان ﺣﻘﻴﻘﺔ اﻟﻜﻮد اﻟﺴﺎﺑﻖ هﻲ:
Khaled.sName = Turki.sName
اﻟﻤﻌﺎﻣﻞ :Is
ﺗﺴﺘﺨﺪم هﺬا اﻟﻤﻌﺎﻣﻞ ﻟﻤﻌﺮﻓﺔ ﻣﺎ اذا آﺎﻧﺎ اﻟﻤﺘﻐﻴﺮان ﻳﺸﻴﺮان اﻟﻰ ﻧﻔﺲ اﻟﻜﺎﺋﻦ:
وﻳﻤﻜﻨﻚ اﻳﻀﺎ ﻣﻌﺮﻓﺔ ﻣﺎ اذا آﺎن اﻟﻜﺎﺋﻦ ﺣﻲ ﻳﺮزق وﻳﺘﺒﻊ ﻟﻔﺌﺔ او ﻻ:
اﻣــﺎ ﻣﻌﺎﻣــﻞ اﻟﻤﺴــﺎواة ﻓــﺎرﺟﻮ ان ﺗﻨﺴــﻰ ﻓﻜــﺮة اﺳــﺘﺨﺪاﻣﻪ ﻟﻠﺘﺤﻘــﻖ ﻣــﻦ ﻣﺴــﺎواة
اﻟﻜﺎﺋﻨﺎت ،ﻓﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ:
اﻟﺪاﻟﺔ :TypeName
اﻟﺪاﻟﺔ TypeNameﺗﻌﻮد ﺑﻘﻴﻤﺔ ﺣﺮﻓﻴﺔ ﺗﻤﺜﻞ اﺳﻢ اﻟﻔﺌﺔ اﻟﺘﺎﺑﻊ ﻟﻬﺎ اﻟﻜﺎﺋﻦ:
اﻟﻘﻴﻤﺔ :Nothing
ﺑﺎﻣﻜﺎﻧﻚ اﻟﻐﺎء اﻟﻜﺎﺋﻦ ﻓﻲ أي وﻗﺖ ﺑﻤﺠﺮد اﺳﻨﺎد اﻟﻘﻴﻤﺔ Nothingاﻟﻴﻪ:
اﻟﻤﺆﺷﺮان ‘
‘ X, Y
ﻳﺸﻴﺮان اﻟﻰ ﻧﻔﺲ اﻟﻜﺎﺋﻦ ‘
Set Y = X
168
Y.Value = 100
X.Value = 200
ﻋﻨﺪﻣﺎ ﻳﺘﻢ ﺗﻨﻔﻴﺬ اﻟﺴﻄﺮ Set Y = Xﻓﺎن اﻟﻤﻨﻄﻘﺔ ﻣـﻦ اﻟـﺬاآﺮة اﻟﺘـﻲ آـﺎن ﻳﺸـﻴﺮ ﻟﻬـﺎ
اﻟﻤﺘﻐﻴــﺮ -اﻟﻤﺆﺷــﺮ X -اﺻــﺒﺤﺖ ﻧﻔــﺲ اﻟﻤﻨﻄﻘــﺔ اﻟﺘــﻲ ﻳﺸـﻴﺮ ﻟﻬــﺎ اﻟﻤﺘﻐﻴــﺮ -اﻟﻜــﺎﺋﻦY -
واﻟﺪﻟﻴﻞ ﻋﻠﻰ ذﻟﻚ ،اﻧﻨﻲ ﻋﻨـﺪﻣﺎ ﻗﻤـﺖ ﺑﺘﻌـﺪﻳﻞ ﻗﻴﻤـﺔ اﻟﺨﺎﺻـﻴﺔ X.Value = 200ﻓـﺎن
اﻟﺨﺎﺻﻴﺔ Y.Valueﺗﺄﺛﺮت ﺑﺴﺒﺐ اﻟﺘﻌﺪﻳﻞ وذﻟﻚ ﻻن Xو Yﻣﺘﻐﻴﺮان )آﺎﺋﻨـﺎن ،ﻣﺆﺷـﺮان(
ﻳﺸﻴﺮان اﻟﻰ ﻧﻔﺲ اﻟﻤﻨﻄﻘﺔ ﻣﻦ اﻟﺬاآﺮة اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠـﻰ ﺑﻴﺎﻧـﺎت ﺗﺘﻌﻠـﻖ ﺑﺎﻟﻜـﺎﺋﻦ X
وﻟﻴﺲ ﻣﻨﻄﻘﺘﻴﻦ ﻣﺨﺘﻠﻔﺘﻴﻦ .وﺑﻜﻞ ﺗﺄآﻴﺪ ﺳﺘﺴﺄل ﻧﻔﺴـﻚ ﻋـﻦ اﻟﻤﻨﻄﻘـﺔ اﻟﺘـﻲ آﺎﻧـﺖ
ﻣﺨﺼﺼﺔ ﻟﻠﻜﺎﺋﻦ Yﻣﺎ هﻲ اﺧﺒﺎرهﺎ ﻳﺎ ﺗﺮى؟ اﺧﺒﺎرهﺎ ﻳﺎ ﻗﺎرﺋﻲ اﻟﻌﺰﻳـﺰ ﻓـﻲ اﻟﻤﺸـﻤﺶ!
ﻻﻧﻬﺎ ﻗﺪ اﺧﺘﻔﺖ ﻣﻦ اﻟﺬاآﺮة واﻧﺘﻬﺖ أي ﺑﻌﺒﺎرة ﻟﻐﻮﻳﺔ ﻣﺎﺗﺖ وﺳﺘﻌﺮف اﻟﺴﺒﺐ ﻻﺣﻘﺎ.
اﻟﻤﺆﺷﺮ :VTable
ﺗﻔﺎﺻﻴﻞ هﺬا اﻟﻤﺆﺷﺮ ﻻﺗﻬﻢ ﻣﺒﺮﻣﺠـﻲ Visual Basicﺑﻘـﺪر ﻣـﺎ ﺗﻬـﻢ ﻣﺒﺮﻣﺠـﻲ COMو
،C++ﻟﻜﻦ ﻣﺎ اﺳﺘﻄﻴﻊ ﻗﻮﻟﻪ هﻮ ان VTableﻋﺒﺎرة ﻋﻦ ﻣﺆﺷﺮ اﻟﻰ ﺗﺮآﻴﺐ ﻓﻲ ﻣﻨﻄﻘﺔ
اﺧﺮى ﺑﺎﻟﺬاآﺮة ﺗﻤﺜﻞ ﻣﻮاﻗﻊ ﺗﻨﻔﻴﺬ اﻻﺟﺮاءات -اﻟﻄﺮق -Methodsوﺑﺪاﻳﺔ آﻞ اﺟﺮاء ﺣﺘﻰ
169
ﻳﺘﻢ ﺗﻨﻔﻴﺬ اآﻮادﻩ .آﻞ ﻣﺆﺷﺮات VTableاﻟﺘﺎﺑﻌﺔ ﻟﻠﻜﺎﺋﻨـﺎت ﺗﺸـﻴﺮ اﻟـﻰ ﻧﻔـﺲ اﻟﺘﺮآﻴـﺐ
ﻓﻲ ﺣﺎﻟﺔ آﻮن اﻟﻜﺎﺋﻨﺎت ﻣﻦ ﻧﻔـﺲ اﻟﻔﺌـﺔ .ﻓﻠﻜـﻞ ﻓﺌـﺔ ﺟـﺪول VTableﻣﺴـﺘﻘﻞ ﺧـﺎص
ﺑــﺎﺟﺮاءات ﺗﻠــﻚ اﻟﻔﺌــﺔ ،وﻟﻜــﻞ آــﺎﺋﻦ ﻣﺆﺷــﺮ ﺧــﺎص ﺑــﻪ ﻳﺸــﻴﺮ اﻟــﻰ اﻟﺘﺮآﻴــﺐ VTable
اﻟﻤﺘﻮاﻓﻖ ﻣﻊ اﻟﻔﺌﺔ اﻟﻤﻨﺸﺄ ﻣﻨﻬﺎ ،ﻓﻬﻨﺎ:
ﺗﻮﺟﺪ ﺛﻼث ﻣﺆﺷﺮات VTableﺧﺎﺻﺔ ﻟﻠﻜﺎﺋﻨﺎت Xو Yو Zﺗﺸـﻴﺮ اﻟـﻰ ﺗـﺮآﻴﺒﻴﻦ VTable
ﺧﺎﺻﻴﻦ ﻟﻠﻔﺌﺘﻴﻦ MyClassو .YourClass
اﻟﻌﺪاد :Counter
اﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ ﻣﻦ هﺬﻩ اﻟﻤﻨﻄﻘﺔ ﺣﺠﻤـﻪ 4ﺑﺎﻳـﺖ وهـﻮ ﻋﺒـﺎرة ﻋـﻦ ﻋـﺪاد ﻳﻤﺜـﻞ ﻋـﺪد
اﻟﻤﺆﺷﺮات اﻟﺘﻲ ﺗﺸﻴﺮ اﻟﻰ هﺬﻩ اﻟﻤﻨﻄﻘﺔ .ﻳﺒﺪأ اﻟﻌـﺪاد ﺑﺎﻟﻘﻴﻤـﺔ واﺣـﺪ ﻋﻨـﺪﻣﺎ ﺗﻨﺸـﺊ
اﻟﻜﺎﺋﻦ ،وﻳﺰﻳﺪ آﻠﻤﺎ وﺟﺪ ﻣﺆﺷﺮ اﺧﺮ ﻳﺸﻴﺮ اﻟﻰ ذﻟـﻚ اﻟﻌـﺪاد .ﻋﻨـﺪﻣﺎ ﻳﺼـﻞ اﻟﻌـﺪاد اﻟـﻰ
اﻟﺼﻔﺮ )أي ﻻ ﻳﻮﺟﺪ ﻣﺆﺷﺮ ﻳﺸﻴﺮ اﻟﻰ ﺗﻠﻚ اﻟﻤﻨﻄﻘﺔ( ﻓـﺎن اﻟﻤﻨﻄﻘـﺔ ﻳـﺘﻢ ﺗﺤﺮﻳﺮهـﺎ ﻣـﻦ
اﻟﺬاآﺮة وﺗﺨﺘﻔﻲ ،وهﺬا ﺟﻮاب واﺿﺢ ﻟﻠﺴﺆال ﻣﺘﻰ ﻳﻤﻮت اﻟﻜﺎﺋﻦ؟ راﻗﺐ هﻨﺎ:
وﺣﺠﻢ اﻟﻤﺘﻐﻴﺮات اﻟﺘﺎﺑﻌﺔ ﻟﻪ .ﻓﻤﺜﻼ ،اذا اﺣﺘﻮى اﻟﻜﺎﺋﻦ ﻋﻠﻰ ﻣﺘﻐﻴـﺮﻳﻦ ﻣـﻦ ﻧـﻮع ،Long
ﻓﺎن ﺣﺠﻢ هﺬا اﻟﻘﺴﻢ هﻮ 8ﺑﺎﻳﺖ.
ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ:
اود ان اوﺿﺢ اﻻﻗﺴﺎم اﻟﺜﻼﺛﺔ ﺑﻤﺜﺎل ﻣـﻊ ﺷـﻜﻞ ﺗﻮﺿـﻴﺤﻲ ﻟـﻪ .ﺑـﺎﻓﺘﺮاض ان ﻟـﺪﻳﻨﺎ ﻓﺌـﺔ
ﺑﺎﺳﻢ MyClassﺗﺤﺘﻮي ﻋﻠـﻰ ﻃـﺮﻳﻘﺘﻴﻦ MyMethod1و MyMethod2ﺑﺎﻻﺿـﺎﻓﺔ اﻟـﻰ
ﻣﺘﻐﻴﺮﻳﻦ ﻋﺎﻣﻴﻦ Publicﺑﺎﺳﻢ Value1و .Value2ﻓﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ:
ﻗﺪ ﻻ ﺗﻬﻤﻚ آﺜﻴـﺮا اﻟﻤﺮﺑﻌـﺎت اﻟﻤﻮﺟـﻮدة ﻓـﻲ اﻟﺸـﻜﻞ ،1-5وﻟﻜـﻦ اﺳـﺘﻴﻌﺎﺑﻬﺎ ﻣﺴـﺄﻟﺔ
ﺿﺮورﻳﺔ ﻟﺘﻌﺮﻳﻒ ﻓﻜﺮة اﻟﺮﺑﻂ – Bindingﻋﻨـﻮان اﻟﻔﻘـﺮة اﻟﺘﺎﻟﻴـﺔ -او ﺣﺘـﻰ اﻻﺣﺘـﺮاف ﻓـﻲ
ﺑﺮﻣﺠﺔ ﻣﻜﻮﻧﺎت COMوهﻮ ﻣﺎ ﺳﻨﺘﻄﺮق إﻟﻴﻪ ﻓﻲ اﻟﻔﺼﻮل اﻟﻼﺣﻘﺔ.
اﻟﺮﺑﻂ Binding
ﻋﻤﻠﻴﺔ اﻟﺮﺑﻂ هﻲ ﺑﺎﺧﺘﺼﺎر رﺑﻂ اﻋﻀﺎء Membersاﻟﻜﺎﺋﻦ ﺳﻮاء آﺎﻧﺖ ﺧﺼﺎﺋﺺ او ﻃـﺮق
ﺑﺎﻟﻤﺆﺷــﺮ اﻟــﺬي ﻳﻤﺜــﻞ اﻟﻜــﺎﺋﻦ وﺗﺤﺪﻳــﺪ ﻣﻮاﻗــﻊ اﻻﺟــﺮاءات ﻓــﻲ اﻟﺠــﺪول .VTableﻣــﻦ
اﻟﻤﻌﺮوف ان اﻟﻄﺮق ﻣﻮﺟﻮدة ﻓﻲ ﻣﻮاﻗﻊ ﻓﻲ اﻟﺬاآﺮة ﻓﻲ اﻟﺠﺪول VTableﻟﻜـﻦ ﻋﻤﻠﻴـﺔ
اﻟﻮﺻﻮل ﻟﻬﺎ ﻟﻴﺴﺖ ﻣﺒﺎﺷﺮة اﺣﻴﺎﻧﺎ ،راﻗﺐ هﻨﺎ:
Dim X As Object
If Y = True Then
Set X = New MyClass
Else
Set X = New YourClass
End
X.MyMethod
172
ﻓﻲ اﻟﺴﻄﺮ اﻻﺧﻴﺮ ﻗﻤﺖ ﺑﺎﺳﺘﺪﻋﺎء اﻟﻄﺮﻳﻘﺔ MyMethodاﻟﺘﺎﺑﻌﺔ ﻟﻠﻜﺎﺋﻦ ،Xوﻟﻜﻦ ﻣﺎهﻮ
اﻟﻜﺎﺋﻦ X؟ هﻞ هﻮ ﺗﺎﺑﻊ ﻟﻠﻔﺌﺔ MyClassام اﻟﻔﺌﺔ YourClass؟ ﻻ ﻧﺴﺘﻄﻴﻊ ﻣﻌﺮﻓـﺔ ذﻟـﻚ
اﻻ ﻓﻲ وﻗـﺖ اﻟﺘﻨﻔﻴـﺬ ﺣﺘـﻰ ﺗﺘﻀـﺢ اﻻﻣـﻮر ﻟــ ،Visual Basicﻻﻧـﻪ ﻳﺤﺘـﺎج اﻟـﻰ ﻣﻌﺮﻓـﺔ
ﺗﺮآﻴﺐ اﻟﺠﺪول VTableﻣﺎ اذا آـﺎن ﻳﻮﺟـﺪ ﺑـﻪ دﻋـﻢ ﻟﻠﻄﺮﻳﻘـﺔ MyMethodاو ﻻ،واﻟﺘـﻲ
ﺑﺪورهﺎ ﺳﺘﺄﺧﺬ وﻗﺖ اﻃﻮل ﺑﻜﺜﻴﺮ ﻣﻦ اﻟﻮﺻﻮل اﻟـﻰ اﺟـﺮاء ﻟﻜـﺎﺋﻦ ﻣﻌـﺮف اﻟﻨـﻮع ﺳـﺎﺑﻘﺎ.
ﻟﺬﻟﻚ ،اﺗﻜﻠﻢ ﻋﻦ ﻧﻮﻋﻴﻦ ﻣﻦ اﻧﻮاع اﻟﺮﺑﻂ هﻤﺎ:
ﻧﻘﻄﺔ اﺧﺮى ﺣﻮل ﻣﻮت اﻟﻜﺎﺋﻨﺎت -ﻧﺴﺄل اﷲ ﻃﻮﻟﺔ اﻟﻌﻤﺮ -هـﻲ ان اﻟﻜﺎﺋﻨـﺎت ﻟﻬـﺎ ﻧﻈـﺎم
ﻳﻤﻨﻊ ﻣﻮت اﻟﻜﺎﺋﻦ اذا ﻣﺎ آﺎن اﺣﺪ اﺟﺮاءاﺗﻪ ﻗﻴﺪ اﻟﺘﻨﻔﻴﺬ .وﺑﻤﻌﻨﻰ ﺁﺧﺮ ،ﻟﻨﻔﺘـﺮض ان اﺣـﺪ
اﺟﺮاءات اﻟﻜﺎﺋﻦ ﻳﻘـﻮم ﺑﻘﺘـﻞ ﻧﻔﺴـﻪ ) Set X = Nothingاآﻴـﺪ اﻟﻤﺘﻐﻴـﺮ Xﻣﺆﺷـﺮ ﻋـﺎم(
ﻓﻼﺑﺪ ان ﺗﻌﻠﻢ ان Visual Basicراﻗﻲ ﺟﺪا ﺟﺪا وﻳﻌﻠﻢ آﻴﻒ ﻳﺘﻌﺎﻣﻞ ﻣﻊ هﺬﻩ اﻟﻨﻮع ﻣـﻦ
اﻟﻜﺎﺋﻨﺎت! ،ﻓﺴﻴﻘﻮم ﺑﺎﺳﻠﻮب ﻣﻬﺬب ﺟﺪا اﻋﻄﺎء ﻓﺮﺻﺔ ﻟﻠﻜﺎﺋﻦ ﺣﺘﻰ ﻳﻨﻬﻲ اﺟﺮاءﻩ اﻟﺬي
ﻳﺘﻢ ﺗﻨﻔﻴﺬﻩ وﻣﻦ ﺛﻢ ﻳﻘﻮم ﺑﺘﻔﺠﻴﺮ اﻟﺤﺪث Class_Terminateوﻗﺘﻞ اﻟﻜﺎﺋﻦ .اﺣﺴـﻦ اﷲ
ﻋﺰاآﻢ.
End Sub
End Sub
175
اﻟﻔﺼﻞ اﻟﺴﺎدس
ﺗﻌﺪد اﻟﻮاﺟﻬﺎت واﻟﻮراﺛﺔ
ﺗﺤﺪﺛﺖ ﻓﻲ اﻟﻔﺼـﻞ اﻟﺴـﺎﺑﻖ ﻋـﻦ اﻟﻔﺌـﺎت واﻟﻜﺎﺋﻨـﺎت ،وذآـﺮت اﻧـﻪ آﻠﻤـﺎ آﺎﻧـﺖ اﻟﻔﺌـﺔ
ﻣﺴﺘﻘﻠﺔ آﻠﻤـﺎ زادت اﻣﻜﺎﻧﻴـﺔ اﻋـﺎدة اﺳـﺘﺨﺪاﻣﻬﺎ ﻓـﻲ ﺗﻄﺒﻴﻘـﺎت اﺧـﺮى ،اﻻ اﻧـﻚ ﻓـﻲ
ﺣﺎﻻت آﺜﻴﺮة ﺗﻮد ﺗﻮزﻳﻊ اﻻآﻮاد ﺑﻴﻦ ﻋﺪة ﻓﺌﺎت وﺗﺤﺎول ﺗﻄﺒﻴﻖ رواﺑﻂ ﺑـﻴﻦ اﻟﻔﺌـﺎت ﻟﺘـﻮﻓﺮ
ﻋﻠﻴﻚ ﻋﻨﺎء اﻋﺎدة آﺘﺎﺑﺔ اﻻآﻮاد اﻟﻤﺘﻜﺮرة وﺗﺴﻬﻴﻞ ﺣﻴﺎﺗﻚ اﻟﺒﺮﻣﺠﻴﺔ ﺑﺸﻜﻞ اﻓﻀﻞ .ﻓـﻲ
هﺬا اﻟﻔﺼﻞ ﺳﺄﺗﻄﺮق اﻟﻰ ﻣﻮاﺿﻴﻊ ﻣﺘﻘﺪﻣﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟـﻪ واﺗﺤـﺪث ﻋـﻦ
ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت وﻣﺒﺪأ اﻟﻮراﺛﺔ ،واﺧﺘﻢ اﻟﻔﺼﻞ ﺑﺎﻟﺘﺤﺪث ﻋﻦ ﻓﻜﺮة اﻻهﺮام اﻟﻜﺎﺋﻨﻴﺔ.
ﺗﻌﺪد اﻟﻮاﺟﻬﺎت
ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت Polymorphismﻣﻦ اﻟﻤﺒﺎدئ اﻟﺘﻲ ﻻﺑﺪ ﻣﻦ ﺗﻮﻓﺮهـﺎ ﻓـﻲ أي ﻟﻐـﺔ
ﺑﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ .OOPوﻣﻦ ﺣﺴﻦ اﻟﺤﻆ Visual Basicﻳﺪﻋﻢ اﻟﻔﻜﺮة اﻻﺳﺎﺳـﻴﺔ
ﻣﻦ هﺬا اﻟﻤﺒﺪأ ،ﺳﺄﺷﺮح ﻓﻲ هﺬﻩ اﻟﻔﻘـﺮة ﻃﺮﻳﻘـﺔ ﺗﻄﺒﻴـﻖ ﻣﺒـﺪأ ﺗﻌـﺪد اﻟﻮﺟﻬـﺎت آﻤـﺎ
اﺗﻄﺮق اﻟﻰ اﻟﻔﺌﺎت اﻟﻤﺠﺮدة .Abstract Classes
اﻟﺘﻌﺮﻳﻒ اﻟﺒﺮﻣﺠﻲ ﻟﻤﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت هﻮ :اﺳﻤﺎء ﻣﺘﺸـﺎﺑﻬﺔ ﻟﻜـﻦ اﻧﺠـﺎزات ﻣﺨﺘﻠﻔـﺔ
.Same names but different implementationsاﻟﻤﻘﺼـﺪ ﻣـﻦ ذﻟـﻚ ،اﻧﻨـﺎ ﻧﺴـﺘﻄﻴﻊ
اﺳــﺘﺪﻋﺎء ﻃــﺮق وﺧﺼــﺎﺋﺺ ﻣﺘﺸــﺎﺑﻬﺔ اﻻﺳــﻢ ﻟﻔﺌــﺎت ﻣﺨﺘﻠﻔــﺔ اﻟﺒﻨﻴــﺎن أي ﺑﺎﻧﺠــﺎزات
ﻣﺨﺘﻠﻔﺔ .ﻣﺜﺎل ،ﻧﻔﺘﺮض ان ﻟﺪﻳﻨﺎ ﻓﺌﺘﻴﻦ اﻻوﻟـﻰ CPersonواﻟﺜﺎﻧﻴـﺔ ،CCarآـﻼ اﻟﻔﺌﺘـﻴﻦ
ﻳﻮﺟــﺪ ﺑﻬﻤــﺎ ﻃﺮﻳﻘــﺔ ﺧﺎﺻــﺔ ﺑﺎﻟﺘﺤﺮﻳــﻚ ﺗﺴــﻤﻰ ،Moveوﺑﺎﻟﺘــﺎﻟﻲ ﻧﺴــﺘﻄﻴﻊ اﺳــﺘﺪﻋﺎء
اﻟﻄﺮﻳﻘﺘﻴﻦ ﺑﺎﺳﻤﺎﺋﻬﻤﺎ CPerson.Move :و .CCar.Moveﻟﻜـﻦ اﻟﻘﻀـﻴﺔ هﻨـﺎ ان ﻋﻤﻠﻴـﺔ
اﻧﺠﺎز اﻟﻄﺮﻳﻘﺔ ﻣﺨﺘﻠﻔﺔ رﻏﻢ ﺗﺸﺎﺑﻪ اﺳﻤﺎﺋﻬﺎ ،ﻓﻤﻦ اﻟﻤﻌﺮوف ان اﻟﺸـﺨﺺ ﻳﺘﺤـﺮك ﻋـﻦ
ﻃﺮﻳﻖ ﻗﺪﻣﻴﻪ اﻣﺎ اﻟﺴﻴﺎرة ﻓﺒﻼ ﺷﻚ ﺗﺘﺤﺮك ﻋﻦ ﻃﺮﻳﻖ اﻻرﺑـﻊ ﻋﺠـﻼت ﺑﻬـﺎ ،وهـﺬا هـﻮ
ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮﺟﻬﺎت.
اﻟﻤﺰاﻳﺎ اﻟﺘﻲ ﺗﺠﺪهﺎ ﻣﻦ ﺗﻌﺪد اﻟﻮاﺟﻬﺎت آﺜﻴﺮة وﻟﻌﻞ اﻟﻤﻴﺰة اﻟﺤﻘﻴﻘﻴﺔ هﻲ اﻧﻬـﺎ ﺗﺨﺘﺼـﺮ
ﻋﻠﻴﻚ اﻟﻜﺜﻴﺮ ﻣﻦ ﻣﺌﺎت ﺟﻤـﻞ اﻟﺸـﺮط آــ Select Caseوﻏﻴﺮهـﺎ .ﻓﻘـﺪ ﺗﻼﺣـﻆ ان ﻣﺒـﺪأ
ﺗﻌﺪد اﻟﻮاﺟﻬﺎت ﻣﻄﺒﻖ ﻓﻲ اﻻدوات اﻟﺘـﻲ ﺗﻀـﻌﻬﺎ ﻋﻠـﻰ ﻧﺎﻓـﺬة اﻟﻨﻤـﻮذج وذﻟـﻚ ﺑﺴـﺒﺐ
وﺟﻮد اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﻤﺸـﺘﺮآﺔ ﺑـﻴﻦ اﻻدوات آﺨﺎﺻـﻴﺔ Leftاو Nameوﻏﻴﺮهـﺎ،
176
ﻓﻠﻮ ﻃﻠﺒﺖ ﻣﻨﻚ اﺣﺪ اﻻﻳﺎم آﺘﺎﺑﺔ اﺟﺮاء ﻳﻘﻮم ﺑﻤﺤﺎذاة اداة اﻟـﻨﺺ TextBoxﻓـﻲ وﺳـﻂ
اﻟﻨﺎﻓﺬة ،ﻓﺴﺘﻜﻮن ﺣﺼﻴﻠﺔ اﺻﺎﺑﻌﻚ اﻟﻨﺎﻋﻤﺔ اﻟﻜﻮد اﻟﺘﺎﻟﻲ:
وﻟﻮ آﺎﻧﺖ ﻋﻼﻗﺘﻨﺎ ﺣﻤﻴﻤـﺔ ﺟـﺪا وﻃﻠﺒـﺖ ﻣﻨـﻚ اﺟـﺮاء ﺁﺧـﺮ ﻳﻘـﻮم ﺑﻤﺤـﺎذاة اداة اﻟﻌﻨـﻮان
،Labelﻓﺎﻋﺘﻘﺪ اﻧﻚ ﺳﺘﻜﺘﺐ اﻻﺟﺮاء اﻟﺘﺎﻟﻲ:
وﻻ اﻋﺘﻘﺪ اﻧﻚ ﻋﻠﻰ اﺳـﺘﻌﺪاد ﻟﻜﺘﺎﺑـﺔ 18اﺟـﺮاء اﺧـﺮ ﻟﺘﻮﺳـﻴﻂ اﻻدوات اﻟﺜﻤﺎﻧﻴـﺔ ﻋﺸـﺮ
اﻻﺧﺮى ﺣﺘﻰ ﻟﻮ آﺎﻧﺖ ﻋﻼﻗﺘﻨﺎ ﻋﺎﻃﻔﻴﺔ! ﺑﻞ ﺳﺘﻜﻮن ﻣﺒﺮﻣﺞ آﺎﺋﻨﻲ اﻟﺘﻮﺟﻪ اآﺜﺮ وﺗﻜﺘـﺐ
اﺟﺮاء واﺣﺪ ﻳﻤﻜﻦ ان ﻳﺴﺘﻘﺒﻞ أي اداة ﻣﻬﻤﺎ آﺎن ﻧﻮﻋﻬﺎ:
ﻣﻦ اﻻﺟﺮاء اﻟﺴـﺎﺑﻖ ﻳﺘﻀـﺢ ﻟﻨـﺎ ﺟﻤـﺎل ،ﻗـﻮة ،اﺑـﺪاع ،ﻣﺮوﻧـﺔ ،ﻓـﻦ ،وﺳـﺤﺮ ﻣﺒـﺪأ ﺗﻌـﺪد
اﻟﻮاﺟﻬﺎت ﻓﺎﻟﻔﺌﺔ TextBoxﻟﻬﺎ واﺟﻬـﺔ اﺧـﺮى ﺑﺎﺳـﻢ Controlﺗﺤﺘـﻮي ﻋﻠـﻰ اﻟﻄﺮﻳﻘـﺔ
Moveﺣﺎﻟﻬﺎ آﺤﺎل ﺟﻤﻴﻊ اﻻدوات اﻻﺧﺮى .اﻟﻮاﺟﻬﺔ Controlهﻲ ﻋﺒﺎرة ﻋﻦ ﻓﺌﺔ ﻟﻜﻨﻬﺎ
ﻻ ﺗﺤﺘـﻮي ﻋﻠـﻰ اﻳــﺔ اآـﻮاد ،ﻟـﺬﻟﻚ ﺗﺴــﻤﻰ ﻓﺌـﺔ اﻟﻤﺠــﺮدة Abstract Class Control
وﺗﺤﺘﻮي ﻋﻠﻰ واﺟﻬﺔ ،Interfaceﻓﺤﺘﻰ ﺗﺴﺘﻄﻴﻊ ان ﺗﺤﻘﻖ ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮﺟﻬـﺎت ﻻﺑـﺪ
ﻣﻦ وﺟﻮد ﻓﺌﺔ ﻣﺠﺮدة واﻟﺘﻲ ﺗﻌﺮف اﻟﻮاﺟﻬﺔ ﻟﻠﻔﺌﺎت اﻻﺧﺮى ﻣﻨﻬﺎ.
ﺗﻄﺒﻴﻖ ﻋﻤﻠﻲ:
واﻻن ﻟﻨﺒﺪأ ﺑﺎﻟﺘﻄﺒﻴﻖ ،ﺳﻨﻨﺸﺊ ﻓﺌﺔ ﻣﺠﺮدة )واﺟﻬﺔ( ﺑﺎﺳﻢ ITripواﻟﺘﻲ ﺗﻤﺜـﻞ رﺣﻠـﺔ
وﺗﻌﺮﻳﻒ ﻃﺮﻳﻘﺔ ﺑﻬﺎ ﻟﻤﻌﺮﻓﺔ اﻟﺘﻜﺎﻟﻴﻒ:
177
واﻻن اﻧﺸﺎء ﻓﺌﺔ اﺧﺮى وهﻲ ﺗﻤﺜﻞ رﺣﻠﺔ ﺑﺎﻟﺴﻴﺎرة ﻻ ﺗﻨﺴﻰ ان ﺗﺴﻤﻴﻬﺎ ﺑـ :CCar
ﻻ ﻳﻮﺟﺪ داﻋـﻲ ﻣـﻦ آﺘﺎﺑـﺔ اﻻﺟـﺮاء اﻟﺴـﺎﺑﻖ ﺑﻨﻔﺴـﻚ ،ﻓﺒﻤﺠـﺮد آﺘﺎﺑـﺔ ﻣﻼﺣﻈﺔ:
اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة Implementsﺑﺎﻣﻜﺎﻧﻚ اﻟﻮﺻﻮل اﻟـﻰ آﺎﻓـﺔ اﺟـﺮاءات
اﻟﻮاﺟﻬـﺔ ﻋـﻦ ﻃﺮﻳــﻖ اﻻداة ComboBoxاﻟﻤﻮﺟـﻮدة ﻓــﻲ اﻋﻠـﻰ ﻧﺎﻓــﺬة
ﻣﺤﺮر اﻻآﻮاد.
‘ ITrip
ﻻﺣﻆ زﻳﺎدة ﺳﻌﺮ اﻟﺘﻜﻠﻔﺔ هﻨﺎ ‘ ITrip_GetCost = iDistance * 100
End Function
ﺳﺘﻼﺣﻆ اﺧﺘﻼف اﻟﺘﻜﺎﻟﻴﻒ ﺑﻴﻦ رﺣﻠﺔ ﺑﺎﻟﺴﻴﺎرة واﺧـﺮى ﺑﺎﻟﻄـﺎﺋﺮة وﻟـﻮ آﺎﻧـﺖ اﻟﻤﺴـﺎﻓﺔ
ﻣﺘﺸﺎﺑﻬﻪ ) 50آﻴﻠﻮ ﻣﺘﺮ(.
اﻟﻮراﺛﺔ
اﻟﻮراﺛــﺔ Inheritanceه ـﻲ ﻗــﺪرة اﻟﻔﺌــﺔ –اﻟﻔﺌــﺔ اﻟﻤﺸــﺘﻘﺔ -Derivedﻋﻠــﻰ اﺷــﺘﻘﺎق
اﻋﻀﺎء ﻓﺌﺔ اﺧﺮى -اﻟﻔﺌﺔ اﻻم -Base Classﺑﺤﻴﺚ ﺗﺘﻤﻜﻦ اﻟﻔﺌﺔ اﻟﻤﺸﺘﻘﺔ ﻣـﻦ اﻟﻮﺻـﻮل
اﻟﻰ ﺟﻤﻴﻊ اﻋﻀﺎء )ﻃﺮق/ﺧﺼﺎﺋﺺ( اﻟﻔﺌﺔ اﻻم ،ﻣﻤﺎ ﻳﺆدي اﻟﻰ ﺗﻄﻮﻳﺮ اﻟﻔﺌﺔ اﻻم واآﻤﺎل
ﻧﻮاﻗﺼﻬﺎ .ﻓﻤﺜﻼ ﻟﻮ آﺎن ﻟﺪﻳﻨﺎ اﻟﻔﺌﺔ س وﻧﺮﻳﺪ اﺿﺎﻓﺔ اﻟﺨﺎﺻﻴﺔ ص ﻓﻴﻬﺎ ،ﻓﻼ ﻳﻮﺟﺪ داﻋـﻲ
ﻣﻦ اﻋﺎدة ﺑﻨﺎء اﻟﻔﺌﺔ س ﻣﻦ ﺟﺪﻳـﺪ ،واﻧﻤـﺎ ﻧﻨﺸـﺊ ﻓﺌـﺔ ع ﺗﺤﺘـﻮي ﻋﻠـﻰ اﻟﺨﺎﺻـﻴﺔ ص
وﺗﻜﻮن اﻟﻔﺌﺔ ع ﻣﺸﺘﻘﺔ ﻣﻦ اﻟﻔﺌﺔ س ﺑﺤﻴﺚ ﺗﻤﺘﻠﻚ آﺎﻓﺔ ﺧﺼﺎﺋﺼـﻬﺎ اﻻﺧـﺮى .ﻟﺘﻮﺿـﻴﺢ
اﻟﻔﻜﺮة ،اﻓﺘﺮض ان ﻟﺪﻳﻨﺎ هﺬﻩ اﻟﻔﺌﺎت اﻟﺜﻼث:
”ﻣﺤﻤﺪ“ = CStudent.Name
CStudent.Age = 25
)(CStudent.Move
”ﻋﻠﻮم اﻟﺤﺎﺳﺐ“ = CStudent.Major
)(CStudent.ChangeCollege
”ﻋﺒﺪاﷲ“ = CStudent.Name
CWorkman.Age = 30
)(CWorkman.Move
CWorkman.Salary = 10,000
)(CWorkman.ChangeDepartment
CPerson.Salary = 20,000
او ‘
)(CPerson.ChangeCollege
اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،اﻟﻔﺌﺎت اﻟﻤﺸـﺘﻘﺔ ﺗـﺮث ﻣـﻦ اﻟﻔﺌـﺎت اﻟﻤﺸـﺘﻖ ﻣﻨﻬـﺎ )اﻟﻔﺌـﺎت اﻻم( ﻓﻘـﻂ.
ﻓﻔــﻲ ﻣﺜﺎﻟﻨــﺎ اﻟﺴــﺎﺑﻖ ،اﻟﻔﺌــﺎت CStudentو CWorkmanﻻ ﻳﻤﻜــﻦ ﻻي ﻓﺌــﺔ ﻣﻨﻬــﺎ
اﻟﻮﺻﻮل اﻟﻰ اﻋﻀﺎء اﻟﻔﺌﺔ اﻻﺧﺮى ﻓﻼ ﺗﻜﺘﺐ ﻣﺜﻞ هﺬا:
CStudent.Salary = 10,000
)(CWorkman.ChangeCollege
ﻻﻧﻬﻤﺎ ﻣﺸﺘﻘﺎن ﻣﻦ اﻟﻔﺌﺔ اﻻم CPersonﻓﻘﻂ .وهﺬا ﺑﺎﺧﺘﺼﺎر ﻣﻔﻬﻮم ﻣﺒﺪأ اﻟﻮراﺛﺔ ﻓـﻲ
ﺟﻤﻴﻊ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ واﻟﺬي ﻳﻘﺪم ﻟﻚ اﻟﻜﺜﻴﺮ ﻣﻦ اﺧﺘﺼﺎر آﺘﺎﺑﺔ اﻻآـﻮاد واﻟﺘﺴـﻬﻴﻞ ﻓـﻲ
180
ﻋﻤﻠﻴﺔ اﻟﺘﻨﻘﻴﺢ وﺗﻄﻮﻳﺮ اﻟﻔﺌﺔ ﻧﻔﺴﻬﺎ اﻳﻀـﺎ ،ﺗﺨﻴـﻞ ﻣـﺜﻼ ان ﻟـﺪﻳﻚ ﻓﺌـﺔ MyClassواردت
ﺗﻄﻮﻳﺮهﺎ ﺑﺎﺿﺎﻓﺔ ﻋﻨﺎﺻﺮ ﺟﺪﻳﺪة ﻟﻬﺎ ،آﻞ ذﻟﻚ ﻳﻤﻜﻦ ان ﻳـﺘﻢ ﻋـﻦ ﻃﺮﻳـﻖ اﺷـﺘﻘﺎق ﻓﺌـﺔ
اﺧﺮى ﺟﺪﻳﺪة ﻣﻨﻬﺎ واﺿﺎﻓﺔ اﻟﻼزم.
)(Sub Move
"ﺗﻢ ﺗﻨﻔﻴﺬ اﺟﺮاء اﻟﺘﺤﺮﻳﻚ" MsgBox
End Sub
End Sub
m_lSalary = lNewValue
End Property
واﻻن ﻗﻤﻨﺎ ﺑﻌﻤﻠﻴﺔ ﻣﺤﺎآﺎة ﻣﺒﺪأ اﻟﻮراﺛﺔ ،ﻓﺘﺴﺘﻄﻴﻊ آﺘﺎﺑﺔ اآﻮاد ﻣﺜﻞ:
”ﻣﺤﻤﺪ“ = X.sName
X.iAge = 25
)(X.Move
”ﻋﻠﻮم اﻟﺤﺎﺳﺐ“ = X.sMajor
)(X.ChangeCollege
”ﻋﺒﺪاﷲ“ = Y.sName
Y.iAge = 30
)(Y.Move
Y.lSalary = 10,000
)(Y.ChangeDepartment
آﺎﺋﻦ ﻣﻦ ﻓﺌﺔ اﺧﺮى ﻋﻦ ﻃﺮﻳﻖ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻳﻤﺜﻞ آﺎﺋﻦ ﻟﺘﻠـﻚ اﻟﻔﺌـﺔ .اﻻن ﻗـﻢ ﺑﺎﻋـﺎدة
ﺗﺼﻤﻴﻢ اﻟﻔﺌﺎت اﻟﻤﺸﺘﻘﺔ CStudentو CWorkmanﺑﻬﺬﻩ اﻟﻄﺮﻳﻘﺔ:
اﻟﻔﺌﺔ اﻻم ‘
Public objPerson As New CPerson
اﻟﻌﻴﺐ اﻟﻮﺣﻴﺪ ﻓﻲ هﺬﻩ اﻟﻄﺮﻳﻘﺔ هﻮ ان اﻟﻤﺴﺘﺨﺪم ﻟﻬﺬﻩ اﻟﻔﺌـﺔ ﻟـﻦ ﻳﺴـﺘﻄﻴﻊ ﻣﺤﺎآـﺎة
اﻟﻮراﺛﺔ ﺑﺸﻜﻠﻬﺎ اﻟﺼﺤﻴﺢ ،ﻓﻠـﻦ ﻳﺴـﺘﻄﻴﻊ آﺘﺎﺑـﺔ اﻟﻌﺒـﺎرة ﻣـﺜﻼ X.sNameﻟﻠﻮﺻـﻮل اﻟـﻰ
اﻋﻀﺎء اﻟﻔﺌﺔ اﻻم ،واﻧﻤﺎ ﺳﻴﻀﻄﺮ اﻟﻰ اﺳﺘﺨﺪام اﻟﻜﺎﺋﻦ اﻟﻤﺤﻀﻮن ﻓﻲ اﻟﻔﺌﺔ اﻟﻤﺸـﺘﻘﺔ
وآﺘﺎﺑﺔ .X.objPerson.sName
اﻟﺘﻔﻮﻳﺾ Delegation
ﻳﺒﺪو ان اﻟﺤﻞ اﻻﻣﺜﻞ هﻮ ﺑﺠﻌﻞ آﺎﺋﻦ اﻟﻔﺌﺔ اﻻم ﻣﺨﻔـﻲ وﻣﺤﺎآـﺎة ﺟﻤﻴـﻊ اﻋﻀـﺎءﻩ ﻓـﻲ
اﻟﻔﺌﺔ اﻟﻤﺸﺘﻘﺔ ،وﻣﻦ ﺛﻢ ارﺳﺎﻟﻬﺎ اﻟﻰ اﻟﻜﺎﺋﻦ ،وهﺬﻩ هﻲ اﻟﻔﻜﺮة اﻻﺳﺎﺳﻴﺔ ﻣﻦ ﻣﺒـﺪأ
اﻟﺘﻔﻮﻳﺾ ،ﻓﺴﻴﺼﺒﺢ اﻟﻜﻮد اﻟﻨﻬﺎﺋﻲ ﻟﻠﻔﺌﺔ اﻟﻤﺸﺘﻘﺔ :CStudent
اﻟﻔﺌﺔ اﻻم ‘
Private objPerson As New CPerson
واﻻن ﻗﻤﺖ ﺑﻤﺤﺎآﺎة ﻣﺒﺪأ اﻟﻮراﺛﺔ ﻓﻲ Visual Basicﻟﻜـﻦ -ﻣـﻊ اﻻﺳـﻒ -اود ان اﺧﺒـﺮك
ان اﻟﺬي ﻓﻌﻠﻨﺎﻩ ﺻﺤﻴﺢ %100ﻓﻲ هﺬا اﻟﻤﺜﺎل ﻓﻘﻂ! ﻻﻧـﻪ ﻓـﻲ ﺣﺎﻟـﺔ آـﻮن ﻟﻠﻔﺌـﺔ اﻻم
واﺟﻬﺔ ﻓﺮﻋﻴﺔ ﻣﻦ واﺟﻬﺔ اﺧﺮى -ﻣﺒﺪأ ﺗﻌﺪد اﻟﻮاﺟﻬـﺎت -Polymorphismﻟـﻦ ﺗﺴـﺘﻄﻴﻊ
اﻟﻮﺻﻮل اﻟﻰ اﻋﻀﺎء اﻟﻮاﺟﻬﺔ اﻻﺧﺮى ﻟﻠﻔﺌﺔ ،واﻟﺤﻞ ﺗﺠﺪﻩ ﻓﻲ اﻟﻔﻘﺮة اﻟﺘﺎﻟﻴﺔ.
وراﺛﺔ اﻟﻮاﺟﻬﺎت
ارﻳﺪ ان اﺑﺪأ هﻨﺎ ﺗﻘﺪﻳﻢ ﻣﺤﺘﻮﻳﺎت اﻟﻤﺜـﺎل اﻟـﺬي ﺳـﻴﻈﻬﺮ ﻟﻨـﺎ ﻣﺸـﻜﻠﺔ وراﺛـﺔ اﻟﻮاﺟﻬـﺎت
وآﻴﻔﻴﺔ ﺗﻼﻓﻴﻬﺎ ،ﺳﻴﻜﻮن ﻟﺪﻳﻨﺎ ﻓﻲ هﺬا اﻟﻤﺜﺎل واﺟﻬـﺔ واﺣـﺪة ﺑﺎﺳـﻢ IMyInterfaceو
ﻓﺌﺔ ام ﺑﺎﺳﻢ CBaseClassوﻓﺌﺔ ﻣﺸﺘﻘﺔ ﺑﺎﺳﻢ .CDerivedClass
ﺗﻮﺿﻴﺢ اﻟﻤﺸﻜﻠﺔ:
ﺣﺘﻰ ﻧﻘﻮم ﺑﺤﻞ اﻟﻤﺸﻜﻠﺔ ﻻﺑﺪ ﺑﻜﻞ ﺗﺄآﻴﺪ ﻣﻦ ﻣﻌﺮﻓﺔ ﻣﺎهﻲ اﻟﻤﺸـﻜﻠﺔ .اﻻن ﺳـﻨﻘﻮم
ﺑﻌﻤﻠﻴـﺔ اﻟﺘﻔـﻮﻳﺾ -ﻟﻤﺤﺎآــﺎة اﻟﻮراﺛـﺔ -آﻤـﺎ ﻋﻤﻠﻨــﺎ ﻓـﻲ اﻟﻔﻘـﺮة اﻟﺴــﺎﺑﻘﺔ وﺟﻌـﻞ اﻟﻔﺌــﺔ
CDerivedClassﻣﺸﺘﻘﺔ ﻣـﻦ اﻟﻔﺌـﺔ اﻻم ،CBaseClassﻟﻴﺼـﺒﺢ اﻟﻜـﻮد اﻟﻨﻬـﺎﺋﻲ ﻟﻠﻔﺌـﺔ
CDerivedClassهﻮ:
ﻳﺒــﺪو ان اﻟﻤﺸــﻜﻠﺔ اﺗﻀــﺤﺖ ﻟــﻚ اﻻن وهــﻲ ان اﻟﻔﺌــﺔ اﻟﻤﺸــﺘﻘﺔ ﻻ ﺗــﺪﻋﻢ اﻟﻄﺮﻳﻘــﺔ
MyMethodاﻟﺘﺎﺑﻌﺔ ﻟﻠﻮاﺟﻬـﺔ IMyInterfaceواﻟﺘـﻲ ﺗﻌﺘﺒـﺮ اﺣـﺪى واﺟﻬـﺎت اﻟﻔﺌـﺔ اﻻم
.CBaseClassاذا آﻨﺖ ﺗﻔﻜﺮ ﺑﺘﻔﻮﻳﺾ اﺟﺮاء ﻟﻌﻤﻞ ذﻟﻚ آﻬﺬا:
)(Sub MyMethod
BaseClass.MyMethod
End Sub
ﻓﺎرﺟﻮ ان ﺗﻮﻗﻒ اﻟﻘﺮاءة ﻓﻲ اﻟﺤﺎل! ﻻﻧﻚ ﺑﺤﺎﺟـﺔ ﻣﺎﺳـﺔ اﻟـﻰ ﻣﻌﺮﻓـﺔ واﺳـﺘﻴﻌﺎب ﻣﺒـﺪأ
ﺗﻌﺪد اﻟﻮاﺟﻬﺎت ،Polymorphismﻓﺎﻟﻜـﺎﺋﻦ BaseClassﻣﻌـﺮف ﻣـﻦ اﻟﻔﺌـﺔ CBaseClass
وﻟﻴﺲ ﻣﻦ اﻟﻮاﺟﻬﺔ IMyInterfaceوﻟﻦ ﺗﺴﺘﻄﻴﻊ ﻋﻤﻞ ذﻟﻚ.
ﺣﻞ اﻟﻤﺸﻜﻠﺔ:
اﺗﻤﻨﻰ ان ﺗﻜـﻮن اﻟﻤﺸـﻜﻠﺔ ﻗـﺪ اﺗﻀـﺤﺖ ﻟـﻚ ،ﻳﻜﻤـﻦ اﻟﺤـﻞ ﺑـﺎﻻﻟﺘﺰام ﺑﻌﻤﻠﻴـﺔ ﺗﻀـﻤﻴﻦ
اﻟﻮاﺟﻬﺔ IMyInterfaceﻓﻲ اﻟﻔﺌﺔ اﻟﻤﺸﺘﻘﺔ ،وﻳﺼﺒﺢ اﻟﻜﻮد اﻟﻨﻬﺎﺋﻲ ﺑﻬﺬا اﻟﺸﻜﻞ:
)(Sub MyMethod
IMyInterface_MyMethod
End Sub
188
)(Sub BaseMethod
BaseClass.BaseMethod
End Sub
اﻟﺬي آﻨﺖ اﻗﺼﺪﻩ ﻣﻦ اﻟﺘﺤﻜﻢ اﻻآﺒﺮ هﻮ اﻧﻚ ﻓﻲ اﻟﻜﻮد اﻟﺴﺎﺑﻖ ﺗﺴﺘﻄﻴﻊ اﻟﻐﺎء ﻋﻤﻠﻴـﺔ
اﺳــﺘﺪﻋﺎء اﻟﻄﺮﻳﻘــﺔ اﻟﻤﻮﺟــﻮدة ﻓــﻲ اﻟﻔﺌــﺔ اﻻم او ﺗﻌــﺪﻳﻞ ﻗــﻴﻢ اﻟﻤﺘﻐﻴــﺮات اﻟﻤﺮﺳــﻠﺔ
Argumentsاو ﺣﺘــﻰ ﺗﻐﻴﻴــﺮ اﻟﻘﻴﻤــﺔ اﻟﺘــﻲ ﺗﻌــﻮد ﺑﻬــﺎ اﻟﻄﺮﻳﻘــﺔ ،Returned Value
ﻓﺘﺴﺘﻄﻴﻊ ان ﺗﻜﺘﺐ ﺷﻴﺌﺎ ﻣﺜﻞ:
End If
End Sub
ﻓﻲ ﻣﺒﺪأ اﻟﻮراﺛﺔ ،ﺗﺴﻤﻰ هﺬﻩ اﻟﻌﻤﻠﻴﺔ ﺑﺎﻟﺘﺼـﻨﻴﻒ اﻟﻔﺮﻋـﻲ ﻟﻠﻔﺌـﺔ اﻻم Subclassing
،the base classوهﻲ ﻣﻦ اﻟﺘﻘﻨﻴﺎت اﻟﻤﺘﻘﺪﻣﺔ اﻟﺘﻲ ﺗﻮﻓﺮهﺎ ﻟﻚ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴـﺔ
اﻟﺘﻮﺟﻪ OOPآﻠﻐﺔ اﻟـ C++واﻟﺘﻲ ﻃﺒﻘﻨﺎهﺎ ﺑﺸﻜﻞ ﻓﻌﺎل ﻓـﻲ ﻟﻐﺘﻨـﺎ اﻟﺠﻤﻴﻠـﺔ Visual
.Basic
اﻟﻤﺰﻳﺪ اﻳﻀﺎ ،ﻳﻤﻜﻨﻚ ﺗﻄﺒﻴﻖ ﻣﺒﺪأ اﻟﺘﺼﻨﻴﻒ اﻟﻔﺮﻋﻲ ﻋﻠﻰ ﺟﻤﻴـﻊ اﻋﻀـﺎء ﻣﻜﺘﺒـﺎت VBو
،VBAﻓﻤﺜﻼ اﻟﺪاﻟﺔ Hexﺣﺮوف اﻻﻋـﺪاد اﻟﺴﺘﻌﺸـﺮﻳﺔ اﻟﺘـﻲ ﺗﻌـﻮد ﺑﻬـﺎ ﺗﻜـﻮن اﻧﺠﻠﻴﺰﻳـﺔ
داﺋﻤﺎ F .... ،B ،Aوﻗﺪ ﺗﻜﻮن ﻣﻦ اﻟﻤﺘﻌﺼﺒﻴﻦ اﻟـﻰ ﻟﻐﺘﻨـﺎ اﻟﺠﻤﻴﻠـﺔ ﺑﺤﻴـﺚ ﺗـﻮد ان ﺗﻌـﻮد
اﻟﺪاﻟﺔ ﺑﺎﻟﺤﺮوف اﻟﻌﺮﺑﻴﺔ ،ﻓﺘﺴﺘﻄﻴﻊ ﺗﻄﺒﻴﻖ ﻣﺒﺪأ اﻟﺘﺼﻨﻴﻒ اﻟﻔﺮﻋﻲ ﻟﻠﺪاﻟﺔ Hexﺑﺘﻌﺮﻳـﻒ
هﺬﻩ اﻟﺪاﻟﺔ ﻓﻲ ﻣﻠﻒ ﺑﺮﻣﺠﺔ :BAS
اﻻهﺮام اﻟﻜﺎﺋﻨﻴﺔ
ﻋﻨﺪﻣﺎ ﺗﺼﺒﺢ ﻣﺒﺮﻣﺞ آﺎﺋﻨﻲ اﻟﺘﻮﺟﻪ ،ﻓـﺎن ﻧﻈﺮﺗـﻚ اﻟـﻰ ﻋﻤﻠﻴـﺔ ﺑﻨـﺎء وﺗﺼـﻤﻴﻢ اﻟﺒﺮﻧـﺎﻣﺞ
ﺗﻨﺘﻄﻠﻖ ﻣﻦ ﻣﺤﻮر آﺎﺋﻨﺎﺗﻪ وﻟﻴﺲ اآـﻮادﻩ ،ﻣﺠﻤﻮﻋـﺔ اﻟﻜﺎﺋﻨـﺎت اﻟﺘـﻲ ﺗﺼـﻤﻤﻬﺎ ﺗﺴـﻤﻰ
190
اﻻهﺮام اﻟﻜﺎﺋﻨﻴﺔ Object Hierarchiesاﻟﺨﺎﺻﺔ ﺑﺒﺮﻧﺎﻣﺠﻚ .ﻓﻠﻮ ﺗﻨﻈﺮ اﻟﻰ ﻣﻌﻈﻢ اﻟﺒﺮاﻣﺞ
اﻟﺘﺠﺎرﻳﺔ آــ .... Microsoft PowerPoint ،Microsoft Excel ،Microsoft Wordاﻟـﺦ او
ﺣﺘﻰ ﺗﻘﻨﻴﺎت اﺧﺮى آـ .... DirectX ،DAO ،ADOاﻟﺦ ،ﺗﻼﺣﻆ ان ﻟﻜـﻞ ﻣﻨـﺘﺞ او ﻋﻨﺼـﺮ
ﻣﻦ هﺆﻻء اهﺮام آﺎﺋﻨﻴﺔ ﺧﺎﺻﺔ ﺑﻪ ﻣﺮﺗﺒﻂ ﺑﻌﻀﻬﺎ ﺑﺒﻌﺾ.
ﺑﻨﺎء اهﺮاﻣﻚ اﻟﻜﺎﺋﻨﻴﺔ اﻟﺨﺎﺻﺔ ﺑﻚ اﻣﺮ ﻓﻲ ﻏﺎﻳﺔ اﻻهﻤﻴﺔ وآﻞ ﻣﺎ ﻳﻠﺰﻣﻚ هﻮ اﻟﺘﺮآﻴﺰ ﻓـﻲ
ﺗﺼﻤﻴﻢ اﻟﻬﺮم اﻟﻜﺎﺋﻨﻲ وﻟﻴﺲ ﻓﻲ اآﻮادﻩ ،ﻓﺎﻟﺘﺼﻤﻴﻢ اﻟﺠﻴﺪ هﻮ اﻟﻌﺎﻣـﻞ اﻟـﺮﺋﻴﺲ ﻟﻨﺠـﺎح
هﺮﻣﻚ اﻟﻜﺎﺋﻨﻲ ،اﻣﺎ اآﻮادﻩ ﻓﺘﺄﺗﻲ ﻓﻲ اﻟﻤﺮﺣﻠﺔ اﻟﺘﺎﻟﻴـﺔ .ﻣـﻊ ذﻟـﻚ ،اﺳـﺎﻟﻴﺐ اﻟﺘﺼـﻤﻴﻢ
واﻋﺪاد اﻟﻤﺨﻄﻄﺎت اﻻوﻟﻴﺔ ﻻﻧﺸﺎء اﻟﻬﺮم اﻟﻜﺎﺋﻨﻲ ﺧﺎرج ﻧﻄﺎق اﻟﻜﺘﺎب ،وﻟﻜﻦ ﺳـﺄﺟﻬﺰك
هﻨﺎ ﺑﻜﻞ ﻣﺎ ﺗﺤﺘﺎﺟﻪ ﻟﺒﻨﺎء اﻻهﺮام اﻟﻜﺎﺋﻨﻴﺔ وﺳﺄﺑﺪا ﺑﺎﻟﻌﻼﻗﺎت ﺑﻴﻦ اﻟﻔﺌﺎت.
اﻟﻔﺌﺔ ‘ CCar
Public objOwner As CPerson
Public objDriver As CPerson
Public sCarModel As String
191
وﺑﻬﺎ ﺗﻜﻮن ﻗﺪ آﻮﻧﺖ ﻋﻼﻗﺔ ﻓﻲ اﻟﻬﺮم اﻟﻜﺎﺋﻨﻲ اﻟﺒﺴﻴﻂ ﺟﺪا ﺷﻜﻞ .1-6
ﻃﺒﻌﺎ اذا آـﺎن اﻟﻬـﺮم اﻟﻜـﺎﺋﻨﻲ ﻳﺤﺘـﻮي ﻋﻠـﻰ اآﺜـﺮ ﻣـﻦ 200ﻓﺌـﺔ –ﻣﺜـﻞ ﻣﻜﺘﺒـﺔ ،MFC
ﻓﺴﻴﻜﻮن اﻟﺘﺼﻤﻴﻢ آﻤﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺴﺎﺑﻖ اﻣـﺮ ﻓـﻲ ﻏﺎﻳـﺔ اﻻهﻤﻴـﺔ وﻳﺼـﺒﺢ ﺗﺮآﻴـﺰك
ﻋﻠﻰ اﻟﺘﺼﻤﻴﻢ اآﺜﺮ ﻣﻦ اﻧﺠﺎز اﻻآﻮاد .اﻣﺎ اذا اردت اﺳﺘﺨﺪم اﻟﻔﺌـﺎت CCarو CPerson
ﻓﻘﺪ ﺗﻜﺘﺐ ﺷﻴﺌﺎ ﻣﺜﻞ:
…
…
ﺑﻞ ﻳﻤﻜﻨـﻚ اﻟﻮﺻـﻮل اﻟـﻰ اﻋﻀـﺎء اﻟﻜﺎﺋﻨـﺎت objOwnerو objDriverواﻧـﺖ ﻓـﻲ داﺧـﻞ
اﻟﻔﺌﺔ ،CCarﻓﻘﺪ ﺗﻀﻴﻒ ﻃﺮﻳﻘﺔ اﻟﻰ اﻟﻔﺌﺔ ﻟﻄﺒﺎﻋﺔ اﺳﻢ اﻟﻤﺎﻟﻚ واﻟﺴﺎﺋﻖ:
192
ﻓﻌﻼ ،اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ OOPﺑﺮﻣﺠﺔ ﻣﻤﺘﻌﺔ ﻟﻠﻐﺎﻳﺔ واﻗﺮب اﻟـﻰ اﻟﻌـﺎﻟﻢ اﻟﺤﻘﻴﻘـﻲ
ﻣﻦ اﻟﺒﺮﻣﺠﺔ اﻻﺟﺮاﺋﻴﺔ اﻟﻤﻌﻘﺪة.
اﻟﻔﺌﺔ ‘ CCar
Private m_objDrivers (5) As CPerson
…
ﻳﻌﺮف اﻟﻨﻮع اﻟﺴﺎﺑﻖ ﺑﺎﻧﻪ "ﻋﻼﻗﺔ 1اﻟﻰ ن ﻣﺒﻨﻴﺔ ﻋﻠﻰ اﻟﻤﺼـﻔﻮﻓﺎت" Array based 1
،to many relationshipوﻳﻮﺟﺪ ﻧﻮع اﺧﺮ –اﻓﻀﻠﻪ آﺜﻴﺮا -ﻳﻌﺮف "ﺑﻌﻼﻗﺔ 1اﻟﻰ ن ﻣﺒﻨﻴـﺔ
ﻋﻠـﻰ اﻟﻤﺠﻤﻮﻋـﺎت" ،Array based 1 to many relationshipﺣﻴـﺚ ﺗﻜـﻮن اﻟﺨﺎﺻـﻴﺔ
objDriverﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ Collectionﺑﺪﻻ ﻣﻦ ﻣﺼﻔﻮﻓﺔ:
اﻟﻔﺌﺔ ‘ CCar
Public objDrivers As New Collection
BMW.objDrivers.Add Turki
BMW.objDrivers.Add Ali
او ﺣﺘﻰ اﻟﻮﺻﻮل اﻟﻰ آﺎﻓﺔ ﻋﻨﺎﺻﺮ اﻟﺨﺎﺻﻴﺔ objDriverﺑﺎﺳﺘﺨﺪام ﺣﻠﻘﺔ :For … Each
…
…
واﻟﺤﻞ ﻳﺘﻢ ﺑﺎﻧﺸﺎء ﻓﺌﺔ ﺧﺎﺻـﺔ ﺗﺴـﻤﻰ ﻓﺌـﺔ اﻟﻤﺠﻤﻮﻋـﺔ CPersons Collection Class
ﻟﻬــﺎ ﻃــﺮق وﺧﺼــﺎﺋﺺ ﻗﻴﺎﺳــﻴﺔ ﻳﺘﺒﻌﻬــﺎ آــﻞ اﻟﻤﺒــﺮﻣﺠﻴﻦ وﺟﻤﻴــﻊ اﻟﻤﻜﺘﺒــﺎت واﻟﻜﺎﺋﻨــﺎت
اﻟﻤﺘﻮﻓﺮة ﻓﻲ Visual Basicو ﻟﻐـﺎت اﻟﺒﺮﻣﺠـﺔ اﻻﺧـﺮى اﻟﻤﺘﻮاﻓﻘـﺔ ﻣـﻊ COMآﻤـﺎ ﻓـﻲ
اﻟﻔﻘﺮة اﻟﺘﺎﻟﻴﺔ.
End Property
واﻻن اﺳــﺘﺨﺪم اﻟﻔﺌــﺎت CCarو CPersonﺑــﻨﻔﺲ اﻟﻄﺮﻳﻘــﺔ اﻟﺴــﺎﺑﻘﺔ وآــﺄن ﺷــﻴﺌﺎ ﻟــﻢ
ﻳﺤﺪث:
”ﻣﺤﻤﺪ“ = Driver1.sName
”ﻋﺒﺪاﷲ“ = Driver2.sName
…
…
BMW.objDrivers.Add Driver1
BMW.objDrivers.Add Driver2
Print BMW.objDrivers.Item(1).sName
Print BMW.objDrivers(2).sName
ﺑﺎﻣﻜﺎﻧﻚ ﻋﻤﻞ ذﻟﻚ ﻋﻦ ﻃﺮﻳﻖ ﺻﻨﺪوق اﻟﺤﻮار Procedure Attributesآﻤﺎ ذآـﺮت ﻓـﻲ
اﻟﻔﺼﻞ اﻟﺴﺎﺑﻖ "اﻟﺒﺮﻣﺠﺔ آﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ ."OOP
اﻣﺎ اﻟﻨﻘﻄﺔ اﻟﺜﺎﻧﻴﺔ اﻟﺘﻲ اود ان اذآﺮهﺎ هﻲ ﻗﺎﺑﻠﻴﺔ اﺳﺘﺨﺪام اﻟﺤﻠﻘﺔ For … Eachﻣـﻊ
اﻟﻤﺠﻤﻮﻋﺔ ،CPersonsﻓﻠﻮ آﺘﺒﺖ هﺬا اﻟﻜﻮد:
ﺳﻴﻈﻬﺮ ﻟﻚ Visual Basicرﺳﺎﻟﺔ ﺧﻄﺄ ،ﻻن اﻟﺤﻠﻘﺔ For … Eachﻟﻴﺴﺖ ﻣﺪﻋﻮﻣﺔ ﻓﻲ
ﻣﺠﻤﻮﻋﺘﻨــﺎ اﻟﺠﺪﻳــﺪ ،CPersonsﻟــﺬﻟﻚ ﻋﻠﻴــﻚ آﺘﺎﺑــﺔ اﻟﻜــﻮد اﻟﺘــﺎﻟﻲ ﻓــﻲ اﻟﻤﺠﻤﻮﻋــﺔ
:CPersons
اﺳﺘﻴﻌﺎب اﻟﺨﻄﻮات اﻟﺴﺎﺑﻘﺔ ﺧـﺎرج ﻧﻄـﺎق اﻟﻜﺘـﺎب ،ﻻﻧـﻪ ﻳﺘﻄﻠـﺐ ﻓﻬـﻢ ﻣﻼﺣﻈﺔ:
اﻟﺒﻨﻴﺔ اﻟﺘﺮآﻴﺒﺎت ﻟﻤﻜﻮﻧﺎت COMاﻟﺘﺎﺑﻌﺔ ﻟـ OLE Automationواﻟﺨﺎﺻﺔ
ﺑﻮاﺟﻬـــﺎت اﻟﻤﻜﻮﻧـــﺎت آﺎﻟﻮاﺟﻬـــﺔ IUnknownاو ﺑﺎﻟﺘﺤﺪﻳـــﺪ اﻟﻮاﺟﻬـــﺔ
.IEnumVariantاذا اردت ﻣﺰﻳــﺪ ﻣــﻦ اﻟﺘﻔﺎﺻــﻴﻞ اﻟﻤﺘﻘﺪﻣــﺔ ﺣــﻮل هــﺬا
اﻟﻤﻮﺿﻮع اﻧﺼﺤﻚ ﺑﻜﺘﺎب:
Advanced Visual Basic 6
Power Techniques for Everyday Program
By: Matthew Curland
ISBN: 0-201-70712-8
اﺧﻴــﺮا ،اذا اردت اﻋــﺎدة رﺳــﻢ اﻟﻬــﺮم اﻟﻜــﺎﺋﻨﻲ CPersons ،CPersonو CCarﻓﻴﻔﻀــﻞ
اﺳﺘﺨﺪام ﻟﻮن ﻳﻤﻴﺰ ﻓﺌﺎت اﻟﻤﺠﻤﻮﻋﺎت ﻋﻦ اﻟﻔﺌﺎت اﻟﻌﺎدي ﺷـﻜﻞ 3-6ﻓﻬـﻮ اﻻﺳـﻠﻮب
اﻟﻤﺘﺒﻊ ﻓﻲ ﻣﻠﻔﺎت اﻟﺘﻌﻠﻴﻤﺎت وﻣﻮاﻗﻊ اﻻﻧﺘﺮﻧﺖ –اﻟﺘﻲ رأﻳﺘﻬﺎ.
198
ﺑﻬﺬا اآﻮن ﻗﺪ اﻧﺘﻬﻴﺖ ﻣﻦ ﺗﺸﻴﻴﺪ ﺑﻨﻴﺔ اﺳﺎﺳﻴﺔ ﻟﺘﻜﻮن ﻣﺒـﺮﻣﺞ Visual Basicﺣﻘﻴﻘـﻲ
ﺑﻌﺪﻣﺎ ﺗﻄﺮﻗﺖ اﻟﻰ اﻟﻤﺒﺎدئ واﻻﺳﺎﺳﻴﺎت اﻟﺘـﻲ ﻻﺑـﺪ ﻋﻠـﻰ آـﻞ ﻣﺒـﺮﻣﺞ Visual Basic
ﻣــﻦ ﻣﻌﺮﻓﺘﻬــﺎ واﺗﻘﺎﻧﻬــﺎ ﻟﻼﺑﺤــﺎر ﻓــﻲ ﺑﺮﻣﺠــﺔ .Visual Basicوهــﺬﻩ ﻧﻬﺎﻳــﺔ اﻟﺠــﺰء اﻻول
"اﻻﺳﺎﺳﻴﺎت" ﻣﻦ هﺬا اﻟﻜﺘﺎب ،واﻻن ﺑﺎﻣﻜﺎﻧﻚ ﺗﻌﻠﻴﻢ ﻧﻔﺴﻚ ذاﺗﻴﺎ اﻣـﺎ ﺑﺎﻟﺤﺼـﻮل ﻋﻠـﻰ
آﺘﺐ ﻣﺘﺨﺼﺼﺔ ﻓﻲ ﻣﺠﺎل ﻣﻌﻴﻦ ،او ﻗﺮاءة ﻣﻘـﺎﻻت ﻣﺘﻘﺪﻣـﺔ ،او ﺣﺘـﻰ اﻻﺳـﺘﻤﺮار ﻓـﻲ
ﻗﺮاءة هﺬا اﻟﻜﺘﺎب ان آﺎن اﺳﻠﻮب اﻟﻤﺆﻟﻒ ﻟﻴﺲ ﺳﻴﺌﺎ وﻣﻨﺎﺳﺒﺎ ﻟﻚ.