Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание настраиваемой маски с индикатором прогресса в Inno Setup

Delphi , Программа и Интерфейс , Инсталяция

В статье будет рассказано о том, как создать настраиваемую маску с индикатором прогресса при копировании файлов в 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Инсталяция ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 01:39:44/0.0032408237457275/0