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 02-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Cómo codificar en el evento (incluso asignado) de un componente

Hola,

Tengo un problema, o, por mejor decir, una inquietud, puesto que no sé si resolviendo esta se creará aquél. Estoy pensando en crear un sencillo componente que habría de heredar de un "TWebBrowser". Para lo que quisiera conseguir, necesitaría de codificar en su evento "OnBeforeNavigate2".

Bien. O mal. El caso es que llego hasta crear un método capaz de responder a dicho evento, de tal forma que cuando creo una instancia de la clase "TDecWebBrowser" pueda hacer algo más o menos así:

Código Delphi [-]
 type
   TDecWebBrowser = class(TWebBrowser)
   private
     // Método que responderá al evento
     procedure AntesDeNavegar(parametros: TParams);
   public
     constructor Create(AOwner: TComponent); override;
   end;
 
 implementation
 
 constructor TDecWebBrowser.Create(AOwner: TComponent);
 begin
   inherited;
   // Asigno el método al evento
   OnBeforeNavigate2 := AntesDeNavegar;
 end;
 
 procedure TDecWebBrowser.AntesDeNavegar(parametros: TParams);
 begin
   // TODO
   // Aquí llegaríamos si el usuario no asignó también
   // un método para este evento: de ser así prevalece-
   // ría su método sobre este, y no solamente eso, si-
   // no que este no llegaría a ejecutarse.
 end;
O sea, al crear el componente asigno a su evento "OnBeforeNavigate2" el método privado del mismo componente, que es en donde necesito codificar determinadas cuestiones. En donde ahora pone "TODO".

¿Y? Pues que si cuando hago uso del componente asigno al evento "OnBeforeNavite2" un manejador del evento, adiós al que asigné cuando se creó el componente. ¿Se entiende? Si algo no se entiende, por favor, no dejéis de decirlo y trataré de ofrecer la información tan precisamente como pueda. Gracias de antemano a todos y saludos.

P.D. No corre ninguna prisa.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 02-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Se supone, que el evento OnBeforeNavigate2 es del propio TWebBrower, entonces, tu componente ha de quitarlo de la zona published. Simplemente declarandolo en tu componente en la zona Private.

A continuación creas tu propio evento OnBeforeNavigate y lo haces published. Y este nuevo evento será el que vea el usuario de tu componente, es decir:
Código Delphi [-]
type
   TDecWebBrowser = class(TWebBrowser)
   private
     Fnuevo : .....;

     // Método que responderá al evento
     procedure AntesDeNavegar(parametros: TParams);
     property OnBeforeNavigate2 .... // este es el antiguo
   public
     constructor Create(AOwner: TComponent); override;
   published
      property OnBeforeNavigateNuevo:.... read FNuevo write FNuevo;
   end;
 
 implementation
 
 constructor TDecWebBrowser.Create(AOwner: TComponent);
 begin
   inherited;
   // Asigno el método al evento
   OnBeforeNavigate2 := AntesDeNavegar;
 end;
procedure TDecWebBrowser.AntesDeNavegar(parametros: TParams);
 begin
   // TODO
   // Aquí llegaríamos si el usuario no asignó también
   // un método para este evento: de ser así prevalece-
   // ría su método sobre este, y no solamente eso, si-
   // no que este no llegaría a ejecutarse.
  if Assigned(FOnBeforeNavigateNuevo) then
      FOnBeforeNavigateNuevo(.....parametros que lleve);
 end;
El usuario programador que use tu componente no sabrá que existe AntesDeNavigar (ni falta que le hace) .

Espero te sirva.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 02-11-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Cita:
Empezado por Lepe
Se supone, que el evento OnBeforeNavigate2 es del propio TWebBrower, entonces, tu componente ha de quitarlo de la zona published. Simplemente declarandolo en tu componente en la zona Private.
Pues no se puede disminuir los privilegios !!!!

En la mayoria de los casos se debe ir una clase mas arriba, antes que se haga publico la propiedad, pero en este caso no tienes una clase más arriba que te sirva.

La opción que te queda es sobreescribir la propiedad.

Aca te hice un ejemplo de como sería:
Código Delphi [-]
 type
   TDecWebBrowser = class (TWebBrowser)
   private
     // donde almacenamos el puntero al evento del usuario
     FOnBeforeNavigate2: TWebBrowserBeforeNavigate2;
     // Método que responderá al evento
     procedure AntesDeNavegar(parametros: TParams);
   public
     constructor Create(AOwner: TComponent); override;
   published
     // evento que sobreescribimos
     property OnBeforeNavigate2: TWebBrowserBeforeNavigate2 read FOnBeforeNavigate2 write FOnBeforeNavigate2;
   end;

 implementation
 
 constructor TDecWebBrowser.Create(AOwner: TComponent);
 begin
   inherited;
   // Asigno el método al evento
   inherited OnBeforeNavigate2 := AntesDeNavegar;
 end;
 
 procedure TDecWebBrowser.AntesDeNavegar(parametros: TParams);
 begin
   // TODO
   // esto puede ir antes o depues del TODO, de acuerdo al orden de ejecución
   FOnBeforeNavigate2({todos los parametros}); 
 end;

creo que con esto debería funcionar sin problemas

Suerte
__________________
[Crandel]
Responder Con Cita
  #4  
Antiguo 02-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A quien le pueda resultar interesante, aquí tienen una posible forma de ocultar propiedades, dictada por Neftali. En todo caso, Crandel, lo que propones funciona exactamente como esperaba. Muchísimas gracias a todos. De verdad.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 02-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno, pues, he llamado al engendro TDecBrowser y pueden conseguirlo aquí mismo. Gracias de nuevo a todos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
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
No sé, no sé. A mi como que me da más algo del estilo:

Código Delphi [-]
unit DecBrowser;

interface

uses
  OleCtrls, SHDocVw, ActiveX;

type
  TDecBrowser = class(TWebBrowser)
  protected
    procedure InvokeEvent(DispID: TDispID; var Params: TDispParams); override;
  end;

implementation

procedure TDecBrowser.InvokeEvent(DispID: TDispID; var Params: TDispParams);
begin
  inherited;

  if DispId = 250 then // 250 - OnBeforeNavigate2
  begin
    {
      Aquí tu código
    }
  end;
end;

end.

Si inherited se llama antes o después ya dependerá de tus necesidades específicas.

// Saludos
Responder Con Cita
  #7  
Antiguo 03-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Crandel
Pues no se puede disminuir los privilegios !!!!

En la mayoria de los casos se debe ir una clase mas arriba, antes que se haga publico la propiedad, pero en este caso no tienes una clase más arriba que te sirva.
Exacto, ese precisamente es el problema, como has visto, en este caso concreto no se puede ir una clase más arriba o toca implementar muchas propiedades.

En cuanto a lo demás que habeís hablado.... simplemente me callo

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 02-11-2005
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Cita:
Empezado por dec
Tengo un problema, o, por mejor decir, una inquietud, puesto que no sé si resolviendo esta se creará aquél.
Frase para la historia,

Bueno, el problema que se te plantea se resolvería adecuadamente si tuvieras acceso al método supuestamente protegido y supuestamente llamado DoBeforeNavigate o algo así, virtual claro, que no sé si existe. Como supongo que ya lo has buscado y no has encontrado nada parecido, lo único que se me ocurre es un pequeño truco, que no evita que se pueda machacar tu evento en tiempo de ejecución, pero que quizás en la práctica resulte suficiente (si vas a utilizar tú el componente, no es problema pues sabes lo que no debes hacer, si es un componente para terceros tendrá una puerta trasera donde puedan machacar tu código de forma involuntaria):

Sobrescribes el método Loaded, y ahí almacenas en una variable del tipo adecuado el evento que haya sido fijado en tiempo de diseño:

Código Delphi [-]
procedure TDecWebBrowser.Loaded;
begin
  inherited Loaded;
  EventoAnterior := OnBeforeActivate2;
  OnBeforeActivate2 := AntesDeNavegar;
end;

En el método AntesDeNavegar haces una llamada a EventoAnterior, claro.

Bueno, es algo chapucilla, pero puede servirte.

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #9  
Antiguo 02-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias a ambos por responder, en primer lugar. Tomando la manera que dice Lepe, queda algo pendiente y es que no se acaba de quitar del "inspector de objetos" el evento "OnBeforeNavigate2", aun cuando lo declaro como una propiedad privada con el fin de ocultarlo, precisamente,... ¿qué estoy olvidando?

Es decir, el tema parece ir bien, pero, ahora en el "inspector de objetos" tengo dos eventos "OnBeforeNavigate" (que yo preparo en el componente) y "OnBeforeNavigate2" (que ya incorpora el componente de que heredo, y acaso sería bien ocultar)... Además, si el usuario asigna algún método a este último evento, adiós al primero... claro está... ¿Cómo oculto, pues, el evento "OnBeforeNavigate2"?

Gracias de nuevo a ambos. El componente no es ninguna maravilla, pero, si llego a darle cabo, más o menos, ya sabéis que lo incluiré en DecComp. Gracias otra vez.
__________________
David Esperalta
www.decsoftutils.com
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


La franja horaria es GMT +2. Ahora son las 04:24:48.


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