unit uFactuGES_App; interface uses SysUtils, Classes, Forms, uUsuarios, uBizEmpresas, uControllerBase, uEmpresasController, JclFileUtils, uUsuariosController, uHostManager; type TDoLoadModulesEvent = procedure; TDoMainFormEvent = procedure; IAppSplashForm = interface ['{9905DF57-4476-42E6-A7CD-B1479A84E220}'] procedure Show; procedure Hide; procedure Update; function GetMensaje: String; procedure SetMensaje(const AMensaje : String); property Mensaje : String read GetMensaje write SetMensaje; end; IAppFactuGES = interface ['{FB6A0F3C-C1D1-462D-AFD4-2A368F85E920}'] function GetMainForm: TCustomForm; function GetEmpresasController: IEmpresasController; function GetUsuariosController: IUsuariosController; function GetAppName: String; function GetAppVersion: String; function GetUsuarioActivo: TUsuario; function GetEmpresaActiva: IBizEmpresa; function GetModuleManager : THostManager; function GetTerminated: Boolean; function GetLoadModulesEvent : TDoLoadModulesEvent; procedure SetLoadModulesEvent (ALoadModulesEvent : TDoLoadModulesEvent); function GetDoMainFormEvent : TDoMainFormEvent; procedure SetDoMainFormEvent (AMainFormEvent : TDoMainFormEvent); function GetAppSplashForm : IAppSplashForm; procedure SetAppSplashForm (AAppSplashForm : IAppSplashForm); procedure CambiarEmpresa(const AIDEmpresa : Integer); procedure ShowSplashForm; procedure HideSplashForm; procedure Run; procedure Terminate; property AppVersion : String read GetAppVersion; property AppName : String read GetAppName; property MainForm : TCustomForm read GetMainForm; property EmpresaActiva : IBizEmpresa read GetEmpresaActiva; property UsuarioActivo : TUsuario read GetUsuarioActivo; property EmpresasController : IEmpresasController read GetEmpresasController; property UsuariosController : IUsuariosController read GetUsuariosController; property AppSplashForm : IAppSplashForm read GetAppSplashForm write SetAppSplashForm; property ModuleManager : THostManager read GetModuleManager; property DoMainFormEvent : TDoMainFormEvent read GetDoMainFormEvent write SetDoMainFormEvent; property DoLoadModulesEvent : TDoLoadModulesEvent read GetLoadModulesEvent write SetLoadModulesEvent; property Terminated : Boolean read GetTerminated; end; TAppFactuGES = class(TInterfacedObject, IAppFactuGES) private FAppInfo : TJclFileVersionInfo; FEmpresasController : IEmpresasController; FUsuariosController: IUsuariosController; FEmpresaActiva: IBizEmpresa; FAppSplashForm : IAppSplashForm; FHostManager : THostManager; FTerminated : Boolean; FDoMainFormEvent: TDoMainFormEvent; FDoLoadModulesEvent: TDoMainFormEvent; function GetMainForm: TCustomForm; function GetEmpresasController: IEmpresasController; function GetUsuariosController: IUsuariosController; function GetAppName: String; function GetAppVersion: String; function GetUsuarioActivo: TUsuario; function GetEmpresaActiva: IBizEmpresa; function GetModuleManager : THostManager; function GetTerminated: Boolean; function GetLoadModulesEvent : TDoLoadModulesEvent; procedure SetLoadModulesEvent (ALoadModulesEvent : TDoLoadModulesEvent); function GetDoMainFormEvent : TDoMainFormEvent; procedure SetDoMainFormEvent (AMainFormEvent : TDoMainFormEvent); function GetAppSplashForm : IAppSplashForm; procedure SetAppSplashForm (AAppSplashForm : IAppSplashForm); procedure AfterLoadModule(Sender: TObject; AModuleInfo: TModuleInfo); procedure RegisterModule(AModuleInfo : TModuleInfo); protected procedure DoMainForm; procedure CargarModulos; procedure ShowSplashForm; procedure HideSplashForm; procedure UpdateSplashForm; public constructor Create; virtual; destructor Destroy; override; procedure Run; procedure Terminate; procedure CambiarEmpresa(const AIDEmpresa : Integer); property AppVersion : String read GetAppVersion; property AppName : String read GetAppName; property MainForm : TCustomForm read GetMainForm; property EmpresaActiva : IBizEmpresa read GetEmpresaActiva; property AppSplashForm : IAppSplashForm read GetAppSplashForm write SetAppSplashForm; property UsuarioActivo : TUsuario read GetUsuarioActivo; property EmpresasController : IEmpresasController read GetEmpresasController; property UsuariosController : IUsuariosController read GetUsuariosController; property ModuleManager : THostManager read GetModuleManager; property DoMainFormEvent : TDoMainFormEvent read GetDoMainFormEvent write SetDoMainFormEvent; property DoLoadModulesEvent : TDoLoadModulesEvent read GetLoadModulesEvent write SetLoadModulesEvent; property Terminated : Boolean read GetTerminated; end; var AppFactuGES : IAppFactuGES = nil; implementation uses Dialogs, cxControls, uUsuariosViewRegister, uEmpresasViewRegister; procedure TAppFactuGES.CambiarEmpresa(const AIDEmpresa: Integer); var Aux : IBizEmpresa; begin Aux := EmpresasController.Buscar(AIDEmpresa); if Assigned(Aux) then begin Aux.DataTable.Active := True; if not Aux.IsEmpty then FEmpresaActiva := Aux; end; end; procedure TAppFactuGES.CargarModulos; begin if not Assigned(FDoLoadModulesEvent) then raise Exception.Create('Evento para la carga de los módulos de la aplicación no asignado (CargarModulos)'); FDoLoadModulesEvent(); end; constructor TAppFactuGES.Create; begin FTerminated := False; FDoMainFormEvent := NIL; FDoLoadModulesEvent := NIL; FAppSplashForm := NIL; FEmpresaActiva := NIL; FUsuariosController := NIL; // Se crea la primera vez que se usa FEmpresasController := NIL; // Se crea la primera vez que se usa FAppInfo := TJclFileVersionInfo.Create(Application.ExeName); FHostManager := THostManager.Create(NIL); with FHostManager do begin OnAfterLoad := AfterLoadModule; // Ruta por defecto de los módulos BPLPath := ExtractFilePath(Application.ExeName) + '\'; end; end; destructor TAppFactuGES.Destroy; begin FAppSplashForm := NIL; FHostManager.UnloadModules; FreeAndNIL(FHostManager); FEmpresaActiva := NIL; FUsuariosController := NIL; FEmpresasController := NIL; FreeAndNIL(FAppInfo); inherited; end; procedure TAppFactuGES.DoMainForm; begin if not Assigned(FDoMainFormEvent) then raise Exception.Create('Evento para la creación del formulario principal no asignado (DoMainForm)'); FDoMainFormEvent(); end; function TAppFactuGES.GetMainForm: TCustomForm; begin Result := Application.MainForm; end; function TAppFactuGES.GetDoMainFormEvent: TDoMainFormEvent; begin Result := FDoMainFormEvent; end; function TAppFactuGES.GetAppName: String; begin Result := FAppInfo.ProductName; end; function TAppFactuGES.GetAppSplashForm: IAppSplashForm; begin Result := FAppSplashForm; end; function TAppFactuGES.GetAppVersion: String; begin Result := FAppInfo.ProductVersion; end; function TAppFactuGES.GetEmpresaActiva: IBizEmpresa; begin Result := FEmpresaActiva; end; function TAppFactuGES.GetEmpresasController: IEmpresasController; begin if not Assigned(FEmpresasController) then FEmpresasController := TEmpresasController.Create; Result := FEmpresasController; end; function TAppFactuGES.GetLoadModulesEvent: TDoLoadModulesEvent; begin Result := FDoLoadModulesEvent; end; function TAppFactuGES.GetModuleManager: THostManager; begin Result := FHostManager; end; function TAppFactuGES.GetTerminated: Boolean; begin Result := FTerminated; end; function TAppFactuGES.GetUsuarioActivo: TUsuario; begin Result := UsuariosController.CurrentUser; end; function TAppFactuGES.GetUsuariosController: IUsuariosController; begin if not Assigned(FUsuariosController) then FUsuariosController := TUsuariosController.Create; Result := FUsuariosController; end; procedure TAppFactuGES.HideSplashForm; begin if not Assigned(FAppSplashForm) then raise Exception.Create('AppSplashForm no asignado (HideSplashForm)'); FAppSplashForm.Hide; end; procedure TAppFactuGES.AfterLoadModule(Sender: TObject; AModuleInfo: TModuleInfo); begin RegisterModule(AModuleInfo); end; procedure TAppFactuGES.RegisterModule(AModuleInfo: TModuleInfo); begin AppSplashForm.Mensaje := 'Cargando ''' + AModuleInfo.Module.ModuleName + '''...'; end; procedure TAppFactuGES.Run; begin if UsuariosController.StartLogin then begin ShowHourglassCursor; try //ShowSplashForm; CargarModulos; DoMainForm; finally HideHourglassCursor; HideSplashForm; end; //InicializarUI; //Application.ProcessMessages; //Visible := True; //AplicarPerfil; // Application.CreateForm(); end; Application.Run; Terminate; end; procedure TAppFactuGES.SetDoMainFormEvent( AMainFormEvent: TDoMainFormEvent); begin FDoMainFormEvent := AMainFormEvent; end; procedure TAppFactuGES.SetAppSplashForm(AAppSplashForm: IAppSplashForm); begin FAppSplashForm := AAppSplashForm; end; procedure TAppFactuGES.SetLoadModulesEvent( ALoadModulesEvent: TDoLoadModulesEvent); begin FDoLoadModulesEvent := ALoadModulesEvent; end; procedure TAppFactuGES.ShowSplashForm; begin if not Assigned(FAppSplashForm) then raise Exception.Create('AppSplashForm no asignado (ShowSplashForm)'); FAppSplashForm.Show; FAppSplashForm.Update; end; procedure TAppFactuGES.Terminate; begin ModuleManager.UnloadModules; FTerminated := True; end; procedure TAppFactuGES.UpdateSplashForm; begin FAppSplashForm.Update; end; initialization // Pongo esto aquí por ahora uUsuariosViewRegister.RegisterViews; uEmpresasViewRegister.RegisterViews; finalization // Pongo esto aquí por ahora AppFactuGES := NIL; uUsuariosViewRegister.UnregisterViews; uEmpresasViewRegister.UnregisterViews; end.