![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
#1
|
|||
|
|||
![]() 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. |
#2
|
||||
|
||||
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 |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
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 |
![]() |
|