2007-10-03 16:03:28 +00:00
|
|
|
|
unit uUsuariosController;
|
|
|
|
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uses
|
2007-10-08 07:58:40 +00:00
|
|
|
|
Classes, SysUtils, Forms, uDADataTable, uControllerBase,
|
2007-10-03 16:03:28 +00:00
|
|
|
|
uIDataModuleUsuarios, uDataModuleUsuarios, UCBase;
|
|
|
|
|
|
|
|
|
|
|
|
type
|
2007-10-08 07:58:40 +00:00
|
|
|
|
IUsuariosController = interface(IControllerBase)
|
2007-10-03 16:03:28 +00:00
|
|
|
|
['{DD963EEC-5880-4DE7-AF55-B5080B538D84}']
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
procedure Logoff;
|
|
|
|
|
|
function StartLogin : Boolean;
|
2007-10-03 16:03:28 +00:00
|
|
|
|
procedure ShowUserManager;
|
|
|
|
|
|
procedure ShowProfileManager;
|
|
|
|
|
|
procedure ShowLogManager;
|
|
|
|
|
|
procedure ShowChangePassword;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
function ComprobarUsuario(const User : String; const Password: String): Boolean;
|
|
|
|
|
|
|
|
|
|
|
|
function GetMaxIntentosLogin: Integer;
|
|
|
|
|
|
procedure SetMaxIntentosLogin(const Value: Integer);
|
|
|
|
|
|
property MaxIntentosLogin : Integer read GetMaxIntentosLogin write SetMaxIntentosLogin;
|
|
|
|
|
|
|
|
|
|
|
|
{ procedure ChangeUser(IDUser: Integer; Login, Name, Mail: String; Profile,UserExpired,UserDaysSun: Integer; PrivUser: Boolean);
|
2007-10-03 16:03:28 +00:00
|
|
|
|
procedure ChangePassword(IDUser: Integer; NewPassword: String);
|
|
|
|
|
|
procedure AddRight(idUser: Integer; ItemRight: TObject; FullPath: Boolean = True); overload;
|
|
|
|
|
|
procedure AddRight(idUser: Integer; ItemRight: String); overload;
|
|
|
|
|
|
procedure AddRightEX(idUser: Integer; Module, FormName, ObjName: String);
|
|
|
|
|
|
function VerificaLogin(User, Password: String): Boolean;
|
|
|
|
|
|
function GetLocalUserName: String;
|
|
|
|
|
|
function GetLocalComputerName: String;
|
|
|
|
|
|
function AddUser(Login, Password, Name, Mail: String; Profile , UserExpired , DaysExpired : Integer; PrivUser: Boolean): Integer;
|
|
|
|
|
|
function ExisteUsuario(Login: String): Boolean;
|
|
|
|
|
|
property CurrentUser: TUCCurrentUser read FCurrentUser write FCurrentUser;
|
|
|
|
|
|
property CurrentEmpresa : TEmpresaDef read FEmpresaAtual write FEmpresaAtual;
|
|
|
|
|
|
property UserSettings: TUCUserSettings read FUserSettings write SetUserSettings;}
|
|
|
|
|
|
|
|
|
|
|
|
{ function BuscarTodos: IBizFormaPago;
|
|
|
|
|
|
function Buscar(ID: Integer): IBizFormaPago;
|
|
|
|
|
|
procedure VerTodos(AUsuarios: IBizFormaPago);
|
|
|
|
|
|
procedure Ver(AFormaPago: IBizFormaPago);
|
|
|
|
|
|
procedure Anadir(AFormaPago : IBizFormaPago);
|
|
|
|
|
|
function Eliminar(AFormaPago : IBizFormaPago): Boolean;
|
|
|
|
|
|
function Guardar(AFormaPago : IBizFormaPago): Boolean;
|
|
|
|
|
|
procedure DescartarCambios(AFormaPago : IBizFormaPago);
|
|
|
|
|
|
function Localizar(AUsuarios: IBizFormaPago; ADescripcion:String): Boolean;
|
|
|
|
|
|
function DarListaUsuarios: TStringList;}
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
TUsuariosController = class(TControllerBase, IUsuariosController)
|
2007-10-03 16:03:28 +00:00
|
|
|
|
protected
|
|
|
|
|
|
FDataModule : IDataModuleUsuarios;
|
|
|
|
|
|
FUserControl: TUserControl;
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
function GetMaxIntentosLogin: Integer;
|
|
|
|
|
|
procedure SetMaxIntentosLogin(const Value: Integer);
|
|
|
|
|
|
|
2007-10-03 16:03:28 +00:00
|
|
|
|
procedure RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable); override;
|
|
|
|
|
|
function CreateEditor(const AName : String; const IID: TGUID; out Intf): Boolean;
|
|
|
|
|
|
|
|
|
|
|
|
// function ValidarFormaPago(AFormaPago: IBizFormaPago): Boolean;
|
|
|
|
|
|
procedure AsignarDataModule;
|
|
|
|
|
|
procedure InicializarUserControl;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
procedure ComprobarUsuarioInicial;
|
|
|
|
|
|
|
|
|
|
|
|
procedure OnLoginForm(Sender: TObject; var CustomForm: TCustomForm);
|
2007-10-03 16:03:28 +00:00
|
|
|
|
public
|
|
|
|
|
|
constructor Create; virtual;
|
|
|
|
|
|
destructor Destroy; override;
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
procedure Logoff;
|
|
|
|
|
|
function StartLogin : Boolean;
|
|
|
|
|
|
procedure ShowUserManager;
|
|
|
|
|
|
procedure ShowProfileManager;
|
|
|
|
|
|
procedure ShowLogManager;
|
|
|
|
|
|
procedure ShowChangePassword;
|
|
|
|
|
|
function ComprobarUsuario(const User : String; const Password: String): Boolean;
|
|
|
|
|
|
|
2007-10-03 16:03:28 +00:00
|
|
|
|
{ function Eliminar(AFormaPago : IBizFormaPago): Boolean;
|
|
|
|
|
|
function Guardar(AFormaPago : IBizFormaPago): Boolean; virtual;
|
|
|
|
|
|
procedure DescartarCambios(AFormaPago : IBizFormaPago); virtual;
|
|
|
|
|
|
procedure Anadir(AFormaPago : IBizFormaPago);
|
|
|
|
|
|
function BuscarTodos: IBizFormaPago;
|
|
|
|
|
|
function Buscar(ID: Integer): IBizFormaPago;
|
|
|
|
|
|
procedure VerTodos(AUsuarios: IBizFormaPago);
|
|
|
|
|
|
procedure Ver(AFormaPago: IBizFormaPago);
|
|
|
|
|
|
function Localizar(AUsuarios: IBizFormaPago; ADescripcion:String): Boolean;
|
|
|
|
|
|
function DarListaUsuarios: TStringList;}
|
|
|
|
|
|
property UserControl : TUserControl read FUserControl;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
property MaxIntentosLogin : Integer read GetMaxIntentosLogin write SetMaxIntentosLogin;
|
2007-10-03 16:03:28 +00:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
|
|
|
|
|
|
|
uses
|
|
|
|
|
|
cxControls, DB, uEditorRegistryUtils, schUsuariosClient_Intf,
|
|
|
|
|
|
uDAInterfaces, uDataTableUtils, uDialogUtils,
|
2007-10-08 07:58:40 +00:00
|
|
|
|
uDateUtils, uROTypes, DateUtils, Controls, Windows, uLoginForm, uIEditorLogin;
|
2007-10-03 16:03:28 +00:00
|
|
|
|
|
|
|
|
|
|
{ TUsuariosController }
|
|
|
|
|
|
|
|
|
|
|
|
{procedure TUsuariosController.Anadir(AFormaPago: IBizFormaPago);
|
|
|
|
|
|
begin
|
|
|
|
|
|
AFormaPago.Insert;
|
|
|
|
|
|
end;}
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.AsignarDataModule;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FDataModule := TDataModuleUsuarios.Create(Nil);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{function TUsuariosController.Buscar(ID: Integer): IBizFormaPago;
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
Result := BuscarTodos;
|
|
|
|
|
|
with Result.DataTable.Where do
|
|
|
|
|
|
begin
|
|
|
|
|
|
if NotEmpty then
|
|
|
|
|
|
AddOperator(opAND);
|
|
|
|
|
|
OpenBraket;
|
|
|
|
|
|
AddText(fld_UsuariosID + ' = ' + IntToStr(ID));
|
|
|
|
|
|
CloseBraket;
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TUsuariosController.BuscarTodos: IBizFormaPago;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FDataModule.GetItems;
|
|
|
|
|
|
end;}
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
function TUsuariosController.ComprobarUsuario(const User,
|
|
|
|
|
|
Password: String): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FUserControl.VerificaLogin(User, Password);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.ComprobarUsuarioInicial;
|
|
|
|
|
|
begin
|
|
|
|
|
|
// Para que haya un usuario siempre en la BD
|
|
|
|
|
|
if not FUserControl.ExisteUsuario('admin') then
|
|
|
|
|
|
FUserControl.AddUser('admin', '1', 'Administrador', 'admin@correo.net', 0, 0 , 30, True);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-10-03 16:03:28 +00:00
|
|
|
|
constructor TUsuariosController.Create;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AsignarDataModule;
|
|
|
|
|
|
FUserControl := TUserControl.Create(nil);
|
|
|
|
|
|
InicializarUserControl;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
ComprobarUsuarioInicial;
|
2007-10-03 16:03:28 +00:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TUsuariosController.CreateEditor(const AName: String; const IID: TGUID; out Intf): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := Supports(EditorRegistry.CreateEditor(AName), IID, Intf);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
function TUsuariosController.DarListaUsuarios: TStringList;
|
|
|
|
|
|
var
|
|
|
|
|
|
AUsuarios: IBizFormaPago;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AUsuarios := BuscarTodos;
|
|
|
|
|
|
AUsuarios.DataTable.Active := True;
|
|
|
|
|
|
Result := TStringList.Create;
|
|
|
|
|
|
try
|
|
|
|
|
|
with Result do
|
|
|
|
|
|
begin
|
|
|
|
|
|
AUsuarios.DataTable.First;
|
|
|
|
|
|
while not AUsuarios.DataTable.EOF do
|
|
|
|
|
|
begin
|
|
|
|
|
|
Add(AUsuarios.DESCRIPCION);
|
|
|
|
|
|
AUsuarios.DataTable.Next;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
|
|
|
|
|
AUsuarios := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.DescartarCambios(AFormaPago: IBizFormaPago);
|
|
|
|
|
|
begin
|
|
|
|
|
|
if not Assigned(AFormaPago) then
|
|
|
|
|
|
raise Exception.Create ('Forma de pago no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
if (AFormaPago.State in dsEditModes) then
|
|
|
|
|
|
AFormaPago.Cancel;
|
|
|
|
|
|
|
|
|
|
|
|
AFormaPago.DataTable.CancelUpdates;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
}
|
|
|
|
|
|
destructor TUsuariosController.Destroy;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FreeANDNIL(FUserControl);
|
|
|
|
|
|
FDataModule := NIL;
|
|
|
|
|
|
inherited;
|
|
|
|
|
|
end;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
function TUsuariosController.GetMaxIntentosLogin: Integer;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := FUserControl.Login.MaxLoginAttempts;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-10-03 16:03:28 +00:00
|
|
|
|
procedure TUsuariosController.InicializarUserControl;
|
|
|
|
|
|
begin
|
|
|
|
|
|
with FUserControl do
|
|
|
|
|
|
begin
|
|
|
|
|
|
AutoStart := False;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
Criptografia := cMD5;
|
|
|
|
|
|
OnCustomLoginForm := OnLoginForm;
|
2007-10-03 16:03:28 +00:00
|
|
|
|
end;
|
2007-10-08 07:58:40 +00:00
|
|
|
|
FDataModule.InicializarCamposUserControl(FUserControl);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.Logoff;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.Logoff;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.OnLoginForm(Sender: TObject;
|
|
|
|
|
|
var CustomForm: TCustomForm);
|
|
|
|
|
|
begin
|
|
|
|
|
|
CustomForm := TfLoginForm.Create(NIL);
|
2007-10-03 16:03:28 +00:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
function TUsuariosController.ValidarFormaPago(AFormaPago: IBizFormaPago): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(AFormaPago) then
|
|
|
|
|
|
raise Exception.Create ('Forma de pago no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
if (AFormaPago.DataTable.State in dsEditModes) then
|
|
|
|
|
|
AFormaPago.DataTable.Post;
|
|
|
|
|
|
|
|
|
|
|
|
if Length(AFormaPago.REFERENCIA) = 0 then
|
|
|
|
|
|
raise Exception.Create('Debe indicar una referencia para esta forma de pago.');
|
|
|
|
|
|
|
|
|
|
|
|
if Length(AFormaPago.DESCRIPCION) = 0 then
|
|
|
|
|
|
raise Exception.Create('Debe indicar una descripci<63>n para esta forma de pago.');
|
|
|
|
|
|
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.Ver(AFormaPago: IBizFormaPago);
|
|
|
|
|
|
var
|
|
|
|
|
|
AEditor : IEditorFormaPago;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
CreateEditor('EditorFormaPago', IEditorFormaPago, AEditor);
|
|
|
|
|
|
with AEditor do
|
|
|
|
|
|
FormaPago := AFormaPago;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
if Assigned(AEditor) then
|
|
|
|
|
|
try
|
|
|
|
|
|
AEditor.ShowModal;
|
|
|
|
|
|
AEditor.Release;
|
|
|
|
|
|
finally
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.VerTodos(AUsuarios: IBizFormaPago);
|
|
|
|
|
|
var
|
|
|
|
|
|
AEditor : IEditorUsuarios;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
CreateEditor('EditorUsuarios', IEditorUsuarios, AEditor);
|
|
|
|
|
|
with AEditor do
|
|
|
|
|
|
Usuarios := AUsuarios;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
if Assigned(AEditor) then
|
|
|
|
|
|
try
|
|
|
|
|
|
AEditor.ShowModal;
|
|
|
|
|
|
AEditor.Release;
|
|
|
|
|
|
finally
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TUsuariosController.Eliminar(AFormaPago: IBizFormaPago): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
|
|
|
|
|
|
if not Assigned(AFormaPago) then
|
|
|
|
|
|
raise Exception.Create ('Forma de pago no asignada');
|
|
|
|
|
|
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
if (AFormaPago.State in dsEditModes) then
|
|
|
|
|
|
AFormaPago.Cancel;
|
|
|
|
|
|
|
|
|
|
|
|
AFormaPago.Delete;
|
|
|
|
|
|
AFormaPago.DataTable.ApplyUpdates;
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;}
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.RecibirAviso(ASujeto: ISujeto; ADataTable: IDAStronglyTypedDataTable);
|
|
|
|
|
|
begin
|
|
|
|
|
|
inherited;
|
|
|
|
|
|
//
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-10-08 07:58:40 +00:00
|
|
|
|
procedure TUsuariosController.SetMaxIntentosLogin(const Value: Integer);
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.Login.MaxLoginAttempts := Value;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.ShowChangePassword;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.ShowChangePassword;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.ShowLogManager;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.ShowLogManager;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.ShowProfileManager;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.ShowProfileManager;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TUsuariosController.ShowUserManager;
|
|
|
|
|
|
begin
|
|
|
|
|
|
FUserControl.ShowUserManager;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TUsuariosController.StartLogin : Boolean;
|
|
|
|
|
|
var
|
|
|
|
|
|
AEditor : IEditorLogin;
|
|
|
|
|
|
begin
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
CreateEditor('EditorLogin', IEditorLogin, AEditor);
|
|
|
|
|
|
with AEditor do
|
|
|
|
|
|
Controller := Self;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
if Assigned(AEditor) then
|
|
|
|
|
|
try
|
|
|
|
|
|
Result := (AEditor.ShowModal = mrOk);
|
|
|
|
|
|
AEditor.Release;
|
|
|
|
|
|
finally
|
|
|
|
|
|
AEditor := NIL;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2007-10-03 16:03:28 +00:00
|
|
|
|
{function TUsuariosController.Guardar(AFormaPago: IBizFormaPago): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
|
|
|
|
|
|
if ValidarFormaPago(AFormaPago) then
|
|
|
|
|
|
begin
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
AFormaPago.DataTable.ApplyUpdates;
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function TUsuariosController.Localizar(AUsuarios: IBizFormaPago; ADescripcion: String): Boolean;
|
|
|
|
|
|
begin
|
|
|
|
|
|
Result := True;
|
|
|
|
|
|
ShowHourglassCursor;
|
|
|
|
|
|
try
|
|
|
|
|
|
with AUsuarios.DataTable do
|
|
|
|
|
|
begin
|
|
|
|
|
|
DisableControls;
|
|
|
|
|
|
First;
|
|
|
|
|
|
if not Locate(fld_UsuariosDESCRIPCION, ADescripcion, []) then
|
|
|
|
|
|
Result := False;
|
|
|
|
|
|
EnableControls;
|
|
|
|
|
|
end;
|
|
|
|
|
|
finally
|
|
|
|
|
|
HideHourglassCursor;
|
|
|
|
|
|
end;
|
|
|
|
|
|
end;}
|
|
|
|
|
|
|
|
|
|
|
|
end.
|