 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
informacaoweed Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013 Mensagens: 268 Localização: Porto Alegre / RS
|
Enviada: Ter Jul 22, 2014 11:29 am Assunto: Constant object can't be passed as var parameter[RESSOLVIDO] |
|
|
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 |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
Enviada: Ter Jul 22, 2014 11:56 am Assunto: |
|
|
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 |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
Enviada: Ter Jul 22, 2014 12:04 pm Assunto: |
|
|
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 |
|
 |
informacaoweed Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013 Mensagens: 268 Localização: Porto Alegre / RS
|
Enviada: Ter Jul 22, 2014 1:49 pm Assunto: |
|
|
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 |
|
 |
informacaoweed Aprendiz


Registrado: Terça-Feira, 1 de Outubro de 2013 Mensagens: 268 Localização: Porto Alegre / RS
|
Enviada: Ter Jul 22, 2014 1:56 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|