Tema: Splash Form
Ver Mensaje Individual
  #2  
Antiguo 01-10-2006
xelip xelip is offline
Miembro
 
Registrado: ago 2006
Posts: 21
Reputación: 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