وقتی میخواهید برنامهنویسی به زبان سیشارپ را شروع کنید، اولین چیزی که به آن نیاز دارید یک سری ابزارهای پایه است که به شما کمک میکنند تا کدهای خود را سازماندهی کنید و از امکاناتی که زبان سیشارپ در اختیارتان قرار میدهد، استفاده کنید. سیاست مایکروسافت بر این استوار است که حجم عظیمی از این متدها و قابلیتها را درون مجموعه ای به نام دات نت قرار داده که بعضی از نسخه های آن همراه ویندوز نصب می شوند این کار به منظور کاهش حجم برنامه هاست . یک برنامه نویس هنگام نوشتن برنامه خود باید بداند امکاناتی را که می خواهد در برنامه خود بکار برد دقیقا در چه فضای نامی از مجموعه دات نت قرار دارند سپس با اصطلاحا یوزینگ کردن آن فضای نام قادر به استفاده از آن متدهای از پیش نوشته شده خواهد بود.
یوزینگها مانند کلیدهایی هستند که دربهای مختلفی را به روی شما باز میکنند. هر یوزینگ به شما اجازه میدهد از کتابخانهها یا کلاسهای از پیش تعریفشده در سیشارپ استفاده کنید. برای مثال، بدلیل اینکه حجم زیادی از کارهایی که در هر برنامه انجام می شود درون فضای نام سیستم قرار دارند ، باید از یوزینگ using System; استفاده کنید. این یوزینگ به شما دسترسی به کلاسهای پایهای متعددی را میدهد. (کم کم با متدهای موجود در هر یوزینگ آشنا می شوید)
بعد از اینکه یوزینگهای لازم را اضافه کردید، نوبت به ایجاد یک فضای نام (Namespace) میرسد. فضای نام مانند یک جعبه بزرگ است که تمام کدهای شما داخل آن قرار میگیرند. این جعبه به شما کمک میکند تا کدهای خود را مرتب و منظم نگه دارید و از تداخل کدهای شما با کدهای دیگران جلوگیری کنید. برای ایجاد یک فضای نام، کافی است از کلمه کلیدی namespace استفاده کنید و بعد از آن یک نام برای فضای نام خود انتخاب کنید. مثلاً میتوانید بنویسید namespace MyFirstProgram. بعد از این نام، یک جفت آکولاد باز { و بسته } قرار میدهید. تمام کدهای شما باید بین این دو آکولاد قرار بگیرند. این آکولادها مانند دیوارهای جعبه هستند که محتویات داخل آن را از بیرون جدا میکنند.
پس از ایجاد فضای نام ، میتوانید شروع به نوشتن کدهای خود کنید. تمام کدهایی که مینویسید، باید بین دو آکولاد فضای نام قرار گیرند. این کار به شما کمک میکند تا کدهایتان را بهتر سازماندهی کنید و در آینده اگر برنامههای بزرگتری نوشتید، بتوانید به راحتی کدهای خود را مدیریت کنید.
کد زیر را نگاه کنید این کد اولین چیزی است که شما هنگام ایجاد یک پروژه جدید با آن مواجه می شوید . این کد در واقع یک نمونه کد خالی است که با کمک کدهایی که در پس زمینه خود دارد یک فرم خالی با سه دکمه ایجاد می کند که با این سه دکمه عمل بستن و ماکزیمم و مینیمم کردن فرم را می توان انجام داد و همچنین می توان با موس آن را جابجا کرد تمام کدهای مربوط به این کارها در پس زمینه وجود دارند و شما در این قسمت آن کدها را نمی بیند و این کار به منظور جلوگیری از شلوغ شدن برنامه انجام شده ولی کد مربوط به بقیه کارهایی که شما قصد دارید انجام دهید در این قسمت نوشته می شوند.
یادآوری : این بخش از کد هنگام ایجاد پروژه جدید ویندوز فرم بصورت خودکار نوشته می شود و شما کافیست تا نامی برای namespace خود تعیین کنید که در اینجا ما کلمه MyFirstProgram را انتخاب کرده ایم . در یک برنامه خیلی ساده و ابتدایی که می توان گفت شامل تمام برنامه هایی می شود که شما بعنوان یک مبتدی در شروع کارتان ایجاد می کنید ممکن است دلیل و یا ضرورت وجود namespace را متوجه نشوید ولی در برنامه های بزرگتر متوجه خواهید شد.
در کد زیر دو فضای نام یوزینگ شده و نام "فضای نام" برنامه نیز تعیین شده و در واقع تنها کلاس موجود در برنامه همین کلاس فرم است که فعلا چیزی در آن اضافه نکرده ایم.
using System;
using System.Windows.Forms;
namespace MyFirstProgram
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//// محل نوشتن کدهای شما
}
}
در سیشارپ، هنگامی که یک دکمه یا (Button) به فرم اضافه می کنید برای اضافه کردن کد به آن باید روی آن دابل کلیک کنید، پس از اینکار به طور خودکار یک متد رویداد (Event Handler) درون کدها ایجاد میشود که به رویداد Click دکمه متصل میشود. این متد به شکل زیر است:
private void button1_Click(object sender, EventArgs e)
{
// کدهایی که میخواهید هنگام کلیک روی دکمه اجرا شوند
}
این کد که نمایش متد Click است شامل بخشهایی است که بهتر است از همین ابتدای کار چشم و گوشتان با آن آشنا شود و بدانید که هر کدام چه معنی و کاربردی می توانند داشته باشند .
کلمه private نشان می دهد که کدهای درون متد Click خصوصی بوده و از بیرون آن قابل دسترسی نمی باشند.
کلمه void نشان می دهد که این متد فقط یک کار انجام می دهد و هیچگونه خروجی ندارد که بخواهیم یا بتوانیم آن را دریافت کنیم.
در اینجا، Click یک رویداد از کلاس Button است و button1_Click متدی است که وقتی رویداد Click اتفاق میافتد، فراخوانی میشود. این متد دارای دو پارامتر است که درون پرانتزها قرار میگیرند:
object sender
این پارامتر اشارهگر به شیئی است که رویداد را ایجاد کرده است. در این مورد، شیء Button است که روی آن کلیک شده است.
از این پارامتر میتوانید برای تشخیص اینکه کدام دکمه رویداد را ایجاد کرده است استفاده کنید. برای مثال، اگر چندین دکمه به این متد متصل باشند، میتوانید با استفاده از این پارامتر تشخیص دهید که کدام دکمه کلیک شده است.
EventArgs e:
این پارامتر حاوی اطلاعات اضافی درباره رویداد است. برای رویداد Click، این پارامتر معمولاً خالی است (EventArgs.Empty)، زیرا رویداد کلیک به اطلاعات اضافی نیاز ندارد.
برای برخی رویدادهای دیگر مانند MouseClick یا KeyPress ، این پارامتر حاوی اطلاعات مفیدی مانند موقعیت ماوس یا کلید فشرده شده است.
کاربردهای این پارامترها
۱. تشخیص دکمه کلیک شده (sender)
اگر چندین دکمه به یک متد رویداد متصل باشند، میتوانید از پارامتر sender برای تشخیص اینکه کدام دکمه کلیک شده است استفاده کنید. برای مثال:
private void button1_Click(object sender, EventArgs e)
{
Button clickedButton = (Button)sender; // تبدیل sender به Button
MessageBox.Show("شما روی دکمه " + clickedButton.Text + " کلیک کردید.");
}
در این مثال، اگر چندین دکمه به این متد متصل باشند، متن دکمهای که کلیک شده است در یک پیام نمایش داده میشود.
۲. استفاده از EventArgs
برای رویدادهایی که اطلاعات اضافی ارائه میدهند، میتوانید از پارامتر e استفاده کنید. برای مثال، در رویداد MouseClick، میتوانید موقعیت ماوس را دریافت کنید:
private void button1_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X; // موقعیت X ماوس
int y = e.Y; // موقعیت Y ماوس
MessageBox.Show($"ماوس در موقعیت ({x}, {y}) کلیک کرده است.");
}
دستکاری پارامترها
شما میتوانید این پارامترها را به روشهای مختلف دستکاری کنید تا رفتار برنامه را تغییر دهید. برای مثال:
۱. تغییر متن دکمه
میتوانید متن دکمهای که کلیک شده است را تغییر دهید:
private void button1_Click(object sender, EventArgs e)
{
Button clickedButton = (Button)sender;
clickedButton.Text = "کلیک شد!";
}
۲. غیرفعال کردن دکمه
میتوانید دکمهای که کلیک شده است را غیرفعال کنید:
private void button1_Click(object sender, EventArgs e)
{
Button clickedButton = (Button)sender;
clickedButton.Enabled = false;
}
۳. استفاده از EventArgs برای رویدادهای خاص
اگر از رویدادهایی مانند KeyPress یا MouseMove استفاده میکنید، میتوانید از اطلاعات موجود در EventArgs استفاده کنید. برای مثال، در رویداد KeyPress:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
{
MessageBox.Show("کلید Enter فشرده شد.");
}
}
جمعبندی
sender: اشارهگر به شیئی است که رویداد را ایجاد کرده است (مثلاً دکمهای که کلیک شده است).
e: حاوی اطلاعات اضافی درباره رویداد است برای رویداد Click معمولاً خالی است.
شما میتوانید از این پارامترها برای تشخیص شیء ایجادکننده رویداد، تغییر رفتار برنامه، یا دریافت اطلاعات اضافی استفاده کنید.
در درسهای بعدی که با انواع خروجی متدها اشنا شدید فقط این نکته را بدانید که
متدهای رویداد (Event Handlers) در سیشارپ باید از نوع void باشند، زیرا Delegate هایی که برای رویدادها استفاده میشوند (مثل EventHandler) فقط با متدهای void سازگار هستند. اگر نوع بازگشتی متد را تغییر دهید، دیگر نمیتوانید آن را مستقیماً به رویداد دکمه متصل کنید. لذا برای اینکه هنگام استفاده از این رویدادها دچار خطا نشوید نوع برگشتیشان را تغییر ندهید و بشکل void باقی بگذارید .
در پست امروز کدهای مربوط به بستن برنامه را می نویسیم . پس از دابل کلیک روی باتنی که قصد دارید از ان جهت خروج از برنامه استفاده کنید بخش معمول متد نوشته می شود که شما باید درون اکولادهای آن بنا به نیازهای خاص برنامه از یکی از این کدها استفاده کنید.
در C#، چندین روش برای خروج از برنامه وجود دارد:
متد زیر فرم فعلی را میبندد.
this.Close();
دستور زیر یک زیربرنامه یا یک thread را میبندد.
Application.ExitThread();
دستور زیر تمام پنجرههای برنامه را میبندد و همه حلقههای پیام را در تمام threadها متوقف میکند. و مناسب برنامه های ویندوزی می باشد
Application.Exit();
دستور زیر برنامه را به طور کامل خاتمه میدهد. عدد 0 نشاندهنده خروج موفقیتآمیز است و برای برنامههای کنسولی مناسب است.
Environment.Exit(0);
در برخی موارد، مخفی کردن یک فرم به جای بستن آن مزایایی دارد:
حفظ وضعیت: اگر فرم حاوی اطلاعات یا تنظیماتی است که میخواهید حفظ شود، مخفی کردن آن بهتر از بستن است.
بازگشت سریع: برای فرمهایی که مکرراً استفاده میشوند، مخفی کردن باعث میشود دفعات بعد سریعتر باز شوند.
جلوگیری از بازسازی مجدد: مخفی کردن از ایجاد مجدد فرم جلوگیری میکند، که میتواند در عملکرد برنامه تأثیر مثبت داشته باشد.
حفظ ارتباطات: اگر فرم با سایر بخشهای برنامه در ارتباط است، مخفی کردن این ارتباطات را حفظ میکند.
برای مخفی کردن یک فرم در C#، میتوانید از متد Hide() استفاده کنید:
this.Hide();
برای نمایش مجدد فرم مخفی شده:
this.Show();
اگر میخواهید فرم فعلی را مخفی کرده و فرم دیگری را نمایش دهید:
this.Hide();
Form2 f = new Form2();
f.Show();
به یاد داشته باشید که فرمهای مخفی همچنان در حافظه باقی میمانند، بنابراین در صورت عدم نیاز به آنها در آینده، باید مدیریت مناسبی برای آزادسازی منابع انجام دهید.
در این پست یک برنامه بسیار ساده را ارائه می دهم که در آن با تغییر اندازه فرم ، یک برچسب با نوشتن ابعاد داخلی فرم همواره در وسط فرم قرار می گیرد . این کار نسبتا خیلی ساده است اما من از نوشتن این کد کوچک و ساده منظور خاصی را دنبال می کنم و آن هم این است که آنچه در برنامه نویسی از خود کدنویسی مهمتراست رعایت اصول برنامه نویسی می باشد که با رعایت آن نکات برنامه شما براحتی قابل توسعه خواهد بود یعنی تمام آنچه که شما در کدهای زیر می بینید را می شود در چند خط نیز نوشت اما اگر شما اصول برنامه نویسی را رعایت نکنید هنگامی که می خواهید برنامه خود را توسعه دهید و یا برای موارد مشابه استفاده کنید با مشکلات و چالش های بزرگی مواجه می شوید پس بهتر است از ابتدای کار بجای اینکه کد هدف را یاد بگیرید اصول استفاده صحیح از کدها را یاد گرفته و از آن مهمتر اینکه به رعایت این اصول عادت کنید در غیر این صورت شما از یک برنامه نویس که می تواند برنامه های چند خطی بنویسد پا فراتر نمی گذارید . حالا متن کد زیر را بدقت بررسی کنید.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DynamicLabelPositioner
{
public partial class Form1 : Form
{
private Label sizeInfoLabel;
public Form1()
{
InitializeComponent();
InitializeControls();
}
private void InitializeControls()
{
sizeInfoLabel = lbl; // فرض میکنیم lbl در طراحی فرم تعریف شده است
UpdateLabelText();
CenterControl(sizeInfoLabel);
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
UpdateLabelText();
CenterControl(sizeInfoLabel);
}
/// بهروزرسانی متن برچسب با اطلاعات اندازه فرم
private void UpdateLabelText()
{
if (ClientSize.Width >= 0 && ClientSize.Height >= 0)
{
sizeInfoLabel.Text = $"Width: {ClientSize.Width} Height: {ClientSize.Height}";
}
else
{
sizeInfoLabel.Text = "Invalid size detected";
}
}
/// مرکزی کردن یک کنترل در فرم
private void CenterControl(Control control)
{
if (control == null) return;
int x = (ClientSize.Width - control.Width) / 2;
int y = (ClientSize.Height - control.Height) / 2;
/// اطمینان از مختصات مثبت
control.Location = new Point(Math.Max(0, x), Math.Max(0, y));
}
}