Войти

Показать полную графическую версию : Скрипты 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

Duality
23-12-2010, 12:01
а самому догадаться слабо что не хватает var text: TLabel;
я ведь только функцию NextButtonClick склеил, тупо скопировать-вставить. » не углядел

Black-J
23-12-2010, 12:50
Помогите....скажите как сделать чёрный инсталятор или кинь скин я просто начинающий...

R.i.m.s.k.y.
23-12-2010, 15:27
скажите как сделать чёрный инсталятор или кинь скин я просто начинающий »
Если начинающий - первым делом бегом в шапку, качать и читать. Искать *black*.iss

serg aka lain
23-12-2010, 18:29
Подскажите как сделать в инсталляторе "невозможность установки в определенный каталог" (в частности в program files - желательно с выводом сообщения или просто вывод сообщения о нежжелательности/невозможности установки в program files. »
Попробуйте это (http://rghost.ru/3725688), именно так надо?

R.i.m.s.k.y.
23-12-2010, 19:17
Попробуйте это, именно так надо »
очень оригинально - экзешник скомпиленный давать.

ChVL
23-12-2010, 19:24
R.i.m.s.k.y.,
Спасибо!
Вторая процедура не работает, изобразил её в классическом виде - всё заработало. Привожу полный код секции, который при деинсталляции программы удаляет указанный текст из указанного файла, например, добавленную при инсталляции строку в hosts. Может ещё кому пригодится. (Первая процедура - Ваша, вторая - классическая).
[_code]
procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
S: TArrayOfString;
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);
and;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
If CurUninstallStep=usPostUninstall
then
begin
RePlaceTextinFile(ExpandConstant('{sys}\drivers\etc\hosts'), '127.0.0.1 www.site.com', '');
end;
end;
Одно замечание: удаляется текст, если же в строке больше нет ничего, то остаётся пустая строка. Неплохо бы в этом случае и строку убрать, но, в принципе, можно смириться...
Проверку наличия файла можно убрать.

serg aka lain
23-12-2010, 19:27
очень оригинально - экзешник скомпиленный давать. »
не в экзешнике дело, а как он отработает на другой системе.
дал для тестирования, т.к. задача вроде простая, но раньше я с этой идеей не сталкивался.(вдруг облажался с реализацией)

Serega
23-12-2010, 19:39
Неплохо бы в этом случае и строку убрать »
Тогда вам проще использовать в процедуре RePlaceTextinFile не TArrayOfString, а TStringList и уже в нём удалять нужную строку.

P.S.
В процедуре RePlaceTextinFile после того как нашли строку, я бы добавил Break, чтоб не бегать дальше по оставшимся строкам.

Duality
23-12-2010, 19:41
Попробуйте это, именно так надо? » неплохо! можно реализацию?

хех, только если там самому выбрать PF и подписать дальще название папки куда устанавливать - то оно разрешает установку)))

ChVL
23-12-2010, 19:56
Serega,
IMHO, Break не нужен для строк в hosts. По опыту: одинаковых строк может оказаться несколько, например, когда-то они были прописаны до инсталляции программы вручную. Да и файл этот малюсенький - пусть просматривает весь...

R.i.m.s.k.y.
23-12-2010, 19:57
Тогда вам проще использовать в процедуре RePlaceTextinFile не TArrayOfString, а TStringList и уже в нём удалять нужную строку. »
А это Ваша процедура, Вы же мне ее давно и написали ;)

Вторая процедура не работает, изобразил её в классическом виде - всё заработало. »
странно, у меня она работает (правда у меня идет вызов удаления папки а не замена текста, так что я думал все рабочее)
Наверное потому что у меня препроцессор стоит.

дал для тестирования, т.к. задача вроде простая, но раньше я с этой идеей не сталкивался.(вдруг облажался с реализацией) »
[скандирует] СКРИПТ! СКРИПТ В СТУДИЮ!

serg aka lain
23-12-2010, 20:24
хех, только если там самому выбрать PF и подписать дальще название папки куда устанавливать - то оно разрешает установку))) »
Да, я это заметил и вроде пофиксил.



[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={sd}\My Program
OutputDir=.
OutputBaseFilename=test

[Code]
procedure MyFunction(Sender: TObject);
var
S: String;
begin
S := Copy(WizardForm.DirEdit.Text, 0, Length(WizardForm.DirEdit.Text)
- Length(ExtractFileName(WizardForm.DirEdit.Text)) - 1);

if IsWin64 then
begin
if (S = ExpandConstant('{pf32}')) or (S = ExpandConstant('{pf64}')) then
begin
MsgBox('Программу нельзя устанавливать в' + #13#10 + S, mbInformation, MB_OK);
WizardForm.DirEdit.Text := ExpandConstant('{sd}\My Program');
end;
end else
if S = ExpandConstant('{pf}') then
begin
MsgBox('Программу нельзя устанавливать в' + #13#10 + S, mbInformation, MB_OK);
WizardForm.DirEdit.Text := ExpandConstant('{sd}\My Program');
end;
end;

procedure InitializeWizard();
begin
WizardForm.DirEdit.OnChange := @MyFunction;
end;

Duality
23-12-2010, 20:30
serg aka lain, спасибо! работает отлично)) очень хорошо

R.i.m.s.k.y.
23-12-2010, 20:31
serg aka lain,
я бы сделал поиском {pf} в пути установки:
if (Pos(ExpandConstant('{pf}'), S > 0) then begin
MsgBox('Программу нельзя устанавливать в' + #13#10 + S, mbInformation, MB_OK);
WizardForm.DirEdit.Text := ExpandConstant('{sd}\My Program');
end;

Duality
23-12-2010, 20:34
я бы сделал поиском {pf} в пути установки:
if (Pos(ExpandConstant('{pf}'), S > 0) then begin
MsgBox('Программу нельзя устанавливать в' + #13#10 + S, mbInformation, MB_OK);
WizardForm.DirEdit.Text := ExpandConstant('{sd}\My Program');
end; »в чем преимущество?

R.i.m.s.k.y.
23-12-2010, 20:38
в чем преимущество »
вообще в програм филесы поставить нельзя с дописко или без

Serega
23-12-2010, 20:50
Да и файл этот малюсенький - пусть просматривает весь... »
Всё в этом мире относительно...

А это Ваша процедура, Вы же мне ее давно и написали »
Может быть, видимо было давно...
Просто в Inno удалить строку из массива нельзя, по крайней мере пока, а вот TStringList поддерживает удаление строки.

serg aka lain
23-12-2010, 20:58
я бы сделал поиском {pf} в пути установки: »
Принципиального отличия нет, всё равно код по объёму не уменьшится (pf, pf32, pf64 проверять нужно)
if (Pos(ExpandConstant('{pf32}'), S) > 0) or (Pos(ExpandConstant('{pf64}'), S) > 0) then
А дописка обрабатывается тут

S := Copy(WizardForm.DirEdit.Text, 0, Length(WizardForm.DirEdit.Text)
- Length(ExtractFileName(WizardForm.DirEdit.Text)) - 1);
з.ы. Ну это ИМХО. Модифицировать никто не запрещает.

Serega
23-12-2010, 21:00
serg aka lain, строка начинается с 1, а массивы по умолчанию с 0, т.е. при использовании Copy, копировать можно начиная с 1.
И может проще сделать так:
S := ExtractFilePath(WizardForm.DirEdit.Text);
SetLength(S, Length(S)-1);

Duality
23-12-2010, 21:10
все хорошо, но вот если у disk:\program files\ убрать последний слэш, т.е. disk:\program files - все равно дает установить(




© OSzone.net 2001-2012