源码如下:
procedure TForm2.Button1Click(Sender: TObject);
 var i:integer;
begin
   i:=0;
  if (edit1.Text='') or (edit2.Text='') then
   showmessage('用户名或密码不能为空')
  else
   begin
    while i<=adotable1.RecordCount do
    begin
     if   (adotable1.FieldByName('id').AsString=edit1.Text) and (adotable1.FieldByName('password').AsString=edit2.Text) then
        begin
           edit2.Text:='';
           CurrentForm:=TForm1.Create(nil);
           CurrentForm.ShowModal;
           exit;
        end
     else
      adotable1.Next;
      i:=i+1;
   end;
    if i>adotable1.RecordCount then
    showmessage('用户名或密码错误');
    form1.Close;
  end;
end;1 用正确的用户名和密码登陆后出现:List Index out of bounds(1)
是怎么回事?在程序中如何修改?
2 用正确的用户名和密码登陆后管理界面form1可操作,登陆框(Form2),无法关闭也无法操作,为什么呢?可否改改?
谢谢了

解决方案 »

  1.   

    if i>adotable1.RecordCount then
    改成if i>adotable1.RecordCount+1 then
    看看这个提示在我这里出现都是因为循环太小或太大。
      

  2.   

    exit改成break
    form1.close改成form2.close;
      

  3.   

    判断是不是到了表未就行了EOF
      

  4.   

    for i:=0 to adotable1.RecordCount-1 do 肯定可以了
      

  5.   

    1.边界分析法:
    当i=adotable1.RecordCount 时,也就是查询到最后一条时,并且if条件不满足,那么就得执行else语句,即adotable1.Next;最后一条还NEXT肯定要出错了。
    解决方法:
      将你的for改为while not adotable1.eof do就可以了,而且还省一个变量i,还不用人工控制i加1。2.对这种登录可以这样:
      将你的主窗体设为默认窗体,然后在改窗体的onshow中写f_login.showmodal();即可。
      这样在主窗体显示之前登录先出来,登录通过才显示主窗体。
      

  6.   

    while i<=adotable1.RecordCount do
        begin
         if   (adotable1.FieldByName('id').AsString=edit1.Text) and (adotable1.FieldByName('password').AsString=edit2.Text) then
            begin
               edit2.Text:='';
               CurrentForm:=TForm1.Create(nil);
               CurrentForm.ShowModal;
               exit;
            end
         else
          adotable1.Next;
          i:=i+1;
       end;
    改成:
    adotable1.first;
    while i<adotable1.RecordCount do
        begin
         if   (adotable1.FieldByName('id').AsString=edit1.Text) and (adotable1.FieldByName('password').AsString=edit2.Text) then
            begin
               edit2.Text:='';
               CurrentForm:=TForm1.Create(nil);
               CurrentForm.ShowModal;
               exit;
            end
         else
          adotable1.Next;
          i:=i+1;
       end;
      

  7.   

    就是溢出了,比如你的memo1有3行,应该是0 1 2,你读memo1.lines.string[3]就会报同样的错误
      

  8.   

    存取超出范围,因为你的i值是0,你的RecordCount是100,那循环的时候,循环条件就应该是i<RecordCount ,也就是0到99正好100次循环.而你的i<=RecordCount 则是0到100就是101次循环读取,当然就出错了.另外,楼主,你的ADOQuery还没有打开怎么执行读取数据集的操作呢.在读取之间要ADOQuery1.OPen;
      

  9.   

    用正确的用户名和密码登陆后管理界面form1可操作,登陆框(Form2),无法关闭也无法操作
    而且更奇怪的是,这个问题因机器而异,如何解决呢?
      

  10.   

    i <= RecordCount -1 OK?? OK