Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Artem_Butenko
Дата сообщения: 04.11.2008 14:07
Прошу помощи, уже в третий раз постараюсь конструктивно поставить вопрос. Тема "тихого" инсталла давно обсуждалась на форуме, но не слишком детально. При создании "тихого" инсталла я столкнулся, по крайней мере, с двумя проблемами:
-----
1) "Проскакивание" (буквально на 1 сек.) страницы с формой прогресс-бара. Отчасти этот вопрос я решил внедрением в скрипт процедуры полной прозрачности окон инсталлятора. Однако, может быть, есть более благородный вариант решения этой проблемы (скрипт см. ниже)?
-----
2) При выполнении через "тихий" инсталл стороннего приложения, заголовок окна "тихого" инсталла отображается на панели быстрого запуска. Очень бы хотелось его полностью сокрыть!
[more=Вот мой скрипт...][_Setup]
AppName=MyProgram
AppVerName=MryPogram 1.0
AppPublisher=Artem_Butenko.
AppCopyright=Copyright (C) 2007 Artem_Butenko, Inc
VersionInfoVersion=1.0
VersionInfoCompany=Artem_Butenko Inc.
VersionInfoCopyright=Artem_Butenko Inc.
SetupIconFile=Icon.ico
DirExistsWarning=no
AppendDefaultDirName=no
Uninstallable=no
CreateUninstallRegKey=no
UsePreviousAppDir=yes
AllowNoIcons=no
DefaultDirName={tmp}
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
OutputBaseFilename=MryPogram 1.0
Compression=lzma/ultra
SolidCompression=yes

;; Файлы включаемые в компиляцию данного инсталляционного пакета
[_Files]
;; Библиотека и рисунок для организации Splash-скрина
Source: "CallNSIS.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "AdvSplash.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Splash.wav"; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: "Splash.bmp"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Библиотека и музыкальный файл (м.б. в формате .xm, .mod, .it)
Source: "BassMod.dll"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Sound.xm"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
;; Базовый файл в данном пакете
Source: "MyProgram.exe"; DestDir: "{tmp}"; AfterInstall: SetupFBird; Flags: noencryption nocompression deleteafterinstall

[_Code]
{Константы реализации функции прозрачности окна}
const
TransparentPercent = 0; {Процент прозрачности окна}
{Настройка параиетров функции прозрачности}
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_COLORKEY = 1;
LWA_ALPHA = 2;
GWL_EXSTYLE = (-20);

{Включение в инсталлятор функций прозрачности окна}
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean;
external 'SetLayeredWindowAttributes@user32.dll stdcall';

function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
external 'GetWindowLongA@user32.dll stdcall';

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';

{Запуск главного файла из временной папки}
procedure SetupFBird();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{tmp}\MyProgram.exe'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
end;

{Необходимые флаги для воспроизведения}
const
BASS_MUSIC_RAMP = 1; {Только для Fast Tracker .xm}
BASS_MUSIC_RAMPS = 2; {Только для Fast Tracker .xm}
BASS_MUSIC_LOOP = 100; {Повторение}
BASS_MUSIC_FT2MOD = 16; {Играть .MOD как FastTracker 2}
BASS_MUSIC_PT1MOD = 32; {Играть .MOD как ProTracker 1}
BASS_MUSIC_SURROUND = 512; {Звучание surround}
BASS_MUSIC_SURROUND2 = 1024; {Звучание surround (режим 2)}

{Определяем процедуры и функции}
{Инициализация библиотеки BassMod.dll}
function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';

{Остановка проигрывания трекерной музыки}
function BASSMOD_MusicStop(): Boolean;
external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';

{Загрузка файла для воспроизведения}
function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';

{Проигрывание трекерной музыки через библиотеку BassMod.dll}
function BASSMOD_MusicPlay(): Boolean;
external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';

{Выгрузка библиотеки BassMod.dll}
procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';

{Процедуры и функции организации Splash-заставки}
procedure callplug(parentwnd: Integer; pluginname,funcname,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10: PChar);
external 'callplug@files:callnsis.dll stdcall';

procedure InitializeWizard;
var
Name1: string;
{Настройка параметров Splash-заставки}
begin
ExtractTemporaryFile('Splash.bmp');
ExtractTemporaryFile('Splash.wav')
ExtractTemporaryFile('AdvSplash.dll')
{1000 - 1 секунда; 3000 - время показа рисунка без эффектов появления и затухания; 2000 - время показа плавного появления рисунка;
1500 - время показа плавного затухания рисунка. При нажатии мышой на рисунок заставка закрывается}
callplug(0,ExpandConstant('{tmp}\AdvSplash.dll'),'show','1000','2000','1500','-1',ExpandConstant('{tmp}\Splash'),'','','','','')
{Настройка параметров проигрывания трекерной музыки}
begin
ExtractTemporaryFile('BassMod.dll');
ExtractTemporaryFile('Sound.xm');
{Здесь инициализируем библиотеку в обычной системе со стандартной аудиокартой}
if not BASSMOD_Init(-1,44100,0)
then
begin
{Выгружаем dll при неудачной инициализации}
MsgBox('BASSMOD не смогла инициализироваться, проигрывание музыки невозможно.', mbError, MB_OK)
BASSMOD_Free;
end else;
Name1:=ExpandConstant('{tmp}\Sound.xm');
{Загружаем и воспроизводим}
if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, 4 or 512 or 32 or 1) then
BASSMOD_MusicPlay;
{Инициализация функции прозрачности окна в ходе установки}
begin
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE,
GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(WizardForm.Handle, 0,
(255 * TransparentPercent) / 100, LWA_ALPHA);
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
begin
If CurPageID=wpFinished then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
end;
end;
end;
end;

procedure DeInitializeSetup();
begin
BASSMOD_MusicStop; {Остановка проигрывания}
BASSMOD_Free(); {Выгрузка библиотеки из памяти}
end;[/more]


Добавлено:
Еще хотелось бы немного затронуть тему бэкапа данных в Inno Setup на основе использования SHFileOperation.iss. В инсталлах некоторых русификаторов замечал, что чек-бокс создания бэкапа вынесен на страницу выбора директории установки и при его выборе размер отображаемого внизу страницы дискового пространства для установки русификатора изменяется (увеличивается). Как реализовать подобный эффект?

Genri

Ранее Вы говорили о возможности распаквки .*zip архивов через Inno Setup. У меня возникла такая идея (поясняю подробно): создать единый инсталлятор для упаковки приложения в его Lite и Full-версиях. При этом в сам исполнительный файл инсталлятора будет упакована Lite-версия приложения, а Full-версия будет находиться рядом в zip-архиве.
В чем собственно проблема? Я не знаю, как организовать такое действие: на странице выбора директории установки расположить чек-бокс (Установить Full-версию), который будет не активен, в случае отсутствия рядом с исполнительным файлом инсталлятора заветного zip-архива (с полной версией программы), в данном случае будет установлена только Lite-версия. Если же zip-архив с определенным именем присутствует рядом, то чек-бокс будет активен (т.е. будет возможность отметить или нет установку полной версии приложения). Неплохо было бы осуществлять через инсталлятор проверку не только имени этого zip-архива, но и его MD5-хеш.
Понимаю, вопрос "муторный" и многим может показаться не практичным, но все же, я искренне надеюсь на Вашу добрую помощь!
Автор: Raf_SE
Дата сообщения: 04.11.2008 16:23
Наверно уже не раз подымалось, но всеже, ктонибудь знает как заставить Inno в свойствах exe'шника прописывать совместимость с Win98? Или какнить через батник, это возможно реализовать?

Добавлено:
Да, и заодно можно узнать, как сделать чтобы инсталлятор проверял файлы по размеру (или md5), и устанавливал только те файлы, которых в папке назначения нету?
Автор: Serega0675
Дата сообщения: 04.11.2008 21:48
serg_aka_lain
Спасибо, это то, что надо!!!
Автор: serg_aka_lain
Дата сообщения: 04.11.2008 22:34
Raf_SE

Цитата:
как сделать чтобы инсталлятор проверял файлы по размеру

Есть пример в "Inno Setup Scripting v5.1" от Kindly
Автор: mav34
Дата сообщения: 04.11.2008 23:45
Подскажите, как решить маленькую задачу.
В инсталляторе две установки. В первой стандартная установка программы и файлов базы на сервер с ярлыками на запуск. Вторая запускается на других компах и в ней надо указать ярлыки для запуска программы с сервера. Не могу сообразить, как передать путь для запуска. В командной строке нет таких параметров, а дополнительное окно для выбора пути вылезает каждый раз, до выбора компонентов.
Автор: Don_Juan
Дата сообщения: 05.11.2008 07:10
как можно сделать в таске чек бокс если он отмечен, то создаются ярлыки на рабочий стол для всех пользователей, а не только для текущего. тоже самое и с ярлыками группы в меня пуск.
Автор: Diawer
Дата сообщения: 05.11.2008 08:42
В этом [more=коде][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
OutputBaseFilename=My Program

[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: compiler:descctrl.dll; Flags: dontcopy

[CustomMessages]
english.ComponentsNSISPage1=Select the components you want to install; clear the components you do not want to%ninstall. Click Next when you are ready to continue.
russian.ComponentsNSISPage1=Выберите компоненты, которые Вы хотите установить; снимите флажки с%nкомпонентов, устанавливать которые не требуется. Нажмите «Далее», когда Вы%nбудете готовы продолжить.
english.ComponentsNSISDescription1=My program™
russian.ComponentsNSISDescription1=Моя программа™
english.ComponentsNSISDescription1_1=English version
russian.ComponentsNSISDescription1_1=Английская версия
english.ComponentsNSISDescription1_2=Russian version
russian.ComponentsNSISDescription1_2=Русская версия
english.ComponentsNSISDescription2=Help
russian.ComponentsNSISDescription2=Помощь
english.ComponentsNSISDescription2_1=Documentation
russian.ComponentsNSISDescription2_1=Документация
english.ComponentsNSISDescription2_2=User manual
russian.ComponentsNSISDescription2_2=Руководство пользователя

[Components]
Name: Main; Description: {cm:ComponentsNSISDescription1}; Types: full custom; Flags: fixed
Name: Main\english; Description: {cm:ComponentsNSISDescription1_1}; Flags: exclusive
Name: Main\russian; Description: {cm:ComponentsNSISDescription1_2}; Flags: exclusive
Name: Help; Description: {cm:ComponentsNSISDescription2}; Types: full custom
Name: Help\Documentation; Description: {cm:ComponentsNSISDescription2_1}; Types: full custom
Name: Help\Manual; Description: {cm:ComponentsNSISDescription2_2}; Types: full custom

[Code]
function disabledesc(): BOOL;
external 'disabledesc@files:descctrl.dll stdcall';

var
Text: TNewStaticText;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
begin
Text:=TNewStaticText.Create(WizardForm);
Text.Left:=ScaleX(0);
Text.Top:=ScaleY(0);
Text.Width:=ScaleX(417);
Text.Height:=ScaleY(0);
Text.AutoSize:=false;
Text.WordWrap:=true;
Text.Caption:=ExpandConstant('{cm:ComponentsNSISPage1}');

WizardForm.ComponentsList.Left:=ScaleX(0);
WizardForm.ComponentsList.Top:=ScaleY(50);
WizardForm.ComponentsList.Width:=ScaleX(417);
WizardForm.ComponentsList.Height:=ScaleY(155);
end;
end;[/more], в зависимости от языка надпись над окошком с компонентами занимает 2 строки на английском и 3 строки на русском, размер я подогнал под русский (3 строки), вот как же сделать, что бы при выборе английского окно автоматом поднималось на строчку вверх и главное растягивалось снизу, то-есть, что бы края оставались на месте, собственно как в стандартном окне самого Inno Setup. Если кому это под силу, не оставьте без внимания.

Или может где то есть решенние этой темы, я не нашел.
Автор: Raf_SE
Дата сообщения: 05.11.2008 09:31
serg_aka_lain
Там немного не то. В руководстве дан пример того как сделать проверку на наличии файлов, и если они есть, начать инсталляцию. Мне же нужно чтоб при инсталляции, если к приеру размер файла "dat.mpq" в инсталляторе, совпадает с размером "dat.mpq" в папке назначения, то этот файл устанавливаться не должен, если же размер отличается, то перезаписать его. И так со всеми файлами игрушки.

P.S.
Возможно тот скрипт можно както переделать. Но я с Паскалем не дружу
Автор: htuos
Дата сообщения: 05.11.2008 11:40
Diawer
хелп читаем

Код: if ActiveLanguage='english' then begin
WizardForm.ComponentsList.Top:=WizardForm.ComponentsList.Top-16;
WizardForm.ComponentsList.Height:=WizardForm.ComponentsList.Height+16;
end;
Автор: Raf_SE
Дата сообщения: 05.11.2008 12:01
htuos

Цитата:
читай хелп по FileSize, и GetMD5OfFile если нужно

Говорил уже, в паскале не шарю!


Цитата:
а вообще почитай хэлп по флагам для секции [Files], там тоже много интересного есть

Нет, там либо проверка по имени, либо по версии файла. Мне другое нужно.


Цитата:
вот только я, например, не знаю как получить хэш и размер файла упакованного в инсталлятор (без его распаковки)

Вот именно это и нужно.
Автор: Artem_Butenko
Дата сообщения: 05.11.2008 12:53
serg_aka_lain

Пожалуйста, поделитесь скриптом Вашего авторана-инсталлятора. Проект очень понравился, только вот немного не хватает озвучивания кнопок, но это уже на любителя.

viktor9

Вот русификатор для версии 5.2.3 сделанный мною. Переведено 90% программы, тут уж не судите строго!

Добавлено:
Victor_Dobrov

В Corona Skin Вы неоднократно модифицировали форму ввода серийного номера. У меня возник вопрос как раз по нему. Можно ли сделать так, чтобы инсталлятор считывал пароль из *.txt-файла (с определённым именем) лежащего рядом с ним. Но, если этот файл не найден рядом с исполнительным файлом инсталлятора, и пользователь нажал кнопку "Далее" (не заполнив поля пароля), то выскакивало бы сообщение с предложением найти файл с лицензионным ключом на HDD, и, по нажатию "Да", появлялось диалоговое окно поиска и выбора файла лицензии. Наверное, вопрос не самый легкий, но реализовать его средствами Inno Setup у меня не получается (а очень хочется). Теперь только одна надежда на Вашу помощь.
Автор: Victor_Dobrov
Дата сообщения: 05.11.2008 14:50
Artem_Butenko

Так вопрос по серийнику или паролю? Пароль берётся стандартно, из командной строки, зачем делать отдельный файл?
То, что ты описал, это отдельная проверка на файл ключа, который, например, можно проверять по MD5. При наличии такого файла все поля ввода теряют смысл.
Автор: Artem_Butenko
Дата сообщения: 05.11.2008 15:22
Victor_Dobrov

Прошу прощения, опять я немного напортачил с понятиями "серийный номер" и "пароль". В любом случае речь шла о "серийном номере". Отчасти Вы поняли меня правильно. Но, все-же, прошу Вас увидеть в этих действиях смысл и помочь. Почему это важно? Постараюсь дополнить и расписать важность вопроса:
- рабочий серийный номер м.б. не один;
- удобнее подгрузить серийный номер из *.txt-файла, когда инсталлятор скопирован на HDD;
- такие действия, думаю, будут полезны для создания инсталляторов к сетевым игрушкам.

Перефразирую старый вопрос правильно:

Цитата:
Можно ли сделать так, чтобы инсталлятор считывал серийный номер из *.txt-файла (с определённым именем) лежащего рядом с ним. Но, если этот файл не найден рядом с исполнительным файлом инсталлятора, и пользователь нажал кнопку "Далее" (не заполнив ни одного поля ввода серийного номера, или введя неверный серийный номер), то выскакивало бы сообщение с предложением найти файл с серийным номером (записанным в одну строку) на HDD или ввести его вручную, и, по нажатию "Да", появлялось диалоговое окно поиска и выбора файла, содержащего серийный номер, а, по нажатию "Нет", пользователь возвращался бы на страницу ввода серийного номера. При выборе "Serial.txt", поля ввода серийного номера в инсталляторе д.б. автоматически заполнены из этого текстового файла.
Автор: Diawer
Дата сообщения: 05.11.2008 17:43
htuos

Цитата:
хелп читаем

Че-то забыл о привязке конкретно к языку. Я то пытался сделать относительно самой надписи, так конечно было бы меньше писать (если надо сделать инстал с 20-ю языками), но главное что работает и цель достигнута, Спасибо.
Автор: Victor_Dobrov
Дата сообщения: 05.11.2008 18:51
Artem_Butenko

[more=этот код][Setup]
AppName=SerialText
AppVerName=SerialText
CreateAppDir=false
OutputDir=.
UserInfoPage=true
DefaultUserInfoSerial=123

[Code]
const CF_TEXT = 1;

function OpenClipboard(Wnd: HWnd): Boolean; external 'OpenClipboard@user32 stdcall delayload';
function CloseClipboard: Boolean; external 'CloseClipboard@user32 stdcall delayload';
function GetClipboardData(Format: Word): THandle; external 'GetClipboardData@user32 stdcall delayload';

var ClipData: THandle; Serial: string;

Function CheckSerial(Serial: String): Boolean;
Begin
    LoadStringFromFile(ExpandConstant('{src}\serial.txt'), Serial)
    Result:= '{#SetupSetting("DefaultUserInfoSerial")}' = Serial
    if Result then WizardForm.UserInfoSerialEdit.Text:= Serial
End;

procedure InitializeWizard;
begin
    OpenClipboard(WizardForm.Handle)
    ClipData:= GetClipboardData(CF_TEXT)
//    далее нужно получить текст из хэндла, но в Inno нет GlobalLock и GlobalAllock
    CloseClipboard
end;[/more] берёт серийник из файла. Примеры страницы с кнопкой обзора файла-ключа ранее здесь приводились.
Автор: Artem_Butenko
Дата сообщения: 05.11.2008 19:48
Victor_Dobrov -- спасибо за исходник скрипта, постараюсь его расширить.
Автор: serg_aka_lain
Дата сообщения: 05.11.2008 20:16
JuNoS и Artem_Butenko

Цитата:
поделитесь скриптом Вашего авторана-инсталлятора.


Автор: Don_Juan
Дата сообщения: 06.11.2008 10:56
Ребят, помогите с моим вопросом, пожалуйста:
"как можно сделать в таске чек бокс если он отмечен, то создаются ярлыки на рабочий стол для всех пользователей, а не только для текущего. тоже самое и с ярлыками группы в меня пуск."
Автор: Artem_Butenko
Дата сообщения: 06.11.2008 11:25
serg_aka_lain

--------------------
Перезалейте, пожалуйста, файл с http://ifolder.ru/8920486 на другой файлообменник, похоже у ifolder.ru начались большие глюки, да и letitbit.net в последнее время работает нестабильно.
--------------------

Victor_Dobrov

--------------------
На форуме практически не обсуждалась тема криптования инсталлятора. Меня интересует, как и с помощью, какой программы можно реализовать такой эффект: закриптовать некоторый исполнительный файл инсталлятора, таким образом, чтобы он не запускался стандартным образом (по двойному клику), а запускался только через "лоадер" написанный в Inno Setup?
--------------------
Еще, пожалуйста, посоветуйте какие патчеры лучше использовать в Inno Setup. Видел патчеры для S.T.A.L.K.E.R. и Devil May Cry 4 от компании . В патчерах для S.T.A.L.K.E.R. процесс патчинга отображается в общем прогресс-баре. Патчер для Devil May Cry 4 создан, похоже, на ResHacker и работает как независимая программа (Inno Setup, похоже, здесь нужен только для копирования файлов патча в каталог игры, и последующего запуска исполнительного файла со специальными ключами). Обещал помочь на этом поприще ComradG, но, его помощи я так и не дождался. Посетил много форумов, но по теме патчинга на Inno Setup так ничего нового не узнал. Надеюсь на Ваш совет и рекомендации.
--------------------
Автор: Victor_Dobrov
Дата сообщения: 06.11.2008 13:26
Artem_Butenko

По вопросу криптования - в Corona Skin я использовал стандартную проверку пароля по MD5, прочие способы не знаю.
Я бы не рекомендовал использовать Inno Setup в качестве лоадера, исталлятор для этого слишком объёмный.

Цитата:
Посетил много форумов, но по теме патчинга на Inno Setup так ничего нового не узнал. Надеюсь на Ваш совет и рекомендации.

Аналогично. Патчеры вообще не юзал, адресуй этот вопрос не мне, а всем.
Автор: tonegins
Дата сообщения: 06.11.2008 15:09
Source : "D:\Installer\Project\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;

Когда дело доходит до страницы выбора директории wpSelectDir, внизу надпись "Требуется как минимум 0,7 Мб свободного диского пространства", а у меня в папке D:\Installer\Project\ 800 мегов. Как сделать чтоб определялось правильное необходимое для установки место?
Автор: ExpeditorR
Дата сообщения: 06.11.2008 15:29
Artem_Butenko

Цитата:
Еще, пожалуйста, посоветуйте какие патчеры лучше использовать в Inno Setup. Видел патчеры для S.T.A.L.K.E.R. и Devil May Cry 4 от компании 1С. В патчерах для S.T.A.L.K.E.R. процесс патчинга отображается в общем прогресс-баре.


1C Небось как всегда перекомпелировали innosetup под свои нужды.
А патчить файлы с помощью innosetup я бы стал через dll, но писать такую dll мне лень, т.к. не вижу смысла, ибо просто замучиешься передавать ей все смещения в файле и что на что менять, особенно при большом колличестве изменений. Проще воспользоваться специальными патчерами, коих великое множество (извлекать их и запускать).
Автор: Artem_Butenko
Дата сообщения: 06.11.2008 19:09
Victor_Dobrov -- на форуме ранее появлялась программа, позволяющая "скрестить" Visual Patch и Inno Setup, пока чего не надумаю, буду изучать ее. По поводу написания лоадера на Inno Setup у меня один вопрос, как запустить внешний исполнительный файл лежащий рядом с инсталлятором, при условии, что расширение у внешнего файла я изменил на *.ex_ (от исходного *.exe).

ExpeditorR -- я не думаю, что 1C вносили изменения в исходный код Inno Setup для компилляции патчей (пожалуйста изучите структуру этих патчей, во избежание опрометчивых выводов). Вопрос по-прежнему открыт. Кроме того, хотел бы узнать, можно ли организовать патчинг на основе использования *.bat-файлов (смещение байт в файле)?

Ребята -- вновь прошу помощи. Не подумайте, я не ленивый, просто отсутствие специальных знаний, не позволяет мне до конца понять многие вопросы. Подскажите, как "заставить" Inno Setup переименовывать файлы, которые не копирует инсталлятор, но которые уже имеются в папке назначения. При деинсталляции исходные имена файлов и папок должны быть восстановлены. Т.е. как забэкапить изменение имен файлов и папок, с возможностью отката изменений при деинсталляции. Использовать пакетные файлы для этих операций не хочется, а, по другому, у меня не получается. Надеюсь на коллективную помощь!
Автор: Sampron
Дата сообщения: 07.11.2008 00:02
Artem_Butenko
Смотри справку:
function RenameFile(const OldName, NewName: string): Boolean;
Автор: STRATOSV
Дата сообщения: 07.11.2008 00:42
Приветствую Спецов!!!
Доброе время суток....
Хочу попросить Вас пояснить мне несколько Важных Моментов к моесу Скриптику по Инсталяционному Пакету, сконстролял я его для запихивания моего Мода в Игруху.
Ну тоесть для Инсталла Мода.
К Инсталу прописал Splash картинку,Фоновую картинку, Слайд Шоу,Музыкальный трек.
Для компактности Мод Заархевировал в 7 zip SFX / с процессом распаковки и Автоудалением Zipовского архива/
Вобщем вот Рабочий Скриптик [more=Инстал Мода]
; Mu Mod Пробная Версия
[Setup]
AppName=Bran_retrofit
AppVerName=Моя Проба 1.0
AppPublisher=StrategyStrat
DefaultDirName={sd}\SEGA\Medieval II Total War\mods\Bran_retrofit
DefaultGroupName=Bran_retrofit
AllowNoIcons=yes
WizardImageFile=D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\2.bmp
WizardSmallImageFile=D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\1.bmp
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
OutputDir=E:\SEGA
OutputBaseFilename=setup
SetupIconFile=E:\SEGA\FFF\1.ico

[Languages]
Name: "russian"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "E:\SEGA\FFF\Bran_retrofit.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{app}\Bran_retrofit.exe"; DestDir: "{app}"; Flags: ignoreversion external deleteafterinstall

Source: "isxbb.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\BRUEGEL.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN1.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN10.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN11.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN12.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN13.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN14.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN2.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN3.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN4.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN5.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN6.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN7.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN8.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\САЙД ШОУ 2\SKRIN9.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Ny Moding\ГРАФИКА\ИКОНКИ для МОДА\splash.bmp"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "innocallback.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\APEX-VADIM\МУЗЫКА\МУЗОН ЭТНО И тд\Vangelis\El Greco\07 Movement VII.MP3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[Icons]
Name: "{userdesktop}\Brancampaign_retrofit.bat"; Filename: "{app}\Brancampaign_retrofit.bat"; Tasks: desktopicon; WorkingDir: "{app}"; IconFilename: "{app}\Brancampaign_retrofit.bat"; IconIndex: 0
Name: "{group}\{cm:UninstallProgram,Bran_retrofit}"; Filename: "{uninstallexe}"

[Run]
Filename: "{app}\Bran_retrofit.exe"; WorkingDir: "{src}"; Parameters: "-y"; StatusMsg: "Процесс Установки Мода..."; Flags: waituntilterminated

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[_ISTool]
EnableISX=True

[Code]
type
HSTREAM=DWORD;
TTimerProc=procedure(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
const
BackGround=6;
Timer=16;
Indent=25;

var
MP3List:TStringList;
CurrentMP3:integer;
hMP3:HWND;
TimerID:LongWord;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): integer; external 'isxbb_AddImage@files:isxbb.dll stdcall delayload';
function isxbb_Init(hWnd: Integer): integer; external 'isxbb_Init@files:isxbb.dll stdcall delayload';
function isxbb_StartTimer(Seconds: Integer; Flags: Cardinal): integer; external 'isxbb_StartTimer@files:isxbb.dll stdcall';
function isxbb_KillTimer(Flags: Cardinal): integer; external 'isxbb_KillTimer@files:isxbb.dll stdcall';
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
function SetTimer(hWnd:HWND;nIDEvent,uElapse:UINT;lpTimerFunc:LongWord{TFNTimerProc}):UINT; external 'SetTimer@user32.dll stdcall delayload';
function KillTimer(hWnd:HWND;uIDEvent:UINT):BOOL; external 'KillTimer@user32.dll stdcall delayload';
function BASS_ChannelIsActive(Handle:HWND):DWORD; external 'BASS_ChannelIsActive@files:bass.dll stdcall';
function BASS_SetConfig(Option,Value:DWORD):DWORD; external 'BASS_SetConfig@files:bass.dll stdcall';
function BASS_Init(Device:integer;Freq,Flags:DWORD;Win:HWND;CLSID:integer):boolean; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(Mem:BOOL;f:PChar;Offset:DWORD;Length:DWORD;Flags:DWORD):HSTREAM; external 'BASS_StreamCreateFile@files:bass.dll stdcall';
function BASS_StreamFree(Handle:HWND):boolean; external 'BASS_StreamFree@files:bass.dll stdcall';
function BASS_ChannelPlay(Handle:HWND;Restart:boolean):boolean; external 'BASS_ChannelPlay@files:bass.dll stdcall';
function BASS_Start: Boolean; external 'BASS_Start@files:bass.dll stdcall';
function BASS_Stop: Boolean; external 'BASS_Stop@files:bass.dll stdcall';
function BASS_Free: Boolean; external 'BASS_Free@files:bass.dll stdcall delayload';
function WrapTimerProc(CallBack:TTimerProc;ParamCount:integer):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';

procedure TimerTick(uTimerID,uMessage:UINT;dwUser,dw1,dw2:DWORD);
begin
if BASS_ChannelIsActive(hMP3)=0 then begin
BASS_Stop;
BASS_StreamFree(hMP3);
hMP3:=BASS_StreamCreateFile(False,PChar(MP3List.Strings[CurrentMP3]),0,0,0);
BASS_Start;
if hMP3<>0 then
if BASS_ChannelPlay(hMP3,True) then begin
CurrentMP3:=CurrentMP3+1;
if CurrentMP3>MP3List.Count-1 then CurrentMP3:=0;
end;
end;
end;

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('07 Movement VII.MP3');
MP3List:=TStringList.Create;
MP3List.Add(ExpandConstant('{tmp}')+'\07 Movement VII.MP3');
CurrentMP3:=0;
Result:=True;
end;

procedure InitializeWizard;
begin
WizardForm.Position:=poScreenCenter;
MainForm.BorderStyle:=bsNone;
MainForm.Width:=GetSystemMetrics(0);
MainForm.Height:=GetSystemMetrics(1)+1;
MainForm.Top:=-1;
MainForm.Left:=0;
ExtractTemporaryFile('splash.bmp');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.bmp',1000,3000,1000,0,255,False,$FFFFFF);
TimerID:=SetTimer(0,0,500,WrapTimerProc(@TimerTick,5));
    BASS_Init(-1,44100,0,0,0);
BASS_SetConfig(5,100);
BASS_SetConfig(6,100);
ExtractTemporaryFile('BRUEGEL.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\BRUEGEL.jpg',BackGround);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
MainForm.Visible:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('SKRIN1.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN1.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN2.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN2.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN3.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN3.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN4.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN4.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN5.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN5.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN6.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN6.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN7.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN7.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN8.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN8.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN9.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN9.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN10.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN10.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN11.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN11.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN12.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN12.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN13.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN13.jpg',BackGround or Timer);
ExtractTemporaryFile('SKRIN14.jpg');
isxbb_AddImage(ExpandConstant('{tmp}')+'\SKRIN14.jpg',BackGround or Timer);
isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
isxbb_StartTimer(8,BackGround)
end;
if CurStep=ssPostInstall then begin
isxbb_KillTimer(BackGround);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(MainForm.Width-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(MainForm.Height-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if CurPageID=wpFinished then begin
WizardForm.Visible:=False;
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Left:=(MainForm.Width-WizardForm.Width) div 2;
WizardForm.Top:=(MainForm.Height-WizardForm.Height) div 2;
WizardForm.Visible:=True;
end;
end;

procedure DeinitializeSetup;
begin
KillTimer(0,TimerID);
BASS_Stop;
BASS_Free;
MP3List.Free;
end;
[/more]
Теперь Вопросы-Просьбы
Хотелось бы Изменить текстуру окна Инстала / задать Цвет возможно с орнаментом / без изменения его размеров.
Изменить Размер Фоновой Каринки и Картинок в Слайд Шоу.
Тоесть сейчас Инстал проходит при Фоне и Слайдах во весь экран - а мне бы хотелось их сделать меньше/задать размер/
Хотелось бы чтобы Слайд-Шоу шло с затуханием, а не с Резким появлением одной картинки после другой.
Ещё один вопросик в рамке Инстала с низу имееться Инфа об Необходимом Свободном Месте для Распаковке Мода хотелось бы поменять данную Инфу на Другую/ посколько в Процессе Инстала у меня Распаковываеться 7 zip SFX .
Так же Ооочень хотелось бы узнать как в скрипте задать смещение датчика загруза 7 zip SFX с центра Экрана в низ /к трею
Ну и последний мой Вопросик/совсем уж наверне ламерский/ - бат-файл, ярлык от которого по скрипту помещаеться на Рабочий Стол не имеет картинки, как задать на него направление файлика .ico
Чёйто я разок попробывал прописать, так иконка не на батнике а рядом появилась.
Ооочень буду признателен за Помощь и Пояснения.
Автор: serg_aka_lain
Дата сообщения: 07.11.2008 01:02
STRATOSV

Цитата:
бат-файл, ярлык от которого по скрипту помещаеться на Рабочий Стол не имеет картинки, как задать на него направление файлика .ico

IconFilename: "{app}\icon.ico" IconIndex: "0";
или
IconFilename: "{app}\icon.dll" IconIndex: "0";
или
IconFilename: "{app}\icon.exe" IconIndex: "0";

Цитата:
Ооочень хотелось бы узнать как в скрипте задать смещение датчика загруза 7 zip SFX с центра Экрана в низ /к трею

WizardForm.Left := GetSystemMetrics(16) - длина формы;
WizardForm.Top := GetSystemMetrics(17) - ширина формы;
будет в правом нижнем углу.

Цитата:
Ещё один вопросик в рамке Инстала с низу имееться Инфа об Необходимом Свободном Месте для Распаковке Мода хотелось бы поменять данную Инфу на Другую/ посколько в Процессе Инстала у меня Распаковываеться 7 zip SFX .

[Setup]
ExtraDiskSpaceRequired=
Автор: STRATOSV
Дата сообщения: 07.11.2008 01:25
Большое Спасибо за Ответ serg_aka_lain
Блин помог Камрад...
Хотелось бы тогда уж и про плавное Появление или Затухание в слайд шоу
Ведь для Splash Картинки затухание имееться и оно в Коде прописано
ExtractTemporaryFile('splash.bmp');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.bmp',1000,3000,1000,0,255,False,$FFFFFF);

Добавлено:
Скачал Прогу ISTool Скачал Русик
И ну никак не могу найти Опцию где русифицировать Интерфейс данного Софта.
Может это русик на внутренний процесс этой проги / на скрипты/ а не на саму её.

Или может я чё нитак понял, поясните пожалуйста
Автор: tonegins
Дата сообщения: 07.11.2008 07:36
Source : "D:\Installer\Project\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: CheckCopyFiles;

Когда дело доходит до страницы выбора директории wpSelectDir, внизу надпись "Требуется как минимум 0,7 Мб свободного диского пространства", а у меня в папке D:\Installer\Project\ 800 мегов. Но если убрать Check: CheckCopyFiles; то размер определяется правильно. CheckCopyFiles возвращает true или false.
Может кто сталкивался с такой проблемой?

Добавлено:
Вообщем сделал так
[Files]
Source : "D:\Installer\Project\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs dontcopy
Source : "D:\Installer\Project\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: CheckCopyFiles;

вроде работает
Автор: Diawer
Дата сообщения: 07.11.2008 09:01
Доброго всем здравия, есть вопрос по коду (по зачистке оставшихся файлов после деинсталляции) давшего мне Genry - за что ему спасибо, у меня было несколько вопросов со всеми я справился кроме Одного, вопрос не из легких (по крайней мере для меня) посему обращаюсь к знатокам. Дело в том, что если имя файла длинное и не влазит в окно, а также не имеет пробелов то оно не переносится и увидеть его целиком не представляется возможным вместо невлезший части ставится (…), в программе которую я хотел запаковать с ним создается 4 файла с отличием только в расширении, которое не видно. У меня пара идей, но минимум возможности реализации. Я опишу их может у вас будет время мне помочь это последний вопрос по этому очень нужному мне коду.
1. Сделать горизонтальную прокрутку, то есть сдвиг экрана. (хороший вариант)
2. Сделать всплывающие подсказки, как в Windows. (тоже не плохо)

[more=Код][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: {app}

[Code_]
const
bidDelAll = 1;
bidSkipAll = 2;
var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;
// StaticText: TNewStaticText; //Вставить текст

MsgForm: TSetupForm;
MsgAllButton, MsgSkipAllButton: TButton;
MsgCancelButton, MsgDelButton: TButton;

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

function Size64(Hi, Lo: integer): Extended;
var
i: integer;
begin
Result:= Lo;
if Lo < 0 then
Result:= Result + 2147483647 + 2147483647 + 2;
i:= Hi;
while i > 0 do
begin
Result:= Result + 2147483647 + 2147483647 + 2;
i:= i - 1;
end;
end;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
i: integer;
begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
{files} i:= CheckListBox.AddCheckBox(FSR.Name,
FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte',
Level, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name;
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', Level,
True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name;
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure ButtonOnClick(Sender: TObject);
begin
if TButton(Sender).Tag = 0 then
CheckListBox.CheckItem(0, coCheckWithChildren)
else
CheckListBox.CheckItem(0, coUnCheck);
end;

procedure MsgButtonOnClick(Sender: TObject);
begin
Case TButton(Sender).Tag of
bidDelAll : DelAllReadOnly:= True;
bidSkipAll: SkipAllReadOnly:= True;
end;
MsgForm.Close;
end;

function DelMsgBox(FileName: string): Boolean;
var
MsgLabel: TLabel;
begin
MsgForm:= CreateCustomForm;
MsgForm.ClientWidth := ScaleX(400);
MsgForm.ClientHeight := ScaleY(120);
MsgForm.Caption := 'Files to delete';
MsgForm.Center;

MsgLabel := TLabel.Create(MsgForm);
MsgLabel.Left := ScaleX(20);
MsgLabel.Top := ScaleY(20);
MsgLabel.Caption:= FileName + ' is protected file or directory!' + #10#10#13 + 'Do you want to delete the file with READONLY attribute?';
MsgLabel.Parent := MsgForm;

MsgAllButton := TButton.Create(MsgForm);
MsgAllButton.Parent := MsgForm;
MsgAllButton.Width := ScaleX(75);
MsgAllButton.Height := ScaleY(23);
MsgAllButton.Left := ScaleX(20);
MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgAllButton.Caption := 'Delete All';
MsgAllButton.Tag:= bidDelAll;
MsgAllButton.OnClick := @MsgButtonOnClick;

MsgSkipAllButton := TButton.Create(MsgForm);
MsgSkipAllButton.Parent := MsgForm;
MsgSkipAllButton.Width := ScaleX(75);
MsgSkipAllButton.Height := ScaleY(23);
MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10);
MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgSkipAllButton.Caption := 'Skip All';
MsgSkipAllButton.Tag:= bidSkipAll;
MsgSkipAllButton.OnClick := @MsgButtonOnClick;

MsgCancelButton := TButton.Create(MsgForm);
MsgCancelButton.Parent := MsgForm;
MsgCancelButton.Width := ScaleX(75);
MsgCancelButton.Height := ScaleY(23);
MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20);
MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgCancelButton.Caption := 'Skip';
MsgCancelButton.ModalResult := mrCancel;

MsgDelButton := TButton.Create(MsgForm);
MsgDelButton.Parent := MsgForm;
MsgDelButton.Width := ScaleX(75);
MsgDelButton.Height := ScaleY(23);
MsgDelButton.Left := MsgCancelButton.Left - MsgDelButton.Width - ScaleX(10);
MsgDelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgDelButton.Caption := 'Delete';
MsgDelButton.ModalResult := mrOk;

MsgForm.ActiveControl:= MsgCancelButton;

if MsgForm.ShowModal() = mrOk then
Result:= True
else
Result:= False;
end;

procedure DeleteFiles();
var
SR: TFindRec;
i: integer;
str: string;
ResultCode: Integer;
begin
DelAllReadOnly:= False;
SkipAllReadOnly:= False;
for i:= CheckListBox.Items.Count - 1 downto 0 do
begin
if CheckListBox.State[i] = cbChecked then
begin
str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
FindFirst(str, SR);
if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then
if Not (DelAllReadOnly or SkipAllReadOnly) then
if DelMsgBox(SR.Name) then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if DelAllReadOnly then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);

FindClose(SR);
DeleteFile(str);
RemoveDir(str);
end;
end;
end;

procedure BrowseRemainedFiles();
begin
Form:= CreateCustomForm;
Form.ClientWidth := ScaleX(400);
Form.ClientHeight := ScaleY(400);
Form.Caption := 'Files to delete';
Form.Center;

// StaticText := TNewStaticText.Create(Form); //Вставить текст
// StaticText.Left:= ScaleX(20);
// StaticText.Top := ScaleY(8);
// StaticText.Caption := 'Some elements could not be removed.' + #10#13 +
// 'These can be removed manually.' + #10#13#13 +
// 'Choose which are necessary to delete' + #10#13 +
// 'or press Cancel button.';
// StaticText.Font.Color:= clBlue;
// StaticText.Font.Style:= [fsBold];
// StaticText.AutoSize := True;
// StaticText.Parent := Form;

CheckListBox := TNewCheckListBox.Create(Form);
CheckListBox.Left:= ScaleX(20);
CheckListBox.Top:= ScaleY(20);
CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2);
CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20);
CheckListBox.Parent:= Form;

AllButton := TButton.Create(Form);
AllButton.Parent := Form;
AllButton.Width := ScaleX(75);
AllButton.Height := ScaleY(23);
AllButton.Left := ScaleX(20);
AllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
AllButton.Caption := 'Select All';
AllButton.Tag:= 0;
AllButton.OnClick := @ButtonOnClick;

UnAllButton := TButton.Create(Form);
UnAllButton.Parent := Form;
UnAllButton.Width := ScaleX(75);
UnAllButton.Height := ScaleY(23);
UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10);
UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
UnAllButton.Caption := 'Clear All';
UnAllButton.Tag:= 1;
UnAllButton.OnClick := @ButtonOnClick;

CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Cancel';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;

DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Delete';
DelButton.ModalResult := mrOk;

Form.ActiveControl:= CancelButton;

CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}');
FillListBox(ExpandConstant('{app}'), '*', 1);

if Form.ShowModal() = mrOk then DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;[/more]
Автор: htuos
Дата сообщения: 07.11.2008 10:11
STRATOSV

Цитата:
Хотелось бы тогда уж и про плавное Появление или Затухание в слайд шоу
Ведь для Splash Картинки затухание имееться и оно в Коде прописано
ExtractTemporaryFile('splash.bmp');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.bmp',1000,3000,1000,0,255,False,$FFFFFF);

за слайд-шоу отвечает одна библиотека (isxbb.dll), за splash другая (isgsg.dll)
насколько я знаю isxbb.dll не позволяет сделать плавную смену картинок
попробуй сделать как в Corona Skin (в шапке темы есть)

Добавлено:
Diawer

Цитата:
Сделать горизонтальную прокрутку, то есть сдвиг экрана. (хороший вариант)

горизонтальную прокрутку для CheckListBox можно так сделать

Код: SendMessage(CheckListBox.Handle,$0194,CheckListBox.Width*2,0);

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.