2017-01-12 4 views
-2

Когда я вхожу в систему в своем приложении с правильным именем пользователя и паролем, вначале я получаю сообщение об ошибке для неправильного имени пользователя или пароля, а затем в следующий раз, когда я нажму кнопку входа в систему, логин работает отлично. Я любитель delphi, Не судите меня.Ошибка входа в Delphi XE

type 
    TfmLogin = class(TForm) 
    pnlMain: TPanel; 
    lblUserName: TLabel; 
    SQLConnection: TSQLConnection; 
    DataSource: TDataSource; 
    ClientDataSet: TClientDataSet; 
    SQLQuery: TSQLQuery; 
    DataSetProvider: TDataSetProvider; 
    edtUserName: TEdit; 
    lblPassword: TLabel; 
    edtPassword: TEdit; 
    btnRegistration: TButton; 
    btnLogin: TButton; 
    SQLTable: TSQLTable; 
    procedure btnRegistrationClick(Sender: TObject); 
    procedure btnLoginClick(Sender: TObject); 

    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    fmLogin: TfmLogin; 

implementation 

Это функция матч

function MatchPass(Table : TSQLTable; const UserName, Password : string): Boolean; 
begin 
Result := Table.Locate('Username;Password', VarArrayOf([username,password]),[]); 
end; 

И это процедура кнопка Войти

procedure TfmLogin.btnLoginClick(Sender: TObject); 
var 
UserName : string; 
Password : string; 
begin 
UserName := edtUserName.Text; 
Password := edtPassword.Text; 

    if(MatchPass(SQLTable, UserName, Password)) then //1.Why first time returns false 
    begin 
     with TfmMain.Create(nil) do 
     try 
      ShowModal; //3.And opens my main form 
     finally 
      free; 
     end; 
    end 
     else 
    ShowMessage('Wrong name or pass'); //2.And enters else and the second time returns true 
    end; 
+0

Довольно маловероятно, что мы сможем объяснить это с такой небольшой информацией. Разумеется, объяснение подробно объясняется тем, что мы не можем видеть. –

+0

Мы не можем отлаживать это для вас, потому что, как говорит @DavidHeffernan, проблема должна заключаться в том, что мы не можем видеть. Я предлагаю вам временно добавить значения UserName и Password, которые были отклонены для вашего вызова ShowMessage. Также вы на 100% уверены, что SqlTable открыт, когда вы его сначала назовете? – MartynA

+0

Спасибо, ребята, это в значительной степени мой модуль входа, кроме кнопки регистрации. Работа с регистрационной формой прекрасна и правильно вставляет поля в базу данных (поле идентификатора автоповтора, имя пользователя и пароль). @MartynA SQLTable проверяется активным из инспектора объектов, нигде в модуле входа не используются методы SQLTable.Open или Close. –

ответ

-2

Почему нет (с головы):

procedure TLogin_Form.Button1Click(Sender: TObject); 
begin 
Query1.Active:=false; 
Query1.SQL.Clear; 
Query1.SQL.Text:= 'select [user],[password] from users where [user] ='+QuotedStr(cxlookupcombobox1.text) +' and [password]='+QuotedStr(cxTextEdit1.Text); 
Query1.Open; 
if Query1.FieldByName('password').AsString<>'' 
then begin 
ModalResult := mrOK ; 
end else 
ModalResult := mrNone; 

Вам не нужно соответствовать чему-либо, потому что пароль должен совпадать ch в любом случае.

+1

Отправка имени пользователя и пароля без использования параметров является опасной. –

+0

Кроме того, в зависимости от механизма базы данных этот запрос не учитывает регистр. –

+0

ну, вы можете использовать параметры тоже вместо quotedstring как: where user =: p1 и password =: p2. Затем просто передайте параметры. Пароль чувствителен к регистру почти во всех базах данных. Ну, из моего опыта .... – user763539