我想做一个登陆对话框,相关代码如下:
procedure TPasswordDlg.But_okClick(Sender: TObject);
begin
   begin
   with UnitModule.DataModule1    do
   begin
    Table2.Open ;
   if Table2.FieldByName('用户密码').AsString =PasswordDlg.password.Text then
     begin
     loginistrue := True;
     UnitModule.DataModule1.Table2.Post;
     UnitModule.DataModule1.Table2.Close;
     end
    else
    begin
    UnitModule.DataModule1.Table2.Post;
    UnitModule.DataModule1.Table2.Close;
    end;
  end;
  end;
  if loginistrue=true  then
   begin
     frm_Main.Show;
                    //self.Free;  //PasswordDlg.Close;
   end
   else
   begin
     Showmessage('密码不对,请重新输入...');
     Edit1.Clear;
     Edit1.SetFocus;
   end;
end;
procedure TPasswordDlg.But_cancelClick(Sender: TObject);
begin
 Application.Terminate;
end;
另外我在mainform中的相关代码是这样的:
procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  PasswordDlg:=TpasswordDlg.Create(application);
  PasswordDlg.ShowModal;
  PasswordDlg.Free;
.....
end;
但在编译时怎老是出错呢?
请大家帮我看看是不是代码哪里有问题呢?
谢谢!

解决方案 »

  1.   

    我就不懂了  UnitModule.DataModule1.Table2.Post;  是什么意思?
    是不是应该写成 UnitModule.Table2.Post;
      

  2.   

    没有必要POST,OPEN以后又没改变数据集的值。代码写得蛮乱的...
      

  3.   

    To lw549 :我现在把代码改了一下,在主窗体中用了一个CheckPassword函数,代码如下:
    function Tfrm_Main.CheckPassword:Boolean;
    var
      RetryCount : Integer;
      TempQuery: TQuery;
    begin
      TempQuery:=TQuery.Create(self);
      Result :=False;
      RetryCount:=0;
      PasswordDlg :=TPasswordDlg.Create(self);    //create password dialog  While True do
      begin
          RetryCount := RetryCount+1;    if RetryCount >= 4 then
        Exit;     if PasswordDlg.Showmodal = mrCancel then
         Exit;    With TempQuery do
        begin
          try
          close;
          SQL.Clear;
          SQL.Add('Select * from 用户信息 where 用户名称='+''''+
                  PasswordDlg.Edit1.Text+'''');
          Open;
          finally
                 ;
        end;
        if RecordCount <=0 then
        Continue;
         While PasswordDlg.But_ok.Click do    if FieldByName('用户密码').AsString = PasswordDlg.password.Text then
        begin
          Result := True;
          Break;
        end;
       end;
      end;     TempQuery.Free;
         PasswordDlg.Free;end;       
    可是如果像上面这样,那么那个登陆框的bit_ok按钮的代码该如何写呢?我是这样写的:
    procedure TPasswordDlg.But_okClick(Sender: TObject);begin
      if frm_Main.CheckPassword then
      begin
       frm_Main.Show;
       close;
      end;
    end;
    可是这样编译出来的结果是,那个登陆框不消失,而且好像它并没于起到登陆框的作用。
    请你帮我看看!如果代码不对,请你也帮我改写一下。谢谢了
      

  4.   

    帮你整整思路,你现在的思维是:1. CheckPassword里创建登录窗口:PasswordDlg :=TPasswordDlg.Create(self);
    2. 登录窗口里调用CheckPassword方法:if frm_Main.CheckPassword then ...之后两者交替循环,结果自然是....你不应该把创建登录窗体的逻辑放进检查密码的代码中,例如说应该把它放在MainForm的OnCreate事件里。此外一个建议:
    'Select * from 用户信息 where 用户名称=' + '''' + PasswordDlg.Edit1.Text+ ''''写成'Select * from 用户信息 where 用户名称=' + QuotedStr(PasswordDlg.Edit1.Text)
      

  5.   

    我就不懂了  UnitModule.DataModule1.Table2.Post;  是什么意思?
    是不是应该写成 UnitModule.Table2.Post;-----------------------------------------第一个UnitModule应该是单元名,后面的才是单元里的DataModule实例名。可能是怕多个单元里都有DataModule1才这么写吧。
      

  6.   

    UnitModule和DataModule1,哪个是窗体名?
      

  7.   

    请教一下大家,现在我的登陆框好像没问题了,可是在编译的时候,却出现如下错误: Project ProjMain.exe raised excetion class EAccessViolation with message 'Access' violation at address 004BE5E3 in module 'ProjMain.exe'.Read of address 0000005c'.Process stopped.Use Step or Run to continue.
    请问是什么原因呢?肯请指点!
      

  8.   

    有内存非法.
    最好在单独的Unit里处理验证工作,通过验证之后在进行MainForm的处理.
    建议Form之间的切换通过模态来.
    比如:MainForm := TForm.Create(nil);
    MainForm.ShowModal;
    MainForm.Free;