Formularz logowania Unit1.cpp, LoginForm - główny formularz aplikacji:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" // formularz rejestracji
#include "Unit3.h" // formularz MainForm
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TLoginForm *LoginForm;
//---------------------------------------------------------------------------
__fastcall TLoginForm::TLoginForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button3Click(TObject *Sender)
{
Hide();
RegisterForm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button1Click(TObject *Sender)
{
static int iLogCount = 0;
iLogCount++;
if(iLogCount > 3)
{
ShowMessage("Wyczerpano limit prób logowania!");
Close();
}
String sLoginFile = ExtractFilePath( ParamStr(0) ) + "bazauser.txt";
TStringList *LoginList = new TStringList();
if(FileExists(sLoginFile)) LoginList->LoadFromFile(sLoginFile);
if(LoginEdit->Text.IsEmpty() || PassEdit->Text.IsEmpty())
{
ShowMessage("Nieprawidłowa Nazwa użytkownika lub Hasło. Popraw!");
return;
}
int iIsLogin = LoginList->IndexOfName(LoginEdit->Text);
if(iIsLogin >= 0)
{
String sPass = LoginList->ValueFromIndex[iIsLogin];
if(sPass != PassEdit->Text)
{
ShowMessage("Nieprawidłowe hasło!");
return;
}
}
else
{
ShowMessage("Nieprawidłowa Nazwa użytkownika!");
return;
}
delete LoginList;
Hide();
MainForm->Show();
}
//---------------------------------------------------------------------------
Formularz rejestracji Unit2.cpp, RegisterForm - formularz wtórny:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h" // formularz logowania
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TRegisterForm *RegisterForm;
//---------------------------------------------------------------------------
__fastcall TRegisterForm::TRegisterForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TRegisterForm::Button2Click(TObject *Sender)
{
Close();
LoginForm->Show();
}
//---------------------------------------------------------------------------
void __fastcall TRegisterForm::Button1Click(TObject *Sender)
{
String sRegisterFile = ExtractFilePath( ParamStr(0) ) + "bazauser.txt";
TStringList *RegisterList = new TStringList();
if(FileExists(sRegisterFile)) RegisterList->LoadFromFile(sRegisterFile);
if(LoginEdit->Text.IsEmpty() || PassEdit1->Text.IsEmpty()||
PassEdit2->Text.IsEmpty())
{
ShowMessage("Musisz wypełnić wszystkie pola");
return;
}
if(PassEdit1->Text != PassEdit2->Text)
{
ShowMessage("Hasła się różnią. Popraw!");
return;
}
RegisterList->Add(LoginEdit->Text + "=" + PassEdit1->Text);
RegisterList->SaveToFile(sRegisterFile);
delete RegisterList;
Close();
LoginForm->Show();
}
//---------------------------------------------------------------------------
void __fastcall TRegisterForm::FormShow(TObject *Sender)
{
LoginEdit->Text = "";
PassEdit1->Text = "";
PassEdit2->Text = "";
}
//---------------------------------------------------------------------------
Formularz MainForm, Unit3.cpp - formularz wtórny
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
W powyższym przykładzie formularz logowania jest głównym oknem programu, a to kiepskie rozwiązanie, gdyż po uaktywnieniu formularza
MainForm na którym użytkownik będzie pracował - oczywiście po prawidłowym zalogowaniu - formularz logowania nie jest zamykany lecz ukrywany. Nie można zamknąć formularza logowania jeżeli jest formularzem głównym, gdyż spowoduje to zamknięcie całej aplikacji.
By to zmienić najlepiej jest uczynić formularz
MainForm formularzem głównym i ukryć go podczas uruchamiania, a pokazać formularz logowania i to w tym formularzu odkrywać formularz główny po prawidłowym zalogowaniu.
W tym celu w pliku projektu, np. Project1.cpp należy dodać jedną linijkę kodu:
Application->ShowMainForm = false; np:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", LoginForm);
USEFORM("Unit2.cpp", RegisterForm);
USEFORM("Unit3.cpp", MainForm);
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TMainForm), &MainForm);
Application->CreateForm(__classid(TLoginForm), &LoginForm);
Application->CreateForm(__classid(TRegisterForm), &RegisterForm);
Application->ShowMainForm = false;
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
To oczywiście plik projektu środowiska C++Builder 2010, u Ciebie będzie wyglądało to nieco inaczej. Wspomniany kod dodajemy przed linijką
Application->Run();W pliku logowania zajdą niewielkie zmiany - Unit1.cpp LoginForm:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h" // formularz rejestracji
#include "Unit3.h" // formularz MainForm
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TLoginForm *LoginForm;
//---------------------------------------------------------------------------
__fastcall TLoginForm::TLoginForm(TComponent* Owner)
: TForm(Owner)
{
this->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button2Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button3Click(TObject *Sender)
{
Close();
RegisterForm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button1Click(TObject *Sender)
{
static int iLogCount = 0;
iLogCount++;
if(iLogCount > 3)
{
ShowMessage("Wyczerpano limit prób logowania!");
Application->Terminate();
}
String sLoginFile = ExtractFilePath( ParamStr(0) ) + "bazauser.txt";
TStringList *LoginList = new TStringList();
if(FileExists(sLoginFile)) LoginList->LoadFromFile(sLoginFile);
if(LoginEdit->Text.IsEmpty() || PassEdit->Text.IsEmpty())
{
ShowMessage("Nieprawidłowa Nazwa użytkownika lub Hasło. Popraw!");
return;
}
int iIsLogin = LoginList->IndexOfName(LoginEdit->Text);
if(iIsLogin >= 0)
{
String sPass = LoginList->ValueFromIndex[iIsLogin];
if(sPass != PassEdit->Text)
{
ShowMessage("Nieprawidłowe hasło!");
return;
}
}
else
{
ShowMessage("Nieprawidłowa Nazwa użytkownika!");
return;
}
delete LoginList;
Close();
MainForm->Show();
}
//---------------------------------------------------------------------------
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.