我有一个带有组件页面,复选框和组合框的Inno-setup脚本。我想取消选中并禁用“代码”部分中的某些组件,我使用了此答案来完成此工作,现在有了以下代码:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output
[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom
[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom;
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive
[code]
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectComponents then
if (True) then //Here my own condition instead of "(True)"
begin
WizardForm.ComponentsList.Checked[1] := False;
WizardForm.ComponentsList.ItemEnabled[1] := False;
end;
end;
使用此选项,未选中代码中的“帮助”复选框,并且从代码中禁用了该复选框,但是即使用户无法单击“帮助”复选框也可以通过更改状态的组合框选择“完全安装” “帮助”复选框的状态从未选中变为选中(即使该复选框保持禁用状态)。
我想做的是完全禁用此组件并阻止用户选择它(不考虑用户尝试做的方式,单击它或在组合框中选择“完全安装”)。
这是另一种仍然很古怪的方式来做您想要的事情。我在这里使用了不同的概念。从本质上讲,它是关于准备应禁用和未选中的组件索引数组(我在此处称其为重影),并调用UpdateGhostItems(False)
哪个未选中并禁用组件列表中已准备好的数组的索引项。
从安装类型更改组合框更改事件,仅通过调用UpdateGhostItems(True)
以下命令检查此组合框可能更改的状态:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom
[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom;
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive
[Code]
var
TypeChange: TNotifyEvent;
GhostItems: array of Integer;
procedure UpdateGhostItems(CheckOnly: Boolean);
var
I: Integer;
begin
for I := 0 to GetArrayLength(GhostItems) - 1 do
begin
WizardForm.ComponentsList.Checked[GhostItems[I]] := False;
if not CheckOnly then
WizardForm.ComponentsList.ItemEnabled[GhostItems[I]] := False;
end;
end;
procedure TypesComboChange(Sender: TObject);
begin
// call the original event method
TypeChange(Sender);
// this will uncheck all the items from the GhostItems array;
// this includes those that were checked by the above method
// call; for GhostItems array description see below
UpdateGhostItems(True);
end;
procedure InitializeWizard;
begin
// store the original TypesCombo change event method
TypeChange := WizardForm.TypesCombo.OnChange;
// and assign it our interceptor
WizardForm.TypesCombo.OnChange := @TypesComboChange;
// the following code block is for setting ghosted components;
// in real you might call it in some later stage of your setup
// quite comfortable looks to me using array of indices of the
// components that should remain always unchecked and disabled
// I'm gonna prepare this array at the initialization but it's
// really upon you when would you do so; so let's ghost 1 item
SetArrayLength(GhostItems, 1);
// ...with index 1
GhostItems[0] := 1;
// this call will uncheck and disable all the items from the
// prepared GhostItems array; do note that this is a one way
// road - once you disable a component, it won't get enabled
// again (you would have to remember their previous state)
UpdateGhostItems(False);
end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句