begin
  with TLoginForm.Create(nil) do try //建议
    if ShowModal <> mrOk then Exit;
  finally
    Free;
  end;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

解决方案 »

  1.   

    begin
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      LoginForm := TLoginForm.Create(Application); //Application.Free会触发LoginForm.Free
      try
        if LoginForm.ShowModal = mrOk then
        begin
          Application.ShowMainForm := True;
          Application.Run;
        end else
        begin
          Application.ShowMainForm := False;  
          Application.Terminate;
        end;
      finally
        if Assigned(LoginForm) then LoginForm.Free; 
      end;
    end.
      

  2.   

    感谢!但是仍然不行!是否我的MainForm的问题?LoginForm := TLoginForm.Create(nil);这样也不行.
      

  3.   

    建议将try finally  去掉,你用if就已经进行错误处理了,你使用了
    Application.Terminate后就不要LoginFm.Free了,因为Application.Terminate已经替你作过了,所以才会出错的。
      

  4.   

    begin
      Application.Initialize;
      Application.CreateForm(TMainForm, MainForm);
      LoginForm := TLoginForm.Create(nil);          //nil or Application均一样出错
        if LoginForm.ShowModal = mrOk then
        begin
          MainForm.UserCode := LoginForm.CodeEdit.Text;
          SetCurrentUserCode(LoginForm.CodeEdit.Text);
          Application.ShowMainForm := True;
          Application.Run;
        end else
        begin
          Application.ShowMainForm := False;
          Application.Terminate;
        end;
    end.
      

  5.   

    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      if Assigned(FCurrentFunctionlist) then
      begin
        FCurrentFunctionList.Free;
        FCurrentFunctionList:=nil;
      end;
      if Assigned(FFunctionList) then
      begin
        FFunctionlist.Free;
        FFunctionlist:=nil;
      end;
    end;
      

  6.   

    主程序已OK!正确写法列下:
    -----------------------------------
    {$R *.RES}begin
      Application.Initialize;
      LoginForm := TLoginForm.Create(Application);
      try
        if LoginForm.ShowModal = mrOk then
        begin
          Application.CreateForm(TMainForm, MainForm);
          Application.ShowMainForm := True;
          Application.Run;
        end else
        begin
          Application.ShowMainForm := False;
          Application.Terminate;
        end;
      finally
        if Assigned(LoginForm) then LoginForm.Free;
      end;
    end.
    ----------------------------------------------
    主窗体看来有点毛病,导致主程序出错!
    procedure TMainForm.FormDestroy(Sender: TObject);
    begin
      if Assigned(FCurrentFunctionlist) then
      begin
        FCurrentFunctionList.Free;
        FCurrentFunctionList:=nil;
      end;
      if Assigned(FFunctionList) then
      begin
       // FFunctionlist.Free;    //就是这句!看来该列表早已释放!
        FFunctionlist:=nil;
      end;
      if Assigned(Fmenu) then
      begin
        FMenu.Free;
        Fmenu:=nil;
      end;
    end;procedure TMainForm.FormShow(Sender: TObject);
    begin
    ..........     
    // 声明:这是我从别人手上接过来的活儿!
     FCurrentFunctionList.Free ;        
     FCurrentFunctionList := FFunctionList;
    //看这个变态的写法!  
    ................
    end;
      

  7.   

    to: zswang(伴水)(被黑中) 
    再次感谢给兄弟这翻解答!希望经常得到您的指点!
    本人最近没有关于DELPHI一些特别的特性方面的资料,比如:
    Form1:=TForm1.create(Application);
    Form1:=TForm1.create(nil);
    Application.Create(TForm1,Form1);
    这三者的不同,兄弟都不是很清楚
    还有Assigned在这里的处理与<>nil有何不同?
     if Assigned(FFunctionList) then
      begin
        FFunctionlist.Free;    
        FFunctionlist:=nil;
      end; 
      

  8.   

    Assigned(Value)//指是否分配了资源
    //也许Value有指向的地址但有可能没有分配了资源
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P: TForm;
    begin
      P := TForm.Create(nil);
      P.Free; //可P已经指向一个地址了
      if P = nil then ShowMessage('我说错了');
      if Assigned(P) then ShowMessage('看看就知道');
    end;