PDA

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


Страниц : 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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

Gugle
26-07-2011, 13:59
По поводу первого вопроса.
Собрав инфу по частям сделал следующий пример:
[Code]
procedure UpdateIni();
var
IniFileName: String;
StrArray: TArrayOfString;
begin
IniFileName := ChangeFileExt(ExpandConstant(CurrentFileName), '.ini'); // 1
if not IniKeyExists('settings', 'TestName', IniFileName) then begin // 2
SetArrayLength(StrArray, 2);
StrArray[0] := '; name и по русски то же';
StrArray[1] := 'TestName=name.txt';
SaveStringsToFile(IniFileName, StrArray, True);
end else begin
SetIniString('settings', 'newTestName', 'newname.txt', IniFileName); // 3
end;
end;

Проблема в том, что для отработки кода в строке 2, в *.ini файле необходима запись:
[settings]
TestName=firstName.txt

А мне нужна реакция на
;settings
TestName=firstName.txt

Строка кода 3, вставляет в *.ini файл данные следующего содержания:
[settings]
newTestName=newname.txt

А мне опять таки надо:
;settings
newTestName=newname.txt

Гуру, помогите плз.

Gugle
26-07-2011, 15:07
Все. Первый вопрос отпал сам собой. Однако, если кто-то найдет решение, то я с удовольствием его посмотрю, т.к. проблема может возникнуть снова.

Родился следующий вопрос.
После инсталяции приложения, мне необходимо размножить (или скопировать) одну из папок. Скачав InnoSetupFAQ_ru-board.chm я нашел там решение этой проблемы с помощью скрипта "SHFileOperation.iss". Однако при удалении приложения эти размноженные папки не удаляются, а хотелось бы, что бы удалялись.
Что для этого нужно сделать?

R.i.m.s.k.y.
26-07-2011, 15:39
вообще-то в инишниках [...] - секции, а ";" - комментарии
придется "руками" через код писать файл раз надо, смотри в сторону SaveStringsToFile, в InnoSetupFAQ_ru-board.chm и шапке есть примеры,
в InnoSetupFAQ_ru-board.chm помоему вообще что тебе нужно один-в-один
Как сделать, чтобы дополнительно создать новую страницу и туда перенести задачи раздела [Tasks], чтобы при их выборе происходило копирование в ini-файл, в зависимости от того, что выбрано (из чекбоксов)?

После инсталяции приложения, мне необходимо размножить (или скопировать) одну из папок. Скачав InnoSetupFAQ_ru-board.chm я нашел там решение этой проблемы с помощью скрипта "SHFileOperation.iss". Однако при удалении приложения эти размноженные папки не удаляются, а хотелось бы, что бы удалялись.
Что для этого нужно сделать? »
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then
begin
if DirExists(ExpandConstant('{app}\')) then
DelTree(ExpandConstant('{app}'), True, True, True);
end;
end;

может пригодится функция замены текста в текстовом файле

procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
S: TArrayOfString;
//str : string;
i : Integer;
begin
if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
LoadStringsFromFile(FilePath, S); // загружаем файл
for i:= 0 to GetArrayLength(S)-1 do begin
if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
StringChangeEx(S[i], find, replace, True);
end;
end;
SaveStringsToFile(FilePath, S, False); // сохраняем файл
end;

Habetdin
26-07-2011, 15:55
procedure CurUninstallStepChanged »
Еще можно без секции [code]:
[UninstallDelete]
Name: {app}; Type: filesandordirs

R.i.m.s.k.y.
26-07-2011, 15:59
Еще можно без секции [code]: »
знаю но не всегда срабатывает

Gugle
26-07-2011, 16:16
R.i.m.s.k.y., возможно Вы имели ввиду пример, описанный в InnoSetupFAQ_ru-board.chm, однако...
1. При использовании процедуры CurStepChanged(CurStep: TSetupStep); для копирования данных папки создаются, а вот данные туда не копируются. В связи с этим сделал свою процедуру, которая стартует сразу после установки необходимой папки:
Source: "C:\test\Folder0\*"; DestDir: "{app}\Folder0\"; AfterInstall: CopyFolder(); Flags: ignoreversion recursesubdirs createallsubdirs

2. Я не могу понять как удалить созданные папки, если они у меня создаются в зависимости от указанного пользователем значения при установке приложения. Т.е. Я не могу сделать в процедуре CurUninstallStepChanged(CurUninstallStep: TUninstallStep); следующее:
CopyDir(ExpandConstant('{app}\Folder1\'),ExpandConstant('{app}'));
CopyDir(ExpandConstant('{app}\Folder2\'),ExpandConstant('{app}'));
т.к. количество вводится только во время установки.

Кстати, почему в примере CopyDir()? Это описался человек или так и должно быть?

R.i.m.s.k.y., Ваша процедура удаления CurUninstallStepChanged(CurUninstallStep: TUninstallStep); работет более корректно. Все вопросы по удалению отпали.

Большое спасибо за подсказку.

R.i.m.s.k.y.
26-07-2011, 17:06
В связи с этим сделал свою процедуру, которая стартует сразу после установки необходимой папки: »
и она отрабатывает над каждым файлом в папке
советую копировать папку куда надо без AfterInstall, а потом второй строчкой один мелкий файлик уже с AfterInstall
Source: "C:\test\Folder0\*"; DestDir: "{app}\Folder0\"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\test\Folder0\ww.txt"; DestDir: "{app}\Folder0\"; AfterInstall: CopyFolder(); Flags: ignoreversion recursesubdirs createallsubdirs

Ваша процедура удаления CurUninstallStepChanged »
она не моя, она системная

и можно на ты, меня не покоробит :)

Gugle
26-07-2011, 17:12
и она отрабатывает над каждым файлом в папке
Спасибо за пояснения.

В Examples при установке inno setup лежит прекрасный пример (Components.iss) по построению установщика с выбором разных "уровней сложности":
[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

Вопрос. Как после выбора "Full installation" попасть сразу в последнее окно, а, например, при выборе "Compact installation" поставить сначало дно из своих окон?
Например вот такое:
var
UserPage: TInputQueryWizardPage;

procedure InitializeWizard;
begin
UserPage := CreateInputQueryPage(wpWelcome,
'Дополнительная информация', 'ВНИМАНИЕ! Все поля должны быть заполнены',
'Пожалуйста введите количество wrlr, которые необходимо установить '+
'на рабочую станцию и нажмите клавишу next');
UserPage.Add('Количество wrlr:', False);
UserPage.Add('ни о чем:', True); // Скрытый текст
end;

З.Ы.
Текст из Components.iss
; -- Components.iss --
; Demonstrates a components-based installation.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: program
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "Readme.txt"; DestDir: "{app}"; Components: readme\en; Flags: isreadme
Source: "Readme-German.txt"; DestName: "Liesmich.txt"; DestDir: "{app}"; Components: readme\de; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

insombia
26-07-2011, 17:20
Всем привет,как сделать чтобы прогресс бар со временем перемещался на середину и так далее типа как у механиков?

LinkOFF
26-07-2011, 21:12
insombia, я сам хочу узнать

Rikill
26-07-2011, 21:25
insombia, LinkOFF, всмысле в середину?? так (http://forum.ru-board.com/topic.cgi?forum=5&topic=35848&start=1355&limit=1&m=1#1) штоле?
p.s. надо было так и спросить: "как уменьшить страницу установки и переместить?"

insombia
27-07-2011, 14:35
Rikill не так а когда идет установка то через определённое время прогресс бар с начала перескакивал на середину у каталистов тоже такое было

nik1967
27-07-2011, 15:16
у каталистов тоже такое было »
Ну и зачем? Мы наоборот стараемся добиться плавного прогрессбара. Красивше же :good:

Gnom_aka_Lexander
27-07-2011, 15:22
insombia, Такто у них библиотечка IsExec для этого, но от дерганого прогресса они уже отказались. А так, похожего эффекта можно добиться с помощью такого кода:
procedure CurStepChanged(CurStep: TSetupStep);
var ResultCode,step:integer;
begin
step:=WizardForm.ProgressGauge.Max/5; // шаг приравниваем максимальной позиции прогрессбара деленной на количество запускаемых анпакеров.
if CurStep=ssInstall then
begin
Exec(ExpandConstant('{app}\анпакер1.exe'), 'параметры для анпакера', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Position+step;
Exec(ExpandConstant('{app}\анпакер2.exe'), 'параметры для анпакера', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Position+step;
Exec(ExpandConstant('{app}\анпакер3.exe'), 'параметры для анпакера', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Position+step;
Exec(ExpandConstant('{app}\анпакер4.exe'), 'параметры для анпакера', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Position+step;
Exec(ExpandConstant('{app}\анпакер5.exe'), 'параметры для анпакера', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Max;
end;
end; в связке с рестулсовской ExecAndWait.

LinkOFF
27-07-2011, 15:41
nik1967, ты не знаешь как мне исправить вот это
http://i25.fastpic.ru/big/2011/0727/7e/9c5a9f23ead8969b4ce1b9805b4ddc7e.jpg

insombia
27-07-2011, 15:44
LinkOFF а что именно нужно исправить?

LinkOFF
27-07-2011, 15:49
LinkOFF а что именно нужно исправить? »
Надписи прозрачными сделать, надо чтоб картинка видна была в WizardSmallImage

insombia
27-07-2011, 15:51
LinkOFF можно и через скрипт уменьшить обьем картинки и не будет такого как у тебя

LinkOFF
27-07-2011, 15:54
можно и через скрипт уменьшить обьем картинки и не будет такого как у тебя »
Да я знаю, но мне вообще прозрачность убрать надо, чтоб надписи ложились на вставляемую картинку

insombia
27-07-2011, 16:02
А как сделать чтобы не писалось распаковывается там какой то файл а просто распаковка файлов а какие именно чтобы не указывалось?




© OSzone.net 2001-2012