Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

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

Аватара для El Sanchez

Ветеран


Contributor


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


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

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


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

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


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

Отправлено: 03:49, 21-05-2012

 

Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
те GetIniString(...) = 'yes' значит True »
а еще есть функция GetIniBool, что проще мне кажется. и в код уважаемого El Sanchez совсем несложно ее добавить.
Прототип:
function GetIniBool(const Section, Key: String; const Default: Boolean; const Filename: String): Boolean;

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

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

Отправлено: 20:02, 28-12-2012 | #1441



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

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


Аватара для Raf-9600

Старожил


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

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


Цитата Johny777:
в Voice=false нет необходимости
Checked[Items.IndexOf('a')] принмает булев значение (True, False), но мы проверяем условие (сравниваем значения)
те GetIniString(...) = 'yes' значит True »
Это не от недопонимания написано, просто такой стиль, если можно так выразиться...

Цитата Johny777:
а если там нет 'yes' или стоит что-то другое или пусто то будет False, те айтем не будет отмечен, то бишь галки не будет »
Понял, поспешил с вопросом. Я думал что если не найдёт значение то возмёт его из самого инсталлятора, а не снимет галочку.

Возникла проблема. Почему-то часть параметров работают отлично, но остальные вызывают ошибку "List index out of bounds" при запуске инсталлятора. Собсно вот кусок кода, почему-то строчка c "cm:Game" проходит отлично, а "cm:backup" вызывает ошибку:

Код: Выделить весь код
procedure InitializeWizard();
var
    iFile: TIniFile;
    
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(ExpandConstant('{cm:Game}'))] := GetIniValue('Game', 'Backup', '', iFile) = 'true';
      Checked[Items.IndexOf(ExpandConstant('{cm:backup}'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
    end;
end;
Наличие "расшифровки" cm:backup проверил, правильность написания с тем что указано в секции инсталлятора [Components] - тоже, но абсолютно не понимаю, из-за чего может быть ошибка?

Последний раз редактировалось Raf-9600, 28-12-2012 в 20:24.


Отправлено: 20:16, 28-12-2012 | #1442


Аватара для Johny777

Ветеран


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

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


Цитата Gnom_aka_Lexander:
а еще есть функция GetIniBool, что проще мне кажется. и в код уважаемого El Sanchez совсем несложно ее добавить. »
добавил . Думаю Raf-9600 так будет проще
читать дальше »
Код: Выделить весь код
                                                                                                            
function IsKey(const Section, Key: String; Default: boolean; iFile: TIniFile): BOOL;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key] = 'True';
            Break;
        end;
        Break;
    end;
end;

Raf-9600, функция function IsKey(const Section, Key: String; iFile: TIniFile): BOOL;
где
первый входной параметр - String - имя секции
второй входной параметр - String - имя ключа
третий входной - возвращаемое по умолчанию булев значение (а то что если секции или ключа нет, а компонент по умолчанию должен быть отмечен или не отмечен)
четвёртый входной параметр - TIniFile
если в таком-то ключе такой-то секции значение 'True', то функция вернёт True, в противном случае False
пример:
читать дальше »
Код: Выделить весь код
procedure InitializeWizard();
var
    iFile: TIniFile;
    
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(ExpandConstant('{cm:Game}'))] := IsKey('Game', 'Backup', False, iFile);
      Checked[Items.IndexOf(ExpandConstant('{cm:backup}'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
    end;
end;

============================
лучше юзай для своих сообщений вместо функции ExpandConstant('{cm:backup}')) другую - CustomMessage('backup')
она в примерно 2 раза быстрее вернёт строку сообщения для текущего языка
тест:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[CustomMessages]
H=fffffffffffffffffffffff

[  code]
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure InitializeWizard();
var
  i: Integer;
  dwStartTime: DWORD;
begin
  dwStartTime := GetTickCount;
  for i := 0 to 100000 do CustomMessage('H');
//  for i := 0 to 100000 do ExpandConstant('{cm:H}');
  MsgBox(IntToStr(GetTickCount-dwStartTime), mbInformation, MB_OK);
end;

Цитата Raf-9600:
"List index out of bounds" »
а он Enabled? (или нет флага fixed)
===================================
UPD: обновил функцию

Последний раз редактировалось Johny777, 28-12-2012 в 21:26.

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

Отправлено: 20:44, 28-12-2012 | #1443


Аватара для Raf-9600

Старожил


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

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


Цитата Johny777:
Думаю Raf-9600 так будет проще »
Благодарю. Пока что эту функцию не встраивал, так как все ещё не могу разобраться с ошибкой "List index out of bounds".
Если у тебя есть время, посмотри, пожалуйста, более полный исходник:

читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
LanguageDetectionMethod=uilanguage
ShowLanguageDialog=auto

[CustomMessages]
ru.TypeOfInstallation=Тип установки:
en.TypeOfInstallation=Type of installation:
ru.Game=Обычный
en.Game=Normal
ru.portable=Портативный
en.portable=Portable
ru.OnlyLocalization=Локализация
en.OnlyLocalization=Localization
ru.backup=Резервная копия
en.backupєckup
ru.FullInstallation=Полная установка
en.FullInstallation=Full installation

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"

[Components]
Name: "Game"; Description: "{cm:TypeOfInstallation}"; Flags: disablenouninstallwarning;
Name: "Game\Full"; Description: "{cm:Game}"; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Game\Pottable"; Description: "{cm:portable}"; Flags: exclusive disablenouninstallwarning;
Name: "Game\Lokal"; Description: "{cm:OnlyLocalization}"; Flags: collapsed disablenouninstallwarning;
Name: "Game\Lokal\Backup"; Description: "{cm:backup}"; Flags: disablenouninstallwarning;

[Types]
Name: "full"; Description: "{cm:FullInstallation}"; Flags: iscustom


[   Code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(CustomMessage('Game'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
      Checked[Items.IndexOf(CustomMessage('backup'))] := GetIniValue('Game', 'Backup', '', iFile) = 'true';
    end;
end;

Отправлено: 22:15, 28-12-2012 | #1444


Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата Raf-9600:
Пока что эту функцию не встраивал, так как все ещё не могу разобраться с ошибкой "List index out of bounds" »
Raf-9600, потому что из-за флага collapsed компонента Game\Lokal не отображается дочерний компонент. Нужно для родителя (Game\Lokal) вместо collapsed написать checkablealone, для дочки (Game\Lokal\Backup) добавить dontinheritcheck.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:12, 28-12-2012 | #1445


Аватара для Raf-9600

Старожил


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

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


Цитата El Sanchez:
потому что из-за флага collapsed компонента Game\Lokal не отображается дочерний компонент. »
А есть ли какой-то способ подружить collapsed и загрузку информации о выбранных компонентах из .ini? Просто ведь когда число компонентов переваливает за сотню, то без "сворачивания" ну никак не обойтись =\

Последний раз редактировалось Raf-9600, 29-12-2012 в 11:20.


Отправлено: 00:46, 29-12-2012 | #1446


Пользователь


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

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


Доброго времени суток, господа. Не подскажите как в ISDone 6.0 в LabelCurrFileName: TLabel; (надпись "Извлекается файл") показывалось только название извлекаемого файла в данный момент и никакого пути перед ним?

Отправлено: 00:15, 30-12-2012 | #1447


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Nightwishh, Ответ - использовать ExtractFileName :

читать дальше »
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
.................................................
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(ExtractFileName(CurrentFile),...............
...............................................
end;

Цитата Raf-9600:
А есть ли какой-то способ подружить collapsed и загрузку информации о выбранных компонентах из .ini? »
есть. после НГ накидаю, если не забуду, сейчас уже не в состоянии

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


Последний раз редактировалось Gnom_aka_Lexander, 30-12-2012 в 13:00.

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

Отправлено: 11:23, 30-12-2012 | #1448


Аватара для nik1967

Старожил


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

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


Gnom_aka_Lexander, тогда уж MinimizePathName не нужно.
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+ExtractFileName(CurrentFile);

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

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

Отправлено: 13:19, 30-12-2012 | #1449


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата nik1967:
тогда уж MinimizePathName не нужно. »
а если имя файла настолько длинное, что не влезет в длинну лейбела?. хотя, может ты и прав нужно тогда придумать что-то типа прокрутки непомещающегося текста

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

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

Отправлено: 13:25, 30-12-2012 | #1450



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход