PDA

View Full Version : آموزش: فرم Login در ابتدای برنامه



raha1234567
شنبه 16 مرداد 1389, 20:42 عصر
در اکثربرنامه های امروزی از فرمی برای تائید کردن نام کاربرو پسورد کاربر استفاده می کنند به همین جهت در پروژه های VB.Net ( برای پروژه های C#‎ چنین امکانی نیست )چنین فرمی به طور پیش فرض تدارک دیده شده است البته خود شما نیز به راحتی می توانید آنرا بسازید و این امکان فقط برای سرعت بخشیدن به طراحی برنامه است.
برای اضافه کردن ان از مسیر Project/Add Windows Form شی LoginForm را به برنامه اضافه کنید یا خودتان یک فرم با دو کنترل textbox به نامهای UsernameTextBox و PasswordTextBox و دو باتن به نامهای Ok و Cancel به برنامه اضافه کنید.
از اینجا به بعد فرض می کنم که شما برای چک کردن username و password ورودی کاربران یک جدول در اکسس با نام users ایجاد کرده اید که دارای دو فیلد username و password است.
حال می خواهیم برنامه ای بنویسیم که در صورت تائید یا وجود داشتن نام کاربری و پسورد در پایگاه داده ، فرم اصلی برنامه با نام frmmain را نمایش بدهد و فرم login را ببندد.
در ابتدا دو namespace زیر را اضافه کنید:





VB.NET





Imports System.Data.OleDb





Imports System.Threading









C#‎.NET




using System.Data.OleDb;




using System.Threading;






سپس دو متغیر زیر را به صورت سراسری تعریف کنید:






VB.NET





Private con As OleDbConnection





Private com As OleDbCommand











C#‎.NET





private OleDbConnection con;





private OleDbCommand com;





سپس در رویدادLoad فرم Login دستورات زیر را وارد کنید:
<FONT face="Times New Roman"><SPAN lang=AR-SA><FONT size=3>




VB.NET




con = New OleDbConnection




con.ConnectionString = "provider=microsoft.ace.oledb.12.0;data source=TEST.accdb"









C#‎.NET




con = new OleDbConnection();




con.ConnectionString = "provider=microsoft.ace.oledb.12.0;data source=TEST.accdb";





توجه کنید فایل اکسس درنظرگرفته شده 2007 و در پوشه Debug قرار دارد.
حال در رویداد Click دکمه OK دستورات زیر را بنویسید:






VB.NET


com = New OleDbCommand


con.Open()


com.Connection = con


com.CommandText = "select count(*) from users where username='" & UsernameTextBox.Text & "' and password='" & PasswordTextBox.Text & "'"


Dim value As Int16


value = com.ExecuteScalar


If value = 1 Then


Dim form As New Thread(AddressOf MainForm)


form.Start()


Me.Close()


Else


MessageBox.Show("نام کاربری یا رمز ورودی اشتباه است")


End If


con.Close()








C#.NET


com = new OleDbCommand();


con.Open();


com.Connection = con;


com.CommandText = "select count(*) from users where username='" + UsernameTextBox.Text + "' and password='" + PasswordTextBox.Text + "'";


int value;


value = (int)com.ExecuteScalar();


if (value == 1)


{


Thread form = new Thread(new ThreadStart(MainForm));


form.Start();


this.Close();


}


else


MessageBox.Show("نام کاربری یا رمز ورودی اشتباه است");


con.Close();



حالا باید تابعی (تابع MainForm) به صورت زیر تعریف کنید:






VB.NET


Private Shared Sub MainForm()


Dim frmm As New frmmain


Application.Run(frmm)


End Sub








C#.NET


private void MainForm()


{


frmmain frmm=new frmmain();


Application.Run(frmm);


}






در رویداد Click دکمه Cancel دستورات زیر را بنویسید:




VB.NET


Me.Close()







C#.NET


this.Close();



این برنامه برای اجرا آماده است.
نکته : باید توجه داشت که برای ذخیره کردن پسورد در پایگاه داده باید آنرا hash کرد که hash کردن پسورد در مقاله جداگانه گفته خواهد شد.

aminghaderi
شنبه 16 مرداد 1389, 21:30 عصر
بابا یکم فرمت بدید به نوشتتون لطفا چشمام در اومد!!!
فونت Tahoma
کد هم داخل تگ کد.
مرسی.

raha1234567
یک شنبه 17 مرداد 1389, 00:09 صبح
بابا یکم فرمت بدید به نوشتتون لطفا چشمام در اومد!!!
فونت Tahoma
کد هم داخل تگ کد.
مرسی.

ببخشید من زیاد آشنایی با برنامه نداشتم از تذکرتون ممنون:چشمک:

C Sharp
یک شنبه 17 مرداد 1389, 07:15 صبح
واقعا از زحمتی که میکشید و اطلاعاتتون رو در اختیار دوستان میذارید، باید تشکر کرد.
ولی اگه اجازه بدید یه نکته ای هم من بگم
به VB.Net کاری ندارم ، ولی تو C# که ذاتآ شی گرا آفریده شده این روش واسه لاگین اگه بخوایم اصولی انجامش بدیم درست نیست و با مفاهیم شی گرایی نمیخونه
فرم لاگین فقط کارش گرفتن ورودی و شاید هم نشون دادن یه عبارت بعنوان خطا و ... باشه
تابع Main به نوعی کارش راه اندازی نرم افزار ما ست، پس این وسط کار تصدیق هویت بر عهده کیه؟
اینجاست که شی گرایی جواب میده : این کار کار کلاس دیگه ایه ، کلاس Authenticator(مثلا)
چه مزیتی داره استفاده از این کلاس ؟
بازم شی گرایی : شما رو میتونه از نگران بودن در مورد نوع دیتابیس و ... دربیاره و از همه مهمتر اگه فرم لاگین شما عوض بشه دیگه نگران کد نویسی مجدد نخواهید بود
بیشتر از این سرتون رو درد نمیارم
با اجازه صاحب تاپیک نمونه کد براتون میزارم

اینترفیسی به منظور مستقل کردن فرم لاگین از کلاسی که قراره هویت کاربر رو بررسی کنه


public interface IAuthenticator
{
bool Authenticate(string username, string password);
}

کلاس Authenticator تصدیق کننده هویت کاربر


class Authenticator : IAuthenticator
{
private User _user;


public User User
{
get { return _user; }
}
public Authenticator() { }

public bool Authenticate(string username, string password)
{

Hasher hasher = new Hasher();
password = hasher.GetMD5HashCode(password);

TBMS_UserTableAdapter userAdapter =
new TBMS_UserTableAdapter();

BMSDataSet.TBMS_UserDataTable userTable =
userAdapter.GetDataByUsernamePassword(username, password);

if (userTable == null || userTable.Rows.Count != 1)
return false;

string fullName = userTable.Rows[0]["FullName"].ToString();

user = new User(username, fullName_);
return true;
}
}

فرم لاگین


public partial class LoginForm : Form
{
private IAuthenticator _authenticator;
private int _attempt;

public LoginForm(IAuthenticator authenticator)
{
InitializeComponent();
_authenticator = authenticator;
_attempt = 0;
}

private void buttonAccept_Click(object sender, EventArgs e)
{
string username = textBoxUsername.Text.Trim();
if (username == string.Empty)
{
labelMessage.Text = "لطفا نام کاربری را وارد کنید";
textBoxUsername.BackColor = Color.LightGray;
return;
}
else
{
labelMessage.Text = "";
textBoxUsername.BackColor = SystemColors.Window;
}

string password = textBoxPassword.Text.Trim();

if (password == string.Empty)
{
labelMessage.Text = "لطفا رمز عبور را وارد کنید";
textBoxPassword.BackColor = Color.LightGray;
return;
}
else
{
labelMessage.Text = "";
textBoxPassword.BackColor = SystemColors.Window;
}

if (_authenticator.Authenticate(username, password) == true)
DialogResult = DialogResult.OK;
else if (_attempt < 3)
{
labelMessage.Text = "نام کاربری یا رمز عبور اشتباه میباشد";
textBoxPassword.Text = string.Empty;
_attempt++;
}
else if (_attempt > 2)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

کد داخل تابع Main



Authenticator authenticator = new Authenticator();
LoginForm login = new LoginForm(authenticator);
if (login.ShowDialog() != DialogResult.OK)
return;
_user = authenticator.User;

_mainForm = new MainForm();

بازم از raha1234567 عذر خواهی میکنم که دخالت کردم
کدی که گذاشتم مسلما بی عیب نیست ، حتما نکاتی که به ذهنتوتن میرسه رو بهم گوشزد کنید ، :بوس: