Inno Setup disable component selection when a specific component is selected

前端 未结 2 1146
天涯浪人
天涯浪人 2021-01-07 07:50

I would like to be able to disable the selection of a component based on a specific component being selected. I cannot do this through nesting of components, as the componen

2条回答
  •  遥遥无期
    2021-01-07 08:39

    You had TLama's solution which was probably better than the following, but still this code is also a way to achieve the goal (though you will need innocallback.dll):

    [Setup]
    AppName=My Program
    AppVersion=1.5
    DefaultDirName={pf}\My Program
    
    [Files]
    Source: ".\InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy nocompression
    
    [Components]
    Name: "Client"; Description: "Client"; Types: custom
    Name: "Sync"; Description: "Sync"; Types: custom
    
    [Code]
    var
    TimerID: Integer;
    
    type
    TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD);
    function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
    external 'wrapcallback@files:InnoCallback.dll stdcall';    
    function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT;
    lpTimerFunc: UINT): UINT; external 'SetTimer@user32.dll stdcall';
    
    function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
    external 'KillTimer@user32.dll stdcall'; 
    
    procedure KillComponentsTimer;
    begin
      if TimerID <> 0 then 
        begin
          if KillTimer(0, TimerID) then
            TimerID := 1;
        end;
    end;
    
    procedure OnComponentsCheck(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD);
    begin
        if IsComponentSelected('Client') then begin
            WizardForm.ComponentsList.Checked[1] := False;
            WizardForm.ComponentsList.ItemEnabled[1] := False;
        end
        else begin
            WizardForm.ComponentsList.ItemEnabled[1] := True;
        end;    
        if IsComponentSelected('Sync') then begin
            WizardForm.ComponentsList.Checked[0] := False;
            WizardForm.ComponentsList.ItemEnabled[0] := False;
        end
        else begin 
            WizardForm.ComponentsList.ItemEnabled[0] := True;
        end;
    end;
    
    procedure ComponentsCheck();
    var
      TimerCallback: LongWord;
    begin
      TimerCallback := WrapTimerProc(@OnComponentsCheck, 4);
      TimerID := SetTimer(0, 0, 100, TimerCallback);
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
    if CurPageID = wpSelectComponents then
      begin
        ComponentsCheck;
      end;
    if CurPageID = not wpSelectComponents then 
      begin
       KillComponentsTimer;
      end;
    end;
    

提交回复
热议问题