Это мощное бесплатное средство для создания установочных пакетов (дистрибутивов) программ. Поддерживается шифрование, установка пароля, различные задачи по завершении установки. По сравнению с NSIS (основной конкурент на бесплатной основе) проще в настройке, имеет более понятную структуру скрипта, но генерит на 200-300 кб больший инсталятор. На данный момент он конкурирует и даже превосходит многие коммерческие установщики по функциональности и стабильности.
Последние версии: Inno Setup QuickStart Pack (ansi)5.4.2 [17.03.2011] Скачать (1.7 Mb) Inno Setup QuickStart Pack (unicode)5.4.2 [17.03.2011] Скачать (2 Mb) Русификатор для Inno Setup версии 5.4.x от vadimsva Скачать
Расширения от ResTools Inno Setup Compiler5.4.1 - 5.4.2 build 110319 Скачать (2.71 Mb)|Зеркало (1.54 Mb) - убраны картинки для уменьшения размера архива Inno ISCmplr Setup5.4.2 build 110329 Скачать (1.6 Mb)|Зеркало Добавляет списку компонентов возможность сворачивать дочерние элементы. Содержит более удобный редактор, кроме того, компилятор имеет множество других возможностей и новых функций. На сайте автора также есть дополнительные библиотеки. Русификатор для Inno Setup Enhanced (Restools) версии 5.4.x (ansi и unicode) от vadimsva Скачать
Сборки Inno Setup: InnoUltra5.4.2 [28.04.2011] от Gnom Сборка инструментов для работы со скриптами InnoSetup. Содержит в себе все обновленные инструменты для работы, сборка постоянно обновляется. Полная версия|Облегченная версия|Update
Как много дел считались невозможными, пока они не были осуществлены. (Гай Плиний Секунд) Не занимаюсь подключением FreeArc/ISDone к чужим скриптам.
Дата: Вторник, 19.04.2011, 03:33 | Сообщение # 241
Пользователь
Сообщений: 17
Статус: Offline
Quote (Krinkels)
Запись в ini через секцию код
Этот вариант мне известен Я наверное не правильно объяснил, твой предложенный вариант, добавляет в определенную секцию после всех строчек а мне нужно чтобы он добавил в определенную секцию между строчек например между 4-той и 5-той строчкой в том посте где задавал вопрос, как показано
и тоже самое мне нужно сделать, только файл.ini у же находится в ZIP-е
Многие вещи кажутся изысканными пока они происходят не с вами
Дата: Вторник, 19.04.2011, 07:54 | Сообщение # 243
Местный гуру
Администратор
Сообщений: 150
Статус: Offline
DaRKdemoN Представляем текст из лейбла как string, затем проверяем третий символ, если условие проходит, то меняем его.
Code
procedure InitializeWizard(); var s: string; begin s:= MyLabel.Caption; if s[3]='F' then //Чувствителен к регистру, так что точно указывай что тебе нужно s[3]:='X'; MyLabel.Caption:=s; end;
Quote (Black_angel)
Я наверное не правильно объяснил, твой предложенный вариант, добавляет в определенную секцию после всех строчек а мне нужно чтобы он добавил в определенную секцию между строчек например между 4-той и 5-той строчкой
Почему именно между 4-й и 5-й строчками? Я конечно могу написать функцию записи в Ini, в указанную секцию, в указанной строке, но все же, зачем именно так?
Quote (Black_angel)
и тоже самое мне нужно сделать, только файл.ini у же находится в ZIP-е
Придется перепаковывать zip, т.к при изменении файла в архиве, архив повредится. Архив большой? Как много дел считались невозможными, пока они не были осуществлены. (Гай Плиний Секунд) Не занимаюсь подключением FreeArc/ISDone к чужим скриптам.
Дата: Вторник, 19.04.2011, 11:57 | Сообщение # 244
Пользователь
Сообщений: 17
Статус: Offline
Quote (Shegorat)
Я конечно могу написать функцию записи в Ini, в указанную секцию, в указанной строке, но все же, зачем именно так?
Я хочу реализовать авто установку меню для опера которое выкладывал здесь и хочу чтоб при установке оно устанавливалась не по умолчанию в конце всех меню а имена там где я захочу но для этого мне нужно чтоб моя строка вписывалась между определённых строк
Quote (Shegorat)
Придется перепаковывать zip, т.к при изменении файла в архиве, архив повредится. Архив большой?
не больше 3-хМБ Многие вещи кажутся изысканными пока они происходят не с вами
function FindSection(List: TStringList; Section: String): Integer; var n: integer; begin Result:=-1; for n:=0 to List.Count-1 do begin if AnsiLowercase(List.Strings[n])=AnsiLowercase('['+Section+']') then begin Result:=n; Break; end; end; end;
function FindNextSection(list: TStringList; FirstSection: Integer): Integer; var n: integer; begin Result:= FirstSection; if FirstSection+1>=List.Count then Exit; for n:= FirstSection+1 to List.Count-1 do begin if (Pos('[', List.Strings[n])>0)and(Pos(']', List.Strings[n])>0) then begin Result:=n; Break; end; end; if Result=FirstSection then Result:= List.Count-1; end;
function FindKey(list: TStringList; Key: String; n1, n2: Integer): Integer; var n: integer; begin Result:=-1; for n:=n1+1 to n2-1 do begin if Pos(AnsiLowercase(Key+'='), AnsiLowercase(List.Strings[n])) > 0 then begin Result:= n; Break; end; end; end;
function SetIniStringEx(Filename: String; Section, Key, Value: String; Line: Integer): Boolean; var Str: TStringList; nsect1, nsect2, nline, nkey: integer; begin Str:= TStringList.Create; if Line=0 then Line:=1; try if (not FileExists(Filename)) then begin Str.Add('['+Section+']'); Str.Add(Key+'='+Value); Str.SaveToFile(Filename); Result:= True; end else begin Str.LoadFromFile(Filename); nsect1:= FindSection(str, Section); if (nsect1<>-1) then begin nsect2:= FindNextSection(str, nsect1); nline:= nsect1+line; if nline>=nsect2 then nline:=nsect2-1; nkey:= FindKey(str, key, nsect1, nsect2); if nkey=-1 then begin Str.Insert(nline, key+'='+value); end else begin Str.Strings[nkey]:=Key+'='+Value; end; end else begin Str.Add(''); Str.Add('['+Section+']'); Str.Add(Key+'='+Value); end; Str.SaveToFile(Filename); Result:= True; end; finally Str.Free; end; end;
Правда она еще немного не закончена - нет проверки на наличие секции и самого ключа. Попозже закончу. Все, вроде все сделал... Как много дел считались невозможными, пока они не были осуществлены. (Гай Плиний Секунд) Не занимаюсь подключением FreeArc/ISDone к чужим скриптам.
Дата: Вторник, 19.04.2011, 14:34 | Сообщение # 247
Местный гуру
Администратор
Сообщений: 150
Статус: Offline
Quote (DaRKdemoN)
Да, да то что надо. А как можно определить сколько символов в string?
Функция function Length(S: String): Longint; Как много дел считались невозможными, пока они не были осуществлены. (Гай Плиний Секунд) Не занимаюсь подключением FreeArc/ISDone к чужим скриптам.
Дата: Вторник, 19.04.2011, 16:01 | Сообщение # 248
Проверенный
Сообщений: 67
Статус: Offline
[Setup] AppName=My Program AppVerName=My Program v 1.5 DefaultDirName={pf}\My Program OutputDir=. Compression=lzma/ultra InternalCompressLevel=ultra SolidCompression=yes
[Code] function GetHardDriveFreeSpace(hdd: integer): Integer; external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall'; function GetHardDriveName(hdd: integer): PChar; external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall'; function GetHardDriveTotalSpace(hdd: integer): Integer; external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall'; function GetHardDrivesCount(): Integer; external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';
const TB = 1024 * 1024; GB = 1024;
function TBorGBorMB(const FileSize: Extended): string; // функция определения ТБ, ГБ или МБ begin if FileSize/TB > 1 then Result:= Format('%.3f ТБ', [FileSize/TB]) else if FileSize/GB > 1 then Result:= Format('%.3f ГБ', [FileSize/GB]) else Result:= Format('%.3f MБ', [FileSize]); end;
function InitializeSetup(): Boolean; var i, count: Integer; msg: string; begin count:= GetHardDrivesCount(); msg:= 'Количество дисков: ' + IntToStr(count) + #13; for i:= 0 to count - 1 do msg:= msg + 'Диск ' + GetHardDriveName(i) + ' - Всего: ' + TBorGBorMB(GetHardDriveTotalSpace(i)) + ' - Свободно: ' + TBorGBorMB(GetHardDriveFreeSpace(i)) + #13; MsgBox(msg, mbInformation, MB_OK); end;
Перенес данный пример на лейбл,показывает только один диск и все. Может я что то не то накрутил. Если делать еще на один лейбл,то определяет свободное место на диске которое не используется вообще (8Мб)
function GetHardDriveFreeSpace(hdd: integer): Integer; external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall'; function GetHardDriveName(hdd: integer): PChar; external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall'; function GetHardDriveTotalSpace(hdd: integer): Integer; external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall'; function GetHardDrivesCount(): Integer; external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';
const TB = 1024 * 1024; GB = 1024;
function TBorGBorMB(const FileSize: Extended): string; // функция определения ТБ, ГБ или МБ begin if FileSize/TB > 1 then Result:= Format('%.3f ТБ', [FileSize/TB]) else if FileSize/GB > 1 then Result:= Format('%.3f ГБ', [FileSize/GB]) else Result:= Format('%.3f MБ', [FileSize]); end;
procedure InitializeWizard(); var i, count: Integer; msg: string; begin Label1 := TLabel.Create(WizardForm); with Label1 do begin Parent := WizardForm.SelectDirPage; Transparent := False; Left := ScaleX(8); Top := ScaleY(110); Width := ScaleX(31); Height := ScaleY(13); end;
begin count:= GetHardDrivesCount(); for i:= 0 to count - 1 do msg:= msg + 'Диск ' + GetHardDriveName(i) + ' - Всего: ' + TBorGBorMB(GetHardDriveTotalSpace(i)) + ' - Свободно: ' + TBorGBorMB(GetHardDriveFreeSpace(i)) + #13; Label1.caption:=msg; end; end;
Если я знаю, что знаю мало, я добьюсь того, чтобы знать больше... В.И. Ленин
Сообщение отредактировал YURSHAT - Вторник, 19.04.2011, 19:47
Дата: Вторник, 19.04.2011, 22:04 | Сообщение # 251
Пользователь
Сообщений: 3
Статус: Offline
Всем здравствуйте Возник такой вопрос, как сделать пропуск страниц по клику на созданной кнопке (на ботве)? Т.е. что писать в процедуру клика или в скип пейдж (а там может как и по другому можно сделать), чтоб по нажатию кнопки, пропускалась та или иная страница Заранее спасибо! Или.... осуществлялся переход, на ту или иную страницу? Просто, хочу типо такого сделать: http://img840.imageshack.us/img840/7936/24563032.png Как в инсталл визард.... Нажимаешь одну кнопку, обычная установка, с выбор путей, по и т.д. Нажимаешь другую кнопку, установка по умолчанию
Сообщение отредактировал Sten - Вторник, 19.04.2011, 22:14
[CustomMessages] HeaderLabelPage=Выберите тип установки MyRadioCaption_1=Установка по умолчанию MyRadioCaption_2=Выборочная установка PageTextHeader=На этой странице Вы можете выбрать тип установки, который для Вас наиболее удобен. MyText_1=Установка будет произведена полностью в автоматическом режиме.%n(Подходит для не подготовленных пользователей) MyText_2=Будет предложен выбор директории установки.%n(Для продвинутых пользователей)
procedure GetInstTypePage(); begin MyNewPage := CreateCustomPage(wpWelcome, ExpandConstant('{cm:HeaderLabelPage}'), '');
try // в конкретном примере из этого файла (C:\Windows\System32\shell32.dll) берём иконки, для пробного показа. // Можно использовать обычные .ico AIconFileName := ExpandConstant('{sys}\shell32.dll'); //
hIcon := ExtractIcon(GetModuleHandle(0), AIconFileName, 26); try with TBitmapImage.Create(WizardForm) do begin Left := ScaleX(15); Top := ScaleY(68); Width := 32; Height := 32; with Bitmap do begin Width := 32; Height := 32; Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect); DrawIconEx(Canvas.Handle, 0, 0, HIcon, 32, 32, 0, 0, DI_NORMAL); end; Parent := MyNewPage.Surface; end; finally DestroyIcon(hIcon); end;
hIcon := ExtractIcon(GetModuleHandle(0), AIconFileName, 19); try with TBitmapImage.Create(WizardForm) do begin Left := ScaleX(15); Top := ScaleY(138); Width := 32; Height := 32; with Bitmap do begin Width := 32; Height := 32; Canvas.Brush.Color := clBtnFace; Canvas.FillRect(Rect); DrawIconEx(Canvas.Handle, 0, 0, HIcon, 32, 32, 0, 0, DI_NORMAL); end; Parent := MyNewPage.Surface; end; finally DestroyIcon(hIcon); end; except end;
with TNewStaticText.Create(WizardForm) do begin Width := WizardForm.InnerNotebook.Width; Height := ScaleY(26); WordWrap := True; Caption := ExpandConstant('{cm:PageTextHeader}'); Parent := MyNewPage.Surface; end;
MyRadioBtn_1 := TNewRadioButton.Create(WizardForm); with MyRadioBtn_1 do begin Top := ScaleY(50); Width := ScaleX(150); Caption := ExpandConstant('{cm:MyRadioCaption_1}'); Checked := True; Parent := MyNewPage.Surface; end;
with TNewStaticText.Create(WizardForm) do begin Left := ScaleX(60); Top := ScaleY(68); Width := WizardForm.InnerNotebook.Width - ScaleX(60); Height := ScaleY(26); WordWrap := True; Caption := ExpandConstant('{cm:MyText_1}'); Parent := MyNewPage.Surface; end;
MyRadioBtn_2 := TNewRadioButton.Create(WizardForm); with MyRadioBtn_2 do begin Top := ScaleY(120); Width := ScaleX(150); Caption := ExpandConstant('{cm:MyRadioCaption_2}'); Parent := MyNewPage.Surface; end;
with TNewStaticText.Create(WizardForm) do begin Left := ScaleX(60); Top := ScaleY(138); Width := WizardForm.InnerNotebook.Width - ScaleX(60); Height := ScaleY(26); WordWrap := True; Caption := ExpandConstant('{cm:MyText_2}'); Parent := MyNewPage.Surface; end; end;
function ShouldSkipPage(PageID: Integer): Boolean; begin if (PageID >= wpSelectDir) and (PageID < wpReady) and (MyRadioBtn_1.Checked) then Result := True; end;
procedure InitializeWizard(); begin GetInstTypePage(); end;
Сообщение отредактировал nik1967 - Среда, 20.04.2011, 09:40
Попал в засаду - у секции Languages нет возможности проверки(Check). оставить родной переключатель языка, который перед установкой - не получится, - при отмене установки из этого окошка, вылезает ошибка, поскольку он пытается завершить процессы, которые не были еще начаты. Вопрос - можно-ли языки установки переключать из кода? Либо, может быть есть возможность, при закрытии инсталла до срабатывания инитиализесетап обойти секцию ДеинитиализеСетап?
Все, справился В общем, если нужно завершить инсталл до начала InitializeSetup чтобы не выбивало ошибку :
Code
procedure DeinitializeSetup(); begin if InitializeSetup then gdipShutdown BASS_Stop BASS_Free end;
Попал в засаду - у секции Languages нет возможности проверки(Check). оставить родной переключатель языка, который перед установкой - не получится, - при отмене установки из этого окошка, вылезает ошибка, поскольку он пытается завершить процессы, которые не были еще начаты. Вопрос - можно-ли языки установки переключать из кода? Либо, может быть есть возможность, при закрытии инсталла до срабатывания инитиализесетап обойти секцию ДеинитиализеСетап?
Ну можно же сделать условие и тогда можно будет оставить выбор языка перед установкой
Code
var IsInitialized: Boolean;
function InitializeSetup(): boolean; begin *********
IsInitialized:= False; Result:= True; end;
procedure InitializeWizard(); begin **********
IsInitialized:= True;
********* end;
procedure DeinitializeSetup(); if IsInitialized then begin gdiShutdown;
********* end;
Как много дел считались невозможными, пока они не были осуществлены. (Гай Плиний Секунд) Не занимаюсь подключением FreeArc/ISDone к чужим скриптам.