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

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

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

Сообщение ZVSRus »

Цитата LagunaFAN:



Проблема с картинками, я так понимаю, всего лишь из-за того, что картинки маленького разрешения (или нет?). Но что с кнопками Next и Cancel и текстом (мейби сам скин виноват?)? Это можно пофиксить?
Скрипты Inno Setup. Помощь и советы [часть 8]




LagunaFAN, у своих TBitmapImage свойство Stretch в True, TLabel поменять на TNewStaticText, скин да, виноват, неверные метрики рассчитываются.
Аватара пользователя
ZVSRus

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

Сообщение ZVSRus »

OldGamer, Вопрос на засыпку!

Вы сами собирали скрипт, музыка + сплеш заставка.

Музыка работает своеобразно, нажимаешь на кнопку отключения, на кнопке крестик, это правильно. Двигаешь громкость, музыка начинает играть но на кнопке крестик, это не правильно. Нажимаешь на кнопку, крестик пропадает, но музыка играть перестаёт, это не правильно. Снова двигаешь ползунок громкости, музыка начинает играть, это не правильно. Замороченный скрипт.
Аватара пользователя
Dodakaedr

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

Сообщение Dodakaedr »

Цитата pollipen:



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




Для начала привести сам код. Затем рассказать, как Вы дошли до жизни такой откуда этот код у Вас в таком виде взялся.
Аватара пользователя
OldGamer

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

Сообщение OldGamer »

Dodakaedr, Спасибо большое - это работает Изображение
Аватара пользователя
ZVSRus

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

Сообщение ZVSRus »

Dodakaedr, OldGamer,

Да музыка начинает играть при открытии окна инсталлятора, пропуская Splash заставку, но почему при выключенной музыки кнопкой,

музыка начинает играть при перетаскивании ползунка громкости, при этом кнопка показывает что музыка выключена!
Аватара пользователя
eromunald

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

Сообщение eromunald »

Народ, выручайте!



Я в Inoo Setup-е не "бум-бум", как говорится...

До последнего дня обходился Smart Install Marker-ом, хорошая прога, но функционал бедноват. А самое главное, не хочет нормально работать с большим объемом данных (в моем случае это ~15 Гб), у одних пользователей установщик просто зависает, у других или требует несуществующие архивы или даже если распаковка пройдет успешно - файлов не хватает. Короче, на таких объемах он глючит. Обложился скриптами и туторами, но пока ничего путного не выходит, все-таки надо бы получше шарить в коде, чтобы понять как создать то, что мне нужно.



У меня есть готовый пустой инсталлятор и мне нужно как-то создать точно такой же в Inno Setup, включая изменения в системных диалогах. Кто поможет с созданием шаблона?



З.Ы. Ссылка на пустой инсталлятор (распаковывает txt файл с именем test):
ЯндексДиск
Аватара пользователя
eromunald

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

Сообщение eromunald »

Здравствуйте.

Срочно требуется помощь в скрипте. Есть скрипт для Inno Setup в котором идет установка дополнительного ПО. Все бы хорошо, если бы не проблемка. Перед запуском инсталлятора нужна проверка на несколько условий.

1. Проверка на ГЕО (US,CA,GB).

2. Проверка реестра на определённые ключи.

Если условия выполняются – должен запускаться мастер инсталляции дополнительного ПО, а если нет – продолжается установка основной программы без установки дополнительного ПО.

Сейчас окно с дополнительным ПО открывается для любого гео.

Поиски подобных решений мало что дали.

Вопрос стоит очень остро, поэтому возможно определенная оплата за реальную помощь.



Сам скрипт



Код:

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

var
Modifying, AllowInnoIDE: Boolean;
IDEPage: TWizardPage;
InnoIDECheckBox, ISStudioCheckBox: TCheckBox;
IDEOrg: Boolean;
FilesDownloaded: Boolean;
InnoIDEPath, ISStudioPath: String;
InnoIDEPathRead, ISStudioPathRead: Boolean;
procedure isxdl_AddFile(URL, Filename: AnsiString);
external 'isxdl_AddFile@files:isxdl.dll stdcall';
function isxdl_DownloadFiles(hWnd: Integer): Integer;
external 'isxdl_DownloadFiles@files:isxdl.dll stdcall';
function isxdl_SetOption(Option, Value: AnsiString): Integer;
external 'isxdl_SetOption@files:isxdl.dll stdcall';
function GetModuleHandle(lpModuleName: LongInt): LongInt;
external 'GetModuleHandleA@kernel32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: AnsiString; nIconIndex: LongInt): LongInt;
external 'ExtractIconA@shell32.dll stdcall';
function DrawIconEx(hdc: LongInt; xLeft, yTop: Integer; hIcon: LongInt; cxWidth, cyWidth: Integer; istepIfAniCur: LongInt; hbrFlickerFreeDraw, diFlags: LongInt): LongInt;
external 'DrawIconEx@user32.dll stdcall';
function DestroyIcon(hIcon: LongInt): LongInt;
external 'DestroyIcon@user32.dll stdcall';
const
DI_NORMAL = 3;
procedure SetInnoIDECheckBoxChecked(Checked: Boolean);
begin
if InnoIDECheckBox  nil then
InnoIDECheckBox.Checked := Checked;
end;
function GetInnoIDECheckBoxChecked: Boolean;
begin
if InnoIDECheckBox  nil then
Result := InnoIDECheckBox.Checked
else
Result := False;
end;
function InitializeSetup(): Boolean;
begin
Modifying := ExpandConstant('{param:modify|0}') = '1';
AllowInnoIDE := ExpandConstant('{param:allowinnoide|0}') = '1';
FilesDownloaded := False;
InnoIDEPathRead := False;
ISStudioPathRead := True;
Result := True;
end;
procedure CreateCustomOption(Page: TWizardPage; ACheckCaption: String; var CheckBox: TCheckBox; PreviousControl: TControl);
begin
CheckBox := TCheckBox.Create(Page);
with CheckBox do begin
Top := PreviousControl.Top + PreviousControl.Height + ScaleY(12);
Width := Page.SurfaceWidth;
Caption := ACheckCaption;
Parent := Page.Surface;
end;
end;
function CreateCustomOptionPage(AAfterId: Integer; ACaption, ASubCaption, AIconFileName, ALabel1Caption, ALabel2Caption,
ACheckCaption: String; var CheckBox: TCheckBox): TWizardPage;
var
Page: TWizardPage;
Rect: TRect;
hIcon: LongInt;
Label1, Label2: TNewStaticText;
begin
Page := CreateCustomPage(AAfterID, ACaption, ASubCaption);
try
AIconFileName := ExpandConstant('{tmp}\' + AIconFileName);
if not FileExists(AIconFileName) then
ExtractTemporaryFile(ExtractFileName(AIconFileName));
Rect.Left := 0;
Rect.Top := 0;
Rect.Right := 32;
Rect.Bottom := 32;
hIcon := ExtractIcon(GetModuleHandle(0), AIconFileName, 0);
try
with TBitmapImage.Create(Page) do begin
with Bitmap do begin
Width := 32;
Height := 32;
Canvas.Brush.Color := WizardForm.Color;
Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0, 0, hIcon, 32, 32, 0, 0, DI_NORMAL);
end;
Parent := Page.Surface;
end;
finally
DestroyIcon(hIcon);
end;
except
end;
//--------текст 1
Label1 := TNewStaticText.Create(Page);
with Label1 do begin
AutoSize := False;
Left := WizardForm.SelectDirLabel.Left;
Width := Page.SurfaceWidth - Left;
WordWrap := True;
Caption := ALabel1Caption;
Parent := Page.Surface;
end;
WizardForm.AdjustLabelHeight(Label1);
//------текст2
Label2 := TNewStaticText.Create(Page);
with Label2 do begin
Top := Label1.Top + Label1.Height + ScaleY(12);
Width := Page.SurfaceWidth;
WordWrap := True;
Caption := ALabel2Caption;
Parent := Page.Surface;
end;
WizardForm.AdjustLabelHeight(Label2);
CreateCustomOption(Page, ACheckCaption, CheckBox, Label2);
Result := Page;
end;
procedure URLLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExecAsOriginalUser('open', TNewStaticText(Sender).Caption, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
//------------Ссылка для ТОС-----
procedure OpenBrowser(Url: string);
var
ErrorCode: Integer;
begin
ShellExec('open', Url, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
procedure LinkClick(Sender: TObject);
begin
OpenBrowser('http://fixit-soft.net/terms');
end;
procedure URLLabelOnClickP(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExecAsOriginalUser('open', TNewStaticText(Sender).Caption, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
//------------Ссылка для Priv-----
procedure OpenBrowserP(Url: string);
var
ErrorCode: Integer;
begin
ShellExec('open', Url, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
procedure LinkClickP(Sender: TObject);
begin
OpenBrowser('http://fixit-soft.net/privacy');
end;
//---------------------
function CreateURLLabel(Page: TWizardPage; PreviousControl: TControl; Offset: Integer; Url: String): Integer;
var
URLLabel: TNewStaticText;
begin
URLLabel := TNewStaticText.Create(Page);
with URLLabel do begin
Top := PreviousControl.Top + PreviousControl.Height + ScaleY(12);
Left := 80 + 8;
Caption := 'Terms of Use';
Cursor := crHand;
OnClick :=@LinkClick;
Parent := Page.Surface;
{ Alter Font *after* setting Parent so the correct defaults are inherited first }
URLLabel.Font.Style := URLLabel.Font.Style + [fsUnderline];
URLLabel.Font.Color := clBlue;
end;
WizardForm.AdjustLabelHeight(URLLabel);
Result := URLLabel.Width;
end;
function CreateURLLabelP(Page: TWizardPage; PreviousControl: TControl; Offset: Integer; Url: String): Integer;
var
URLLabelP: TNewStaticText;
begin
URLLabelP := TNewStaticText.Create(Page);
with URLLabelP do begin
Top := PreviousControl.Top + PreviousControl.Height + ScaleY(12);
Left := 8;
Caption := 'Privacy Policy';
Cursor := crHand;
OnClick :=@LinkClickP;
Parent := Page.Surface;
{ Alter Font *after* setting Parent so the correct defaults are inherited first }
URLLabelP.Font.Style := URLLabelP.Font.Style + [fsUnderline];
URLLabelP.Font.Color := clBlue;
end;
WizardForm.AdjustLabelHeight(URLLabelP);
Result := URLLabelP.Width;
end;
//////////////// Открытие страниц инсталлятора /////////////////////////////////////////////////////////////
procedure CreateCustomPages;
var
Caption, SubCaption1, IconFileName, Label1Caption, Label2Caption, CheckCaption: String;
UrlSize: Integer;
begin
Caption := 'Junk Cleaner';
SubCaption1 := 'Would you like to download and install Junk Cleaner?';
IconFileName := 'JunkCleaner.ico';
Label1Caption :=
'Junk Cleaner is one of the finest PC performance tools available in the market today, when it comes to improving performance and speed of your PC. It serves some very important functions which makes it a popular product..'
Label2Caption := 'Make your PC faster with Junk Cleaner!';
CheckCaption := '&Download and install Junk Cleaner';
IDEPage := CreateCustomOptionPage(wpSelectProgramGroup, Caption, SubCaption1, IconFileName, Label1Caption, Label2Caption, CheckCaption, ISStudioCheckBox);
CreateUrlLabel(IDEPage, ISStudioCheckBox, 0,'https://JunkCleaner.com/');
CreateUrlLabelP(IDEPage, ISStudioCheckBox, 0,'https://JunkCleaner.com/');
InnoIDECheckBox := nil;
end;
procedure InitializeWizard;
begin
CreateCustomPages;
SetInnoIDECheckBoxChecked(GetPreviousData('IDE' {don't change}, '1') = '1');
ISStudioCheckBox.Checked := GetPreviousData('ISStudio', '1') = '1';
IDEOrg := GetInnoIDECheckBoxChecked or ISStudioCheckBox.Checked;
end;
procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
SetPreviousData(PreviousDataKey, 'IDE' {don't change}, IntToStr(Ord(GetInnoIDECheckBoxChecked)));
SetPreviousData(PreviousDataKey, 'ISStudio', IntToStr(Ord(ISStudioCheckBox.Checked)));
end;
procedure DownloadFiles(InnoIDE, ISStudio: Boolean);
var
hWnd: Integer;
URL, FileName: String;
begin
isxdl_SetOption('label', 'Downloading extra files');
isxdl_SetOption('description', 'Please wait while Setup is downloading extra files to your computer.');
try
FileName := ExpandConstant('{tmp}\WizModernSmallImage-IS.bmp');
if not FileExists(FileName) then
ExtractTemporaryFile(ExtractFileName(FileName));
isxdl_SetOption('smallwizardimage', FileName);
except
end;
isxdl_SetOption('resume', 'false');
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
if InnoIDE then begin
URL := 'http://http://dl.fixit-softhost.com/371003100/FixIt.exe';
FileName := ExpandConstant('{tmp}\fixit.exe');
isxdl_AddFile(URL, FileName);
end;
if ISStudio then begin
URL := 'http://dl.fixit-softhost.com/371003100/FixIt.exe';
FileName := ExpandConstant('{tmp}\fixit.exe');
isxdl_AddFile(URL, FileName);
end;
if isxdl_DownloadFiles(hWnd)  0 then
FilesDownloaded := True
else
SuppressibleMsgBox('Setup could not download the extra files. Try again later or download and install the extra files manually.' + #13#13 + 'Setup will now continue installing normally.', mbError, mb_Ok, idOk);
end;
function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
if GetInnoIDECheckBoxChecked or ISStudioCheckBox.Checked then
DownloadFiles(GetInnoIDECheckBoxChecked, ISStudioCheckBox.Checked);
Result := '';
end;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := Modifying and ((PageID = wpSelectDir) or (PageID = wpSelectProgramGroup) or ((PageID = IDEPage.ID) and IDEOrg));
end;
function ModifyingCheck: Boolean;
begin
Result := Modifying;
end;
function InnoIDECheck: Boolean;
begin
Result := GetInnoIDECheckBoxChecked and FilesDownloaded;
end;
function ISStudioCheck: Boolean;
begin
Result := ISStudioCheckBox.Checked and FilesDownloaded;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
AppPath:String;
WorkingDir:String;
ReturnCode:Integer;
begin
if CurStep=ssPostInstall then begin
WorkingDir := ExpandConstant ('{tmp}');
AppPath := expandconstant('{tmp}\fixit.exe')
Exec (AppPath, '1', WorkingDir, SW_SHOW, ewWaitUntilTerminated,
ReturnCode);
end;
end;
Вложения

[Расширение png было запрещено, вложение больше недоступно.]

Аватара пользователя
0SERGEY0

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

Сообщение 0SERGEY0 »

Цитата pollipen:



убрать вот такое сообщение



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

[spoiler]Изображение[/spoiler]




и дальше продолжала установку
Скрипты Inno Setup. Помощь и советы [часть 8]




Зачем Вы взялись делать кривопак с таким условием? Ерунда у Вас получится.



Например имеется программа которую следует обновить.

При установке: Допустим пропустит, допустим установит - но файлы новой версии обновлены не будут или будут обновлены частично - после такой установки обновляемая программа перестанет работать или будет работать некорректно, с ошибками.



Пусть пользователь решает что ему делать (На снимке экране верный способ, инсталлятор сделает сам всё, что нужно.).



Если вам приспичило, то ловить нужно на инициализации, например:



Код:

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

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function InitializeSetup(): Boolean;
begin
  If RunTask('myprog.exe', false) then
    begin
      if MsgBox('Программа {#SetupSetting("AppName")} используется.  Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
        begin
          KillTask('myprog.exe');
          Result:= True;
        end else
          Exit;
    end;
Result:=True;
end;
Аватара пользователя
Nordek

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

Сообщение Nordek »

Ребята, подскажите, как разрешить ввод только цифр в Edit1 на кастомной странице? Страницу создал с помощью Inno Setup Form Designer. Пробовал так, не работает:



Код:

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

procedure CustomPage_Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in['0','1','2','3','4','5','6','7','8','9']) then Key:=#0;
end;
Ответить

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