MiniApp
Messages postés654Date d'inscriptionlundi 21 juillet 2014StatutMembreDernière intervention22 février 2019
-
Modifié par MiniApp le 25/10/2015 à 11:40
MiniApp
Messages postés654Date d'inscriptionlundi 21 juillet 2014StatutMembreDernière intervention22 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!!
- 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és3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
Modifié par Cirec le 26/10/2015 à 14:36
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