Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
а самому догадаться слабо что не хватает var text: TLabel;
я ведь только функцию NextButtonClick склеил, тупо скопировать-вставить. » не углядел
Помогите....скажите как сделать чёрный инсталятор или кинь скин я просто начинающий...
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
Попробуйте это, именно так надо »
очень оригинально - экзешник скомпиленный давать.
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
очень оригинально - экзешник скомпиленный давать. »
не в экзешнике дело, а как он отработает на другой системе.
дал для тестирования, т.к. задача вроде простая, но раньше я с этой идеей не сталкивался.(вдруг облажался с реализацией)
Неплохо бы в этом случае и строку убрать »
Тогда вам проще использовать в процедуре RePlaceTextinFile не TArrayOfString, а TStringList и уже в нём удалять нужную строку.
P.S.
В процедуре RePlaceTextinFile после того как нашли строку, я бы добавил Break, чтоб не бегать дальше по оставшимся строкам.
Попробуйте это, именно так надо? » неплохо! можно реализацию?
хех, только если там самому выбрать PF и подписать дальще название папки куда устанавливать - то оно разрешает установку)))
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;
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;
я бы сделал поиском {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
в чем преимущество »
вообще в програм филесы поставить нельзя с дописко или без
Да и файл этот малюсенький - пусть просматривает весь... »
Всё в этом мире относительно...
А это Ваша процедура, Вы же мне ее давно и написали »
Может быть, видимо было давно...
Просто в 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);
з.ы. Ну это ИМХО. Модифицировать никто не запрещает.
serg aka lain, строка начинается с 1, а массивы по умолчанию с 0, т.е. при использовании Copy, копировать можно начиная с 1.
И может проще сделать так:
S := ExtractFilePath(WizardForm.DirEdit.Text);
SetLength(S, Length(S)-1);
все хорошо, но вот если у disk:\program files\ убрать последний слэш, т.е. disk:\program files - все равно дает установить(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.