Aviso ao compilar ...
Olá amigos,
Alguém sabe por que o compilador gera este aviso na linha indicada e se há algum problema com o código abaixo ?
[Hint] unDM.pas(54): Value assigned to ´C´ never used
Parte do código:
var
C: TComponent;
begin
C := oForm.FindComponent(Item);
try
if (C <> nil) then
begin
...
end;
finally
C := nil; // Nessa linha aparece o [Hint]
end;
Obrigado.
Francisco.
Alguém sabe por que o compilador gera este aviso na linha indicada e se há algum problema com o código abaixo ?
[Hint] unDM.pas(54): Value assigned to ´C´ never used
Parte do código:
var
C: TComponent;
begin
C := oForm.FindComponent(Item);
try
if (C <> nil) then
begin
...
end;
finally
C := nil; // Nessa linha aparece o [Hint]
end;
Obrigado.
Francisco.
Francisco.riva1
Curtidas 0
Respostas
Marcosrocha
15/02/2008
O compilador acha que sua inicialização pode nunca ser utilizada, ou seja, C foi criada mas talvez não será usada.
Tente mover o C := oForm.FindComponent para dentro do try. É só isso... Dependendo da posição da inicialização da variável e do seu código, o Delphi estima que o valor associado a ela pode não ser usado, o que causaria desperdício de memória.
Tente mover o C := oForm.FindComponent para dentro do try. É só isso... Dependendo da posição da inicialização da variável e do seu código, o Delphi estima que o valor associado a ela pode não ser usado, o que causaria desperdício de memória.
GOSTEI 0
Massuda
15/02/2008
O compilador está avisando você que o valor nil que está sendo atribuído à variável C nunca é utilizado. Isso pode ser um erro de sua parte ou não.
Se estiver compilando com otimização de código ligada, com certeza essa linha será eliminada do código final.
Se estiver compilando com otimização de código ligada, com certeza essa linha será eliminada do código final.
GOSTEI 0
Francisco.riva1
15/02/2008
Olá Marcos, Massuda
Já tentei várias coisas (com relação a posição de criar a variável C e atribuir Nil a ela) nada funcionou e parece estar tudo certo!
Vocês conseguem ver alguma coisa errada nesta rotina ?
Vejam a rotina inteira:
var
C: TComponent;
begin
C := oForm.FindComponent(Item);
try
if (C <> nil) then
begin
// Configura itens do menu
if C is TMenuItem then
begin
if Permissao = ´S´ then
TMenuItem(C).Enabled := True
else
TMenuItem(C).Enabled := False;
end
else
// Configura outros objetos
begin
if Permissao = ´S´ then
TMostraProp(C).Enabled := True
else
TMostraProp(C).Enabled := False;
end;
end;
finally
C := nil;
end;
Já tentei várias coisas (com relação a posição de criar a variável C e atribuir Nil a ela) nada funcionou e parece estar tudo certo!
Vocês conseguem ver alguma coisa errada nesta rotina ?
Vejam a rotina inteira:
var
C: TComponent;
begin
C := oForm.FindComponent(Item);
try
if (C <> nil) then
begin
// Configura itens do menu
if C is TMenuItem then
begin
if Permissao = ´S´ then
TMenuItem(C).Enabled := True
else
TMenuItem(C).Enabled := False;
end
else
// Configura outros objetos
begin
if Permissao = ´S´ then
TMostraProp(C).Enabled := True
else
TMostraProp(C).Enabled := False;
end;
end;
finally
C := nil;
end;
GOSTEI 0
Massuda
15/02/2008
Não tem nada de errado. O compilador gera dois tipos de mensagens: erros e avisos. Erros são situações que impedem a geração de código. Avisos são situações que o compilador considera estranhas.
No seu caso, o aviso é gerado porque você atribui um valor à variável C mas depois disso não utiliza mais essa variável (que é o seu caso) ou atribui um novo valor à variável. O compilador avisa pois isso pode ser um erro (você esqueceu de continuar o código ou a atribuição está no lugar errado).
Para ´resolver´ o aviso, basta retirar a linha que atribui nil à C, já que ela é desnecessária.
No seu caso, o aviso é gerado porque você atribui um valor à variável C mas depois disso não utiliza mais essa variável (que é o seu caso) ou atribui um novo valor à variável. O compilador avisa pois isso pode ser um erro (você esqueceu de continuar o código ou a atribuição está no lugar errado).
Para ´resolver´ o aviso, basta retirar a linha que atribui nil à C, já que ela é desnecessária.
GOSTEI 0
Rodc
15/02/2008
FindComponent retorna um ponteiro para o componete. C é um ponteiro para o componente que FindComponente retornou. Você não precisa fazer ´C := nil´ porque ele é só um ponteiro e assim que sair da função vai ser retirado da memória, assim como você cria uma variável String e não precisa atribuir nil à ela antes de encerrar o código.
Agora, se você estivesse usando C := TComponent.Create(); aí sim você teria de usar FreeAndNil() para remover o componente que você criou.
Agora, se você estivesse usando C := TComponent.Create(); aí sim você teria de usar FreeAndNil() para remover o componente que você criou.
GOSTEI 0
Francisco.riva1
15/02/2008
Mais do que explicado !
Obrigado a todos pela atenção.
Abraços,
Francisco.
Obrigado a todos pela atenção.
Abraços,
Francisco.
GOSTEI 0