PDA

View Full Version : مشکل در تغییر نام فرم



SYSMAN
دوشنبه 24 آبان 1389, 09:42 صبح
با سلام

یک مشکلی وجود داره در زمانی که شما یک فرم را تغییر نام می دهید
به این صورت که فرض کنید شما یک فرم به اسم form1 توی پروژه دارید
ویک متد به نام Form1_Load حالا نام فرم را تغییر می دهید به form2 در این صورت از شما
یک سوال پرسیده می شه که در کل پروژه نام form1 به form2 تبدیل بشه یا نه؟
در صورت تایید هیچ مشکلی پیش نمیاد ولی بزرگترین اسکال منطقی کار اینجاست که متدهای قبلی که وجود دارند به نام جدید تغییر نمی کنند. در طی گذشت زمان و نگهداری برنامه این مسئله مشکل ساز می شه مثلا سه بار شما نام فرم را تغییر بدهید و در این بین چندین متد ایجاد کرده باشید. آیا واقعا جالب هست سه تا نام فرم توی کد برای متدها دیده بشن در حالی که
هر سه نام مربوط به یک فرم می شوند.
آیا راهی هست که بشه موقع تغییر نام فرم نام متدها هم به نام جدید تغییر کنه؟

mehdi.mousavi
دوشنبه 24 آبان 1389, 17:28 عصر
با سلام یک مشکلی وجود داره در زمانی که شما یک فرم را تغییر نام می دهید به این صورت که فرض کنید شما یک فرم به اسم form1 توی پروژه دارید ویک متد به نام Form1_Load حالا نام فرم را تغییر می دهید به form2 در این صورت از شما یک سوال پرسیده می شه که در کل پروژه نام form1 به form2 تبدیل بشه یا نه؟ در صورت تایید هیچ مشکلی پیش نمیاد ولی بزرگترین اسکال منطقی کار اینجاست که متدهای قبلی که وجود دارند به نام جدید تغییر نمی کنند. در طی گذشت زمان و نگهداری برنامه این مسئله مشکل ساز می شه مثلا سه بار شما نام فرم را تغییر بدهید و در این بین چندین متد ایجاد کرده باشید. آیا واقعا جالب هست سه تا نام فرم توی کد برای متدها دیده بشن در حالی که هر سه نام مربوط به یک فرم می شوند. آیا راهی هست که بشه موقع تغییر نام فرم نام متدها هم به نام جدید تغییر کنه؟

سلام.
وقتی می فرمایید یه متود دارید به اسم Form1_Load من حالم بد میشه. چرا؟ چون بلافاصله متوجه میشم که جای اینکه دستهای شما روی Keyboard باشه، روی Mouse هستش! واقعیت اینه که شما اصلا نباید اینطوری از Event های درون Form اتون مطلع بشید. وقتی شما در درون کلاس Form1 دارید کد می نویسید، باید با استفاده از overload کردن متودهای مزبور به هدفتون برسید. به بیان دیگه، جای ایجاد کردن متود Form1_Load، شما باید اینطور عمل کنید:


protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}


اون Event ها برای افرادی ساخته شده که به کلاس Form دسترسی ندارن. بطور نمونه، اونجاییکه دارید Instance ای از Form1 ایجاد می کنید، این کار کاملا طبیعی هستش که بخواهید از Load Event مطلع بشید، در این صورت میتونید بدین شکل عمل کنید:

Form1 form1 = new Form1();
form1.Load += new EventHandler(form1_Load);

اما وقتی کلاس شما داره از System.Windows.Forms.Form مشتق میشه، دیگه نباید سراغ اون Event ها برید چون به متودهای protected کلاس System.Windows.Forms.Form دسترسی دارید (منظورم OnLoad هستش).

اینطوری یه Performance Gain ای هم نصیبتون میشه، چون اجرای متودهای virtual سریعتر از فرایند Fire کردن Event ها هستش؛ ضمن اینکه یکی از ابتدایی ترین اصول OOP هستش.

موفق باشید.

پاورقی: در هر حال، شاید در نسخه های بعدی Visual Studio مایکروسافت این مشکل رو نیز رفع کنه، اما باز هم این مساله نباید باعث بشه که شما کدتون رو غیر اصولی بنویسید.

SYSMAN
پنج شنبه 27 آبان 1389, 08:33 صبح
ممنون برای Item های روی یک فرم باید به چه صورتی عمل کرد؟

mehdi.mousavi
پنج شنبه 27 آبان 1389, 10:51 صبح
ممنون برای Item های روی یک فرم باید به چه صورتی عمل کرد؟

سلام.
اگر منظورتون UI Component هایی هستش که روی فرم قرار میدید، باید به همون شکل سابق از طریق گرفتن Event های مورد نظرتون از تغییرات اون UI Component ها مطلع بشید. مگر اینکه بخواهید UI Control ای رو Extend کنید که در اینصورت باید اون Control رو Subclass کنید و قابلیتهای مورد نظر رو بهش اضافه کنید. از اونجاییکه Subclass کردن کنترل امکان دسترسی به متودها / Property های Protected رو فراهم میکنه، در نتیجه بازهم باید برای اطلاع از Event ها از متودهای OnXXX استفاده کنید.

موفق باشید.

kamran00f
پنج شنبه 27 آبان 1389, 11:45 صبح
با سلام

یک مشکلی وجود داره در زمانی که شما یک فرم را تغییر نام می دهید
به این صورت که فرض کنید شما یک فرم به اسم form1 توی پروژه دارید
ویک متد به نام Form1_Load حالا نام فرم را تغییر می دهید به form2 در این صورت از شما
یک سوال پرسیده می شه که در کل پروژه نام form1 به form2 تبدیل بشه یا نه؟
در صورت تایید هیچ مشکلی پیش نمیاد ولی بزرگترین اسکال منطقی کار اینجاست که متدهای قبلی که وجود دارند به نام جدید تغییر نمی کنند. در طی گذشت زمان و نگهداری برنامه این مسئله مشکل ساز می شه مثلا سه بار شما نام فرم را تغییر بدهید و در این بین چندین متد ایجاد کرده باشید. آیا واقعا جالب هست سه تا نام فرم توی کد برای متدها دیده بشن در حالی که
هر سه نام مربوط به یک فرم می شوند.
آیا راهی هست که بشه موقع تغییر نام فرم نام متدها هم به نام جدید تغییر کنه؟


نام event ها درسته که بر اساس نام کنترلی که داره اون event بهش اضافه شه نوشته میشه ولی این معنی رو نمیده که اگه اسم کنترلتو عوض کنی. واسه همین مثالی که زدی. وقتی form1 رو میسازی و event ای با اسم form1_Load بهش اضافه میکنی از solution explorer برو به قسمت ّform1.Designer.cs و اونجا بگرد. این عبارت رو پیدا میکنی:
this.Load += new System.EventHandler(this.Form1_Load);

اینجا مشخص میشه که چه تابعی با چه اسمی در هنگام لود شدم فرم خونده شه (اسمی که داخل پرانتز هست) و این هیچ ربطی به اسم فرم نداره. تو 100 بار هم که اسم فرمتو عوض کنی باز این خط به همین شکل باقی میمونه و در هنگام لود شدن فرم تابع form1_Load خونده میشه. ولی مشکل این کد اینه که مثلا اگه تو اسم فرم رو تغییر داده باشی به MainForm بازم تابع form1_Load اجرا میشه که این گیج کننده هست. همونطور که خودتم بهتر از من میدونی نام تابع باید متناسب با کاری باشه که انجام میدن.