PDA

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



resident
یک شنبه 14 بهمن 1386, 19:11 عصر
سلام
چند سوال در مورد فرمها داشتم:
1.میخوام بعد از ورود اطلاعات کاربر درفرم login وزدن دکمه ورود ، فرم لاگین بسته بشه و فرم اصلی برنامه نشون داده بشه. یه سری از بچه ها گفته بودن فرم لاگین رو باید Hide کرد و یک سری گفته بودند اینکار اشتباهه و باید بسته بشه. بنده هم با نظر دوم موافقم ولی متاسفانه نمی تونم این کار بکنم.کدهای

رو نوشتم ولی حل نشد. کسی می تونه کمکم کنه؟
البته این رو هم بگم که search کردم و 5-6 تاپیک در این مورد پیداکردم اما نمیدونم چرا هیچ کدومشون مشکلم رو حل نکرد.


home frm = newhome();
frm.ShowDialog();
Application.Exit();

2.منظور از فرم فرزند و پدر چیه؟
اصلا چه دلیلی برای تعیین فرمهای فرزند و پدر وجود داره؟ چرا باید اونها رو تعیین کنیم؟ اگه اینکار رو نکنیم مشکلی پیش میاد؟

Himalaya
یک شنبه 14 بهمن 1386, 19:30 عصر
این مثال رو فکر کنم ارژنگ فرستاده بود...برای قسمت اول سوالت حتما به دردت میخوره...
login:login
password:password
در مورد سوال دومت هم همینقدر میدونم که فرم های فرزند فرمهایی هستن که داخل فرم اصلی(فرم پدر)باز میشن...مثلا تو برنامه ulead photo impact که یک برنامه کار با عکسه اگه چندتا عکس باز کنیم ، هر کدوم از اونا داخل یک فرم فرزند باز میشن...

writeshirin
یک شنبه 14 بهمن 1386, 20:43 عصر
فرم MDI) Multiple Document Interface)یا همون فرم پدر فرمیه که در خودش سایر فرمها رو باز می کنه. برای اینکه چنین فرمی داشته باشیم ، باید خاصیت IsMdiContainer فرم رو true کنیم. با true کردن این خاصیت رنگ زمینه فرم تیره میشه .
هر فرم خاصیت دیگه ای داره به نام mdiparent که اگر این خاصیت رو مساوی یه فرم MDI قرار بدیم، فرم ما به عنوان فرزند اون فرم MDI در نظر گرفته میشه. برای اینکه یک فرم رو پدر یکی از فرمها قرار بدیم ، به صورت زیر عمل می کنیم:


form2 f=new form2;
f.mdiparent=this;
f.show();

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

Himalaya
یک شنبه 14 بهمن 1386, 21:12 عصر
اینم یه نمونه دیگه از فرم login که خودم نوشتم...جواب میده...ولی اگه این برنامه ایرادی داره (از نظر نوع برنامه نویسی و این حرفا) دوست دارم بدونم...ممنون...
user name:amir
password:ajorlo

اَرژنگ
دوشنبه 15 بهمن 1386, 02:06 صبح
اینم یه نمونه دیگه از فرم login که خودم نوشتم...جواب میده...ولی اگه این برنامه ایرادی داره (از نظر نوع برنامه نویسی و این حرفا) دوست دارم بدونم...ممنون...
user name:amir
password:ajorlo
از نظر کاری مشکلی ندارد، ولی از نظر طراحی:
کدی که در لگین فرم در باتن کلیک نوشته شده بهتره که در کلاینتی که این فرم را استفاده میکنه باشد.
اگر فکر کنید که وظیفه فرم لگین فقط گرفتن لگین و پسورد هست و نه هیچ کار دیگری.
کلاینتی که از فرم لگین استفاده میکند ازش لگین و پسورد را میگیره و از یک کلاسه امنتیتی درخواست میکند که درست بودن و یا نبودن این لگین و پسورد را چک کند.
به این ترتیب وظایف قسمت بندی شدند و در هرجا کدها مخصوص برایه انجم دادن کار بخصوصی شدند.
در همان مثال اولی که فرستادید از این روش استفاده شده.

Engineer_Yasin
دوشنبه 15 بهمن 1386, 02:42 صبح
سلام
چند سوال در مورد فرمها داشتم:
1.میخوام بعد از ورود اطلاعات کاربر درفرم login وزدن دکمه ورود ، فرم لاگین بسته بشه و فرم اصلی برنامه نشون داده بشه. یه سری از بچه ها گفته بودن فرم لاگین رو باید Hide کرد و یک سری گفته بودند اینکار اشتباهه و باید بسته بشه. بنده هم با نظر دوم موافقم ولی متاسفانه نمی تونم این کار بکنم.کدهای

رو نوشتم ولی حل نشد. کسی می تونه کمکم کنه؟
البته این رو هم بگم که search کردم و 5-6 تاپیک در این مورد پیداکردم اما نمیدونم چرا هیچ کدومشون مشکلم رو حل نکرد.


home frm = newhome();
frm.ShowDialog();
Application.Exit();

2.منظور از فرم فرزند و پدر چیه؟
اصلا چه دلیلی برای تعیین فرمهای فرزند و پدر وجود داره؟ چرا باید اونها رو تعیین کنیم؟ اگه اینکار رو نکنیم مشکلی پیش میاد؟

تا آنجا که من می دونم فرقی بین دستور Hide و Close برای یک فرم وجود نداره!
من واسه از یک فرم به فرم دیگر رفتن کد زیر را می نویسم!


this.Hide()
form2 frm=new form2()
frm.showdialog()
Application.Exit()

خط آخر جز اصلی کد نیست و در واقع با دستور showdialog فرم 2 نمایش داده می شود و از این به بعد کدهای فرم 2 اجرا می شوند تا وقتی شما در کدهای خود فرم 2 را Close نکرده اید (یا ضربدر فرم را نزده اید) به دستور Application.Exit() نمی رسد و این دستور تکمیلی برای این است که بعد از زدن ضربدر فرم 2 فرم یک که در پشت پرده قرار دارد نیز بسته شود و برنامه به طور کامل بست شود!

Engineer_Yasin
دوشنبه 15 بهمن 1386, 02:55 صبح
الان تو یکی از پروژهای درسیم گشتم کد یکی از صفحات که نام کاربری و رمز عبور می گیره و با دیتابیس چک میکنه را می گذارم (البته چون کارهای اولم بود خیلی شلوغه!!) به بزرگواری خودت ببخش!!


private void btnLogin_Click(object sender, EventArgs e)
{

objConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DBProf.mdb");
string strDataAdaptor = "SELECT Sign ,Pass FROM Prof ";
objDataAdapter = new OleDbDataAdapter(strDataAdaptor, objConnection);
objDataSet = new DataSet();
objDataAdapter.Fill(objDataSet, "Prof");
objDataView = new DataView(objDataSet.Tables["Prof"]);
objDataView.Sort = "Sign";
int position = objDataView.Find(txtSign.Text);
if (position != -1)
{
objDataView.Sort = "Pass";
int position2 = objDataView.Find(txtPass.Text);
if (position2 != -1)
{
frmStudent objStu = new frmStudent();
this.Hide();
objStu.ShowDialog(this);
Application.Exit()
}
else
{
MessageBox.Show("مشخصه درس یا رمز عبور اشتباه می باشد!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("مشخصه درس یا رمز عبور اشتباه می باشد!","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

private void btnBack_Click(object sender, EventArgs e)
{
frmMain objMain = new frmMain();
this.Hide();
objMain.ShowDialog(this);
Application.Exit();
}

siavashr
دوشنبه 15 بهمن 1386, 04:11 صبح
دورود
والا من دارم یه مسنجر مینویسم و با این مشکل برخورد کرده بودم.
راهی که به نظر من رسید این بود که فرمها رو 1 dll کنترل کنه یعنی باز و بسته کردن فرمها رو در dll انجام میشه.
نمیدونم این راه بدردت میخوره یا نه اگر توضیح بیشتر خواستی حتما در خدمتم.
با سپاس

اَرژنگ
دوشنبه 15 بهمن 1386, 05:13 صبح
الان تو یکی از پروژهای درسیم گشتم کد یکی از صفحات که نام کاربری و رمز عبور می گیره و با دیتابیس چک میکنه را می گذارم (البته چون کارهای اولم بود خیلی شلوغه!!) به بزرگواری خودت ببخش!!


به جایه طلب بخشش تمیزش کنید، مثالی که در پست #۲ است راه تمیزتر اینکار است.
در ضمن قاطی کردن کد اس.کیو.ال با منطق برنامه در لایه اینترفیس درست نیست.
الان وقتش که Refactor ش کنید.

اَرژنگ
دوشنبه 15 بهمن 1386, 05:16 صبح
دورود
والا من دارم یه مسنجر مینویسم و با این مشکل برخورد کرده بودم.
راهی که به نظر من رسید این بود که فرمها رو 1 dll کنترل کنه یعنی باز و بسته کردن فرمها رو در dll انجام میشه.
نمیدونم این راه بدردت میخوره یا نه اگر توضیح بیشتر خواستی حتما در خدمتم.
با سپاس
اگر یک توضیحات کلی در مورد این روش که با چه پترنی رابطه دارد و یا اینکه منطق کلی برایه این روشتان چی هست را بفرمائید سپاسگزارم.

اَرژنگ
دوشنبه 15 بهمن 1386, 05:26 صبح
تا آنجا که من می دونم فرقی بین دستور Hide و Close برای یک فرم وجود نداره!

Hide
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.hide.aspx

Close
http://msdn2.microsoft.com/en-us/library/system.windows.forms.form.close.aspx

Hide != Close

siavashr
دوشنبه 15 بهمن 1386, 06:13 صبح
اگر یک توضیحات کلی در مورد این روش که با چه پترنی رابطه دارد و یا اینکه منطق کلی برایه این روشتان چی هست را بفرمائید سپاسگزارم.

دورود
والا من دارم یه مسنجر مینویسم. همونطوری که میدونید از 2 بخش کلاینت و سرور تشکیل شده. من فرم اصلی که در واقع همون صفحه login هست رو اجرا میکنم و به سرور وصل میشم بعد از ایدی و پسورد یوزر رو میگیرم و میفرستم سرور سرور جواب مثبت یا منفی که میده بر میگرده و وارد یه dll میشه که من اونجا گفتم مثلا جواب مثبت باعث hide شدن فرم login و show شدن فرم body که همون صفحه اصلی مسنجر هست میشه.
همینطوری برای هر فرم این کار رو کردم .
راستش تقریبا 1 سالی طول کشید تا خودم هم فهمیدم چی به چیه و حالا دیگه مشکلی ندارم راحت فرم رو باز و بسته میکنم با استفاده از dll .
البته نمیدونم این روش من اصلا بدرد کس دیگری میخوره یا نه اما فکر کنم سوال اولیه تقریبا چیزی تو همین مایه ها بود .
با سپاس اگر توضیح دیگری لازم بود در خدمتم.

resident
سه شنبه 16 بهمن 1386, 08:52 صبح
از همه دوستانی که تجربیاتشونو گفتند ممنونم.

آرژنگ جان مجددا نمونه برنامه هاتونو دیدم. ولی متاسفانه هیچ کدی برای بستن فرم ها ندیدیم.اگه امکان داره کدی رو که استفاده می کنید ، اینجا قرار بدید.
متشکرم.

resident
سه شنبه 16 بهمن 1386, 08:56 صبح
فرم MDI) Multiple Document Interface)یا همون فرم پدر فرمیه که در خودش سایر فرمها رو باز می کنه. برای اینکه چنین فرمی داشته باشیم ، باید خاصیت IsMdiContainer فرم رو true کنیم. با true کردن این خاصیت رنگ زمینه فرم تیره میشه .
هر فرم خاصیت دیگه ای داره به نام mdiparent که اگر این خاصیت رو مساوی یه فرم MDI قرار بدیم، فرم ما به عنوان فرزند اون فرم MDI در نظر گرفته میشه. برای اینکه یک فرم رو پدر یکی از فرمها قرار بدیم ، به صورت زیر عمل می کنیم:


form2 f=new form2;
f.mdiparent=this;
f.show();

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

اَرژنگ
سه شنبه 16 بهمن 1386, 10:32 صبح
از همه دوستانی که تجربیاتشونو گفتند ممنونم.

آرژنگ جان مجددا نمونه برنامه هاتونو دیدم. ولی متاسفانه هیچ کدی برای بستن فرم ها ندیدیم.اگه امکان داره کدی رو که استفاده می کنید ، اینجا قرار بدید.
متشکرم.

در پست #۲ این توپیک که karaji333 فرستادند اگر لگین را درست وارد نکنید فرم را میبنده.


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

اَرژنگ
چهارشنبه 24 بهمن 1386, 18:23 عصر
روش بهتر برایه استفاده از فرم لگین:
http://barnamenevis.org/forum/showthread.php?t=94791
را توصیه میکنم.

Engineer_Yasin
شنبه 28 شهریور 1388, 14:41 عصر
Hide
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.hide.aspx

Close
http://msdn2.microsoft.com/en-us/library/system.windows.forms.form.close.aspx

Hide != Close

تشکر بابات راهنمایی

حالا بهتره موقع تعویض فرم از کدام استفاده کنیم؟
فکر کنم اگه فرم دوباره قراره استفاده بشه از hide استفاده کنیم بهتره و اگه دیگه در برنامه نمایش داده نمی شه از close . درسته؟

mahdi_7610
شنبه 28 شهریور 1388, 15:51 عصر
تشکر بابات راهنمایی

حالا بهتره موقع تعویض فرم از کدام استفاده کنیم؟
فکر کنم اگه فرم دوباره قراره استفاده بشه از hide استفاده کنیم بهتره و اگه دیگه در برنامه نمایش داده نمی شه از close . درسته؟

hide و close که با هم فرق دارند .

اگه شما یه فرم را hide کنید معلوم نیست که چه وقت قراره به این فرم رجوع کنید و دوباره اونا show کنید . در این صورت این فرم هنوز در حافظه وجود داره و داره از منابع استفاده می کنه . و این راه درستی نیست .

شما باید با روش درست ( پست 2) یک فرم را به طور کامل از حافظه خارج کنید .