Gracias por la confirmación,
ElKurgan. En la empresa todavía no hemos adquirido la actualización a XE7, pero estoy seguro que lo haremos en un par de meses.
------
Gracias Marcelo.
En la VCL/FMX sí hay un par de clases que implementan la interfaz IObserver. Se trata de TBindObserver y TEditLinkProxy, de las cuales no hay documentación por el momento. El código de los métodos Removed de dichas clases realizan acciones que van en la lógica de lo que hemos venido comentando. Incluso el segundo de ellos —TEditLinkProxy.Removed— termina llamando al método Removed de una interfaz derivada de IObserver (IEditGridLinkObserver), pero no parece ser llamado por nadie. Aquí podría haber recursividad pero, como es lógico, todo proceso recursivo debe iniciar por una tangente de entrada que para el método IObserver.Removed parece no existir.
Sigo pensando que al método TObservers.RemoveObserver le falta ese desencadenamiento. La buena noticia es que este es virtual, y ya me adelanté a crear una clase derivada
TghObservers, con la suerte de que el método que se encarga de crear la propiedad Observers de TComponent (GetObservers) también es virtual. Lo anterior quiere decir que puedo definir clases de componentes donde su propiedad Observers, declarada de tipo TObservers, sea un objeto TghObservers, asegurándome con ello de que el método Removed sea llamado para cada interfaz observador que sea eliminada de esa lista.
Lo malo es que Delphi todavía no tiene
redefinición de clases (
herencia insertada), con lo cual me ahorraría escribir varias redefiniciones del método GetObservers, prácticamente repitiendo el mismo código, cuando haya que derivar de diferentes clases nativas descendientes de TComponent (lo que es bastante común).
Este es mi borrador del método virtual RemoveObserver redefinido en TghObservers. De paso he agregado el evento OnObserverRemoved, a semejanza del evento OnObserverAdded ya presente en la clase padre.
Código Delphi
[-] Procedure TghObservers.RemoveObserver (Const IDs :Array Of Integer;
Const AIntf :IInterface);
Var
ID :Integer;
Observer :IObserver;
Begin
Inherited RemoveObserver (IDs, AIntf);
Observer := (AIntf As IObserver);
Observer.Removed;
If Assigned (OnObserverRemoved) Then
For ID In IDs Do
OnObserverRemoved (ID, Observer);
End;
Salvo que se arroje más luz sobre el tema y haya que replantearlo, esta pretendida mejora estaría disponible en la primera liberación de
GH Freebrary para Delphi XE5 a XE7.
De todas formas agradeceré cualquier otro dato que tengan.
Un saludo.
Al González.