Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Multi-navegador (https://www.clubdelphi.com/foros/showthread.php?t=12252)

Delphius 10-07-2004 03:29:12

Multi-navegador
 
Hola, tengo una pequeña duda... y estaría muy agradecido si alguien pudiera ayudarme.

Estoy desarrollando un multi-navegador y para ello necesito crear dinámicamente cada ventana de navegación. A su vez por cada ventana creo una pestaña (TTabSheet) de un TPageControl.
La ventana de navegación debe constar de un TWebBrowser y un TStatusBar. Para facilitar las cosas diseñé un Frame que hace de ventana de navegación. En dicho frame sólo se encuentra un solo evento:
Código Delphi [-]
procedure TFrame2.WebBrowser1StatusTextChange(Sender: TObject;
  const Text: WideString);
begin
StatusBar1.Panels[0].Text := Text;
end;
Es decir que sólamente lo que se hace es mostrar en la StatusBar el texto cambiante cuando se navega.

La ventana principal consta de los botones de navegación un PageControl y un ComboBox en donde se visualiza la dirección.
El problema es que el código que yo ingresé no me deja insertar mas de una pestaña con su correspondiente ventana de navegación, apareciendome un mensaje de error diciendo que ya existe un objeto llamado TFrame2. Adjunto un código de prueba:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
// El botón simplemente permite crear una pestaña navegadora para la dirección URL
// ingresada
var NewTabSheet : TTabSheet;
    NewBrowser: TFrame2;
    F: OLEVariant;
begin
// Para que funcione correctamente debe haber inicialmente una pestaña con una ventana
// de navegación
NewTabSheet := TTabSheet.Create(PageControl1);
// Edit2 contiene el nombre para la pestaña
NewTabSheet.Caption := Edit2.Text;
NewTabSheet.PageControl := PageControl1;
NewBrowser := TFrame2.Create(Frame21);
NewBrowser.WebBrowser1.Offline := True;
NewBrowser.Align := alClient;
NewTabSheet.InsertControl(NewBrowser);
F := 0;
PageControl1.ActivePage := NewTabSheet;
with PageControl1.ActivePage do
   // Edit1 contiene la dirección URL a visitar
   NewBrowser.WebBrowser1.Navigate(WideString(Edit1.Text),F,F,F,F);
end;
¿Alguien sabe como puedo solucionar este problema? Desde ya muchas gracias...

jachguate 10-07-2004 20:06:00

Hola Delphius.

En primer lugar, quiero darte la bienvenida a los foros del clubdelphi. Te recomiendo la lectura de la Guia de Estilo, que contiene las reglas de convivencia en este lugar.

Te recomiendo el uso también de las etiquetas [ delphi ], [ sql ], [ php ] y [ code ] (segun corresponda) para publicar trozos de código, puesto que de esta manera se muestran correctamente indentados y con la sintaxis resaltada. Al inicio de este foro hay un mensaje que explica su uso.

En este caso, publico los trozos de código de tu mensaje original de esta manera, para que sean de fácil lectura para quien se interese en tu hilo.

Código Delphi [-]
procedure TFrame2.WebBrowser1StatusTextChange(Sender: TObject;
  const Text: WideString);
begin
  StatusBar1.Panels[0].Text := Text;
end;

procedure TForm1.Button1Click(Sender: TObject);
  // El botón simplemente permite crear una pestaña navegadora para la dirección URL
  // ingresada
var NewTabSheet : TTabSheet;
    NewBrowser: TFrame2;
    F: OLEVariant;
begin
  // Para que funcione correctamente debe haber inicialmente una pestaña 
  //con una ventana de navegación
  NewTabSheet := TTabSheet.Create(PageControl1);
  // Edit2 contiene el nombre para la pestaña
  NewTabSheet.Caption := Edit2.Text;
  NewTabSheet.PageControl := PageControl1;
  NewBrowser := TFrame2.Create(Frame21);
  NewBrowser.WebBrowser1.Offline := True;
  NewBrowser.Align := alClient;
  NewTabSheet.InsertControl(NewBrowser);
  F := 0;
  PageControl1.ActivePage := NewTabSheet;
  with PageControl1.ActivePage do
    // Edit1 contiene la dirección URL a visitar
    NewBrowser.WebBrowser1.Navigate(WideString(Edit1.Text),F,F,F,F);
end;

Por último, y esto a título personal, me parece que no es suficiente con el código publicado. Es importante que transcribas el mensaje de error completo, así como la clase de la excepción involucrada para dar una idea de por donde va el problema. Con respecto a esto te recomiendo la lectura del hilo de la calidad de las preguntas

Hasta luego.

;)

Delphius 18-07-2004 04:34:20

Mensaje de error
 
hola,

Gracias por el consejo... la verdad es que como estoy fuera de casa (en vacaciones)... y no tengo el equipo adecuado para probrar el tipo de error producido... no lo he podido transcribir... lo que si me acuerdo es que decia en una parte: que el objeto Tframe2 ya existe...

Se que los programadores no tienen tiempo que perder... pero si alguien tiene el tiempo como para poder ver el mensaje de error correspondiente... estaría bien que lo copie en el foro...

Saludos, espero que haya una solución

Delphius 22-07-2004 03:59:11

Mensaje de error completo
 
Buenas,

Como ya volví de las vacaciones, (y no las pasé tan bien).. tuve un tiempito para ver el mensaje de error... y el mensaje es el siguiente:

Proyect Proyect1.exe raised exception class EComponentError with message 'A component named Frame2 already exists'. Process stoped. Use stop or Run to continue.

Y cuando presiono el OK me marca el error en la línea:

Código Delphi [-]
NewBrowser := TFrame2.Create(Frame2);

Al volver presionar Run, aparece un cuadro de díalogo con el siguiente mensaje:

A component named Frame2 already exists

Al dar Aceptar, me crea la solapa pero no asi el frame en su interior.

Me pregunto: ¿Existe otra manera de crear varias ventanas navegadoras con solapas, algo como el Crazy Browser (a lo mejor alguien usa dicho programa) ?}
Mi objetivo es programar un programa navegador que sea capaz de mantener en su interior varias ventanas en simultáneo de módo que resulte más cómodo tener una sola aplicación en la barra (ya que resulta tedioso y horrible tener muchas ventanas de IE abiertas).

Ha.. me preguntaba si hay alguna manera de poder detectar la URL de la orden de "Abrir en una nueva ventana" para que no me abra dicho vínculo en una ventana IE sino en una nueva solapa.

Desde ya muchas gracias...

jachguate 22-07-2004 17:47:38

Yo en tu lugar me instalaría Mozilla Firefox..., que tiene navegación por pestañas, y muchas otras gracias, sin todos los errores del IE.

Hasta luego.

:D

__hector 22-07-2004 23:05:09

Creo que el problema lo tienes en el constructor del objeto. Prueba pasandole un parametro self (o el mainform de la aplicacion) al constructor del nuevo frame, a ver que dice.

Delphius 24-07-2004 06:18:40

Respuesta a Hector
 
Disculpa Hector, no quiero parecer un tonto... pero... no se si entendí bien lo que me dijiste: ¿ dices que pase dentro del Create() el parametro Self ?.. lo he intentado... y surje el mismo error descripto. En cuanto a lo que dices al MainForm... no me quedo claro... ¿Podrías ser más específico? He probado varias combinaciones con el Self y ninguna funcionó...:(

jachguate 24-07-2004 07:38:44

Supongo que dentro del owner solamente podrá haber un objeto con el nombre Frame2. Podes hacer que la propia pestaña (TTabSheet) sea el owner, pasandolo como parámetro al constructor, o bien generar de alguna manera un nombre único para cada frame.

Esto último lo podes conseguir con un simple contador...

Eso si, me parece que Frame2 en ningún caso (aún cuando esté creado) debiera ser el owner de otras instancias de la misma clase... salvo que sepas lo que estas haciendo, claro.

hasta luego.

;)

Delphius 26-07-2004 00:41:17

En eso estuve pensando...
 
En respuesta a jachguate:

Estuve pensando en esa posibilidad... además se me ocurrió en poner una cantidad de pestañas e ir "mostrándolas" a medida que sea necesario.

El problema de esto último es que hará más lento la carga del programa y que cuando le pongo False a la propiedad Visible de las pestañas... siguen víendose, no me explico a que se debe esto...

¿Realmente se puede ocultar las pestañas? me pregunto...

jachguate 26-07-2004 15:14:25

Valete de la propiedad TabVisible.

La idea de tenerlas pre-creadas no me gusta mucho... pues no solo hace innecesariamente pesado el programa, sino impone un límite que un usuario como yo, te aseguro, querria rebasar... :D

Hasta luego

;)

Delphius 27-07-2004 05:10:08

Ya lo logre!
 
Buenas, saludos a todos!

Tengo buenas nuevas... si constante insistencia en no querer llegar a la idea de "pre-crear" pestañas me ha llevado a la locura... pero hay luz al final del túnel.

El error que tanto dolores de cabezas me ha traído por fin a desaparecido con la siguiente sentencia:
Código Delphi [-]
NewBrowser := TFrame2.Create(Tform1.CreateNew(Frame21));

Cuando termine el sistema lo colocaré en el foro.. por si alguien está interesado...

Ahora si... no se si habrir un hilo nuevo o no porque me surgió una duda:
¿Es posible detectar la URL destino cuando alguien da la orden de "abrir en una ventana nueva" ?... lo que quiero hacer es crear una pestaña navegadora con dicha URL en ves de que abra el vínculo en una ventana IE...

Gracias, por su ayuda...


La franja horaria es GMT +2. Ahora son las 05:46:51.

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