在密码框中必须输入8个字符,如果数据库表的记录中的密码不够8个后边要加上对应的空格(我试验将数据库中的密码复制才知道的),为什么?怎么解决?还有我不知道TRIM的具体用法,请指教!
如果谁有现成的登陆模块,请发个源码给我学习行吗?我现在用的ADOQUERY查询后比较的。
我的EMAIL:[email protected]

解决方案 »

  1.   

    procedure Tform1.edit1Exit(Sender: TObject);
    begin
      while length(edit1.text)<8 do
        edit1.Text:=edit1.Text+' ';
    end;
      

  2.   

    select ltrim(rtrim(Password)) from 用户表 where userid=登录名
      

  3.   

    to :noil0125(珏心) 我是觉得我的程序有问题,不应该有这样的效果啊。你有现成模块的代码吗?我想学。还有一点,如果我在用户名称DBCOMBOBOX1中输入一个不在ITEM中的人名时,会直接出现数据库中的第一个记录的人名,为什么?
    你的代码好用,谢谢。
      

  4.   

    如果是Access,把字段设成可压缩;
    如果是SQL Server,把字段设成varchar;
      

  5.   

    TO:RockEx(石头_) 不行啊,怎么比较了?
      

  6.   

    procedure TFrm_Logo.FormShow(Sender: TObject);
    begin
      with Frm_data.ADOQuery do//----提取表里的用户名!
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select * from User_Info Where User_type=:t1');
          Parameters[0].Value:='0';//----表示操作员
          Open;
          if RecordCount>0 then
            begin
              Combobox1.Clear;
              while not eof do
                begin
                  Combobox1.Items.Add(FieldByName('User_Name').AsString);
                  Next;
                end;
            end;
        end;
      Edit1.Clear;
    end;
    procedure TFrm_Logo.BitBtn1Click(Sender: TObject);
    var
      tmp_pass:string;
    begin
      if Length(Trim(Combobox1.Text))>0 then
      begin
    //  Try
      with Frm_data.ADOQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select * from User_Info Where User_Name=:t1');
          Parameters[0].Value:=trim(Combobox1.Text);
          Open;
    //      Mydecrypt(
          tmp_pass:=MyDecrypt(FieldByName('User_pass').AsString,'jing');//------提取密码!
          if Trim(Edit1.Text)=tmp_pass then
            begin
              Tmp_Name:=Trim(combobox1.Text);//----提取的姓名!
              Frm_Main.ShowModal;
              Frm_Logo.Close;
            end
            else
            begin
              Application.MessageBox('您输入的密码不正确,请重新输入!','图书管理系统',Mb_IconQuestion+Mb_ok);
              Edit1.SetFocus;
              Edit1.SelectAll;
            end;
        end;
        end
        else
        begin
          Application.MessageBox('请选择用户名!','图书管理系统',Mb_IconQuestion+Mb_ok);
        end;
    end;
    程序里的一段,自己研究研究
      

  7.   

    數據庫中放PASSWORD和USERNAME的字段為KEY值﹐會自動補空以夠長。
      

  8.   

    我有一个问题请问古董先生,你的frm_main.showmodal后frm_logo并没有跟着关闭,一直显示着,delphi中的登录窗口都是这样吗?
      

  9.   

    保存口令的字段不要用Char(FixedChar)类型,要用varchar类型。
      

  10.   

    var
    StrUser,StrPsd:string;
    begin
      StrUser:=edit1.Text;
      StrPsd:=edit2.Text;
      ADODataSet1.Close;
      ADODataSet1.CommandText:='select * from Tuser where UserName ='+
                              quotedstr(StrUser) +' and Pwd='+quotedstr(StrPsd);
      ADODataSet1.Open;
      if ADODataSet1.RecordCount<>0 then
      begin
        showmessage('a');//
      end;
    end;
      

  11.   

    var
    StrUser,StrPsd:string;
    begin
      StrUser:=edit1.Text;
      StrPsd:=edit2.Text;
      ADODataSet1.Close;
      ADODataSet1.CommandText:='select * from Tuser where UserName ='+
                              quotedstr(StrUser) +' and Pwd='+quotedstr(StrPsd);
      ADODataSet1.Open;
      if ADODataSet1.RecordCount<>0 then
      begin
        showmessage('a');//要实现的事件
      end;
    end;
      

  12.   

    谢谢大家,我目前用的是一楼的方法,各位的方法我会一一试用,现在有个问题,登陆窗体必须是工程的第一个窗体吗?如果不是,是不是要在PROGRAM中象幕布一样用?
      

  13.   

    你不应该用一楼的方法,而应该将Char改成varchar,因为用Char的话,会增加数据库的大小,因为他不管你的密码长度为多少,都会存为8长度,而varchar是只保存密码的实际长度的。
      

  14.   

    我用的是ACCESS,是不是Unicode压缩改为 是 ?
    我试用了一二楼的方法,都行,二楼的要将此字段另起别名。
      

  15.   

    procedure Tfrmpass.BtnOkClick(Sender: TObject);
    var
    s:string;
    p:string;
    begin
    p:=edtpass.Text;
    {adoquery1.close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.Add('select name,code,password from login_user where name='+#39+dbcombobox1.Text+#39);
    adoquery1.Open;
    //adoquery1.FieldByName('name').AsString:=dbcombobox1.Items.Text;
    s:=adoquery1.fieldbyname('password').AsString;
    //}//注释掉了。如果我将数据库中的字段改成可压缩的是不是就这样用?
    adoquery2.Close;
    adoquery2.SQL.Clear;
    adoquery2.SQL.Add('select name,code,ltrim(rtrim(password)) as 密码 from login_user where name='+#39+combobox1.Text+#39);
    adoquery2.Open;
    s:=adoquery2.Fieldbyname('密码').AsString;
    if (p<>s) then
       begin
         messagedlg('密码错误!',mtConfirmation,[mbyes],0);
         edtpass.Text:='';
         edtpass.SetFocus;
       end
      else
       begin
        form2.show;
        //adoquery1.close;
       adoquery2.Close;
        frmpass.Hide;
       end;
    end;
    这是我目前用的,有比这再简便的吗?
      

  16.   

    trim 的用法很简单 它是过滤掉内容的最前边和最后边的空格,但是过滤不掉中间的空格
      

  17.   

    imc没有人有更好的方法?现在还有个问题,下面的这个查询查不出结果,为什么?
    procedure Tfrmsfkp.Button1Click(Sender: TObject);
     var
     strsql:string;
    begin
    adoquery1.Close;
    adoquery1.SQL.Clear;
    //strsql:='select date,xm,sl from mz11,mz22 where mz11.id=mz22.mz11_id ';
     strsql:='SELECT date,mz11.id,mz11.fph,xm,price_item.name,sl,(retail_price/big_small),mz22.je,dr.name,dpt.name,login_user.name as czy from mz11,mz22,price_item,dr,dpt,login_user ';
     strsql:=strsql+' where mz11.id=mz22.mz11_id and dr.id=mz11.dr and login_user.id=sf_op and price_item.id=mz22.yp_id and dpt.id=mz11.dpt_id  ';
     if trim(datetimetostr(Dtp1.Date ))<>'' then
    strsql:=strsql+' between #'+datetimetostr(dtp1.DateTime)+'# and #'+datetimetostr(dtp2.DateTime)+'# '
     else
     showmessage('请选择查询日期!') ;
     adoquery1.SQL.Add(strsql);
     try
    adoquery1.Open;
    except
    adoquery1.ExecSQL;
    end;
    end;
    procedure Tfrmsfkp.FormCreate(Sender: TObject);
    begin
    dtp1.DateTime:=now;
    dtp2.DateTime:=now;
    end;
    而且报错:---------------------------
    Debugger Exception Notification
    ---------------------------
    Project mainProject.exe raised exception class EOleException with message 不正常地定义参数对象。提供了不一致或不完整的信息'. Process stopped. Use Step or Run to continue.
    ---------------------------
    OK   Help   
    ---------------------------
    我只是将DateToStr改成了DateTimetoStr了啊
      

  18.   

    用trim多好,前後的空個都可以去掉!!! 
    if trim(edit1.text)=trim(adoquery1.fieldbyname('欄位名').asstring)..........;
      

  19.   

    tmp_pass:=MyDecrypt(FieldByName('User_pass').AsString,'jing');//------提取密码!
    这一句中的MyDecrypt是对字符串进行加密,不用也可以这样
    tmp_Pass:=FieldByName('User_Pass').AsString; Tmp_Name:=Trim(combobox1.Text);//----提取的姓名!这一句Tmp_name,自己可以申明一下
    var 
      tmp_Name:String;就OK了!
      

  20.   

    而且我想在combobox1里自动加上查询出来的操作员名单,这样用却不显示,为什么?
    procedure Tfrmpass.FormCreate(Sender: TObject);
    var s1:string;
    begin
     s1:=adoquery2.Fieldbyname('name').AsString;
     Next;
     combobox1.Items.Add(s1);
    end;
      

  21.   

    to:siwuge(五哥) 
    你的程序忘记循环啦:)
    procedure Tfrmpass.FormCreate(Sender: TObject);
    var s1:string;
    begin
     if adoquery2.active then
       begin
         adoquery2.first;
         while not adoquery2.eof do
            begin
              s1:=adoquery2.Fieldbyname('name').AsString;
              combobox1.Items.Add(s1);
              Next; 
            end;
       end;
    end;
      

  22.   

    用 SQL SERVER的话最好用存储过程来验证密码,要不然效率太低了
      

  23.   

    我用的是ACCESS,如果用SQL,怎么用存储过程来验证密码?