解决方案 »

  1.   

    主窗体create时连接服务器,登录窗体验证,然后主窗体show
      

  2.   


    我也是这个意思,不过登录窗体内向服务器发送数据要用到主窗体的socket吧,这个要怎么引用呢,不想将主窗体指针传进去
      

  3.   

    可以在主窗体的oncreate 或 afterconstruction事件中连接服务器,登录验证。这个时候主窗体已经创建了,clientsocket可以用,只是没有显示出来而已。如果主窗体是系统的mainform,也可以用Applicaiton.Mainform引用。
      

  4.   

    恩,你说的不错,感觉可行,在登录窗体中调用socket向服务器发送数据,不过,服务器返回的登录结果会在主窗体的socket读事件里,如果失败,是要在这个事件里再次调用登录窗体么?不好意思,搞的太糊涂了,请指教
      

  5.   

    你可以新建个  Data Module ,在新建的 NEW页,有个窗体给你放控件,且没有显示的窗口。clientsocket放这里。
    Project  项目文件里把创建Data Module的那行移动到  Application.Initialize下的第一行。
    然后你在登录页和首页里都引用它,就都可以使用Data Module里的clientsocket控件了。或者随便写个类,在类里用代码申明和初始化clientsocket类,在 Application.Initialize下对这个类进行初始化
    或者直接在类里用initialization  初始化和finalization 释放。要用的窗口直接引用就行了。又或者登录窗口和主窗口用两个clientsocket ,各不相干。
    第一种方法最简单,拖控件的,代码写的,什么都全都可以放里面放。
      

  6.   

    没看仔细。你还要在登录窗体得到返回,那么可以用第三个方法,或者用函数指针。把登录窗体里的函数传递给  Data Module ,让 Data Module 里的 clientsocket 收到消息后调用。TPFunction = procedure(Str: String) of object;
      

  7.   

    恩,你说的不错,感觉可行,在登录窗体中调用socket向服务器发送数据,不过,服务器返回的登录结果会在主窗体的socket读事件里,如果失败,是要在这个事件里再次调用登录窗体么?不好意思,搞的太糊涂了,请指教这个要看你自己的设计思路了,一般登录失败会在登陆窗口中反馈给用户,提示是密码错还是用户名不存在,登录成功后才关闭登录窗口。
    可能你需要在登录窗口中引用clientsocket,有四种方法:
    1 使用application.mainform获得主窗体的引用,不过这个引用是TForm类型的。你要再把引用强制类型转换实际的主窗体类型,就可以取得clientsocket。
    2 在主窗体的oncreate或afterconstructor事件中创建登陆窗体时,把主窗体本身(self)作为传入的owner参数,这样在登录窗体中用owner属性就可以访问到主窗体了,下一步就和 1 一样。
    3 像8楼说的那样,预先创建一个包含clientsocket的datamodule,主窗体和登录窗体都引用它。
    4 以上的方法都要在登录窗体单元引用其他的单元(主窗体单元或datamodule单元),耦合度较高。要避免这个问题可以这样做:重载登录窗体的constructor,再多加个参数,这样新constructor就变成了create(owner: TComponent; skt:TClientSocket);
    主窗体创建登录窗体时用这个新的构造方法,把主窗体的clientsocket作为第二个参数传进去,在新构造方法中把传入的skt保存到一个私有的变量中就可以多次使用了。
      

  8.   

    恩,你说的不错,感觉可行,在登录窗体中调用socket向服务器发送数据,不过,服务器返回的登录结果会在主窗体的socket读事件里,如果失败,是要在这个事件里再次调用登录窗体么?不好意思,搞的太糊涂了,请指教这个要看你自己的设计思路了,一般登录失败会在登陆窗口中反馈给用户,提示是密码错还是用户名不存在,登录成功后才关闭登录窗口。
    可能你需要在登录窗口中引用clientsocket,有四种方法:
    1 使用application.mainform获得主窗体的引用,不过这个引用是TForm类型的。你要再把引用强制类型转换实际的主窗体类型,就可以取得clientsocket。
    2 在主窗体的oncreate或afterconstructor事件中创建登陆窗体时,把主窗体本身(self)作为传入的owner参数,这样在登录窗体中用owner属性就可以访问到主窗体了,下一步就和 1 一样。
    3 像8楼说的那样,预先创建一个包含clientsocket的datamodule,主窗体和登录窗体都引用它。
    4 以上的方法都要在登录窗体单元引用其他的单元(主窗体单元或datamodule单元),耦合度较高。要避免这个问题可以这样做:重载登录窗体的constructor,再多加个参数,这样新constructor就变成了create(owner: TComponent; skt:TClientSocket);
    主窗体创建登录窗体时用这个新的构造方法,把主窗体的clientsocket作为第二个参数传进去,在新构造方法中把传入的skt保存到一个私有的变量中就可以多次使用了。
    恩恩,谢谢回答,很相信,好了结贴散分