Thread y showmodal
Hola a todos, tengo un pequeño problema que no consigo resolver y agradeceria alguna ayuda.
Tengo una tabla con '0' a 'n' registros que se lee en un thread en el que se debe lanzar una modal por cada registro mientras haya, la modal tiene un bitbtn con Close en OnClik. El problema consiste (supongo) en el cerrado de la modal, ya que cuando se cierra la primera, se para el bucle Código del Thread: Código:
procedure TForm2.IdThreadComponent2Run(Sender: TIdThreadComponent); |
Con se para el bucle que quieres decir que se congela la aplicacion y el programa no sigue corriendo.
El showmodal deberia funcionar, el evento onclick te lo puedes ahorrar con la propiedad modalresult del bitbtn. El codigo no es exactamente lo que has puesto no?, porque
deberia ser
y no creas el bitbtn vinculado al formulario que creas. |
Ante todo, gracias por tu respuesta.
El resultado de cambiar Tform23 por Tform, tal como indicas, es el siguinete : [DCC Error] Principal.pas(491): E2010 Incompatible types: 'TForm23' and 'TForm' El formulario que tiene el botón (salir), es el Form23, ya que este debe crearse automaticamente cona cada nuevo registro de la tabla. El Form23 muestra el contenido de algunos campos de la tabla |
Se me olvidaba.
Cuando digo que se detiene el bucle, es que sólo se detiene el bucle de lectura de la tabla, la aplicación, que tiene otro thread que alimenta la ADOTable2 sigue funcionando, aunque no se generan las modal. |
En una nueva prueba (sin Onclick) y despues de aparecer y cerrar la segunda pantalla, se para el bucle. Cierro la aplicación y me da el siguiente error :
Exception class EOSError with message 'System Error. Code: 1400. El identificador de la ventana no es válido'. |
Perdon pense que lo creabas todo en ese procedimiento y solo habias puesto un ejemplo.
Se me ocurren dos cosas que destruyes el hilo con lo cual acabas el procedimiento o que utilizas la tabla y pase el puntero al ultimo registro con lo cual se acaba el bucle. He hecho algunas pruebas y a mi me funciona todo bien, tal vez el fallo este en otro parte del codigo pero no me hagas mucho caso lo mas probable es que mis conocimientos de novato no den para mas. A ver si alguno le expertos compañeros de estos foros te ayuda mejor que yo. Un Saludo |
A esas mismas conclusiones habia llegado yo, pero por mas que miro no veo como resolverlo. Aunque haciendo pruebas he podido ver que cuando cambio de la pantalla base a otra mediante el menú principal, la pantalla modal vuelve a aperecer, la cierro y adios. si vuelvo a la pantalla inicial a traves de menú, se repite la historia y asi hasta el final del bucle.
Es evidente que al cerrarse la modal, no se refresca hasta que hay otro cambio de form. |
Hola,
Cita:
Espero te sirva.;) Saludos. |
En estos momentos el bitbtn, no tiene OnClick.
En Miscellaneous tiene los valores Default = True ModeResult = mrOK |
Supongo que ya has lo has intentado pero intenta depurar, pon un punto de ruptura en el bucle y ve ejecutando paso a paso a ver que hace donde va la ejecucion una vez parado el bucle.
|
Yo no sé ni por donde entrar a este tema. No te lo tomes a mal, solo voy a enumerar los posibles fallos/defectos que le veo a la implementación actual:
1 - Crear una ventana por cada registro existente en la tabla es demasiado; si hay 40 registros.... ¿40 ventanas que el usuario tiene que hacer clic?¿para qué? si no se le deja eligir nada al usuario, acto seguido se borra el registro por código delphi. 2 - No veo que se destruya la ventana Form23 por ningún lado, hay varias formas, pero lo más fácil sería en el OnClose de TForm23 añadir :
3 - El "Adotable2.Next" sobra, ya que al borrar un registro, automáticamente se muestra el siguiente en los controles DBAware, si además hacemos un .Next, estamos saltando un registro sin borrarlo. Y todo esto sin entrar en diferentes hilos de ejecución, concurrencia, etc. Por que si el Thread está borrando registros, no quiero saber lo que hará la aplicación principal con otro Adotable que intente editar esos registros ya borrados. Si quieres informar al usuario que se ha borrado 20 registros, hazlo así: En lugar de un ShowMessage, podrías mostrar un Form con un Memo, dentro del memo añade ese "mensaje", será más cómodo para el usuario. Campo1, CAmpo2, son dos campos que quieres mostrar al usuario para que entienda el mensaje, por ejemplo el número de factura que se ha borrado o el nombre del cliente que se ha borrado (es un ejemplo, claro). De esta forma, el usuario no tiene que hacer clic en ninguna ventana, pero tiene el resumen de lo que ha pasado. Espero te sirva, Saludos. |
Intentaré explicarme algo mejor
- El primer thread genera esta tabla con determinados registros de otra para no parar el proceso mientras se responde a las pantallas mostradas - El segundo thread debe mostrar la información al usuario, quien debe confirmar en la modal el enterado y entonces se borra el registro. - como caso excepcional debiera haber a lo sumo 4 o 5 registros en espera de respuesta, con lo que si las pantallas quedasen anidadas, miel sobre ojuelas. -Que se intente grabar en la tabla justo en el mismo instante en que se borra? -Pude ser un riesgo, pero, no se me ocurre otra forma de disparar un aviso automatico, cuando se graba 1 registro en la tabla que no sea, con un thread preguntando permanentemente |
Un ejemplo (no real) para entender mejor lo anterior, pdria ser:
Un contador númerico, va grabando su contenido en una tabla, conforme incrementa su valor. Determinados valores (aleatorios) de esa tabla generan un aviso, que debe ser confirmado por un usuario, pero en tanto el usuario responde el contador no debe parar y seguir incrementando su tabla. |
No voy a criticar tu forma de interactuar con el usuario, auque como h a dicho lepe, puede ser un poco incomodo estar haciendo clic, clic, clic.....
Fijate que lo que te sucede es cuando un thread termina repentinamente es porque ha ocurrido una acepción en este y normalmente delphi no te informa sobre las ecepciones en los threads [solo cuando estás en modo debugger]. Exception class EOSError with message 'System Error. Code: 1400. El identificador de la ventana no es válido'. esto sucede a como lo ha dicho lepe a que no destruyes la ventana a utilizar. A mi punto de vista tienes dos alternativas: Esta es la que te recomiendo:
Ó:
|
Cita:
No había caído en ese detalle, gracias por la aclaración. Saludos |
Ante todo quiero darte las gracias por el interes mostrado, al intentar colaborar conmigi.
|
DRAW,
gracias por tu aportación, debo decirte que de tus dos opciones, la primera con un pequeño retoque parece que funciona, con la peueña salvedad que la modal no se actualiza. Supongo que es porque al quedar fuera del while, loscampos de la modal que por defecto estan basados en la tabla no se reinicializan. Voy a probar a dar valor a los campos antes de llamar a la modal. saludos |
Cita:
Vaya lo quer tiene uno que leer en esto dias, :mad: |
Justo te quejas de lo que yo me quejo:
HAY QUE INVESTIGAR ANTES DE HABLAR Si así lo hubiese hecho tu amigo, no tendríamos que andar a la greña. En cualquier caso no he hecho extensivo mi comentario a otros participantes del foro, y si te sientes ofendido, perdona poruq no iba contigo. Y espero que comprendas que cuando te tiras 12 horas diarias tecleando, estas lo suficientemente cansado como para, andar con segun que interpretaciones PD. Durante bastantes años he sido representante y defensor de los derechos de los trabajadores, con lo que la bromita me ha picado doblemente. |
Vamos por partes, primero que nada no soy gustoso de las interpretaciones, las cosas son como son y nadamas
Cita:
Cita:
Como ves yo no interpreto nada, tu lo dices con todas las letras. Cita:
En fin, lo dicho, las cosas son como son. |
Vaya sorpresas se lleva uno por la mañana, cuando me he sentado delante del ordenador y he pensado, voy a ver como va el hilo el el que ayer participe, no esperaba encortrarme esto.
No encuentro donde esta la afrenta, he visto a mucha gente agradecida por que le comenten como podria realizarse mejor el programa, ahora si la sugerencia no te parece bien, se agradece y punto. Es agradable que halla un poco de humor en foro. Yo estaria encantado que una de las personas con mas conocimientos de este foro me respondiese en un hilo tanto si la respuesta es acertada como si no lo es. Me va a dar un poco de miedo responder a alguien en el foro porque con mis limitados conocimientos tal vez diga algo que parece obvio o equivocado y la respuesta sea "En un foro tan serio como este y con lo ocupado que estoy donde vas con esa mierda de respuesta". Estos malos rollos ponen a uno de mal humor. |
Siento que se haya creado este mal rollo, ya que no era mi intencion, pero con todo veo, que el tema de las sensibilidades, tiene color, porque se pueden ofender unos y otros no?. Llevo varios dias dandole vueltas a lo mismo y no consigo salir del atolladero, con lo que como sabeis todos, la sensibilidad se sube por encima de los niveles normales.
Yo agradezco y mucho a todos aquellos que roban a su tiempo unos minutos para atender a otros de forma desinteresada, porque sé lo que eso representa. Quiza el comentario afectaba muy directamente a mis principios básicos de la concepción de las relaciones laborales y no fui capaz de captar el tono de broma que al parecer a captado todo el mundo menos yo, pero me pilló a cien y asi fue. Con todo espero que esto se acabe aqui, y podamos compartir de nuevo nuestros conocimientos, de una forma mas relajada INSISTO, GRACIAS A TODOS LOS QUE OS MOLESTAIS ENRESPONDER Y COMPARTIR VUESTROS CONOCIMIENTOS |
jef
Este foro tiene unas normas escritas que puedes leer en su guía de estilo. Puedes leerlas, y si no te interesa, pues no entres. Aquí nadie necesita que venga nadie a insultar. Y mucho menos que siga por aquí despues de hacerlo y sin ofrecer disculpas. Internet es muy grande. Hay muchas mas webs. En esta se puede opinar de todo y como se quiera, pero, como tu dices, sin tocar los cojones. Un saludo! |
Suelo diferir de la opinión de Julián, sin embargo en esta ocasión, coincido plenamente.
|
D&W,
Gracias una vez mas por tu aportación, ya que con las pistas que me diste en tu primera opción, parece que he conseguido solucionar un problema que llevaba varios dias atascando mi trabajo. Gracias por aportar a este hilo lo que pretendia, intercambiar opiniones acerca de delphi y dejar la información visible, para quien la pueda necesitar. Si puedo hecharte una mano en algo, no dudes en preguntar, hasta donde sepa, intentaré resolver lo que me plantees. Saludos, y salvo que pueda ayudar a alguien en lo que respecta a delphi, doy por acabado este hilo. |
PD. No se exactamente cuales son las normas de este foro, aunque creo que mas o menos son las mismas de todos, pero si no me he fijado mal, para contar chistes y otras gracias, en este, existen los apartados : Humor y Taberna
Ciao. |
En apenas 2 días de haberte registrado:
- Te pasas por el forro las normas del foro. - Insultas a un usuario del mismo. - Ignoras a un Moderador. Que te vaya bien. |
Cita:
|
Realmente lamento el giro que ha dado este hilo.. con lo poco que se habla de multihilos por acá.... en esta ocasión, no me queda de otra que guardarme la explicación del problema.
Resolviendo una duda, las normas están en la guía de estilo. El vínculo, al pie de este mensaje. Hasta luego. ;) |
Solicitud de moderación
Yo por mi parte solicito a la administración de los foros que tome cartas en el asunto, tal y como se hace en estos casos.
Ya se le ha pedido que rectifique su actitud, queda claro que no lo hará. Las ofensas e insultos hacia mi persona siguen vigentes y públicas en estos foros, hecho que no me parece correcto, tanto así como la burla que este ese señor hace de los foros, en definitiva de la comunidad, y de los moderadores. Saludos |
El sistema de amonestaciones podria ser la solucion, aunque no se si esta en funcionamiento, a mi me sale la opcion de las tarjetitas pero no me atreveria a usarlas.
Mejor sera que los moderadores decidan como dice Lepe. Un saludo |
Cita:
|
¿Sería mucha molestia editar los comentarios ofensivos de este hilo?
Quizás incluso (si a nadie le importa) eliminar los mensajes que no tienen nada que ver con la duda original. Gracias y perdonad las molestias ocasionadas. |
La franja horaria es GMT +2. Ahora son las 10:50:17. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi