1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Как сделать таймер

Тема в разделе "Inno Setup", создана пользователем Chopser, 17 янв 2017.

  1. Старожил

    Регистрация:
    11 окт 2012
    Сообщения:
    22
    Симпатии:
    0
    Помогите кто нибудь.
    Как сделать таймер перед перезагрузкой компьютера на последней странице или в отдельном сообщении?
    Подробнее: это нужно для атоматической установки .NET Framework и других системных компонентов. Выглядит это примерно так: чтобы в конце установки, на странице "Завершения" или в отдельном сообщении - показало таймер, а по истечении таймера происходила автоматическая перезагрузка компьютера.

    Таймер можно или на кнопке или на форме, если на форме, то кнопку скрыть. В качестве кода перезагрузки, можно просто добавить код запуска файла по истечении таймера.
     
  2. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    360
    Симпатии:
    388
    Пол:
    Мужской
    Вот, может поможет пример:

    Код (Text):
    [Setup]
    AppName=My Program
    AppVerName=My Program v.1.2
    DefaultDirName={pf}\My Program

    [Files]
    Source: InnoCallback.dll; Flags: dontcopy

    [Code]
    type
      TTimerProc = procedure(h:longword; msg:longword; idevent:longword; dwTime:longword);
     
    var
      Timer: LongWord;
      Vektor: Integer;

    function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
    function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): Longword; external 'wrapcallback@files:innocallback.dll stdcall';
    function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

    procedure TimerProc(h: Longword; msg: Longword; idevent: Longword; dwTime: Longword);
    begin
      Vektor:=Vektor-1;
      WizardForm.NextButton.Caption:=IntToStr(Vektor);
    If Vektor = 0 then begin
      KillTimer(0, Timer);
      WizardForm.NextButton.Enabled:=True;
      WizardForm.NextButton.Caption:=('Далее >');
    end;
    end;

    procedure CurPageChanged(CurPageID: Integer);
    var
      pfunc: LongWord;
    begin
    if CurPageID = wpWelcome then
    begin
      Timer:=SetTimer(0, 0, 1000, WrapTimerProc(@TimerProc,4));
      WizardForm.NextButton.Enabled:=False;
      Vektor:=6;
    end else
      KillTimer(0, Timer);
    end;

    procedure DeinitializeSetup();
    begin
      KillTimer(0, Timer);
    end;

    P.S: Понимаю что это на странице приветствия, но можно адаптировать на другую станицу.
     
    ZVSRus, EvilAlex и ExPlayer нравится это.
  3. Ветеран

    Регистрация:
    18 авг 2011
    Сообщения:
    204
    Симпатии:
    93
    А как сделать, чтобы после установки игры, инсталлятор закрывался сам по таймеру, допустим через 10 секунд и выдавал сообщение что все установлено нажмите ок?
    ты такой пришел увидел. нажал ок и сел играть)

    заранее спасибо...
     
  4. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    450
    Симпатии:
    415
    Пол:
    Мужской
    А типа ты такой пришёл, увидел финиш пэйдж и на ней всё ок, нажал на "Завершить", или как у нас "Начать игру" и сел играть) Не? К чему лишний геммор? Хотя всё это реализуемо.
    Установка TVoEKR2.png
     
    Последнее редактирование: 17 янв 2017
  5. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    360
    Симпатии:
    388
    Пол:
    Мужской
    EvilAlex, может так подойдет:

    Код (Text):
    [Setup]
    AppName=My Program
    AppVerName=My Program v.1.2
    DefaultDirName={pf}\My Program

    [Files]
    Source: InnoCallback.dll; Flags: dontcopy

    [Code]
    type
      TTimerProc = procedure(h:longword; msg:longword; idevent:longword; dwTime:longword);

    var
      Timer: LongWord;
      Vektor: Integer;

    function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
    function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): Longword; external 'wrapcallback@files:innocallback.dll stdcall';
    function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

    procedure TimerProc(h: Longword; msg: Longword; idevent: Longword; dwTime: Longword);
    begin
      Vektor:=Vektor-1;
      WizardForm.NextButton.Caption:=IntToStr(Vektor);
    If Vektor = 0 then begin
      KillTimer(0, Timer);
      WizardForm.NextButton.Enabled:=True;
      WizardForm.NextButton.Caption:=('');
      WizardForm.Hide;
      MsgBox('Программа ' + '{#SetupSetting("AppName")}' + '  установлена!', mbInformation, mb_Ok);
      WizardForm.NextButton.OnClick(WizardForm.NextButton);
    end;
    end;

    procedure CurPageChanged(CurPageID: Integer);
    var
      pfunc: LongWord;
    begin
    if CurPageID = wpFinished then
    begin
      Timer:=SetTimer(0, 0, 1000, WrapTimerProc(@TimerProc,4));
      WizardForm.NextButton.Enabled:=False;
      Vektor:=6;
    end else
      KillTimer(0, Timer);
    end;

    procedure DeinitializeSetup();
    begin
      KillTimer(0, Timer);
    end;
     
    ZVSRus, Ramiro Cruzo, Timick и ещё 1-му нравится это.
  6. Старожил

    Регистрация:
    11 окт 2012
    Сообщения:
    22
    Симпатии:
    0
    Nemko, спасибо буду пробовать...
     
  7. Пользователь

    Регистрация:
    1 фев 2017
    Сообщения:
    13
    Симпатии:
    0
    Пол:
    Мужской
    Мужики, выручайте... Второй день голову ломаю. Пытаюсь сделать следующее...
    [​IMG]
    То есть закрытие формы по обнулению таймера. Сначала пытался прикрутить таймер к MsgBox но, как потом выяснилось, это не возможно. Создал форму и все прочее, но выявилась проблемка. Таймер отсчитывает время с очень коротким интервалом. Варианты со сторонними библиотеками у меня есть, но хочется без них обойтись. Как решить задачу нормального отсчета?
    [Setup]
    AppName=Custom Form
    AppVersion=1.0
    DefaultDirName={pf}\Custom Form
    DisableFinishedPage=yes

    [Languages]
    Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"

    [Files]
    Source: InnoSetup.ico; DestDir: {tmp}; Flags: dontcopy;

    [*Code]
    var
    i:integer;
    Timer1: TTimer;
    Form: TSetupForm;
    FormLabel: TLabel;
    OkButton: TNewButton;
    FormClose: Boolean;
    IconImg: TNewIconImage;

    procedure MyOnTimer(Sender: TObject);
    begin
    i:=i-1; // отнимаем по одной сек.
    OkButton.Caption := 'Ок' + #32 + #40+IntToStr(i)+ #99 +#41;
    if i=0 then
    begin
    Timer1.Enabled:=false;
    Form.Close;
    end;
    end;
    function CreateTimer(): Boolean;
    begin
    i:=10; // отсчет начинать с 10 сек.
    Timer1 := TTimer.Create(Form)
    Timer1.Interval := 1000; // интервал 1 сек.
    Timer1.OnTimer := @MyOnTimer;
    Timer1.Enabled := true;
    end;

    procedure FormButtonClick(Sender: TObject);
    begin
    case TNewButton(Sender) of
    OkButton: FormClose := True;
    end;
    Form.Close;
    end;

    function ShowCancelMessage(): Boolean;
    begin
    Form := CreateCustomForm();
    with Form do
    begin
    ClientWidth := ScaleX(300);
    ClientHeight := ScaleY(100);
    Caption := SetupMessage(msgStatusRunProgram);
    CenterInsideControl(WizardForm, False);
    end;

    FormLabel := TLabel.Create(Form);
    with FormLabel do
    begin
    Parent := Form;
    SetBounds(ScaleX(60), ScaleY(15), ScaleX(280), ScaleY(80));
    Caption := ' Программа установлена.';
    Font.Height := -12;
    end;

    OkButton := TNewButton.Create(Form);
    with OkButton do
    begin
    Parent := Form;
    SetBounds(ScaleX(110), ScaleY(70), ScaleX(75), ScaleY(23));
    OnClick := @FormButtonClick;
    Caption := 'Ок' + #32 + #40+IntToStr(i)+ #99 +#41;
    end;

    IconImg := TNewIconImage.Create(Form);
    with IconImg do
    begin
    Parent := Form;
    SetBounds(ScaleX(5), ScaleY(12), ScaleX(32), ScaleY(32));
    ExtractTemporaryFile('InnoSetup.ico');
    Icon.LoadFromFile(ExpandConstant('{tmp}\InnoSetup.ico'));
    end;

    Form.ShowModal;
    Result := FormClose;
    Form.Free;
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    begin
    if (CurStep = ssDone) then
    if not wizardsilent then
    ShowCancelMessage;
    CreateTimer;
    end;
     

    Вложения:

    Последнее редактирование: 9 дек 2017
  8. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    360
    Симпатии:
    388
    Пол:
    Мужской
    AlexS, попробуйте так
     

    Вложения:

    • Exp.7z
      Размер файла:
      5,3 КБ
      Просмотров:
      9
    AlexS нравится это.
  9. Пользователь

    Регистрация:
    1 фев 2017
    Сообщения:
    13
    Симпатии:
    0
    Пол:
    Мужской
    То что нужно. Спасибо большое !
     
  10. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    450
    Симпатии:
    415
    Пол:
    Мужской
    А не проще использовать?
    Код (Inno):
    function MsgBoxEx(AWnd: HWND; AText, ACaption: string; AType, AIcon: UINT; ATimeOut: Integer): Integer;
    Код (Inno):
    #ifndef IS_ENHANCED
      #error Enhanced edition of Inno Setup (restools) is required to compile this script
    #endif

    [Setup]
    AppName=exit v1.0
    AppVerName=exit v1.0
    OutputDir=.
    CreateAppDir=no
    CreateUninstallRegKey=no

    [Code]

    procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
    begin
      Confirm:= false;
      Cancel:= false;
      if MsgBoxEx(WizardForm.Handle, SetupMessage(msgExitSetupMessage), SetupMessage(msgExitSetupTitle), MB_YESNO or MB_ICONINFORMATION, 0, 10) = IDYES then Cancel:= true;
    end;
     
    Krinkels и Nemko нравится это.

Поделиться этой страницей