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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top