Página 1 de 1

Modificar header con objeto Shell.Explorer.2

Publicado: 01 Mar 2012, 12:33
por Ximorro
Hola amigos.
Siguiendo ejemplos en los foros creo una página html embebida en un control de mi GUI con un código más o menos como este:

Código: Seleccionar todo

$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 10, 40, 520, 460)
$oIE.navigate("about:blank")
While $oIE.busy
	Sleep(100)
WEnd

With $oIE.document.body
	;.scroll = "no"
	.style.textalign = "justify"
	.style.fontsize = "12px"
	.style.fontfamily = "Arial"
	.bgcolor = "EEEEEE"
	.innerHTML = _CadenaHTML()
EndWith
_CadenaHTML() me devuelve el contenido de BODY y funciona todo perfectamente.
Ahora bien ¿cómo modifico cosas en HEAD?

Creía que sería más fácil encontrar en la web el modelo de objetos de Shell.Explorer.2, no sé si es que no he sabido buscar, pero bueno, al final he encontrado esto, que está muy bien:
http://www.w3schools.com/jsref/dom_obj_document.asp

Vale, el problema es que para lo que va en el tag HEAD sólo encuentro para cambiar el Title y los tag Meta.

En este caso concreto lo que quiero es cargar una página de estilos. En un html pondría esto dentro de HEAD:
<LINK REL="STYLESHEET" href="urlAMiArchivo.css" type="text/css">

¿Cómo pongo eso si creo el objeto como pongo arriba? ¿O quizás hay que crear el objeto de otra manera?
Mi inquietud inmediata es esta del estilo, si se hace de otra manera que no implica tocar el header del html pues encantado de saber cómo.
Si también sabéis cómo se pueden modificar otras cosas en la cabecera también será muy interesante saberlo (por ejemplo para insertar un script, definir estilos (no necesariamente desde otro archivo) u otras cosas que vayan ahí)

Re: Modificar header con objeto Shell.Explorer.2

Publicado: 01 Mar 2012, 13:29
por Ximorro
Bueno, creo que he encontrado una manera.

Sería algo así:

Código: Seleccionar todo

$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 10, 40, 520, 460)
$oIE.navigate("about:blank")
While $oIE.busy
	Sleep(100)
WEnd
With $oIE.document
	.open("text/html")
	.write('<html><head><LINK REL="STYLESHEET" href="http://urlestilo/archivo.css" type="text/css"></head><body></body></html>')
	.close()
EndWith
Y posteriormente se haría la modificación de BODY (se puede hacer ahí para cargar uno inicial, pero es que voy modificando dinámicamente la página manteniendo ese estilo)

El caso es que igual hay que hacer un navigate("about:blank"), porque si no no devuelve un objeto document sobre el que trabajar. ¿Eso se puede hacer de otra manera? ¿hay algún CreateNewDocument o algo por el estilo?
Vaya, si tenéis enlaces sobre la documentación de los métodos de Shell.Explorer.2 serán muy bien recibidos.

Esta es una solución que he encontrado para hacer el HEAD inicial y que para poner el estilo que no cambio nunca me funciona. Pero en general no es perfecta porque no puedo modificarlo dinámicamente igual que hago con BODY, sólo puedo poner una cabecera inicial y si quiero cambiarla hay que rehacer el objeto completamente.

Así que si sabéis cómo mejorarlo...

Re: Modificar header con objeto Shell.Explorer.2

Publicado: 01 Mar 2012, 14:16
por Ximorro
Ale ya vuelve el que habla solo :smt003
Bueno es que yo aunque pregunte sigo investigando, y como a veces encuentro soluciones os lo cuento por si alguien tiene el mismo problema.

El caso es que ya sé cómo cargar el archivo de estilos, es con document.createStyleSheet, encontrado aquí:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Así que no hace falta crear la cabecera (en realidad todo el documento) con open, write, etc. Lo del estilo en concreto se puede hacer así:

Código: Seleccionar todo

$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 10, 40, 520, 460)
$oIE.navigate("about:blank")
While $oIE.busy
	Sleep(100)
WEnd
$oIE.document.createStyleSheet("http://url_estilo.css")
Y luego ya hago las modificaciones a BODY modificando body.innerHTML y mantiene el estilo cargado.

Re: Modificar header con objeto Shell.Explorer.2

Publicado: 01 Mar 2012, 14:28
por BasicOs
Hola, Otras opciones para "retocar páginas onthefly":
Desde el servidor, si tienes control del servidor puedes absorber primero la página y luego reinterpretar esta, y volverla a lanzar al cliente para devolverla en plan PHP que fabrica una salida personalizada desde el servidor, capturando en el servidor, antes de reenviar la página a "retocar" con inetget(). Tambien se puede hacer algo así con un proxy pero no he experimentado esto último.
eg:
1.leo la información directamente de la página de elpais.com en una variable
2.hago los cambios EN LA VARIABLE, reemplazando texto: de la noticia como ej. que la selección de futbol ganó en vez de perder quien marcó los goles, (eg messi que no está) cambio algo así.
3. la devuelvo la variable por tcp/ip al cliente que ha leido la página en http://www.miservidor.com/paginaselecciontrucada.php (o .aha con autoit)
4. Vaya sorpresa

Desde el cliente: Además de usar el objeto write, lo mismo, en vez de grabarla en el objeto, la grabas en variable y luego fichero con inetget() , y luego lees la página modificada con la función que usas, pero en vez de leerla desde internet, leerla desde disco con el navegador ya que es una página refabricada.

Claro todo depende de la complejidad de la página, lo anterior funciona muy bien para páginas html con jpgs datos y similares.

Salu22:)
PD:
He estado mirando el HTML5 famoso y es una tontez de lo facil que es para un programador, es el mismo HTML pero le añaden un monton de tags y modificadores de tags dentro de los tags para hacer cosas que antes había que estar programando en javascript. O sea que para lo que antes necesitabas 50 lineas de código ahora es un tag o un complemento de tag, por ejemplo aparte del type="text" hay un type nuevo que es "email" que te chequea que sea un email o url para url, etc... listas rápidas en plan intellisearch con un par de lineas.

Han simplificado un montón, y lo del famoso FLASH para video ahora es una tonteria que simplemente pones el nombre del fichero de video y unos parametros autoplay, tamaño, si quieres controles de manejo, etc... SIN NINGUNA librería ni cosas extras, ya está embebido en el navegador con lo que es mucho más estable. ;) A probarlo a ver que impresión os dá ;)

Re: Modificar header con objeto Shell.Explorer.2

Publicado: 02 Mar 2012, 09:29
por Ximorro
Gracias por las técnicas, aunque no estaba modificando páginas existentes, sino creándolas desde cero, escribiendo a mano o quizás cargando fragmentos html, pero todo en local.
La idea es usar un shell.explorer para mostrar "cosas" formateadas (texto, tablas, imágenes). En vez de estar creando el objeto cada vez y la página desde cero es más rápido modificar el Body (eso sí sabía cómo se hacía), pero me interesaba tener puesto un estilo común a todos los mensajes, que es lo que no sabía cómo hacer porque eso se toca en Head, donde no hay un innerHTML o no funciona igual...