我的程序流程是这样的:
在主窗口显示前显示一个登录窗口,然后有一段程序,大体是这样:
procedure TForm2.Button1Click(Sender: TObject);//登录按钮
begin
if Trim(edit1)<>zcm then//比较注册码
     Application.Terminate;
if Trim(edit2)<>xtmm then
     Application.Terminate;//比较密码
........
end;
系统安装了120个客户,其中有113个用户能够正常运行,但有七台联想品牌机却可以不输入或随便输入注册码和系统密码即可进行系统,弄得我很是尴尬。
我可以肯定程序逻辑是没有任何问题的,唯一的规律是这七台机器都装了联想家庭版xpsp1,莫非Terminate在这些机器上没有作用?
   

解决方案 »

  1.   

    不清楚
    Application.Terminate
    改为
    halt
    看看行不行
      

  2.   

    把代码贴全了,整个过程贴出来,zcm和xtmm可不可能是空字符串??
      

  3.   

    zcm和xtmm可不可能是空字符串??这个很有道理。
    应该这样:procedure TForm2.Button1Click(Sender: TObject);//登录按钮
    begin
    if (Trim(edit1)<>zcm) or (zcm='') then//比较注册码
         Application.Terminate;
    if (Trim(edit2)<>xtmm) or (xtmm = '') then
         Application.Terminate;//比较密码
    ........
    end;
      

  4.   

    空字符楼主应该是想到了的。
    有没有这种可能,就是直接关闭的窗口?就是点的窗口上的X,不是点你的输入键,所以根本就不会调用你的TForm2.Button1Click。
      

  5.   

    以为是讲故事的,走错门了,sorry
      

  6.   

    Application.Terminate并不是立即终止程序。
    见Delphi Help:
    Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate.所以应该:
    if Trim(edit1)<>zcm then//比较注册码
      begin
        Application.Terminate;
        exit;
      end;
      

  7.   

    procedure TForm2.Button1Click(Sender: TObject);//登录按钮
    begin
    if Trim(edit1.text)<>zcm then//比较注册码
         Application.Terminate;
    if Trim(edit2.text)<>xtmm then
         Application.Terminate;//比较密码
    ........
    end;没有.text,是不是你的笔误?
      

  8.   

    "注册码是取系统硬盘id号通过一个计算公式算出来的"
    好像三星的硬盘取不了id号
      

  9.   

    是的,有些三星硬盘没有ID号。
    我取ID号是从网上下载的一个dll文件中调用函数取出来的。
      

  10.   

    谢谢DelphiGuy,我在csdn上全文搜索似乎也是这样解释的。改一下再试试。
      

  11.   

    哎 csdn服务器这么慢,你让我充满好奇的等了半天才发现我原来不是讲故事,我容易吗我
      

  12.   

    试试用正常途径吧,不用 Terminate ,对退出的流程小改一下,登录不成功,或者取消登录都 Close() 当前窗体,再保证下面没有代码,这样程序会自运退出,如果这样程序都退不出来,恐怕...:(
      

  13.   

    说的再详细一点吧,登录框一定是响应式的对吧,即 ShowModal  出来的。如果登录校验不过去就返回mrAbort,如果登录用户点取消则反回 mrCancel 只有登录校验成功的时候,才返回 mrOK 这样你只要在 ShowModal 之后判断就可以了,如果是 mrOK 在初始化应用程序就可以了。
    这是我的工程单元里面的代码你可以参考一下:
    program FinanceReport;uses
      Forms,  
      zrFormMain in 'zrFormMain.pas' {zrForm_Main},
      zrFormLogin in 'zrFormLogin.pas' {zrForm_Login};
    {$R *.res}
    begin
      Application.Initialize;
      with zrForm_Login.Create do
      try 
        if ShowModal()=mrOk then
        begin
          Application.CreateForm(TzrForm_Main, zrForm_Main);
        end;
      finally
        Free;
      end;
      Application.Run();
    end.
      

  14.   

    我建议,你应该把Application.Terminate;改成ModalResult := mrNo;
    在工程文件中加入对登录框的判断
    if fmlogin.showmodal = mrOK then
      Application.Run
    else
      Application.Terminate;
      

  15.   

    楼主真强,用这个标题骗了好多人(偶也被骗了~~:)从以上各位的结果来看,本人也认为是硬盘ID的问题。楼主可以稍微改一下,设置一个默认的ID,如果取不到硬盘ID就用那个默认ID。不然如果返回值是空当然不用如果密码了,''=''当然成立啦!!
      

  16.   

    把鬼驱了,在
    Application.Terminate;
    加Application.exit;