Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-10-2006
xelip xelip is offline
Miembro
 
Registrado: ago 2006
Posts: 21
Poder: 0
xelip Va por buen camino
Wink

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.
Responder Con Cita
  #2  
Antiguo 01-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 19:17:09.


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
Copyright 1996-2007 Club Delphi