Application.Initialize;
  Application.CreateForm(TDataM, DataM);  //创建DataMoudle
  Application.CreateForm(TFmMain, FmMain);  //创建主窗体  FmLogin := TFmLogin.Create(Application) ; //创建登陆窗体
  FmLogin.ShowModal ;                      //显示登陆窗体  
  if FmLogin.Tag = 1 then                  //登陆正确
    Application.Run                        //进入程序  
  else
    Application.Terminate ;                //关闭程序当我在登陆界面按取消时,执行Application.Terminate ; 
出现了非法操作
麻烦各位帮忙解决一下,解决马上给分.

解决方案 »

  1.   

    form 在 showmodal后按了cancel后就 free 掉了,再访问tag当然出错啦。

    FmLogin := TFmLogin.Create(Application) ; //创建登陆窗体
    if FmLogin.ShowModal=mrok                      //显示登陆窗体  
      then                  //登陆正确
        Application.Run                        //进入程序  
      else
        Application.Terminate ;
      

  2.   

    也可在登陆窗体中定义一个变量  B 给项目文件的单元传递参数, "OK" 时传一个值,"Cancel"时传另一个值 。根据 B 来判断 Terminate / Run
      

  3.   

    Application.CreateForm(TFmMain, FmMain);  //创建主窗体
    Application.CreateForm(TDataM, DataM);  //创建DataMoudle
    用以上次序试试看。
      

  4.   

    Application.Initialize;
      Application.CreateForm(TDataM, DataM);  //创建DataMoudle
      Application.CreateForm(TFmMain, FmMain);  //创建主窗体  FmLogin := TFmLogin.Create(Application) ; //创建登陆窗体
      FmLogin.ShowModal ;                      //显示登陆窗体  
      if FmLogin.Tag = 1 then                  //登陆正确
        Application.Run                        //进入程序  
      else
        Application.Terminate ;                //关闭程序tag 就是传递的参数,就是执行到     Application.Terminate就报非法错误
      

  5.   

    调整一下顺序
      FmLogin := TFmLogin.Create(Application) ; //创建登陆窗体
      FmLogin.ShowModal ;                      //显示登陆窗体  
      if FmLogin.Tag = 1 then                  //登陆正确
        Application.Initialize;
        Application.CreateForm(TDataM, DataM);  //创建DataMoudle
        Application.CreateForm(TFmMain, FmMain);  //创建主窗体    Application.Run;                        //进入程序  
      end;
      

  6.   


    在Application.Terminate ; 前,释放数据模块和主窗口试试。
      

  7.   

    把 Application.Terminate ;改为exitprocess(0);就可以了。