PDA

View Full Version : باز نشدن مجدد یک فرم



esmartiz_red
پنج شنبه 20 تیر 1387, 00:48 صبح
سلام
یه برنامه داریم با چند تا فرم
می خوام وقتی روی یک دکمه کلیک شد و فرم مربوط به اون باز شد ، اگر مجددا روی همون دکمه کلیک شد دوباره فرم اون باز نشه یعنی نشه 2 تا فرم باز از یک نوع بلکه فرمی که باز است فرم فعال بشه
جستجو هم کردم به جواب نرسیدم
پیشاپیش ممنون

RED-C0DE
پنج شنبه 20 تیر 1387, 01:47 صبح
می تونین از الگوی singleton استفاد کنین تا فقط یک نمونه (یک آبجکت) از کلاستون رو بسازین...برای مثال یک کلاس Generic بصورت زیر تعریف کنید :





public class SingletonForms<T> where T :new ()
{
static T _instnace ;

public static T Instance
{
get
{
System.Windows.Forms.Form tmpFrm = _instnace as System.Windows.Forms.Form;

if (tmpFrm == null || tmpFrm.IsDisposed)
_instnace = new T();

return _instnace;
}
}

}



طریقه استفاده از این کلاس هنگام فراخوانی فرمهای مورد نظر که می خواین 1 بار نمایش داده بشن به اینصورته...مثلا یک فرم به نام FrmAbout دارم و روی button مربوطه که کلیک شد اینو می نویسم توی رویدادش :




private void btnShowFrmAbout_Click(object sender, EventArgs e)
{
SingletonForms<FrmAbout>.Instance.Show();

//if (frmAbout.WindowState == FormWindowState.Minimized)
// frmAbout.WindowState = FormWindowState.Normal;
//frmAbout.Focus();

}

corona
پنج شنبه 20 تیر 1387, 08:12 صبح
Red-code عزیز این کلاس singleton رو باید با چه نامی به پروژه اضافه کنیم ؟ و اینکه این کلاسی که نوشتی فکر می کنم شبیه Template ها باشه که تو ++c باهش کار میکنیم ؟ اگه درست میگم میشه بیشتر توضیح بدی که کار باهاشون تو #C چه جوریه و اینکه اصلا این کلاسهایsinglton چی هستی ؟ چه مواقعی کاربرد دارند به غیر از این یک موردی که گفتی . ممنون

علیرضا مداح
پنج شنبه 20 تیر 1387, 08:54 صبح
سلام دوست عزیز ،
شما میبایست از پروپرتی Application.OpenForms استفاده نمایید که شامل کالکشنی از تمامی فرم های باز پروژه میباشد و چک کنید اگر فرم مورد نظر در این کالکشن موجود است به جای نمونه سازی مجدد ، همان فرم فعال شود ،/

Parham.D
پنج شنبه 20 تیر 1387, 08:58 صبح
البته من تازه كار هستم اما گمان مي‏كنم براي يك كاره ساده كدهاي پيچيده مي‏نويسيد. خوب مي‏تونيد دكمه مخصوص هر فرم را بعد باز شدن فرم غير فعال كنيد و بعد از بسته شدنش دوباره فعال كنيد و يا ميتونيد از يك متغير Boolean براي اين كار استفاده كنيد. اگر True بود فرم رو باز كنه و اگر false بود فرم باز رو فقط فعال كنه.

اگر اشتباه ميگم گوش زد كنيد تا ياد بگيرم.

مرسي

corona
پنج شنبه 20 تیر 1387, 16:04 عصر
البته منم یک تازه کارم . خوب در این مورد و برای این مثال خاص با شما موافقم که راه های ساده تری هم میشه به کار گرفت . اما مسلما همیشه اگه طبق اصول طراحی کاری انجام بشه خیلی در تولید نهایی نرم افزار موثرتر خواهد بود و من هم با شناختی که از RED -CODE دارم مطمئنم می خواسته طبق اصول کارش رو انجام بده وگرنه اونم مثل شما راه های ساده تری رو پیشنهاد می داد . موفق باشید .

Sajjad.Aghapour
پنج شنبه 20 تیر 1387, 21:29 عصر
دوست عزیز راه های مختلفی برای این کار ممکنه وجود داشته باشه.ولی به قول خودتون اگه تازه کارید(که خودم هم هستم) از الان به بهترین ها خودتون رو عادت بدید.بهترین روش همون الگوی سینگلتونه.برای اطلاعات بیشتر هم می تونید از پست زیر استفاده کنید...
http://barnamenevis.org/showthread.php?t=99235
.
از کد زیر هم میتونید طبق گفته اقای مداح استفاده کنید


Form1 frm = new Form1();
bool isOpen = false;
foreach (Form f inApplication.OpenForms)
{
if (f.Name == frm.Name)
{
isOpen = true;
f.Focus(); break;
}
}
if (!isOpen)
frm.Show();