AV lors de l'utilisation d'une procédure d'un composant appelé par un autre
-
19-08-2019 - |
Question
Je ne suis pas sûr d'avoir expliqué cela du mieux que je peux, mais c'est parti ...
J'ai deux composants personnalisés sur une fiche, qui sont reliés entre eux au moment de la conception via l'EDI. Chaque fois que j'appelle une procédure depuis le composant, j'obtiens la violation d'accès,
Violation d'accès à l'adresse 0049A614 dans le module 'Project2.exe'. Lire de adresse 00000034.
Ceci est une petite section de mon code
TMyClient = class(TClientSocket)
{...}
end;
et ...
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 à la *****, et l'IDE s'arrête ici.
J'ai également essayé de faire l'affectation au moment de l'exécution avec
Presence1.theClient := MyClient1;
sans chance
utiliser des procédures de Presence1 ou MyClient1 qui ne s'appuient pas l'une sur l'autre fonctionne bien.
Delphi 7
Suivi: De mghie commentaires, j'ai repensé à ce sujet.
J'ai supprimé le composant TPresence du formulaire (ce qui a provoqué des erreurs IDE étranges, qui auraient pu avoir quelque chose à voir avec cela) et je l'ai créé au moment de la conception, en affectant tout ce qui était nécessaire. Maintenant, cela fonctionne, mais le fait de remettre le composant TPresence à la place de l'erreur renvoie l'erreur.
Merci pour votre aide les gars, je devrais pouvoir résoudre celui-ci maintenant, si je ne peux pas mal rouvrir une autre question:)
La solution
Vous semblez penser que l'exception est déclenchée parce que le champ client de Presence1 n'est pas défini (toutefois, vous obtenez l'exception " Lecture de l'adresse 00000034 " cela signifie que le pointeur Self dans l'appel SetStatus () est nil . Cela indiquerait que vous appelez SetStatus () sur une référence TPresence non attribuée. Il n’est pas vraiment possible d’en dire la raison à partir de l’extrait de code que vous avez posté, mais cela devrait vous aider à démarrer le débogage.
Je vous conseillerais quand même d'écrire une méthode de définition correcte pour toutes les références de composant dans vos propres composants personnalisés - tout d'abord parce que vous avez un meilleur point d'ancrage pour déboguer de tels problèmes (vous pouvez définir un point d'arrêt à cet endroit) et ensuite parce que vous devez toujours Appelez TComponent.FreeNotification () sur ces composants liés pour pouvoir suivre leur destruction et définir la référence interne sur nil .
Autres conseils
Nous avons probablement besoin de plus de votre code. Il est possible que vous ne créiez pas correctement une instance de TPresence qui vous donnerait l'erreur que vous rencontrez. Essayez de nous donner un extrait de code aussi simple que possible qui cause votre erreur.