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类中,好比能够考虑构建数据库链接池,若是有必要也能够构建对象池。spa

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

function UniMainModule: TUniMainModule;

implementation

{$R *.dfm}

uses
  UniGUIVars, ServerModule, uniGUIApplication;

function UniMainModule: TUniMainModule;
begin
  Result := TUniMainModule(UniApplication.UniMainModule)
end;

 

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

initialization
  RegisterMainModuleClass(TUniMainModule);

TUniGUIMainModule实例视同每一个链接的控制对象,能够将数据库链接和数据集放在该类中,若是数据集很是多,也能够考虑动态建立多个TDataModule,并由TUniGUIMainModule实例进行管理和维护。若是是三层结构,则TSQLConnection也应放在这个Module中。orm

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

function MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  uniGUIVars, MainModule, uniGUIApplication;

function MainForm: TMainForm;
begin
  Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;

经过如下代码进行注册blog

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;
相关文章
相关标签/搜索