PDA

View Full Version : سوال: عدم باز شدن مجدد یک پنجره در صورتیکه پنجره مزبور قبلا باز شده باشد



jeivid
دوشنبه 06 اردیبهشت 1389, 16:03 عصر
با سلام دوستان
کدی میخوام که با زدن یک دکمه پنجره باز بشه و اگر دوباره بر روی دکمه کلیک کرد و پنجره باز بود دوباره پنجره باز نشده یعنی تکراری باز نشه

ممنون

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 16:11 عصر
Form1:

publicstaticbool Open = false; privatevoid button1_Click(object sender, EventArgs e) { if (!Open) { Open = true; Form2 frm = newForm2(); frm.Show(); } }
Form2:

privatevoid Form2_FormClosed(object sender, FormClosedEventArgs e) { Form1.Open = false; }

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 17:59 عصر
دوست عزیز شما اگه جایی اشتباه میکنی دلیل بر غلط بودن کد نیست!!

csharpdoost
دوشنبه 06 اردیبهشت 1389, 18:37 عصر
سلام دوستان
فكر ميكنم اگه به جاي دستور ()f.show از دستور ()f.showdialog استفاده كنيد مشكلتون حل بشه.
موفق باشيد

hojjatshariffam
دوشنبه 06 اردیبهشت 1389, 18:39 عصر
کاملا درسته و صد در صد هم کار خواهد کرد
ولی اصول شئی گرایی رو نقض می کنه

اما به هر حال روش کارایی هست

s.khoshfekran
دوشنبه 06 اردیبهشت 1389, 18:44 عصر
کاملا درسته و صد در صد هم کار خواهد کرد
ولی اصول شئی گرایی رو نقض می کنه

اما به هر حال روش کارایی هست

شما اگه روش دیگه ای بلدی بگو دوست عزیز!!!
واسه ی چی اصول OO رو نقض میکنه ؟؟

arefba
دوشنبه 06 اردیبهشت 1389, 19:34 عصر
شما می خواهید فقط یک نمونه از برنامه اجرا شود

using System.Reflection;
using System.Management;



[STAThread]
static void Main()
{
string[] parts =
Assembly.GetExecutingAssembly().Location.Split("\\".ToCharArray());
string appName = parts[parts.Length - 1];
string query = "select name from CIM_Process where name = '"
+ appName + "'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
int runcount = 0;
foreach (ManagementObject item in searcher.Get())
{
runcount++;
if (runcount > 1) break;
}
if (runcount == 1)
{
Application.Run(new Form1());
}
else
{
System.Windows.Forms.MessageBox.Show("قبلا اجرا شده");
Application.Exit();
}
}

mahmoodramzani
دوشنبه 06 اردیبهشت 1389, 20:15 عصر
شما اگه روش دیگه ای بلدی بگو دوست عزیز!!!
واسه ی چی اصول OO رو نقض میکنه ؟؟
می تونی از Singleton Pattern استفاده کنی.

Marzieh_A
دوشنبه 06 اردیبهشت 1389, 23:38 عصر
FormCollection ff = newFormCollection();

ff = Application.OpenForms;
if (ff["Form2"] != null)
{
ff["Form2"].Close();
}
else {
Form2 Frm2 = newForm2();
Frm2.Show();
}

اَرژنگ
سه شنبه 07 اردیبهشت 1389, 05:27 صبح
شما اگه روش دیگه ای بلدی بگو دوست عزیز!!!
واسه ی چی اصول OO رو نقض میکنه ؟؟

۱.برایه اینکه کد مربوط به به اینکه فرم ۲ نشان داده میشه و یا نه در فرم ۱ قرار گرفته. اگر قرار بود که فرم ۲ از یک فرم دیگر فقط یکبار نشان داده بشه باید این کد دوباره کپی و پیست بشه.
در حالی که اگر همان فرم ۲ منطشق را در خودش جمع نگهداری احتیاجی به اینکار نیست.

۲.این روش استفاده متغییرهایه استاتیک درست نیست، و احتیاجی نیست. استفاده از متغییرهایه استاتیک همان روش قدیمی غیره‌شئیگرایست ولی در یک زبان شیگرا پیاده شده، نتیجه اینکه کد حاصل شیگرا نیست. استفاده بیجهت از متغییرهایه استاتیک نشان ضعف در برنامه‌نویسی شیگرائیست.

اَرژنگ
سه شنبه 07 اردیبهشت 1389, 05:34 صبح
FormCollection ff = newFormCollection();

ff = Application.OpenForms;
if (ff["Form2"] != null)
{
ff["Form2"].Close();
}
else
{
Form2 Frm2 = newForm2();
Frm2.Show();
}




این روش اصلاً توصیه نمیشه، استفاده از رشته‌ها برایه اینگونه کارها اشتباه است.
ایده درسته ولی اشتباه پیاده شده، ولی متاسفانه وجود و دسترسی به Application.OpenForms این روش اشتباه را ترویج میده.

exlord
سه شنبه 07 اردیبهشت 1389, 11:07 صبح
private void button1_Click_1(object sender, EventArgs e)
{
Form2 frm2 = (Application.OpenForms["Form2"] as Form2);
if (frm2 == null)
{
frm2 = new Form2();
frm2.Show();
}
else
{
frm2.Close();
frm2.Dispose();
}
}

exlord
سه شنبه 07 اردیبهشت 1389, 11:12 صبح
این روش اصلاً توصیه نمیشه، استفاده از رشته‌ها برایه اینگونه کارها اشتباه است.
ایده درسته ولی اشتباه پیاده شده، ولی متاسفانه وجود و دسترسی به Application.OpenForms این روش اشتباه را ترویج میده.
خوب جناب مهندس میشه شما بفرمایین روش درست چجوریه تا ما هم یاد بگیریم.... حتما microsoft به اندازه ی شما بلد نبود که Application.OpenForms رو در دسترس گزاشته .......

اَرژنگ
سه شنبه 07 اردیبهشت 1389, 11:26 صبح
خوب جناب مهندس میشه شما بفرمایین روش درست چجوریه تا ما هم یاد بگیریم.... حتما microsoft به اندازه ی شما بلد نبود که Application.OpenForms رو در دسترس گزاشته .......

۱.استاده مهندس، شاگرد من حساب میشه.
۲.اگر یک چیزی همینطوری باز و در دست است دلیل نیست که به این شکل سو استفاده بشه.
۳.برایه تمرین و اینکه درست نبودن این روش را یاد بگیرید، Form2 را نامش را تغییر بدید، اشکالاتی را که بوجود میاد را توضیح بدید.

exlord
سه شنبه 07 اردیبهشت 1389, 11:32 صبح
۱.استاده مهندس، شاگرد من حساب میشه.
۲.اگر یک چیزی همینطوری باز و در دست است دلیل نیست که به این شکل سو استفاده بشه.
۳.برایه تمرین و اینکه درست نبودن این روش را یاد بگیرید، Form2 را نامش را تغییر بدید، اشکالاتی را که بوجود میاد را توضیح بدید.
اگه یه چیزی باز و در دسترسه حتما دلیلی داره این دلیلش چیه؟ و چرا Application.OpenForms چیزه بدیه ؟؟؟
مگه نه اینکه اسم یه فرم Identifier هستش براش ....خوب تابلو هست که اگه Identifier یه چیز رو عوض کنی دیگه با همون اسم قبلی نمیشه شناختش .........
در ضمن اسم فرم تو یه برنامه چرا باید تغییر کنه؟؟؟؟؟؟؟؟؟
شما بفرمایین روش درست چجوریه تا ما هم یاد بگیریم

Marzieh_A
سه شنبه 07 اردیبهشت 1389, 11:54 صبح
۱.استاده مهندس، شاگرد من حساب میشه.
۲.اگر یک چیزی همینطوری باز و در دست است دلیل نیست که به این شکل سو استفاده بشه.
۳.برایه تمرین و اینکه درست نبودن این روش را یاد بگیرید، Form2 را نامش را تغییر بدید، اشکالاتی را که بوجود میاد را توضیح بدید.

خوب اینکه دلیل نمیشه دوست من.
شما اگر همینجوری رو هوا اسم یه textbox یا یه کنترل دیگه رو داخل برنامه تغییر بدی ولی تو قسمتهایی که از این کنترل استفاده کردی اسمشو تغییر ندی، برنامه error میده که کنترل مورد نظر وجود نداره ... پس دیگه از textbox یا کنترلهای دیگه هم استفاده نکنیم؟!

اَرژنگ
سه شنبه 07 اردیبهشت 1389, 12:06 عصر
شما بفرمایین روش درست چجوریه تا ما هم یاد بگیریم
اگر مفهومی در برنامه اهمیت دارد باید حداقل یک کلاس برایه مدیریتش وجود داشته باشد. در این حالت مفهومی که اهمیت دارد باز و بسته بودن فرمها هست. این مفهوم حداقل ۲ نوع درخواست وجودیت را بروز میده:
۱. اشیا (فرمهایی) که فقط میتوانند در هر زمانی فقط یک بار وجود داشته باشند. مانند فرمهایه تنظیم خصوصیات برنامه. اینها را معمولاً با ShowModal یکباری میکنند ولی ShowModal یکروشی است که جنبه جانبی Singleton را بازسازی میکنه. و در حقیقت استفاده از Singleton روش اصلی پیاده کردن این گونه اشیا(فرمهاست).
۲. کنترل کردن و آگاهی داشتن بر یکسری از انواع (نه اشیا)، مانند اینکه یک نوع فرم وجودی دارد یا نه، در این روش از پترن مخلوط Factory/Singleton استفاده میشه ، و مدیریت ساخت تمام انواعی که مورد نظر هستند در اونجا انجام میگیره، به این شکل دیگر در هر جایه برنامه‌ای که مفهوم وجود یک شی از یک کلاس مهم است اهمیت دارد، فقط از یک نقطه مرکزی اداره میشه. به این شکل وجود این مفهوم صراحتا در برنامه اعلان و پیاده میشه. انواعی که در برنامه اهمیت دارند از یک نقته مرکزی اداره میشند . به این شکل میشه مدیریت ساختن اشیا از نوعهایه بخصوص را به هر شکل بیشتری جدا از بقیه برنامه مدیریت و گسترش داد.
استفاده از رشته‌ها در زمانی که روشهایه تایپ سیف وجود دارند درست نیست.

اَرژنگ
سه شنبه 07 اردیبهشت 1389, 12:09 عصر
خوب اینکه دلیل نمیشه دوست من.
شما اگر همینجوری رو هوا اسم یه textbox یا یه کنترل دیگه رو داخل برنامه تغییر بدی ولی تو قسمتهایی که از این کنترل استفاده کردی اسمشو تغییر ندی، برنامه error میده که کنترل مورد نظر وجود نداره ... پس دیگه از textbox یا کنترلهای دیگه هم استفاده نکنیم؟!
برنامه ارور میده با برنامه کمپایل نمیشه فرق دارند. در حالتی که تکست باکس اسمش عوض بشه برنامه اصلان کمپایل نمیشه، در حالتی که از رشته‌ها استفاده میشه ارور تا زمان اجرا به تاخیر میافته. به مفاهم Type Safety یک نگاه بندازید.

exlord
سه شنبه 07 اردیبهشت 1389, 13:47 عصر
اگر مفهومی در برنامه اهمیت دارد باید حداقل یک کلاس برایه مدیریتش وجود داشته باشد. در این حالت مفهومی که اهمیت دارد باز و بسته بودن فرمها هست. این مفهوم حداقل ۲ نوع درخواست وجودیت را بروز میده:
۱. اشیا (فرمهایی) که فقط میتوانند در هر زمانی فقط یک بار وجود داشته باشند. مانند فرمهایه تنظیم خصوصیات برنامه. اینها را معمولاً با ShowModal یکباری میکنند ولی ShowModal یکروشی است که جنبه جانبی Singleton را بازسازی میکنه. و در حقیقت استفاده از Singleton روش اصلی پیاده کردن این گونه اشیا(فرمهاست).
۲. کنترل کردن و آگاهی داشتن بر یکسری از انواع (نه اشیا)، مانند اینکه یک نوع فرم وجودی دارد یا نه، در این روش از پترن مخلوط Factory/Singleton استفاده میشه ، و مدیریت ساخت تمام انواعی که مورد نظر هستند در اونجا انجام میگیره، به این شکل دیگر در هر جایه برنامه‌ای که مفهوم وجود یک شی از یک کلاس مهم است اهمیت دارد، فقط از یک نقطه مرکزی اداره میشه. به این شکل وجود این مفهوم صراحتا در برنامه اعلان و پیاده میشه. انواعی که در برنامه اهمیت دارند از یک نقته مرکزی اداره میشند . به این شکل میشه مدیریت ساختن اشیا از نوعهایه بخصوص را به هر شکل بیشتری جدا از بقیه برنامه مدیریت و گسترش داد.
استفاده از رشته‌ها در زمانی که روشهایه تایپ سیف وجود دارند درست نیست.
خوب حالا برا ماها که بلد نیستسم این رو تو کد پیاده سازی کنین تا ما هم یاد بگیریم ...

اَرژنگ
چهارشنبه 08 اردیبهشت 1389, 03:33 صبح
خوب حالا برا ماها که بلد نیستسم این رو تو کد پیاده سازی کنین تا ما هم یاد بگیریم ...
کد چی را بفرستم؟
اگر یکی بخواهد با اصلوب و معایرتهایه درست پیش بره اینهایی که گفته شد روشی است که کد بنابرشان نوشته میشه. زمان ما گوگل وجود نداشت اینها را باید از کتابها پیدا میکردیم. لاقل یک پژوهشی ، جستجویی تلاشی باید انجام بشه که به راهنمائی ادامه داده بشه.

exlord
چهارشنبه 08 اردیبهشت 1389, 08:59 صبح
کد چی را بفرستم؟
اگر یکی بخواهد با اصلوب و معایرتهایه درست پیش بره اینهایی که گفته شد روشی است که کد بنابرشان نوشته میشه. زمان ما گوگل وجود نداشت اینها را باید از کتابها پیدا میکردیم. لاقل یک پژوهشی ، جستجویی تلاشی باید انجام بشه که به راهنمائی ادامه داده بشه.
خوب یه دفعه بگو بلد نیستم دیگه این که اینهمه ادا دادن نداره ....

exlord
چهارشنبه 08 اردیبهشت 1389, 09:22 صبح
این روش اصلاً توصیه نمیشه، استفاده از رشته‌ها برایه اینگونه کارها اشتباه است.
ایده درسته ولی اشتباه پیاده شده، ولی متاسفانه وجود و دسترسی به Application.OpenForms این روش اشتباه را ترویج میده.
حالا اینجوری بنویسیم باب میل حضرت عالی هستش ؟؟؟

Form2 frm2 = (Application.OpenForms[typeof(Form2).Name] as Form2);

اَرژنگ
چهارشنبه 08 اردیبهشت 1389, 10:36 صبح
خوب یه دفعه بگو بلد نیستم دیگه این که اینهمه ادا دادن نداره ....

بله درست میگید، من بلد نیستیم که به کسی که نخواهد در برنامه‌نویسی پیشرفت کند کمک کنم.


حالا اینجوری بنویسیم باب میل حضرت عالی هستش ؟؟؟

Form2 frm2 = (Application.OpenForms[typeof(Form2).Name] as Form2);

مثل اینکه متوجه نیستید، باب میل من ، حسن ، شتره مهم نیست. این کد نصبت به کد قبلی چندتا مزیت دارد،اولیش بهبود تایپ سیفتی، دومیش زمانی که نام فرم را دویژوال استودیو عوض میکنید به شکل اتوماتیک این کد را به نام جدید برایتان عوض میکند.
حالا در این مثال فقط با یک فرم کار میکنیم ولی قابلیت مدیریت ۱۰۰۰ فرم با این روش نصبت به روشی که از رشته‌ها استفاده میکرد مشخص است.
روش قبلی برایه کارهایی اسباب‌بازی هیچ بد نیست ولی این یکی روش بر بنایه محکمی استوار است.

در ضمن قبل از اینکه به کد دیگران یک سوزن بزنم به کد خودم ۱۰۰ تا جوال‌دوز زدم، بیکار نیستم که اشکال بگیرم.
حالا خودتان بگید از اینکه یکمی فکر کردید و روش بهتر رو خودتان پیدا کردید کیف نکردید؟ اگر همینطوری یکذره یکذره ادامه بدید چی میتونه جلویه پیشرفتتان را بگیره؟
در ضمن، این روش را خودتان پیدا کردید نه من:چشمک:

اَرژنگ
چهارشنبه 15 اردیبهشت 1389, 07:33 صبح
Form2 frm2 = (Application.OpenForms[typeof(Form2).Name] as Form2);

ادامه بهره بردن از این سبک کد نویسی در این لینک :

http://barnamenevis.org/forum/showpost.php?p=971588&postcount=2

قدرتیه که تایپ سفتی در اختیارتان میزاره.

relax_cp
شنبه 03 مهر 1389, 16:26 عصر
حالا یک سوال از اساتید
اگه هم زمان چند تا فرم از روی فرم خاصی باز باشه، می خوام بدونم در لحظه ای که مثلا کلید cmd1 رو می زنم چند تا فرم از نوع Form2 باز هست. باید چکار کنم.
بذار اینطوری بگم. من یک برنامه دارم که می تونه چند تا فرم از یک فرم رو همزمان در صفحه داشته باشن. البته این فرمها همگی در صفحه اصلی بصورت فرزند باز میشن، حالا می خوام بدونم چطور میشه فهمید که من چندتا فرم از یک فرم خاص همین الان در صفحه ( در فرم والد) بصورت باز شده دارم.
برای من تعداد فرمها مهم هست و مختصات قرار گرفتن اونها در صفحه والدشان.( top,left) همین دو مختصات.