ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Constant object can't be passed as var parameter[RESSOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
informacaoweed
Aprendiz
Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013
Mensagens: 268
Localização: Porto Alegre / RS

MensagemEnviada: Ter Jul 22, 2014 11:29 am    Assunto: Constant object can't be passed as var parameter[RESSOLVIDO] Responder com Citação

Esta é a assinatura da procedure:
Código:
procedure LiberarObj(var Obj: TObject);


esta é a chamada da procedure:
Código:
LiberarObj(TObject(LogRel));


LogRel, no caso é uma propriedade que é a instância de uma classe minha:
Código:
property LogRel : TLogC read FLogRel write FLogRel;


Antes que me perguntem, aqui está a assinatura da classe TLogC
Código:
type TLogC = class


É um objeto normal, está instanciado, mas quando faço a chamada me dá esse erro: E2197 Constant object cannot be passed as var parameter

Eu entendo o erro, diz que uma constante está sendo passada como parâmetro de uma procedure que deve receber uma variável.

Só que não entendo pq este objeto é uma constante, já que crio, destruo, enfim, atribuo valores a ele e ele aceita, ou seja, é uma variável.


Editado pela última vez por informacaoweed em Ter Jul 22, 2014 1:57 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Ter Jul 22, 2014 11:56 am    Assunto: Responder com Citação

Retire o var da assinatura.

procedure LiberarObj(Obj: TObject);

e teste veja se funciona.

Objetos já são ponteiros, se voce coloca var está passando ponteiro de ponteiro. O Delphi não aceita, já que não há necessidade.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Ter Jul 22, 2014 12:04 pm    Assunto: Responder com Citação

Funcionou aqui :

Código:
  TLoc = Class
  Public
      Procedure enter;
  End;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure TLoc.Enter;
Begin
     ShowMessage ('teste');
End;

procedure LiberarObj(Obj: TObject);
Begin
     (obj as TLoc).Enter;
End;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
    loc : TLoc;
begin
    loc := TLoc.Create;
    LiberarObj (Loc);
    Loc.Free;
end;

_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
informacaoweed
Aprendiz
Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013
Mensagens: 268
Localização: Porto Alegre / RS

MensagemEnviada: Ter Jul 22, 2014 1:49 pm    Assunto: Responder com Citação

Oi Claudio blz,
Funcionou sim cara, obrigado por dar atenção.

Só que o que acontece é o seguinte: quando colocamos somente o parâmetro, sem nenhuma diretiva (acho que é isso) este parâmetro é, por default, um parâmetro de entrada. O que isto significa? que a procedure recebe o valor da variável passada pra dentro da procedure, mas não devolve o valor a variável, isto é, o valor da variável passada e recebido no parâmetro da procedure, e lá dentro vc pode trabalhar com este parâmetro mas tudo que vc fizer não surgirá efeito na variável quando a procedure terminar de ser executada.

Quando declaramos o parâmetro antecedido pela palavra reservada VAR o parâmetro recebe então a variável em sim, um ponteiro para ela (sei lá se é). Em resumo, só sei que ao declarar um parâmetro com var este torna-se um parâmetro de entrada e saída, e as modificações que foram feitas dentro da procedure terão efeito na variável depois que se encerrar execução da procedure.

Curiosidade:
Também há a palavra reservada out, o efeito dela é o contrário do default: vc coloca uma variável no parâmetro, e não importa o valor que ela tenha, não será recebido dentro da procedure, porém o valor que a lá dentro da procedure foi atribuído a variável, é este valor que a variável terá ao terminar a execução da procedure. Ou seja, é um parâmetro só de saída, pois não entra valor, somente sai.


Teste neste mesmo exemplo, perceba que se você der um LogRel.Free; LogRel := nil; Dentro da procedure, o objeto LogRel em si continuará com valor depois da execução da mesma.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
informacaoweed
Aprendiz
Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013
Mensagens: 268
Localização: Porto Alegre / RS

MensagemEnviada: Ter Jul 22, 2014 1:56 pm    Assunto: Responder com Citação

Eu cirei este método como alternativa ao FreeAndNil que me retorna o mesmo erro. E pelo mesmo motivo. Porque não posso passar uma propriedade como parâmetro declarado com "var".
Mas a propriedade LogRel efetua leitura e escrita da variável FLogRel e esta sim eu posso enviar ao FreeAndNil.

Por isso, consigo libera-lo da memória assim
Código:
FreeAndNil(FLogRel);


Obrigado a todos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB