Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Como detectar la URL de una "página nueva" (https://www.clubdelphi.com/foros/showthread.php?t=13026)

Delphius 04-08-2004 06:00:48

Como detectar la URL de una "página nueva"
 
¡Hola a todos los amantes de Delphi y la programación!

Disculpen si estoy repitiendo la pregunta... pero ¿Alguien sabe cómo detectar la URL de destino cuando hace "abrir en una nueva ventana"?
Se que en Delphi existe el procedimiento NewWindow2 y que mediante éste se crea la ventana IE con dicha URL...
Mi duda: ¿ existe alguna manera de detectar dicha URL antes de que se "cree" la ventana de IE ?

Desde ya... muchas gracias

roman 04-08-2004 06:13:03

¿Te refieres a la componente TWebBrowser? De ser así, viendo la lista de eventos podría interesarte el evento OnBeforeNavigate que te pasa la URL de la página a la que se desea navegar y puedes incluso cancelar la operación si lo deseas.

// Saludos

Delphius 06-08-2004 05:00:33

Evento OnBeforeNavigate ?
 
Disculpa... pero tengo entendido que el evento OnBeforeNavigate se dispara cuando se navega dicha página... y yo necesito detectar no la página actual... sino la destino (la que se desea navegar en una nueva ventana o porque el link es en una nueva página) antes de que se abra la ventana de IE.:confused:

roman 06-08-2004 07:03:23

He estado dándole vueltas a tu pregunta y he llegado a algunos resultados.

Cuando un enlace abre una nueva ventana, antes de mostrarla genera el evento OnNewWindow2 al término del cual se crea la nueva instancia de IE vacia. Después de ello se generaría el evento OnBeforeNavigate2 en donde podrías determinar si permites o no la navegación. El punto es que en las condiciones por defecto, este evento no lo recibes ya que quien lo recibe es la nueva instancia de IE que ya no reside en tu apicación sino en una ventana de IE.

La forma en que podrías solucionar esto es cambiando tales condiciones por defecto, es decir, forzar a que la nueva ventana sea de tu aplicación y no de IE. Para ello, en el evento OnNewWindow2 pondrías:

Código Delphi [-]
with TForm1.Create(nil) do
  ppDisp := WebBrowser1.Application;

De esta forma el enlace se abre en una nueva instancia del browser que reside en una nueva instancia de Form1. Y ahí si puedes usar el evento OnBeforeNavigate2:

Código Delphi [-]
if SePuedeAbrir
  then Show
  else Close;

En el evento OnClose del formulario pones

Código Delphi [-]
Action := caFree

para que se liberen las nuevas instancias que se abran.

Seguramente hay que afinar detalles pero tal como está me ha funcionado bien.

// Saludos

Delphius 08-08-2004 09:54:55

Eso es lo que quería ... pero ...
 
Gracias Roman!,
Funciona bien.. hay que agregarle algunas que otras cositas pero anda.
Eso es lo que necesitaba... pero la verdad es que tengo un problema: quiero llevar esto a un programa que estoy desarrollando: un multinavegador y hasta el momento no he logrado agregar dicha funcionalidad.
Funciona todo OK siempre y cuando se trate de un formulario principal, pero el inconveniente que tengo es que mi navegador es un frame. Y voy creando frames navegadores dinámicamente (a c/u los coloco en un TTabSheet diferente que tambien creo dinamicamente)

¿Habria manera de pasarlo al frame?... para una mejor ayuda ve el hilo anterior que había creado http://www.clubdelphi.com/foros/showthread.php?t=12252 Allí tienes el código de cómo genero todo lo anterior.

Mi objetivo es que cuando se haga clic en "nueva ventana" realmente se cree una pestaña con su correspondiente frame navegador y dicho enlace.

Estuve pensando en hacer que llame al evento del botón (que se encarga de hacer las pestañas y los frames) pero esto generaría una referencia cicular y Delphi no lo permite: ¡La unidad principal hace uso de la del frame y la del frame debería hacer uso de la principal! ¿Cómo solucionar esto?

El problema sería el código que tu enviaste:
Código Delphi [-]
with TForm1.Create(nil) do
  ppDisp := WebBrowser1.Application;

Se que es complicado hacer lo que pretendo, pero no imposible
Desde ya muchas gracias...

roman 10-08-2004 06:35:03

Cita:

Empezado por Delphius
pero esto generaría una referencia cicular y Delphi no lo permite: ¡La unidad principal hace uso de la del frame y la del frame debería hacer uso de la principal! ¿Cómo solucionar esto?

¿Cómo vas con esto?

Observa que las referencias circulares no se permiten cuando las unidades se incluyen en la sección interface. Pero en este caso se puede solucionar fácilmente ya que puedes hacer lo que deseas añadiendo una de las unidades o ambas en la sección implementation.

// Saludos

Delphius 10-08-2004 21:44:22

Ya me di cuenta...
 
Gracias Roman. Ya lo logré.. estuve intentando mucho tiempo cómo evitar esa referencia cuando se me dio la loca idea de probarlo en implementation, resolví esto antes de recibir tu respuesta!...
¡Funciona!...
Gracias, me fuiste de mucha ayuda.:cool:


La franja horaria es GMT +2. Ahora son las 22:29:20.

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