Correções que eu fiz:
Metodo: ActionEsqueceuSenha(Sender: TObject);
Faltou liberar a variável “FDataPer”.
Ficou assim:
procedure TUserControl.ActionEsqueceuSenha(Sender: TObject);
var
FDataset, FDataPer: TDataSet;
begin
FDataset := DataConnector.UCGetSQLDataset(‘Select * from ‘ +
TableUsers.TableName + ‘ Where ‘ + TableUsers.FieldLogin + ‘ = ‘ +
QuotedStr(TfrmLoginWindow(FFormLogin).EditUsuario.Text));
FDataPer := DataConnector.UCGetSQLDataset(‘select ‘ + TableUsers.FieldUserName
+ ‘ from ‘ + TableUsers.TableName + ‘ Where ‘ + TableUsers.FieldUserID +
‘ = ‘ + FDataset.FieldByName(TableUsers.FieldProfile).AsString);
try
if not FDataset.IsEmpty then
MailUserControl.EnviaEsqueceuSenha
(FDataset.FieldByName(TableUsers.FieldUserID).AsInteger,
FDataset.FieldByName(TableUsers.FieldUserName).AsString,
FDataset.FieldByName(TableUsers.FieldLogin).AsString,
FDataset.FieldByName(TableUsers.FieldPassword).AsString,
FDataset.FieldByName(TableUsers.FieldEmail).AsString,
FDataPer.FieldByName(TableUsers.FieldUserName).AsString)
// EncryptKey)
else
MessageDlg(UserSettings.CommonMessages.InvalidLogin, mtWarning,
[mbOK], 0);
finally
FDataset.Close;
FDataPer.Close;
SysUtils.FreeAndNil(FDataset);
SysUtils.FreeAndNil(FDataPer);
end;
end;
—
Metodo: GetAllUsers(Names: Boolean): TStringList;
Faltou liberar a variável “FDataset” e não estava controlando a destruição do TStringList (redefini o método).
Ficou assim:
function TUserControl.GetAllUsers(Names: Boolean): TStringList;
Var
FDataset: TDataSet;
LStringList: TStringList;
begin
LStringList := TStringList.Create;
try
if Names then
FDataset := DataConnector.UCGetSQLDataset
(‘Select ‘ + TableUsers.FieldUserName + ‘ from ‘ + TableUsers.TableName +
‘ Where ‘ + TableUsers.FieldTypeRec + ‘ = ‘ + QuotedStr(‘U’) +
‘ order by ‘ + TableUsers.FieldUserName)
else
FDataset := DataConnector.UCGetSQLDataset(‘Select ‘ + TableUsers.FieldLogin
+ ‘ from ‘ + TableUsers.TableName + ‘ Where ‘ + TableUsers.FieldTypeRec +
‘ = ‘ + QuotedStr(‘U’) + ‘ order by ‘ + TableUsers.FieldUserName);
if not FDataset.IsEmpty then
begin
FDataset.First;
while not FDataset.Eof do
begin
LStringList.Add(FDataset.Fields[0].AsString);
FDataset.Next;
end;
end;
Result := LStringList;
finally
FDataset.Close;
SysUtils.FreeAndNil(FDataset);
SysUtils.FreeAndNil(LStringList);
end;
end;
—
Metodo TUserControl.RegistraCurrentUser(Dados: TDataSet; Pass: String) estava com vazamento de memória ao utilizar os métodos PerfilUsuario e PerfilGrupo (TDataset’s do TUCCurrentUser).
Criei dois métodos no TUCCurrentUser, o SetPerfilUsuario e SetPerfilGrupo.
A classe TUCCurrentUser ficou assim:
TUCCurrentUser = class(TComponent)
private
FPerfilUsuario: TDataSet;
FPerfilGrupo: TDataSet;
procedure SetPerfilUsuario(const Value: TDataSet);
procedure SetPerfilGrupo(const Value: TDataSet);
public
UserID: Integer;
Profile: Integer;
UserIDOld: Integer;
IdLogon: String;
ProfileName: String;
UserName: String;
UserLogin: String;
Password: String;
PassLivre: String;
Email: String;
DateExpiration: TDateTime;
Privileged: Boolean;
UserNotExpired: Boolean;
UserDaysExpired: Integer;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property PerfilUsuario: TDataSet read FPerfilUsuario write SetPerfilUsuario;
// Cadastro de Usuarios
property PerfilGrupo: TDataSet read FPerfilGrupo write SetPerfilGrupo;
// Cadastro de Perfil
end;
A implementação da classe ficou assim:
{ TUCCurrentUser }
constructor TUCCurrentUser.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
destructor TUCCurrentUser.Destroy;
begin
if Assigned(FPerfilUsuario) then
SysUtils.FreeAndNil(FPerfilUsuario);
if Assigned(FPerfilGrupo) then
SysUtils.FreeAndNil(FPerfilGrupo);
inherited;
end;
procedure TUCCurrentUser.SetPerfilUsuario(const Value: TDataSet);
begin
if Assigned(FPerfilUsuario) then
SysUtils.FreeAndNil(FPerfilUsuario);
FPerfilUsuario := Value;
end;
procedure TUCCurrentUser.SetPerfilGrupo(const Value: TDataSet);
begin
if Assigned(FPerfilGrupo) then
SysUtils.FreeAndNil(FPerfilGrupo);
FPerfilGrupo := Value;
end;
Devido a implementação da classe TUCCurrentUser acima o método TUserControl.RegistraCurrentUser(Dados: TDataSet; Pass: String) ficou assim:
procedure TUserControl.RegistraCurrentUser(Dados: TDataSet; Pass: String);
var
SQLstmt: String;
begin
with CurrentUser do
begin
UserID := Dados.FieldByName(TableUsers.FieldUserID).AsInteger;
UserName := Dados.FieldByName(TableUsers.FieldUserName).AsString;
UserLogin := Dados.FieldByName(TableUsers.FieldLogin).AsString;
DateExpiration := StrToDateDef
(Dados.FieldByName(TableUsers.FieldDateExpired).AsString, now);
UserNotExpired := Dados.FieldByName(TableUsers.FieldUserExpired)
.AsInteger = -1;
UserDaysExpired := Dados.FieldByName(TableUsers.FieldUserDaysSun).AsInteger;
PassLivre := Pass;
case Self.Criptografia of
cPadrao:
Password := Decrypt(Dados.FieldByName(TableUsers.FieldPassword)
.AsString, EncryptKey);
cMD5:
Password := Dados.FieldByName(TableUsers.FieldPassword).AsString;
end;
Email := Dados.FieldByName(TableUsers.FieldEmail).AsString;
Privileged := StrToBool(Dados.FieldByName(TableUsers.FieldPrivileged)
.AsString);
Profile := Dados.FieldByName(TableUsers.FieldProfile).AsInteger;
SQLstmt := Format(‘SELECT %s AS ObjName,’ + ‘ %s AS UCKey,’ +
‘ %s AS UserID’ + ‘ FROM %s’ + ‘ WHERE %s = %s AND %s = %s’,
[TableRights.FieldComponentName, TableRights.FieldKey,
TableRights.FieldUserID, TableRights.TableName, TableRights.FieldUserID,
IntToStr(UserID), TableRights.FieldModule, QuotedStr(ApplicationID)]);
PerfilUsuario := DataConnector.UCGetSQLDataset(SQLstmt);
// Aplica Permissoes do Perfil do usuario
if CurrentUser.Profile > 0 then
begin
// Obtem o nome do Perfil do usuario
SQLStmt := ‘SELECT * FROM ‘ + TableUsers.TableName + ‘ WHERE ‘ +
TableUsers.FieldUserID + ‘ = ‘ + IntToStr(CurrentUser.Profile);
PerfilGrupo := DataConnector.UCGetSQLDataset(SQLStmt);
CurrentUser.ProfileName := PerfilGrupo.FieldByName(TableUsers.FieldUserName).AsString;
SQLstmt := Format(‘SELECT %s AS ObjName,’ + ‘ %s AS UCKey,’ +
‘ %s AS UserID’ + ‘ FROM %s’ + ‘ WHERE %s = %s AND %s = %s’,
[TableRights.FieldComponentName, TableRights.FieldKey,
TableRights.FieldUserID, TableRights.TableName, TableRights.FieldUserID,
IntToStr(CurrentUser.Profile), TableRights.FieldModule,
QuotedStr(ApplicationID)]);
PerfilGrupo := DataConnector.UCGetSQLDataset(SQLstmt);
end;
if Assigned(OnLoginSucess) then
OnLoginSucess(Self, UserID, UserLogin, UserName, Password, Email,
Privileged);
end;
if (CurrentUser.UserID <> 0) then
UsersLogged.AddCurrentUser;
ApplyRightsUCControlMonitor;
NotificationLoginMonitor;
if ((FLogin.fDateExpireActive = True) and (Date > CurrentUser.DateExpiration)
and (CurrentUser.UserNotExpired = False)) then
begin
MessageDlg(UserSettings.CommonMessages.PasswordExpired, mtInformation,
[mbOK], 0);
if FFormTrocarSenha = nil then
CriaFormTrocarSenha;
TTrocaSenha(FFormTrocarSenha).ForcarTroca := True;
FFormTrocarSenha.ShowModal;
FreeAndNil(FFormTrocarSenha);
{ Incrementa a Data de Expiração em x dias após a troca de senha }
CurrentUser.DateExpiration := CurrentUser.DateExpiration +
CurrentUser.UserDaysExpired;
end;
end;
Estou a disposição para ajudar e aberto a correções caso tenha cometido algum erro.
Abraços…