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

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

第一个xcopy创建一个原始副本作为备份(滚动备份只有1个副本),然后进行文件复制(扩展名只需批量修复文件名所需的文件这很好但是我很乐意尝试在Inno安装程序中执行此操作一个干净的GUI.

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

然后在完成与我的批处理相同的任务时,备份(容易总是与start.ini相同的名称)然后复制文件,例如example1.ini并覆盖start.ini

ini可能是最灵活的,因为我可以想象以后添加新的部分来改变所执行的动作.

这是可能的还是将这个程序拉得太远了.不要急于我的批处理现在工作,但打字和手动步骤越少,继续使用就越好.

我找到了一个将内容列表到对话框窗口的示例,但我无法想象如何使用它来填充组件. TLama – List all files in a directory

解决方法

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

但使用CreateCustomPageTNewCheckListBox实现类似自定义动态组件的页面并不困难.

然后在CurStepChanged(ssInstall)中根据需要处理选定的文件/组件.

[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,'',False,True,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;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...