Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Raz3r,
#include "Modules\botva2.iss"
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
[CustomMessages]
rus.Desktop=Soft номер 1
rus.Desktop1=Soft номер 2
[Files]
Source: "InstallFiles\*"; Flags: dontcopy;
[Icons]
Name: "{commondesktop}\Soft номер 1"; Filename: "{app}\MyProg.exe"; Check: Dop;
Name: "{commondesktop}\Soft номер 2"; Filename: "{app}\MyProg.exe"; Check: Dop1;
[code]
var
DopCheck,DopCheck1: HWND;
DopLabel, DopLabel1: TLabel;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function Dop: Boolean;
begin
Result:= BtnGetChecked(DopCheck);
end;
procedure DopClick(hBtn:HWND);
begin
if BtnGetChecked(hBtn) then DopLabel.Font.Color:=$0000FF else DopLabel.Font.Color:=$000000;
end;
procedure DopLabelClick(Sender:TObject);
begin
BtnSetChecked(DopCheck, not BtnGetChecked(DopCheck));
DopClick(DopCheck);
end;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function Dop1: Boolean;
begin
Result:= BtnGetChecked(DopCheck1);
end;
procedure DopClick1(hBtn:HWND);
begin
if BtnGetChecked(hBtn) then DopLabel1.Font.Color:=$0000FF else DopLabel1.Font.Color:=$000000;
end;
procedure DopLabelClick1(Sender:TObject);
begin
BtnSetChecked(DopCheck1, not BtnGetChecked(DopCheck1));
DopClick1(DopCheck1);
end;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function InitializeSetup: Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
Result:=True;
end;
procedure InitializeWizard;
begin
DopCheck:=BtnCreate(WizardForm.SelectDirPage.Handle,ScaleX(10),ScaleY(120),ScaleX(23),ScaleY(23),Exp andConstant('{tmp}\CheckBox.png'),8,True);
BtnSetEvent(DopCheck,BtnClickEventID,WrapBtnCallback(@DopClick,1));
BtnSetCursor(DopCheck,GetSysCursorHandle(32649));
BtnSetChecked(DopCheck,True);
DopLabel := TLabel.Create(WizardForm);
with DopLabel do begin
AutoSize:=False;
SetBounds(ScaleX(35), ScaleY(124), ScaleX(270), ScaleY(17));
OnClick:= @DopLabelClick;
Cursor:= CrHand;
Transparent:=True;
Caption := ExpandConstant('{cm:Desktop}');
Parent := WizardForm.SelectDirPage;
Font.Color:=$0000FF;
end;
DopCheck1:=BtnCreate(WizardForm.SelectDirPage.Handle,ScaleX(10),ScaleY(150),ScaleX(23),ScaleY(23),Ex pandConstant('{tmp}\CheckBox.png'),8,True);
BtnSetEvent(DopCheck1,BtnClickEventID,WrapBtnCallback(@DopClick,1));
BtnSetCursor(DopCheck1,GetSysCursorHandle(32649));
BtnSetChecked(DopCheck1,True);
DopLabel1 := TLabel.Create(WizardForm);
with DopLabel1 do begin
AutoSize:=False;
SetBounds(ScaleX(35), ScaleY(154), ScaleX(270), ScaleY(17));
OnClick:= @DopLabelClick1;
Cursor:= CrHand;
Transparent:=True;
Caption := ExpandConstant('{cm:Desktop1}');
Parent := WizardForm.SelectDirPage;
Font.Color:=$0000FF;
end;
end;
procedure DeinitializeSetup;
begin
gdipShutdown;
end;
Kashtan007
08-08-2014, 14:12
Всем привет, посоветуйте несколько способов, как правильно использовать скин в установщике (.cjstyles) на юникоде.
Заранее спасибо за ответ.
if not IS7ZipExtract ( 0, 0, ExpandConstant('{src}\Data-A.bin'), ExpandConstant('{app}'), false, '') then break; »
Вставила эту строчку, не получается, именно на этой строчке ошибка. Может где то что подправить нужно? Или может у меня каких dll не хватает? В общем тут http://my-files.ru/2c6x1r пример скрипта игры и все остальное, может подскажите.
Irenis,
http://rghost.ru/57360119
Kashtan007
http://rghost.ru/57361849
habib2302
08-08-2014, 19:19
И можно сделать так чтобы после нажатия кнопки запускались два деинсталлятора. 1 это деинсталлятор который был создан моим инсталлятором и 2 это деинсталлятор от flash player т.к через реестр не очень
procedure RedesignWizardForm;
begin
with WizardForm.ComponentsList do
begin
Height := ScaleY(141);
end;
end;
var
ISCustomPage1: TWizardPage;
NewButton1: TNewButton;
ResultCode: Integer;
lpBuff: String;
procedure NewButton1Click(Sender: TObject);
begin
shellexec('open', ExpandConstant('{tmp}\un.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;
function InitializeSetup(): Boolean;
var ResultCode:integer;
begin
ExtractTemporaryFile('un.exe');
if WizardSilent then
if FileExists (ExpandConstant('{tmp}\un.exe')) then //имхо, если при установке вы что-то пишете в реестр, то перед удалением неплохо было бы еще проверять наличие в реестре данных об уже установленной версии
Exec(ExpandConstant('{tmp}\un.exe'), '/uninstall /force', '', SW_SHOW,ewWaitUntilTerminated, ResultCode);
result:=true;
end;
procedure InitializeWizard;
begin
RedesignWizardForm;
NewButton1 := TNewButton.Create(WizardForm);
with NewButton1 do
begin
Parent := WizardForm.SelectComponentsPage;
Left := ScaleX(0);
Top := ScaleY(200);
Width := ScaleX(417);
Height := ScaleY(33);
Caption := CustomMessage('NewButton1');
OnClick := @NewButton1Click;
end;
end;
vint56, Спасибо за скрипт. Вроде бы разобралась, пока единственный вопрос остался. Во время распаковки ниже процесс бара две надписи: прошло времени и осталось времени. И вот с надписью осталось времени что то не то, вместо минут там вот так "осталось времени: тестовый прогон". И в конце установки тоже надпись "время установки: тестовый прогон". Можно ли это как то исправить?
"время установки: тестовый прогон". Можно ли это как то исправить? »Всё верно. Вы когда только создаёте инсталлятор со всеми вытикающими, то первоночально тестовый прогрон необходим для более точного отображения процентов и времени при установке.
Т.е у вас например всё готово к завершению.
Имеются архивы bin.arc1, bin.arc2, bin.arc3 и т.д.
Делаете первую установку для того, чтоб рядом создался файл records.inf - где будут прописаны значения для архивов "bin.arc1, bin.arc2, bin.arc3 и т.д.".
после того как файл records.inf создался, то для окончательной компиляции раскомментируйте в скрипте #define records.
Если захотите пережать или добавить какое либо содержимое в свои архивы bin.arc1, bin.arc2, bin.arc3 и т.д., то понадобиться опять закомментировать #define records. Сделать тестовый прогон и раскомментировать.
[hr]
осталось времени: тестовый прогон »А в справке к ISDone разве нет?
Я даже процитирую (а то не поверите, скажите там такого нет или не нашли):
ISDone » Описание скрипта:
#define records
определяет будет ли включен в компиляцию файл records.inf. Он служит для автоматического определения процентных соотношений между операциями. Создается в первом прогоне установки, далее включается в установщик раскомментированием выше указанной строки. Более подробную информацию об этом файле и тестовом прогоне см. раздел "Работа с библиотекой";
ISDone » Работа с библиотекой:
Для осуществения работоспособности библиотеки существует 2 вида определения процентных соотношений между операциями на всем прогрессбаре:
Автоматическая расстановка процентных соотношений в операциях.
При автоматической расстановке необходим тестовый проход для определения времени выполнения каждой операции относительно других.
Для включения данного режима необходимо заполнить вторые значения всех функций извлечения архивов нулями.
Краткая инструкция:
первым делом убедитесь, что в начале скрипта закомментирована строка
#define records
(т.е. необходимо поставить точку с запятой в начале этой строки);
компилим проект и запускаем на установку. Это и будет нашим тестовым проходом. Все операции должны дойти до конца и завершиться удачно. Прогрессбар будет зашкаливать и все компоненты будут извлечены вне зависимости от того выбраны они, или нет. Все так и должно быть!
после тестового прогона в указанной папке создастся файл records.inf (имя и путь назначается в процедуре инициализации. О ней см. "подробное описание функций" ниже), его необходимо добавить в проект, раскомметировав, или добавив в начале скрипта строку:
#define records
Так же стоит отметить, что если сам скрипт находится в папке отличной от той, в которую компилится проект (например в скрипте NFS:Undercover откомпиленный файл сохраняется в Output\setup.exe), то records.inf создастся в папке с setup.exe и его необходимо будет перенести непосредственно к скрипту, или же подправить в секции [Files] его истинное расположение, например:
#ifdef records
Source: Output\records.inf; DestDir: {tmp}; Flags: dontcopy
#endif
снова откомпилить проект.
После этого инсталлер готов к работе.
При запуске процесс выполнения операций будет равномерно и корректно отображаться на прогрессбаре.
Ручная расстановка процентов на каждую операцию.
При ручной расстановке если в проекте множество операций, все расчеты необходимо производить вручную. Т.е. сумма процентов всех выполненных операций должна равняться 100%, иначе корректного отображения на прогрессбаре не будет.
Для включения данного режима необходимо заполнить вторые значения всех функций извлечения архивов значениями процентов, отличными от 0 (числа могут быть дробными).
При групповой распаковке архивов по маске (типа *.pcf) для операции задается общий процент на все распаковываемые файлы данной командой, а уж каждый из найденных файлов будет разбивать указанный кусок прогрессбара еще на части пропорциональные размерам файлов. Например строка:
if not ISArcExtract (0, 100, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), false, '', '', '') then break;
...
распакует все *.arc архивы из {src} в {app}, при чем весь прогрессбар будет поделен на кусочки пропрорциональные размерам архивов. В общем тут все так же как в скрипте распаковки FreeArc.iss и ему подобным. Таким образом при распаковке нескольких архивов одного типа проще пользоваться ручной расстановкой, т.к. отличие расперделения процентов от автоматической будет совсем небольшим, но за то не требуется тестовый проход.
Вот некоторые правила, которые неоходимо выполнять при ручной расстановке:
сумма процентов учитывая ветвления (использование компонентов, условий) в скрипте должна составлять 100;
у компонентов, для которых возможен выбор только одного из нескольких, должны быть одинаковые значения процентов;
НЕЛЬЗЯ использовать компоненты, которые можно выбирать одновременно с другими в одной группе (например несколько рядом стоящих компонент без флага exclusive), потому что сумма процентов при различном выборе пользователя может отличаться от 100.
Примечание
Стоит упомянуть функцию ISExec, в которой третьим параметром задается время выполнения текущей операции. При автоматической расстановке время на операцию расчитывается приближенное к реальному (при условии, что данная операция не первая, иначе время выполнения берется равное тому, которое было в тестовом проходе). При ручной же расстановке: если машина пользователя быстрее обработает данную операцию, чем расчитано автором инсталла, то прогресс будет немного скачкообразным в моменты переходов между функциями распаковки; если машина пользователя медленнее - прогресс наоборот будет задерживаться между операциями.
Irenis, я же в скрипте сделал комментарий справка в архиве называется readme.CHM
; описаний в справке там все описано
;#define records
Nordek, Ясно, спасибо большое. А чтобы не делать эти тестовые прогоны, можно ли в скрипте просто удалить какие то строчки, чтобы надпись "осталось времени" вообще убрать? Ну и в конце чтобы убрать "время установки"?
vint56, Ну да, теперь поняла)) Но все таки хотелось бы как то убрать эти строчки.
vint56, Nordek, Спасибо огромное за участие, спасибо за помощь :) Конечно, в первую очередь нужно читать инструкции, а потом уже спрашивать, что не понятно. Но когда не знаешь, где в инструкции находится именно то, что тебе нужно, чаще всего до инструкций не доходит дело, а с маленьким ребенком еще сложнее найти время на инструкции :blush: Поэтому уж не судите строго, если потом как нибудь еще обращусь за помощью :)
Dinvin4ester
09-08-2014, 21:04
Как решить эту проблемку - http://i68.fastpic.ru/big/2014/0802/c3/b8d1c06c9955792d5ab7703b6aa26fc3.png ?
http://rghost.ru/57234254?r=3678 - сам скрипт
вот где три кнопки,нужно чтоб из трёх выбор один был,а так выходит два.
Название скрипта - выбор озвучки по центру.iss
Как решить эту проблемку »
выбор озвучки по центру.iss (http://rghost.ru/57399004)
Dinvin4ester
10-08-2014, 23:03
nik1967,
Огромное спасибо вам.
Здравствуйте, нашел код прогресс бара для isdone:
Модуль ProgressBar.iss
type
TImgPB = record h: HWND; Left, Top, Width, Height, MaxWidth: Integer; img1, img2: Longint; end;
function ImgPBCreate(hParent: HWND; bk, pb: AnsiString; Left, Top, Width, Height: Integer): TImgPB;
begin
Result.Left:=Left;
Result.Top:=Top;
Result.Width:=0;
Result.Height:=Height;
Result.MaxWidth:=Width;
Result.h:= hParent;
if Length(pb)>0 then Result.img1:=ImgLoad(hParent, pb, Result.Left, Result.Top, 0, Result.Height, True,True) else Result.img1:= 0;
if Length(bk)>0 then Result.img2:=ImgLoad(hParent, bk, Left, Top, Width, Height, True, True) else Result.img2:=0;
ImgApplyChanges(Result.h);
end;
procedure ImgPBSetPosition(PB: TImgPB; Percent: Extended);
var
NewWidth: Integer;
begin
if PB.img1<>0 then begin
NewWidth:=Round(PB.MaxWidth*Percent/1000);
if PB.Width<>NewWidth then begin
PB.Width:=NewWidth;
ImgSetPosition(PB.img1,PB.Left,PB.Top,PB.Width,PB.Height);
ImgSetVisiblePart(PB.img1, ScaleX(0), ScaleY(0), ScaleX(PB.Width), ScaleY(PB.Height));
ImgApplyChanges(PB.h);
end;
end;
end;
procedure ImgPBDelete(PB: TImgPB);
begin
if PB.img1<>0 then ImgRelease(PB.img1);
if PB.img2<>0 then ImgRelease(PB.img2);
PB.img1:=0;
PB.img2:=0;
ImgApplyChanges(PB.h);
end;
procedure ImgPBVisibility(var PB :TImgPB; Visible :boolean);
begin
ImgSetVisibility(PB.img1,Visible);
ImgSetVisibility(PB.img2,Visible);
end;
Модуль ISDone:
[Files]
Source: Include\English.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\Russian.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef PrecompInside
Source: Include\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef SrepInside
Source: Include\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef MSCInside
Source: Include\CLS-MSC.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef facompress
Source: Include\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp
#if precomp == "0.38"
Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.4"
Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.41"
Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
#else
#if precomp == "0.42"
Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#else
Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
#endif
#endif
#endif
#endif
#endif
#ifdef unrar
Source: Include\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef XDelta
Source: Include\XDelta3.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef PackZIP
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packZIP.exe; DestDir: {tmp}; Flags: dontcopy
#endif
[code]
type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
const
PCFonFLY=true;
notPCFonFLY=false;
var
LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
ISDoneProgressBar1: TImgPB;
ISDoneCancel:integer;
ISDoneError:boolean;
PCFVer:double;
function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';
function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';
function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
if OveralPct<=1000 then ImgPBSetPosition(ISDoneProgressBar1,OveralPct);
LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
Result := ISDoneCancel;
ImgApplyChanges(WizardForm.Handle);
end;
procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
ResumeProc;
end;
procedure IsDoneAddComponents();
var PBTop:integer;
begin
PBTop:=ScaleY(50);
ISDoneProgressBar1:=ImgPBCreate(WizardForm.Handle, ExpandConstant('{tmp}\pbbkg.png'), ExpandConstant('{tmp}\pb.png'),7,430,646, 4);
LabelPct1 := TLabel.Create(WizardForm);
with LabelPct1 do begin
Parent := WizardForm;
Font.Name := 'Arial';
Font.Size := 10;
Font.Style := [fsBold];
Transparent := true;
Font.Color := $e1cc70;
AutoSize := False;
Left := ScaleX(540);
Top := ScaleY(255);
Width := ScaleX(180);
end;
LabelCurrFileName := TLabel.Create(WizardForm);
with LabelCurrFileName do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width+ScaleX(30);
Left := ScaleX(0);
Top := ScaleY(30);
end;
LabelTime1 := TLabel.Create(WizardForm);
with LabelTime1 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := ISDoneProgressBar1.Width div 2;
Left := ScaleX(0);
Top := PBTop + ScaleY(35);
end;
LabelTime2 := TLabel.Create(WizardForm);
with LabelTime2 do begin
Parent := WizardForm.InstallingPage;
AutoSize := False;
Width := LabelTime1.Width+ScaleX(40);
Left := ISDoneProgressBar1.Width div 2;
Top := LabelTime1.Top;
end;
LabelTime3 := TLabel.Create(WizardForm);
with LabelTime3 do begin
Parent := WizardForm.FinishedPage;
AutoSize := False;
Width := 300;
Left := 180;
Top := 200;
end;
end;
procedure IsDoneHide();
begin
LabelPct1.Hide;
LabelCurrFileName.Hide;
LabelTime1.Hide;
LabelTime2.Hide;
LabelTime3.Hide;
ImgPBVisibility(ISDoneProgressBar1, False);
end;
procedure IsDoneShow();
begin
LabelPct1.Show;
LabelCurrFileName.Show;
LabelTime1.Show;
LabelTime2.Show;
ImgPBVisibility(ISDoneProgressBar1, true);
end;
procedure IsDoneUnpack(CurStep: TSetupStep);
var
Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
if CurStep = ssInstall then begin //Если необходимо, можно поменять на ssPostInstall
WizardForm.ProgressGauge.Hide;
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
WizardForm.CancelButton.OnClick := @CancelButtonOnClick;
ISDoneCancel:=0;
// Распаковка всех необходимых файлов в папку {tmp}.
ExtractTemporaryFile('unarc.dll');
#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef MSCInside
ExtractTemporaryFile('CLS-MSC.dll');
#endif
#ifdef facompress
ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
#endif
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
#if precomp == "0.38"
ExtractTemporaryFile('precomp038.exe');
#else
#if precomp == "0.4"
ExtractTemporaryFile('precomp040.exe');
#else
#if precomp == "0.41"
ExtractTemporaryFile('precomp041.exe');
#else
#if precomp == "0.42"
ExtractTemporaryFile('precomp042.exe');
#else
ExtractTemporaryFile('precomp038.exe');
ExtractTemporaryFile('precomp040.exe');
ExtractTemporaryFile('precomp041.exe');
ExtractTemporaryFile('precomp042.exe');
#endif
#endif
#endif
#endif
#endif
#ifdef unrar
ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
ExtractTemporaryFile('7z.dll');
ExtractTemporaryFile('PackZIP.exe');
#endif
ExtractTemporaryFile('English.ini');
ExtractTemporaryFile('Russian.ini');
// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
TmpValue:=1;
if BtnGetChecked(LanguagetextButton[1]) then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if BtnGetChecked(LanguagetextButton[2]) then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if BtnGetChecked(LanguagevoiceButton[1]) then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if BtnGetChecked(LanguagevoiceButton[2]) then Comps1:=Comps1+TmpValue; //компонент 4
#endif
#ifdef precomp
PCFVer:={#precomp};
#else
PCFVer:=0;
#endif
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat
case ActiveLanguage of
'eng': ChangeLanguage('English');
'rus': ChangeLanguage('Russian');
end;
if not SrepInit('',512,0) then break;
if not PrecompInit('',128,PCFVer) then break;
if not FileSearchInit(true) then break;
#ifdef Data1
if not ISArcExtract ( 0, 20, ExpandConstant('{src}\{#Data1}'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
#endif
#ifdef Data2
if not ISArcExtract ( 0, 20, ExpandConstant('{src}\{#Data2}'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
#endif
#ifdef Data3
if not ISArcExtract ( 0, 20, ExpandConstant('{src}\{#Data3}'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
#endif
#ifdef Data4
if not ISArcExtract ( 0, 20, ExpandConstant('{src}\{#Data4}'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
#endif
#ifdef Data5
if not ISArcExtract ( 0, 20, ExpandConstant('{src}\{#Data5}'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
#endif
// далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
(*
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not IS7ZipExtract ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
if not ISRarExtract ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'), ExpandConstant('{app}\data.7z'), true) then break;
if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'), ExpandConstant('{app}\out.dat'), false, false) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
if not ISExec ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;
// распаковка группы файлов посредством внешнего приложения
FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
ExecError:=false;
while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
InFilePath:=ISGetName(0);
OutFilePath:=ISGetName(1);
OutFileName:=ISGetName(2);
ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
end;
ISFindFree(FindHandle1);
if ExecError then break;
*)
ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
IsDoneHide;
BtnSetEnabled(hCancelBtn, False);
ImgApplyChanges(WizardForm.Handle);
ImgApplyChanges(WizardForm.Handle);
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;
Тестовый прогон сделал, проценты загрузки идут как положено, однако не отображается полоса загрузки прогресс-бара. Прогресс-бар отображается, но нету загрузки? В чем может быть проблема?
AlekseyPopovv
11-08-2014, 09:49
Ребята помогите решить проблему: скрипт собирается, но файл не запускается пишет ошибку. Ошибка возникает из-за if Installer.Checked then и if Portable.Checked then. Как решить эту проблему?
procedure LangClick(Sender: TObject);
begin
case TNewRadioButton(Sender) of
LangBus:
begin
if Installer.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + '{#MyAppName} Business';
begin
if Portable.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Business Portable';
end;
end;
LangEng:
begin
if Installer.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + '{#MyAppName} Engineer';
begin
if Portable.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Engineer Portable';
end;
end;
LangExt:
begin
if Installer.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + '{#MyAppName} Extreme';
begin
if Portable.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Extreme Portable';
end;
end;
LangNet:
begin
if Installer.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{pf32}')) + '{#MyAppName} Network Audit';
begin
if Portable.Checked then
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Network Audit Portable';
end;
end;
end;
end;
Решение нашёл!
odminius
11-08-2014, 18:18
Всем доброго времени суток. Есть задача, сделать прогу, которая будет ставить очень маленький и легкий софт. В программировании не шарю, поэтому решил воспользоваться программой InnoSetup.
Прошел по мастеру, в общем установщик все делает как надо, за 1 исключением. Не добавляется ярлык в автозагрузку на Win 8\Win 8.1. (на "Семерке все работат как надо").
Вот скрипт, который у меня получился:
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Электронная очередь"
#define MyAppVersion "1.1"
#define MyAppPublisher "HCB"
#define MyAppURL "mberezhnoy@homecredit.kz"
#define MyAppExeName "eqop.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{D0187399-732B-4F91-B94C-096F37A6F324}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=C:\eqop\
DisableDirPage=yes
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputDir=C:\Users\Odmin\Desktop\Новая папка
OutputBaseFilename=setup_eqop
Compression=lzma
SolidCompression=yes
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "C:\Users\Odmin\Desktop\Новая папка\eqop\eqop.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Odmin\Desktop\Новая папка\eqop\*"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
Name: "{commonstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Помогите плиз сделать так, чтобы ярлык программы добавлялся в автозагрузку на любой версии ОС.
odminius, попробуй так:
[Icons]
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
{userstartup} - Путь к папке Автозагрузка меню Пуск
odminius
11-08-2014, 20:22
Imperor, спасибо. Жаль потестить сразу не получается, в наличии только win7... Так что помогло или нет, расскажу завтра.
odminius, между 7 и 8 особых различий нету и константы подходят и туда, и туда.
odminius
11-08-2014, 20:39
Imperor, и тем не менее, предыдущий скрипт, который я описал, на 7 работает, а на 8 нет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC