![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Problema con el Onhint
Hola amigos del club:
Tengo el siguiente problema con un aplicación, estoy mostrando las ayudas en una barra statusbar al desplazar el mouse sobre cualquier objeto de la ventana, esto me funcione correctamente. El problema sucede cuando creo las ventanas dinamicamente mediante este codigo.
Cuando quiero mostrar una ventana llamo este procedimiento y al cerrar la ventana me arroja una exepción cerrandome la ventana que creo la nueva ventana el sitio de codigo que me arroja la excepcion es este
Con este codigo activo las ayudas de cada componente de la ventana
en la excepcion que me arroja aparece un error creo de mensajes pero no se como solucionar este error, este error no aparece cuando las ventanas son ya creadas automanticamente por delphi y se muestran mediante showModal. No se si es clara la pregunta Gracias por la atencion prestada Última edición por roman fecha: 22-11-2006 a las 23:24:38. |
#2
|
||||
|
||||
![]() realmente no entiendo del todo tu pregunta, pero te puedo dar algo de lo que comprendí, en primer lugar, utilizaría el siguiente procedimiento para mostrar las formas:
ahora, para capturar el Hint de tu app... utilizaría el siguiente método:
hasta aquí hemos declarado el procedimiento que responderá al evento OnHint de tu applicación... falta indicar que es esté el que va a responder, para ello escribe en el OnCreate de tu forma principal la siguiente línea de código:
espero que no te de más errores, por lo menos a mi no me ha dado fallo, digo, si era esto lo que preguntabas. saludos!!! Última edición por roman fecha: 22-11-2006 a las 23:25:50. |
#3
|
||||
|
||||
Gracias por tu ayuda.
Pero te cuento e pobado tu funcion mostrarmodal y simplemete no me crea la ventana, cabe anotar que estoy trabajando con delphi 5 y DB Paradox. Los ejemplos de codigo de mi pregunta los e a prendido en la caraoculta de delphi, creo que no deben estar mal. Gracias |
#4
|
||||
|
||||
Lo primero de todo es decir el error concreto que da, si es un access violation, un abstract error o lo que sea, mientras tanto es muy difícil ayudarte.
En cuanto a lo del hint, hay 2 cosas: - Application.Onhit := Mihint, no me queda claro si lo haces en cada ventana que creas, o solo en una. Deberías hacer eso en una sola ventana, así todos los hints de todas las ventanas se iran al LMDSTATUSBAR. - ¿Por qué haces uso de un try finally vacío?
Comentarios de la función MostrarModal:
si vForma es igual a nil, entonces no se crea ¿Por qué? Desde mi punto de vista debería ser al revés. Si vForma es igual a nil, significa que no está creada, por tanto se debe crear y mostrar. Si vForma es distinto de nil, significa que está creada o sabe dios si se ha destruido ya.... para solventar esto, sigue leyendo. Tampoco veo necesario usar Release (ya que no estas cerrando la ventana desde un método de esa misma ventana), lo cierras desde una ventana distinta y para ello sería mejor usar Freeandnil(VForma); así la segunda o tercera vez que se llame a Mostrar modal no dará fallos. Yo haría la rutina de esta forma:
Aunque no le veo mucho sentido, ya que deja muy poca interacción con dicha ventana, es decir, después de mostrarse, se cierra.... no da tiempo a recoger valores de retorno de dicha ventana... que suelen ser muy útiles. En fin, tú sabrás qué y cómo lo estas haciendo. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#5
|
||||
|
||||
Lo primero de todo es decir el error concreto que da, si es un access violation, un abstract error o lo que sea, mientras tanto es muy difícil ayudarte.
Lepe te cuento el erro que me da es este Proyecto Factura.exe raised exception class EAccessViolation with message ' Access violation at address 0067755...... etc ' En cuanto a lo de hint te cuento que esta asignación Application.Onhit := Mihint la realizo al crear cada ventana
lo mas extraño de este error es que cuando la creación automatica de ventanas las realizaba delphi al comenzar el programa y yo solo las mostraba con ShowModal no aparecia pero ahora como el programa a ido creciendo me a tocado manejar a mi las ventanas pero entonces me a aparecido este error, la unica solución que he podido hacer por el momento es quitar las ayudas de las ventanas. Otra cosa que veo que sucede es que cuando creo una ventana modal y esta a su vez llama a otra ventana modal parace el error cosa que no sucede cuando la ventana modal no llama a otra. En fin creo que es un problema con mensanjes ya que cuando cierro la ventan el mensaje del Onhin trata de buscar el statusbar donde se muestra la ayuda pero como este ya ha sido elimnado no lo encuentra y genera el error. En cuanto a lo otro que tu dices esa función que tu corregiste muy amablemente no es la que estoy utilizando, la que utilizo es la del mensaje original. Gracias ojala esto deje mas claro mi poblema. |
#6
|
||||
|
||||
Ahora si es posible contestarte "efectivamente".
Al poner esa línea de código en cada ventana, el Hint se mostrará en la última ventana que se abra, hasta ahí correcto. Si cerramos esa ventana, ¿el hint donde se mostrará?.... pues mientras no se cree otra ventana nueva, el hint se intentará mostrar en esa última ventana que ya ha sido cerrada, es decir, liberada de memoria RAM... o lo que es lo mismo, está intentando acceder a una zona de memoria donde ya no reside la ventana; supongo que ahora entiendes el "access violation". Si puedes, me gustaría que comentases qué tipo de interfaz usas, es decir, si es SDI ó MDI. Si es SDI, abres una ventana y después otra y después otra.. controlar el hint en este escenario puede ser "incómodo para ti". Si es MDI, la solución es muy fácil. El Hint se muestra en un statusbar de la ventana MDI; como esta ventana siempre está creada y mostrándose, se verá siempre el hint sin problemas. En este escenario la asignación Application.Onhint := hint sólo es necesario hacerlo en el OnCreate del formulario MDI. Ten en cuenta que estas asignando una propiedad del objeto Application, así que, una sola asignación es válida para todas las ventanas que tengas en tu programa. Cuando Delphi crea las ventanas, todas las ventanas están creadas y disponibles durante toda la ejecución de la aplicación, por tanto, siempre está disponible el procedimiento "Mihint" de cada ventana, por eso no da error. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#7
|
||||
|
||||
el problema según veo es la mezcla que haces de accesos entre TApplication y las formas que creas. El error de violation error es debido a que en algun punto estas accesando a un objeto o método que no ha sido creado aún o bien ya fue destruído.
Si revisas tu algoritmo te recomiendo que separes totalmente TApplication de tus TForms de manera que lo que muevas en uno no afecte al otro. En tu ejemplo se supone que las ventanas no deben de "saber" que existe Application que es quien las controla y no a la inversa. Puedes por ejemplo hacer lo siguiente: primero creas el form (pero sin mostralo) y una vez mostrado obtienes el hint y se lo pasas a la aplicacion. Despúes muestras la ventana. Al cerrar la ventana haces lo contrario.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#8
|
||||
|
||||
Gracias por la ayuda que me han brindado:
Mi aplicación es MDI ya que se crea una ventana y hasta que esta no se cierra no se puede acceder a ninguna otra. Quisiera saber como se hace esto Puedes por ejemplo hacer lo siguiente: primero creas el form (pero sin mostralo) y una vez mostrado obtienes el hint y se lo pasas a la aplicacion. Despúes muestras la ventana. Al cerrar la ventana haces lo contrario. __________________ Es decir yo se como acceder al hint pero como hago lo contrario de pronto si es posible me lo de en un ejemplo. Gracias |
#9
|
||||
|
||||
Gracias por la ayuda:
Primero creo que mi aplicación es MDI ya que solo se accede a una ventana a la vez es decir se crean ventanas modales a partir de una principal. Otra cosa es que cada ventana tiene un componente statusbar que donde yo muestro el contenido de las ayudas de cada ventana. Quisiera saber como se hace esto Cita:
No he podido dar con el chiste y aun me sigue saliedo el error. Gracias Última edición por Vlady fecha: 27-11-2006 a las 21:16:02. |
#11
|
||||
|
||||
Gracias roman prove con esta instrucción y todo me funcioné excelente
Gracias de nuevo |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Reactivar onhint | rafa_adrim | OOP | 5 | 24-01-2006 16:22:57 |
![]() |
|