-
بخش سی و یکم
ایجاد یک دیالوگ Save As… یکی دیگر از متدهای مفید در Rich Text Box، متد SaveFile() است. همانطور که از نام آن مشخص هست، این متد کاری میکند که متنهای موجود در Rich Textbox را در قالب یک فایل متنی در سیستم شما ذخیره میکند.
ابتدا، همانطور که برای Open File Dialog یک شیء از Toolbox با نام OpenFileDialog اضافه کردیم، میبایست که برای Save As.. نیز یک Dialog اضافه کنیم. پس طبق تصویر عمل کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بر روی آن دوبار کلیک کرده تا به فرم شما اضافه گردد. چیزی شبیه به شکل زیر را خواهید داشت:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بر روی SaveFileDialog1 کلیک کرده و وارد Properties آن شوید. مشخصه Name آن را به SaveFD تغییر دهید.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سپس به منوی File خود برگردید و گزینه Save را دوبار کلیک کنید تا وارد بخش کدنویسی آن شوید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
کدی که برای Save کرد از آن استفاده میکنیم، دقیقاً شبیه به کدهای OpenFD خواهد بود؛ تنها تفاوت آن، نامگذاری آن است که باید بهجای OpenFD، SaveFD قرار گیرد. به کد زیر دقت کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر برنامه خود را اجرا کنید و موارد را امتحان کنید، باید تمامی اتفاقات با موفقیت انجام شود.
البته خط کدی که برای شما عمل ذخیره را انجام میدهد، بهشکل زیر است:
richTextBox1.SaveFile(Saved_File, RichTextBoxStreamType.PlainText);
البته باز هم مجدداً ذکر میکنم که روشهای بهتری برای ذخیرهسازی وجود دارد که در آینده در رابطه با آنها بهشکل نسبتاً مفصلتری صحبت خواهم کرد. فعلاً تا همینجا را جهت آموزش داشته باشید.
-
بخش سی و دوم
استفاده از ابزارهای Checkbox و Radio Button دو ابزار Checkbox و Radio Button هر دوی آنها قابلیت ارائه قابلیت انتخاب چند گزینه توسط کاربر را در اختیار میگذارد، اما این دو با هم یک تفاوت اساسی دارند. Checkbox ها به شما این امکان را میدهند که بگذارید کاربر شما از بین چند گزینه مختلف، چندین گزینه را همزمان با هم انتخاب کنید، ولی در Radio Button، کاربر میتواند تنها یک گزینه از میان چند گزینهی مختلف را انتخاب کند. اینکه کدامیک را در پروژههای خود استفاده کنید، بستگی به نوع گزینههای ارائه شده توسط شما به کاربر دارد.
یک پروژه جدیدی را ایجاد کنید؛ فرم خود را کمی بزرگ و زیبا طراحی کنید. چونکه دو ابزار Checkbox و Radio Button ابزارهای کوچک و با تعداد بالا هستند، برای ایجاد راحتی در جابجایی و کدنویسی، آنها را در GroupBox قرار میدهیم. درنهایت شما میتوانید وقتی که خود GroupBox را تکان دهید، تمامی ابزارهای موجود در آن تکان بخورند.
در جعبه ابزار خود (Toolbox) بهدنبال شیء GroupBox بگردید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
یک Groupbox در فرم خود قرار دهید. در پنجره Properties آن، مشخصه Text را پیدا کرده و نام آن را بهشکل زیر قرار دهید:
Text: What Type of Movies Do You Like?
یک GroupBox دیگر نیز در کنار آن قرار دهید و اینبار مشخصه Text آن را بهشکل زیر قرار دهید:
Text: And Your Favorite Is?
درنهایت، فرم شما بهشکل زیر خواهد بود:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ما در GroupBox اولی، چند Checkbox قرار خواهیم داد و در دومی، چند Radio Button. در Toolbox شیء CheckBox را پیدا کنید و آن را بهشکل یر قرار دهید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
توسط مشخصه Text آن، نامش را به Comedy تغییر دهید. (همانند شکل بالا)
چند Checkbox دیگر قرار دهید و سعی کنید که بهشکل زیر باشند:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال، در Groupbox دومی، به همین روش چند گزینه از نوع Radio Button اضافه کنید و سعی کنید که بهشکل زیر باشند:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در نهایت، دو Button بهشکل زیر قرار دهید و فرم را تکمیل کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
یک بار برنامه خود را اجرا کنید؛ خواهید دید که هرچند تعدادی که میخواهید میتوانید Checkbox انتخاب کنید؛ اما برای Radio Button فقط یک گزینه!
اجرای برنامه را متوقف کنید و دوباره به کار برگردید! کاری که الان انجام خواهیم داد، میخواهیم کدی بنویسیم که ببینیم کاربر کدام گزینه را انتخاب کرده است؛ ابتدا با Checkbox ها شروع خواهیم کرد.
بر روی Button با نام Selected Movies دابل-کلیک کنید. توسط کدی که ما خواهیم نوشت، خواهیم توانست که به Property (مشخصه) Checked از Checkbox ها دسترسی پیدا کنیم. درواقع بررسی میکنیم که آیا برای مثال، Checkbox اولی انتخاب شده است؛ یا خیر! در نهایت نیز دو حالت بیشتر وجود نخواهد داشت؛ یا True است و یا False.
ما میتوانیم توسط دستور IF، شرط فوق را بررسی کنیم. تنها لازم است که True بودن شرط را بررسی کنیم:
if (checkBox1.Checked)
{
//Some codes
}
برای مثال، ما میتوانیم درصورت صحیح بودن شرط فوق، لیست گزینههای انتخابی را با یک Message Box نمایش دهیم.
string movies = “”;
if (checkBox1.Checked)
{
movies = movies + checkBox1.Text;
}
MessageBox.Show(movies);
ما در واقع در داخل شرط IF، کاری میکنیم که نام لیست فیلمهای موجود را در داخل متغیر movies ذخیره کنیم تا زمانی که بر روی Button مروبوط کلیک شود، گزینههای انتخاب شده را نمایش دهد. یک شرط دوم بهشکل زیر اضافه کنید:
string movies = “”;
if (checkBox1.Checked)
{
movies = movies + checkBox1.Text;
}
if (checkBox2.Checked)
{
movies = movies + checkBox2.Text;
}
MessageBox.Show(movies);
برنامه خود را یک بار دیگر امتحان کنید. دو Checkbox اولی را انتخاب کنید و بر روی Button کلیک کنید. پیام زیر برای شما نمایش داده خواهد شد.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خوب … ظاهراً که مشکلی ندارد؛ واقعاً هم مشکلی ندارد، اما تنها چیزی که شاید شما را آزار میدهد، عدم وجود یک فاصله میان کلمات هست. پس به کدهای خود برگردید و کدهای داخل شروط را به شکل زیر تغییر دهید:
movies = movies + checkBox1.Text + “\r\n”;
و بهجای کدهای بالا، میتوانید بهشکل زیر عمل کنید:
movies = movies + checkBox1.Text + Environment.NewLine;
برنامه خود را اینبار اجرا کنید و دوباره کارهای قبلی را تکرار کنید.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
به کدهای خود برگردید و بهشکل زیر کدهای خود را تکمیل کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال نوبت به سراغ Radio Button ها میرود. Radio Button ها نیز بهشکل فوق عمل میکنند. فقط باید بهجای IFهای بعدی، از ELSE IF استفاده کنیم. (چون Radio Buttonها فقط قابلیت انتخاب شدن یکی از آنها وجود دارد)
string ChosenMovie = “”;
if (radioButton1.Checked)
{
ChosenMovie = radioButton1.Text;
}
else if (radioButton2.Checked)
{
ChosenMovie = radioButton2.Text;
}
کدها نیز به همین ترتیب پیش میروند.
تمرین: کدهای مربوط به Radio Button را تکمیل کنید و سعی کنید همانند Checkbox ها، وقتی که بر روی Button مروبوط کلیک شد، پیغام مناسب را نشان دهد.
-
بخش سی و سوم
اشکالزادایی برنامه (Debugging) – قسمت اول اولین جایی که ممکن است با خطاها روبرو شوید، زمان طراحی و کدنویسی برنامه هست که در اصطلاح برنامهنویسی به آن Design-Time Error میگویند. این خطاها حتی پیش از Compile کردن برنامه مشاهده میشود و شما میبایست در صدد رفع آن باشید.
Design-Time Error جزو خطاهایی هستند که راحت میتوان آنها را ردیابی و رفع نمود؛ چرا که نرمافزار Visual Studio بهصورت خطوط رنگی انواع خطاها را برای شما نمایش میدهد. در هنگام کدنویسی شما با سه نوع خط رنگی مواجه خواهید شد؛ آبی، قرمز و سبز.
خطهایی که به رنگ آبی هستند، با نام Edit and continue معروف هستند که بدین معنیست شما میبایست تغییری در کدهایتان ایجاد کنید بدون اینکه برنامه متوقف شود.
خطهای به رنگ قرمز با نام Syntax Error معروف هستند که نمایانگر این هست که یک غلط نحوی در کدنویسی شما وجود دارد.
خطهای به رنگ سبز، اخطارهای کامپایلر (Compile Warning) هستند که زمانی این خطا را میبینید که کامپایلر متوجه میشود که یک مشکل کوچکی وجود دارد که ممکن است بعدها برای شما مشکلساز باشد؛ همانند تعریف متغیری که هرگز از آن استفاده نشود!
خطهای آبی رنگ:
در عکس پایین، شما میتوانید یک خط آبی رنگ زیر عبارت مشخص شده را ببینید. (ممکن است نسخههای جدید Visual Studio این را نیز بهعنوان خط قرمز رنگ در نظر بگیرد)
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
این خط به این دلیل ظاهر شده چونکه ما TextBoxای با نام textBox2 در فرم نداریم؛ بلکه یک TextBox در فرم وجود دارد که نامش textBox1 است. پس میتوانیم تنها با پاک کردن عدد ۲ و قرار دادن عدد ۱ بهجای آن، به ادامه کدنویسی خود بپردازیم.
اگر نشانگر موس خود را بر روی خطاها نگهدارید، توضیحاتی در رابطه با خطای ایجاد شده نمایش داده میشود، اگرچه همیشه این توضیحات بهطور کامل به شما کمک نخواهند کرد، ولی دیدن و خواندن آنها خالی از لطف نیست!
خطهای قرمز رنگ:
این نوع خطاها به آن Syntax Error میگویند. Syntax در واقع گرامر زبان برنامه نویسی است. همانطور که در زبان فارسی بایست قوانینی را در هنگام صحبت کردن رعایت کنیم تا مفهوم به صورت درست منتقل شود، در زبانهای برنامهنویسی نیز این حکایت صدق میکند.
در عکس زیر ما یک Semicolon را در انتها فراموش کردیم:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر نشانگر موس را روی آن نگهدارید، راهنمایی لازم را به شما خواهد کرد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در عکس بعدی، میبینید که ما یک پرانتز فراموش کردیم که ان را به ما نمایش میدهد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خطهای سبز رنگ:
این نوع خطاها به آن Compile Warning میگویند. به عکس زیر نگاه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر نشانگر موس را بر روی آن نگهداریم، خواهیم دید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
این خطا میگوید که شما متغیری با نام CompilerWarning تعریف و مقداردهی شد، اما هیچگاه از آن استفاده نشد.
-
بخش سی و چهارم
- اشکالزادایی برنامه (Debugging) – قسمت دوم
یکی دیگر از خطاهای بسیار متداول، خطایی با نام Run-Time Error میباشد؛ که باعث میشود نرمافزار شما به اصطلاح Crash کند. خود برنامه در ابتدا بدون مشکل Compile و اجرا میشود و مشکلی نخواهید دید، اما مشکلی که ممکن است بعداً برای شما اتفاق بیفتد، Crash کردن برنامه شما در حین اجرا است که موجب میشود نرمافزار شما کارایی خود را از دست بدهد و دیگر قادر به ادامه انجام عملیات خود نباشد.
یکی از متداولترین خطاهای فوق، سعی در تقسیم یک مقدار به «صفر» است! در کد زیر، همانطور که مشاهده میکنید ما در حال تقسیم یک مقدار به صفر است که باعث ایجاد خطای Run-Time میشود.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
وقتی که برنامه را کامپایل میکنید، Visual Studio مشکلی را متوجه نخواهد شد و برنامه بدون هیچ ایرادی شروع به کار میکند؛ اما همینکه بر روی button1 کلیک کنید، خواهید دید که خطایی بهشکل زیر را مشاهده خواهید کرد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
باتوجه به خطای فوق، میتوان متوجه شد که مشکل ناشی از تقسیم عددی به صفر است، اما فرض کنید که این برنامه بر روی سیستم کاربری در حال اجرا است که چنین مشکلی بوجود میآید؛ چه هزینهی سنگینی را باید تقبل کرد!
یکی دیگر از خطاهای ممکن و متدوال، خطای زیر است. در کد زیر، ما سعی میکنیم که فایلی را باز کنیم که در سیستم ما وجود ندارد. (آدرس داده شده اشتباه است!)
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همانطور که در خطا میبینید، باز هم Visual Studio سعی در حدس اشتباه میکند و میگوید که فایلی با نام «test10.txt» در مسیر مورد نظر شما وجود ندارد! و چونکه ما به سیشارپ نگفتهایم که اگر فایلی را پیدا نکردی، چهکار کن؛ در نتیجه کنترل خود را از دست میدهد و Crash میکند!
خطاهایی شبیه به خطاهای فوق را میتوان در هنگام کدنویسی از بروز آنها جلوگیری کرد.
-
بخش سی و پنجم
معرفی دستور Try … Catch دستور Try … Catch بدین شکل عمل میکند که شما به سیشارپ میگویید که یک دستوری را امتحان کن (Try کن)، اگر بدون خطا بود که اجرا کن، اگر دارای خطا بود، آن را کنترل کن (Catch کن). قالب این دستور (Syntax) به شکل زیر است:
try
{
}
catch
{
}
در دستور زیر ما سعی میکنیم که یک فایل متنی را در RichTextBox ای با نام rtb لود کنیم:
try
{
rtb.LoadFile(“C:/test.txt”);
}
catch (System.Exception excep)
{
MessageBox.Show(excep.Message);
}
کد اصلیای را که ما میخواهیم آن را در هنگام لود برنامه اجرا کنیم را همیشه در بین دو براکت مربوط به Try قرار میدهیم. ولی اگر که فایلی با نام text.txt وجود نداشت، دوست داریم که برنامه از کار نیفتد و پیغام “File Not Found” را داشته باشیم. ما میتوانیم که این کار را در دستور Catch انجام دهیم. دقت کنید که در مقابل Catch دستور زیر است:
System.Exception excep
Exception یک شیءای در سیشارپ است که خطاها را کنترل میکند. این شیء در Namespace مربوط به System وجود دارد. پس مینویسیم: System.Exception
پس از ایجاد یک فاصله در مقابل آن (Space)، نام متغیری برای آن تعریف میکنیم؛ که در اینجا آن را Excep نامیدهایم.
اگر در هنگام لود فایل خطایی ایجاد شد، سیشارپ خطای ایجاد شده را در متغیر excep ذخیره میکند. شما وقتی که از مشخصه message برای excep استفاده میکنید، میتوانید خطای ایجاد شده را بهصورت یک String داشته باشید که آن را میتوان در یک MessageBox نمایش داد.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
وقتی که برنامه خود را اجرا کنید؛ اگر فایل ذکر شده وجود نداشته باشد، پیغام زیر برای شما نمایش داده خواهد شد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر نوع خطایی که ممکن است بوجود بیاید را از قبل میدانید، میتوانید کدهای خودتان را بهشکل زیر درآورید:
catch (System.IO.FileNotFoundException)
{
MessageBox.Show(“File Not Found!”);
}
برای اینکه بفهمید که خطایی که قرار است ایجاد شود از چه نوع است میتوانید از کد زیر استفاده کنید:
catch (System.Exception excep)
{
MessaegBox.Show(excep.GetType().ToString());
}
که توسط یک MessageBox، نوع خطای ایجاد شده را برای شما مینویسد.
اگر که میخواهید از دردسرهای فوق خلاص شوید و خیلی کار را ساده پیش ببرید، کافیست کد زیر را جایگزین کنید:
try
{
rtb.LoadFile(“C:/test.txt”);
}
Catch
{
MessageBox.Show(“An error occurred”);
}
شما همچنان میتوانید چندین catch قرار دهید:
try
{
rtb.LoadFile(“C:/test.txt”);
}
catch
{
MessageBox.Show(“An error occurred”);
}
catch
{
MessageBox.Show(“Couldn’t find the file”);
}
catch
{
MessageBox.Show(“Or maybe it was something else.”);
}
در نهایت، برای دستور Try .. Catch یک دستور نهایی با نام Finally نیز وجود دارد که میتوانید کارهایی را که لازم است انجام دهد را در آن قرار دهید. فرض کنید که شما فایلی را باز کردهاید که نیاز دارد که آن را ببینید؛ در نتیجه میبایست آن را در Finally قرار دهید.
try
{
rtb.LoadFile(“C:/test.txt”);
}
catch (System.Exception excep)
{
MessageBox.Show(excep.Message);
}
Finally
{
//Close the file here
}
کدهای داخل Finally حتماً یکبار اجرا خواهند شد.
-
بخش سی و ششم
یک متد، یک بخشی از کد است که یک کار خاصی را انجام میدهد. ماشینحسابی را که پیشتر نوشتهایم را به یاد دارید؟ در آن برنامه ما میتوانستیم که بخشی از کدی را در یک متد بنویسیم که کار جمع انجام دهد؛ بخش دیگری را در متد دیگری مینوشتیم که متد تفریق را انجام دهد؛ و به همین ترتیب برای ضرب و تقسیم. در نهایت، هر کجا که به انجام عملیات فوق نیازی پیدا کردیم، کافیست که متد را صدا بزنیم!
پیش از آنکه کارمان را با متد آغاز کنیم، به این نکته توجه داشته باشید که متد در زبانهای دیگر همانند C++، با نام تابع (Function) شناخته میشود؛ اما مایکروسافت در زبان سیشارپ خود، آن را بهنام متد (Method) به دلایل خاص خودش تغییر نام داده است.
برای شروع کار با متدها، ما یک برنامه سادهای را استارت خواهیم زد؛ بدین نحو که دو شماره را از کاربر بوسیله text box میخواند. ما چهار button نیز خواهیم داشت که عملیات اصلی ریاضی (جمع، تفریق، ضرب و تقسیم) را انجام میدهد. اما این بار این عملیات را با استفاده از متدها انجام خواهیم داد.
پروژهی جدیدی را در Visual Studio آغاز کنید و فرم خود را به شکل زیر طراحی کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
هنگامی که Text Box و Button ها را اضافه کردید، لازم نیست که مشخصه Name آنها را تغییر دهید؛ همانهایی که هستند رها کنید (button1، button2، …(
بر روی button با نام Add Up دوبار کلیک کنید تا پنجره کدنویسی برای شما باز شود. نشانگر جایی که باید تایپ کنید مابین دو براکت مربوط به button با نام Add Up است. ما کاری به داخل براکت نخواهیم داشت؛ لذا این نشانگر را به براکت بسته انتقال دهید و پس از وارد خط جدید شوید و کد زیر را بنویسید:
void AddUp()
{
MessageBox.Show(“Add Up Here”);
return;
}
کد شما به شکل زیر درخواهد آمد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
متدها میتوانند مقداری را برگردانند (اصطلاحاً مقداری را return کنند)؛ مثلاً جواب جمع دو عدد، اما هیچ لزومی ندارند که حتماً مقداری را برگردانند. متدی که ما نوشتیم، یک MessageBox را نشان میدهد که تنها زمانی اجرا میشود که ما آن را صدا بزنیم.
وقتی که شما از متد خود میخواهید که هیچ مقداری را برنگرداند (مثل متد ما)، کافیست قبل از نام متد، کلمه کلیدی Void را قرار دهید. بعد از یک فاصله (Space)، نام تابع را مینویسید و پس از دو پرانتز باز و بسته، دو براکت باز و بسته قرار میدهید و کدهای مورد نظر خودتان را مابین آن مینویسید. انتخاب نام متد نیز همانند انتخاب نام متغیر کاملاً دلبهخواه است و میتواند هر نامی باشد. مثلاً ما در اینجا نام متد خود را AddUp انتخاب کردیم.
در انتهای متد خود، قبل از آنکه براکت بسته شود، کلمهی کلیدیای با نام Return نوشتهایم و در انتهای آن یک Semicolon قرار دادهایم. وقتی که ما متد خود را به شکل void تعریف کردهایم، لزومی بر قرار دادن کلمه کلیدی return نیست، چونکه شما نمیخواهید مقداری را return کنید (برگردانید.) شما فقط این تابع را نوشتید که کار خاصی را انجام دهد و نیازی به مقداری ندارید. ما تنها این کلمه کلیدی return را قرار دادهایم چونکه یک استاندارد در هنگام نوشتن یک متد است.
هنگامی که C# کلمه return را در متدی ببینید (به آن برسد،) از متد خارج میشود و ادامه کدهای موجود در بخش اصلی را انجام میدهد.
متد AddUp که ما نوشتیم، فعلاً هیچ کاری را نمیکنید، چونکه آن را صدا نزدیم. ما میخواهیم که این متد کار خود را زمانی آغاز کند، وقتی که ما بر روی button با نام Add Up کلیک کردهایم. پس برای صدا زدن یک متد، اینگونه مینویسیم:
AddUp();
پس برای صدا زدن این متد در هنگام کلیک بر روی Button با نام AddUp، کد شما باید به شکل زیر باشد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
برنامه خود را یک بار اجرا کنید؛ خواهید دید که زمانی که بر روی Add Up کلیک میکنید، یک MessageBox برای شما ظاهر میشود.
حال میدانید که چه اتفاقی میافتد؟ شما وقتی که بر روی Add Up کلیک میکنید، سیشارپ به سراغ کدهای ما بین مربوط به button1 میرود. در آنجا با متدی با نام AddUp ملاقات میکند. وقتی که میبیند که AddUp از نوع متد است (چون پرانتز باز و بسته دارد)، متوجه میشود که این متد باید جایی در کدهای ما تعریف شده باشد؛ لذا شروع به جستجو میکند تا میبیند که AddUp در زیر تعریف شده است. درنتیجه وارد تعریف داخل متد میشود و کارهای خواسته شده را انجام میدهد و مجدداً به برنامه باز میگردد.
-
احضار توابع پیش فرض سی شارپ در برنامه نویسی!
بعضی وقتا کدی رو در دستورات یک دکمه (command button) نوشتیم و میخوایم از طریق رویدادی غیر از کلیک اون دکمه اجراش کنیم
روش اصولی اینه که دستور مورد نظر رو در یک متد نوشته و سپس هر جا خواستیم احضارش کنیم
اما شما میتونید در سی شارپ رویداد ها رو شبیه سازی کنید
در مثال زیر رویداد کلیک دکمه اول توسط دکمه دومی فرا خوانی میشه
کد:
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Masons Are Not Free!"); } private void button2_Click(object sender, EventArgs e) { button1_Click(null, null); }
نکته کلیدی همون
کد:
button1_Click(null, null);
هست
قسمت قبل پرانتز اسم تابع هست که میتونید از اسم تابع کپی پیست کنید
اون دوتا NULL داخل پرانتز هم پاسخی به پارامتر های درخواستی
کد:
button1_Click(object sender, EventArgs e)
هستند که اولی شیئ ارسال کننده رو مشخص میکنه و دومی نوع رویداد (کمی پیچیده است فعلا نیاز به توضیح نیست)
وقتی مینویسیم null یعنی اطلاعاتی جهت ورود نداریم و مقدار خالی بهش میدیم
-
بخش سی و هفتم
پاس دادن مقادیر خاصی به متد؛ برگرداندن مقدار معین هنگامی که شما متد جدیدی را در کدهای خود تعریف میکنید، میتوانید مقادیری را به تابع تحویل دهید تا روی آن پردازشاتی انجام دهد. کاری که ما میخواهیم انجام دهیم این است که دو مقدار را به عنوان ورودی به تابع دهیم تا آنها را با هم جمع بزند.
باید بدین شکل عمل کنیم که عددهایی که در Text Box ها وارد میشوند را دریافت کرده؛ در متغیرهایی ذخیره کرده، به تابع پاس دهیم و عملیات جمع را در داخل تابع انجام دهد و در نهایت مقدار مورد نیاز خودمان را «برگرداند.»
به مقادیری که به متدها پاس داده میشود، اصطلاحاً آرگومانهای یک متد میگویند. برای تعریف آرگومانهایی به تعداد مورد نیاز به شکل زیر عمل میکنیم (تعریف دو آرگومان؛ یعنی دو مقدار را میخواهیم به متد پاس دهیم):
void AddUp(int Num1, int Num2)
{
…
}
آیا به مقادیری که در داخل پرانتزها در هنگام تعریف تابع اختصاص دادهایم دقت میکنیم؟ اینها آرگومانهای تابع هستند. به تعداد مورد نیاز آنها را توسط یک کاما (,) جدا کرده و فراموش نشود که نوع هر کدام از آرگومانها قبل از نام متغیر آنها نوشته شود. مثلاً ما میتوانستیم که به شکل زیر تابع را تعریف کنیم:
void AddUp(float Num1, float Num2)
{
…
}
دقت کنید که نامهایی که برای متغیرهای Num1 و Num2 در نظر گرفتهایم یک متغیرهای موقتی هستند. در هنگام استفاده از این تابع نیز باید به این مورد دقت داشته باشیم که هر نوعی که در هنگام تعریف تابع برای آرگومانها در نظر گرفتیم، میبایست که در هنگام پاس دادن مقادیر به این تابع، از همان نوع استفاده کنیم. (int به int – Float به Float و …)
حال متد خودتان را که قبلاً با نام AddUp تعریف کرده بودید را به شکل زیر تغییر دهید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همانطور که میبینید، ما در اینجا دو آرگومان برای این تابع تعریف کردهایم؛ FirstNumber و secondNumber. اینها همان مقادیری “خواهند بود” که بعداً به متد پاس میدهیم و روی آنها پردازش انجام میدهد. حال نوبت به انجام پرداش میرسید؛ کدهای این متد را به شکل زیر بروزرسانی کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در واقع ما اینجا کاری که کردیم بدین شکل بود؛ یک متغیر در داخل متد تعریف کردیم با نام answer که حاصل جمع دو عدد را به ما در انتها که کار متد AddUp به اتمام میرسد را به ما برگرداند. فعلاً چونکه تابع ما از نوع void هست، هیچ مقداری را بر نمیگرداند؛ بلکه ما الان با استفاده از MessageBox در حال نمایش مقدار answer هستیم؛ و نه برگرداندن مقدار آن!
اگر که به کدهای اصلی مربوط به button1 برگردیم، میبینید که:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر به این error دقت کنید به را به شما میگوید که: «هیچ تعریفی برای این تابع صورت نگرفته است که هیچ آرگومانی را نگیرد.»
حالا چرا این خطا را به ما نشان میدهد؟ ما در تعریف تابع خود دو آرگومان در نظر گرفتیم (آرگومانهایی با نامهای firstNumber و secondNumber) ولی در اینجا ما در بین جفت پرانتزها هیچ مقداری به تابع پاس ندادهایم؛ لذا این خطا را از ما میگیرد.
کدهای خود را به شکل زیر تغییر دهید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال کدهای ما بهشکل صحیحی نوشته شدهاند. به عکس زیر دقت کنید تا منظور را بهتر متوجه شوید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال شما میتوانید حتی کدهای داخل button1 را نیز به شکل زیر تغییر دهید که در واقع در حال دریافت مقادیر از Textbox ها میباشیم:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
یا میتوانید آنها را در متغیرهایی ذخیره کرده و سپس از آنها استفاده کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
دقت کنید که هیچ لازم نیست اسامی متغیرهای آرگومانهای ما با نام متغیرهایی که به متد در حال پاس دادن هستیم یکی باشد!
حال نوبت به برگرداندن مقدار از تابع میرسد. متدهایی که تا الان تعریف کردیم، دارای یک کلمهکلیدیای به نام void بودند؛ void یعنی خالی و اصطلاحاً به متدهایی میگویند که هیچ مقداری را برنمیگرداند. اگر میخواهید که تابع شما مقداری را برگرداند، می بایست که بهجای void، نوع مقداری را که میخواهید برگرداند را بنویسید؛ مثلاً int.
یک متد جدید طبق تصویر زیر با نام Subtract تعریف کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر کمی کدهای خودمان را مرتبتر کنیم، به شکل زیر خواهند بود:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پیش آنها کدها را شرح دهیم، بر روی کلید مربوط به Subtract دابل-کلیک کنید تا وارد کدهای مربوط به آن شوید؛ کدهای زیر را به آن اضافه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
ما کدهای مربوط به این بخش از کلید را در مرحله بعد توضیح میدهیم؛ فعلاً فقط برنامه را اجرا کنید؛ امیدوارم که نتیجه جواب نمایش داده شده درست باشد …
خوب؛ نگاهی به متد جدیدمان بیندازیم:
private int Subtract(int firstNumber, int secondNumber)
آرگومانهای داخل پرانتز دقیقاً شبیه به متدهای قبل بود و دقیقاً به همان شکل عمل میکند؛ دو مقدار را بعنوان آرگومان از کدها میگیرد. چیزی که در این بخش جدید است، قسمت زیر میباشد:
private int Subtract
کلمه Subtract که تنها نام تابع است، اما قبل از خود نام تابع، دو کلمه کلیدی مهمی داریم؛ int و private. کلمه کلیدی private را برای حال فراموش کنید، در آینده به این موضوع خواهیم پرداخت، اما در رابطه با int، ما از آن بجای کلمه void استفاده کردیم، در واقع بجای اینکه هیچ مقداری را برنگرداند، بلکه یک مقداری را که از نوع intمیباشد را برگردانیم.
مجدداً به کدهای زیر نگاه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
به خط آخر دقت کنید:
return answer;
نوع answer چیست؟ int! پس باید نوعی مقداری که در حال برگرداندن هستیم با کلمه کلیدی قبل از نام تابع یکی باشد! این دقیقاً مقداری میباشد که تابع آن را برگردانده است! (یعنی خواهد برگرداند)
خوب، اما از این return کجا استفاده کردیم؟ کد زیر را ببینید:
private void button2_Click(object sender, EventArgs e)
{
int number1;
int number2;
int returnValue=0;
number1 = int.Parse(textBox1.Text);
number2 = int.Parse(textBox2.Text);
returnValue = Subtract(number1, number2);
messageBox.Show(returnValue.ToString());
}
در واقع بدین اتفاقات بدین شکل در حال انجام شدن هستند؛ مقداری را که تابع Subtract برمیگرداند باید در جایی ذخیره شد، لذا متغیری با هم از همان نوع (در اینجا int) ساخته شود تا جواب مربوط به مقدار برگرداندن متد در آن ذخیره شد.
-
بخش سی و هشتم
- تعریف آرایهها و نحوه پیادهسازی
فرض کنید که چندین دانشآموز (=Student) در یک کلاس هستند که قرار است نمرات درس ریاضی آنها در یک متغیر ذخیره گردد. باتوجه به معلوماتی که تا کنون شما دارید احتمالاً شما بهشکل زیر متغیرهای مربوطه را تعریف کنید:
Student_Number_1 = 18;
Student_Number_2 = 16;
Student_Number_3 = 19;
Student_Number_4 = 20;
.
.
.
احتمالاً متوجه هستید که چقدر اینکار باعث اتلاف وقت میشود و از لحاظ کدنویسی غیربهینه میباشد. توسط آرایهها شما میتوانید تنها یک متغیر با یک نام را داشته باشید که میتوانید تعداد مشخصی از نمرات مربوط به درس ریاضی دانشآموزان یک کلاس را در آن ثبت کنید.
نحوه پیادهسازی آرایهها بدین شکل است؛
int[] Student;
در واقع ابتدا نوع متغیر را تعیین میکنید (برای مثال int) و سپس دو براکت باز و بسته در کنار هم قرار داده و با یک فاصله، نام متغیر خود را انتخاب میکنید. برای ایجاد آرایهای از Stringها نیز بدین شکل عمل میکنیم:
string[] my_string;
در واقع متوجه هستید که نحوه پیادهسازی هر نوع متغیر همانند بقیه است.
نکته بعدیای که حائز اهمیت فراوانی میباشد، سایز یک آرایه است. برای مثال، در نمونهای که برای ثبت نمرات ریاضی دانش آموزان ذکر شد، میدانیم که (مثلاً) تعداد دانشآموزان یک کلاس، ۳۱ نفر میباشند؛ پس میبایست که به سیشارپ این کد فرمان دادهشود که سایز آرایهی ما را ۳۱تایی کند؛ بدین شکل:
int[] Student = new int[31];
بعد آنکه شما علامت مساوی را قرار میدهید، یک کلمه کلیدی به نام new اضافه میکنید که در واقع برای سیشارپ این مفهوم را القا میکنید که ما یک شئ جدیدی (new object) داریم. بعد از کلمه کلیدی New، مجدداً نوع متغیرخود را نوشته و اینبار براکتها را خالی نمیگذاریم؛ بلکه سایز مورد نیازمان را برای آرایه مینویسیم.
تا اینجا این مورد را فرا گرفتید که چگونه یک آرایه از یک نوع خاص بسازیم. حال نوبت به مقدار دهی میرسد. تا الان که ما آرایهای به نام Student داریم، دارای هیچ مقداری در داخل خود نمیباشد. برای انتساب یک مقدار به آرایه، به شکل زیر عمل میکنیم:
array_name[شماره آرایه] = array_value (مقدار مورد نظر)
برای مثال، برای ثبت نمرات دانشآموزان نفر ۱۰، ۱۱ و ۱۲، بدین شکل عمل میکنیم:
Student[10] = 20;
Student[11] = 18;
Student[12] = 13;
-
بخش سی و نهم
اگر پروژهی از پیش ساختهای از قبل ندارید، یک پروژهی جدیدی را آغاز کنید و در در form ایجاد شده، یک button و یک listbox از بخش toolbox اضافه کنید. بر روی button دابل-کلیک کنید تا پنجره مربوط به کدنویسی باز شود. برای شروع، کد زیر را اضافه کنید تا ابتدا اگر مواردی در listbox موجود باشد، آنها را محو کند:
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
برای دومین و سومین خط از کدنویسی، موارد زیر را اضافه کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال برای هر یک از بخشهای موجود در آرایه، یک مقداردهی اولیه انجام دهید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
برای نمایش تکتک مقادیر موجود در آرایه در listbox، شما اینکار را خواهید کرد:
listBox1.Items.Add(lottery_numbers[0]);
listBox1.Items.Add(lottery_numbers[1]);
listBox1.Items.Add(lottery_numbers[2]);
listBox1.Items.Add(lottery_numbers[3]);
و برای اینکه مقادیر را از آرایهها دریافت کنیم، ما فقط نام آرایه و محل مورد نظر خودمان را مینویسیم تا مقدار مورد نظر برگرداندهشود. هماهنند زیر:
lottery_numbers[0];
این کارها برای نمایش مقادیر داخل آرایه در listbox کفایت میکند؛ دقت کنید که کدهایتان میبایست مشابه زیر شده باشد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اکنون کافیست که یکبار نرمافزار خود را اجرا کرده تا نتیجه را مشاهده کنید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خوب؛ برنامه خود را ببینید. اگر دقت کنید، متوجه خواهید شد که سایز آرایه ما بسیار کوچک است و تنها ۴ شماره را در خود ذخیره میکند؛ فرض کنید اگر آرایهی ما ۱۰۰تایی باشد چه اتفاقی رخ خواهد داد؟ پس میبایست ما با استفاده از یک حلقه، بتوانیم (برای مثال) ۱۰۰ بار یک آرایه را پیمایش کنیم تا تمامی مقادیر داخل آن را بدست بیاوریم و در listbox نمایش دهیم.
به کد زیر دقت کنید:
for (int i = 0; i != (lottery_numbers.Length); i++)
{
listBox1.Items.Add(lottery_number[i]);
}
کد بالا بدین شکل است؛ چون آرایهها از مکان ۰ (صفر) شروع میشوند، پس ابتدای حلقه را صفر در نظر میگیریم (i = 0)
در قدم بعدی، میبایست به اندازی طول (length) آرایه، در آن پیمایش کنیم؛ پس کد زیر بدین معنی است که تا زمانی که به انتهای آرایه نرسیدیم، حلقه را ادامه بده:
i != (lottery_numbers.Length);
و در نهایت، در هر بار با استفاده از کد i++، یک خانه در آرایه جلوتر میرویم. کد مربوط به بدنه نیز کاملاً مشخص میباشد و نیازی به توضیح ندارد.
حال کدهای قبلی خودتان را پاک کنید و سعی کنید کدتان شبیه به کد زیر شود:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حال برنامه خود را اجرا کنید و مجدداً نتیجه را ببینید؛ متوجه خواهید شد که برنامه شما اینبار با کدهای خیلی کمتر، به درستی کار میکند. به عکسهای زیر نیز دقت کنید تا نحوه کار حلقه را کمی بهتر متوجه شوید:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شما میتوانید با استفاده از خود حلقه، حتی نسبت به مقداردهی آرایه نیز اقدام کنید؛ انجام این کار را به عهده شما قرار میدهیم، تنها یک نمونه کد در اینجا برای شما قرار میدهیم:
for (int i = 0; i != (lottery_numbers.Length); i++)
{
lottery_numbers[i] = i + 1;
listBox1.Items.Add(lottery_numebrs[i]);
}