AV Quando utilizar um procedimento de um componente chamado por outro
-
19-08-2019 - |
Pergunta
Eu não tenho certeza se eu tiver explaned este o melhor que posso, mas, aqui vamos nós ...
Eu tenho 2 componentes personalizados em uma forma, que se interligam em tempo de design através do IDE. Sempre que eu chamar um procedimento a partir de do Componente I obter a violação de acesso,
Violação de acesso no endereço 0049A614 no módulo 'Project2.exe'. Leia de endereço de 00.000.034.
Esta é uma pequena parte do meu código
TMyClient = class(TClientSocket)
{...}
end;
e ...
TPresence = class(TComponent)
private
ftheClient: TMyClient
public
procedure SetStatus(status: string);
published
property UserName : string read fUserName write fUserName;
property theClient: TMyClient read ftheClient write ftheClient;
end;
procedure TPresence.SetStatus(status: string);
begin
try
***** if theClient = nil then
Exception.Create('theClient is Nil');
except
on e:Exception do
MessageDlg(e.classname+', '+e.message, mtWarning, [mbOK], 0);
end;
{...}
end;
0049A614 está no *****, eo IDE pára aqui.
Eu tenho também tentou fazer a atribuir pelo tempo de execução com
Presence1.theClient := MyClient1;
sem sorte
usando procedimentos de Presence1 ou MyClient1 que não confiam um no outro belo trabalho.
Delphi 7
Follow Up: a partir de comentários mghie, eu repensado sobre isso.
I removido o componente TPresence da forma (o que causou alguns erros IDE estranhos, que poderiam ter tido algo a ver com isso) e criou projetar tempo, atribuindo tudo o que era necessário. Agora ele funciona, mas colocando a parte de trás TPresence Component na partir traz a volta de erro.
Obrigado por sua ajuda caras, eu deveria ser capaz de trabalhar este para fora agora, se eu não posso mal reabrir outra pergunta:)
Solução
Você parece estar pensando que a exceção é gerada porque o campo cliente de Presence1 não está definido - se, contudo, obter a exceção "Leia de endereço 00000034" isso significa que o ponteiro Auto no SetStatus () chamada é nil . Isso indicaria que você chama SetStatus () em uma unassigned TPresence de referência. Não é realmente possível dizer a razão para que a partir do trecho que você postou, mas deve começar a depuração.
Eu ainda aconselho-o a escrever um método setter apropriado para todas as referências de componentes em seus próprios componentes personalizados - primeiro, porque você tem um gancho melhor ao depurar tais problemas (você pode definir um ponto de interrupção lá), e segundo porque você deve sempre chamada TComponent.FreeNotification () em tais componentes ligados a ser capaz de controlar a sua destruição e definir a referência interna para nil .
Outras dicas
Nós provavelmente precisam de mais do seu código. É possível que você não está criando corretamente uma instância de TPresence que lhe daria o erro que está ocorrendo. Tente dar-nos um simples possível trecho de código que faz com que seu erro.