Classe com vazamento de memória

Delphi

23/05/2014

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
 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

Vagner Almeida

Curtidas 0

Respostas

Vagner Almeida

Vagner Almeida

23/05/2014

Agradeço desde já qualquer ajuda
GOSTEI 0
Vagner Almeida

Vagner Almeida

23/05/2014

Ninguém!!!
GOSTEI 0
POSTAR