PDA

View Full Version : با خبر شدن از بسنه شدن یک فرم (یا هر کلاس) و انتظار برای بسته شدن یا دیسپوز آن



hojjatshariffam
یک شنبه 30 تیر 1392, 01:09 صبح
سلام به دوستای گلم
من می خوام وقتی یه کلاسی مثل فرم وقتی بسته میشه خودش به طریقی به ما بگه که بسته شدم (منظورم از به ما به برنامه هستش تا از جاهای دیگه یه رویدادی رو اجرا کنه)
یا اینکه مثلا در یه جای برنامه بر فرض مثال اگه خاستیم فلان فرم بسته شود ، منتظر بمانیم که اگر فرم بسته شد یه کاری انجام بشه
می خوام در کل این نوع رویداد ها رو یاد بگیرم وگرنه کاربردم اینه
"
یه کامپوننت درست کردم که وقتی هر فرم رو باز می کنم اسم اون فرم رو میفرستم به اون کامپوننت و لیست فرم هامو تو اون نشون میده و هر موقع روی اونا (یه باتن کلوز گزاشتم جلوی اسم فرمام)کلیک بشه یه ایونت رخ می دهم و اسم فرم رومی فرستد ، و هر فرمی که اسمش مطابقت کنه بسته میشه
مشکل اینجاست که رویداد کلوز بعضی از فرم هام رو دستکاری کردم و هنگام بسته شدن باید یا پیغام بدن و یا یه سری از عملیات رو انجام بدن مثل ذخیره داده حالا اگر این عملیات انجام نشود و یا کاربر کنسل کند فرم بسته نمی شود در حالی که کامپوننتم پیغام رو فرستاده و خودشم از لیست کم کرده ملی فرم هنوز بازه
من می خوام رویدادم یه بازگشتی (نمی دونم از چه طریقی)داشته باشه تا اگه فرمم بسته نشد اون کامپوننتم هم بدونه ، در واقع منتظر جواب بسته شدن (یا هر رویداد دیگه ای )بمونه
"
به نظرتون چه روشی برای رویداد ها ی دو طرفه وجود دارد
یعنی ما یه رویدادی رو از یه کلاس دیگه (از طریق رویداد) بخواهیم و منتظر بمونیم که جوابی از اون بیاد (در حالی که ما دسترسی به اون نداریم)و اگه جواب اوکی شد یه کاری رو انجام بدیم

erfan_urchin
یک شنبه 30 تیر 1392, 01:31 صبح
شما میتونی از طریق رویداد FormClosed این کارو بکنی
مثلا:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("Form1 Closed");
}
این کد ، وقتی فرم بسته شد پیغام میده که فرم بسته شد
موفق باشی

hojjatshariffam
یک شنبه 30 تیر 1392, 01:50 صبح
شما میتونی از طریق رویداد FormClosed این کارو بکنی
مثلا:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("Form1 Closed");
}
این کد ، وقتی فرم بسته شد پیغام میده که فرم بسته شد
موفق باشی
من نیم خوام خودم بدونم بالا هم گفتم که (منظورم از به ما یعنی به برنامه ، تا از جاهای دیگه یه سری رویدادهایی رو اجرا کنه)
یعنی می خوام مثلا یه فرمی که اگه خودشم بسته بشه به یه کامپوننتی که هیچ دسترسی هم بهش نیست بفهمونه که من بسه شدم
حالا اون کامپوننت می تونه یه کاری رو بکنه یا نکنه مثل همین رخ دادن رویدادهای خودمون
منتها فرقش اینه که در رویداد ها ما به اون کامپوننت دسترسی داریم و براش یه ایونت می نویسیم ولی چیزی که من میخوام اینه که اصلا اون فرم به کامپوننت دسترسی نداره فقط یه پیغام بفرسته اگه گیرنده ای بود که می گیره و کاری انجام می ده اگه نبود که هیچ

Mahmoud.Afrad
یک شنبه 30 تیر 1392, 03:22 صبح
کار حذف مشخصات فرم ها را به رویداد فرم ها واگذار کنید. یک متد پابلیک داخل کامپوننت بنویسید برای حذف مشخصات فرم. کافیه در رویداد closed فرم هاتون اون متد رو فراخوانی کنید.

hojjatshariffam
یک شنبه 30 تیر 1392, 03:44 صبح
کار حذف مشخصات فرم ها را به رویداد فرم ها واگذار کنید. یک متد پابلیک داخل کامپوننت بنویسید برای حذف مشخصات فرم. کافیه در رویداد closed فرم هاتون اون متد رو فراخوانی کنید.
خب مساله اینه که اصلا فرم ها اون کامپوننت و نمی شناسن
اصلا اون کامپوننت توی فرم هام نیست که فقط تو فرم اصلیمه
هر فرمو کا باز می کننم از فرم اصلی به اون اطلاع می دم
از اون کامپوننتن هر باز که فرمی رو می بندم یه رویداد رخ میده که تو فرم اصلیه و تو فرم اصلی یا فرمو می بنده یا فرمو میاره جلو (طبق خواسته) حالا مساله اینه که اگه فرم خودش بسته بشه اون کامپوننت چیزی نمی فهمه (یعنی از کجا باید بفهمه) چون اصلا اون فرمها که اونو نمیشناسن
باید یه بلک بردی مسیجی ، چیزی ارسال بشه فکر کنم

hojjatshariffam
یک شنبه 30 تیر 1392, 03:50 صبح
اگه از بلک برد استفاده کنم باید یه تایمر بزارم که هر چند وقت یک بار چک کنه که از فرمهایی که در لیست بوده کاسته شده یا نه
اونوقت تایمرش یه ترید میسازه و منابع (حتی یک منبع هم فکر کنم مهمه تو سیستم های کند) رو اشغال می کنه برا همین فکر نکنم اصولی باشه
باید یه رویداد خاص بتونم طراحی کنم که گلوبال باشه

Mahmoud.Afrad
یک شنبه 30 تیر 1392, 07:28 صبح
مثل اینکه متوجه نشدی! موقع ایجاد فرم رویداد closed رو هندل میکنی و متد پابلیک رو فراخوانی میکنی.
یوزرکنترل زیر را فرض کن:

public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}

public void AddFormToList(string formName)
{
listBox1.Items.Add(formName);
}

public void RemoveFormFromList(string formName)
{
foreach (var item in listBox1.Items)
{
if (item.ToString() == formName)
{
listBox1.Items.Remove(item);
break;
}
}
}
}

حالا در فرم اصلی هر جا فرم جدید ایجاد میکنی رویداد رو هندل کن و در رویداد متد را فراخوانی کن:

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
this.userControl11.AddFormToList(frm.Name);
frm.Show();
}

private void frm_FormClosed(object sender, FormClosedEventArgs e)
{
Form f = sender as Form;
this.userControl11.RemoveFormFromList(f.Name);
}

shadi khanum
یک شنبه 30 تیر 1392, 08:26 صبح
اگه درست متوجه شده باشم میخوای اگه فرم بسته شد جایی اعلام کنه که یه کامپوننت دیگه بره یه کار دیگه انجام بده..
میتونی یه لیست public تعریف کنی که هر فرمی که بسته شد مثلا اسمشو و یک سری مشخصاتی که لازم داری رو توی اون لیست سراسری register کنه، بعد برای اون کامپوننت هم؛ اگر میدونی چه موقع باید بره چک کنه اگه فرمی بسته شده بود کاری رو انجام بده، توی همون رویدادش برو لیست رو چک کن و ببین چه فرمی بسته شده و کاری که میخوای رو انجام بده، اگه نه نمیدونی اون کامپوننت کی باید چک کنه، یا اینکه همیشه باید چک کنه میتونی تو ساده ترین راه یه تایمر برا اون کامپوننت تعریف کنی که مثلا هر 1 دقیقه یه بار چک کنه ببینه فرمی توی اون لیست اومده یا نه

hojjatshariffam
یک شنبه 30 تیر 1392, 18:03 عصر
مثل اینکه متوجه نشدی! موقع ایجاد فرم رویداد closed رو هندل میکنی و متد پابلیک رو فراخوانی میکنی.
یوزرکنترل زیر را فرض کن:

public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}

public void AddFormToList(string formName)
{
listBox1.Items.Add(formName);
}

public void RemoveFormFromList(string formName)
{
foreach (var item in listBox1.Items)
{
if (item.ToString() == formName)
{
listBox1.Items.Remove(item);
break;
}
}
}
}

حالا در فرم اصلی هر جا فرم جدید ایجاد میکنی رویداد رو هندل کن و در رویداد متد را فراخوانی کن:

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
this.userControl11.AddFormToList(frm.Name);
frm.Show();
}

private void frm_FormClosed(object sender, FormClosedEventArgs e)
{
Form f = sender as Form;
this.userControl11.RemoveFormFromList(f.Name);
}

بله درسته اصلا تو فکرم نبود که تو لحضه ایجاد فرم رویداد رو براش هندل کنم
واقعا متشکرم (فکرمو مشغول کرده بود)