J'essaye de faire la liste des gestionnaires d'événement où le gestionnaire est la référence de méthode. Pour supprimer un gestionnaire spécifique, je dois le trouver dans la liste. Mais comment puis-je comparer l'adresse de code de deux références de méthode?Comment vérifier si deux références de méthode référencent la même méthode?
type
TEventHandler = reference to procedure;
procedure TestProc;
begin
end;
procedure TForm26.FormCreate(Sender: TObject);
var
Handlers: TList<TEventHandler>;
begin
Handlers := TList<TEventHandler>.create;
try
Handlers.Add(TestProc);
Handlers.Remove(TestProc); { doesn't work }
Assert(Handlers.Count=0); { fails }
Assert(Handlers.IndexOf(TestProc)>=0); { fails }
finally
FreeAndNil(Handlers);
end;
end;
Fascicule de TList <> ne compare pas les références de méthode correctement. Comment puis-je les comparer? Existe-t-il une structure similaire à TMethod mais pour les références de méthode?
TEqualityComparer .Default.Equals (A, B) –
Et vous pouvez utiliser le TProc à la place de votre propre déclaration ... il suffit d'ajouter System.SysUtils. –
@ZENsas Je connais TProc, j'ai juste essayé de rendre l'exemple aussi clair que possible. TEqualityComparer .Default.Equals (A, B) ne fonctionne pas, je viens de tester cela (sinon TList <>. Le retrait fonctionnera aussi, il est basé sur le comparateur par défaut). –