Рассмотрим пример обновления прогресс бара на клиенте. Допустим, на сервере у нас происходит некоторый циклический процесс, и нам нужно показывать это клиенту. Вот как это можно сделать
Разместим на форме следующие компоненты
Объявим поле
1 2 3 |
private { Private declarations } FCancelled : Boolean; |
Обработаем кнопку Start следующим образом
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
procedure TMainForm.bStartClick(Sender: TObject); const MAX_FILES = 5000; X_INTERVAL = 500; // milliseconds. Specifies delay between updates (Synchronization) var I, N: Integer; procedure UpdateClient(Val : Integer); begin ProgressBar.Position := Val; lProgress.Caption := Format('%d Files Created...', [Val]); end; procedure CreateDummyFile(Val : Integer); var Ls : TStrings; FileName: string; begin FileName := IntToStr(Val)+'.txt'; Ls := TStringList.Create; try Ls.LoadFromFile(UniServerModule.TempFolderPath + 'about_signing.help.txt'); Ls.SaveToFile(UniServerModule.LocalCachePath + FileName); finally Ls.Free; end; end; begin FCancelled := False; ProgressBar.Min := 1; ProgressBar.Max := MAX_FILES; bStart .Enabled := False; bCancel.Enabled := True; UpdateClient(0); // Reset Progressbar and Label UniSession.Synchronize; // Initial refresh before entering the loop (Progressbar and Label will be refreshed) N := 0; try for I := 1 to MAX_FILES do begin if UniSession.Synchronize(X_INTERVAL) then // Refresh the client at "X_INTERVAL" intervals UpdateClient(N); if FCancelled then Break; // Check if operation is cancelled. (Either when Cancel button is pressed or Form is closed) // perform some tasks here CreateDummyFile(I); Inc(N); // +1 number of created files end; UpdateClient(N); finally bStart.Enabled := True; bCancel.Enabled := False; end; end; |
При этом, кнопка Cancel будет обработана следующим образом
1 2 3 4 |
procedure TMainForm.bCancelClick(Sender: TObject); begin FCancelled := True; end; |