PDA

View Full Version : سؤال در مورد فرم ها



mahmood3d
چهارشنبه 09 بهمن 1387, 18:08 عصر
سلام
من توی پروژه م اولین فرمی که دارم فرم لاگینه که یوزر و پسورد کاربر رو میگیره و وارد فرم اصلی برنامه (که به صورت MDI Parent است) می شه . در برنامه، من اول یه آبجکت از نوع فرم اصلی درست کردم و به وسیله اون فرم اصلی رو نشون دادم و می خوام بعد از نشون دادن فرم اصلی فرم لاگین بسته بشه . برای همین برای فرم لاگین هم یه آبجکت درست کردم ولی نتونستم فرم لاگین رو ببندم . برای بستن فرم از متدهای زیر استفاده کردم که هیچکدوم جواب نداد :
objLogin.Close();
objLodin.Dispose();
objLogin.Hide();
objLogin.Visible=false;

مشکل بعدی هم اینه که می خوام بقیه فرم هایی که باز می شه داخل فرم اصلی باشه (MDI Childe) ولی نمی دونم چطوری این کار رو بکنم ؟

از دوستان خواهش می کنم هر چه سریعتر جواب بدن چون من این پروژه رو باید تا یکشنبه تحویل بدم اما هنوز تو اولین فرمش موندم .
این هم آی دی یاهو منه اگه لطف کنین ادش کنین تا هروقت که شما آن بودین من سؤالامو سریعتر بپرسم . ممنون .:قلب:
Yahoo ID = mahmoodkhoeini

farzin.fz
چهارشنبه 09 بهمن 1387, 19:29 عصر
البته این مسئله چندین راه حل دارد اما اگر بخواهیم با Thread فعلی آن را برطرف نمائیم شما باید وقتی در فرم لاگین یک نمونه از فرم اصلی برنامه می سازید یک آبجکت از جنس فرم لاگین فعلی به آن پاس بدهید تا از توی فرم اصلی که MDI است فرم لاگین را HIDE کنید .

farzin.fz
چهارشنبه 09 بهمن 1387, 19:34 عصر
و اما در مورد سوال دوم مثال زیر که باید در فرم MDI اصلی پیاده سازی شود مشکل را برطرف می نماید :



Form frm = new Form();
frm.MdiParent = this;
frm.Show();



در واقع این خط از کد فرم والد را مشخص می نماید :



frm.MdiParent = this;

mahmood3d
چهارشنبه 09 بهمن 1387, 19:41 عصر
در مورد مشکل اول هنگام باز کردن فرم اصلی، در فرم لاگین این کد رو نوشتم مشکل حل شد :
this.Hide();
و بعد از وارد شدن به فرم اصلی برای اینکه فرم رو بستم برنامه هم بسته بشه توی frmMain_formClosed دستور Application.Exite(); رو نوشتم . مشکل اول که حل شد .

اما در مورد دومی با این کدی که شما نوشتین اگر در فرم لود اینو بنویسم ، چون من توی برنامه بیشتر از 30 تا فرم دارم تمامی فرم ها باز خواهد شد ولی من می خوام هر وقت که خواستم فرم مورد نظر رو باز کنم .
اگه لطف کنین یاهو آی دی خودتون رو بزارین به صورت مفصل مشکلمو براتون شرح می دم .

farzin.fz
چهارشنبه 09 بهمن 1387, 19:47 عصر
شما مجبور نیستید این کد را در فرم لود بنویسید و مسلما هر جا که نیاز است آن را می نویسید و در نتیجه همه فرم ها در ابتدای برنامه باز نمی شوند .

mahmood3d
چهارشنبه 09 بهمن 1387, 20:11 عصر
دستتون درد نکنه مشکلم حل شد .
حالا من می خوام یه عبارتی رو توی یک متغیر ذخیره کنم و بتونم همه جای برنامه از اون استفاده کنم . من این کارو توی ویژوال بیسیک با استفاده از ماژول انجام می دادم . توی C# متغیرمو باید کجا تعریف کنم ؟
البته به غیر از متغیر چندتا تابع دیگه هم همین طور می خواد استفاده بشه از جمله تابع تبدیل تاریخ میلادی به شمسی . در ضمن اگه شما کلاسی برای تبدیل تاریخ ها (شمسی به میلادی و میلادی به شمسی) داشته باشین ممنون می شم به من هم بدین .

farzin.fz
چهارشنبه 09 بهمن 1387, 20:58 عصر
اگر فرض کنیم تمامی اسمبلی های برنامه شما در یک Application Domain اجرا می شوند می توانیم از کد زیر استفاده کنیم .

برای ذخیره :


AppDomain.CurrentDomain.SetData("Name", "Value");



برای بازیابی :


AppDomain.CurrentDomain.GetData("Name");


البته روش های دیگری هم هست و اگر چندین Application Domain داشته باشیم باید این کد را کمی تغییر دهیم .

mahmood3d
چهارشنبه 09 بهمن 1387, 21:43 عصر
ببخشید من تازه شروع کردم که C# یاد بگیرم و قبل از این با وی بی 6 کار می کردم اگه میشه کمی بیشتر توضیح بدین .
:خجالت: منظورتون از Application Domain و اسمبلی چیه ؟

farzin.fz
پنج شنبه 10 بهمن 1387, 00:23 صبح
نگران نباشید چون در حالت عادی همه Assembly ها در یک AppDomain اجرا می شوند
پس از کد فوق می توانید استفاده کنید .

mahmood3d
پنج شنبه 10 بهمن 1387, 08:38 صبح
اگه من بخوام یک تابع طولانی (که حدود 50 خط برنامه است) رو تو سرتاسر برنامه اجرا کنم باید چکار کنم ؟

h.jaza
پنج شنبه 10 بهمن 1387, 11:17 صبح
از اول توضیح می دم:

من توی پروژه م اولین فرمی که دارم فرم لاگینه که یوزر و پسورد کاربر رو میگیره و وارد فرم اصلی برنامه (که به صورت MDI Parent است) می شهاگر منظورت اینه که فرم اصلی پروژه، همین فرم لاگین هست، باید بگم که کاملا کارتون اشتباهه، چرا که فرم اصلی، فرمی هست که بیشترین بقا در طول برنامه رو داره لذا باید از فرم لاگین به فرم اصلی برنامه که MDI هست، تغییر بکنه. با این تغییر، دیگه به سادگی می تونید فرم لاگین رو با همون دستور ;()this.close ببندید چرا که دیگه فرم اصلی پروژه نیست که با بسته شدنش باعث خاتمه ی کلی برنامه بشه.
(میشه گفت فرم اصلی همون فرمی هست که در کلاس program توسط متد Run فراخوانی می شه)

در مورد مشکل اول هنگام باز کردن فرم اصلی، در فرم لاگین این کد رو نوشتم مشکل حل شد :
this.Hide();
صورت مسئله رو هیچ وقت حذف نکن. (توضیحات بالا)

حالا من می خوام یه عبارتی رو توی یک متغیر ذخیره کنم و بتونم همه جای برنامه از اون استفاده کنم . من این کارو توی ویژوال بیسیک با استفاده از ماژول انجام می دادم . توی C# متغیرمو باید کجا تعریف کنم ؟
این طرح مسئله بیانگر سطح پایین اطلاعات شما در زبان سی شارپ هست، لذا پیشنهاد می کنم برید و کمی مطالعه کنید، لکن برای این کار راه های متفاوتی هست از جمله روش نه چندان مورد علاقه ی static تعریف کردن متغیر و یا راه بهتر که همون فرستادن متغیر به کلاس و متد مورد نظر هست.

البته به غیر از متغیر چندتا تابع دیگه هم همین طور می خواد استفاده بشه از جمله تابع تبدیل تاریخ میلادی به شمسی . در ضمن اگه شما کلاسی برای تبدیل تاریخ ها (شمسی به میلادی و میلادی به شمسی) داشته باشین ممنون می شم به من هم بدین .
کلا راجع به همه ی جنبه های مسئلتون و همین تگ بالا زیاد بحث شده و به همین خاطر من هم مجمل گفتم تا برای اطلاعات کامل، اولا مطالعه و بعد سرچ.

mahmood3d
پنج شنبه 10 بهمن 1387, 11:27 صبح
فرم اصلی، فرمی هست که بیشترین بقا در طول برنامه رو داره لذا باید از فرم لاگین به فرم اصلی برنامه که MDI هست، تغییر بکنه. با این تغییر، دیگه به سادگی می تونید فرم لاگین رو با همون دستور ;()this.close ببندید چرا که دیگه فرم اصلی پروژه نیست که با بسته شدنش باعث خاتمه ی کلی برنامه بشه.

اگه اولین فرم فرم MDI باشه اونوقت قبل از فرم لاگین باز میشه و من می خوام بعد از گرفتن یوزر و پسورد کاربر وارد برنامه بشه .



پیشنهاد می کنم برید و کمی مطالعه کنید

الان بیشتر از 2 هفته است که دارم از جزوه آقای هاشمیان مطالعه می کنم و دستورات پایه ای اون رو مطالعه کردم و زمان تحویل پروژه من 3 روز دیگه است ولی باز بیشتر مباحث مربوط به C# مونده و باید سریعا مشکلاتم برطرف بشه به همین دلیل مزاحم تون شدم و این تاپیک رو درست کردم .

h.jaza
پنج شنبه 10 بهمن 1387, 11:42 صبح
اگه اولین فرم فرم MDI باشه اونوقت قبل از فرم لاگین باز میشه و من می خوام بعد از گرفتن یوزر و پسورد کاربر وارد برنامه بشه .
برای این مسئله دو راه حل وجود داره:
1. با همون روشی که گفتم عمل کنید و حال اینجا اگر فرم اصلی Hide بشه، اصلی رو زیر پا نمی گذاره و مشکلی نداره و ادامه ی کار به همون شکلی که می خواید.
2. روش دوم که شاید بهتر هم باشه، اینه که در همون کلاس program یه switch ... case برای فرم هاتون درست کنید و متناسب با زمان، اونی رو که می خواین نمایش بدین. (برای توضیحات بیشتر سرچ کنین چون قبلا بحث شده)

الان بیشتر از 2 هفته است که دارم از جزوه آقای هاشمیان مطالعه می کنم و دستورات پایه ای اون رو مطالعه کردم و زمان تحویل پروژه من 3 روز دیگه است ولی باز بیشتر مباحث مربوط به C# مونده و باید سریعا مشکلاتم برطرف بشه به همین دلیل مزاحم تون شدم و این تاپیک رو درست کردم .
من فکر کنم تا الان حدود 2 سالی باشه که دارم سی شارپ می خونم و هنوز که هنوزه خیلی مباحث رو اصلا شروع به یادگیریشون نکردم به خاطر تفصیلی که بقیه داشتن و تازه اول کارم و ...

farzin.fz
پنج شنبه 10 بهمن 1387, 11:47 صبح
در این صورت می توانید یک فابل از نوع کلاس به برنامه خود اضافه کرده و در صورت لزوم تابع خود را به صورت داینامیک یا استاتیک تعریف نمایید و التبه راه های دیگری هم هست که بستگی به سناریوی شما دارد .

mahmood3d
جمعه 11 بهمن 1387, 13:22 عصر
با سلام خدمت دوستان
ببخشید دوباره مزاحم شدم . کدی که در پست های قبلی نوشتین رو من توی برنامه م نوشتم و مشکلم حل شد و سؤالی که الان دارم اینه که مثلا وقتی روی Button1 کلیک می کنم Form1 رو که باز کرد و دوباره روی همون Button1 کلیک کردم دوباره Form1 رو باز نکنه (چون قبلا باز شده ) ولی هر وقت که روی Button1 کلیک می کنم به تعداد کلیک ها Form1 رو باز می کنه .

h.jaza
جمعه 11 بهمن 1387, 17:18 عصر
جای متد Show از متد ShowDialog استفاده کنید.

mahmood3d
جمعه 11 بهمن 1387, 18:15 عصر
فرم اصلی برنامه من به صورت MDI است . اگر از ShowDialog استفاده کنم دیگه نمی تونم فرم دیگه ای رو باز کنم .

h.jaza
جمعه 11 بهمن 1387, 18:48 عصر
خوب، من یادم رفته بود که فرم شما به صورت MDI هستش.

حالا، کاری که باید انجام داد، بازم به سادگی انجام خواهد پذیرفت: :لبخند:

کافیه در رویداد کلیک فرم مورد نظر چک کنید که آیا نمونه ای از فرم در برنامه به صورت اکتیو وجود دارد یا نه؛ با این کار، اگر جواب این چک، true باشه دیگه نمی ذاره تا نمونه ای ازش ساخته بشه.

(خواهش می کنم قبل از اینکه بدون انجام حتی یک تست، همین جوری پست بزنید که: خوب، حالا چطوری این کار و انجام بدم؟ یکم با برنامه ور برید و کمی در این راستا وقت بگذارید. منظورم خاص شما نیست، کلیه و دلیل بیان بسیاری از جواب ها به این صورت (عدم ارائه ی کد)، نیز صرفا همین امر است.)

mahmood3d
جمعه 11 بهمن 1387, 19:07 عصر
دوست عزیز چون پروژه من عجله ایه قبل از پرسیدن سؤال سعی خودم رو می کنم که جواب رو اول خودم پیدا کنم . خصوصیاتی که به ذهنم می رسید چک کردم ولی نفهمیدم که وقتی فرم فعاله کدوم خصوصیتش True میشه اگه میشه راهنمایی کنید .

Amir Oveisi
شنبه 12 بهمن 1387, 00:03 صبح
یه روش خیلی ساده که اگه فکر میکردین حتما به ذهنتون میرسید:

تو کلاس فرمتون:

bool shoudOpen = true;

تو ایونت کلیک :

if(shouldOpen)
{
yourForm.Shoe();
shoudOpen = false;
}

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

موفق باشید
jooje

hasan_esfahan
شنبه 12 بهمن 1387, 01:33 صبح
برای این که یک متغیر را در تمام فرم ها استفاده کنید می توانید در قسمت public مثلا فرم اول متغیری از نوع static و در هر فرم از آن استفاده کنید





public partial class Form1 : Form
{
public static string mynameis;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mynameis=textBox1.Text;
}




و سپس در فرم مورد نظر استفاده کنی مثلا



private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text=form1.mynameis;
}

mahmood3d
شنبه 12 بهمن 1387, 12:03 عصر
یه روش خیلی ساده که اگه فکر میکردین حتما به ذهنتون میرسید:دوست عزیز اینو خودم هم خواستم انجام بدم ولی اگه دقت کرده باشین من گفتم که پروژه من حد اقل 50 تا فرم داره و اگه قرار باشه برای هر کدوم از اونها یک متغیر درست کنم ... .
من برای این کار خواستم از خصوصیت IsAccessible فرم مورد نظر استفاده کنم که اگه فرم فعال بود یعنی قبلا لود شده و دوباره لود نشه و اگه فعال نبود فرم رو باز کنه که جواب نداد . حتی از دیگر خصوصیات مثل IsDespose یا خود Despose استفاده کردم ولی نتیجه ای نگرفتم .

h.jaza
شنبه 12 بهمن 1387, 22:14 عصر
دوست عزیز اینو خودم هم خواستم انجام بدم ولی اگه دقت کرده باشین من گفتم که پروژه من حد اقل 50 تا فرم داره و اگه قرار باشه برای هر کدوم از اونها یک متغیر درست کنم ... .
دوست عزیز، همون کد برمودا جان رو به سادگی با کمی تغییر (یعنی فرستادن فرم مورد نظر به رویداد) و ست کردن این ایونت برای باقی فرم ها (به شکلی که در پست قبلی خودم گفتم)، می تونی به حالتی که می خوای، تبدیل کنی.

Amir Oveisi
یک شنبه 13 بهمن 1387, 16:58 عصر
میتونین یه همچین متدی بنویسید و ازش استفاده کنید:


bool IsFormOpen(string formName)
{
var enumrator = Application.OpenForms.GetEnumerator();
while (enumrator.MoveNext())
{
if ((enumrator.Current as Form).Name == formName)
return true;
}
return false;
}

موفق باشید
jooje

mahmood3d
دوشنبه 14 بهمن 1387, 10:55 صبح
دوباره سلام
بالاخره تونستم مشکل رو حل کنم . گفتم اینجا هم بزارم تا دوستانی که مشکل منو داشتن مشکلشون حل شه . من اول اومدم توی کلاس فرم یک آبجکت مثلا objSetting از نوع فرمی که می خوام بازش کنم ساختم و توی رویداد کلیک دکمه مربوط به اون فرم نوشتم :


if (!objUser.IsAccessible)
{
if (objUser.IsDisposed)
objUser = new frmUser();
objUser.MdiParent = this;
objUser.Show();
}

mahmood3d
دوشنبه 14 بهمن 1387, 12:57 عصر
یه سؤال دیگه که توی سایت گشتم و پیدا نکردم
من توی رویداد یکی از دکمه ها یک شرط دارم و می خوام اگر نتیجه شرط غلط بود ادامه دستورات اجرا نشه . در ضمن دستورات رو هم نمی خوام داخل if بنویسم . مثلا برای این کار توی وی بی از Exit Sub استفاده می کردم . دستور معادل این توی C# چیه ؟

h.jaza
جمعه 02 اسفند 1387, 00:02 صبح
... یک شرط دارم ...
و

دستورات رو هم نمی خوام داخل if بنویسم
این دو تا که با هم تناقض دارن؛ شما چجوری یه شرط داری که بعدش نمی خوای داخل دستور if بنویسیشون؟؟؟ :متفکر:

اگر داخل حلقه هستین، که با دستور Break ازش میاین بیرون، در غیر اینصورت چجوری شرط رو چک می کنید؟؟؟ :متفکر: