PDA

View Full Version : سوال: مشکل در لاگین



rahmani67
سه شنبه 01 اسفند 1391, 21:34 عصر
با سلام

تو برنامم ابتدا صفحه اصلی باز میشه و در رویداد لود صفحه اصلی فرم لاگین به صورت show dialog باز میشه فقط مشکل اینجاست زمان اجرای برنامه اگر برم تو تسک منیجر فرم لاگین رو ببندم وارد برنامه میشه (عجب لاگین جالبی!) دوستان کسی می دونه چ کار کنم ک این مشکل پیش نیاد ؟

با تشکر

veniz2008
سه شنبه 01 اسفند 1391, 22:28 عصر
با سلام

تو برنامم ابتدا صفحه اصلی باز میشه و در رویداد لود صفحه اصلی فرم لاگین به صورت show dialog باز میشه فقط مشکل اینجاست زمان اجرای برنامه اگر برم تو تسک منیجر فرم لاگین رو ببندم وارد برنامه میشه (عجب لاگین جالبی!) دوستان کسی می دونه چ کار کنم ک این مشکل پیش نیاد ؟

با تشکر
سلام.
اگر غیر از این باشه باید تعجب کرد. جتی اگه کادر دور فرم رو هم برداری بازم با Escap کاربر فرم جاری رو می بنده و به برنامه ورود میکنه. فرم لاگین رو به عنوان فرم پیش فرض (اولین فرمی که اجرا میشه) قرار بدید. اگر کاربر درست یوزر و پسورد رو وارد کرد، فرم لاگین رو مخفی (Hide ) و فرم بعد از لاگین(همون چیزی که در حال حاضر قرار دادید) رو showdialog کنید. فقط در رویداد formclosing این فرم حتما باید ()Application.Exit رو بنویسید. تا موقع خروج اون فرم مخفی شده (Hide ) هم که فرم مادر هست بسته بشه.
موفق باشید.

rahmani67
سه شنبه 01 اسفند 1391, 22:35 عصر
سلام.
اگر غیر از این باشه باید تعجب کرد. جتی اگه کادر دور فرم رو هم برداری بازم با Escap کاربر فرم جاری رو می بنده و به برنامه ورود میکنه. فرم لاگین رو به عنوان فرم پیش فرض (اولین فرمی که اجرا میشه) قرار بدید. اگر کاربر درست یوزر و پسورد رو وارد کرد، فرم لاگین رو مخفی (Hide ) و فرم بعد از لاگین(همون چیزی که در حال حاضر قرار دادید) رو showdialog کنید. فقط در رویداد formclosing این فرم حتما باید ()Application.Exit رو بنویسید. تا موقع خروج اون فرم مخفی شده (Hide ) هم که فرم مادر هست بسته بشه.
موفق باشید.

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

Mahmoud.Afrad
چهارشنبه 02 اسفند 1391, 01:10 صبح
باید توسط یک پراپرتی مشخص کنید که آیا کاربر مجاز است یا نه. در صورت که کاربر مجاز نیست فرم اصلی هم بسته بشه.
میتونید از خاصیت DialogResult فرم ها استفاده کنید. در فرم لاگین چک کنید اگر کاربر مجاز بود DialogResult فرم لاگین را OK کنید و فرم لاگین را ببندید:

public partial class FrmLogin : Form
{
public FrmLogin()
{
InitializeComponent();
}

private void btnLogin_Click(object sender, EventArgs e)
{
//if (کاربر مجاز است) ---> this.DialogResult = System.Windows.Forms.DialogResult.OK;
// after -------------------> this.Close();
}
}

در فرم لود فرم اصلی ، فرم لاگین را showdialog کنید. و بعد اگر DialogResult اش OK نبود(کاربر مجاز نبود) فرم اصلی را هم ببنیدید:

private void FrmMain_Load(object sender, EventArgs e)
{
using (FrmLogin frmlogin = new FrmLogin())
{
frmlogin.ShowDialog();
if (frmlogin.DialogResult != System.Windows.Forms.DialogResult.OK)
{
this.Close();
}
}
}

veniz2008
چهارشنبه 02 اسفند 1391, 10:55 صبح
ممنون از جوابتون. کد به درستی کار میکنه. فقط یه سوال: زمانیکه فرم لاگین رو در سازنده صدا میزنم یه مشکلی وجود داره. زمانیکه کاربر فرم رو می بنده (دکمه close فرم یا Esc یا Alt+F4 و ... ) خطای زیر صادر میشه . دلیلش چیه؟
به عنوان تست،کدها به اینصورت نوشته شده :
فرم لاگین:

if (Convert.ToInt32(textBox1.Text) == 1 && Convert.ToInt32(textBox2.Text) == 1)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
else
MessageBox.Show("Incorrect");
فرم اصلی (که به عنوان فرم پیش فرض تعریف شده) هم بصورت زیر هست :

public FrmMain()
{
InitializeComponent();
//
FrmLogin f1 = new FrmLogin();
f1.ShowDialog();
//
if (f1.DialogResult != System.Windows.Forms.DialogResult.OK)
this.Close();
}
خطای رخ داده :
100302http://barnamenevis.org/images/misc/pencil.png

Mahmoud.Afrad
چهارشنبه 02 اسفند 1391, 11:41 صبح
هنوز سازنده کامل اجرا نشده. میتونید خروج رو به عهده formload بزارید:

bool mustexit;
public FrmMain()
{
InitializeComponent();

using (FrmLogin frmlogin = new FrmLogin())
{
frmlogin.ShowDialog();
if (frmlogin.DialogResult != System.Windows.Forms.DialogResult.OK)
{
mustexit = true;
}
}
}
private void FrmMain_Load(object sender, EventArgs e)
{
if (mustexit)
this.Dispose();
}

که البته چندان جالب نیست. اگر در سازنده کدهای سنگینی ندارید ایجاد فرم لاگین رو در فرم لود انجام بدید.



در کل این که ابتدا فرم اصلی ساخته بشه و بعد فرم لاگین نمایش داده بشه به نظرم درست نیست. به نظر من فرم آغازین فرم لاگین باشه بهتره. در اینصورت میتونید در صورت مجاز بودن کاربر فرم اصلی را در thread دیگری ران کنید و فرم لاگین را dispose کنید(با این کار نخی که فرم لاگین در آن اجرا شده هم از بین میرود)

private void btnLogin_Click(object sender, EventArgs e)
{
// اگر مجاز بود
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ShowMainForm));
t.Start();
this.Dispose();
}

private void ShowMainForm()
{
FrmMain frmmain = new FrmMain();
frmmain.ShowDialog();
}

rahmani67
چهارشنبه 02 اسفند 1391, 11:51 صبح
ممنون از جوابتون. کد به درستی کار میکنه. فقط یه سوال: زمانیکه فرم لاگین رو در سازنده صدا میزنم یه مشکلی وجود داره. زمانیکه کاربر فرم رو می بنده (دکمه close فرم یا Esc یا Alt+F4 و ... ) خطای زیر صادر میشه . دلیلش چیه؟
به عنوان تست،کدها به اینصورت نوشته شده :
فرم لاگین:

if (Convert.ToInt32(textBox1.Text) == 1 && Convert.ToInt32(textBox2.Text) == 1)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
this.Close();
}
else
MessageBox.Show("Incorrect");
فرم اصلی (که به عنوان فرم پیش فرض تعریف شده) هم بصورت زیر هست :

public FrmMain()
{
InitializeComponent();
//
FrmLogin f1 = new FrmLogin();
f1.ShowDialog();
//
if (f1.DialogResult != System.Windows.Forms.DialogResult.OK)
this.Close();
}
خطای رخ داده :
100302http://barnamenevis.org/images/misc/pencil.png
من هم همین مشکل رو دارم !

veniz2008
چهارشنبه 02 اسفند 1391, 11:58 صبح
هنوز سازنده کامل اجرا نشده.
سوالی که پیش میاد این هست که من فرم لاگین در سازنده رو بعد از متد ()InitializeComponent صدا میزنم. یعنی قاعدتا اول بایستی فرم ساخته بشه. در این مورد توضیح میدید.

Mahmoud.Afrad
چهارشنبه 02 اسفند 1391, 12:42 عصر
برای اینکه متوجه بشید خطا از کجا آب میخوره ، در کلاس program استثناء رو بررسی کنید:

try
{
Application.Run(new FrmMain());
}
catch (Exception ex)
{
MessageBox.Show(ex.TargetSite.ToString());
}

متد CreateHandle خطا رو پرتاب کرده.
نکته : handle فرم در سازنده برابر false هست(this.IsHandleCreated در سازنده false اما در formload برابر true هست).

راه حل:
به جای this.Close از Environment.Exit(0); استفاده کنید.

public FrmMain()
{
InitializeComponent();

using (FrmLogin frmlogin = new FrmLogin())
{
frmlogin.ShowDialog();
if (frmlogin.DialogResult != System.Windows.Forms.DialogResult.OK)
{
Environment.Exit(0);
}
}
}

veniz2008
جمعه 04 اسفند 1391, 13:54 عصر
در کل این که ابتدا فرم اصلی ساخته بشه و بعد فرم لاگین نمایش داده بشه به نظرم درست نیست. به نظر من فرم آغازین فرم لاگین باشه بهتره. در اینصورت میتونید در صورت مجاز بودن کاربر فرم اصلی را در thread دیگری ران کنید و فرم لاگین را dispose کنید(با این کار نخی که فرم لاگین در آن اجرا شده هم از بین میرود)

private void btnLogin_Click(object sender, EventArgs e)
{
// اگر مجاز بود
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ShowMainForm));
t.Start();
this.Dispose();
}

private void ShowMainForm()
{
FrmMain frmmain = new FrmMain();
frmmain.ShowDialog();
}

دوست عزیز، کد رو امتحان کردم. در هنگام لاگین به درستی کار میکنه ولی در ادامه یه مشکلی ایجاد میکنه. من در قسمت گزارشات برنامم از stimul استفاده کردم موقعیکه قصد گزارش گیری دارم خطای "DragDrop registration did not succed" رخ میده. یه جستجو که انجام دادم خطای فوق بخاطر از بین رفتن Thread اصلی برنامه هست.(یعنی همونجا که فرم اصلی رو dispose میکنیم). من فعلا برنامم رو با همون روش formload راه انداختم ولی گفتم بهتره که اینجا مطرح کنم تا دوستانی که بعدا این تاپیک رو میخونن این نکته رو مدنظر داشته باشن.

ali_habibi1384
جمعه 04 اسفند 1391, 14:48 عصر
فرم لاگين رو قبل از همه فرمها بايد نشون بديد و در صورت صحيح بودن رمز عبور قبل از بستن اين فرم فرم اصلي رو باز كنيد.

veniz2008
جمعه 04 اسفند 1391, 15:06 عصر
فرم لاگين رو قبل از همه فرمها بايد نشون بديد و در صورت صحيح بودن رمز عبور قبل از بستن اين فرم فرم اصلي رو باز كنيد.
مشکل اینجاست اگر اول فرم اصلی رو باز کنیم، دیگه اجازه بسته شدن فرم لاگین داده نمیشه!

if (Convert.ToInt32(textBox1.Text) == 1 && Convert.ToInt32(textBox2.Text) == 1)
{
FrmMain fmain = new FrmMain();
fmain.ShowDialog();
this.Close();
}
else
MessageBox.Show("Incorrect");

Mahmoud.Afrad
جمعه 04 اسفند 1391, 21:37 عصر
اگر ابتدا فرم لاگین رو نمایش میدید ، فرم لاگین آنچنان سنگین نیست و اشکالی نداره در حافظه بمونه، میتونید قبل از نمایش فرم اصلی اونو مخفی کنید.

this.Hide();
FrmMain fmain = new FrmMain();
fmain.ShowDialog();
this.Close();

this.Close هم باعث میشه بعد از بسته شدن فرم اصلی، فرم لاگین هم بسته بشه.