Inno Setup 不支持部分卸载。
卸载完成后,您的整个应用程序以及所有已安装的组件(电影)将被删除。
您可以做的是呈现一个自定义表单,其中包含电影列表InitializeUninstall
。如果用户选择仅卸载(某些)电影,而不是整个应用程序(查看器),则您可以使用自己的代码删除电影并中止卸载(通过返回False
来自InitializeUninstall
)。如果用户选择卸载所有内容,您可以让卸载完成。
function InitializeUninstall(): Boolean;
var
Form: TSetupForm;
OKButton, CancelButton: TNewButton;
CheckListBox: TNewCheckListBox;
I, Count, Deleted: Integer;
FindRec: TFindRec;
MoviePath: string;
Movies: TArrayOfString;
begin
MoviePath := ExpandConstant('{app}\movies\');
Count := 0;
if FindFirst(MoviePath + '*', FindRec) then
begin
try
repeat
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
Inc(Count);
SetArrayLength(Movies, Count);
Movies[Count - 1] := FindRec.Name;
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
if Count = 0 then
begin
Log('Found no movies proceeding with a complete uninstallation');
Result := True;
end
else
begin
Log(Format('Found %d movies', [Count]));
Form := CreateCustomForm();
try
Form.ClientWidth := ScaleX(350);
Form.ClientHeight := ScaleY(250);
Form.Caption := 'Uninstall';
Form.Position := poDesktopCenter;
CheckListBox := TNewCheckListBox.Create(Form);
CheckListBox.Parent := Form;
CheckListBox.Left := ScaleX(10);
CheckListBox.Width := Form.ClientWidth - 2*CheckListBox.Left;
CheckListBox.Top := ScaleY(10);
CheckListBox.Height :=
Form.ClientHeight - ScaleY(23 + 10 + 10 + CheckListBox.Top);
CheckListBox.AddCheckBox(
'Uninstall viewer and all movies', '', 0, True, True, True, True, nil);
for I := 0 to Count - 1 do
begin
CheckListBox.AddCheckBox(Movies[I], '', 1, True, True, False, True, nil);
end;
OKButton := TNewButton.Create(Form);
OKButton.Parent := Form;
OKButton.Width := ScaleX(75);
OKButton.Height := ScaleY(23);
OKButton.Left := Form.ClientWidth - ScaleX(75 + 6 + 75 + 10);
OKButton.Top := Form.ClientHeight - ScaleY(23 + 10);
OKButton.Caption := 'OK';
OKButton.ModalResult := mrOk;
OKButton.Default := True;
CancelButton := TNewButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := OKButton.Width;
CancelButton.Height := OKButton.Height;
CancelButton.Left := OKButton.Left + OKButton.Width + ScaleX(6);
CancelButton.Top := OKButton.Top;
CancelButton.Caption := 'Cancel';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;
Form.ActiveControl := CheckListBox;
if Form.ShowModal() <> mrOk then
begin
Log('User cancelled the uninstallation');
Result := False;
end
else
begin
if CheckListBox.State[0] = cbChecked then
begin
Log('User selected complete uninstallation');
Result := True;
end
else
begin
for I := 0 to Count - 1 do
begin
if CheckListBox.Checked[I + 1] then
begin
if DeleteFile(MoviePath + Movies[I]) then
begin
Inc(Deleted);
Log(Format('Deleted movie %s', [Movies[I]]));
end
else
begin
MsgBox(Format('Error deleting %s', [Movies[I]]), mbError, MB_OK);
end;
end;
end;
MsgBox(Format('Deleted %d movies', [Deleted]), mbInformation, MB_OK);
Result := False;
end;
end;
finally
Form.Free();
end;
end;
end;