uniGUI試用ノート(一)
7317 ワード
ウィザードを使用してuniGUIアプリケーションサーバを作成します.プロジェクトには3つのファイルがあります.
(1)TuniServerModuleインスタンスオブジェクトを共有する単一のモードを採用しており、以下のコードから分かるように、
グローバル変数UniGUIServerInstanceで一意化されたTuniServerModuleインスタンスオブジェクトは、同じグローバル制御オブジェクトと見なすことができ、必要に応じてオブジェクトプールを構築するなど、TuniGUIServerModuleクラスに一意化が必要なオブジェクトを構築することができます.
(2)各クライアント接続後、システムはTUNiMainModuleオブジェクトを作成し、各クライアント接続をサポートし、管理する.実現メカニズムはソースコードがないため、まだしばらく見えない.そのインスタンスの取得コードは以下の通りである.
グローバル変数UniApplicationの属性UniMainModuleによるTUNiMainModuleインスタンスオブジェクトの呼び出しは、異なるクライアント接続をどのように区別するかは不明です.クラスの登録コードは次のとおりです.
TuniGUIMainmoduleインスタンスは、各接続の制御オブジェクトとみなされ、データベース接続とデータセットをクラスに配置できます.データセットが非常に多い場合は、複数のTDataModuleを動的に作成し、TuniGUIMainmoduleインスタンスによって管理およびメンテナンスすることも考えられます.三層構造であればTSQLConnectionもこのModuleに入れるべきです.
(3)メインフォームはTUNIFormクラスであり、アプリケーションによって構築されたフォームであり、登録によって以下のように実現される.
以下のコードで登録する
すべてのアプリケーション構築フォームは、上記の方法で実現され、アプリケーションによってライフサイクルが制御されます.また、Freeフォームをカスタマイズして、フォームの作成と解放を自分で制御することもできます.
つまり、TUNiServer Moduleインスタンスオブジェクトをグローバル制御オブジェクトと見なし、TUNiMainModuleオブジェクトを各接続制御オブジェクトと見なし、最初に登録されたTUNiFormクラスApplicationフォームをメインフォームとすることができます.
(4)各接続スレッドへのアクセスはUniServerModule.SessionManager.Sessionsは次のように取得し、さらに処理します.
現在のスレッドオブジェクトには、TUNiMainModuleインスタンスまたはTUNiFormインスタンスで直接アクセスすることもできます.たとえば、次のようになります.
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クラスであり、アプリケーションによって構築されたフォームであり、登録によって以下のように実現される.
function MainForm: TMainForm;
implementation
{$R *.dfm}
uses
uniGUIVars, MainModule, uniGUIApplication;
function MainForm: TMainForm;
begin
Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;
以下のコードで登録する
initialization
RegisterAppFormClass(TMainForm);
すべてのアプリケーション構築フォームは、上記の方法で実現され、アプリケーションによってライフサイクルが制御されます.また、Freeフォームをカスタマイズして、フォームの作成と解放を自分で制御することもできます.
つまり、TUNiServer Moduleインスタンスオブジェクトをグローバル制御オブジェクトと見なし、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;