Classe com vazamento de memória
Olá pessoal!
Uma classe que é rodada em todas as telas de cadastro do meu sistema.
Ela serve para verificar se o usuário fez alguma alteração no cadastro, mas fazendo uns testes no EurekaLog, recebi um log de vazamento de memoria no momento que eu crio o objeto, na procedure carregar e na função Houve mudança.
A questão é: está funcionando direitinho, do jeito que eu preciso, mas gostaria de resolver esses problemas. Então segue abaixo a classe que eu criei e alguns trechos de como eu estou utilizando:
//CLASSE
Uma classe que é rodada em todas as telas de cadastro do meu sistema.
Ela serve para verificar se o usuário fez alguma alteração no cadastro, mas fazendo uns testes no EurekaLog, recebi um log de vazamento de memoria no momento que eu crio o objeto, na procedure carregar e na função Houve mudança.
A questão é: está funcionando direitinho, do jeito que eu preciso, mas gostaria de resolver esses problemas. Então segue abaixo a classe que eu criei e alguns trechos de como eu estou utilizando:
//CLASSE
TVerificaAlteracao = class
private
FAOwner: TComponent;
FValor : array of String;
function GetValor(Index: Integer): String;
procedure SetValor(Index: Integer; const Value: String);
property Valor[Index: Integer]: String read GetValor write SetValor;
public
procedure Carregar;
function HouveMudanca: Boolean;
published
constructor Create(AOwner: TComponent);
destructor Destroy; override;
end;
{ TVerificaAlteracao }
procedure TVerificaAlteracao.Carregar;
var i: Integer;
begin
with FAOwner do
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TEdit then
SetValor(i, TEdit(Components[i]).Text)
else
if Components[i] is TMaskEdit then
SetValor(i, TMaskEdit(Components[i]).Text)
else
if Components[i] is TDateEdit then
SetValor(i, TDateEdit(Components[i]).Text)
else
if Components[i] is TComboBox then
SetValor(i, TComboBox(Components[i]).Text)
else
if Components[i] is TCheckBox then
SetValor(i, BoolToStr(TCheckBox(Components[i]).Checked))
else
if Components[i] is TCurrencyEdit then
SetValor(i, TCurrencyEdit(Components[i]).Text);
end;
end;
end;
function TVerificaAlteracao.HouveMudanca: Boolean;
var i: Integer;
begin
Result := False;
with FAOwner do
begin
for i := 0 to ComponentCount - 1 do
begin
if Components[i] is TEdit then
Result := GetValor(i) <> TEdit(Components[i]).Text
else
if Components[i] is TMaskEdit then
Result := GetValor(i) <> TMaskEdit(Components[i]).Text
else
if Components[i] is TDateEdit then
Result := GetValor(i) <> TDateEdit(Components[i]).Text
else
if Components[i] is TComboBox then
Result := GetValor(i) <> TComboBox(Components[i]).Text
else
if Components[i] is TCheckBox then
Result := GetValor(i) <> BoolToStr(TCheckBox(Components[i]).Checked)
else
if Components[i] is TCurrencyEdit then
Result := GetValor(i) <> TCurrencyEdit(Components[i]).Text;
if Result then
Exit;
end;
end;
end;
constructor TVerificaAlteracao.Create(AOwner: TComponent);
begin
FAOwner := AOwner;
SetLength(FValor,FAOwner.ComponentCount+1);
end;
destructor TVerificaAlteracao.Destroy;
begin
inherited;
end;
function TVerificaAlteracao.GetValor(Index: Integer): String;
begin
Result:= FValor[Index];
end;
procedure TVerificaAlteracao.SetValor(Index: Integer; const Value: String);
begin
FValor[Index] := Value;
end;
Na tela cadastro de produto
private
{ Private declarations }
VerificaCadastro: TVerificaAlteracao;
Na procedure caregarProduto
. . . VerificaCadastro.Carregar; actGravar.Enabled := VerificaCadastro.HouveMudanca; end;
No create do formulario
procedure TFrm_CadProduto.FormCreate(Sender: TObject); begin inherited; VerificaCadastro := TVerificaAlteracao.Create(Self);
Vagner Almeida
Curtidas 0
Respostas
Vagner Almeida
23/05/2014
Agradeço desde já qualquer ajuda
GOSTEI 0
Vagner Almeida
23/05/2014
Ninguém!!!
GOSTEI 0