آموزش مبانی ویژوال بیسیک/آشنایی با برنامه نویسی بهوسیله VB
مفاهیم بنیادی در ویژوال بیسیک | آشنایی با برنامه نویسی بهوسیله VB | تعریف متغیرها در ویژوال بیسیک |
آموزش مبانی ویژوال بیسیک |
به عنوان اولین پروژه، قصد داریم فرمی داشته باشیم با دو دکمه Message و Exit که اگر در دکمه Message کلیک شد، پیغامی نمایش داده شود و اگر دکمه Exit کلیک شد از برنامه خارج شود (شکل۳):
ابتدا فرمی که بر روی صفحه نمایش باز است (فعلاً به نام Form 1) را به اندازه دلخواه در میآوریم و در حالی که Select است، از پنجره Properties (سمت راست تصویر)، مشخصه (Property)های زیر را چنین Set میکنیم:
۱- مشخصه Name آن را به frmFirstProject تغییر میدهیم.
۲- مشخصه Caption آن را به First Project تغییر میدهیم.
مشخصه Caption معمولاً عنوانها را تغییر میدهد. مثلاً در مورد فرمها، آنچه در این مشخصه Set شود در Title Bar از آن فرم دیده میشود یا در مورد دکمهها، آنچه در این مشخصه قرار داده شود، آن چیزی است که بر روی دکمه (به عنوان نام دکمهای کهُ کاربر میبیند) دیده میشود.
مشخصه Name یکی از مهمترین مشخصههایی است که باید برای تمام کنترلها Set شود. آنچه در این مشخصه قرار گیرد، نامی است که VB آن کنترل را به این نام میشناسد (و خصوصاً در هنگام کدنویسی و برای دسترسی به کنترلها، بسیار مورد استفاده واقع میشود). به طور پیش فرض VB برای هر کنترل یک Name در نظر میگیرد، اما در پروژههای واقعی، معمولاً تعداد کنترلها آنقدر زیاد میشوند که نامهای پیش فرض به سختی در ذهن میماند. برای این منظور بهتر است به کنترلها، نامهایی را نسبت دهیم که از جهتی با او متناسب باشد؛ لذا بهتر است اولاً در نام آنها چیزی باشد که نشان از نوع آن کنترل باشد و عبارتی نیز باشد که بیانگر موضوع یا کار فعلی آن باشد. به عنوان مثال شما میبینید که ما در مشخصه Name از form، گفتیم که قرار دهیم: frmFirstProject که frm به خاطر تشخیص Form بودن آن است و First Project به خاطر تشخیص اینکه این فرم برای First Project است. یا مثلاً به فرض اگر بخواهیم دکمهای به نام Exit بر روی فرمی داشته باشیم، من ترجیح میدهم که نام آن را cmdExit بگذارم که cmd را از Command Button گرفتهام. توجه داریم که این نامی است که VB آن را میشناسد وگرنه برای زیبایی کار Caption این دکمه را همان Exit میگذاریم و این نام گذاری به زیبایی پروژه ما لطمهای وارد نمیکند.
برای ادامه، دو دکمه (Command Button) بر روی فرم قرار میدهیم (که برای این منظور از پنجره Controlها که در سمت چپ تصویر است، کنترل Command Button به شکل را دابل کلیک میکنیم و یا با یک Click و انتخاب آن، بر روی فرم، به اندازه دلخواه Drag & Drop میکنیم) و جای آنها را به مکان دلخواه مورد نظر (به وسیله Drag & Drop آنها) تغییر میدهیم. آنگاه برای یکی از آنها:
۱- مشخصه Name را به cmdMessage تغییر میدهیم.
۲- مشخصه Caption را به Message تغییر میدهیم.
و برای دیگری تغییر میدهیم:
۱- مشخصه Name را به cmdExit.
۲- مشخصه Caption را به Exit.
که پس از این، شمای ظاهری (Interface) برنامه کامل شده است و باید به کدنویسی آن پرداخت. اگر بر روی دکمه Exit دابل کلیک کنید (البته هنوز در Design Time هستیم و نه Run Time)، Event Procedure مربوط به رویداد Click (Event) از آن را به صورت زیر باز میکند:
Private Sub cmdExit_Click () End Sub که هر دستوری که در این Procedure (یعنی بین خط Private و خط End Sub) نوشته شود، در زمان اجرا، وقتی کاربر روی دکمه Exit کلیک میکند، این دستورات اجرا خواهند شد.
دستوری که باید در cmdExit_Click نوشته شود بسیار ساده است:
Private Sub cmdExit_Click
End
End Sub
دستور End هر جایی از برنامه که اجرا شود فوراً اجرای برنامه را متوقف و از آن خارج میشود. حال اگر به ترتیبی که در بالا ذکر شد، Event Procedure مربوط به رویداد click از دکمه Message را نیز باز میکنیم و آن را به صورت زیر تغییر میدهیم:
Private Sub cmd, Message - Click
MsgBox “The first project was done successful” و و “Thanks”
End Sub
پروژه مورد نظر آماده شده شده است. دستور MsgBox (مخفف Message Box)باعث میشود تا یک کادر پیغام بر روی صفحه نمایش ظاهر شود و تا زمانی که دکمه OK از آن را فشار دهیم، پیغامی را نمایش دهد. در این دستور پارامتر اول، پیغام مورد نظر را به صورت string (یک داده متنی) دریافت میکند (در VB هر عبارتی که بین دو علامت " " قرار گیرد، string فرض میشود) و پارامتر سوم نیز به عنوان Message Box (که در Title Bar آن آورده خواهد شد) را به صورت متنی دریافت میکند. توجه داریم که بین هر دو پارامتر از علامت کاما (,) استفاده میکنیم و بنابراین در دستور MsgBox برنامه مان برای اینکه پس از پارامتر اول، پارامتر سوم را وارد کنیم بین آن دو پارامتر، دو بار کاما گذاشتهایم. حال برنامه تان را اجرا کنید و نتیجه کار را ببینید (اجرای برنامه در VB توسط کلید F5 صورت میگیرد.
ذکر چند نکته:
۱- اگر بخواهید فشردن ALT+X همان عمل دکمه Exit را انجام دهد (ایجاد(Hot key)، کافی است در Caption این دکمه چنین بنویسید: E&xit که در این صورت در زمان اجرا، زیر حرف x یک underline (زیر خط) میکشد که در ویندوز این حالت نشانگرHot key داشتن آن حرف است، همین کار را هم در مورد دکمه Message انجام دهید.
۲- در هنگام کدنویسی اگر چند حرف اول یک کلمه شناخته شده VB (مانند نام کنترلها و یا Propertyها، Methodها و ...) را بنویسیم و CTRL+Space را فشار دهیم، اگر تنها یک کلمه با حرف اول برابر آنچه شما نوشتهاید پیدا کند، بقیه حروف را خود، کامل میکند و اگر تعدادی کلمه با این مشخصات پیدا کند، لیست آنها را نمایش میدهد که میتوانید یا یکی از آنها را انتخاب کنید (بر روی کلمه از لیست بروید و کلید space را بزنید) و یا تعدادی از حروف آن را بنویسید تا محدوده کلمات مشابه کوتاهتر شود. این کار را حتماً امتحان کنید!
۳- زمانی که یک فرم باز میشود، به ترتیب چهار Event بر روی آن رخ میدهد:
Initialize
Load
Activate Got focus
که زمانی که رویداد اول رخ میدهد، هنوز objectهای روی فرم ایجاد نشدهاند و قابل دسترسی نیستند. این objectها در load ساخته میشوند، اما هنوز فرم نمایش داده نشده است. وقتی فرم نمایش داده میشود، رویداد Activate و وقتیfocus به آن داده میشود، رویداد Got focus روی میدهد. (منظور از گرفتن focus اینست که آن کنترل خاص که در اینجا فرم است، کانون تمام پیامها شود، مثلاً اگر کلیدی زده شد به آن فرستاده شود و ...).
۴- برای ذخیره کردن پروژه از منوی فایل و گزینه Save استفاده میشود که باید تمام فرمها، ماژولها، ... و اصل پروژه را جداگانه ذخیره کرد؛ لذا اگر شما برنامه First Project راsave کنید، یکبار نام فرم را save میکند (با پسوند.frm) و یکبار فایل پروژه را (با پسوند.VBP). مثالی دیگر و استفاده از Label و TextBoxها
فرض کنید بخواهیم فرمی داشته باشیم که دارای دو Text Box (که در VB برای عملیات دریافت اطلاعات از کاربر (DataEntrq) معمولاً از این کنترل استفاده میشود) برای درجه سیلسیوس و درجه فارنهایت باشد و توسط یک دکمه (و در واقع با فشردن آن توسط کاربر) مقداری که در Text box مربوط به درجه سیلسیوس نوشته شده بود را به فارنهایت تبدیل کند و نتیجه را در Text Box مربوط به آن درج نماید. (توجه: اگر Cمقدار درجه برحسب سیلسیوس و F مقدار درجه برحسب فارنهایت باشد، تبدیل سیلسیوس به فارنهایت از فرمول F=9/5 C+۳۲ محاسبه میشود).
برای این منظور، از جعبه ابزار (جعبه حاوی کنترلها)، دو برچسب (Label) که در جعبه ابزار به شکل دیده میشود را بر روی فرم قرار میدهیم (برچسب(Label)ها در VB معمولاً زمانی استفاده میشود که بخواهیم بر روی فرم، عبارتی را به کاربر نشان دهیم که او قابلیت تغییر آن را نداشته باشد) آنها را بوسیله Drag & Drop به مکان دلخواه منتقل میکنیم و برای یکی از آن دو:
۱- مشخصه Name را به lblCelsius
۲- مشخصه Caption را به Celsius
و برای دیگری:
۱- مشخصه Name را به lblFahrenheit
۲- مشخصه Caption را به Fahrenheit
تغییر میدهیم. توجه داریم که در نامگذاری Labelها با سه حرف اول lbl آغاز کردهایم. همچنین توجه داریم که بر روی فرم، عبارات Celsius و Fahrenheit در واقع همین دو Label هستند.
نکته: برای Label هایک مشخصه (Property) دیگر به نام Auto Size وجود دارد که اگر مقدار آن را به True تغییر دهیم، اندازه (size) آن به طور اتوماتیک به اندازه متن (caption) داخل آن خواهد شد و بنابراین معمولاً بهتر است این مشخصه را نیز set کنیم.
حال دو Text Box (جعبه متن) در مقابل این Label (Text Boxها در جعبه ابزار به شکل دیده میشوند، معمولاً برای نمایش و دریافت اطلاعات به طور توأم به کار میرود (بر عکس Labelها که فقط وظیفه نمایش اطلاعات را به عهده داشتند) و خصوصاً برای فرمهای DataEntrq (دریافتی اطلاعات) بسیار مناسب هستند. پروژه فعلی ما، نمونهای کوچک از فرمهای DataEntrq است) و مناسب با هر یک از برچسبها، برای یکی از آن دو
Text Box: ۱- مشخصه Name رابه txtCelsius تغییر میدهیم.
۲- مشخصه Text را خالی میکنیم.
و برای دیگری:
۱_ مشخصه Name را به txtFahrenheit تغییر میدهیم.
۳- مشخصه Text را خالی میکنیم.
واضح است که در نامگذاری TextBoxها نیز از قرارداد سه حرف اول متناسب با نوع شئ، استفاده کردیم و سه حرف اول آنها را txt گذاشتیم. مشخصه Text در Textboxها آن متنی است که داخل آن متنی است که داخل آن نوشته میشود (شبیه مشخصهCaption در Labelها) و چونقرار است کاربرما آن را وارد کند، آن را خالی (NULL) کردیم.
حال یک دکمه (Command button) نیز به فرم اضافه و:
۱- مشخصه Name را به cmdConvent
۲- مشخصه Caption را به convent
تغییر میدهیم.
خوب، ظاهر (Interface) برنامه آماده شد. حال به کدنویسی برای آن میپردازیم. این اولین باری است که میخواهیم در زمان اجرا (Run Time) از مشخصهای استفاده کنیم (مشخصه Text از txtCelsiusکه توسط کاربر وارد شده) و مشخصهای را در این حال (Run Time) تغییر دهیم (مشخصه Text ازtxtFahrenheit که باید نتیجه را بنویسد)
در VB هنگام کدنویسی برای Run Time هر زمان بخواهیم از یک Object استفاده کنیم، کافی است نام (Name) آن را بنویسیم و اگر بخواهیم به یکی از مشخصههای آن دست یابیم، کافی است پس از نام آن یک نقطه (Dot) قرار دهیم و سپس نام مشخصه (Property) مورد نظر خورد را بنویسیم.
با توجه به این مطلنب، دیگر نوشتن کدهای مثال فوق کار چندان دشواری نیست. اگر بر روی دکمه Convent (البته در Design Time) دابل کلیک نمایید، در اینصورت Procedure مربوط به رویدادِ(Event) کلیک از آن باز میشود که کافی است در آن نوشته شود:
txtFahrenheit.Text = (۹/۵*txtCelsius.Text) + 32
یعنی Procedure باید به شکل زیر شود:
Private Sub cmdConvent_Click ()
txtFahrenheit.Text = (۹/۵*txtCelsius.Text) +32
End Sub
واضح است که وقتی مشخصه Text از یک Text Box در سمت یک تساویِ جایگزینی قرار میگیرد، مقدار فعلی آن در عملیات شرکت میکند و وقتی این مشخصه در سمت چپ این جایگزین قرار میگیرد، مقادیر محاسبه شده در آن قرار میگیرد.
بنابراین، Procedure فوق میگوید که وقتی بر روی دکمه Convent کلیک شد، هر مقداری که کاربر، داخل جعبه Celsius نوشته باشد را در ۹/۵ ضرب و با۳۲ جمع کن و مقدار نهایی را داخل جعبه مربوط به Fahrenheit بنویس.
این برنامه را حتماً بنویسید، آن را اجرا منید و با نحوه استفاده از Propertyها در این کدنویسی بری Run Time آشنا شوید. در ادامه، بیشتر با این نوع استفاده از Propertyها (یعنی set کردن در کدنویسی بجای set کردن در پنجره Properties از Design Time) مواجه خواهیم شد؛ و مهم است که این نوع استفاده را خوب درک کنیم.
نکته: مشخصه Text برایText Boxها و مشخصه Caption برای Labelها، مشخصههای پیش فرض آنها محسوب میشوند و اگر نام آنها را بدون هیچ مشخصهای بنویسیمف این مشخصهها در نظر گرفته میشود، اذا مثلاً در Procedure بالا میتوانستیم بجای txtCelsius.Text از خود txtCelsius نیز استفاده کنیم تغییری در وضعیت مثال قبل و استفاده از رویداد KeyUp
فرض کنید بخواهیم مثال قبل را طوری تغییر دهیم که با نوشتن هر رقمی در txtCelsius، بدون نیاز به فشردن کلید، نتیجه به طور خودکار در txtFahrenheit نوشته شود. مثلاً به محض اینکه عدد۸ رازدیم، تبدیل شده ۸ را به فارنهایت بنویسید و به محض فشردن کلید ۰ (روی هم شده است۸۰) تبدیل شده ۸۰ را به فارنهایت بنویسد و ...
ابتدا کدهای نوشته شده برای cmdconvert را پاک کنید و سپس خود کلید را نیز از روی فرم حذف کنید تا به سراغ کدنویسی برای خودText Boxها برویم. Text Boxها دارای جهار رویداد (Event) مهم میباشند:
KeyDown – KeyUp – KeyPress – Change
زمانی که فوکوس (تمرکز) به یک Text Box داده شود، اگر کلیدی از صفحه کلید زده شود، ابتدا رویدادKeyPress رخ میدهد (و این به سیستم میفهماند که یک کلیدی فشرده شد)، سپس رویداد KeyDown رخ میدهد (و این به سیستم میفهماند که کلید زده شده، تازه زده شده است و هنوز فشرده است) و وقتی دستمان را از روی کلید برداریم، رویداد KeyUp رخ میدهد.
رویداد Change نیز زمانی که هر تغییری در مقدار داخل Text box انجام شود، روی میدهد (و لذا مثلاً اگر کلیدی مثل Arrow Keys (کلیدهای حرکتی) که تغییری در مقدار داخل Text Box انجام نمیدهد زده شود، رویداد Change رخ نمیدهد)
توجه داشته باشیم که KeyDown (وKeyUp) برای همه کلیدهای صفحه کلید رخ میدهد اما رویداد KeyPress برای برخی مثل Arrow Keys رخ نمیدهد. Event Procedure مربوط به KeyDown و KeyUp دارای دو آرگومان (پارامتر) هستند:
۱- پارامتر keycode که کد آسکی کلید فشرده شده را بر میگرداند.
۲- پارامتر Shift که یکی از چهار مقدار ۰ و ۱ و ۲ و ۳ را بر میگرداند. اگر مقدار برگشتی آن یک باشد، یعنی در حال فشردن کلید زده شده، کلید Shift پایین بوده، مقدار برگشتی دو نشانگر پایین بودن کلیدAlt و مقدار برگشتی برابر سه، نشانگر پایین بودن کلید Control میباشد و صفر بودن آن، فشردن کلید بدون پایین بودن هیچیک از این سه کلید میباشد؛ و Event Procedure مربوط به KeyPress تنها یک آرگومان KeyAscki دارد که کد آسکی کلید فشرده شده را برمی گرداند.
با توجه به مطالب گفته شده، کافی است برای رویدادِ (Event) KeyUp از txtCelsius چنین بنویسیم:
Private Sub txtCelsius_KeyUp (KeyCode As Integer, shift As Integer)
txtFahrenheit = (Val (txtCelsius)*۹/۵) + ۳۲
End Sub
ذکر چند نکته:
۱- اگر بر روی یک Text Box در Design Time دابل کلیک کنید، به طور پیش فرض، رویداد Change از آن را برای کدنویسی باز میکند. اگر میخواهیم Event Procedure رویدادهای دیگر را بیاوریم، کافی است از Combo Box منوی باز شونده عمودی کرکرهای که یک فلش رو به پایین سمت راست خود برای باز شدن منو دارد) سمت راست بالای صفحه کدنویسی، یکی از Event Procedureها را به دلخواه انتخاب کنیم. Combo Box سمت چپ آن هم نام تمام Objectهای استفاده شده در آن فرم خاص را دارد که هر کدام انتخاب باشد، در Combo Box سمت راست، Procedureهای آن Object خاص را لیست خواهد کرد. در شکل ۵ برخی از رویدادهای مربوط به txtCelsius را میبینید.
۲- همانطور که میبینیم در Procedure فوق برای Text Boxها، نام هیچ مشخصهای را نیاوردیم که همانطور که قبلاً توضیح داده شد، در اینصورت به طور پیش فرض، مشخصه Text برای آنها در نظر گرفته میشود. ۳- تابع Val (مخفف Value) مقدار عددی یک string را برمی گرداند. از آنجا که مقدار داخل txtCelsius از نوع string 0متنی) است ولی باید بر روی آن عمل ضرب و تقسیم و جمع را انجام دهیم. ابتدا آن را توسط تابع Val، عددی نمودیم. (هر چند VB تا جای ممکن سعی میکند خودش این تبدیلات را اگر ما هم نگذاریم، انجام دهد ولی بهتر است عادت شود، برای جلوگیری از خطاهای احتمالی، شرایط هر موقعیت را فراهم آوریم.)
ادامه:
آخرین کاری که باید برای پروژه Second Example انجام دهیم، جلوگیری از خطای Type Miss Mach است. این خطا زمانی روی میدهد که در یک عملیات، مقادیر مناسب نباشند. مثلاً اگر بخواهیم مقدار متنی “Ali” را در مثلاً ۵ ضرب کنیم، این خطا (که در VB، خطای شماره ۱۳ است) رخ میدهد. در برنامه ما هم، اگر کاربر، در txtCelsius بجای یک عدد، حرفی را بنویسد، هنگام ضرب شدن در ۹/۵، همین خطا رخ خواهد داد. برای جلوگیری از بروز خطا و گرفتن کنترل خطا بدست برنامه، از تابع On Error استفاده میکنیم. اگر Procedure مربوط به رویداد Key Up از txtCelsius را به صورت زیر تغییر دهیم:
Private Sub txtCelsius–KeyUp (KeyCode As Integer, shift as Integer)
On Error Goto xx txtFahrenheit = (txtCelsius * ۹/۵) + ۳۲ Exit Sub
xx:
IF Err. number = 13 then txtFahrenheit = “can’t convert “ End IF
End Sub
در اینصورت تابع On Error میگوید که وقتی به خطایی در ادامه برخوردی به خطی از Procedure که دارای برچسب xx (یک برچسب اختیاری) است برو (Goto xx). اگر برنامه به این خط برود (یعنی وقتی خطایی رخ داد)، بررسی میکند اگر شماره خطای رخ داده شده (Err یک Object همیشگی در VB است که مشخصه number از آن، شماره شماره خطای رخ داده را در خود نگهداری میکند) برابر B بود، بجای convert کردن، در txtFahrenheit بنویسید” can’t convert “ (امیدوارم نحوه بکارگیری دستورات شرطی (IF sentences) را بدانید). تنها نکتهای که هست اینکه اگر خطا رخ نداد و convert انجام شد، دیگر نباید به خط xx وارد شود و لذا از دستور Exit sub استفاده کردع ایم. این دستور در هر جایی از یک sub اجرا شود، بلافاصله از آن خارج میشود و دستورات دیگر را اجرا نمیکند.
تغییری در وضعیت مثال قبل و استفاده از رویداد KeyUp
فرض کنید بخواهیم مثال قبل را طوری تغییر دهیم که با نوشتن هر رقمی در txtCelsius، بدون نیاز به فشردن کلید، نتیجه به طور خودکار در txtFahrenheit نوشته شود. مثلاً به محض اینکه عدد۸ رازدیم، تبدیل شده ۸ را به فارنهایت بنویسید و به محض فشردن کلید ۰ (روی هم شده است۸۰) تبدیل شده ۸۰ را به فارنهایت بنویسد و ...
ابتدا کدهای نوشته شده برای cmdconvert را پاک کنید و سپس خود کلید را نیز از روی فرم حذف کنید تا به سراغ کدنویسی برای خودText Boxها برویم. Text Boxها دارای جهار رویداد (Event) مهم میباشند:
KeyDown – KeyUp – KeyPress – Change
زمانی که فوکوس (تمرکز) به یک Text Box داده شود، اگر کلیدی از صفحه کلید زده شود، ابتدا رویدادKeyPress رخ میدهد (و این به سیستم میفهماند که یک کلیدی فشرده شد)، سپس رویداد KeyDown رخ میدهد (و این به سیستم میفهماند که کلید زده شده، تازه زده شده است و هنوز فشرده است) و وقتی دستمان را از روی کلید برداریم، رویداد KeyUp رخ میدهد. رویداد Change نیز زمانی که هر تغییری در مقدار داخل Text box انجام شود، روی میدهد (و لذا مثلاً اگر کلیدی مثل Arrow Keys (کلیدهای حرکتی) که تغییری در مقدار داخل Text Box انجام نمیدهد زده شود، رویداد Change رخ نمیدهد)
توجه داشته باشیم که KeyDown (وKeyUp) برای همه کلیدهای صفحه کلید رخ میدهد اما رویداد KeyPress برای برخی مثل Arrow Keys رخ نمیدهد. Event Procedure مربوط به KeyDown و KeyUp دارای دو آرگومان (پارامتر) هستند:
۱- پارامتر keycode که کد آسکی کلید فشرده شده را بر میگرداند.
۲- پارامتر Shift که یکی از چهار مقدار ۰ و ۱ و ۲ و ۳ را بر میگرداند. اگر مقدار برگشتی آن یک باشد، یعنی در حال فشردن کلید زده شده، کلید Shift پایین بوده، مقدار برگشتی دو نشانگر پایین بودن کلیدAlt و مقدار برگشتی برابر سه، نشانگر پایین بودن کلید Control میباشد و صفر بودن آن، فشردن کلید بدون پایین بودن هیچیک از این سه کلید میباشد؛ و Event Procedure مربوط به KeyPress تنها یک آرگومان KeyAscki دارد که کد آسکی کلید فشرده شده را برمی گرداند. با توجه به مطالب گفته شده، کافی است برای رویدادِ (Event) KeyUp از txtCelsius چنین بنویسیم:
Private Sub txtCelsius_KeyUp (KeyCode As Integer, shift As Integer)
txtFahrenheit = (Val (txtCelsius)*۹/۵) + ۳۲
End Sub
ذکر چند نکته:
۱- اگر بر روی یک Text Box در Design Time دابل کلیک کنید، به طور پیش فرض، رویداد Change از آن را برای کدنویسی باز میکند. اگر میخواهیم Event Procedure رویدادهای دیگر را بیاوریم، کافی است از Combo Box منوی باز شونده عمودی کرکرهای که یک فلش رو به پایین سمت راست خود برای باز شدن منو دارد) سمت راست بالای صفحه کدنویسی، یکی از Event Procedureها را به دلخواه انتخاب کنیم. Combo Box سمت چپ آن هم نام تمام Objectهای استفاده شده در آن فرم خاص را دارد که هر کدام انتخاب باشد، در Combo Box سمت راست، Procedureهای آن Object خاص را لیست خواهد کرد. در شکل ۵ برخی از رویدادهای مربوط به txtCelsius را میبینید.
۲- همانطور که میبینیم در Procedure فوق برای Text Boxها، نام هیچ مشخصهای را نیاوردیم که همانطور که قبلاً توضیح داده شد، در اینصورت به طور پیش فرض، مشخصه Text برای آنها در نظر گرفته میشود.
۳- تابع Val (مخفف Value) مقدار عددی یک string را برمی گرداند. از آنجا که مقدار داخل txtCelsius از نوع string 0متنی) است ولی باید بر روی آن عمل ضرب و تقسیم و جمع را انجام دهیم. ابتدا آن را توسط تابع Val، عددی نمودیم. (هر چند VB تا جای ممکن سعی میکند خودش این تبدیلات را اگر ما هم نگذاریم، انجام دهد ولی بهتر است عادت شود، برای جلوگیری از خطاهای احتمالی، شرایط هر موقعیت را فراهم آوریم) ادامه:
آخرین کاری که باید برای پروژه Second Example انجام دهیم، جلوگیری از خطای Type Miss Mach است. این خطا زمانی روی میدهد که در یک عملیات، مقادیر مناسب نباشند. مثلاً اگر بخواهیم مقدار متنی “Ali” را در مثلاً ۵ ضرب کنیم، این خطا (که در VB، خطای شماره ۱۳ است) رخ میدهد. در برنامه ما هم، اگر کاربر، در txtCelsius بجای یک عدد، حرفی را بنویسد، هنگام ضرب شدن در ۹/۵، همین خطا رخ خواهد داد. برای جلوگیری از بروز خطا و گرفتن کنترل خطا بدست برنامه، از تابع On Error استفاده میکنیم. اگر Procedure مربوط به رویداد Key Up از txtCelsius را به صورت زیر تغییر دهیم:
Private Sub txtCelsius–KeyUp (KeyCode As Integer, shift as Integer)
On Error Goto xx txtFahrenheit = (txtCelsius * ۹/۵) + ۳۲ Exit Sub
xx:
IF Err. number = 13 then txtFahrenheit = “can’t convert “ End IF
End Sub
در اینصورت تابع On Error میگوید که وقتی به خطایی در ادامه برخوردی به خطی از Procedure که دارای برچسب xx (یک برچسب اختیاری) است برو (Goto xx). اگر برنامه به این خط برود (یعنی وقتی خطایی رخ داد)، بررسی میکند اگر شماره خطای رخ داده شده (Err یک Object همیشگی در VB است که مشخصه number از آن، شماره شماره خطای رخ داده را در خود نگهداری میکند) برابر B بود، بجای convert کردن، در txtFahrenheit بنویسید” can’t convert “ (امیدوارم نحوه بکارگیری دستورات شرطی (IF sentences) را بدانید). تنها نکتهای که هست اینکه اگر خطا رخ نداد و convert انجام شد، دیگر نباید به خط xx وارد شود و لذا از دستور Exit sub استفاده کردع ایم. این دستور در هر جایی از یک sub اجرا شود، بلافاصله از آن خارج میشود و دستورات دیگر را اجرا نمیکند. مثالی برای رویداد KeyPress فرض کنید بر روی فرم، یک Text Box به نام txtUserName قرار دادهایم و بخواهیم کاربر، هر حرفی را داخل آن نوشت، با حرف بزرگ انگلیسی زده شود (یعنی اگر وارد کرد a، در Text Box درج شود A) در این صورت کافی است برای رویداد KeyPress از آن بنویسیم:
Private Sub txtUserName_KeyPress (KeyAscii As Integer)
KeyAscii = ASC (Ucase (Chr (KeyAscii)))
End Sub
دستور بکار رفته در این Procedure میگوید که کد آسکی کلید فشرده شده را (توسط آرگومانِ keyAscii) دریافت کن، کاراکتر آن را (توسط تابع Chr) پیدا کن، آن کاراکتر را به حرف بزرگ تبدیل کن (توسط تابع Ucase مخفف Upper Case) و آنگاه کد آسکی حرف تبدیل یافته را (توسط تابع ASC) پیدا کن و دوباره در آرگومان keyAscii قرار بده. به این ترتیب کاربر هر کلیدی را که فشار دهد، حرف بزرگ آن در Text Box درج میشود. برخی مشخصههای Text Boxها:
Name -1: نامی که VB آن را با این نام میشناسد.
Alignment -2: تراز متن داخل Text Box (راست چین، وسط چین، چپ چین)
Appearance -3: با مقدار Flat و 3D که سه بعدی بودن یا تخت بودن آن را مشخص میکند.
Back Color -4: رنگ زمینه
Text Box Border Style -5: که تعیین میکند که text Box حاشیه داشته باشد (fixed Single) و یا خیر
None Enable -6: این مشخصه برای هر کنترلی False باشدیعنی آن کنترل غیر فعال است (رنگ خاکستری شده کنترلها در ویندوز نمایشگر False بودن Enable آن است).
Font -7: نوع فونت متن
Fore Color -8: رنگ متن
Height -9: ارتفاع
Text Box Left -10: فاصله گوشه چپ و بالای Text Box از Container (دربرگیرنده) آن (تا به حال یک دربرگیرنده (container) را دیدهایم که فرمها میباشند. Containerها به کنترلهایی گویند که کنترلهای دیگر میتوانند بر روی آن قرار گیرند مثل کنترل Frame یا کنترل
Picture). Locked -11: که اگر مقدار آن True باشد، Text Box توسط کاربر، قابل ویرایش (Edit) نخواهد بود.
Max Length -12: حداکثر تعداد کاراکتری که میتواند داخل Text Box قرار گیرد که اگر مقدار آن صفر باشد، محدودیت تعداد نخواهد داشت.
Mouse Icon -13: آیکون ماوس وقتی روی آن قرار میگیرد (به شرطی که مشخصه بعدی یعنی Mouse Pointer بابر Custom تغییر داده شود.
Mouse Pointer -14: نمایشگر ماوس وقتی روی آن است که اگر برابر Custom شود، هر چه در Mouse Icon، set شده باشد، آیکون ماوس میشود.
Multi Line -15: اگر مقدار آن برابر True شود، میتوان در Text Box، چند خطی نوشت و در واقع آن را شبیه یک Editor نمود.
Password Char -16: گه اگر یک کاراکتر در آن قرار گیرد، هرچه داخل Text Box نوشته شود، با آن کاراکتر دیده میشود (شما در وارد کردن Password در هر ویندوز مسلماً با مقدار * برای Password برخورد داشتهاید).
Right To Left -17: که اگر مقدار آن True باشد، پاراگراف راست به چپ میشود (مثل آنچه ما در فارسی نوشتن به آن نیازمندیم).
Scroll Bars -18: اگر مقدار Multi Line برابر True باشد، توسط مشخصه Scroll Bars میتوان وجود scrollbar عمودی (vertical)، افقی (horizontal) و یا ترکیبی از آن دو (Both) را داشت. Tab Index -19 ترتیب پرش از کنترل به کنترل دیگر هنگام زدن کلید Tab. مثلاً اگر سه Text Box بر روی فرم داشته باشیم و مقدار Tab Index آنها به ترتیب ۰ و ۱ و ۲ بگذاریم، در هنگام اجرا، فوکوس به Text Box با مقدار Tab Index برابر صفر داده میشود که اگر کلید Tab را بزنید، فوکوس به Text Box با مقدار Tab Index ببرابر یک داده خواهد شد و الی آخر.
Tab Stop -20: که اگر مقدار آن برای کنترلی False باشد، با زدن کلید Tab هیچگاه فوکوس به آن داده نخواهد شد (با Tab نمیتوان روی آن رفت).
Tag -21: عملاً کار خاصی انجام نمیدهد و فقط میتوانیم چیزی را در آن ذخیره کنیم که بعداً خودمان از آن استفاده کنیم.
Tool Tip Text -22: که مقدار آن هر چه باشد وقتی در Run Time ماوس را لحظهای روی آن کنترل خاص نگه داریم، یک راهنمای کوتاه زرد رنگ با متن برابر مقدار تعریف شده در Tool Tip Text از آن بیرون خواهد آمد.
Top -23: فاصله گوشه راست و بالای کنترل از container (دربرگیرنده) خود.
Visible -24: که اگر مقدار آن False باشد، آن کنترل توسط کاربر (یعنی در Run Time) دیده نخواهد شد.
Width -25: عرض کنترل
توجه:
۱- بسیاری از مشخصات فوق در کنترلهای دیگری غیر از Text Boxها هم با همان کاربرد، وجود دارند. ۲- از مشخصاتی که در بالا آورده نشد، بزخی را در جای خود توضیح خواهیم داد.
نکته:
میتوان برنامه را توسط کلید F8، خط به خط اجرا کرد. در این حال اگر ماوس را روی هر متغیری در پنجره کدنویسی نگه داریم، مقدار فعلی آن را به صورت Tool Tip مینویسد.
از این مورد، در Debug کردن و یافتن خطاهای برنامه کمک بسیاری میتوان گرفت. همچنین اگر در پنجره Immediate در هنگام Run Time دستوری را بنویسیم، این دستور بلافاصله اجرا خواهد شد. مثلاً میتوانیم یک متغیر را فوراً مقدار دهی کنیم یا ...
همچنین اگر بر روی هر خطی کلید F9 را بزنیم، یک Break (شکست) روی آن خط ایجاد میکند، حال اگر کلید F5 را بزنید، برنامه اجرا میشود تا به آن خطِ Break شده برسد و در آنجا متوقف میشود؛ که برای ادامه برنامه میتوان بسته به مورد، از F5 یا F9 استفاده کرد مشخصه Causes Validation
شاید زمانی که داشتید روی مشخصات (Properties) مربوط به Text Box نظر میکردید، مشخصه causes Validation را نیز دیده باشید که ما در بخش قبل از آن نام نبردیم. این مشخصه در بسیاری از VCLها نیز وجود دارد و دارای کاربرد بسیار زیبایی است که شاید اگر وجود نداشت، برای شبیهسازی آن بوسیله کدنویسی، زمان زیادی را صرف خود میکرد.
فرض کنید بر روی فرم یک Text Box به نام txtNumber وجود دارد که برای دریافت نمره یک درس دانش آموزی از کاربر، استفاده میشود. ترجیح میدهیم کاربر نتواند این فرم را save کند (نتواند به سراغ کلید cmdSave برود) مگر اینکه نمره صحیح (که در فاصله صفر تا بیست است) را وارد نموده باشد. اما مثلاً بتواند روی دکمه cmdCancel برود و فرم را Cancel نمایدو یعنی میخواهیم اگر نمره در دامنه صحیح خود نبود روی برخی دیگر از آنها نرود.
اگر برای رویدادِ(Event) Validate از txtNumber، چنین داشته باشیم:
Private Sub txtNumber_Validate (Cancel As Boolean)
IF Val (txtNumber) > 20 then Cancel = True End IF
End Sub
Event Procedure فوق میگوید هر وقت که txtNumber، Validate شد، بررسی کن که آیا نمره کمتر از ۲۰ هست یا خیر که اگر نبود، پارامتر Cancel را True نماید. حال اگر مشخصه Causes Validation از هر کنترلی را True نماییم، در صورتی که Val(txtNumber)>20 باشد، کاربر نمیتواند، آن کنترل را فوکوس دهد؛ لذا اگر مشخصه مذکور را برای کلید cmd Save برابر True و برای cmdCancel برابر False تغیر دهیم، درصورت نبودن نمره در فاصله مناسب، کاربر میتواند عملیات دکمه Cancel را انجام دهد اما عملیات دکمه Save را خیر مگر اینکه دوباره Text Box مذکور را با عددی مناسب Validate نماید.
توجه کنید که میتوانید برای زیبایی برنامه مذکور برای رویداد Key up از txtNumber نیز چنین داشته باشیم.
Private Sub txtNumber_KeyUp (KeyCode As Integer, shift As Integer)
IF Value (txtNumber)>20 then txtNumber. Forecolore = VBRed Else txtNumber. Forecolore = VBBlack Evd IF
End Sub
که برای نمایش اینکه با وارد نودن نمرهای به کاربر خطایی رخ داده است، رنگ متن آن را به رنگ قرمز (Red) در میآوریم و در غیر اینصورت (یعنی بدون خطا) رنگ متن را به رنگ سیاه (Black) در خواهیم آورد. ذکر چند مشخصه دیگر:
۱- اگر برای یک کلید (Command Button)، مشخصه Cancel را به True قرار دهیم، در صورت زدن کلید (Escape) ESC توسط کاربر، رویداد Click از این کلید روی میدهد.
۲- اگر برای یک کلید، مشخصه Default را به True تغییر دهیم، در صورت زدن کلید Enter توسط کاربر، رویداد Click از آن روی خواهد داد.
۳- اگر برای یک فرم، رویداد Key Preview را به True تغییر دهیم، هر کلیدی را کاربر از صفحه کلید فشار دهد، ابتدا این کلید به رویداد KeyPress از فرم فرستاده میشود و آنگاه به رویداد Key Press از کنترلی که Focus در اختیار آن است، فرستاده میشود.