В статье будет рассказано о том, как создать настраиваемую маску с индикатором прогресса при копировании файлов в Inno Setup. Вопрос, на который будет дан ответ, заключается в том, как скопировать папку и ее содержимое в новую подпапку в папке резервного копирования после настройки маски с выбором папок с помощью CreateInputDirPage, отображая индикатор прогресса в отдельной маске и делая кнопку "Далее" доступной только после завершения копирования.
Прежде всего, нужно создать маску для выбора двух папок с помощью CreateInputDirPage. Затем, после того как пользователь выберет папки, можно проверить, действительно ли первая папка содержит программу компании. После этого можно скопировать содержимое первой папки в новую подпапку во второй папке с помощью функции DirectoryCopy, найденной в другом вопросе.
Чтобы отобразить индикатор прогресса в отдельной маске, можно использовать функцию CreateOutputProgressPage. Затем нужно отредактировать функцию DirectoryCopy, чтобы она продвигала индикатор прогресса на маске. Чтобы рассчитать общий размер для установки максимального значения индикатора прогресса, можно использовать функцию GetDirSize, найденную в другом вопросе.
Приведенный ниже код демонстрирует, как это сделать:
[Code]
const
ProgressRatio = 1024;
procedure DirectoryCopyWithProgress(
SourcePath, DestPath: string; ProgressPage: TOutputProgressWizardPage);
var
FindRec: TFindRec;
SourceFilePath: string;
DestFilePath: string;
Size: Int64;
begin
if FindFirst(SourcePath + '\*', FindRec) then
begin
try
repeat
if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
begin
SourceFilePath := SourcePath + '\' + FindRec.Name;
DestFilePath := DestPath + '\' + FindRec.Name;
ProgressPage.SetText(SourceFilePath, DestFilePath);
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
Size := Int64(FindRec.SizeHigh) shl 32 + FindRec.SizeLow;
if FileCopy(SourceFilePath, DestFilePath, False) then
begin
Log(Format('Copied %s to %s with %s bytes', [
SourceFilePath, DestFilePath, IntToStr(Size)]));
end
else
begin
Log(Format('Failed to copy %s to %s', [
SourceFilePath, DestFilePath]));
end;
end
else
begin
Size := 0;
if DirExists(DestFilePath) or CreateDir(DestFilePath) then
begin
Log(Format('Created %s', [DestFilePath]));
DirectoryCopyWithProgress(
SourceFilePath, DestFilePath, ProgressPage);
end
else
begin
Log(Format('Failed to create %s', [DestFilePath]));
end;
end;
Size := Size / ProgressRatio;
ProgressPage.SetProgress(
ProgressPage.ProgressBar.Position + Longint(Size),
ProgressPage.ProgressBar.Max);
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end
else
begin
Log(Format('Failed to list %s', [SourcePath]));
end;
end;
function SelectPathPageNextButtonClick(Sender: TWizardPage): Boolean;
var
SourcePath: string;
DestPath: string;
ProgressPage: TOutputProgressWizardPage;
TotalSize: Longint;
begin
ProgressPage := CreateOutputProgressPage('Copying files...', '');
SourcePath := TInputDirWizardPage(Sender).Values[0];
DestPath := TInputDirWizardPage(Sender).Values[1];
TotalSize := GetDirSize(SourcePath) / ProgressRatio;
Log(Format('Total size is %s', [IntToStr(TotalSize)]));
ProgressPage.SetProgress(0, TotalSize);
ProgressPage.Show;
try
DirectoryCopyWithProgress(SourcePath, DestPath, ProgressPage);
finally
ProgressPage.Hide;
ProgressPage.Free;
end;
Result := True;
end;
procedure InitializeWizard();
var
SelectPathPage: TInputDirWizardPage;
begin
SelectPathPage :=
CreateInputDirPage(
wpSelectDir, 'Text 1', 'Text 2.', 'Text 3', False, 'New Folder');
SelectPathPage.Add('Path to company program');
SelectPathPage.Add('Path to backup folder');
SelectPathPage.OnNextButtonClick := @SelectPathPageNextButtonClick;
end;
На маске с выбором папок пользователь может выбрать папку, содержащую программу компании, и папку для резервного копирования. После нажатия кнопки "Далее" отображается маска с индикатором прогресса, показывающая процесс копирования содержимого первой папки в новую подпапку во второй папке. После завершения копирования кнопка "Далее" становится доступной, и пользователь может продолжить установку.
В статье описывается создание настраиваемой маски с индикатором прогресса при копировании файлов в Inno Setup, а именно: как скопировать папку и ее содержимое в новую подпапку в папке резервного копирования после настройки маски с выбором папок с помощью
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.