در VB، علاوه بر Event Procedureها که به ازای رويداد (Event) های مشخصی انجام می شوند، می توانيم تعدادی پروسيجر را نيز خودمان تعريف کنيم که به اين نوع پروسيجر، General Procedure (پروسيجر عمومی) گفته می شود که برای اجرای آنها می بايست نام آنها در جايی از برنامه، فراخوانی شود.
در VB (مشابه Basic) دو نوع پروسيجر داريم:

1- تابع  (Function)

2-  روال (Sub) .
توابع قطعه برنامه هايی هستند که هرگاه نام آنها در برنامه فراخوانی شود، لزوماً يک و فقط يک مقدار را به عنوان خروجی برمی گرداند در حالی که روال (ساب روتين) ها، قطعه برنامه هايی هستند که ممکن است به تناسب دارای يک يا چند خروجی و يا حتی بدون خروجی باشند.
توابع و روالها می توانند شامل تعدادی آرگومان (پارامتر) باشند که پارامترها در توابع فقط نقش ورود اطلاعاتی از برنامه به تابع را ايفا می کنند و نام خود تابع به عنوان خروجی تابع استفاده می شود در حالی که در روالها ورود و خروج داده ها، هر دو توسط همين پارامترها انجام می شود.
شکل کلی توابع به شکل زير است:

Function functionName (Parameters) As variableType

Commands

End Function

و همچنين شکل کلی روال ها:

Sub subName (Parameters)

 Commands

    

 End Sub

توجه داشته باشيد که در ابتدای تعريف توابع و روالها می توانيم از Private يا Public نيز استفاده کنيم و تمام سطوحی که برای تعريف متغيرها گفته شد (خصوصاً سطح فرم و سطح ماژول) ، در اينجا نيز عيناً کاربرد دارند. (پيش فرض در اينجا هم Private است).

به عنوان مثال اگر بخواهيم تابعی به نام Square ايجاد نماييم که هر عددی را دريافت کرد، مربع آن را برگرداند، کافی است چنين بنويسيم (مثلاً به صورت Public در يک ماژول) :

Public Function Square (I As Integer) As Integer

           Square = I*I

End Function

ملاحظه می کنيد که در اينصورت اگر هر جايی از برنامه نام تابع را به همراه يک مقدار عددی Integer به عنوان پارامتر آن ذکر کنيم، مقدار عددی مذکور به متغير I داخل تابع منتقل شده و عمل I*I روی آن انجام می گيرد و از آنجا که گفتيم خرجی توابع نام آنها هستند، خروجی (يعنی مقدار I*I را) را به نام تابع جايگزين کرديم (يعنی Square = I*I) . حال مثلاً اگر در جايی از برنامه دستور b = Square (5) را وارد کنيم، مقدار متغير b برابر 25 خواهد شد.

توجه داريم که اگر تابع بيش از يک پارامتر ورودی داشت، بايد نام آنها با کاما (,) از هم جدا کنيم که در اينصورت در هنگام فراخوانی بايد به تعداد پارامترها، آرگومان قرار دهيم که به ترتيب در متغير مربوط جايگزين (وارد) می شود. مثلاً اگر بخواهيم تابعی به نام Multiple ايجاد کنيم که حاصلضرب دو پارامتر ورودی اول را با پارامتر ورودی سوم جمع کند و نتيجه را برگرداند، کافی است بنويسيم:

Private Function Multiple (a, b, c As Integer) As Integer

     Multiple = (a*b) +c

End Function

که در اينصورت دستورات زير در محلی از پروژه (که البته دسترسی Private به تابع مذکور داشته باشد)، مقدار 17 را در Text Box به نام txtResult قرار می دهد:

I = 3

bs = 5

g = 2

txtResult.Text = Multiple (I, bs, g)

توجه داريم که مقادير استفاده شده به عنوان آرگومانهای تابع بايد با متغيرهای به کار رفته در پارامترهای تعريف تابع از لحاظ نوع داده، يکسان باشند.حال به عنوان مثالی برای روالها فرض کنيد بخواهيم روالی به نام TF ايجاد کنيم که دو عدد را دريافت کند، بررسی کند که اگر اين دو عدد برابر بودند، جواب True  و همچنين حاصلضرب آن دو را برگرداند. برای اين منظور اگر مثلاً در يک ماژول تعريف کنيم:

Public Sub TF (x, y As Integer, T as Boolean, M as Integer)

     IF x = y then

          T = True

     Else

           T = False

     End IF

     M = x*y

End Sub

می توان در جايی از پروژه، روال مذکور را فراخوانی نمود، فراخوانی روالها توسط دستور Call صورت می گيرد، مثلاً اگر در جايی از پروژه، روال فوق را به صورت زير فراخوانی نماييم:

a = InputBox (“Please Enter a Number”)

Call TF (a, 15, s, p)

در صورتی که متغيرهای a و s و p تعريف شده باشند آرگومان a به پارامتر x از روال، آرگومان 15 به پارامتر y از روال، آرگومان s به پارامتر T از روال و آرگومان p به پارامترM از روال منصوب می شود. دستور InputBox يک جعبه محاوره‌ای برای کاربر نشان می دهد که پيغامی را (در اينجا پيغام Please Enter a Number) شامل می شود و در يک جعبه متن خاص، مقداری را از کاربر مطالبه می کند که پس از وارد کردن توسط کاربر مقدار وارد شده را برمی گرداند (و در اينجا در متغير a جايگزين می کند). حال اگر کاربر مقدار 15 را وارد کند، مقدار متغير s (که بايد Boolean تعريف شده باشد) برابر True و در غير اينصورت مقدار False را شامل می شود و در هر صورت متغير p نيز حاصلضرب a و 15 را در خود شامل می شود.

تأکيد می کنيم که نوع داده آرگومانها و پارامترهای تعريف لزوماً بايد به ترتيب متناسب باشد که در غير اينصورت VB به ما خطا صادر می کند.

به اطمينان، از زمانی که با ويندوز کار می کنيد، از کنترلهای Check Box و Option Box استفاده بسياری برده‌ايد.اگر بخواهيم به کاربر (User) اين امکان را بدهيم که از بين چند گزينه، يک ، دو يا چند مورد را انتخاب کند و يا حتی هيچ يک را انتخاب نکند از کنترل Check Box به شکل (1)، و اگر بخواهيم کاربر، از ميان چند گزينه، يک و فقط يک گزينه را انتخاب کند، از کنترل Option Button (کليدهای راديويی) به شکل (2)، اين دو کنترل VCL، مشخصه ای به نام Value دارندکه از صفر يا يک بودن مقدار آن، می توانيم به انتخاب نشده بودن و انتخاب شده بودن آن گزينه خاص، پی ببريم. لذا اگر برروی يک فرم چند Check Box وجود داشت، می تواند Value هر يک از آنها صفر يا يک باشد، اما اگر برروی فرمی، چند Option Button وجود داشت، تنها يکی از آنها می تواند Value برابر يک داشته باشد و وقتی کاربر، يکی ديگر را انتخاب می کند، به طور خودکار، Value قبلی صفر و Value کنترل انتخاب شده، يک می شود.
VB دارای دو ثابت (Constant) به نامهای VBChecked و VBUnchecked می باشد که به ترتيب برابر يک و صفر می باشند که می توانيم مقدار Value کنترلهای ذکر شده را با اين ثوابت مقايسه کنيم.
کنترل Check Box ، علاوه بر دو مقدار صفر و يک برای مشخصه Value ، مقدار برابر 2 نيز برای آن دارد که اگر به آن Set شود، اين کنترل، خاکستری رنگ (Gray) می شود که معمولاً در ويندوز نشان از پيش فرض بودن دارد. همچنين کنترل مذکور، مشخصه ای هم به نام Style دارد که اگر مقدار آن را از صفر به يک تغيير دهيم، شکل Check Box به شکل دکمه ای در می آيد که يک بودن مقدار Value، باعث فشرده شدن کليد و صفر بودن آن باعث بالا بودن کليد می‌شود.
نکته آخری که در اينجا متذکر می شوم اينست که طبق قراری که از ابتدا گذاشته بوديم، سه حرف اول مشخصه Name کنترلها بهتر است متناسب با کنترل بگذاريم. برای Check Boxها، نام را با chk و برای Option Buttonها، نام را با opt آغاز می کنيم و ادامه نامشان را معمولاً با Caption آنها کامل می کنيم. لازم به ذکر است که مشخصه Caption هر دو کنترل مذکور، حاوی آن عبارتی است که کنار آن کنترل برای معرفی آن به کاربر می آيد.

فرض کنيد بخواهيم فرمی شامل يک Text Box و دو Check Box با عنوانهای Bold و Italic داشته باشيم که اگر Bold، مارک خورده بود، متن داخل Text Box به صورت Bold درآيد و اگر Italic مارک خورده بود به صورت Italic   

Private Sub chkBold_Click ()

           IF chkBold.Value = VBchecked Then

          txtDisplay.FontBold = True

     Else

          txtDisplay.FontBold = False

     End IF

End Sub

Private Sub chkItalic_Click ()

     IF chkItalic.Value = VBchecked Then

          txtDisplay.FontItalic = True

     Else

          txtDisplay.FontItalic = False

     End IF

End Sub

 توجه داشته باشيم که هرگاه کاربر بر روی يک Check Box و يا يک Option Button کليک کند و يا بوسيله کليد Tab ، فوکوس را به آن دهد و روی آن کليد Space bar را بزند، رويداد Click از اين دو کنترل روی خواهد داد.

حتماً يکی از الفاظی که در برنامه نويسی، از آن بهره بسياری برده ايد، آرايه می باشد. آرايه ها معمولاً خانه هايی از حافظه اند که تحت يک نام واحد و با انديس های متفاوت نامگذاری می شوند. در Basic هم آرايه ها (مانند ساير زبانهای برنامه نويسی) کاربرد فراوانی دارند که مثلاً توسط دستور Dim A (10, 10) As Integer يک آرايه دو بعدی (در واقع يک ماتريس) به نام A از نوع داده Integer تعريف می شود که سطر وستون آن دارای انديس های 0 تا 10 می باشد و توسط مثلاً A (5, 8) به خانه سطر 5 و ستون 8 از آن دسترسی خواهيم يافت.

در VB نيز (از آنجا که VB از Basic برای کدنويسی استفاده می کند) ، آرايه ها، تعريف آنها و نحوه دسترسی به خانه های آن به طريق فوق می باشد. اما آنچه در اينجا متفاوت است اينکه در VB می توان از کنترلها نيز يک آرايه ساخت. مثلاً چند Command Button با يک نام خاص و با انديسهای متفاوت ايجاد کرد تا بتوان کدهای واحدی را با تفاوت بسيار کم برای همه شان نوشت.

اگر از يک کنترل کپی کنيم (در حالی که فوکوس در Design Time به آن است، کليدهای CTRL+C را فشار دهيم) و سپس آن را در همان فرم Paste نماييم (کليدهای CTRL+V را فشاردهيم) ، پيغامی بر روی صفحه نمايش ظاهر می‌شود مبنی بر اينکه "يک کنترل ديگر با همين نام در فرم وجود دارد، آيا می خواهيد آرايه ای از کنترل ايجاد کنيد؟" که می توانيد جواب No به آن بدهيد. اما اگر به اين پيغام دکمه Yes را پاسخ دهيد، VB به طور خودکار نام هر دو را يکسان (و به نام کنترل کپی شده) در نظر می گيرد و Index کنترل اول را صفر و Index کنترل دوم را يک قرار می دهد (Index ، يکی از مشخصه (Property)های تمام کنترل ها می باشد).

می توان اينکار را دستی نيز انجام داد. يعنی دو کنترل (يا چند کنترل) خاص را يک نام واحد دهيم که در اينصورت VB پس از دادن يک پيغام مبنی بر همين موضوع، آن دو کنترل (يا چند کنترل) را به صورت آرايه کنترل تبديل خواهد کرد و به هر يک Index خاصی را نسبت خواهد داد.

اگر آرايه کنترل ايجاد کنيم، هر رويداد (Event) ای که بر روی هريک از عناصر رخ دهد (مانند Click و غيره) ، روی تمام آرايه صورت مي گيرد و مقدار Index مربوط به عضوی که رويداد بر روی آن صورت گرفته، به عنوان يکی از پارامترهای پروسيجر آن، باز می گردد. برنامه بعد را بنويسيد تا با نحوه کار آرايه کنترلها آشنا شويد.

فرض کنيد بخواهيم يک ماشين حساب ساده  طراحی کنيم:

يک Label به نام lblDisplay به عنوان نمايشگر ماشين حساب و با Caption برابر مقدار" 0" (زيرا مقدار اوليه ماشين‌حساب‌ها صفر می باشد) در محل خود قرار می دهيم. همچنين يکCommandButtonبه نام cmdequal به عنوان دکمه مساوی" و با Caption برابر "= " نيز در محل مخصوص خود قرار می دهيم.

حال ده عدد Command Botton ديگر با Caption های به ترتيب برابر " 0" تا "9 " را در جای خود قرار می دهيم و سپس نام همه اين ده دکمه را به نام cmdNumber  تغيير می دهيم. در اين صورت همانطور که گفته شد، VB اين ده کنترل را به صورت آرايه کنترلی (Control Array) در نظر خواهد گرفت (به پيغام داده شده با همين مضمون جواب Yes دهيد).

به همين ترتيب چهار CommandButton ديگر را با Captionهای "+ " و "- " و "* " و "/ " و با نام يکسان cmdOprator به عنوان دکمه های چهار عمل اصلی به صورت آرايه کنترلی در محل های خود قرار می دهيم.

حال کافی است در يونيت مربوط به اين فرم، چنين کدنويسی کنيم (توجه داشته باشيد که متغيرهاي x و y و op در سطح فرم (Form Level) تعريف شده اند و لذا مقدار آن در تمام فرم قابل دسترسی خواهد بود) :

Option Explicit

Dim x,y As Integer

Dim op As String

 Private Sub cmdNumber_Click (Index As Integer)

          IF lblDisplay = “Ø” then lblDisplay = “”

          lblDisplay = lblDisplay + cmdNumber(Index).Caption

End Sub

 Private Sub cmdOprator_Click (Index As Integer)

          x = Val(lblDisplay)

          op = cmdOprator(Index).Caption

          lblDisplay = “Ø”

End Sub

Private Sub cmdEqual_Click ( )

          y = Val (lblDisplay)        

          Select Case op

                   Case “+”

                             lblDisplay = x + y

                   Case “-”

                             lblDisplay = x - y

                   Case “*”

                             lblDisplay = x * y

                   Case “/”

                             lblDisplay = x / y

          End Select

End Sub

 توجه داريد که:

1.     در رويدادهايی که مربوط به آرايه های کنترلی (يعنی cmd Number و cmdoperator ) است، يک پارامتر به نام Index در آن وجود دارد که شماره Index (انديس) کليدی که فشرده شده را برمی‌گرداند. و لذا مثلاً cmdOprator(Index).Caption برابر "+" خواهد بود، اگر کليد + فشرده شود و برابر "- " خواهد بود، اگر کليد – زده شود و ...

2.     مشخصه (Property) پيش فرض برای Labelها Caption است و لذا هر جا lblDisplay ذکر شده است، توسط VB مانند lblDisplay.Caption در نظر گرفته می شود.

3.     توسط دستور Select Case، يک متغير (که نام آن جلوی دستور Select Case نوشته می شود) با مقادير مختلفی (که جلوی دستورات Case بعدی نوشته می شود) چک می شود که اگر برابر هر يک از اين مقادير بود، دستور پس از همان Case اجرا می شود.

همانطور که قبلاً نيز ذکر شد، هرگاه بخواهيم کاربر (User) از بين چند مورد، يک و فقط يک مورد را انتخاب کند (مثلاً سؤال چهار گزينه ای و ...) از کنترل Option Button استفاده می کنيم.

کنترل مذکور (مانند CheckBoxها) دارای مشخصه ای به نام Value می باشد که اگر مقدار آن برابر True باشد، انتخاب شده و در صورتی که برابر False باشد، انتخاب نشده خواهد بود. بنابراين اگر برروی فرمی مثلاً دو OptionButton قرار دهيم، مسلماً اگر مقدار Value از يکی را True کنيم، به طور خودکار مقدار Value برای ديگری False خواهد شد.زيرا فقط يکی از OptionBotton ها را می توان انتخاب کرد.

حال اگر بخواهيم OptionButtonها را روی يک فرم به صورت موضوعی دسته بندی کنيم و از هر دسته بتوانيم يکی را انتخاب کنيم، بايد به تعداد دسته ها، کنترل Frame به شکل  برروی فرم قرار دهيم و آنگاه OpiontButtonها را بر روی Frameها (نه با دابل کليک بلکه با انتخاب کنترل OptionButton و قرار دادن آن بوسيله Drag & Drop روی Frame) قرار می دهيم و سپس می توان Caption مربوط به Frameها (آن چيزی که به عنوان تيتر در بالای هر فريم نوشته می شود) و OptionButtonها (آن چيزی که جلوی هر Option Button برای معرفی آن نوشته می شود) را به دلخواه تغيير داد.

يک Label به نام lblDisplay و دو فريم به نامهای fraProcessor و fraOS بر روی صفحه قرار می دهيم. بر روی fraProcessor (و بوسيله انتخاب کنترل و Drag & Drop بر روی فريم) ، سه OptionButton به نامهای واحد optProcessor و با Captionهای Pentium، Pentium II و Pentium III قرار می دهيم. همچنين بر روی fraOS نيز سه OptionButton ديگر به نامهای واحد optOS و با Captionهای Windows98، Windows2000 و WindowsNT قرار می دهيم. (توجه داريم که در اينصورت دو Control Array به نامهای optProcessor و optOS ساخته ايم).

حال کدهای زير را در يونيت اين فرم می نويسيم:

Option Explicit

Dim proc As string

Dim os As string

 Private Sub Clicked ( )

          lblDisplay = “You select” + proc + “and” + os

End Sub

 

Private Sub Form1_load ( )

          optProcessor(Ø).Value = True

          optOS(Ø).Value = True

End Sub

 Private Sub optOS_Click (Index As Integer)

          os = optOS(Index).Caption

          Call Clicked

End Sub

 Private Sub optProcessor_Click (Index As Integer)

          proc = optProcessor(Index).Caption

          Call Clicked

End Sub

توجه داريم که:

1.     روال clicked در برنامه فوق هرگاه فراخوانی شود پيغام مناسب را در lblDisplay نمايش خواهد داد.

2.     رويداد load برای يک فرم بلافاصله پس از load شدن آن فرم روی می دهد. در Event Procedure مربوط به رويداد load از Form1 در برنامه فوق، دستور داده ايم که اولين OptionButton هر فريم (با انديس برابر صفر) را انتخاب شده نمايد.

3.     در رويدادهای Click مربوط به آرايه های optOS و optProcessor دستور داده ايم که مقدار Caption هر OptionButtonای که کليک شده را (توسط مثلاً optOS(Index).Caption ) در متغيرهای os و proc قرار دهد و سپس روال Clicked که برای نمايش بر روی label بود را فراخوانی نمايد.

فرض كنيد بخواهيم برنامه اي بنويسيم كه تصوير داخل PictureBox مبداُ (سمت چپ) را بوسيله Drag & Drop به PictureBox مقصد (سمت راست) منتقل كنيم.

ابتدا دو PictureBox (كه كنترل آن در ToolBox به شكل     مي باشد) را در مكانهاي خود قرار داده و مشخصه Name آنها را picSource و picTarget مي گذاريم. PictureBoxها داراي مشخصه اي به نام Picture هستند كه بوسيله آن مي‌توانيم يك تصوير را در آن قرار دهيم. اگر بخواهيم اين مشخصه را در زمان طراحي (Design Time) تنظيم نماييم، كافيست بر روي نام اين مشخصه در پنجره Properties، دابل كليك نماييم، يك پنجره محاوره اي باز مي شود كه مي توانيم تصوير مورد نظرمان را بياوريم و آن را انتخاب كنيم. (پنجره‌اي مانند پنجره هاي Open در ويندوز). اما اگر بخواهيم آن را در زمان اجرا (Run Time) تنظيم نماييم، بايد اين مشخصه را برابرتابع loadPicture( ) قرار دهيم كه مسير و نام تصوير مورد نظر به عنوان پارامتر اين تابع قرار مي‌گيرد.  . اگر در پارامتر اين تابع چيزي قرار نگيرد، مشخصه Picture را خالي مي كند يعني PictureBox مورد نظر را (در صورتي كه داراي تصوير بوده) بدون تصوير مي كند.

حال مشخصه Picture از picSource را (در زمان طراحي) به تصوير دلخواه مورد نظر خود تغيير دهيد و در واقع يك تصوير را در آن قرار دهيد. شايان ذكر است كه مي توانيد تصاوير فراوان مناسبي را مسير Visual Studio>Common>Graphics دستگاه خود (در داخل مسيري كه برنامه Visual Studio را در آن نصب كرده ايد)، بيابيد.

به سراغ برنامه خود برويم، تا اينجا ظاهر (Interface) برنامه را ايجاد كرديد. حال لازم است به كدنويسي براي آن بپردازيم. ولي قبل از آن توضيح در مورد چند رويداد را ضروري مي دانم كه عموما غالب كنترلهاي VCL داراي اين رويدادها مي باشند:

رويداد MouseDown : زماني براي يك VCL رخ مي دهد كه دكمه اي از ماوس را روي آن VCL فشار دهيم.
رويداد MouseUp : زماني براي يك VCL رخ مي دهد كه دكمه زده شده از ماوس را رها كنيم.
رويداد MouseMove : زماني براي يك VCL رخ مي دهد كه نشانگر ماوس را بر روي آن حركت دهيم.
رويداد DragOver : زماني براي يك VCL رخ مي دهد كه VCL ديگري كه در حال Drag شدن است را بر روي اين VCL بياوريم.
رويداد DragDrop : زماني براي يك VCL رخ مي دهد كه VCL ديگري كه در حال Drag شدن است را بر روي اين VCL، Drop (رها) نماييم.

حال كه با اين رويدادها آشنا شديم، كافيست كدهاي زير را در يونيت اين فرم داشته باشيم:

Option Explicit

 Private Sub picSource_MouseDown (Button As Integer,Shift As Integer,x As Single,y As Single)

            picSource.Drag vbBegineDrag

End Sub

  Private Sub picTarget_DragDrop (Source As Control)

          PicTarget .Picture = picSource.Picture

          picSource.Picture = loadPicture( )

End Sub

توجه داشته باشيم كه وقتي رويداد MouseDown براي picSource روي مي دهد، توسط متد Drag از picSource (يعني توسط picSource.Drag) و به همراه پارامتر VbBeginDrag براي آن، عمل Drag آغاز مي شود و در صورتي كه عمل Drop شدن روي picTarget صورت بگيرد (يعني اگر رويداد DragDrop براي آن رخ دهد)، تصوير داخل picSource به داخل picTarget منتقل مي شود (بوسيله دستور picTarget.Picture = picSource.Picture) و سپس تصوير داخل picSource (بوسيله دستور ()picSource.Picture = loadPicture ) حذف مي شود.

و بالاخره آخرين تذكري كه در اينجا داده مي شود اينكه مشخصه Picture براي PictureBoxها مشخصه پيش فرض  (Default) مي باشد و لذا مثلا بجاي pictarget.picture می‌توان از pictarget نيز استفاده كرد.

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

براي درست كردن منو براي يك فرم از MenuEditor كه در منوي Tools قرار دارد استفاده مي كنيم. همچنين MenuEditor يك دكمه فوري نيز بر روي ميله ابزار استاندارد VB به شكل  دارد كه با كليك بر روي آن نيز پنجره MenuEditor باز مي شود.

در پنجره مذكور كافيست عنوان منوي اول (مثلاMenu1) را در كادر Caption بنويسيم و مانند ساير objectهاي VB به اين منو هم يك نام (مثلاmnuMenu1) در كادر Name وارد كنيم. حال براي وارد كردن نام و عنوان منوي بعدي كافيست كليد Next را بزنيم. اما معمولا منوي بعدي، آيتمي از منوي قبلي خواهد بود. اگر كليد     را بزنيم، منوي جاري به عنوان زير منوي قبلي محسوب خواهد شد. پس از وارد كردن اولين آيتم كافيست بوسيله دكمه Next آيتم هاي بعدي اولين منو را نيز وارد كنيم. اگر يكي از آيتم ها خود شامل زير آيتم هايي بود باز هم مي توان از كليد      سود برد. و بالاخره براي اينكه به سراغ منوي دوم برويم لازم است از كليد     به تعدادي استفاده كنيم كه ديگر زيرمنوي يك منوي ديگر نباشد و به همين ترتيب ساير منوها و آيتمها را نيز نامگذاري و عنوان‌دهي مي‌كنيم و ساختار مورد نظرمان را براي منوها ايجاد مي‌كنيم.

توجه داشته باشيد كه در MenuEditor علاوه بر آنچه تابه‌حال گفته شد:

• دكمه Delete براي پاك كردن يك منو (يا آيتم) استفاده مي شود.

• دكمه Insert براي افزودن يك منو (يا آيتم) ميان دو منو (يا آيتم) ديگر استفاده مي شود

• Check Boxهاي Visible و Enable به ترتيب اگر انتخاب نشده شوند، منوي مذكور ديده نمي شود و يا اينكه فقط غيرفعال (و به رنگ خاكستري) خواهد شد.

• Check Box با عنوان Checked اگر انتخاب شود، باعث خواهد شد تا كنار آن منو (آيتم) يك "چك‌مارك" ديده شود. (معمولا اين مشخصه در Run Time و بر حسب نياز تنظيم مي شود)

• توسط Shortcut مي توانيم يك ميانبر (Shortcut) براي يكي از آيتم‌ها درست كنيم..

• توسط Index مي توانيم آرايه اي از منوها را طراحي نماييم ( همانطوری که آرايه ای ازساير کنترلها  درست می کرديم، يعنی بايد نام دو يا چند منو را يک نام واحد بگذاريم و Index متفاوت به هريک بدهيم.)

• و توسط NegotiatePosition مي‌توان نوع چيدن آيتم‌ها (راست چين، چپ چين، وسط چين) را تعيين نمود.

چند تذكر:

• براي دستيابي به مشخصه هاي منوها نيز مانند ساير كنترلها از نام آنها و يك نقطه(Dot) و سپس نام مشخصه مورد نظر استفاده مي كنيم. مثلا اگر منويي به نام mnuOpen داشته باشيم و بخواهيم آن را غيرفعال و يا مارك‌دار نماييم به ترتيب از دستورات زير استفاده خواهيم كرد:

mnuOpen.Enable = False

mnuOpen.Checked = True

• مشخصه WindowList در بحث MDI Forms خواهد آمد و از مشخصه HelpContentID نيز تنها زماني كه يك فايل HLP داشته باشيم مي‌توانيم استفاده كنيم.

• اگر بخواهيم بين دو آيتم از منويي يك خط جداكننده آورده شود (آنچه در ويندوز براي جداكردن بخشهاي مختلف يك منوي خاص معمول است) كافي است بين آن دو آيتم، يك آيتم Insert نماييم، نام آن را يك نام دلخواه (مثلا mnuLine) و عنوان (Caption) آن را يك منفي (كاراكتر "-" يا اصطلاحا Dash) بگذاريم.

• اگر بخواهيم براي شي خاصی يك PopUpMenu طراحي كنيم (منوهاي بازشونده‌اي كه وقتي بر روي شي كليك راست شود از آن خارج مي‌شود) كافيست يك منو (با آيتمهاي مورد نظر براي آن) را طراحي كنيم (و حتي در صورت نياز Visible آن را False كنيم) و در رويداد MouseDown از آن شي خاص، پس از اينكه شرط كرديم كليد زده شده كليد راست ماوس باشد (با استفاده از شرط برابري پارامتر Button از اين رويداد با مقدار ثابت VbRightButton)، با استفاده از دستور PopUpMenu، نام منوي مورد نظر را فراخواني مي كنيم يعني بايد چنين داشته باشيم:

Private Sub controlName_MouseDown (Button As Integer,…)

          IF Button = VbRightButton Then

                   PopUpMenu mnuMenu1

          End IF

End Sub

كه بجاي controlName نام آن كنترلي كه قرار است كاربر روي آن كليك راست نمايد و بجاي mnuMenu1 نام آن منويي كه قرار است به صورت PopUp آورده شود را ذكر مي كنيم.

مطمئنا تا بحال در ويندوز از كادرهاي محاوره‌اي زيادي مثل پنجره هاي Open، Save، نمايش خصوصيات چاپگر (Printer)، كادر انتخاب رنگ، كادر انتخاب Font و پنجره Help ويندوز استفاده كرده ايد.

در VBبراي نمايش اينگونه پنجره‌هاي محاوره‌اي از كنترل DialogBox استفاده مي‌كنيم. اين كنترل يكي از كنترل‌هاي  Non - Visual ويژوال بيسيك مي‌باشد. Non-Visual Controls همانطور كه قبلا هم آمده است، انواعي از كنترل‌ها هستند كه فقط در زمان طراحي (Design Time) بر روي فرم ديده مي‌شوند و در Run Run Time فقط مي‌توان از اثر آنها بهره برد.

كنترل مذكور بطور پيش فرض در ToolBar وجود ندارد. براي اضافه كردن آن به ToolBar بايد از منوي Project گزينه Components را انتخاب كنيم و در ليست Componentها، گزينه Microsoft Common Dialog Control 6 را چك مارك بزنيم و آن را تاييد (OK) نماييم. در اينصورت يك كنترل به شكل       به ToolBar افزوده خواهد شد كه مي توانيد آن را با دابل كليك بر روي فرم قرار دهيد. توجه داريم كه كنترل مذكور Non-Visual است و لذا نيازي به تنظيم مكان اين كنترل بر روي فرم نداريد.

كنترل Dialog Box داراي متدهاي زير مي باشد:

ShowColor براي نمايش پنجره محاوره‌اي تعيين رنگ در زمان فراخواني اين متد.

ShowFont براي نمايش پنجره محاوره‌اي تعيين فونت در زمان فراخواني اين متد.

 ShowHelp براي نمايش پنجره محاوره‌اي راهنماي ويندوز در زمان فراخواني اين متد.

ShowOpen براي نمايش پنجره محاوره‌اي باز كردن يك فايل در زمان فراخواني اين متد.

ShowPrinter براي نمايش پنجره محاوره‌اي تعيين خصوصيات چاپگر در زمان فراخواني اين متد.

ShowSave براي نمايش پنجره محاوره‌اي ذخيره كردن در يك فايل در زمان فراخواني اين متد.

Private Sub cmd_Click ( )

          cdb.ShowColor

          lbl.ForeColor = cdb.Color

End Sub

يا اگر بخواهيم توسط دکمه‌ای ديگر به نام cmd2، پنجره Open باز شود، و هر فايلی از هر مسيری را که کار بر انتخاب کرد، در lbl نمايش داده شود، می‌نويسيم:

Private Sub cmd2_Click ( )

          cdb.ShowOpen

          lbl.Caption = cdb.FileName

End Sub

از تابع MsgBox برای ارسال يک پيغام به کاربر و يا مطرح نمودن يک پرسش و دريافت جواب مثبت يا منفی او به سؤال مطرح شده و از تابع InputBox برای دريافت يک عبارت از کاربر، استفاده می‌شود.

توابع مذکور را می‌توان مانند دستور نوشت، يعنی نام يکی از آن دو را و با يک فاصله پارامترهای احتمالی آنها را نوشت. همچنين می‌توان آنها را مانند يک Function به VB معرفی کرد. (يعنی اين توابع دارای مقدار بازگشتی باشند) که برای اين منظور بايد پارامترهای آنها را داخل پرانتز نوشت.

پنج پارامتر اول Input Box به ترتيب عبارتند از:

Prompt: که يک عبارت رشته ای را (و يا يک متغير رشته ای (String) را) بجای آن می‌نويسيم که اين عبارت همان پيغامی خواهد بود که در اجرای  InputBox به کاربر نشان داده خواهد شد (مثلاً پيغام اينکه او بايد چه چيزی را وارد کند).

Title: که عنوان InputBox در TitleBar آن خواهد بود (به صورت عبارت رشته‌ای).

Default: که مقدار پيش فرض برای آن چيزی است که کاربر قرار است وارد نمايد.

XPos و YPos: که طول و عرض گوشه بالا و سمت چپ InputBox را در هنگام اجرای آن مشخص می‌کند.

که می توان هريک از آنها را مقداردهی نکرد و در اينصورت مقادير پيش فرض VB برای آنها در نظر گرفته خواهد شد.

به عنوان مثال اگر دستورات:

Dim s As String

s = InputBox (“Please enter your name” , “Title” , “Alireza”)

را در برنامه داشته باشيم در زمان اجرای اين دستورات شکلی  را مشاهده خواهيم کرد:

مشاهده می کنيد که بطور پيش فرض مقدار “Alireza” در کادر مربوط قرار گرفته است که کاربر می تواند آن را تغيير دهد. در هر حال پس از تأييد اين کادر توسط کاربر، آنچه در کادر مذکور باشد به عنوان نتيجه در متغير رشته ای s ذخيره می شود و می‌توان از آن در ادامه استفاده نمود.

اما سه پارامتر اول MsgBox نيز به قرار زيراند:

Prompt: که پيغامی است که در Message Box زمان اجرا به کاربر نمايش داده خواهد شد.

Button: که می توان دکمه های مورد نظر و علامت موردنظر برای  Message Box را در آن تعيين نمود. برخی از مقادير مهمی که می توان در اين پارامتر قرار داد عبارتند از:

1.     VBOKOnly : کادر مذکور فقط دارای دکمه OK خواهد بود.

2.     VBOKCancel: کادر مذکور دارای دکمه های OK و Cancel خواهد بود.

3.     VBYesNo: کادر مذکور دارای دکمه های Yes و No خواهد بود.

4.     VBYesNoCancel: کادر مذکور دارای دکمه های Yes و No و Cancel خواهد بود.

5.     VBAbortRetryIgnore: کادر مذکور دارای دکمه های Abort و Retry و Ignore خواهد بود.

6.     VBRetryCancel: کادر مذکور دارای دکمه های Retry و Cancel خواهد بود.

7.     VBMsgBoxRight: در کادر مذکور Title را راست چين می‌کند.

8.     VBMsgBoxRtlReading: کادر مذکور را راست به چپ (Right to Left)  می‌کند (و برای پيغام های فارسی مناسب است)

9.     VBCritical: يک علامت        در کنار کادر اضافه خواهد شد.

10.                        VBExclamation: يک علامت        در کنار کادر اضافه خواهد شد.

11.                        VBInformation: يک علامت        در کنار کادر اضافه خواهد شد.

12.                        VBQuestion: يک علامت       در کنار کادر اضافه خواهد شد.

نکته: می توان آنهايی را که با هم تداخلی ندارند با علامت + با هم ترکيب کرد. مثلاً اگر بخواهيم که هم دکمه های OK و Cancel بيايند و هم در کنار پيغام، علامت          بيايد و هم Title راست چين شود، می توان در اين پارامتر چنين نوشت:

VBOKCancel + VBInformation + VBMsgBoxRight

Title: که می توان عبارتی که در TitleBar اين کادر می آيد را مشخص نمود.

به عنوان مثال اگر دستورات:

Dim Result As VbMsgBoxResult

Result = MsgBox (“Are you sure you want to exit?”,vbQuestion+vbYesNo, “Exit”)

IF Result = vbYes then Unload Me

را وارد کنيم، در اينصورت در زمان اجرای اين دستورات ابتدا شکلی به کاربر نمايش داده خواهد شد و در صورتی که کاربر به پيغام داده شده پاسخ Yes دهد، فرم فعال (که در VB با Me نمايش داده می شود)، Unload خواهد شد:

 

توجه داريم که نتيجه تابع MsgBox از نوع داده vbMsgBoxResult می باشد و لذا ما در بالا متغير Result را از اين نوع داده تعريف کرديم. اين نوع داده می تواند يکی از مقادير vbAbort، vbCancel، vbIgnore، vbNo، vbOK، vbRetry و vbYes باشد.