现在做一个小程序,想把form_main作为程序的主窗体,但是第一个显示登陆界面。我现在在程序的application.run之前加了一句form_logon.show;这样能第一个显示登录界面了,但是点登陆界面的关闭按钮时主窗体会闪一下,怎么让主窗体不闪啊?

解决方案 »

  1.   

    可以在主程序main窗体的中写代码,类似这样:procedure Tsys_main_f.FormActivate(Sender: TObject);
    var
      NoticeIni:TIniFile;
      aPath:string;
    begin
      //顯示公告框
      if not NoticeShowed then
      begin
        aPath:=ExtractFilePath(ParamStr(0))+'Setup.ini';
        if FileExists(aPath) then
        begin
          NoticeIni:=TIniFile.Create(aPath);
          if NoticeIni.ReadBool('Setup','ShowNotice',True) then
          begin
            sys_Notice_Frm:=Tsys_Notice_Frm.Create(Self);
            if sys_Notice_Frm.ShowModal=mryes then
              NoticeIni.WriteBool('Setup','ShowNotice',False);
          end;
          NoticeIni.Free;
        end;
        NoticeShowed:=True;
      end;
    end;
      

  2.   

    这个功能需要改造工程源代码,示例代码:登陆窗体unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TFmLogin = class(TForm)
        btnOk: TButton;
        btnCancel: TButton;
        procedure btnOkClick(Sender: TObject);
        procedure btnCancelClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        class function ShowForm(): Boolean;
      end;implementation{$R *.dfm}{ TFmLogin }class function TFmLogin.ShowForm: Boolean;
    var
      FmLogin: TFmLogin;
    begin
      FmLogin := TFmLogin.Create(Application);
      try
        if FmLogin.ShowModal = mrOk then
          Result := True
        else
          Result := False;
      finally
        FmLogin.Free;
      end;
    end;procedure TFmLogin.btnOkClick(Sender: TObject);
    begin
      ModalResult := mrOk;
    end;procedure TFmLogin.btnCancelClick(Sender: TObject);
    begin
      ModalResult := mrCancel;
    end;end.主窗体没有任何改造:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TFmMain = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      FmMain: TFmMain;implementation{$R *.dfm}end.工程代码:program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {FmMain},
      Unit2 in 'Unit2.pas' {FmLogin};{$R *.res}begin
      Application.Initialize;
      if TFmLogin.ShowForm then //主要是这句话
        Application.CreateForm(TFmMain, FmMain);
      Application.Run;
    end.
      

  3.   

    正确做法是工程文件中进行控制such as below:
    ------------------------var
      alogin:tfrmLogin;begin  application.Initialize;  //3..显示登录;
      alogin := tfrmLogin.Create(application);
      alogin.ShowModal;
      If alogin.ModalResult <> mrok Then
      Begin
        alogin.Free;    application.Terminate;
        Exit;
      End;
      
      //登录成功,创建主窗体;
      application.Title := 'xxxxx管理系统';
      application.CreateForm(Tfrmmain, frmmain);
      application.Run; 
       ....
      不会出现闪烁的情况;而且主窗体依然是frmMain,不会变成登录窗体。。
      

  4.   

    正确做法是工程文件中进行控制such as below:
    ------------------------
    var
      alogin:tfrmLogin;begin  application.Initialize;  //3..显示登录;
      alogin := tfrmLogin.Create(application);
      alogin.ShowModal;
      If alogin.ModalResult <> mrok Then
      Begin
        alogin.Free;    application.Terminate;
        Exit;
      End;
      
      //登录成功,创建主窗体;
      application.Title := 'xxxxx管理系统';
      application.CreateForm(Tfrmmain, frmmain);
      application.Run; end.  不会出现闪烁的情况;而且主窗体依然是frmMain,不会变成登录窗体。。
      

  5.   

    工程文件中控制也可以var
      ADOLink,DatIni:Tinifile;
      MutexHandle:Integer;
      DataBaseNm:string;
      IsCancel:Boolean=False;
      
    procedure  ExtractRes(ResType,ResName,ResNewName:String);
    var
     Res:TResourceStream;
    begin
      Res:=TResourceStream.Create(Hinstance,Resname,Pchar(ResType));
      Res.SavetoFile(ResNewName);
      Res.Free;
    end;begin
      if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'MES') <> 0 then
      begin
        MessageDlg('MES程式已經運行,請確認!',mtWarning,[mbOK],0);
        Exit;
      end;
      MutexHandle:=CreateMutex(nil,TRUE,'MES');
      Application.Initialize;
      Application.Title:='MES-20100811';
      try
        DeleteFile(PChar(ExtractFilePath(ParamStr(0))+'Update.exe'));
        ExtractRes('EXEFILE','UpFile',ExtractFilePath(ParamStr(0))+'Update.exe');
      except
      end;
      if not FileExists(ExtractFilePath(Application.ExeName)+'Setup.ini') then
      begin
        Application.MessageBox('你沒有配置服務器連接,請重新配置!','提示',MB_OK+MB_ICONINFORMATION);
        sys_setup_f:=Tsys_setup_f.Create(Application);
        sys_setup_f.ShowModal;
        sys_setup_f.Free;
        sys_datamodule.Free;
        IsCancel:=True;
        Application.Run;
        Application.Terminate;
      end
      else
      begin
        DatIni:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Config.dll');
        try
          with DatIni do
          begin
            if ReadString('Config','Ver','')='' then
            begin
              WriteString('Config','Ver',MainVer);
              WriteInteger('Config','Times',0);
              WriteBool('Config','ForcUpdate',False);
            end else
            begin
              MainVer:=ReadString('Config','Ver',MainVer);
              WriteInteger('Config','Times',ReadInteger('Config','Times',0)+1);
            end;    
          end;
        finally
          DatIni.Free;
        end;
        sys_Welcome_f:=Tsys_Welcome_f.Create(Application);
        Application.CreateForm(Tsys_datamodule, sys_datamodule);
        ADOLink:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'Setup.ini');
        with  ADOLink do
        begin
          _percentage:=ReadFloat('Setup','percentage',5);
          _SCXL:=ReadString('Setup','SCXL','105%');
          _MaxXL:=ReadInteger('Setup','MaxXL',110);
          _MinXL:=ReadInteger('Setup','MinXL',90);
          case sys_welcome_f.ShowModal of
            mrOk:begin DataBaseNm:=ReadString('Setup','DataBaseName','');  _ServerNmae:=ReadString('Setup','ServerName',''); end;
            mrYes:begin DataBaseNm:=ReadString('Setup','TestDataBase',''); _ServerNmae:=ReadString('Setup','TestServerName',''); end;
            mrIgnore:
            begin
              IsCancel:=True;
              Application.Run;
              Application.Terminate; 
            end;
          end;
          sys_datamodule.con1.Connected:=False;
          sys_datamodule.con1.ConnectionString:=
            'Provider=SQLOLEDB.1;Password='+ Dec(ReadString('Setup','Password',''))+
            ';Persist Security Info=True;User ID='+ReadString('Setup','UserName','')+
            ';Initial Catalog='+DataBaseNm+
            ';Data Source='+_ServerNmae+';App=MES_'+MainVer;
          //sys_datamodule.con1.ConnectionString:='Provider=SQLNCLI10;Application Name=MES_'+MainVer+';Server='+_ServerNmae+';Database='+DataBaseNm+';Failover Partner='+_ServerNmae+';UID='+ReadString('Setup','UserName','')+';PWD='+Dec(ReadString('Setup','Password',''))+';';
          //NEW//sys_datamodule.con1.ConnectionString:='Provider=SQLOLEDB.1;Application Name=MES_'+MainVer+';Data Source='+_ServerNmae+';Initial Catalog='+DataBaseNm+';User ID='+ReadString('Setup','UserName','')+';Password='+Dec(ReadString('Setup','Password',''))+';' ;
          free;
        end;
        try
          sys_Welcome_f.Free;
          sys_Welcome_f:=nil;
          if not IsCancel then
          begin
            try
              sys_datamodule.con1.Connected:=true;
            except
              Application.MessageBox('服務器連接配置錯誤,請重新配置!!!','提示',MB_OK+MB_ICONINFORMATION);
              sys_setup_f:=Tsys_setup_f.Create(Application);
              sys_setup_f.ShowModal;
              sys_setup_f.Free;
              sys_datamodule.Free;
              IsCancel:=True;
              Application.Run;
              Application.Terminate;
            end;
          end;
          if not IsCancel then
          begin
            sys_Login_f:=Tsys_Login_f.Create(Application);
            if sys_Login_f.ShowModal=mrOK then....
      

  6.   

    我按照你的方法试了一下,在登录窗体上加了两个button,确定按钮和取消按钮,在按钮写的下面的代码:procedure Tfrmlogin.btn_okClick(Sender: TObject);
    begin
      frmmain.Show;
      frmlogin.close;
    end;procedure Tfrmlogin.btn_cancelClick(Sender: TObject);
    begin
      frmlogin.close;
    end;
    编译不出错,但程序运行时,点确定和取消的时候都会报错,找了半天也不知道什么原因……