Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
delphixe登录错误_Delphi - Fatal编程技术网

delphixe登录错误

delphixe登录错误,delphi,Delphi,当我使用正确的用户名和密码登录我的应用程序时,最初我会收到错误用户名或密码的错误消息,然后下一次我单击“登录”按钮时,登录工作正常。我是一个德尔福爱好者,所以不要对我太苛刻 type TfmLogin = class(TForm) pnlMain: TPanel; lblUserName: TLabel; SQLConnection: TSQLConnection; DataSource: TDataSource; ClientDataSet: TCl

当我使用正确的用户名和密码登录我的应用程序时,最初我会收到错误用户名或密码的错误消息,然后下一次我单击“登录”按钮时,登录工作正常。我是一个德尔福爱好者,所以不要对我太苛刻

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;
为什么不(从头开始):

procedure TLogin\u Form.按钮1点击(发送方:TObject);
开始
Query1.Active:=false;
Query1.SQL.Clear;
Query1.SQL.Text:='从用户中选择[user]、[password],其中[user]='+QuotedStr(cxlookupcombobox1.Text)+'和[password]='+QuotedStr(cxtedit1.Text);
问题1.开放;
如果查询1.FieldByName('password')。关联字符串“”
然后开始
ModalResult:=mrOK;
结束其他
ModalResult:=mrNone;

您不需要匹配任何内容,因为密码无论如何都必须匹配。

我们不太可能用这么少的信息来解释这一点。当然,解释的细节是我们看不到的。我们无法为您调试,因为正如@DavidHeffernan所说,问题一定在于我们看不到的东西。我建议您暂时将被拒绝的用户名和密码值添加到ShowMessage呼叫中。另外,当你们第一次调用SqlTable时,你们是否100%确定它是打开的?谢谢你们,除了注册按钮之外,这几乎是我的登录单元。注册表工作正常,并将字段正确插入数据库(自动增量id字段、用户名和密码)@MartynA SQLTable已从对象检查器选中为活动,登录单元中没有使用SQLTable的地方。请打开或关闭方法。在定位之前尝试刷新表。如
Table.Close;表1.打开;表.定位(…
@ValMarinov感谢您修复了我的问题。不使用参数发送用户名和密码是危险的。此外,根据数据库引擎的不同,此查询不区分大小写。您也可以使用参数而不是引号字符串,如:where user=:p1和password=:p2。然后只需传递参数即可。密码在中区分大小写几乎所有的数据库根据我的经验。。。。
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;