Показать полную графическую версию : [архив] Скрипты Inno Setup. Помощь и советы [часть 2]
Так дело в том, что этот самый текст неизвестен и соответственно предложенный вариант не совсем подходит. »
Ну так переделайте функцию 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].
Сам и отвечу тогда, раз уж так повелось »
Так вы и не спрашивали, из вашего предыдущего сообщения было понятно, что вы разобрались...
Нашел решение: »
и добавить флаг noencryption к файлам в секции [Files] »
Только к тем, которые вы извлекаете с помощью ExtractTemporaryFile.
Ну а нажать на кнопку Далее, можно и проще:
//////////////////////////////////////////////////////////////////////////////
if CurPageID = wpPassword then
WizardForm.NextButton.OnClick(WizardForm.NextButton);
/////////////////////////////////////////////////////////////////////////////
Нужно найти файл:
Варианты: (чем больше тем лучше - [имя]**.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
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)
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;
Вопрос:
Как в скрипте распаковки 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';
И еще, подскажите где взять скрипт вот такого инсталлера: »
Здесь (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, но он говорит что-то про директорию и выдаёт ошибку.
Мне сказали, что вроде надо батник как-то писать?
Нужно найти файл »
[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]
Всем доброго времени суток, как известно файлы сжимаемые freearcom, сжимаються в архив с расширением .arc, но в репаках игр файлы с расширением .bin. как это сделать так что бы распаковывалась игра, потому что после того как перевожу в другой фармат меняеться расширение, и с помошью скрипта не распаковываеться! Надеюсь на помощь.
Молодой, надо в скрипте менять тоже на .bin
как известно файлы сжимаемые freearcom, сжимаються в архив с расширением.arc поменяй на .bin
vint56, Спасибо попробуем!
Подскажите как сменить цвет всего шрифта во всех пунктах меню на черный ?
http://i2.fastpic.ru/thumb/2010/0220/69/28ba894d3a1a4b2539b176d00ef38069.jpeg (http://fastpic.ru/view/2/2010/0220/28ba894d3a1a4b2539b176d00ef38069.jpg.html)
D_Rix,
DirEdit.Font.Color:= Clblack;
GroupEdit.Font.Color:= Clblack;
vint56,
Спасибо.
Остался один вопросик:
Как сделать чтобы посде распаковки data1.ark он начал распаковывать data2.ark и т.д.
Как правильно дописать это ?
//--- указываем расположение архивов FreeArc;
Archives = '{src}\data.arc';
D_Rix,
Archives = '{src}\*.arc'; // указываем расположение архивов FreeArc;
* означает data1.ark и data2.ark и т.д. он распакует
Пример поиска по маске »
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.