Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
 • Просмотры: 23
Аватара пользователя
Iska

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Iska »

Цитата iglezz:



В том, что InitializeSetup() возвращает True вместо предполагаемого, по логике, результата функции InitializeSetup2()
Скрипты Inno Setup. Помощь и советы [часть 9]




Можно ли как то исправить эту проблему?

Может как то переделать код, или объеденить 2 функции по другому?



ПопробЫвал вызвать через procedure

Получилось что-то такое:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

Procedure Skins();
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
end;
Function InitializeSetup2(): Boolean;
var ResultStr: String;
begin
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr='{#AppVer}' then
begin
  Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
  MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
  else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
  Skins();
  Result := True;
end;







Но скин срабатывает только после Splash, тоисть окна проверки (Обновления) без оформления.



Тоисть нужна procedura наоборот, вроде такого:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

Procedure Update();
var ResultStr: String;
begin
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr='{#AppVer}' then
begin
  Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
  if Result = False then
  MsgBox('Обновление клиента отменено!', mbInformation, MB_OK);
end
  else MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;
Function InitializeSetup2(): Boolean;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  Result := True;
  Update();
end;







Но она отказывается работать.
Аватара пользователя
Iska

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Iska »

passstrada,


Например так

[spoiler]Код:
[/spoiler]

Код: Выделить всё

function CheckInstalled(): Boolean;
var ResultStr: String;
begin
	RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
	if ResultStr='{#AppVer}' then Result := True else Result := False;
end;
function GetUserConfirmation(Message: String): Boolean;
begin
	if MsgBox(Message, mbConfirmation, MB_YESNO) = IDYES then Result := True else Result := False;
end;
function InitializeSetup(): Boolean;
var ReturnValue: Boolean;
begin
	// это вместо InitializeSetup1()
	ExtractTemporaryFile('Amakrits.vsf');
	LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
	// это вместо InitializeSetup2()
	ReturnValue := False;
	if CheckInstalled() then
		ReturnValue := GetUserConfirmation('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?')
	else
		MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK)
	Result := ReturnValue;
end;







Хотя непонятно зачем дополнительно спрашивать про "Продолжить установку?", если гуй всё равно используется.



add:

Чтобы не лепить "Result := True;" где попало неплохо бы справку почитать по Inno и Pascal
Аватара пользователя
Nordek

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Nordek »

Цитата passstrada:



И идёт продолжение запуска обновления, а должно закрыть окно Обновления.
Скрипты Inno Setup. Помощь и советы [часть 9]




passstrada,



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

function InitializeSetup: Boolean;
var
  ResultStr: string;
begin
  Result := False;
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  if RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr) and
    (ResultStr = '{#AppVer}') then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Gnom_aka_Lexander »

Beavimo, Есть объект UninstallProgressForm, тоже самое, что и Wizardform, делать с ним можно тоже все, что душе заблагорассудиться - менять размеры, накладывать картинки, добавлять объекты, в том числе и NoteboockPage, соответственно и страницы. Нет нужды делать отдельный деинсталлятор, все можно сделать и на оригинальном.
Аватара пользователя
Iska

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Iska »

Цитата nik1967:



А так не катит?
Скрипты Inno Setup. Помощь и советы [часть 9]




nik1967, в данном примере прокатит, но есть нюанс. Чему будет равен Result, если ResultStr='{#AppVer}' вернет False?
Аватара пользователя
VLADEV

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение VLADEV »

Цитата nik1967:



False
Скрипты Inno Setup. Помощь и советы [часть 9]




nik1967, верно, InitializeSetup не вызывается из другой процедуры и переменная Result инициализируется в ней значением по умолчанию после оператора begin.



Теперь сделаем ее вызываемой: переименуем ее в InitializeSetup2, например, и вызовем ее из InitializeSetup следующим образом:

[spoiler]Код:
[/spoiler]

Код: Выделить всё

function InitializeSetup2: Boolean;
var
  ResultStr: string;
begin
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr = '{#AppVer}' then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;
function InitializeSetup: Boolean;
begin
  Result := True; // что-то делаем с Result, в итоге Result равен True
  // ...
  Result := InitializeSetup2; // вызываем InitializeSetup2
end;







При входе в InitializeSetup2 после begin Result равен True и в случае невыполнения ResultStr = '{#AppVer}' пользователь увидит сообщение "Клиент игры не найден" и установка продолжится, что есть непредвиденное поведение. В данном случае Result не инициализируется в InitializeSetup2, это было сделано раньше, в InitializeSetup после begin. Потом в строке Result := True переменной присвоено значение True и дальше передана по ссылке в InitializeSetup2. Функции на самом деле являются процедурами, где первым параметром идет переменная c именем Result и которая передается по ссылке.



Так что пример выше на самом деле выглядит так:

[spoiler]Код:
[/spoiler]

Код: Выделить всё

procedure InitializeSetup2(var Result: Boolean);
var
  ResultStr: string;
begin
  // тут Result передан по ссылке из InitializeSetup и равен True
  ExtractTemporaryFile('Amakrits.vsf');
  LoadVCLStyle(ExpandConstant('{tmp}\Amakrits.vsf'));
  RegQueryStringValue(HKCU, 'Software\WoTBlitz', 'Version', ResultStr);
  if ResultStr = '{#AppVer}' then
  begin
    Result := MsgBox('Поиск клиента игры...' #13#13 'Клиент игры найден. Продолжить установку?', mbConfirmation, MB_YESNO) = idYes;
    if not Result then
      MsgBox('Поиск клиента игры...' #13#13 'Обновление клиента прервано.', mbInformation, MB_OK);
  end else // непредвиденное поведение: тут Result равен True, т.к. нигде не используется выше в теле процедуры
    MsgBox('Поиск клиента игры...' #13 'Клиент игры не найден!' #13#13 'Обновление не может быть установлено!', mbConfirmation, MB_OK);
end;
procedure InitializeSetup(var Result: Boolean);
begin
  // тут Result инициализируется значением по умолчанию False
  Result := True; // что-то делаем с Result, в результате Result равен True
  // ...
  InitializeSetup2(Result); // вызываем InitializeSetup2
end;







Чтобы избежать подобных случаев, нужно либо явно в теле функции присваивать Result значение по умолчанию первой строкой, либо строить логику так, чтобы Result в любых случаях был переназначен.
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Gnom_aka_Lexander »

Здравствуйте! Мне нужна помощь.

Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).

1.Что в скрипте не так?

2.Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?





Код:

Код: Выделить всё

[Setup]
AppName=Программа 2020
; AppVerName=1.0
AppPublisher=Pro, Inc.
AppCopyright=Copyright (C) 2020
AppVersion=2.0.0.0
DefaultDirName="{commonappdata}\Inno\Программа"
DisableStartupPrompt=yes
DisableReadyPage=yes
DisableDirPage=yes
DefaultGroupName=Inno 5\Настройки
DisableProgramGroupPage=yes
OutputBaseFilename=setup-auto
Compression=lzma
SolidCompression=yes
Uninstallable=no
DisableWelcomePage=no
WizardSmallImageFile=WizSmall2.bmp
[Messages]
WelcomeLabel1=Вас приветствует Мастер установки Inno 5
WelcomeLabel2=Программа установит [name/ver] на Ваш компьютер.%n%nТребуется закрыть программу "Inno 5" перед тем, как продолжить.
FinishedHeadingLabel=Завершение Мастера установки Inno 5
FinishedLabelNoIcons=[name/ver] установлены на Ваш компьютер.
FinishedLabel=[name] установлены.%n%nНастройки находятся в папке "Программа" на Рабочем столе компьютера.
InstallingLabel=Пожалуйста, подождите пока [name] установится на Ваш компьютер.
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Files]
Source: "{src}\Программа\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist
[Icons]
Name: "{group}\Настройки"; Filename: "{commonappdata}\Inno\Программа"
Name: "{commondesktop}\Программа"; Filename: "{commonappdata}\Inno\Программа"; Comment: "Папка содержит настройки программы"

Спасибо!
Аватара пользователя
Beavimo

Re: Скрипты Inno Setup. Помощь и советы [часть 9]

Сообщение Beavimo »

Log 101, У меня все ярлыки создаются как на рабочем столе так и в меню пуск.


Цитата Log 101:



Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
Скрипты Inno Setup. Помощь и советы [часть 9]




Чтобы ярлык виделся в любой программе замените {commondesktop} на {userdesktop}


Цитата Log 101:



Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?
Скрипты Inno Setup. Помощь и советы [часть 9]




Добавьте эту строку.



Код:

Код: Выделить всё

[Run]
Filename: "{win}\explorer.exe"; Parameters: "{commonappdata}\Inno\Программа"; Description: "Открыть папку с настройками"; Flags: nowait postinstall skipifsilent
Ответить

Вернуться в «Автоматическая установка приложений»