Войти

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


Страниц : 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Serega
18-02-2010, 16:15
Так дело в том, что этот самый текст неизвестен и соответственно предложенный вариант не совсем подходит. »
Ну так переделайте функцию ReadFileName как вам надо, я только привёл пример загрузки текстового файла с дальнейшей его обработкой.
Вы точно уверены, что требуемуе значение будет первой строкой? Если да, то:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Code]
function ReadFirstLine(const FileName: string): string;
var
S: array of string;
begin
Result:= '';
if LoadStringsFromFile(FileName, S) then Result:= S[0]; // первая строка
end;

function InitializeSetup(): Boolean;
begin
MsgBox(ReadFirstLine(ExpandConstant('{pf}\Inno Setup 5\Examples\Readme.txt')), mbInformation, MB_OK);
end;


монолог какой-то получается »
Естественно, днём все на работе.

beaverBox
18-02-2010, 16:42
Сам и отвечу тогда, раз уж так повелось :)

procedure InitializeWizard;
begin
WizardForm.PasswordEdit.Text := 'blabla';
...
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID = wpPassword then begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;
и добавить флаг noencryption к файлам в секции [Files].

Serega
18-02-2010, 19:09
Сам и отвечу тогда, раз уж так повелось »
Так вы и не спрашивали, из вашего предыдущего сообщения было понятно, что вы разобрались...
Нашел решение: »

и добавить флаг noencryption к файлам в секции [Files] »
Только к тем, которые вы извлекаете с помощью ExtractTemporaryFile.
Ну а нажать на кнопку Далее, можно и проще:

//////////////////////////////////////////////////////////////////////////////
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
/////////////////////////////////////////////////////////////////////////////

semiono
18-02-2010, 19:24
Нужно найти файл:
Варианты: (чем больше тем лучше - [имя]**.exe)
{pf}\папка с_пробелом\Cubase.exe
{pf}\папка с_пробелом\Cubase4.exe
{pf}\папка с_пробелом\Cubase 4.exe
{pf}\папка с_пробелом\Nuendo.exe
{pf}\папка с_пробелом\Nuendo4.exe
{pf}\папка с_пробелом\Nuendo 4.exe

и дополнительно:
{sys}\Cubase.cmd ; здесь имя без вариантов ; файл может вообще отсутствовать
{sys}\Nuendo.cmd ; здесь имя без вариантов ; тоже самое

и запустить первый файл который существует, затем сразу выйти и завершить поиск.
В случае error просто завершить поиск итд...
Другими словами, надо запустить одно из двух приложений которые не точно известны инсталлеру.
Выполнить я имею ввиду так -
[Run]
FileName: {Code:Result}; Flag: Nowait

{pf}\папка с_пробелом\ -- другими словами --> {pf}\*\*\*... рекурсивно

тема перекликается с автоит разделом где это уже было решённым, но я не сразу подумал что мне это в iss более нужно,
тем более что и API здесь вроде бы подходящие имеются, но сам я не потяну

Если есть какие-то сложности, зделайте хотябы упрощённый вариант по выбору
или {pf}\папка с_пробелом\Cubase.exe
или {pf}\папка с_пробелом\Nuendo.exe

A1EXXX
18-02-2010, 19:52
Inno Setup 5.3.8

(changelog (http://www.jrsoftware.org/files/is5-whatsnew.htm))

:)

Скачать: ANSI (http://files.jrsoftware.org/is/5/isetup-5.3.8.exe) или UNICODE (http://files.jrsoftware.org/is/5/isetup-5.3.8-unicode.exe)

vint56
18-02-2010, 21:02
Serega, ты не подскажеш как на второй процесбар наложить текстуру
Вот код[Setup]
AppName=zz
DefaultGroupName=group
AppVerName=zzz
DefaultDirName={pf}\test
SolidCompression=false
InternalCompressLevel=none
Compression=none

#define PB_ImageFile "progress1.bmp"

[Files]
Source: IMAGE\{#PB_ImageFile}; DestDir: {tmp}; Flags: recursesubdirs ignoreversion
Source: Files\packjpg_dll.dll; DestDir: {sys}; Flags: deleteafterinstall
Source: Files\precomp.dll; DestDir: {sys}; Flags: deleteafterinstall
Source: Files\zlib1.dll; DestDir: {sys}; Flags: deleteafterinstall
Source: Files\innocallback.dll; Flags: dontcopy
Source: Files\isprecomp.dll; Flags: dontcopy
Source: animations2.pcf; DestDir: {tmp}; Flags: ignoreversion nocompression


[Code]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TPrecompCallback = procedure(progress: integer);
TMessage = record hWnd: HWND; msg, wParam: Word; lParam: LongWord; Time: TFileTime; pt: TPoint; end;

var
TimerID: LongWord;
intOldCurrWidth : Integer;
ProgressBar_BitmapImage: TBitmapImage;
ProgressBar_Edit : TEdit;
ProgressBar_ImageHeight : integer;
ProgressLabel: TLabel;
ProgressBar: TNewProgressBar;
btnCancelRecompress: TButton;

// Функции для работы с таймером
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 PeekMessage(var lpMsg: TMessage; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMessage): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMessage): Longint; external 'DispatchMessageA@user32.dll stdcall';

function WrapPrecompCallback(callback:TPrecompCallback; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
procedure PrecompExtract(in_file, extract_path: PAnsiChar; callback: longword); external 'precomp_extract@files:isprecomp.dll,precomp.dll,zlib1.dll,packjpg_dll.dll stdcall';
procedure PrecompBreak; external 'precomp_break@files:isprecomp.dll stdcall delayload';

procedure AppProcessMessage;
var
Msg: TMessage;
begin
if not PeekMessage(Msg, {WizardForm.Handle} 0, 0, 0, {PM_REMOVE} 1) then Exit;
TranslateMessage(Msg); DispatchMessage(Msg);
end;

// эта процедура будет вызыватся 100 раз в секунду
procedure PrecompCallback(progress: integer);
begin
ProgressBar.Position := progress;
ProgressLabel.Caption := 'Recompression: ' + IntToStr(progress) + '%';
AppProcessMessage;
end;

procedure btnCancelRecompressOnClick(Sender: TObject);
begin
PrecompBreak;
WizardForm.FinishedHeadingLabel.Caption:= 'Setup aborted';
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted);
end;

// Обработчик нажатия кнопки Отмена
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then // Просто спрячем наш Прогресс Бар
ProgressBar_Edit.Show;
end;

// Функция вызываемая по таймеру
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
CurrWidth : single;
begin
// Используем текущее состояние стандартного Прогресс Бара (ПБ)
with WizardForm.ProgressGauge do
begin
CurrWidth := ( Position * Width ) / Max; // Вычисляем какой ширины должен быть наш ПБ
if intOldCurrWidth <> Round( CurrWidth ) then // Если ширина пока что такая же, то не будем пока что рисовать, чтобы избежать лишних обновлений формы
begin
intOldCurrWidth := Round( CurrWidth );
// Теперича "рисуем" наш ПБ
ProgressBar_BitmapImage.SetBounds( 0, 0, intOldCurrWidth, ProgressBar_ImageHeight );
ProgressBar_BitmapImage.Show(); // Показываем его во всей красе
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if CurPageID = wpInstalling then
begin
// Устанавливаем таймер
pfunc := WrapTimerProc( @OnTimer, 4 );
TimerID := SetTimer( 0, 0, 100, pfunc );
intOldCurrWidth := 0;
end;

// Убираем таймер, когда находимся на последней странице.
if CurPageID = wpFinished then
KillTimer( 0, TimerID );
end;

Procedure InitializeWizard1;
begin
// Создаем наш Edit, чтобы у нашего ПБ была более-менее нормальная рамка.
ProgressBar_Edit := TEdit.Create( WizardForm );
with ProgressBar_Edit do
begin
// Создаем его на месте стандартного ПБ
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top;
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Enabled := False;
ReadOnly := True;
// Фоновый цвет делаем точно такой же как у формы.
Color := WizardForm.Color;
Parent := WizardForm.InstallingPage;
end;

// Распаковываем картинку для нашего ПБ
ExtractTemporaryFile( '{#PB_ImageFile}' );

ProgressBar_BitmapImage := TBitmapImage.Create( WizardForm );
with ProgressBar_BitmapImage do
begin
// Загружаем картинку
Bitmap.LoadFromFile( ExpandConstant( '{tmp}\' ) + '{#PB_ImageFile}' );
Parent := ProgressBar_Edit;
Stretch := True; // Он должен растягиваться
Hide; // Прячем его до поры до времени
end;

// Получаем высоту для картинки
ProgressBar_ImageHeight := ProgressBar_Edit.Height - 2;
// Прячем стандартный ПБ
WizardForm.ProgressGauge.Hide;
end;

procedure DeinitializeSetup();
begin
// Убираем таймер
KillTimer( 0, TimerID );
end;



procedure InitializeWizard2;
begin
ProgressBar := TNewProgressBar.Create(WizardForm);
with ProgressBar do begin
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top + ScaleX(30);
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Parent := WizardForm.InstallingPage;
Min := 0;
Max := 100;
Position := 0;
Hide;
end;
ProgressLabel := TLabel.Create(WizardForm);
with ProgressLabel do begin
Left := ProgressBar.Left;
Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
AutoSize:= True;
Caption:= 'Recompression: 0%';
Parent := WizardForm.InstallingPage;
Transparent:= True;
Hide;
end;
btnCancelRecompress:=TButton.create(WizardForm);
with btnCancelRecompress do begin
SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
OnClick:= @btnCancelRecompressOnClick;
Parent := WizardForm;
Hide;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
callback: longword;
begin
if CurStep = ssPostInstall then
begin
ProgressBar.Show;
ProgressLabel.Show;
btnCancelRecompress.Caption := WizardForm.CancelButton.Caption;
btnCancelRecompress.Show;
callback:=WrapPrecompCallback(@PrecompCallback,1);
PrecompExtract(ExpandConstant('{tmp}\animations2.PCF'), ExpandConstant('{app}'), Callback);
btnCancelRecompress.Hide;
end;
end;

Procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;

beaverBox
19-02-2010, 11:19
Так вы и не спрашивали, из вашего предыдущего сообщения было понятно, что вы разобрались... »
Я не волшебник, я только учусь(с) :)
Спасибо.

Ну а нажать на кнопку Далее, можно и проще: »
Я поступил еще проще. У меня есть function ShouldSkipPage(PageID: Integer): Boolean;, туда и сунул
if PageID = wpPassword then
Result := true;

D_Rix
19-02-2010, 21:35
Вопрос:
Как в скрипте распаковки FreeArc сделать чтобы он распаковывал более одного архива.
Вот сам код:
;строки распаковки архивов
Source: {src}\data.arc; DestDir: {app}\data; Flags: external dontcopy
Source: {src}\bin.arc; DestDir: {app}\bin; Flags: external dontcopy
{#SourceToProgress}

Но при этом коде распаковывается только bin.arc а data.arc НЕ распаковывается.
Как сделать чтобы и тот и тот распаковывались ?

И еще, подскажите где взять скрипт вот такого инсталлера:
http://www.pixshock.net/pic_s/523fc3ce13b12429d2f9577492beb375.jpg (http://www.pixshock.net/523fc3ce13b12429d2f9577492beb375.html)

Заранее большое спасибо.

МИШАНЧИК
20-02-2010, 03:54
D_Rix, чтобы он распаковывал более одного архива. »
;строки распаковки архивов
Source: {src}\data.arc; DestDir: {app}\data; Flags: external dontcopy
{#SourceToProgress}
Source: {src}\bin.arc; DestDir: {app}\bin; Flags: external dontcopy
{#SourceToProgress}
или в секции код:
const
Archives = '{src}\*.arc';

YURSHAT
20-02-2010, 04:01
И еще, подскажите где взять скрипт вот такого инсталлера: »

Здесь (http://forum.ru-board.com/topic.cgi?forum=5&topic=31936&start=2170)

Vengeance
20-02-2010, 09:06
Components]
Name: g0; Description: Half-Life; Flags: fixed disablenouninstallwarning; Types: custom full
Name: g1; Description: Rcochet; Types: full custom; Flags: disablenouninstallwarning checkablealone

[Files]

Source: "C:\Documents and Settings\Админ\Мои документы\Downloads\s\zepsa\*"; DestDir: "{app}\half-life"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0
Source: "C:\Documents and Settings\Админ\Мои документы\Downloads\s\ricochet\*"; DestDir: "{app}\half-life\ricochet"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g1


Как мне сделать, чтобы g3 компонент если выбрать, он заменял определённые файлы g1. Я пробывал чтобы g3 устанавливался в ...\valve\models, но он говорит что-то про директорию и выдаёт ошибку.

Мне сказали, что вроде надо батник как-то писать?

Serega
20-02-2010, 11:04
Нужно найти файл »

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[Code]
var
// задаём переменную глобально, для всего скрипта
Mask: string;

procedure RunMyProg(FileNeme: string);
begin
// здесь что нибудь делаем с найденым файлом
MsgBox(FileNeme, mbInformation, MB_OK );
end;

function FindFile(Path: string): Boolean;
var
FSR, DSR: TFindRec;
FindResult: Boolean;
begin
Result:= False;
if Path[Length(Path)] <> '\' then Path:= Path + '\';
FindResult:= FindFirst(Path + Mask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
RunMyProg(Path + FSR.Name);
Result:= True;
Exit;
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(Path + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
FindFile(Path + DSR.Name);
FindResult:= FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

function InitializeSetup(): Boolean;
var
i: Integer;
ArrayOfMask: TArrayOfString;
StartFolder: string;
begin
StartFolder:= ExpandConstant('{pf}\Inno Setup 5'); // задаём папку откуда начинать поиск
ArrayOfMask:= ['*n*.txt', 'R*.txt', '*m*.txt']; // заполняем массив масок для поиска
for i:= 0 to GetArrayLength(ArrayOfMask)-1 do // перебираем весь масив масок
begin
Mask:= ArrayOfMask[i];
if FindFile(StartFolder) then Break;
end;
end;


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

чтобы g3 компонент если выбрать, он заменял определённые файлы g1 »
Поподробней раскажите.
но он говорит что-то про директорию и выдаёт ошибку. »
Покажите пример как делаете.
Мне сказали, что вроде надо батник как-то писать? »
Зачем, всё можно сделать в секции [Сode]

Молодой
20-02-2010, 11:44
Всем доброго времени суток, как известно файлы сжимаемые freearcom, сжимаються в архив с расширением .arc, но в репаках игр файлы с расширением .bin. как это сделать так что бы распаковывалась игра, потому что после того как перевожу в другой фармат меняеться расширение, и с помошью скрипта не распаковываеться! Надеюсь на помощь.

vint56
20-02-2010, 12:15
Молодой, надо в скрипте менять тоже на .bin
как известно файлы сжимаемые freearcom, сжимаються в архив с расширением.arc поменяй на .bin

Молодой
20-02-2010, 12:47
vint56, Спасибо попробуем!

D_Rix
20-02-2010, 13:06
Подскажите как сменить цвет всего шрифта во всех пунктах меню на черный ?

http://i2.fastpic.ru/thumb/2010/0220/69/28ba894d3a1a4b2539b176d00ef38069.jpeg (http://fastpic.ru/view/2/2010/0220/28ba894d3a1a4b2539b176d00ef38069.jpg.html)

vint56
20-02-2010, 13:29
D_Rix,
DirEdit.Font.Color:= Clblack;
GroupEdit.Font.Color:= Clblack;

D_Rix
20-02-2010, 15:09
vint56,
Спасибо.
Остался один вопросик:
Как сделать чтобы посде распаковки data1.ark он начал распаковывать data2.ark и т.д.
Как правильно дописать это ?

//--- указываем расположение архивов FreeArc;
Archives = '{src}\data.arc';

vint56
20-02-2010, 16:07
D_Rix,
Archives = '{src}\*.arc'; // указываем расположение архивов FreeArc;
* означает data1.ark и data2.ark и т.д. он распакует

semiono
20-02-2010, 21:09
Пример поиска по маске »
Warning Line 57, Column 10:[hint] variable 'Result' never used

тут проблема:
function InitializeSetup(): Boolean;

но я не могу додумать, помоги?

у меня даже MsgBox не открылся

----
Это мне не надо:
[Languages]
; Name: rus; MessagesFile: compiler:Languages\Russian.isl




© OSzone.net 2001-2012