CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - C++ Borland Login i Hasło

C++ Borland Login i Hasło

dział ogólny

C++ Borland Login i Hasło

Nowy postprzez router » poniedziałek, 25 kwietnia 2011, 11:05

Witam kolegów. Dawno nie bawiłem się Borlandem i mam pytanko na pozór dla niektórych banalne a mi po prostu się zapomniało szukałem pomocy na innych forach ale konkretów nie znalazłem. Już opisuje o co mi biega.

Mam Główny formularz a w nim dwa pola Edit Login i Hasło oraz dwa Buttony Zaloguj i Zarejestruj. Zrobiłem na Button Zarejestruj nowy formularz gdzie mam dodaj nowego użytkownika który musi podać swój Login oraz Hasło w polach Edit i ładnie zapisuje mi linijka po linijce to do pliku bazauser.txt

KOD cpp:     UKRYJ  
void __fastcall TFRejestracja::BRRejestrujClick(TObject *Sender)
{

        ofstream outfile("bazauser.txt", ios::app);
                if (!outfile) return;
            outfile << ERLogin->Text+' '+ERHaslo->Text.c_str() << endl;
     outfile.close();
}
}


Teraz chcę z bazauser.txt odczytać login i hasło by w głównym formularzu po podaniu w polach Edit loginu i hasło przejść na nowy formularz np.xxx

na sztywno udało mi się przejść na nowy formularz np. xxx wpisując

KOD cpp:     UKRYJ  
void __fastcall TNLogowanie::BZalogujClick(TObject *Sender)
{
             if (AELogin->Text == "jankowalski")
                if (AEHaslo->Text == "1234abcd")
                    xxx->Show();
}


tylko że ten wpis nie pobiera danych z pliku tylko na sztywno ma przypisany login i hasło a nie oto mi chodzi.

Do rzeczy chodzi mi by program pobierał login i hasło z pliku bazauser.txt wpisane w pola Edit a po poprawnym podaniu danych i kliknięcia w button Zaloguj przechodził do nowego formularza np.xxx a w przypadku błędnego Hasła Loginu lub jego braku wywalał ShowMessage z informacją że coś nie tak z logowaniem np.

Podałeś błędny Login lub Hasło !!!

Zrobiłem już tak że w pliku bazauser.txt mam tylko jeden wpis jako login czyli jankowalski hasło chwilowo wyłączyłem w kodzie żeby sobie nie komplikować sprawy i dalej mam problem bo po wpisaniu loginu jankowalski nie przechodzi na nowy forumlarz.

KOD cpp:     UKRYJ  
void __fastcall TNAnkieter::BZalogujClick(TObject *Sender)
{
 char login[30];
 //char haslo;

    ifstream infile("bazauser.txt", ios::app);
                if (!infile) return;
                if (AELogin->Text == login);
                //AEHaslo->Text = haslo;
                infile.getline(login, 30);
                if(infile.fail())
 {
   ShowMessage("Login lub Haslo nie pasuja do siebie");
 }
        infile.close();

        xxx->ShowModal();
}


Miałem też takie rozwiązanie ale też nic z tego nie wyszło

KOD cpp:     UKRYJ  
void __fastcall TNAnkieter::BZalogujClick(TObject *Sender)
{
    ifstream infile("bazauser.txt", ios::app);
        if (!infile) return;
            AnsiString login, haslo;
            infile >> login >> haslo;
                    AELogin->Text  = login;
                    AEHaslo->Text = haslo;
                        infile.close();

        xxx->ShowModal();
}


Naprowadzi mnie któryś z kolegów jak to zrobić by po wpisaniu w polu TEdit np. jankowalski znalazł owy wpis w bazieuser.txt o ile taki użytkownik istnieje i po nacisnięciu zaloguj przeniusł mnie na nowy formularz. Pozdrawiam ;)
Avatar użytkownika
router
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 25 kwietnia 2011, 10:39
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ Borland Login i Hasło

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 kwietnia 2011, 14:53

Formularz logowania Unit1.cpp, LoginForm - główny formularz aplikacji:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#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:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#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

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#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:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#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:

KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ Borland Login i Hasło

Nowy postprzez router » poniedziałek, 25 kwietnia 2011, 17:42

Wielkie dzięki kolego powiem szczerze że trochę zaskoczyłeś mnie tym kodem co prawda nie takiego rozwiązania się spodziewałem ale cóż człowiek uczy się całe życie :D Na szybko próbowałem go dopasować do mojego programu ale kompilator napotkał mi kilka błędów w Unit1 zerkne na to wieczorem spokojnie przy browarku :)

Kod: Zaznacz cały
E2316 'ValueFromIndex' is not a member of 'TStringList'
E2096 Illegal structure operation
W8004 'sPass' is assigned a value that is never used


Pozdrawiam ;)
Avatar użytkownika
router
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 25 kwietnia 2011, 10:39
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ Borland Login i Hasło

Nowy postprzez Cyfrowy Baron » poniedziałek, 25 kwietnia 2011, 17:54

router napisał(a):

E2316 'ValueFromIndex' is not a member of 'TStringList'



Najwyraźniej w środowisku C++Builder 6 klasa TStringList nie ma metody ValueFromIndex, dlatego ten fragment kodu:

KOD cpp:     UKRYJ  
  String sPass = LoginList->ValueFromIndex[iIsLogin];


Należy zastąpić takim kodem:

KOD cpp:     UKRYJ  
  String sPass = LoginList->Values[LoginEdit->Text];




router napisał(a):W8004 'sPass' is assigned a value that is never used


To nie jest błąd, lecz ostrzeżenie - zignorować!



router napisał(a):E2096 Illegal structure operation


Nie wiem którego fragmentu kodu dotyczy ten błąd.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: C++ Borland Login i Hasło

Nowy postprzez router » wtorek, 26 kwietnia 2011, 00:05

Miałeś racje kolego w środowisku C++Builder 6 klasa TStringList nie ma metody ValueFromIndex użyłem tak jak zaleciłeś Values[LoginEdit->Text] i kompilator nie stwierdził błędów a ostrzeżenie W8004 'sPass' is assigned a value that is never used zignorowałem. Co do E2096 Illegal structure operation samo wyszło bo musiałem dopasować strukturę do swojego programu teraz wszystko ładnie śmiga :D Jeszcze raz wielkie dzięki pewno będę mieć jeszcze kilka pytań bo widzę ze trochę czasu minęło od mojego ostatniego programowania więc będę potrzebował pomocy :D Forum jest wspaniałe i widzę że są tu ludzie znający się nad tym co lubią i jest ich to pasja :) Pozdrawiam ;)
Avatar użytkownika
router
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): poniedziałek, 25 kwietnia 2011, 10:39
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 44 gości

cron