PDA

View Full Version : تکمیل : اجرای فرم و اشیا ، فقط یک بار



Babak-Aghili
شنبه 18 تیر 1384, 00:51 صبح
سلام.
قبلا در تاپیکهای این بخش ، مشکلی مطرح شده بود مبنی بر اینکه مثلا اگر از Form.Show برای ساخت و نمایش فرمهای برنامه استفاده شود ، آنگاه با هر بار کلیک بر روی دکمه نمایش آن فرم ، یک فرم جدید ساخته و نمایش داده میشود که مطلوب نیست ...

همین موضوع میتواند برای جلوگیری از ساختن هر شی دیگری بیش از یک بار هم مورد توجه باشد.
-------
بهترین پاسخ استفاده از Singleton Pattern ها بود که آقای قناعت پیشه به آن اشاره کرده بودند .
----------

فایل الحاقی ، شامل نمونه برنامه ای است که با این تکنیک ساخته شده .

دقت شود که کانستراکتر را private گرفته ایم ... و سایر ریزه کاریها که خودتان متوجه خواهید شد.

mhnahmadi
شنبه 24 آذر 1386, 12:48 عصر
کسی می‌تونه کمک کنه که این قطعه کد مشکلش چیه؟ می‌خوام یه چایلد فرم فقط یکبار باز بشه و اگر در حالی که این چایلد فرم بازه کاربر خواست دوباره بازش کنه، بهش خطا بده:





Cursor = Cursors.WaitCursor;
for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name == "ChangePass")
{
((Form)Application.OpenForms[i]).Focus();
((Form)Application.OpenForms[i]).WindowState = FormWindowState.Normal;
Cursor = Cursors.Default;
return;
}
ChangePass childForm = new ChangePass();
childForm.Name = "ChangePass";

childForm.MdiParent = this;
childForm.Show();
childForm.BringToFront();
Cursor = Cursors.Default;

اَرژنگ
یک شنبه 25 آذر 1386, 08:57 صبح
کسی می‌تونه کمک کنه که این قطعه کد مشکلش چیه؟ می‌خوام یه چایلد فرم فقط یکبار باز بشه و اگر در حالی که این چایلد فرم بازه کاربر خواست دوباره بازش کنه، بهش خطا بده:

به جایه اینکه خطا بده بهتر نیست که بهش فوکوس بده و بیارتش بالا؟

ir_programmer
یک شنبه 25 آذر 1386, 09:35 صبح
مگه این مشکلت رو حل نکرد؟

Form2 _frmForm2;

private void ssToolStripMenuItem_Click(object sender, EventArgs e)
{
if (_frmForm2 == null || _frmForm2.IsDisposed)
{
_frmForm2 = new Form2();
_frmForm2.MdiParent = this;
_frmForm2.Show();
}
else
{
MessageBox.Show("sorry");
// TODO : here if the form is open
}
}

اَرژنگ
دوشنبه 26 آذر 1386, 07:53 صبح
مگه این مشکلت رو حل نکرد؟

Form2 _frmForm2;

private void ssToolStripMenuItem_Click(object sender, EventArgs e)
{
if (_frmForm2 == null || _frmForm2.IsDisposed)
{
_frmForm2 = new Form2();
_frmForm2.MdiParent = this;
_frmForm2.Show();
}
else
{
MessageBox.Show("sorry");
// TODO : here if the form is open
}
}
از لحاض طراحی این روش درستی نیست.

hemati
شنبه 18 مهر 1388, 08:52 صبح
بهترین روش برای این کار استفاده از دستور ذیل می باشد
در رویداد مربوط به باز شدن فرم کد:
if (Application.OpenForms.Count == 1)
{
Form2 frm = new Form2();
frm.MdiParent = this;
frm.Show();

}
دیگر فقط یکبار فرم باز می شود.



لذت آموخت را به دیگران بچشانید.

اَرژنگ
شنبه 18 مهر 1388, 09:52 صبح
بهترین روش برای این کار استفاده از دستور ذیل می باشد
در رویداد مربوط به باز شدن فرم کد:

if (Application.OpenForms.Count == 1)
{
Form2 frm = new Form2();
frm.MdiParent = this;
frm.Show();

}دیگر فقط یکبار فرم باز می شود.



لذت آموخت را به دیگران بچشانید.
با تشکراز تلاش شما برایه کمک، ولی اشکالات این روش از لحاظ طراحی :
۱.استفاده از ابکجت اپلیکیشن در حالتی که بهش نیازی نیست.
۲.استفاده نکردن از الگوها و روشهایه استاندارد ، در این مثال پست اول به الگویه سینگلتن اشاره کرده، بهش اول باید یک نگاه انداخته میشد.
۳.پیاده کردن و پخش کردن منطق اینکه فرم ۲ وجود دارد یا نه در هر جایی که لازم باشد به فرم دسترسی داشته باشیم، به جایه اینکه با انکپسولیشن و اصول درست طراحی شئیگرائی فقط در کلاس فرم ۲ پیاده در یکجا تمرکز داشته باشد.

دلیل استفاده کردن از الگویه سینگلتن دقیقاً همین است.

قبل از اینکه خودمان را معلم بدانیم و بخواهیم که به دیگران چیزی یاد بدیم باید قبول کنیم همیشه قابلیت یاد گیری داریم، از دیگران درخواست کنیم که به روشهایمان اشکال بگیرند و کمبودیهای را که ممکن است داشته باشد بیان کنند و اگر از روشی دیگری که ممکن است از جهاتی بهتر باشد خبر دارند بهمان اطلاع بدند.

یاد دادن روشهایه کمتر از بهترین روشهایه موجود ضرر است و از یاد ندادن بهتر.

موفق باید