zoukankan      html  css  js  c++  java
  • delphi 登陆窗口的问题 [问题点数:30分,结帖人tianhuo_soft]

    http://bbs.csdn.net/topics/200053917

    有两个窗口
    formLogin是登陆窗口,formMain是主窗口
    我想让formMain显示出来,并且formLogin窗口关闭或者隐藏
    这牵扯到 如果是关闭 在formMain就不用去管formLogin的问题了
    如果是隐藏那formMain就还要关闭formLogin窗口  

    我是这样想的 本人对delphi的机制不太了解~!

     我在formLogin中添加
           formMain:=formMain.Create(Application);
          formMain.ShowModal;
          formLogin.Close;
    这样并没有隐藏formLogin窗口,是不是还要加什么语句~!

    感谢您对这个问题的回答~!

    dpr里面这么写(uses Controls)

    begin
    Application.Initialize;
    Application.CreateForm(TformMain, formMain);
    formLogin = TformLogin.Create(Application);
    if formLogin.ShowModal = mrOk then
    begin
    formLogin.Release;
    Application.Run;
    end;
    end.

    我的工程文件是这样的
      Application.Initialize;
      Application.CreateForm(TformMain, formMain);
      Application.ShowMainForm := false;
      Application.Run;

    我的想法是先创建formMain窗口 在从formMain的OnCreate事件中创建formLogin窗口
          formLogin:=TformLogin.Create(Application);
         formLogin.ShowModal;

    当正确输入用户名和密码后
          formLogin.Free;
          formLogin:=nil;
          formMain.ShowModal;

    这样有个问题是 当关闭formMain后并没有关闭formLogin

    procedure Tform1.formcreate(sender:Tobject);
    begin
    formLogin:=TformLogin.Create(self); 
     try 
       if formlogin.showmodal<>mrok then
           close;
      finally
          formlogin.free;
     end;
    end;

    工程文件中是这样的.
    begin
      Application.Initialize;
      F_pos_start := tF_pos_start.Create(application);
      F_pos_start.show;
      F_pos_start.Update;
      Sleep(2000);
      F_pos_start.Close;
      Application.Title := '大药房连锁管理系统-连锁店端';
      Application.CreateForm(TF_pos_main, F_pos_main);
      Application.CreateForm(TF_pos_login, F_pos_login);
      .............................
      Application.CreateForm(TF_pos_select_unit, F_pos_select_unit);
      Application.CreateForm(TF_pos_check_stock, F_pos_check_stock);
      F_pos_Main.Visible := true; //显示主窗体
      F_pos_login.ShowModal; //显示登录窗体
      Application.Run;
    end.

    释放在 登录成功的时候 做个 free 什么的不就行了吗?或者 oncolose 里  action:=cafree;

    建议采用MDI,这样就可以实现楼主意思了
    在工程文件中只创建主窗体,
    然后在主窗体中在进行登陆对话框的创建,完毕后释放。

    不明白你的意思是什么

    我说下自己的例子。。

    MainForm 主窗体

    LoginForm 登录窗体

    在MainForm的FormShow事件里判断当前是否已经登录
    如果么有。。就LoginForm.ShowModal;

    在LoginForm的FormClose事件里判断当前是否已经登录
    如果么有。。就Application.Terminate

    你把LoginForm设为主窗体。。。然后判断用户名 密码

    验证通过 MainForm 显示。。。 loginform 释放

    应该是这样的!~!~!

    ShowModal 是显示模式窗体的,只有该窗体关闭后才能执行下面关闭语句
    窗体隐藏的方法的Hide

    Self.Hide; //先隐藏
    frmMain := TForm.Create(Application);
    frmMain.ShowModal;

    handle_1,handle_2:hwnd;
    begin
      //数据库文件检测
      If (not fileexists(ExtractFilePath(ParamStr(0))+'up.mdb')) or (not fileexists(ExtractFilePath(ParamStr(0))+'handset.mdb'))  Then
         Begin
            messagebox(0,'系统文件丢失,请重新安装!','提示',MB_OK);
            Application.Terminate;
         End;
      Application.Initialize;
      //获取窗口句柄
      handle_1:=findwindow('TForm_handset_Login',nil);
      handle_2:=findwindow('TForm_handset_Main',nil);
      If (handle_1=0) and (handle_2=0) Then
           Begin
           //启动登录窗口
            Form_handset_Login:=TForm_handset_Login.Create(Application);
            Form_handset_Login.ShowModal;
            If (Form_handset_Login.ModalResult=mrok) Then
                Begin
                   Application.Title := '手机通讯录';
                   Application.CreateForm(TForm_handset_Main, Form_handset_Main);
                   Application.CreateForm(TDM, DM);
                   Application.Run;
                End;
           End
      Else
          messagebox(0,'手机通讯录已经运行!','提示',MB_OK);
    end.

    unit handset_Login;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, RzButton, StdCtrls, Mask, RzEdit, RzLabel, ExtCtrls, RzPanel,
      DB, ADODB;

    type
      TForm_handset_Login = class(TForm)
        RzGroupBox1: TRzGroupBox;
        RzLabel1: TRzLabel;
        RzLabel2: TRzLabel;
        RzEdit1: TRzEdit;
        RzEdit2: TRzEdit;
        RzBitBtn1: TRzBitBtn;
        RzBitBtn2: TRzBitBtn;
        ADOQuery_Login: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure RzBitBtn1Click(Sender: TObject);
        procedure RzBitBtn2Click(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure RzEdit1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure RzEdit2KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form_handset_Login: TForm_handset_Login;
      j:integer=1;
      E:boolean=False;
    implementation
    uses AES;
    const
      Keys='z1a2x2d3cf34r5f5g6h7jk8';
    {$R *.dfm}
    {------------------------------------------------------------------------------}
    //1  初始化:联据数据库
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.FormCreate(Sender: TObject);
    const
       PassWord='q1w2e3r4t5y6u7i8o9p0';
    var
       MyPath:string;
    begin
       RzEdit1.Clear;
       RzEdit2.Clear;
      //----------------------------连接数据库----------------------------------------
       MyPath:=ExtractFilePath(ParamStr(0));
       adoQuery_Login.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
                                     MyPath+'up.mdb;Jet OLEDB:Database Password='+
                                     PassWord+';Persist Security Info=False';
    end;
    {------------------------------------------------------------------------------}
    //2  判断
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.RzBitBtn1Click(Sender: TObject);
    var
      UserName,PassWord:string;
    begin
       ADOQuery_Login.Close;
       ADOQuery_Login.SQL.Clear;
       ADOQuery_Login.SQL.Add('select *from Login');
       ADOQuery_Login.Open;
       If ADOQuery_Login.RecordCount>0 Then
          Begin
             ADOQuery_Login.First;
             UserName:=DecryptString(ADOQuery_Login.FieldValues['UserName'], Keys);
             PassWord:=DecryptString(ADOQuery_Login.FieldValues['PassWord'], Keys);
             If (Trim(UserName)=Trim(RzEdit1.Text)) and (Trim(PassWord)=Trim(RzEdit2.Text)) Then
                 Begin
                    Self.ModalResult:=mrok;
                 End
             Else
                 Begin
                    If j=3 Then
                       Begin
                          Messagebox(handle,'非法登录!','系统提示',MB_OK+MB_ICONERROR);
                          ADOQuery_Login.Close;
                          Application.Terminate;  //退出系统
                       End;
                    MessageBox(handle,'用户名或密码不正确,请重新填写!','提示',MB_OK+MB_ICONINFORMATION);
                    j:=j+1;
                    RzEdit1.Clear;
                    RzEdit2.Clear;
                    RzEdit1.SetFocus;
                 End;
          End;
    end;
    {------------------------------------------------------------------------------}
    //3  退出
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.RzBitBtn2Click(Sender: TObject);
    begin
       E:=True;
       Close
    end;
    {------------------------------------------------------------------------------}
    //4  退出判断
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.FormCloseQuery(Sender: TObject;
      var CanClose: Boolean);
    begin

       If E=True Then
          Begin
             ADOQuery_Login.Close;
             Application.Terminate;
          End
    end;
    {------------------------------------------------------------------------------}
    //5  切换焦点
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.RzEdit1KeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
       If key=vk_return Then
          RzEdit2.SetFocus
    end;
    {------------------------------------------------------------------------------}
    //6  切换焦点
    {------------------------------------------------------------------------------}
    procedure TForm_handset_Login.RzEdit2KeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
       If key=vk_return Then
          RzBitBtn1Click(Sender);
    end;

    end.

    program handset;

    uses
      Forms,
      windows,
      SysUtils,
      controls,
      handset_Main in 'handset_Main.pas' {Form_handset_Main},
      MyData in 'MyData.pas' {DM: TDataModule},
      handset_Edit in 'handset_Edit.pas' {Form_handset_Edit},
      handset_Search in 'handset_Search.pas' {Form_handset_Search},
      handset_QZ in 'handset_QZ.pas' {Form_handset_QZ},
      handset_LX in 'handset_LX.pas' {Form_handset_LX},
      handset_Login in 'handset_Login.pas' {Form_handset_Login},
      handset_Safety in 'handset_Safety.pas' {Form_handset_Safety};

    {$R *.res}
    var
    handle_1,handle_2:hwnd;
    begin
      //数据库文件检测
      If (not fileexists(ExtractFilePath(ParamStr(0))+'up.mdb')) or (not fileexists(ExtractFilePath(ParamStr(0))+'handset.mdb'))  Then
         Begin
            messagebox(0,'系统文件丢失,请重新安装!','提示',MB_OK);
            Application.Terminate;
         End;
      Application.Initialize;
      //获取窗口句柄
      handle_1:=findwindow('TForm_handset_Login',nil);
      handle_2:=findwindow('TForm_handset_Main',nil);
      If (handle_1=0) and (handle_2=0) Then
           Begin
           //启动登录窗口
            Form_handset_Login:=TForm_handset_Login.Create(Application);
            Form_handset_Login.ShowModal;
            If (Form_handset_Login.ModalResult=mrok) Then
                Begin
                   Application.Title := '手机通讯录';
                   Application.CreateForm(TForm_handset_Main, Form_handset_Main);
                   Application.CreateForm(TDM, DM);
                   Application.Run;
                End;
           End
      Else
          messagebox(0,'手机通讯录已经运行!','提示',MB_OK);
    end.

  • 相关阅读:
    百度大脑IOCR财会票据识别技术接入小程序,快速实现财会票据识别
    接入百度大脑一站式内容审核平台,可快速提升审核效率
    利用百度AI快速开发出一款“问答机器人”并接入小程序
    接入百度大脑表格文字识别技术,快速降低信息电子化录入成本
    百度大脑UNIT3.0智能对话技术全面解析
    利用百度大脑,快速搭建一个红酒识别的小程序
    百度大脑UNIT3.0详解之嵌入式对话理解技术
    人群流量监控,安全管理升级
    python globals函数
    python reduce/map/filter函数区别
  • 原文地址:https://www.cnblogs.com/jijm123/p/7858106.html
Copyright © 2011-2022 走看看