miércoles, 24 de diciembre de 2008

Eventos para OLE

Hace bastante tiempo que echaba en falta el manejo de eventos de los COM. Las librerías que existen y que manejan eventos tienen asociados controles visuales, por ejemplo con Fivewin, que maneja perfectamente objetos como internet explorer con sus eventos, pero siempre a condicion de que sean visuales.
Por suerte hace algún tiempo Oskar Lira hizo pública una librería que mostraba la forma de hacerlo, aunque al igual que el resto requiere estar asociado a un control. Mirándo la forma en la que maneja eventos hice algunas pruebas con el código propio para usar Active Template Library guiándome por el código de Oskar y ¡salió funcionando! El código de Oskar, aunque al principio parecía chino, luego de leer y estudiar un poco resulto no ser tan complejo y, como todo, solo necesita de un poquito de know how.

¿How To?
Hay una clase propia de Windows, AtlAxWin, que hace las veces de wrapper al control OLE. Normalmente esta clase tiene como ventana padre la de nuestra aplicación, y lo que hice fue cambiar ese padre (en modo consola somos algo así como huérfanos de ventana padre) por la ventana del escritorio.
El resto es lo mismo para los ActiveX, y ya estaba todo hecho, solo quedaba ensamblar.

Usando Eventos con ADO
Tengo mis propias clases que envuelven las clases reales de ADO, para poder acceder a los campos de los resultados directamente por el nombre y usar verbos típicos de dbase como gotop, skip, etc., como si fuese una tdatabase. Ademas la conexión tiene un modo FROM USER, que incorpora la posibilidad de consultarle al usuario la conexión. Esto lo explica bien Biel en su blog,
y el conocimiento de ADO original viene de las clases de José Luis Capel. A ambos mi reconocimiento y agradecimiento.

Las clases de ADO que originalmente usaban un CreateObject(), ahora usan un OleWEvent():New(), y eso es todo lo que habría que hacer para usar las nuevas clases en lugar de las originales.

En los archivos hay un primer ejemplo, que es un proyecto con xMate, donde estan las clases, el 100% del código fuente, y una prueba con Harbour puro, sin FiveWin.

En el segundo ejemplo, hay un proyecto de xMate con FW, que es el programa testxbrw2 del directorio Samples de Fivewin, pero modificado para que use ADO, y muestre la reaccion a los eventos de la nueva clase.

Una advertencia importante: es muy fácil enredarse con los eventos, es lo primero que me pasó al meterme con FW. Resulta que si dentro del evento actualizo la ventana que contiene un XBrowse, el pintado del xbrowse me genera nuevos eventos cuando todavía no he terminado de procesar el primero, y la aplicación queda en un bucle de eventos y hay que matar el proceso para salir, por favor tenedlo en consideración.

También he probado las OleWEvent con otros ActiveX como PdfCreator y funciona a la perfección. Si haces la prueba con algún ActiveX que use eventos por favor comenta los resultados.

¡Feliz Navidad!

5 comentarios:

Oscar dijo...

Carlos:

Primero que nada, muchas gracias por tomarte el tiempo de leer y entender el codigo de soporte de eventos a los activex.

Sin embargo, me gustaria comentar que no es necesario que crees el control sobre la ventana Escritorio.

la TOleAuto de [x]Harbour permite instanciar perfectamente cualquier objeto COM/OLE incluso los que tienen un hWnd, esa es la primer parte obtener un pDispath.

Despues bastaria con hacer un Sink a un control ActiveX hecho por nosotros. que es el caso del soporte activex que escribi

En el metodo Invoke, que es donde llegan todos los eventos subimos a nivel xbase, y la magia esta hecha.

ahora, yo en mi caso optaria por hacer una clase que herede de TOleAuto y modificar el New() para que haga el ConnectEvents y quedaria un poco mas ligero tu codigo.

Respecto a los nombres de los eventos, hace tiempo escribi un TypeLibBrowser que te permite entre otras cosas inspeccionar los controles activex en Run Time desde nuestras apps [x]Harbour

Buscame y armamos un obj. para que incluyas lo del nombre de los eventos en tu clase

saludos y muchisimas Felicitaciones

oSkAr
OSDI SoftWare

Carlos Mora dijo...

Hola Oscar, tanto tiempo sin cruzarte!
Entiendo que los objetos COM/OLE se pueden crear sin mucha historia, de hecho los usamos así desde hace mucho, pero el punto es que en aplicaciones de tipo consola no existe un control al cual asociar, que es el caso que me preocupa, como por ejemplo los objetos de ADO.
Puede que haya cometido alguna mala interpretación y esté algo confundido, pero ya vemos como hacemos así me lo explicas. Voy a releer el tema, pero insisto en que el punto es no tener un control visual al cual colgarle los eventos.
La idea es pulir la clase para mejorar la TOleAuto original.

Agradezco sinceramente tu apoyo, espero que podamos coincidir así me desasnas un poco.

Un saludo y muchísimas felicidades.

Carlos Mora dijo...

Oscar,
¡Tienes razón, me había liado, estoy haciendo muchas cosas de más! me guiaba por el código escrito y no me dí cuenta que no necesitaba crear el control host, que con el de la ActiveX alcanza!
Es que me lié mirando el código existente para entenderlo y al final me terminé enredando.
Ahora la subclase quedará muuuuucho más limpia.
Muchas gracias!

Oscar dijo...

Carlos:

Bueno la instanciada del objeto se la dejas a la TOleAuto, con el codigo del soporte de Eventos que escribi para FreeWin, unicamente haces el sink y tienes los eventos ya a nivel [x]Harbour, al heredar de la clase TOleAuto ya no necesitas el Error Handler.

Respecto a los nombres de los eventos en cuanto te pueda ver, te paso un obj que te permite mostrar en tiempo Real toda la documentacion del ocx.

ahhhh, por ahi me comentaron que al parecer quieren incorporar el codigo a Harbour. solo te pido de favor que no se les olvide Agregar en el Header tal como lo hiciste en tu codigo que el trabajo es basado en el soporte ActiveX de FreeWin. y un Agradecimiento a oSkAr y Andy. que somos los autores originales de ese codigo

saludos y Feliz Año !!!!

oSkAr
OSDI SoftWare

Anónimo dijo...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!