Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [35] 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

El Sanchez
26-01-2012, 12:38
Дату файла из пакета я собираюсь узнать так: в качестве DestDir будет указана %TEMP%, уже от туда с использованием того же вызова winAPI будет извлечена дата, а затем из темпа файл отправится либо в {app} либо в /dev/null)) в соответствии с его актуальностью »
sancheolz, тогда в лог деинсталлятора запишутся "темповые" файлы и при удалении программы деинсталлятор будет выковыривать их из %TEMP%, а не из {app}, в результате останется программная папка с файлами. В таком случае необходимо в скрипт добавить:

[UninstallDelete]
Type: filesandordirs; Name: {app}


Остается уповать на сохранность атрибута даты при всех распаковках\запаковках. Он ведь сохраняется? »
Да, если не использовать флаг touch.

LinkOFF
26-01-2012, 16:58
Добрый день.Не подскажите что нужно сделать в скрипте ISDone чтоб были распакованы указанные файлы из архива FreeArc(Не все, а только один или несколько).Заранее спасибо.

Gnom_aka_Lexander
26-01-2012, 17:43
LinkOFF, Прочитать справку к IsDone. Внимательно!

Johny777
26-01-2012, 17:52
мне никто не поможет немного отредактировть http://forum.oszone.net/post-1843626-672.html ???
Appid=ob
пробовал вписывать свой ключ
if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) then
или
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) then
менял shift.exe на run_hl2.exe
добавлял path + '\half life 2' и Exec(path + '\half life 2\run_hl2.exe'

ничего не видит

мне хотя бы один пример для одной конпи с поиском через реестр, последующим поиском файла и как результат - запуском приложения

El Sanchez
26-01-2012, 19:11
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) »
Johny777, Inno не создает ключ Install Dir, поэтому ничего и не нашлось. Нужно искать InstallLocation. Допустим, что функция RegQueryStringValue вернет в AppPath значение C:\Program Files\Half Life 2 Orange Box\, тогда код может быть таким:

[Setup]
AppID=ob

[code]
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
Exec(AppPath + '\half life 2\run_hl2.exe', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);

Johny777
27-01-2012, 00:08
El Sanchez,
спасибо конечно , но к сожалению кнопка серая
сделал так (хотя скорее всего ошибся где-то)

[Setup]
AppID=ob
AppName=AutoRUN
VersionInfoDescription=AutoRUN
VersionInfoProductName=AutoRUN
AppVerName=AutoRUN
VersionInfoProductVersion=1.0.0.0
VersionInfoVersion=1.0.0.0
VersionInfoCompany=john
VersionInfoCopyright=Copyright © John
CreateAppDir=no
OutputDir=.
OutputBaseFilename=Autorun



procedure PlayButtonClick(Sender: TObject);
var
exe: string;
begin

exe:='run_hl2.exe';
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
begin
Exec(AppPath + '\half life 2\run_hl2.exe', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
AutoRun.Close;
PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end
end;



по сути кнопка "играть" появляется вместо кнопки "установить"
я её на 100 пикселей влево сдвинул

вот целиком
http://rghost.ru/36146504

El Sanchez
27-01-2012, 16:59
но к сожалению кнопка серая »
Johny777, а я кнопку и не делал, я лишь указал на ошибку поиска исполняемого файла через реестр.
вот целиком
http://rghost.ru/36146504 »
Johny777, аж 71 байт. Пустой, короче :).
В общем, переделал ваш вариант: http://rghost.ru/36156009

leshcat
27-01-2012, 19:47
Подскажите,

Вводится кнопка about:

CancelButton := WizardForm.CancelButton;

AboutButton := TButton.Create(WizardForm);
AboutButton.Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width;
AboutButton.Top := CancelButton.Top;
AboutButton.Width := CancelButton.Width;
AboutButton.Height := CancelButton.Height;
AboutButton.Caption := '&About...';
AboutButton.OnClick := @AboutButtonOnClick;
AboutButton.Parent := WizardForm;

Как сделать так, чтобы она отображалась только на Welcome page?

nik1967
27-01-2012, 20:27
Как сделать так, чтобы она отображалась только на Welcome page? »
Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = 1 then
AboutButton.Show
else
AboutButton.Hide;
end;

Johny777
27-01-2012, 23:08
El Sanchez,
спасибо, что помогаете
заработало

объединить кнопку "установить" и "играть" задумка хорошая,
скажите пожалуйста!
А можно сделать, что бы запускался не run_hl2.exe, а hl2.exe с параметрами
Run_hl2.exe это бывший батник с параметрами, кторый можно использовать, но лучше (если это возможно) сделать как у меня в секции RUN (например Parameters: -steam -game hl2 -appid 220)
по сути будет проверяться наличие одного и того же hl2.exe, но в различных директориях
уже перечитал всю ветку Inno Setup "помощь и советы часть 2", но настолько не продвинулся , что б всё самостоятельно реализовать

(спасибо за картинку :), но Orange Box это внутреннее название. У меня сортировка по версии движков идёт. В реале "Source Engine 15" sp (без тим фортресс))
выкладываю скрипт целиком со всем прилагающимся, если нужно
http://rghost.ru/36163770
http://rghost.ru/36164295
http://rghost.ru/36164749
http://rghost.ru/36165097
http://rghost.ru/36165223
оставил только экзешники и батники - для проверки запуска хватит, но игра не запустится, вылетит с ошибкой нехватки библиотеки

SARATOVSKY
28-01-2012, 01:06
Здравствуйте уважаемые репейкеры! Помогите, пожалуйста, решить слейдующую проблему: У меня оснавные файлы распаковываются freearc-ком в окне inno. FreeArc распаковывается перед inno setup-ом (для того, что-бы секция run выполнялась после фриарка), но из-за этого неработает скрипт со слайд шоу в окне инсталляции(слайды не распаковываются, ведь начинает работу первым FreeArc)! Вопрос- как сделать, что-бы слайды распаковывались сразу после запуска инсталлятора? Вот скрипт:


#define TIME_FOR_VIEW 10

[Setup]
AppName=Диверсант
AppVerName=Диверсант
DefaultDirName={pf}\Diversant
DefaultGroupName=Диверсант
OutputBaseFilename=setup
Compression=none
OutputDir=C:\Documents and Settings\Вавиловец\Рабочий стол\Распаковка freearc в окне inno setup

[Files]
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: image_6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak

[CustomMessages]
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось ждать %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour=часов
rus.min=мин
rus.sec=сек

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[UninstallDelete]
Name: {app}; Type: filesandordirs
[??Code]
//***************************************** [ Начало - Распаковка архивов FreeArc ] *********************************************//
const
Archives = '{src}\*.arc'; // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно

PM_REMOVE = 1;
CP_ACP = 0; CP_UTF8 = 65001;
oneMb = 1048576;

type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

TMyMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;

TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
TArc = record Path: string; OrigSize: Integer; Size: Extended; end;

var
ExtractFile: TLabel;
lblExtractFileName: TLabel;
btnCancelUnpacking: TButton;
CancelCode, n, UnPackError, StartInstall: Integer;
Arcs: array of TArc;
msgError: string;
lastMb: Integer;
baseMb: Integer;
totalUncompressedSize: Integer; // total uncompressed size of archive data in mb
LastTimerEvent: DWORD;

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

procedure AppProcessMessage;
var
Msg: TMyMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function Size64(Hi, Lo: Integer): Extended;
Begin
Result:= Lo;
if Lo<0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi:= Hi-1 Downto 0 do
Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
nRet : longint;
begin
SetLength( Result, Length( strSource ) );
nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
nRet : integer;
WideCharBuf: string;
MultiByteBuf: string;
begin
strSource:= strSource + chr(0);
SetLength( WideCharBuf, Length( strSource ) * 2 );
SetLength( MultiByteBuf, Length( strSource ) * 2 );

nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

Result:= MultiByteBuf;
end;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
CancelCode:= -127;
end;

var origsize: Integer;
// The callback function for getting info about FreeArc archive
function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
if string(what)='origsize' then origsize := Mb else
if string(what)='compsize' then else
if string(what)='total_files' then else
Result:= CancelCode;
end;

// Returns decompressed size of files in archive
function ArchiveOrigSize(arcname: string): Integer;
var
callback: longword;
Begin
callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4); //FreeArcInfoCallback has 4 arguments
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
if Result >= 0 then Result:= origsize;
except
Result:= -63; // ArcFail
end;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
FSR: TFindRec;
Begin
Result:= 0;
if FindFirst(ExpandConstant(dir), FSR) then begin
try
repeat
// Skip everything but the folders
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
n:= GetArrayLength(Arcs);
// Expand the folder list
SetArrayLength(Arcs, n +1);
Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
Result:= Result + Arcs[n].Size;
Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
until not FindNext(FSR);
finally
FindClose(FSR);
end;
end;
End;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
if detail {hh:mm:ss format} then
Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
else if Ticks/3600 >= 1000 {more than hour} then
Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
else if Ticks/60 >= 1000 {1..60 minutes} then
Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
else Result:= IntToStr(Ticks/1000) +s {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
percents, Remaining: Integer;
s: String;
begin
if GetTickCount - LastTimerEvent > 1000 then begin
// This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
// ....
// End of code executed by timer
LastTimerEvent := LastTimerEvent+1000;
end;

if string(what)='filename' then begin
// Update FileName label
end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
// Assign to Mb *total* amount of data extracted to the moment from all archives
lastMb := Mb;
Mb := baseMb+Mb;

// Update progress bar
WizardForm.ProgressGauge.Position:= Mb;

// Show how much megabytes/archives were processed up to the moment
percents:= (Mb*1000) div totalUncompressedSize;
s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
if GetArrayLength(Arcs)>1 then
s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
ExtractFile.Caption := s

// Calculate and show current percents
percents:= (Mb*1000) div totalUncompressedSize;
s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
s:= s + '. '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
end;
WizardForm.FileNameLabel.Caption := s
end;
AppProcessMessage;
Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
totalCompressedSize: Extended;
callback: longword;
FreeMB, TotalMB: Cardinal;
begin
// Display 'Extracting FreeArc archive'
lblExtractFileName.Caption:= '';
lblExtractFileName.Show;
ExtractFile.caption:= cm('ArcTitle');
ExtractFile.Show;
// Show the 'Cancel unpacking' button and set it as default button
btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
btnCancelUnpacking.Show;
WizardForm.ActiveControl:= btnCancelUnpacking;
WizardForm.ProgressGauge.Position:= 0;
// Get the size of all archives
totalUncompressedSize := 0;
totalCompressedSize := FindArcs(Archives);
WizardForm.ProgressGauge.Max:= totalUncompressedSize;
// Other initializations
callback:= WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
StartInstall:= GetTickCount; {время начала распаковки}
LastTimerEvent:= GetTickCount;
baseMb:= 0

for n:= 0 to GetArrayLength(Arcs) -1 do
begin
lastMb := 0
CancelCode:= 0;
AppProcessMessage;
try
// Pass the specified arguments to 'unarc.dll'
Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
if CancelCode < 0 then Result:= CancelCode;
except
Result:= -63; // ArcFail
end;
baseMb:= baseMb+lastMb

// Error occured
if Result <> 0 then
begin
msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
case Result of
-1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
-127: msgError:= cm('ArcBreak'); //Cancel button
-63: msgError:= cm('ArcFail');
end;
// MsgBox(msgError, mbInformation, MB_OK); //сообщение показывается на странице завершения
Log(msgError);
Break; //прервать цикл распаковки
end;
end;
// Hide labels and button
WizardForm.FileNameLabel.Caption:= '';
lblExtractFileName.Hide;
ExtractFile.Hide;
btnCancelUnpacking.Hide;
end;

procedure CurStepChanged1(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
UnPackError:= UnPack(Archives)
if UnPackError = 0 then
SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
else
begin
// Error occured, uninstall it then
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); //откат установки из-за ошибки unarc.dll
SetTaskBarTitle(SetupMessage(msgErrorTitle))
WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
end;
end;
end;

// стандартный способ отката (не нужна CurPageChanged1), но архивы распаковываются до извлечения файлов инсталлятора
// if CurStep = ssInstall then
// if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged1(CurPageID: Integer);
Begin
if (CurPageID = wpFinished) and (UnPackError <> 0) then
begin // Extraction was unsuccessful (распаковщик вернул ошибку)
// Show error message
WizardForm.FinishedLabel.Font.Color:= $0000C0; // red (красный)
WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
end;
End;

procedure InitializeWizard1();
begin
with WizardForm.ProgressGauge do
begin
// Create a label to show current FileName being extracted
lblExtractFileName:= TLabel.Create(WizardForm);
lblExtractFileName.parent:=WizardForm.InstallingPage;
lblExtractFileName.autosize:=false;
lblExtractFileName.Width:= Width;
lblExtractFileName.top:=Top + ScaleY(35);
lblExtractFileName.Caption:= '';
lblExtractFileName.Hide;

// Create a label to show percentage
ExtractFile:= TLabel.Create(WizardForm);
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width:= Width;
ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
ExtractFile.caption:= '';
ExtractFile.Hide;
end;

// Create a 'Cancel unpacking' button and hide it for now.
btnCancelUnpacking:=TButton.create(WizardForm);
btnCancelUnpacking.Parent:= WizardForm;
btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
btnCancelUnpacking.Hide;
end;
//***************************************** [ Конец - Распаковка архивов FreeArc] *********************************************//

//***************************************** [ Начало - Слай шоу в окне инсталляции] *********************************************//
const
m=6; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..M] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
For i:=1 to X do A:=A+chr(i);
B:='';
For i:=1 to X do begin
j:=Random(Length(A)-1)+1;
C:='';
B:=B + A[j];
for k:=1 to Length(A) do
if k<>j then C:=C+A[k];
A:=C;
end;
for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
then begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
if (currTime/{#TIME_FOR_VIEW} = M) then currTime:=0;
end;
end;


procedure InitializeWizard2;
begin
bmp:=get_unique_random_number(M);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to M do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged2(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := False;
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
CurStepChanged1(CurStep);
CurStepChanged2(CurStep);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;
//***************************************** [ Конец - Слай шоу в окне инсталляции] *********************************************//
Заранее спасибо!!! :(

Модератор: Пользуйтесь тэгами hide и code. В следующий раз горчичник за такие простыни...

leshcat
28-01-2012, 02:47
nik1967,

Говорит, что переменная неизвестна, но она описана:

AboutButton, CancelButton: TButton;

?

nik1967
28-01-2012, 11:32
leshcat, ну, как бы это не мой косяк. Работает всё отлично. Да и азы это. ничего сложного.
[Setup]
AppName=Приложение
AppVerName=Приложение
DefaultDirName={pf}\Приложение
DirExistsWarning=no

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[_Code]
var
AboutButton, CancelButton: TButton;

procedure InitializeWizard;
begin
CancelButton:= WizardForm.CancelButton;
AboutButton:= TButton.Create(WizardForm);
with AboutButton do begin
SetBounds(WizardForm.ClientWidth-CancelButton.Left-CancelButton.Width,CancelButton.Top,CancelButton.Width,CancelButton.Height);
Caption:= '&About...';
//OnClick:= @AboutButtonOnClick;
Parent:= WizardForm;
end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = 1 then
AboutButton.Show
else
AboutButton.Hide;
end;


Скорее всего переменная описана в какой то конкретной процедуре. Вынеси описание под [_Code]

Johny777
28-01-2012, 11:56
SARATOVSKY,
если нужно распаковать картинки первыми, то напиши их первыми в секции файлов, а потом уже саму unarc.dll и CallBack.dll
файлы в секции файлов распаковываются сверху вних
тоже самое относится и скеции RUN
попробуй

leshcat
28-01-2012, 12:37
nik1967,

Да, спасибо, вы правы, описание было внутри процедуры, я ступил.

Devils Night
28-01-2012, 15:37
Кто нибудь подскажет, как обойти UAC на W7? Мне товарищ сказал что можно, у него для этого DLL-ка валяется, но под неё скрипт надо писать, на всякий пожарный её прикрепил, мож кто ладу даст.
Без этого изврата всяких там дллок можно как то обойтись?

Есть такая задача - перепаковать дистрибутив flylinkdc++(FlylinkDC-x86-r407-build-8559) »по моему в Скрипты Inno Setup. Помощь и советы [часть 3] был готовый скрипт, там можешь поискать, точно помню он был, сам скачивал, выложить не могу к сожалению, искать очень долго придётся.

ты не хочешь учится. »Ну, Лександер, не все же мы такие вумные, я сам справку не понял, вот иногда приходятся догонять методом тыка, к примеру никак не мог догнать как совмещаются скрипты с одинаковыми процедурами что бы не выскакивало это сообщение, типа dublicate xxx, и приходилось, да и сейчас приходится в конце скрипта дописывать что то вроде
procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
я и не думал что их вообще возможно совмещать, кое что допёрло тогда, когда начал юзать редактор форм, по тихоньку добавляя что либо, допустим какие нибудь там кнопочки, сделал одну кнопку для одного скрипта, вторую для другого скрипта, потом хотелось видеть их в третьем скрипте, через редактор форм я добавил эти 2 кнопки, когда сравнил три скрипта, вот только тогда и увидел как совмещается, но и то в общих чертах.
А procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2(); , приходится использовать потому, что выскакивает уже совсем другая ошибка, не dublicate.

А без желания ничего не получится. »Да тут и с желанием, любой интерес пропадёт.
Программу из кусков не наляпаешь, нужно ЧИТАТЬ И ПОНИМАТЬ то. что читаешь. »Конечно поймёшь, как же, когда всё рассказывается на своём программерском языке, а не так как может понять юзер. А бывает и как то само доходит, от святого духа и без всяких там справок.
дом можно из кусков наляпать как попало »Ну ты конечно и загнул. Какой же это дом :lol:? Это сарай а не дом, даже скорее будка для собаки, хотя я даже и собаке такого не пожелал бы.

как совмещаются скрипты с одинаковыми процедурами »Это позже буду обсуждать, и думаю это затянется на долго, поскольку оно не сразу доходит, объясняется тем что понимаешь одно, а говориться совсем о другом, т.е у каждого своя формулировка понятия того о чём обсуждается, так что если будет всё слишком нудно, то не обессудьте, честно, очень хочется понять о чём говориться, а на половину пройденного пути не хотелось бы всё забрасывать, потом опять начинать тему, потом опять забросить, и так по сто раз одно и тоже, этоже ведь не дело.

UAC.rar (http://forum.oszone.net/attachment.php?attachmentid=81914&d=1335945414)

El Sanchez
28-01-2012, 20:15
А можно сделать, что бы запускался не run_hl2.exe, а hl2.exe с параметрами »
Johny777, версия авторана №2 http://rghost.ru/36181331

LinkOFF
28-01-2012, 20:56
LinkOFF, Прочитать справку к IsDone. Внимательно! »
Ну нету там!мне ведь что нужно:Есть freearc-архив data.arc, в нем 2 папки rus и eng и как сделать чтоб распаковалась только ОДНА папка или файл из них.
И не могли бы мне помочь с распаковкой архивов в зависимости от выбранных компонентов. Все перепробовал, но ничего не получается.Заранее спасибо!

N00bak
28-01-2012, 23:21
подскажите пожалуйста как изменить вид страницы компонентов чтобы я мог сам сделать шрифт написаного там и расположение

Ну нету там!мне ведь что нужно:Есть freearc-архив data.arc, в нем 2 папки rus и eng и как сделать чтоб распаковалась только ОДНА папка или файл из них.
И не могли бы мне помочь с распаковкой архивов в зависимости от выбранных компонентов. Все перепробовал, но ничего не получается.Заранее спасибо! »
if not ISArcExtract ( 1, 0, ExpandConstant('{app}\rus.bin'), ExpandConstant('{app}'), '', true, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
где 1 это номер компонента по разным арк архивам расфасуй руский в отдельный архив английский в отдельный и все.true замени на false чтоб архив после распаковки не стирало.
я так обхожусь все работает как часы если нужен реестр то так
Components:text\rus; Root: HKCU; SubKey: Software\Valve\Steam; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty

nik1967
29-01-2012, 16:10
LinkOFF,
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), 'rus', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;




© OSzone.net 2001-2012