zoukankan      html  css  js  c++  java
  • uniGUI试用笔记(一)

    uniGUI试用笔记(一)

     

    通过向导创建一个uniGUI应用服务器,工程中有三个文件:

    TUniServerModule = class(TUniGUIServerModule)
    
    TUniMainModule = class(TUniGUIMainModule)
    
    TMainForm = class(TUniForm)

    (1)采用了单例模式,所有客户端共用一个TUniServerModule实例对象,从下面代码可以看出:

    复制代码
    function UniServerModule: TUniServerModule;
    
     implementation
    
     {$R *.dfm}
    
     uses
      UniGUIVars;
    
    function UniServerModule: TUniServerModule;
    begin
      Result:=TUniServerModule(UniGUIServerInstance);
    end;
    
    initialization
    RegisterServerModuleClass(TUniServerModule);
    复制代码

    用全局变量UniGUIServerInstance实现了唯一化的TUniServerModule实例对象,可以视同为全局控制对象,将一些需要唯一化的对象构建在TUniGUIServerModule类中,比如可以考虑构建数据库连接池,如果有必要也可以构建对象池。

    (2)每个客户端连接后,系统创建了一个TUniMainModule对象,用于支撑和管理每个客户端连接,实现机理由于没有源码还暂时看不出,其实例的获取代码如下:

    复制代码
    function UniMainModule: TUniMainModule;
    
    implementation
    
    {$R *.dfm}
    
    uses
      UniGUIVars, ServerModule, uniGUIApplication;
    
    function UniMainModule: TUniMainModule;
    begin
      Result := TUniMainModule(UniApplication.UniMainModule)
    end;
    复制代码

    通过全局变量UniApplication的属性UniMainModule实现对TUniMainModule实例对象的调用,如何区分不同客户端连接的还不清楚。类的注册代码如下:

    initialization
      RegisterMainModuleClass(TUniMainModule);

    TUniGUIMainModule实例视同每个连接的控制对象,可以将数据库连接和数据集放在该类中,如果数据集非常多,也可以考虑动态创建多个TDataModule,并由TUniGUIMainModule实例进行管理和维护。如果是三层结构,则TSQLConnection也应放在这个Module中。

    (3)主窗体是一个TUniForm类,且是一个Application构建的窗体,通过注册实现,如下:

    复制代码
    function MainForm: TMainForm;
    
    implementation
    
    {$R *.dfm}
    
    uses
      uniGUIVars, MainModule, uniGUIApplication;
    
    function MainForm: TMainForm;
    begin
      Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
    end;
    复制代码

    通过以下代码进行注册

    initialization
      RegisterAppFormClass(TMainForm);

    所有Application构建窗体都是通过上述方式实现,由Application控制其生命周期。也可以自定义Free窗体,自己控制窗体的创建和释放。

    总之,可以将TUniServerModule实例对象视作全局控制对象,TUniMainModule对象视作每个连接控制对象,第一个注册的TUniForm类Application窗体为主窗体。

    (4)对每个连接线程的访问可以通过UniServerModule.SessionManager.Sessions获取并作进一步处理,如下:

    复制代码
    procedure TUniMainModule.UniGUIMainModuleCreate(Sender: TObject);
    var
      I : Integer;
      ASessionList: TList;
      ASession : TUniGUISession;
    begin
      { 锁定列表 }
      ASessionList := UniServerModule.SessionManager.Sessions.SessionList.LockList;
    
      try
        { 访问每个线程 }
        for I := 0 to ASessionList.Count-1 do
        begin
          ASession := TUniGUISession(ASessionList[I]);
          if not ASession.IsTerminated then
            { 进行处理,如客户端地址 ASession.UniApplication.RemoteAddress }
        end;
      finally
        { 释放列表 }
        UniServerModule.SessionManager.Sessions.SessionList.UnlockList;
      end;
    end;
    复制代码

    也可以在TUniMainModule实例或TUniForm实例中直接访问当前线程对象,如:

    复制代码
    procedure TUniMainModule.UniGUIMainModuleDestroy(Sender: TObject);
    var
      strClientIP : String;
    begin
      strClientIP := UniSession.UniApplication.RemoteAddress;
      { 进一步处理 }
    end;
    复制代码
  • 相关阅读:
    工作态度
    SQL7.0有如下问题:视图字段未及时刷新
    遇到不讲交期的客户
    关于CashFiesta.com
    设置主机多IP技术失败
    已好的客户要建立VSS了
    MSSQL说日志已满
    特殊的四舍五入
    如何保证对帐不遗漏?
    Linux常用命令之其它类型命令汇总
  • 原文地址:https://www.cnblogs.com/yerongtian/p/11112489.html
Copyright © 2011-2022 走看看