Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
habib2302
10-02-2014, 23:21
доброе время суток. дело в том, что после установки я хочу еще распаковать портативку и появляется этот диалог
http://i.imgur.com/l81SE5C.jpg (http://i.imgur.com/ViQbkSH.png)
хотя в секции Setup указал
CreateUninstallRegKey=not IsComponentSelected('AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua')
Ребят помогите, что то никак не могу найти пример кода. Нужно чтоб при установке создавался бэкап папки (копированием) а при повторном запуске инсталятора проверялось бы наличие этой бэкап папки, и если она есть то повторно не бэкапить. »
#define CUR_DIR "main" ;Глобально: папка, откуда копируем.
#define BAK_DIR "_backup" ;Глобально: папка, куда копируем.
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}\main; Flags: external overwritereadonly ignoreversion;
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
function CopyFile(lpExistingFileName, lpNewFileName: String; bFailIfExists: BOOL): BOOL; external 'CopyFile{#A}@kernel32.dll stdcall';
var
backupChk: TCheckBox;
procedure IsBackup(const FromDir: String; const ToDir: String);
var
fileArray: array of String;
FindFiles: TFindRec;
i, Len: Integer;
begin
fileArray := ['*'];
Len := GetArrayLength(fileArray) - 1;
for i := 0 to Len do
begin
if FindFirst(FromDir + fileArray[i], FindFiles) then
try
WizardForm.ProgressGauge.Hide;
WizardForm.StatusLabel.Caption := 'Создание резервной копии файлов...';
repeat
if not DirExists(ToDir) then CreateDir(ToDir);
CopyFile(FromDir + FindFiles.Name, ToDir + FindFiles.Name, False);
until not FindNext(FindFiles);
finally
WizardForm.ProgressGauge.Show;
FindClose(FindFiles);
end;
end;
end;
procedure InitializeWizard();
var
ThereIsFolders: Boolean;
begin
backupChk := nil;
ThereIsFolders := (DirExists(AddBackslash(WizardDirValue()) + '{#CUR_DIR}') and //Проверяем, есть ли папка, откуда копируем файлы.
(not DirExists(AddBackslash(WizardDirValue()) + '{#BAK_DIR}')) ); //Проверяем, что папка, куда копируем файлы не существует.
if ThereIsFolders then //Если оба вышеозначенных условия соблюдены создаем чекбокс.
begin
backupChk := TCheckBox.Create(nil);
with backupChk do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(WizardForm.DirEdit.Left), ScaleY(WizardForm.DiskSpaceLabel.Top div 2), ScaleX(WizardForm.DirEdit.Width), ScaleY(15));
Caption := 'Сохранить резервную копию перезаписываемых файлов';
Checked := ThereIsFolders;
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: if backupChk <> nil then //Проверяем, создан ли чекбокс.
if backupChk.Checked then //Если чекбокс создан, проверяем отмечен ли он
//Вызываем процедуру создания резервной копии файлов нв этапе перед установкой.
IsBackup(ExpandConstant('{app}\{#CUR_DIR}\'), //Папка, откуда копируем файлы.
ExpandConstant('{app}\{#BAK_DIR}\')); //Папка, куда копируем файлы.
end;
end;
Имейте ввиду, что удовлетворительным результатом здесь является исключительно отсутствие папки. Если папка есть, но она пуста, все равно будет возвращен False результат.
---------------------------------------------------------------
habib2302
[Setup]
CreateUninstallRegKey=_CheckIsComponents
[Code]
function _CheckIsComponents(): Boolean;
begin
Result := not IsComponentSelected('AIDA64\Portable\1') and
not IsComponentSelected('AIDA64\Portable\2') and
not IsComponentSelected('AIDA64\Portable\3');
end;
CreateUninstallRegKey=not IsComponentSelected('AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua') »
IsComponentSelected('...'): здесь должно быть указано имя компонента, одного, а не всех компонентов разом, да еще и языков зачем-то. В итоге для компилятора это строка считается именем одного компонента, вот он и проверяет, отмечен ли компонент под именем AIDA64\Portable and AIDA64\Portable\1 and AIDA64\Portable\2 and AIDA64\Portable\3 and Lang and Lang\ru and Lang\en and Lang\ua
Имейте ввиду, что удовлетворительным результатом здесь является исключительно отсутствие папки. Если папка есть, но она пуста, все равно будет возвращен False результат. »
Да это то что нужно. Бэкапим папку оригинальной программы, делаем это один раз и обязательно, поэтому можно и без чекбоксов. Спасибо.
diman_21Ru
11-02-2014, 14:53
Всем привет у Jove в мод-паке появилась занятная функция Авто-оповещение об обновлении Модпака как это можно реализовать ?
Всем привет у Jove в мод-паке появилась занятная функция Авто-оповещение об обновлении Модпака как это можно реализовать ? »
это мод для танков и к inno setup он никак не относится
diman_21Ru
11-02-2014, 19:34
innot20 ,это не мод а Launcher
Valera90
11-02-2014, 20:28
diman_21Ru, да меня тоже интересует это может кто то знает как это сделать ?
diman_21Ru
11-02-2014, 20:37
Как можно исправить сбоку баг на windows 7 все нормально но на Windows 8 вот как понимаю из за совместимости но все же можно может как то решить :)
Авто-оповещение об обновлении Модпака как это можно реализовать ? »
Написать утилиту, которая будет проверять наличие обновлений на некоем сервере. Только Inno - то тут каким боком?
Как можно исправить сбоку баг »
Похоже на косяк скинирования.
habib2302
11-02-2014, 21:02
Написать утилиту, которая будет проверять наличие обновлений на некоем сервере. Только Inno - то тут каким боком? »
согласен. как в angry birds в конфиге указал сервак а утилита сканирует наличие новой версии и т.д.
diman_21Ru
11-02-2014, 21:39
habib2302, а расширенный Inno Setup ведь только 5.5.1 или же есть выше может выше версия исправит мой баг
habib2302
11-02-2014, 22:05
выше 5.5.1 еще нет. а в текстовом файле лицензии нет этого. попробуй изменить формат текстового файла txt->rtf или rtf->txt
diman_21Ru,
такой вариант
http://rghost.ru/52373209
diman_21Ru
12-02-2014, 08:27
TryRooM,спасибо
habib2302 ,rtf->txt не дало нечего может прокрутку сбоку можно дорисовать как то
diman_21Ru
12-02-2014, 11:12
Как можно реализовать компоненты сюда добавляю просто [Components] не работает
вот скрипт : http://rghost.ru/52375292
diman_21Ru,
добавил сайт
http://rghost.ru/52375404
diman_21Ru
12-02-2014, 11:34
TryRooM,скрипт выше можешь глянуть компоненты как включить там чтобы выходили , если знаешь напиши
diman_21Ru
12-02-2014, 12:49
Походу скрипт не вышел но запустите и посмотрите пожалуйста
El Sanchez
12-02-2014, 19:31
Как можно исправить сбоку баг на windows 7 все нормально но на Windows 8 вот как понимаю из за совместимости но все же можно может как то решить »
Похоже на косяк скинирования. »
Да, встречал я такое пропадание скроллбара при использовании IsSkin/IsSkinEx.dll. При размере шрифта, отличном от умолчального, у ComponentsList не отрисовывается скроллбар, хотя такой же компонент TasksList отрисовывает как надо. Выставление у ComponentList таких же свойств, как у TasksList, ничего не дало. Но, если запускать на системе с классической темой, то скроллбар у ComponentList рисуется. Поэтому перед инициализацией скина необходимо установщику отрубить визуальные стили. Инициализацию скина проводят либо в InitializeSetup, либо при многоязычном установщике в InitializeLanguageDialog (если версия IS расширенная), поэтому первой строкой в теле одной из этих функций нужно написать:
procedure SetThemeAppProperties(dwFlags: DWORD); external 'SetThemeAppProperties@uxtheme.dll stdcall';
function InitializeSetup(): Boolean;
begin
// disable visual style
SetThemeAppProperties(0);
// load skin
...
end;
Ivan_009
13-02-2014, 11:13
Как можно прописать в скрипте запрет установки в Windows XP... :gamer: Кроме остальных систем...
Большое прибольшое спасибо за помощь...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.