我的要求就是很多系统的一样.
一打开程序,就出现登陆窗口,如果用户输入的用户密码正确,登陆窗口消失(HIDE,还是CLOSE),如果输入不正确就提示重新输入,如果连续输入三次,关闭登陆窗口我现在的方式是:生成主窗口,在显示主窗口事件中显示出登陆窗口,如果密码正确就断续显示主窗口,不然关闭所有窗口,终止程序;但现在出现的问题是:就算密码输入错,也马上进入主窗口以下是我在系统的各种重要设置
在系统的PROJECT--OPTIONS中
在auto-create forms中各个窗口顺序为:
FRM_MAIN(主窗口)
FRM_USER在主窗口显示前
procedure Tfrm_main.FormShow(Sender: TObject);
begin
frm_user.ShowModal;
end;在登陆窗口中的确认键代码为:
procedure Tfrm_user.BitBtn1Click(Sender: TObject);
begin
  if frm_datam.userr.Locate('name;password',vararrayof([dbtext1.Caption,edit1.Text]),[]) then
     begin
     //frm_main:=Tfrm_main.Create(self);
     frm_main.Show;
     end
  else
    begin
      frm_main.hide;//加了这一句,运行后提示出错
      pass1:=pass1+1;
      showmessage('口令错误,请重新输入');
      edit1.Text:='';
      edit1.SetFocus;
      if pass1=3 then
        begin
          showmessage('系统无法识别你的身份.');
          frm_main.Close;
        end;
    end;
end;提示错误:
cannot change visible in onshow or on hide

解决方案 »

  1.   

    frm_main is not visible or active,so can not hide it
      

  2.   

    就该在Project->View Source里面的工程文件代码里对frm_main进行显示限制.
      

  3.   

    修改项目文件:
    Project->View Sourcefrm_user.ShowModal;
    放在
    Application.Initialize;
    .....
    application.run 语句之前!
      

  4.   

    我是这样做的:
    1、在工程选项的自动创建窗体中,加入主窗体和登录窗体。如果是MDI的,登录窗体的FORMSTYLE属性必须是FSNORMAL,不能用FSMDICHILD。
    2、工程单元中,
      登录窗体.ShowModal;
      Application.Run;
    3、验正正确,close登录窗体。你可以试一下。
      

  5.   

    to RUIGANG 但如果密码不正确,主窗口也一样走出来
      

  6.   

    针对正确和错误分别设置ModalResult,在主窗体的FormActivate里面用while 循环执行登录窗体ShowModal,错误退出就可以了
    示例:
    主窗体什么都不放
    代码只有
    procedure TForm1.FormActivate(Sender: TObject);
    begin
    if form2.ShowModal=mrno then
    close;
    end;
    登录窗体上放两个按钮
    代码:
    procedure TForm2.Button1Click(Sender: TObject);
    begin
    form2.ModalResult:=mrno;
    end;procedure TForm2.Button2Click(Sender: TObject);
    begin
      form2.ModalResult:=mrok;
    end;
    执行就是结果,WHILE循环自己加,不过还要一个全局变量,保存是否是第一次FormActivate,因为每次主窗体的FormActivate都会执行这个操作,也可以检测当前用户是否有效来进行标识,但这样还是要多设一个用户名的变量
      

  7.   

    设置 frm_main 为非主窗体,然后在后台设置一个主窗体,让这个主窗体在屏幕外面显示。程序运行的时候主窗体先运行然后再运行登陆窗体,在登陆窗体确认密码正确的时候再显示frm_main。在DELPHI里默认第一个创建的窗体为主窗体。
      

  8.   

    我的做法是将登录相关的数据集放在一个data module中,然后在工程文件中这样处理:
    Application.CreateForm(TDM_Login_Manage, DM_Login_Manage);
      if DM_Login_Manage.TerminateAPP then
      begin
        application.run;
        application.Terminate;
        Exit;
      end;  Application.CreateForm(TFrm_Main, Frm_Main);
      Application.Run;在data module的oncreate事件中打开登录窗体把项目的options的auto_create窗体设为只有data module
      

  9.   

    to neo40(企鹅)
    不明白你的具体做法,
    你在什么时候运行登陆窗口的,在什么事件中?
    FRM_MAIN又应在什么时候生成显示
      

  10.   

    在project->viewsource里面打开工程文件,模仿有关Loginform里面的写法。注意不要让LoginForm自动创建。如果执行成功,在登陆框里面让ModalResult=mrOK或其它你指定的值,否则指定为其它值。在程序里判断那个值是什么来确定以后执行什么。比如下面的是判断  if Login_Form.ModalResult =2  then
    program HTBA;uses
      Forms,
      Controls,
      mainform in 'MAINFORM.PAS' {Main},
      SplashForm in 'SplashForm.pas' {Splash},
      JBQKForm in '基本信息\JBQKForm.pas' {JBQK},
      login in 'LOGIN.PAS' {Login_Form},
      XXQKForm in '基本信息\XXQKForm.pas' {XXQK},
      CXForm in '查询\CXForm.pas' {CX},
      TJForm in '统计\TJForm.pas' {TJ},{$R *.res}begin
      Application.Initialize;
      Login_Form:=TLogin_Form.Create(application);
      Login_form.ShowModal;
      if Login_Form.ModalResult =2  then
        begin
          application.Terminate;
        end;
      Splash:=TSplash.Create(Application);
      if Splash.ShowModal=mrOK then
        Application.Run;
    end.
      

  11.   

    to  cyp207(cyp207)和各位大侠
    多谢你,你应该是讲得很白的了,但我还是不明白,能不能发你的USER窗口和MAIN窗口的PAS文件过来让我参考[email protected]
      

  12.   

    to neo40(企鹅):
    主窗体在运行后是不能改的呀
    to cyp207(cyp207) :
    你的主窗体是那一个,怎么一个是Splash,一个是Login_Form
      

  13.   

    简单的,使用PostMessage(需要Close的Form.Handle,WM_CLose,0,0)就搞定http://lysoft.7u7.net
      

  14.   

    登陆窗口不要auto-create  而应该在工程文件里用application 来创建  
    procedure Tfrm_user.BitBtn1Click(Sender: TObject);
    begin
      if frm_datam.userr.Locate('name;password',vararrayof([dbtext1.Caption,edit1.Text]),[]) then
         begin
         //frm_main:=Tfrm_main.Create(self);
         frm_main.Show;
         release;//加入
         end
      else
        begin
          frm_main.hide;//加了这一句,运行后提示出错
          pass1:=pass1+1;
          showmessage('口令错误,请重新输入');
          edit1.Text:='';
          edit1.SetFocus;
          if pass1=3 then
            begin
              showmessage('系统无法识别你的身份.');
              
              release;//加入
              application.
            end;
        end;
    end;