Использовать в циклах, которые могут привести к длительной нагрузке или зависаниям метод ProcessMessages объекта Application. Вот пример демонстрации вашей ситуации и ее устранение:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | var
Form1: TForm1;
FStop : boolean ;
implementation
{$R *.dfm}
procedure TForm1 . Button1Click(Sender: TObject);
var
i : integer ;
st: string [ 7 ];
begin
FStop := false ;
for i := 0 to 100000 do
begin
str((i / 1000 ) : 6 : 4 , st);
Label1 . Caption := 'Выполнено: ' + st + '%' ;
Application . ProcessMessages;
if FStop then break;
if Application . Terminated then break;
end ;
end ;
procedure TForm1 . Button2Click(Sender: TObject);
begin
FStop := true ;
end ;
end .
|
Запустите программу первый раз без изменения кода, будет подсчет в % сколько выполнено, и при нажатии на кнопку 2 цикл остановится в любой момент времени. И потом за комментируйте код так:
Код:
1 2 3 4 5 6 7 8 | procedure TForm1 . Button1Click(Sender: TObject);
...
...
|
И получите свой эффект - кнопка "начать" зависнет пока не будет выполнен весь цикл. Где и в каких циклах в вашем проекте прилепить этот обработчик дело за вами.