FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
Splash Form
necesito hacer un splash form con el progress bar. Se mas o menos como hacerlo. Lo que necesito es que en el progress bar se refleje el tiempo que realmente dura la tabla para abrirse, porque es una tabla con muchos registros. Creo que me comprendieron.
se los agradeceria |
#2
|
||||
|
||||
No creo que haya forma de hacer esto. Normalmente bastará que coloques un letreo de 'Abriendo tabla' o algo por el estilo.
// Saludos |
#3
|
||||
|
||||
Hola,
Cita:
|
#4
|
||||
|
||||
Cita:
// Saludos |
#5
|
||||
|
||||
Hola,
Pero si nos ceñimos al asunto,... ¿no es posible? O sea, yo pongo capturo el tiempo al comenzar la aplicación (hasta aquí no nos importa lo que se tarde) y luego abro cierta tabla de la base de datos... y vuelvo a tomar el tiempo cuando la tabla ya esté abierta... pero, aunque, bueno, es que... Me parece que sí, que me he liado. Ahora mismo me he quedado en blanco. Es como si hubiese recibido un rafagazo con un mensaje que dijera más o menos: comienzas a abrir la tabla... y cuando termine de abrirse dices que capturas el tiempo y bla, bla, bla... Pero,... de lo que estamos hablando es de mostrar el tiempo que la tabla tarda en abrirse, según está abriéndose... y aquí es donde parece que la cosa se complica, ¿que no? Pues eso... toca un cartelito de "Abriendo tablas" o algo así, una "ProgressBar" de esas locas que van para un lado y para otro, qué sé yo... Mis disculpas... pensaba que..., creí que..., me equivo qué. |
#6
|
||||
|
||||
Hace tiempo creé una aplicación que necesitaba abrir muchas tablas. Lo que hice fue contar el total de tablas que debía abrir e iba incrementando el progress bar tras abrir cada una de ellas. Creo que es lo más cercano a lo que buscas que podrás conseguir.
|
#7
|
||||
|
||||
Sino en lugar de una barra de progreso puedes poner una animacion de un reloj de arena o algo asi.
__________________
Intentando hacer algo con Delphi 7 y Firebird 1.5 |
#8
|
|||
|
|||
Hola:
Me imagino que ya habras encontrado una solucion a este problema, pero tambien hay otra opciones que no te explican en los mensajes anteriores a este. Podrrias hacer una aplicacion multihilos, que llevara el calculo del montaje de las bases de datos y en el otro hilo el incremento del la barra de progreso, pero aqui es donde se complica, pues debes sincronizar ambos hilos para que sea lo mas presico posible. Tambien te puedo ayudar en eso, aunque es un poco complicado, escribire el codigo para ti esta noche y mañana te lo mando Saludo, xelip |
#9
|
||||
|
||||
¿Podrías explicar por favor, qué significa "calcular el montaje de las bases de datos"? Me parece que más allá de hilos o no, el problema es que para poder mostrar el progreso de algo, ese algo debe en primera instancia poder "dividirse" en pasos. Normalmente, la apertura de una tabla es un proceso atómico que no se hace en pasos, al menos desde el punto de vista de la aplicación cliente.
No dudo que pueda escapárseme algo y si puedes dar un ejemplo a todos, estaré más que encantado. // Saludos |
#10
|
|||
|
|||
Mira roman:
Para poder hacer lo de la barra de progreso necesitamos que el procesador de la computadora valla ejecutando ambos hilos a la vez, es decir el progress bar y el montaje de la bases de datos o tablas o lo que fuese... Para esto debemos darle la mayor priridad al montaje, pues es quien le indica al procesador cuando debe cambiarse hacia el otro hilo. De esta manera se ejecutaran ambos prosesos, claro que se puede hacer (los sistemas operativos lo hace, tambien toda clase de aplicaciones). El mayor problema radica en sincronizar ambos hilos, para esto debemos saber cuando necesitamos ejecutar uno u otro, pero esto depende de la aplicacion que estemos haciando y de lo que realmente necesitemos... Los puedo ayuda con el codigo del progress bar y del hilo del mismo, pero lo otro es problema de ustedes, pues ahora mismo no tengo tiempo, asi que mañana les mandare como hacer lo que les explico. Esto no es tan sencillo pero es una idea generar, talvez con esto resuelvan su problema... Saludos a todos y gracias por solicitar mi ayuda. Saludos de nuevo. xelip |
#11
|
|||
|
|||
Hola,
Talves mi explicacion anterior sea un poco comlicada, perdonen, pero realmente escribo de nuevo para aclarar algo... Cuando ramon me decia que se necesitaba que lo que fueramos a cargar fuera por pasos es algo muy logico, pero solo si por cada paso incrementariamos la barra, pero para mi esto es innecesario, pues bien, no importa cuanto tiempo demore en cargar las tablas los mas importante es que el procesador pueda ser capaz de llevar ambos procesos siempre que tengamos un aproximado del tiempo de duracion de la carga...Ahora, si no tuvieramos un tiempo muy confiable podriamos solo poner el incremento de la barra y no el que porciento de esta, cuanto queda, o cosas por el estilo. xelip Última edición por xelip fecha: 27-08-2006 a las 21:16:23. |
#12
|
||||
|
||||
Que ganas tienes de liarte con hilos, no dudo que de alguna forma que seguro es extraña se pueda conseguir, pero estamos hablando de informar con algo al usuario para que se de cuenta que la aplicacion no se ha quedado colgada. Para ello basta con una animacion (gif) o estimas cuanto tiempo tarda en cargarse la tabla y metes la barra de progreso con un timer, si tarda menos pues no pasa nada, y si tarda mas la pones a 0 y la llenas otra vez, que la final lo unico que quieres es que el usuario vea que algo se mueve.
Un saludo. PD: Xelip tengo curiosidad por saber como se ve el estado en que se encuentra la apertura de la tabla. PD2: Se me acaba de ocurrir que si lo que haces es cargar los registros en algun sitio mires el numero de registros y cada x registros incrementes la barra de progreso, pero creo que no haces eso.
__________________
Intentando hacer algo con Delphi 7 y Firebird 1.5 |
#13
|
|||
|
|||
Hola a todos:
Siento no haber podido responderles antes, pero es que he estado un poco complicado con los studios, pero lo prometido es deuda, aqui tienen un ejemplo de como hacer lo del progress bar (sin multi hilos), esto se lo debo a mi padre, yo no sabia como hacerlo sin multi hilos... windows es un sistem orientado a eventos, un evento es una accion relacoionada a un componente/control hay componente visules( ventana, boton, imagen...) y no visulales( un Objecto, uuna Lista , una collection) Cuando ocurre un evento ( mousemove, mouseclick, kepressed, changefocus.........) se crea un mensaje que se pose en la colas de mensajes, cada mensaje dice a quien va dirigido ( a que applicaion) un click de mouse en un docuemto word genera un mensaje WM_MOUSECLICK (WM_ windowsMessage) dirigdo a word, cada applicacion va revisando medinate un ciclo intermo si tiene un mensje en la cola y si lo tiene lo coge y ejecuta la accion corespondiente al mensaje, digamos en este ejemplo deplegar un menu. Si una applicacion se dedica durante mucho tiempo a realizar un proceso de calculo y no revisa la cola de mensajes entonces queda como congelada porque no realiza las operaciones relacionas a sus mensajes, sino que solo se dedica a relizar el caculo. una pplicaion de windows es algo asi crea ventana regrista ventana muestra ventana repeat lee cola de mensajes case mensaje of WM_MOUSECLICK : ejecuta OnMouseClick; WM_MOUSEMOVE : ejecuta OnMouseMove; WM_KEYPRESSED : ejecuta OnKeyPressed; WM_BUTTONCLICK : ejecuta OnButtonClick; .............. WM_CLOSEWINDOW : ejecuta OnCloseWindows // cierra el programa end; until true = false // ciclo infinito esta parte de la implemetacion de un programa windows esta "oculta" pero en un inicio si habia que programarla actulamente solo se programan los eventos, es decir tu pones un botton y programas en evento OnButtonClick entonces si dentro del codigo del OnButtonClick yo hago esto prodedure OnBttonClick( Sender.... var A begin while true = false do // ciclo infinito begin A := 1; end; end; cuando haga click en el botton la applicacion se congela porque nunca saldra del ciclo, pero si escribo prodedure OnBttonClick( Sender.... var A begin while true = false do // ciclo infinito begin Application.ProcessMessages; A := 1; end; end; entonce la application no se congela porque antes de cada iteracion va la cola toma sus mensajes y ejecuta las acciones relacionadas a sus eventos, esto incluye refrecar las ventanas, WM_PAINT, tambien WM_INVALIDATE, invalidate obliga a una ventana ( control) a repintarse/refrescarse porque su estado ha cambiado y dejo de ser valido lo que esta mostrando esto lo ordenas con el metodo Refresh, esto le envia un mensaje a uina ventana diciendole que se repinte, ejemplo cuando un botton esta arriba y se hace click y se deja el mouse presionado, windos le envia un invalidate al botton para que pinte abajo y cuando se libera el mouse windoes le envia un nuevo invalidate para que se pinte arriba con el Progressbar seria prodecure Calcula; var n : longint; begin ProgressBar.Min := 0; ProgressBar.Max := CantidaOperaciones; ProgressBar.Pos := 0; Application.ProcessMessages; for n := 0 to CantidaOperaciones do begin ProgressBar.Pos := n; Application.ProcessMessages; EjecutaOperacion; end; end; si el procedimeto EjecutaOperacion toma mucho tiempo porque reliza calculos muy intensivos/complicados que tomman mucho procesador se puede considerar opcionalmente intercalar unos ProcessMessages dentro del codigo, esto permite revisar la cola de mensajes durante la ejecucion de EjecutaOperacion. procedure EjecutaOperacion; begin Application.ProcessMessages; //opcional ....... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional ...... Application.ProcessMessages; //opcional end; que pasa si demora mucho y queremos cancelarlo, en este caso agragamos un botton Cancelar y agregamos OnClick procedure CancelarClick.... begin VariavleGlobalCancelar := True; end prodecure Calcula; var n : longint; begin ProgressBar.Min := 0; ProgressBar.Max := CantidaOperaciones; ProgressBar.Pos := 0; VariavleGlobalCancelar := False; // Application.ProcessMessages; for n := 0 to CantidaOperaciones do begin if VariavleGlobalCancelar then Break; // el usuario hizo click en botton cancelar ProgressBar.Pos := n; Application.ProcessMessages; EjecutaOperacion; end; end; Espero que esto les sirva un poco para lo que estan haciendo. saludos... ,xelip. |
#14
|
||||
|
||||
Sí vamos. ProcessMessages es algo más o menos conocido por todos y varios tenemos una idea bastante buena de cómo funciona Windows y sus mensajes. Pero parece que no leíste con detenimiento ni la pregunta original ni las respuestas. Desde el mensaje 9 comenté porque no es posible poner una barra de progreso en el caso particular de lo que se pregunta. El ejemplo que pones ahora no aplica por lo que ya se comentó anteriormente: no puedes subdividir en pasos la apertura de una tabla.
// Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Cerrar Splash Imposible ... | serhasae | Varios | 9 | 09-10-2007 21:27:18 |
Splash Screen | jmedina | Varios | 6 | 15-08-2007 07:15:46 |
Problemas en splash screen | ilichhernandez | Varios | 2 | 19-12-2005 06:45:17 |
Splash Screen con imagen | ibstk | Varios | 2 | 09-09-2004 01:05:51 |
Hacer un Splash con forma de una imagen | rjsitruiz | Gráficos | 6 | 09-07-2004 11:28:21 |
|