Ver Mensaje Individual
  #4  
Antiguo 20-11-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias, Marcelo. Mi comprensión del manejo de interfaces no es mala, y está claro lo que dices. Pero rescato este punto:
Cita:
Empezado por Delphius Ver Mensaje
[...] el método en cuestión da a entender que hacer cuando el Observador solicita ser removido de la lista.
Eso mismo pienso, pero como no hay nada de nada (ni código, ni documentación) que asiente cuándo podría o tendría que ser llamado ese método, queda una rendija de duda.

Me parece que la clase TObservers (tipo de la propiedad Observers de TComponent), debería llamar al método IObserver.Removed en su método RemoveObserver (tomando la interfaz IObserver del parámetro AIntf), pero como puede verse no ocurre tal cosa:
Código Delphi [-]
procedure TObservers.RemoveObserver(const IDs: array of Integer; const AIntf: IInterface);
var
  LID: Integer;
  LList: IInterfaceList;
  I: Integer;
begin
  for I := 0 to Length(IDs) - 1 do
  begin
    LID := IDs[i];
    if FObservers.TryGetValue(LID, LList) then
    begin
      LList.Remove(AIntf);
      if LList.Count = 0 then
      begin
        FObservers.Remove(LID);
        LList := nil;
      end;
    end;
  end;
end;
Es probable que Embarcadero añada algún cambio después de la línea "LList.Remove(AIntf);", si es que no lo ha hecho ya, en las siguientes versiones.

Alguien que tenga XE7 instalado, ¿sería tan amable de verificar si el método TObservers.RemoveObserver sigue igual o presenta alguna modificación en su código fuente? El archivo de código es System.Classes.pas.

Muchas gracias.

Al.
Responder Con Cita