Changement d'adresse d'un composant

Signaler
Messages postés
655
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
MiniApp
Messages postés
655
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
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

Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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 ... ;)

Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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
Messages postés
655
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
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!!