
Mejor respuesta escafandra , 07 noviembre 2016 - 09:15
ProcessMessages Permite a la aplicación procesar los mensajes de Windows que están bloqueados al no poder acceder mientras trabaja un bucle pesado. En general sólo debería usarse en momentos muy puntuales siendo preferible el uso de threads para esas tareas pesadas pues te permite seguir con otras tareas de tu aplicación normalmente sin necesidad de esperar a que termine. Cuando el resultado del cálculo es necesario para seguir con otras tareas, deberás implementar un semáforo y una forma de avisar a la app y al usuario que el hilo terminó.
Si la tarea es muy crítica, puedes poner una barra de proceso, si no sabes cuanto tardará, puedes poner una barra de progreso infinita como en este ejemplo:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) ProgressBar1: TProgressBar; Strat: TButton; Stop: TButton; procedure FormCreate(Sender: TObject); procedure StratClick(Sender: TObject); procedure StopClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const PBM_SETMARQUEE = WM_USER + 10; procedure TForm1.FormCreate(Sender: TObject); begin SetWindowLong(ProgressBar1.Handle, GWL_STYLE, GetWindowLong(ProgressBar1.Handle, GWL_STYLE) or PBM_SETMARQUEE); end; procedure TForm1.StratClick(Sender: TObject); begin SendMessage (ProgressBar1.Handle, PBM_SETMARQUEE, 1, 20); // Activa 100ms end; procedure TForm1.StopClick(Sender: TObject); begin SendMessage (ProgressBar1.Handle, PBM_SETMARQUEE, 0, 20); // Desactiva end; end.
Saludos.
Ir al mensaje completo