Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por Juan Antonio
Dec: Es la primera vez que leo este hilo, aún cuando lo visité alguna vez en la semana, no contaba con el tiempo para revisarlo completo. Lo que no termino de entender es, para que creas una instancia de TActionList, si al parecer, luego le asignarás un puntero a la propiedad, a otro TActionList, creado, manejado y destruido por la forma (o por un tercero).
Bueno. Se ha hecho eso no porque yo vea que es la mejor solución, sino porque se trataba de solucionar un problema... puede que no de la mejor manera, pero, verás ahora porqué digo esto.


Cita:
Empezado por Juan Antonio
Si lo único que se necesita es mantener una referencia a un ActionList, no hará falta crear o destruir uno al momento de crear/destruir la instancia de TDecWebBrowser y si el mecanismo de notificación que ya has implementado, que es la manera estándar de "desconectar" componentes con relaciones horizontales.
Pues es el caso que haciéndolo de ese modo no funciona (Acabo de probarlo de nuevo). Lo he dicho más arriba. El problema se presenta si sitúas en un formulario un "TDecBrowser" y un "TActionList". Acto seguido asignas a la propiedad "Acciones" del "TDecBrowser" el "TActionList" y aun después quitas del formulario el "TActionList"... "violaciones de acceso" variadas e incluso la necesidad (si no le has cogido el truco, y aún así...) de reiniciar Delphi.


Cita:
Empezado por Juan Antonio
Si por el contrario, es tu WebBrowser quien crea la lista de acciones, no hará falta notificar, pues será el propio componente el que se encargue de crearla/destruirla, y el usuario del componente, cuando mucho, podrá añadir/eliminar elementos a este ActionList. Si ese es el caso, entonces proteges el miembro de la clase con métodos de asignación de la propiedad: (...)
No se trata de eso, es decir, no veo la necesidad de que el "TDecBrowser" maneje internamente las acciones... para eso está ya el componente "TAcionList". Por cierto, trata de localizar un componente en la VCL (y en la JVCL también) que cuente con una propiedad de tipo "TActionList"... yo no he podido encontrarlo antes, cuando lo he intentado para tratar de fijarme cómo hacía para torear con esa propiedad.

Pero, me parece que comienzo a desvariar... Gracias de nuevo a todos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 03-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Pues es el caso que haciéndolo de ese modo no funciona (Acabo de probarlo de nuevo). Lo he dicho más arriba. El problema se presenta si sitúas en un formulario un "TDecBrowser" y un "TActionList". Acto seguido asignas a la propiedad "Acciones" del "TDecBrowser" el "TActionList" y aun después quitas del formulario el "TActionList"... "violaciones de acceso" variadas e incluso la necesidad (si no le has cogido el truco, y aún así...) de reiniciar Delphi.
Creo que estás perdiendo el punto que señala Juan Antonio.

Estas violaciones de acceso se corrigen, como tú mismo ya lo descubriste, con el método Notification, que está precisamente para eso. Es justo el mecanismo que usa, por ejemplo, un DataSource y su propiedad DataSet.

Pero el caso es que tu código crea una instancia de TActionList:

Código Delphi [-]
FAcciones := TActionList.Create(Forms.Application);

y esto es lo que resulta innecesario si sólo te interesa la referencia al control y no que tu componente la mantenga por sí misma.

// Saludos
Responder Con Cita
  #3  
Antiguo 03-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por roman
Creo que estás perdiendo el punto que señala Juan Antonio.

Estas violaciones de acceso se corrigen, como tú mismo ya lo descubriste, con el método Notification, que está precisamente para eso. Es justo el mecanismo que usa, por ejemplo, un DataSource y su propiedad DataSet.
No, no; si sé perfectamente por dónde va Juan Antonio. Entiendo perfectamente que solamente necesito una referencia y no manejar por mi cuenta un "TActionList"... ¡pero es que me está dando los errores que digo y no consigo hacerlo de otro modo que como he dicho!

Ahora pienso en la cuestión de hacer uso del método "Notification", de otro modo que como lo hago ahora, claro está, supongo, no sé si bien:

Código Delphi [-]
 
 // Notificaciones al componente.
 //
 procedure TDecBrowser.Notification(Component: TComponent;
   Operation: TOperation);
 begin
   inherited;
   if (csDesigning in ComponentState) then
   begin
     if (Operation = opRemove) then
     begin
       if (Component = FAcciones) then
       begin
         FAcciones.RemoveFreeNotification(Self);
         FAcciones := TCustomActionList.Create(Forms.Application);
       end;
     end;
   end;
 end;
El problema ahora mismo está en que si dejo sin crear la variable "FAcciones" al crear el componente ni siquiera puedo poner en un formulario un "TDecBrowser": violaciones de acceso a go-go. Recuerdo que antes busqué por la paleta de componentes alguno que tuviera una propiedad del tipo "TActionList" y que no di con ninguno...

¿Estáis probando esto? Quiero decir, ¿probáis puede hacerse como decís? Porque si es así os agradecería el propio código, más que nada, porque entonces estoy haciendo algo y aun algos mal o no me entero de nada en absoluto,... ambas cosas son posibles.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 03-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Quizá me gustaría añadir por aquello de "si algo funciona, no lo toques" (es broma) que el componente ya no da el problema anteriormente descrito: funciona bien, tanto en tiempo de diseño como en tiempo de ejecución. No digo esto, obviamente, sino para dejar constancia del hecho, por si resultara de alguna utilidad.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 03-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Vamos a ver.

En tu código tienes:

FAcciones.RemoveFreeNotification(Self);

¿En qué momento agregas tal notificación?

Por otro lado, te das cuenta que cuando Notification se llama con opRemove es porque la componente se está destruyendo. Llamar entonces un método de una componente que se está destruyendo no creo que sea muy seguro.

Yo te recomiendo que te revises en la VCL el código para la propiedad PopupMenu de TControl que te dejará perfectamente claro el uso de FreeNotification y Notification.

EDITO:

No se está destruyendo la componente. Ya se destruyó:

Cita:
Empezado por ayuda de Delphi
opRemove - The specified object has been destroyed, and its memory is about to be freed.
// Saludos

Última edición por roman fecha: 03-11-2005 a las 21:05:03.
Responder Con Cita
  #6  
Antiguo 03-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por roman
FAcciones.RemoveFreeNotification(Self);

¿En qué momento agregas tal notificación?
No sé... ¿no la agrega el IDE de Delphi a la que añade el "TActionList" a la propiedad "Acciones" del "TDecBrowser"?


Cita:
Empezado por roman
Por otro lado, te das cuenta que cuando Notification se llama con opRemove es porque la componente se está destruyendo. Llamar entonces un método de una componente que se está destruyendo no creo que sea muy seguro.
No he inventado nada. Lo he visto en algún componente. Lo digo porque yo no estoy muy puesto que digamos en estos temas y me he fijado en algunos componentes para tratar de solucionar la cuestión planteada aquí. De todos modos debes estar e lo cierto: quitando esa instrucción el componente se comporta como se espera: no falla.


Cita:
Empezado por roman
Yo te recomiendo que te revises en la VCL el código para la propiedad PopupMenu de TControl que te dejará perfectamente claro el uso de FreeNotification y Notification.
Pues así lo haré. No porque no lo halla hecho ya, pero, porque muy probablemente no lo hice del todo ni bien. En ello estamos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 03-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Lo he visto en algún componente.
¿De la VCL?

// Saludos
Responder Con Cita
  #8  
Antiguo 03-11-2005
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Creo que más bien le falta indicarle al TActionList que le notifique al componente TDecBrowser cuando se está destruyendo, esto se haría de la siguiente forma:

Código Delphi [-]
procedure TDecBrowser.SetActionList(Value: TActionList);
begin
  if FActionList <> Value then
  begin
    FActionList := Value;
    if Assigned(Value) then
      Value.FreeNotification(Self)
  end
end;

Ya con eso desde el Notification puedes eliminar la referencia al TActionList cuando este se destruya:

Código Delphi [-]
procedure TDecBrowser.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  if (Operation = opRemove) and (AComponent = FActionList) then
    FActionList := nil
end;

Saludos...
Responder Con Cita
  #9  
Antiguo 03-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por maeyanes
Creo que más bien le falta indicarle al TActionList que le notifique al componente TDecBrowser cuando se está destruyendo
¡Exacto! A eso me refería con "agregar la notificación". Y ésta es justo la manera en que se hace con el PopupMenu y otras propiedades similares.

// Saludos
Responder Con Cita
  #10  
Antiguo 04-11-2005
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 24
andres1569 Va por buen camino
Hola,

una cosita, hay que poner la llamada al método Notification del ancestro, que se encarga de liberar la referencia a nuestro componente de la lista de componentes ligados (FFreeNotifies).

Código Delphi [-]
procedure TDecBrowser.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation); 
  if (Operation = opRemove) and (AComponent = FActionList) then
    FActionList := nil
end;
__________________
Guía de Estilo
Responder Con Cita
  #11  
Antiguo 04-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,


Cita:
Empezado por Andrés
una cosita, hay que poner la llamada al método Notification del ancestro, que se encarga de liberar la referencia a nuestro componente de la lista de componentes ligados (FFreeNotifies).

Código Delphi [-]
 procedure TDecBrowser.Notification(AComponent: TComponent;
   Operation: TOperation);
 begin
   inherited Notification(AComponent, Operation);
   if (Operation = opRemove) and (AComponent = FActionList) then
     FActionList := nil
 end
Bueno. Lo cierto es que suelo hacerlo así como dices Andrés, empero, ¿no es igualmente válido utilizar, digamos, la abreviatura, tal como se ve abajo? Yo diría que así es, aunque no fundamentado en letra impresa, sino en la poca experiencia que tengo en estas lides.

Código Delphi [-]
 // Notificaciones al componente.
 //
 procedure TDecBrowser.Notification(Component: TComponent;
   Operation: TOperation);
 begin
   inherited;
   if (Operation = opRemove)
     and (Component = FAcciones) then
       FAcciones := nil
 end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 18:44:04.


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