我有一个批处理文件(设置更改器),它使用 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 - 列出目录中的所有文件
您无法在运行时动态创建组件(可以在编译时)。
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, '', 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;