我有一个批处理文件(设置更换器),它使用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
解决方法
您无法在运行时动态创建组件(您可以在编译时).
但使用CreateCustomPage
和TNewCheckListBox
实现类似自定义动态组件的页面并不困难.
然后在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;