Changement d'adresse d'un composant

MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 - Modifié par MiniApp le 25/10/2015 à 11:40
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 - 26 oct. 2015 à 15:55
Bonjour,

J'ai un bug de pointeur. J'ai un composant qui a une adresse et en plein dans une fonction vitale il change d'adresse ! La preuve en image !



Aussi j'ai remarquer que avant il pointe à la fin de l'adresse que j'ai après le begin. Aussi je vois le registre EAX au niveau du begin. Avez vous une solution ou une explication ?

Voici des codes pour vous aider

Sur mon bouton :
  Sckt := TClientSocket.Create(Self);//C'est un socket maison
  Sckt.Host := '127.0.0.1';
  Sckt.Port := 80;
  Plugin := TConnectingSocketProgressBar.Create(Self);
  Plugin.Socket := Sckt;//Ici le bug
  Plugin.Align := alClient;
  Plugin.Show;
  Sckt.Open;//Ici il me fait l'exception


A l'affectation de Plugin.Socket :
procedure TCustomPluginSocket.SetSocket(Value:TComponent);
begin
  if Value=FSocket then//<-Là il change l'adresse !!!
   Exit;

 if not((Value = nil)or(Value is TCustomClientSocket)or(Value is TCustomServerSocket)) then
  begin
   raise EUncompatibleSocketPlugin.Create('Un plugin de socket ne peux être associer à autre chose qu''un socket');
   Exit;
  end;

 if not(FSocket = nil) then
  if FSocket is TCustomClientSocket then
   (FSocket as TCustomClientSocket).RemovePlugin(IndexOfSelf)
    else (FSocket as TCustomServerSocket).RemovePlugin(IndexOfSelf);
 FSocket := Value;
 if not(FSocket = nil) then
  if FSocket is TCustomClientSocket then
   (FSocket as TCustomClientSocket).AddPlugin(@Self)
    else (FSocket as TCustomServerSocket).AddPlugin(@Self);
end;

Le socket utilise un système de plugin qui ont des méthodes appeler par le socket
Dans le add :
function TCustomClientSocket.AddPlugin(const PluginAdress:Pointer):integer;
{Ajoute un plugin}
begin
 Result := PluginList.Add(PluginAdress);
end;

Dans open :
  procedure NotifyConnectingProgress(State:TConnectingSocketState);
  var
    Temp:integer;
    ff:pointer;
  begin
    if Assigned(FOnConnecting) then
      FOnConnecting(Self,State);
    for Temp := 0 to PluginList.Count-1 do
      ff := PluginList.Items[Temp];//Un truc pour essayer de trouver mon bug
    for Temp := 0 to PluginList.Count-1 do
      PCustomPluginSocket(PluginList.Items[Temp])^.NotifyActivating(Byte(State));//<-Exception !!!
  end;


Je ne vois absolument pas comment ceci est possible. Merci beaucoup si vous trouver une solution.

Chercher et essayer : vous trouverez la solution!
Fouiner et regarder partout : vous trouverez la connaissance!!

2 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
25 oct. 2015 à 19:13
Salut,

c'est pas facile avec si peu de code ... l'erreur pourrait se situer ailleurs !!

Mais il y a une ou deux choses qui me dérange dans la "procedure TCustomPluginSocket.SetSocket(Value:TComponent);"

- en premier je passerai Value en constante:
procedure TCustomPluginSocket.SetSocket(const Value:TComponent);

- en deux je pense qu'il y a un souci avec la condition:
 if not((Value = nil)or(Value is TCustomClientSocket)or(Value is TCustomServerSocket)) then
  begin
   raise EUncompatibleSocketPlugin.Create('Un plugin de socket ne peux être associer à autre chose qu''un socket');
   Exit;
  end;

ici si Value = TCustomClientSocket, par exemple, la condition est vrai et donc exécutée !!!
alors que ça devrait être l'inverse

il faudrait écrire quelque chose comme:
 if not (Assigned(Value) and ((Value is TCustomClientSocket) or (Value is TCustomServerSocket))) then
  begin
   raise EUncompatibleSocketPlugin.Create('Un plugin de socket ne peux être associer à autre chose qu''un socket');
   Exit;
  end;


à tester ... ;)

0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
Modifié par Cirec le 26/10/2015 à 14:36
oulà ... grossière erreur de ma part !!!

la condition initiale est parfaite ... je viens de voir que tu as besoin que l'objet puisse être passé à "nil"
et en dehors de cela je sais pas où j'avais la tête sur ce coup là :s

voilà ... désolé pour la boulette :p
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
Modifié par MiniApp le 26/10/2015 à 15:55
Bonjour

J'ai testé en passant le comp par un const et toujours le bug. Je pense que je vais essayer de faire
integer(@Self)-SizeOf(Self)


Chercher et essayer : vous trouverez la solution!
Fouiner et regarder partout : vous trouverez la connaissance!!
0
Rejoignez-nous