PDA

View Full Version : سوال: Show() یا ShowDialog() سوال این است! و سوالات کوچک دیگر



ostovarit
سه شنبه 05 مرداد 1389, 20:06 عصر
با سلام خدمت دوستان

من در نرم افزار در صفحه اصلی یک panel دارم برای باز کردن دیگر فرمها به شکل زیر عمل میکنم:



AForm2 af2 = new AForm2();
af2.Show(panel2);
1- اگر از ShowDialog استفاده کنم نمیتوانم هم زمان چند فرم را باز کنم و تا زمانی که فرم بسته نشده است به صفحه اصلی دسترسی ندارم آیا برای این موضوع راه حلی وجود دارد که از این متد استفاده شود ولی چند فرم باز شود؟

2- در روشی که من استفاده کردم برای جلوگیری از باز شدن فرمهایی که در حال حاضر باز هستند چه کدی باید نوشت؟ و کجا؟

3- برای جلوگیری از بسته شدن فرم اصلی در صورتی که فرم دیگری درون آن باز باشد ( با توجه به روشی که استفاده کردم) چه کدی باید نوشت؟

jalalx
سه شنبه 05 مرداد 1389, 20:17 عصر
1- ShowDialog تا زمانی که پاسخش را از کاربر نگیرد اجازه دسترسی به فرم اصلی را نمی دهد.

2- در فرم اصلی یک متغیر تعریف کنید و هر بار فرمی باز شد به آن مقداری بدهید. در صورتی که فرم دیگری فراخوانی شد مقدار این متغیر برسی شده و اجازه ی باز شدن یا نشدن داده شود.

3- باز هم برسی همان متغیر مذکور

mehdi5106
سه شنبه 05 مرداد 1389, 21:42 عصر
قبلا تو همین بخش بحث شده...
باید یک نمونه از فرم ایجاد کنید و پس از بستن اونو dispose کنید و زمانی که فرم باز شده اجازه باز شدن به فرم مشابه را ندهد و فرم جاری را Activate نماید.

تو سایت بگرد .فکر کنم سورسش هم باشد.

ACorvinus
سه شنبه 05 مرداد 1389, 21:48 عصر
سلام.

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

خب حالا در MainForm یه List تعریف می کنین که نام فرم هاتونو بعد از باز کردن فرم های فرزند در اون ADD کنین. و قبل از باز شدن فرم چک می کنین که نام فرمی که میخواین باز کنین در GenericList هست یا نه؟!!!

حالا وقتی میخواین MainForm ببندین خیلی راحت می گین که اگه تعداد آیتم های لیست 0 باشه فارم رو ببنده.

متغیر عددی دیگه چیه؟!!!!

ricky22
سه شنبه 05 مرداد 1389, 22:10 عصر
یک راه استفاده از 2 Thread همزمان هست. می تونی 2 تا دیالوگ باز کنی اما منطق دیالوگ بودن از بین میره

jalalx
سه شنبه 05 مرداد 1389, 22:54 عصر
یک راه استفاده از 2 Thread همزمان هست. می تونی 2 تا دیالوگ باز کنی اما منطق دیالوگ بودن از بین میره

مایکروسافت به شدت از کاربران خود می خواهد تا جایی که ممکن است از برنامه نویسی چند نخی استفاده نکنند. این روش فقط در موارد خاص و آن هم به دلیل ناچاری است. استفاده از برنامه نویسی چند نخی برای حل این مسئله مثل کشتن یگ مگس به کمک بمب اتمی است!!!

ostovarit
سه شنبه 05 مرداد 1389, 23:15 عصر
قبلا تو همین بخش بحث شده...
باید یک نمونه از فرم ایجاد کنید و پس از بستن اونو dispose کنید و زمانی که فرم باز شده اجازه باز شدن به فرم مشابه را ندهد و فرم جاری را Activate نماید.

تو سایت بگرد .فکر کنم سورسش هم باشد.

من نیافتم اگر شما پیدا کردی ممنونت میشم لینکشو بزاری

ricky22
سه شنبه 05 مرداد 1389, 23:42 عصر
مایکروسافت به شدت از کاربران خود می خواهد تا جایی که ممکن است از برنامه نویسی چند نخی استفاده نکنند. این روش فقط در موارد خاص و آن هم به دلیل ناچاری است. استفاده از برنامه نویسی چند نخی برای حل این مسئله مثل کشتن یگ مگس به کمک بمب اتمی است!!!
لطفا یک لینک از این توصیه ماکروسافت رو بفرمایید

ostovarit
چهارشنبه 06 مرداد 1389, 00:50 صبح
مشکل من حل شد و به یک مشکل جدید بر خوردم صفحه هات فقط یک بار باز میشوند توسط کدی که نوشتم ولی اگر باز باشند و کاربر تقاضای دوباره باز شدن صفحه رو بده صفحه جاری اکتیو نمیشود ... یعنی اگر زیر فرم دیگری باز باشد رو نمی آید...

چه کنم؟


AForm1 af1 = new AForm1();
bool open = true;
for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name == "AForm1")
{
open = false;
}
}
if (open)
{
af1.Show(panel2);
}
else
{
af1.Activate();
}

ACorvinus
چهارشنبه 06 مرداد 1389, 04:33 صبح
مشکل من حل شد و به یک مشکل جدید بر خوردم صفحه هات فقط یک بار باز میشوند توسط کدی که نوشتم ولی اگر باز باشند و کاربر تقاضای دوباره باز شدن صفحه رو بده صفحه جاری اکتیو نمیشود ... یعنی اگر زیر فرم دیگری باز باشد رو نمی آید...

چه کنم؟


AForm1 af1 = new AForm1();
bool open = true;
for (int i = 0; i < Application.OpenForms.Count; i++)
{
if (Application.OpenForms[i].Name == "AForm1")
{
open = false;
}
}
if (open)
{
af1.Show(panel2);
}
else
{
af1.Activate();
}


سلام.

شما میتونین اینجوری عمل کنین:

List<string> l = new List<string>();

if (!(l.Contains(FormName)))
{
//مراحل باز کردن فرم
}
else { /*فرم قبلا باز شده است */ }

حالا یه چیز دیگه. استفاده از پنل برای باز کردن فرم ها دیگه قدیمی شده و همچنین شما چندین فرم رو در یه پنل باز می کنین و این کار درستی نیست مگر اینکه فرم های قبلیتونو در یه Stack ذخیره کنین تا با بستن هر فرم آخرین فرم موجود در Stack رو pop کنین و بیخیال.

بیاین مثل Enternet Explorer از TabControl استفاده کنین و با هر بار باز کردن یه فرم جدید به صورت دینامیک یه Tab به TabControl اضافه کرده و فرمتون رو در Panel اون Tab اضافه کنین.

اینجوری کاربر به تمام فرم هایی که باز کرده دسترسی داره و حال می کنه با برنامتون!!!

برای افزودن تب به صورت دینامیک به TabControl ابتدا یه TabControl به فرم افزوده و مراحل کار را در InitializeComponent بررسی کنید و ببینید خود برنامه چه کدهایی رو مینویسه که یه Tab به TabControl افزوده میشه.

اگه واقعا مشکلی بود بگو سعی می کنم وقت پیدا کنم و برات یه Sample تهیه کنم.

موفق باشی.

ostovarit
چهارشنبه 06 مرداد 1389, 11:25 صبح
سلام.

اگه واقعا مشکلی بود بگو سعی می کنم وقت پیدا کنم و برات یه Sample تهیه کنم.

موفق باشی.


با تشکر از اینکه وقت گذاشتی ...

من روش شما رو رفتم List رو بلدم ولی برای این روش وقتی فرمها باز میشوند باید اسامی فرمها رو تو لیست ذخیره کنم بعد موقع باز کردن مجدد چک کنم ببینم لیست هست یا نه بعد موقع بستن از لیست جحذف کنم به جای این مراحل کدی که نوشتم فقط قسمت چک کردنش رو داره نه بیشتر ... اینجوری کد کمتری میزنیم.

نرم افزار طراح شده و امکان استفاده از تب الان نیست.

- استفاده از پنل که گفتید قدیمی شده ... چه مشکلی داره؟
- در این روشی که من رفتم چه جوری میشه فرم باز شده رو مجدد Active کرد؟



مگر اینکه فرم های قبلیتونو در یه Stack ذخیره کنین تا با بستن هر فرم آخرین فرم موجود در Stack رو pop کنین و بیخیال.


-این تیکه رو برام بیشتر توضیح بدید و اگر نمونه ای دارید بزارید ممنون میشم؟

ACorvinus
چهارشنبه 06 مرداد 1389, 12:51 عصر
سلام.


- استفاده از پنل که گفتید قدیمی شده ... چه مشکلی داره؟

مشکلی نداره، چون پنجره هایی مثل Internet Explorer مد شده و کاربر راحت تره به همین دلیل گفتم قدیمی شده (نسبت به Internet Explorer) !!!


- در این روشی که من رفتم چه جوری میشه فرم باز شده رو مجدد Active کرد؟

یه نمونه کد براتون میذارم که مشکلتونو حل می کنه. فقط وقتی میخواین فرمی رو باز کنین، از اون Sample گرفته و به این تابع ارسال کنین:

void prcTest(object Form)
{
Form f = (Form)Form;
bool Is = false;
Control Ctl = null;
if (panel1.Controls.Count >= 1)
{
foreach (Control Ctrl in panel1.Controls)
{
if (Ctrl is Form && ((Form)Ctrl).Name == f.Name)
{
Is = true;
Ctl = Ctrl;
break;
}
}
if (Ctl != null)
((Form)Ctl).BringToFront();
}
if (Is == false)
{
f.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
f.Dock = DockStyle.Fill;
f.TopLevel = false;
panel1.Controls.Add(f);
f.BringToFront();
f.Show();
}
}


-این تیکه رو برام بیشتر توضیح بدید و اگر نمونه ای دارید بزارید ممنون میشم؟

ماجراش طولانیه. بذار واس بعد.
اگه مشکلی داشتی بهم بگو. موفق باشی.

jalalx
یک شنبه 12 دی 1389, 22:43 عصر
لطفا یک لینک از این توصیه ماکروسافت رو بفرمایید


Windows Presentation Foundation (WPF) is designed to save developers from the difficulties of threading. As a result, the majority of WPF developers won't have to write an interface that uses more than one thread. Because multithreaded programs are complex and difficult to debug, they should be avoided when single-threaded solutions exist.

Source (http://msdn.microsoft.com/en-us/library/ms741870%28VS.90%29.aspx)