Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 3]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 3]

Ветеран


Сообщения: 1133
Благодарности: 581


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: Serega
Дата: 13-08-2011
Вложения
Тип файла: 7z Inno Setup [все вопросы] часть 1.7z
(1.34 Mb, 914 просмотров)
Тип файла: 7z Inno Setup [все вопросы] часть 2.7z
(3.12 Mb, 813 просмотров)
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - ещё один редактор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • InnoSetup Script Joiner - Программа для объединения нескольких скриптов InnoSetup в один;

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 00:28, 04-11-2010

 

Новый участник


Сообщения: 47
Благодарности: 5

Профиль | Отправить PM | Цитировать


Или хотя бы подскажите как сделать разделитель граф,при вводе серийного номера?

Отправлено: 17:15, 30-03-2011 | #1191



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


LordSP,
LicenseScroll
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
LicenseFile=compiler:License.txt

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

[_Code]
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
  EM_GETFIRSTVISIBLELINE = $CE; TestLine = 5;
var
  TimerID: LongWord;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
  CurrLine: integer;
begin
  CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
  If CurrLine >= TestLine then
    begin
      WizardForm.LicenseAcceptedRadio.Enabled:= True;
      KillTimer(0, TimerID);
    end;
end;

procedure InitializeWizard();
begin
  WizardForm.LicenseAcceptedRadio.Enabled:= False;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpLicense then
    begin
      pfunc:= WrapTimerProc(@OnTimer, 4);
      TimerID:= SetTimer(0, 0, 500, pfunc);
    end else
      KillTimer(0, TimerID);
end;

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

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Отправлено: 17:57, 30-03-2011 | #1192


Новый участник


Сообщения: 47
Благодарности: 5

Профиль | Отправить PM | Цитировать


nik1967

Все также,кнопка далее не активна пока не установишь чебокс,а не после прокрутки скролла.

Отправлено: 18:11, 30-03-2011 | #1193


Аватара для R3Pa4eK

Новый участник


Сообщения: 18
Благодарности: 3

Профиль | Отправить PM | Цитировать


Как к MsgBox добавить не только кнопку ОК , а и кнопочку "Отмена"?

Отправлено: 18:59, 30-03-2011 | #1194


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


R3Pa4eK,
Код: Выделить весь код
mbConfirmation, MB_YESNO)
если тебе это о чемто говорит.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Отправлено: 19:30, 30-03-2011 | #1195


Аватара для R3Pa4eK

Новый участник


Сообщения: 18
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата Лександер:
если тебе это о чемто говорит. »
Конечно говорит, спасибо! Только я чуть-чуть переделал и сделал вот так: MsgBox(Capt, mbConfirmation, MB_OKCancel); . Теперь мне надо реализовать такое: что-бы при нажатии на кнопку "Отмена" удалялась папка {app} и закрывался инсталл. Поможешь?

Отправлено: 19:41, 30-03-2011 | #1196


Аватара для Gnom_aka_Lexander

Ветеран


Сообщения: 978
Благодарности: 564

Профиль | Сайт | Отправить PM | Цитировать


R3Pa4eK,
Код: Выделить весь код
 if MsgBox(Capt, mbConfirmation, MB_OKCANCEL)= IDCANCEL then - нужное тебе действие
- чего хоть сложного?
В моем ренегаде реализовано так:
Код: Выделить весь код
procedure CurStepChanged(CurStep: TSetupStep);
var 
    ResultCode:integer;
begin
 if CurStep = ssDone then
 if FileExists('{#AppExe}') then \\ - проверка на наличие файла
  if MsgBox('{#SetupSetting("AppName")}' +' успешно ' +  ' установлена!' + #10#10#13 + 'Запустить ' + '{#SetupSetting("AppName")}' + '?' , mbInformation, MB_OKCANCEL) = IDOK then
   Exec(ExpandConstant('{#AppExe}'), '', '', SW_SHOW, ewNoWait, ResultCode); \\нужное действие на нажатие заявленной кнопки.
  end;
end;

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Последний раз редактировалось Gnom_aka_Lexander, 30-03-2011 в 20:03.


Отправлено: 19:53, 30-03-2011 | #1197


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Цитата LordSP:
Все также,кнопка далее не активна пока не установишь чебокс,а не после прокрутки скролла. »
Цитата:
неактивными кнопку "далее" и чебокс "принять..."
Как то уж определись, что тебе надо.
Ну а переделать скрипт, который я выкладывал, не судьба?
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
LicenseFile=compiler:License.txt

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

[_Code]
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
  EM_GETFIRSTVISIBLELINE = $CE; TestLine = 5;
var
  TimerID: LongWord;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
  CurrLine: integer;
begin
  CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
  If CurrLine >= TestLine then
    begin
      WizardForm.NextButton.Enabled:= True;
      KillTimer(0, TimerID);
    end;
end;

procedure InitializeWizard();
begin
  WizardForm.LicenseAcceptedRadio.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpLicense then
    begin
      pfunc:= WrapTimerProc(@OnTimer, 4);
      TimerID:= SetTimer(0, 0, 500, pfunc);
    end else
      KillTimer(0, TimerID);
end;

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

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Последний раз редактировалось nik1967, 30-03-2011 в 20:06.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:57, 30-03-2011 | #1198


Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата LordSP:
Все также,кнопка далее не активна пока не установишь чебокс »
Ну вообще-то для этого и есть страница с Лицензией, если он не согласен, то не сможет установить программу, т.е. моё мнение - RadioButton'ы должны быть всегда.
Пример

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
LicenseFile=compiler:License.txt
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy

[Code]
type
  TTextMetric = record
    tmHeight: Longint;
    tmAscent: Longint;
    tmDescent: Longint;
    tmInternalLeading: Longint;
    tmExternalLeading: Longint;
    tmAveCharWidth: Longint;
    tmMaxCharWidth: Longint;
    tmWeight: Longint;
    tmOverhang: Longint;
    tmDigitizedAspectX: Longint;
    tmDigitizedAspectY: Longint;
    tmFirstChar: Char;
    tmLastChar: Char;
    tmDefaultChar: Char;
    tmBreakChar: Char;
    tmItalic: Byte;
    tmUnderlined: Byte;
    tmStruckOut: Byte;
    tmPitchAndFamily: Byte;
    tmCharSet: Byte;
  end;

  Pointer = procedure(Sender: TObject);

function GetDC(hWnd: HWND): LongWord; external 'GetDC@user32.dll stdcall';
function SelectObject(DC: LongWord; p2: LongWord): LongWord; external 'SelectObject@gdi32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function GetTextMetrics(DC: LongWord; var TM: TTextMetric): BOOL; external 'GetTextMetricsA@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: LongWord): Integer; external 'ReleaseDC@user32.dll stdcall';
function WrapTimerProc(callback: Pointer; paramcount: Integer): LongWord; external 'wrapcallback@files:InnoCallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

const
  EM_GETRECT             = $00B2;
  EM_GETFIRSTVISIBLELINE = $00CE;

var
  TimerID: LongWord;
  IsReadLicense: Boolean;

function GetFirstVisibleLine(const Memo: TMemo): Integer;
begin
  Result := SendMessage(Memo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
end;

function GetCountVisibleLines(const Memo: TMemo): Integer;
var
  OldFont: LongWord;
  Hand: THandle;
  TM: TTextMetric;
  Rect: TRect;
begin
  Hand := GetDC(Memo.Handle);
  try
    OldFont := SelectObject(Hand, Memo.Font.Handle);
    GetTextMetrics(Hand, TM);
    GetWindowRect(Memo.Handle, Rect);
    Result := ((Rect.Bottom - Rect.Top) div (TM.tmHeight + TM.tmExternalLeading));
  finally
    ReleaseDC(Memo.Handle, SelectObject(Hand, OldFont));
  end;
end;

function GetLastVisibleLine(const Memo: TMemo): Boolean;
begin
  Result := (GetFirstVisibleLine(Memo) + GetCountVisibleLines(Memo)) >= (Memo.Lines.Count-1);
end;

procedure TimerProc(Sender: TObject);
begin
  if not IsReadLicense and GetLastVisibleLine(WizardForm.LicenseMemo) then
    begin
      WizardForm.LicenseAcceptedRadio.Enabled := True;
//      WizardForm.LicenseAcceptedRadio.Checked := True;
      IsReadLicense := True;
    end;
end;

procedure InitializeWizard();
begin
  TimerID := 0;
  IsReadLicense := False;
  WizardForm.LicenseAcceptedRadio.Enabled := False;
//  WizardForm.LicenseAcceptedRadio.Hide;
//  WizardForm.LicenseNotAcceptedRadio.Hide;
//  WizardForm.LicenseMemo.Height :=   WizardForm.LicenseMemo.Height + ScaleY(35);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpLicense:
      if not IsReadLicense then
        TimerID := SetTimer(0, 0, 50, WrapTimerProc(@TimerProc, 0));
  else
    if TimerID > 0 then
      begin
        KillTimer(0, TimerID);
        TimerID := 0;
      end;
  end;
end;

Если вы всё же хотите сделать без RadioButton'ов, просто раскоментируйте строки.

P.S.
nik1967, этот пример из сборника скриптов, не совсем корректен, т.к. не определяет, прокрутил ли пользователь скролбар до конца.
Ну и по хорошему ещё сюда нужно прикрутить хинт или лэйбл какой-нибудь сделать, чтоб если пользователь резко прокрутил скролбар, то значит не читал и об этом написать ему, что мол читать надо вдумчиво...

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:04, 30-03-2011 | #1199


Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


Доброго все времени суток ! Помогите с вопросом ! факи читал нефига не понял !

[Tasks]
Name: additional; Description: "Дополнительное ПО";
Name: additional\dx; Description: "Обновить DirectX"; Flags: unchecked
Name: additional\vcr86; Description: "Обновить библиотеки С++ х86"; Flags: unchecked;
Name: additional\vcr64; Description: "Обновить библиотеки С++ х64"; Flags: unchecked;


[Run]
Filename: {src}\Redist\vcredist_x86.exe; Flags: nowait; Tasks: additional\vcr86; Parameters: /q;
Filename: {src}\Redist\vcredist_x64.exe; Flags: nowait; Tasks: additional\vcr64; Parameters: /q;
Filename: {src}\Redist\DirectX\dxsetup.exe; Flags: nowait; Tasks: additional\dx; Parameters: /silent;

Вопрос заключается в следующем:
Как сделать, чтобы файлы в секции [Run] запускались по очереди? Т.е. инсталляция второго файла начиналась только после того, как инсталляция первого файла закончилась или отменилась, желательно на данном примере !

Спасибо Огромное !!!

Последний раз редактировалось newmangor, 31-03-2011 в 10:56.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:32, 31-03-2011 | #1200



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 3]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Утилиты - [addon] Inno Setup CrOsP Наборы обновлений для Windows XP/2003/Windows 7 33 11-05-2011 16:03
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Inno Setup 5.3.6 OSZone Software Новости программного обеспечения 0 15-11-2009 17:30
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход