2016-07-09 3 views
2

Здравствуйте, я хочу, чтобы My Inno Setup Script автоматически проверял CheckBox на одной из моих страниц мастера через определенное время (например, 5 секунд).Inno Setup: автоматически установите флажок после определенного времени в секундах

Вот почему:

Я создал флажок, который может изменить WizardForm «s ClientWidth и ClientHeight при переключении.

Если я не нажму на него, ширина и высота WizardForm останется такой же. Так оно и поступает.


Код я написал, чтобы сделать это:

var 
    MinimizerCheckBox: TNewCheckBox; 

procedure InitializeWizard(); 
begin 
    MinimizerCheckBox := TNewCheckBox.Create(WizardForm); 

    with MinimizerCheckBox do 
    begin 
    Name := 'MinimizerCheckBox'; 
    Parent := WizardForm; 
    Left := ScaleX(560); 
    Top := ScaleY(315); 
    Width := ScaleX(90); 
    Height := ScaleY(14); 
    Alignment := taLeftJustify; 
    Caption := 'Compact Mode'; 
    OnClick := @MinimizerCheckBoxClick; 
    TabOrder := 3; 
    end; 
end; 

procedure MinimizerCheckBoxClick(Sender: TObject); 
begin 
    if MinimixerCheckBox.Checked then 
    begin 
    with WizardForm do 
    begin 
     WizardForm.ClientWidth:=420; 
     WizardForm.ClientHeight:=175; 
    end; 
    end else begin 
    with WizardForm do 
    begin 
     WizardForm.ClientWidth:=654; 
     WizardForm.ClientHeight:=407; 
    end; 
    end; 
end; 

Я хочу, чтобы проверить, что флажок автоматически по истечении заданного времени.

Любой пример кода для этого?

Заранее спасибо.

ответ

0

Использовать InnoCallback DLL, чтобы запланировать таймер.

[Files] 
Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy 

[Code] 

var 
    MinimizerCheckBox: TCheckBox; 

... 

type 
    TTimerProc = procedure(h: LongWord; msg: LongWord; idevent: LongWord; dwTime: LongWord); 

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; 
    external '[email protected]:innocallback.dll stdcall'; 
function SetTimer(hWnd: longword; nIDEvent, uElapse: longword; lpTimerFunc: longword): longword; 
    external '[email protected] stdcall'; 
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
    external '[email protected] stdcall'; 

var 
    CheckTimerID: Integer; 

procedure StopCheckTimer; 
begin 
    Log('Killing timer'); 
    KillTimer(0, CheckTimerID); 
    CheckTimerID := 0; 
end; 

procedure CheckProc(h: LongWord; msg: LongWord; idevent: LongWord; dwTime: LongWord); 
begin 
    Log('Timer elapsed'); 
    StopCheckTimer; 
    MinimizerCheckBox.Checked := True; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
var 
    CheckTimerCallback: LongWord; 
begin 
    if CurPageID = wpXXX then // your page id 
    begin 
    Log('Starting 5s timer'); 
    CheckTimerCallback := WrapTimerProc(@CheckProc, 4); 
    CheckTimerID := SetTimer(0, 0, 5000, CheckTimerCallback); 
    end 
    else 
    if CheckTimerID <> 0 then 
    begin 
    StopCheckTimer; 
    end; 
end; 
+0

Спасибо вам, что это работает, но проблема в том, что у меня есть слайд-шоу, которое воспроизводимое с помощью '' isSlideShow.dll' в wpInstalling.' Его Таймер также устанавливаются мной с помощью 'user32.dll' ранее .Но, что происходит, когда я устанавливаю этот таймер, оба таймера запутываются, а новый добавленный таймер не убивает, он все еще работает даже после 'wpFinished'. Мне очень нравится знать, нет ли другого способа, который может установить таймер без использования 'user32.dll'? Любая другая функция таймера поддерживала DLL? :(:( – flavalee

+0

Не должно быть проблем с расписанием нескольких таймеров. Я не знаю ни одной другой библиотеки. И даже если бы это было, в любом случае это будет использовать «SetTimer», так как это стандарт Кстати, вы, вероятно, делаете что-то неправильно. Отправьте новый вопрос с помощью самого прочного кода, который использует два таймера, но у вас есть проблема. –

+0

Thank you.Yes Я пытаюсь решить сам и задам вопрос, не проблема – flavalee