Como mostrar ayuda al pasar por un PictureButton
Quisiera poder mostrar un texto que sirva de ayuda al usuario en el momento que pasa el mouse sobre un PictureButton, así como cuando uno pasa el mouse por alguna opción del menu y se muestra un texto pequeñito justo bajo la opción para explicar que hace dicha opción.
1 respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
Creo que lo que necesitas es un QuickHelp, power builder no cuenta con un servicio de ese tipo, pero existen algunos procedimientos en las pfc's, para poder manejar este tipo de servicios, personalmente yo lo instituí en mis aplicaciones utilizando un STATICTEXT, el cual esta acoplado a un evento timer, del propio control statictext, y relacionado con el evento mousemove, del control que presenta el quick-help.
Una solución alterna también la puedes encontrar en la demo que tiene integrada la instalación de power builder, donde presentan este tipo de solución utilizando pfcs, ademas tienes el código fuente.
Espero esto pueda ser de utilidad para resolver tu problema.
Una solución alterna también la puedes encontrar en la demo que tiene integrada la instalación de power builder, donde presentan este tipo de solución utilizando pfcs, ademas tienes el código fuente.
Espero esto pueda ser de utilidad para resolver tu problema.
No te preocupes, personalmente no soy usuario de las pfc's, aunque esto no quiere decir que no puedan ser de utilidad, sin embargo personalmente soy del pensar que mientras menos dependas de librerías de terceros mejor, aunque esto sea de alguna manera difícil de cumplir, existen ayudas propias de power builder con respecto a las pfcs, la mismo tiempo un manual del usuario, que puedes bajar en www.sybase.com en el área de support, busca la opción de products manual, o algo así.
Siempre existe la posibilidad de que tu construyas tus propias librerías de trabajo, cosa que recomiendo mucho a mis colegas, no importando el lenguaje de programación que utilicen, esto tiene un beneficio incomparable, puesto que el control es en un 100% tuyo, permíteme incluir en este espacio una respuesta que hace un tiempo atrás escribí para una estimada colega, y pues la solución la dejo a tu criterio, tanto pfc's como librerías propias son funcionales, pero no siempre son adecuadas.
La pregunta es muy parecida a la tuya con respecto a las pfcs.
-----------------------------
Estimada colega
Una de las cosas por las cuales un programa es exitoso y eficiente, es porque el desarrollador tiene el máximo control de este.
Esto significa que para poder ser eficiente en el desarrollo de aplicaciones tienes que conocer y por ende poder controlar dichas aplicaciones, intentando depender en un 0% de librerías de terceros.
El caso de las librerías PFC's de PB, dan soluciones a problemas muy puntuales, sin embargo, cuando migras a otras versiones del lenguaje, estas también cambian y puede que ya no funcionen tal y como tu las conociste en la version anterior.
Personalmente yo he desarrollado una serie de funciones, clases y objetos, genéricos que me permiten agilizar y hacer más eficiente mi trabajo de desarrollo, puesto que el que controla desde su inicio principal estas utilidades soy yo, no dependo de una nueva version.
Por darte un ejemplo, en la version 8 el control window posee una opción de centrado. Esta opción yo ya la había implementado desde la version 4, sin embargo he preferido mi version, puesto que la version de PB no funciona apropiadamente, cuando la ventana es tipo child y se encuentra dentro de una aplicación mdi.
Cosas como estas pueden hacerte la vida de cuadritos, por lo que insisto, desarrolla tus propias librerías, esto puede que te lleve un tiempo preciado en la fase de desarrollo, pero al final, el tiempo se acorta, y el desarrollo de tus aplicaciones en general, son más eficiente, y también se acorta el tiempo de desarrollo.
Piensa que un mantenimiento de una tabla, es simplemente altas, bajas, cambios. Con esta ideología, yo he desarrollado un control, que unicamente entregándole un datawindow, el ya ejecuta todo esto y un poco más.
De tal manera que un mantenimiento, para mi es cuestión de diseñar el datawindow y colocarlo en una instancia de mi control. Y si como este tengo búsquedas, reportes, vistas, menús, mensajes, y un largo etc. simplemente heredo el control y ya
Los cambios o incrementos que necesito hacer lo hago en el control heredado, respetando siempre el original.
En el momento de hacer una modificación al objeto principal (padre), TOOOOODOS los objetos que heredaron sus características, automáticamente reciben esos cambios. Recompilas, linkas y ya ta.
Claro esto que hoy te cuento, ayer era tiempo de desarrollo.
El consejo más sano y mejor que puedo darte es el siguiente.
No caigas en el circulo vicioso de no hay tiempo, puesto que aumenta el trabajo no hay tiempo y aumenta el trabajo.
Proponte un tiempo de desarrollo para tus librerías personales, y estas utilizalas heredando los controles y adicionando en las herencias esas cosas especiales que pueda tener algunos procesos o pantallas.
Esto puede que te lleve un poco más de tiempo, pero si lo piensas, este tiempo disminuirá en la parte de desarrollo
Echale muchas ganas, exponle a tu jefe este punto de vista, no es que yo sea el master of the univers, pero tengo más o menos 17 años de trabajar en el desarrollo de aplicaciones, y no hay otro método más corto para hacerlo, lo más importante es TENER EL CONTROL.
Créeme que he probado todas las herramientas de terceros que puedan existir, y en varios lenguajes, y la conclusión es, no existe herramienta eficiente sino tienes el control propio de esta.
Espero estos comentarios puedan servir de algo para resolver tu problema, me tienes a tus ordenes para lo que pueda ayudarte.
Siempre existe la posibilidad de que tu construyas tus propias librerías de trabajo, cosa que recomiendo mucho a mis colegas, no importando el lenguaje de programación que utilicen, esto tiene un beneficio incomparable, puesto que el control es en un 100% tuyo, permíteme incluir en este espacio una respuesta que hace un tiempo atrás escribí para una estimada colega, y pues la solución la dejo a tu criterio, tanto pfc's como librerías propias son funcionales, pero no siempre son adecuadas.
La pregunta es muy parecida a la tuya con respecto a las pfcs.
-----------------------------
Estimada colega
Una de las cosas por las cuales un programa es exitoso y eficiente, es porque el desarrollador tiene el máximo control de este.
Esto significa que para poder ser eficiente en el desarrollo de aplicaciones tienes que conocer y por ende poder controlar dichas aplicaciones, intentando depender en un 0% de librerías de terceros.
El caso de las librerías PFC's de PB, dan soluciones a problemas muy puntuales, sin embargo, cuando migras a otras versiones del lenguaje, estas también cambian y puede que ya no funcionen tal y como tu las conociste en la version anterior.
Personalmente yo he desarrollado una serie de funciones, clases y objetos, genéricos que me permiten agilizar y hacer más eficiente mi trabajo de desarrollo, puesto que el que controla desde su inicio principal estas utilidades soy yo, no dependo de una nueva version.
Por darte un ejemplo, en la version 8 el control window posee una opción de centrado. Esta opción yo ya la había implementado desde la version 4, sin embargo he preferido mi version, puesto que la version de PB no funciona apropiadamente, cuando la ventana es tipo child y se encuentra dentro de una aplicación mdi.
Cosas como estas pueden hacerte la vida de cuadritos, por lo que insisto, desarrolla tus propias librerías, esto puede que te lleve un tiempo preciado en la fase de desarrollo, pero al final, el tiempo se acorta, y el desarrollo de tus aplicaciones en general, son más eficiente, y también se acorta el tiempo de desarrollo.
Piensa que un mantenimiento de una tabla, es simplemente altas, bajas, cambios. Con esta ideología, yo he desarrollado un control, que unicamente entregándole un datawindow, el ya ejecuta todo esto y un poco más.
De tal manera que un mantenimiento, para mi es cuestión de diseñar el datawindow y colocarlo en una instancia de mi control. Y si como este tengo búsquedas, reportes, vistas, menús, mensajes, y un largo etc. simplemente heredo el control y ya
Los cambios o incrementos que necesito hacer lo hago en el control heredado, respetando siempre el original.
En el momento de hacer una modificación al objeto principal (padre), TOOOOODOS los objetos que heredaron sus características, automáticamente reciben esos cambios. Recompilas, linkas y ya ta.
Claro esto que hoy te cuento, ayer era tiempo de desarrollo.
El consejo más sano y mejor que puedo darte es el siguiente.
No caigas en el circulo vicioso de no hay tiempo, puesto que aumenta el trabajo no hay tiempo y aumenta el trabajo.
Proponte un tiempo de desarrollo para tus librerías personales, y estas utilizalas heredando los controles y adicionando en las herencias esas cosas especiales que pueda tener algunos procesos o pantallas.
Esto puede que te lleve un poco más de tiempo, pero si lo piensas, este tiempo disminuirá en la parte de desarrollo
Echale muchas ganas, exponle a tu jefe este punto de vista, no es que yo sea el master of the univers, pero tengo más o menos 17 años de trabajar en el desarrollo de aplicaciones, y no hay otro método más corto para hacerlo, lo más importante es TENER EL CONTROL.
Créeme que he probado todas las herramientas de terceros que puedan existir, y en varios lenguajes, y la conclusión es, no existe herramienta eficiente sino tienes el control propio de esta.
Espero estos comentarios puedan servir de algo para resolver tu problema, me tienes a tus ordenes para lo que pueda ayudarte.
Hola de nuevo... tengo un problema, nunca he usado pfc's ni se como se usan, podrías explicarme un poquito o decirme de alguna web donde exista documentación del tema por favor. Gracias por tu tiempo
Muchas gracias, voy a seguir tus consejos y crearé mis propias librerías, en realidad también a mi me parece lo mejor, y bueno, para resolver mi problema del "QuickeHelp" quisiera que me des una ayudadita, ¿cómo es que tu lo implementaste?... ¿Podrías explicarme un poco más? Gracias
Claro:
Haciendo mención a lo anterior, mis librerías están basadas en manejadores, por ejemplo, tengo un manejador de reportes, el cual esta basado en 2 datawindows (por supuesto), esta es una pantalla completa, que contiene un datawindow control, 7 botones, 2 barras una horizontal y otra vertical, un statictext con color verde pálido, un par de groupbox.
Los 7 botones los posiciono en la parte superior de la forma o ventana, todos acoplados con un groupbox, el otro groupbox, retiene el datawindow control, el cual recibe un datawindow object, ( en este control esta basado el concepto de generalidad), las barras
vertical y horizontal están una del lado izquierdo y la otra debajo del datawindow control
Imagen general:
Las tareas de los botones son:
1 - generar el reporte: este botón ejecuta un POSTEVENT(), de un evento de usuario creado en la forma por ejemplo ue_reporte()
2 - imprime el reporte: efectúa una llamada a una pantalla que maneja directamente las propiedades de impresión del datawindow
central, o sea el que retiene directamente el reporte.
3 - cambia la intentar del reporte: utiliza la propiedad del datawindow que permite ubicar el reporte vertical u horizontalmente.
4 - graba el resultado: este llama al cuadro de dialogo de SAVEAS() del datawindow central, el cual permite grabar varios formatos, el resultado, uno de estos puede ser excel, texto, o incluso un tipo reporte, propio de power builder.
5 - cargar un reporte: este botón carga un reporte ya generado anteriormente, (siempre y cuando haya sido grabado en el formato correspondiente)
6 - botón de salida: cierra la ventana.
7 - pintar o no el cuadro de rangos: este botón pone visible o invisible el otro datawindow, quien tiene la finalidad de recibir los valores condicionales del reporte siempre y cuando estos sean necesarios.
Los otros controles, como ya descubriste, un datawindow permite recibir un datawindow object, hecho como external datawindow, la idea es que tu como desarrollador, tengas el control de los tipos, nombres, etc. de las variables que se incluirán en el datawindow, sino es necesario este control simplemente es excluido de la ventana, utilizando el evento constructor, el cual pregunta si el datawindow control posee dato en la propiedad dataobject, (esto significa que tiene que manejar un datawindow control), si es así, coloca en true la propiedad visible, de lo contrario, en false,
el siguiente datawindow contendrá el datawindow object que genera directamente el reporte. Este no importa si es un tipo external o no,
las barras una (la vertical) actúa sobre el datawindow central, modificando el zoom del preview, con la finalidad de un zoom puramente visual, sin afectar en nada el resultado del reporte en la impresora.
La otra barra, la horizontal, tiene la finalidad de provocar en el datawindow central un zoom, que afecta directamente a el resultado del reporte en la impresora, o sea si el reporte sale del entorno de la hoja, con este tipo de zoom puedes encuadrarlo en la hoja, (por supuesto que esto afecta directamente en el tamaño del carácter).
Para emitir el reporte utilizo el evento antes mencionado el ue_reporte(), en este puedo extraer los datos de condición, del datawindow correspondiente, e incluirlos en el retrieve() del datawindow central, o bien construir un cursor, e insertar los datos rel resultado en el datawindow central en el caso que sea un external datawindow.
Y por fin el static-text, este esta ligado a el evento mousemove de cada command button, el cual enciende o apaga, en otras palabras pone en visible o invisible dicho control, dentro del propio control, existe un evento timer, el cual cuenta un numero de segundos, y luego cuando se vencen el control pasa a estado invisible, y detiene el timer event. El efecto es el deseado, cada vez que pasa el puntero por un botón este enciende el timer event del statictext, presenta un mensaje inscrito en el y recibido por cada botón, y pasado el tiempo este se vuelve invisible y detiene el timer event.
Los demás controles también contienen el evento mousemove, con la única intención de que si el static-text esta visible, simplemente lo apagan y detienen el timer event.
La utilización de dicha pantalla es simplemente utilizando la herencia, de tal manera que el original siempre es mantenido sin ninguna alteración, salvo una necesidad extrema, así pues cualquier cosa adicional la puedes incluir en la ventana heredada en la cual puedes hacer cualquier cosa.
De aquí cualquier cosa puede ser añadido, eso lo dejo a tu criterio e imaginación
Haciendo mención a lo anterior, mis librerías están basadas en manejadores, por ejemplo, tengo un manejador de reportes, el cual esta basado en 2 datawindows (por supuesto), esta es una pantalla completa, que contiene un datawindow control, 7 botones, 2 barras una horizontal y otra vertical, un statictext con color verde pálido, un par de groupbox.
Los 7 botones los posiciono en la parte superior de la forma o ventana, todos acoplados con un groupbox, el otro groupbox, retiene el datawindow control, el cual recibe un datawindow object, ( en este control esta basado el concepto de generalidad), las barras
vertical y horizontal están una del lado izquierdo y la otra debajo del datawindow control
Imagen general:
Las tareas de los botones son:
1 - generar el reporte: este botón ejecuta un POSTEVENT(), de un evento de usuario creado en la forma por ejemplo ue_reporte()
2 - imprime el reporte: efectúa una llamada a una pantalla que maneja directamente las propiedades de impresión del datawindow
central, o sea el que retiene directamente el reporte.
3 - cambia la intentar del reporte: utiliza la propiedad del datawindow que permite ubicar el reporte vertical u horizontalmente.
4 - graba el resultado: este llama al cuadro de dialogo de SAVEAS() del datawindow central, el cual permite grabar varios formatos, el resultado, uno de estos puede ser excel, texto, o incluso un tipo reporte, propio de power builder.
5 - cargar un reporte: este botón carga un reporte ya generado anteriormente, (siempre y cuando haya sido grabado en el formato correspondiente)
6 - botón de salida: cierra la ventana.
7 - pintar o no el cuadro de rangos: este botón pone visible o invisible el otro datawindow, quien tiene la finalidad de recibir los valores condicionales del reporte siempre y cuando estos sean necesarios.
Los otros controles, como ya descubriste, un datawindow permite recibir un datawindow object, hecho como external datawindow, la idea es que tu como desarrollador, tengas el control de los tipos, nombres, etc. de las variables que se incluirán en el datawindow, sino es necesario este control simplemente es excluido de la ventana, utilizando el evento constructor, el cual pregunta si el datawindow control posee dato en la propiedad dataobject, (esto significa que tiene que manejar un datawindow control), si es así, coloca en true la propiedad visible, de lo contrario, en false,
el siguiente datawindow contendrá el datawindow object que genera directamente el reporte. Este no importa si es un tipo external o no,
las barras una (la vertical) actúa sobre el datawindow central, modificando el zoom del preview, con la finalidad de un zoom puramente visual, sin afectar en nada el resultado del reporte en la impresora.
La otra barra, la horizontal, tiene la finalidad de provocar en el datawindow central un zoom, que afecta directamente a el resultado del reporte en la impresora, o sea si el reporte sale del entorno de la hoja, con este tipo de zoom puedes encuadrarlo en la hoja, (por supuesto que esto afecta directamente en el tamaño del carácter).
Para emitir el reporte utilizo el evento antes mencionado el ue_reporte(), en este puedo extraer los datos de condición, del datawindow correspondiente, e incluirlos en el retrieve() del datawindow central, o bien construir un cursor, e insertar los datos rel resultado en el datawindow central en el caso que sea un external datawindow.
Y por fin el static-text, este esta ligado a el evento mousemove de cada command button, el cual enciende o apaga, en otras palabras pone en visible o invisible dicho control, dentro del propio control, existe un evento timer, el cual cuenta un numero de segundos, y luego cuando se vencen el control pasa a estado invisible, y detiene el timer event. El efecto es el deseado, cada vez que pasa el puntero por un botón este enciende el timer event del statictext, presenta un mensaje inscrito en el y recibido por cada botón, y pasado el tiempo este se vuelve invisible y detiene el timer event.
Los demás controles también contienen el evento mousemove, con la única intención de que si el static-text esta visible, simplemente lo apagan y detienen el timer event.
La utilización de dicha pantalla es simplemente utilizando la herencia, de tal manera que el original siempre es mantenido sin ninguna alteración, salvo una necesidad extrema, así pues cualquier cosa adicional la puedes incluir en la ventana heredada en la cual puedes hacer cualquier cosa.
De aquí cualquier cosa puede ser añadido, eso lo dejo a tu criterio e imaginación
- Compartir respuesta
- Anónimo
ahora mismo