Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-01-2006
adpa adpa is offline
Miembro
 
Registrado: dic 2005
Posts: 22
Poder: 0
adpa Va por buen camino
Más problema padrón observador

Hola:
Tengo el siguiente sujeto y observador declarado.
Código Delphi [-]
type
TObserver  = CLASS
   public
    procedure Update(const Subject: TObject); virtual; abstract;
  end;
  TSubject = class
  private
    fController: TObject;
    fObservers: cLista;
  public
    constructor Create(Controller: TObject);overload;
    procedure Attach(Observer: TObserver);
    procedure Detach(Observer: TObserver);
    procedure Notify;
  end;

implementation
constructor TSubject.Create(Controller: TObject);
  begin
    inherited Create;
    fController := Controller;
  end;
  procedure TSubject.Attach(Observer: TObserver);
  begin
    if (fObservers = nil) then
      fObservers := cLista.Create(5);
    fObservers.Insertar(Observer);
  end;
  procedure TSubject.Detach(Observer: TObserver);
  begin
    if fObservers <> nil then
    begin
      fObservers.Remove(Observer);
      if (fObservers.Longitud) = 0 then
      begin
        fObservers.Free;
        fObservers := nil;
      end;
    end;
  end;
  procedure TSubject.Notify;
  var
    i: Integer;
  begin
    if (fObservers <> nil) then
      for i := 0 to Pred(fObservers.Longitud) do
        TObserver(fObservers[i]).Update(fController);
  end;

end.
El objeto consumidor hereda de tObserver y tienda de tSubject.
Pero cuando hago el attach
self.Attach(c);
dentro de procedure TSubject.Attach(Observer: TObserver); la variable observer
nil por lo tanto no me inserta.
¿Como puedo solucionarlo? ¿Tengo que redefinir attach en algún sitio o añadirle algo más a TObserver.

Muchas Gracias,
Responder Con Cita
  #2  
Antiguo 24-01-2006
Avatar de Jonnathan
Jonnathan Jonnathan is offline
Miembro
 
Registrado: may 2005
Ubicación: Isla de Margarita, Venezuela
Posts: 64
Poder: 19
Jonnathan Va por buen camino
No comprendo muy bien el planteamiento. Dices que Observer = nil cuando usas el procedimiento TSubject.Attach(Observer)???. No he examinado a fondo el código pero me pareció que estaba bien implementado, asi que pienso que el problema esta en el contexto en el que llamas o usas la función Subject.Attach(Observer) y no en la declaración de la clase, si pudieses poner un poco de ese código donde haces esa llamada...
__________________
"En el siglo de la estupidez todas las casas comienzan por la fachada" (Fuckowsky)
Planeta Insólito, La Pluma Inspirada
Responder Con Cita
  #3  
Antiguo 24-01-2006
adpa adpa is offline
Miembro
 
Registrado: dic 2005
Posts: 22
Poder: 0
adpa Va por buen camino
Hola
la llamada la hago en la siguiente funcion

Código Delphi [-]
procedure cTienda.pedirVez(c:cConsumidor);
{
DESCRIPCION -> El consumidor pide la vez en la tienda a la que desea ir
 se le asigna su turno.
PRECONDICIÓN -> Lista de tiendas esté creada.
PARAMETROS -> Consumidor que pide la vez
}
begin
     if (c.ClassName = 'cConsumidor') then
     {Mirar si es especial o normal}
     {Es normal}
 begin
 c.setTurno(self.visor.GetTiketN);
        self.visor.SetTiketN(self.visor.GetTiketN+1);
 end
     {Es especial}
     else            
 begin
   c.setTurno(self.visor.GetTiketE);
         self.visor.SetTiketE(self.visor.GetTiketE+1);  
 end;
     self.Attach(c);
end;

c si qué está cargado con los datos del consumidor.

Tengo que reescribir alguna funcion de tObserver en el consumidor.

Muchas Gracias, es muy urgente
Responder Con Cita
  #4  
Antiguo 06-02-2007
kakarotv5 kakarotv5 is offline
Miembro
 
Registrado: feb 2007
Posts: 162
Poder: 18
kakarotv5 Va por buen camino
Otro en apuros ...

Última edición por kakarotv5 fecha: 29-11-2007 a las 00:57:46.
Responder Con Cita
  #5  
Antiguo 06-02-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Bueno, pues yo tampoco veo nada raro en el código...

Todo indica que debería ir bien la cosa...
Responder Con Cita
  #6  
Antiguo 07-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
La clase está bien, la culpa la tendrá este individuo:
Código Delphi [-]
fObservers.Insertar(Observer);

¿puedes mostrar el código de insertar?

PD: Puedes usar FreeAndNil(fObservers) en lugar de estas dos lineas:
Código Delphi [-]
        fObservers.Free;
        fObservers := nil;
pues precisamente hace lo mismo, además de controlar una posible excepción al liberar fobservers, que en tu caso, se quedaría apuntando a memoria residual.

Edito: Lo siento, pero en un foro no hay nada urgente.... a saber cuando voy a conectarme de nuevo .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con los Post_Events Aldo Firebird e Interbase 1 21-10-2005 12:58:10
Problema con almacenamiento en String Moises22 Varios 5 29-09-2005 14:58:09
Problema para capturar Errores carlos gonzalez Varios 9 21-06-2005 16:31:48
Problema para capturar Errores carlos gonzalez DB2 2 17-06-2005 17:43:05
problema con procedimiento almacenado Choclito Firebird e Interbase 2 04-11-2004 20:58:46


La franja horaria es GMT +2. Ahora son las 09:43:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi