PDA

Ver la Versión Completa : Multi-navegador


Delphius
10-07-2004, 03:29:12
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:

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:

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 (http://www.clubdelphi.com/foros/guiaestilo.php), 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.


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
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
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:


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 (http://www.mozilla.com/products/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
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 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
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:

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...