PDA

View Full Version : سوال: چک کردن باز بودن فرم



fghdmhmmd
پنج شنبه 14 شهریور 1387, 20:57 عصر
سلام،من از ویژوال استودیو 2003 (سی شارپ) استفاده میکنم.نیاز به دستوری برای چک کردن باز بودن فرمها هنگام اجرای برنامه هستم.شبیه به دستور application.openforms() در ویژوال استودیو 2005،لطفا کمکم کنید ؟

اَرژنگ
جمعه 15 شهریور 1387, 02:43 صبح
سلام،من از ویژوال استودیو 2003 (سی شارپ) استفاده میکنم.نیاز به دستوری برای چک کردن باز بودن فرمها هنگام اجرای برنامه هستم.شبیه به دستور application.openforms() در ویژوال استودیو 2005،لطفا کمکم کنید ؟
یک کلاس فرم منجر بسازید، هر وقت که میخواهید فرمی را باز کنید از این فرم منجر تقاضا کنید که وازش کند، هروقت که یک فرم را باز میکند در یک لیست اسم فرم را که باز کرده اضافه کند.
هر وقت هم که خواستید فرمی را ببندید از منجر درخواست کنید که ببنده، و در لیستش اسمه فرم را از لیست ورمیداره.
هر وقت بخواهید از فرم منجر میتوانید درخواست کنید که لیست فرمهایه باز را بهتان برگرداند و یا اینکه باز بودن یک فرم را بهتان بگد.
میتوانید تمام فرمهایه برنامه را یک فرمی که موقع باز شدن خودش را فرم منجر رجیستر میکند ارث ببرید.

fghdmhmmd
جمعه 15 شهریور 1387, 11:03 صبح
مرسی از راهنماییتون،یه مشکل دیگه دارم،اونم اینه که میخام هرفرمی که باز میشه وضعیتشو از فرم اصلی بتونم کنترل کنم،مثلا فرض کنید 2تا فرم دارم،یه باتن درفرم اول دارم،وقتی بر روی باتن کلیک میکنم یک فرم جدید ساخته بشه و نمایش داده بشه و تا زمانیکه این فرم در حال نمایش هست اگر بر روی باتن موجود در فرم اول کلیک کنم فرم جدیدی باز نشود،با روشی که گفتین میتونم بفهمم باز هست یا نه،اما زمانیکه فرم ایجاد شده رو یکبار کلوز کنم دیگه نمیتونم ازش آبجکت جدیدی بسازم!
البته میخام اگه فرم دوم باز باشه و مینیمایز باشه اگه بر روی باتن فرم اول کلیک کردم وضعیتشو به حالت اول برگردونه و بر روی آن فوکوس کنه!
روشی که من استفاده کردم به این شکل هست :

در کلاس فرم اول یک آبجکت پابلیک از فرم دوم میسازم :
public form2 frm2=new form2();
در متد باتن موجود در فرم اولم این دستورو مینویسم :
if(exist(frm2.Name))
{
if(frm2.WindowState==FormWindowState.Minimized)
frm2.WindowState=FormWindowState.Normal;
frm2.BringToFront();
}
else
{
openForms.Add(frm2.Name);
frm2.Show();
}
در فرم لود فرم 2 هم دستور زیر را مینویسم :
Form1 frm=new Form1();
frm.frm2=this;
در کلوز فرم 2 هم این دستور را مینویسم :
this.Dispose(false);
Form1.openForms.Remove(this.Name);
جهت چک کردن باز بودن فرم از این آرایه و فانکشن که در فرم 1 نوشتم استفاده میکنم :
public static ArrayList openForms = new ArrayList(); //list of open Form1's
private static Form1 OpenForms(int index)
{
return (Form1)openForms[index]; //get the open form at the given index
}
================================================== ==============
bool exist(string name)
{
for(int i=0;i<openForms.Count;i++)
if(openForms[i].ToString()==name)
return true;
return false;
}
================================================== ===============
لطفا کمکم کنید ؟
اگه برام نمونه کد بزارید خیلی ممنون میشم

fghdmhmmd
شنبه 16 شهریور 1387, 13:07 عصر
سلام،من جواب سوالمو پیدا کردم.اما فکر میکردم کسانی باشند که بتونن من رو کمکم کنن.به هر حال جواب سوالمو میزارم شاید در آینده به درد کسی بخوره.
راه حل :
در باتن موجود در فرم اول دستو زیر را اضافه می کنم :
frm2.Disposed+=new EventHandler(frm2_Disposed);
و در هندلر شئ فرم 2 دستور زیر را مینویسم (در فرم اول ) :
private void frm2_Disposed(object sender, EventArgs e)
{
form2 frm=new form2();
this.frm2=frm;
}
موفق باشید،خدانگهدار

mehdi.mousavi
شنبه 16 شهریور 1387, 14:50 عصر
سلام،من جواب سوالمو پیدا کردم.اما فکر میکردم کسانی باشند که بتونن من رو کمکم کنن.به هر حال جواب سوالمو میزارم شاید در آینده به درد کسی بخوره.
راه حل :
در باتن موجود در فرم اول دستو زیر را اضافه می کنم :
frm2.Disposed+=new EventHandler(frm2_Disposed);
و در هندلر شئ فرم 2 دستور زیر را مینویسم (در فرم اول ) :
private void frm2_Disposed(object sender, EventArgs e)
{
form2 frm=new form2();
this.frm2=frm;
}
موفق باشید،خدانگهدار

سلام.
کدی که نوشتید اینقدر ایراد داره، که نمیدونم از کجاش بگم. آرژنگ سعی کرد به شما تفهیم کنه که همه چیز UI نیست، و اینطور در UI غرق نشید. شما نیاز به یک Model دارید که کلیه متودهای مورد نظر در رابطه با Windowing رو در اون Encapsulate کنید. از این به بعد، وظیفه اونه که این مدیریت رو انجام بده، الان شما Controller رو هم در UI آوردید که خوب این افتضاحه.

همه اینا یعنی اینکه، ننویسید


Form2 frm = new Form2();

این وظیفه Model هستش که بر اساس درخواست شما، اینکارو کنه. حالا چه فرم2 باشه، چه فرم N. آرژنگ سعی کرد بهتون بگه که نوشتن چنین کدی در Click Event مربوط به Button اتون ننویسید:


if exists()...

این مساله به فرم 2 یا 1 ربطی نداره که exists هست یا نه. این وظیفه Model هستش که اینکارا رو کنه. یه چیز خیلی بدی که در کد دیدم، این بود که شما جای گرفتن FormClosing یا FormClosed (برای تشخیص بسته شدن فرم) دارید Disposed Event فرم رو میگیرید. این یعنی فاجعه. و بدتر از اون:


this.Dispose(false);

این چی هستش که نوشتید؟ خودتون میدونید؟ به نظر من همین الان دست نگه دارید، یه کتاب بخرید و بخونید و دانش خودتون رو ارتقاء بدید و الا تو این زمینه هرگز موفق نخواهید بود.

hamednaseri
چهارشنبه 24 شهریور 1395, 13:57 عصر
سلام.
کدی که نوشتید اینقدر ایراد داره، که نمیدونم از کجاش بگم. آرژنگ سعی کرد به شما تفهیم کنه که همه چیز UI نیست، و اینطور در UI غرق نشید. شما نیاز به یک Model دارید که کلیه متودهای مورد نظر در رابطه با Windowing رو در اون Encapsulate کنید. از این به بعد، وظیفه اونه که این مدیریت رو انجام بده، الان شما Controller رو هم در UI آوردید که خوب این افتضاحه.

همه اینا یعنی اینکه، ننویسید


Form2 frm = new Form2();

این وظیفه Model هستش که بر اساس درخواست شما، اینکارو کنه. حالا چه فرم2 باشه، چه فرم N. آرژنگ سعی کرد بهتون بگه که نوشتن چنین کدی در Click Event مربوط به Button اتون ننویسید:


if exists()...

این مساله به فرم 2 یا 1 ربطی نداره که exists هست یا نه. این وظیفه Model هستش که اینکارا رو کنه. یه چیز خیلی بدی که در کد دیدم، این بود که شما جای گرفتن FormClosing یا FormClosed (برای تشخیص بسته شدن فرم) دارید Disposed Event فرم رو میگیرید. این یعنی فاجعه. و بدتر از اون:


this.Dispose(false);

این چی هستش که نوشتید؟ خودتون میدونید؟ به نظر من همین الان دست نگه دارید، یه کتاب بخرید و بخونید و دانش خودتون رو ارتقاء بدید و الا تو این زمینه هرگز موفق نخواهید بود.


دوست عزیز جای این همه ایراد گرفتن به این بنده خدا یه راهنمایی می کردین!!!
به نظرم میتونین از این دستور استفاده کنین :

var m= Application.OpenForms.OfType<SabteEtelaatMelk>().FirstOrDefault();
for (int i=0;i<=Form.ActiveForm)
if(sema!=null)
{
m.Activate();
}
else
{
SlidshowPicture.Hide();
// SlidshowPicture.Dispose();
timer1.Enabled = false;
m.MdiParent = this;
m.Show();




}