从外部源(文件或文件夹内容)创建 Inno Setup 组件/类型的动态列表

问题描述 投票:0回答:1

我有一个批处理文件(设置更改器),它使用 xcopy 列出特定文件夹中的特定文件格式,然后允许我输入其中一个名称,脚本使用该名称将该文件复制到另一个位置。

首先 xcopy 创建原始副本作为备份(滚动备份仅 1 个副本),然后进行文件复制(扩展名在批处理中固定,仅需要文件名正文这很好用,但我很乐意尝试在Inno Setup 提供了一个漂亮干净的 GUI。

我想从特定固定文件夹中找到的文件列表中填充组件/类型列表。或者甚至使用这些名称创建一个 ini 文件(额外的步骤,但也许更好的控制)。可能阻止这种情况发生的主要问题是不知道一个数组有多少条目。如果只有 1 个条目或文件只有 1 个选项(1 或 a),如果有 4 个,则用户可以选择 4 个选项中的 1 个(a、b、c 或 d)。我会提取文件名来创建名称/描述。

然后完成后,将发生与我的批处理相同的任务,备份(简单地始终使用与 start.ini 相同的名称),然后复制文件,例如example1.ini 并覆盖 start.ini

ini 可能是最灵活的,因为我可以想象稍后添加新的部分来更改执行的操作。

这可能吗?或者这个计划太过延伸了。不着急,因为我的批次现在可以工作,但打字和手动步骤越少,越适合继续使用。

我找到了一个将内容列出到对话框窗口的示例,但我不知道如何使用它来填充组件。 TLama - 列出目录中的所有文件

batch-file components inno-setup pascalscript
1个回答
3
投票

您无法在运行时动态创建组件(可以在编译时)。


但是使用

CreateCustomPage
TNewCheckListBox
实现自定义的类似动态组件的页面并不困难。

然后在

CurStepChanged(ssInstall)
中,您可以根据需要处理选定的文件/组件。

Dynamic components list

[Code]

const
  SourcePath = 'C:\somepath';

var
  CustomSelectTasksPage: TWizardPage;
  ComponentsList: TNewCheckListBox;

procedure InitializeWizard();
var
  FindRec: TFindRec;
  SelectComponentsLabel: TNewStaticText;
begin
  CustomSelectTasksPage :=
    CreateCustomPage(
      wpSelectComponents, SetupMessage(msgWizardSelectComponents),
      SetupMessage(msgSelectComponentsDesc));

  SelectComponentsLabel := TNewStaticText.Create(WizardForm);
  SelectComponentsLabel.Parent := CustomSelectTasksPage.Surface;
  SelectComponentsLabel.Top := 0;
  SelectComponentsLabel.Left := 0;
  SelectComponentsLabel.Width := CustomSelectTasksPage.Surface.Width;
  SelectComponentsLabel.AutoSize := False;
  SelectComponentsLabel.ShowAccelChar := False;
  SelectComponentsLabel.WordWrap := True;
  SelectComponentsLabel.Caption := SetupMessage(msgSelectComponentsLabel2);
  WizardForm.AdjustLabelHeight(SelectComponentsLabel);

  ComponentsList := TNewCheckListBox.Create(WizardForm);
  ComponentsList.Parent := CustomSelectTasksPage.Surface;
  ComponentsList.Top :=
    SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(8);
  ComponentsList.Left := 0;
  ComponentsList.Width := CustomSelectTasksPage.Surface.Width;
  ComponentsList.Height := CustomSelectTasksPage.Surface.Height - ComponentsList.Top;

  if FindFirst(ExpandConstant(AddBackslash(SourcePath) + '*.dat'), FindRec) then
  begin
    try
      repeat
        ComponentsList.AddCheckBox(FindRec.Name, '', 0, False, True, False, False, nil);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  I: Integer;
  FileName: string;
  SourceFilePath: string;
  TargetFilePath: string;
begin
  if CurStep = ssInstall then
  begin
    for I := 0 to ComponentsList.Items.Count - 1 do
    begin
      if ComponentsList.Checked[I] then
      begin
        FileName := ComponentsList.Items[I];
        SourceFilePath := AddBackslash(SourcePath) + FileName;
        TargetFilePath := AddBackslash(ExpandConstant('{app}')) + FileName;
        if FileCopy(SourceFilePath, TargetFilePath, False) then
        begin
          Log(Format('Installed "%s".', [FileName]));
        end
          else
        begin
          Log(Format('Failed to install "%s".', [FileName]));
        end;
      end;
    end;
  end;
end;
© www.soinside.com 2019 - 2024. All rights reserved.