Après avoir lu ceci, j'aimerais savoir quel est le problème avec le code suivant :
procedure TForm1.Button5Click(Sender: TObject);
begin
Button5.free;
end;
Après avoir lu ceci, j'aimerais savoir quel est le problème avec le code suivant :
procedure TForm1.Button5Click(Sender: TObject);
begin
Button5.free;
end;
Placez un point d'arrêt sur cette routine et examinez la pile d'appels. Une fois que vous revenez de l'event handler, il y a encore du code de Button5 qui s'exécute, ainsi que d'autres codes VCL qui s'attend à ce que Button5 soit toujours là. Si vous supprimez l'objet en dessous, il y a de fortes chances que vous corrompiez la mémoire ou que vous déclenchiez des exceptions d'une manière ou d'une autre.
Si vous voulez faire cela, la bonne méthode est d'appeler PostMessage et d'envoyer un message au formulaire qui finira par libérer l'objet en toute sécurité une fois le code actuel terminé.
Le code est le pire genre de bogue car il ne se révèle pas dans 99,99% des cas. Vous libérez un objet (contrôle de bouton) alors que VCL suppose que l'objet existe. Ce qui se passe en réalité, c'est que la mémoire de l'objet est libérée, mais pas encore réutilisée, donc le code ci-dessus fonctionnera normalement, comme si l'objet n'avait pas encore été libéré, mais c'est quand même un bogue.
Le bogue simple suivant illustre la situation :
type
PData = ^TData;
TData = record
Value: Integer;
end;
procedure NastyBug;
var
P: PData;
begin
New(P);
P^.Value:= 2;
Dispose(P);
// code malicieux et buggé
ShowMessage(IntToStr(P^.Value));
P^.Value:= 22;
ShowMessage(IntToStr(P^.Value));
end;
Vous pouvez tester le code ci-dessus et il devrait fonctionner comme prévu, car la mémoire libérée pour P
n'est pas encore réutilisée, mais le code est clairement un bug.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.